diff options
Diffstat (limited to 'lv2specgen/lv2specgen.py')
| -rwxr-xr-x | lv2specgen/lv2specgen.py | 67 | 
1 files changed, 67 insertions, 0 deletions
diff --git a/lv2specgen/lv2specgen.py b/lv2specgen/lv2specgen.py index 3c6db71..404545f 100755 --- a/lv2specgen/lv2specgen.py +++ b/lv2specgen/lv2specgen.py @@ -50,6 +50,8 @@ try:      import pygments      import pygments.lexers      import pygments.formatters +    from pygments.lexer import RegexLexer, include, bygroups +    from pygments.token import Text, Comment, Operator, Keyword, Name, String, Literal      have_pygments = True  except ImportError:      print("Error importing pygments, syntax highlighting disabled") @@ -158,6 +160,58 @@ def getLabel(m, urinode):      else:          return '' +if have_pygments: +    # Based on sw.py by Philip Cooper +    class Notation3Lexer(RegexLexer): +        """ +        Lexer for N3 / Turtle / NT +        """ +        name = 'N3' +        aliases = ['n3', 'turtle'] +        filenames = ['*.n3', '*.ttl', '*.nt'] +        mimetypes = ['text/rdf+n3','application/x-turtle','application/n3'] +     +        tokens = { +            'comments': [ +                (r'(\s*#.*)', Comment) +            ], +            'root': [ +                include('comments'), +                (r'(\s*@(?:prefix|base|keywords)\s*)(\w*:\s+)?(<[^> ]*>\s*\.\s*)',bygroups(Keyword,Name.Variable,Name.Namespace)), +                (r'\s*(<[^>]*\>)', Name.Class, ('triple','predObj')), +                (r'(\s*[a-zA-Z_:][a-zA-Z0-9\-_:]*\s)', Name.Class, ('triple','predObj')), +                (r'\s*\[\]\s*', Name.Class, ('triple','predObj')), +            ], +            'triple' : [ +                (r'\s*\.\s*', Text, '#pop') +            ], +            'predObj': [ +                include('comments'), +                (r'(\s*[a-zA-Z_:][a-zA-Z0-9\-_:]*\b\s*)', Operator, 'object'), +                (r'\s*(<[^>]*\>)', Operator, 'object'), +                (r'\s*\]\s*', Text, '#pop'), +                (r'(?=\s*\.\s*)', Keyword, '#pop'),  +            ], +            'objList': [ +                include('comments'), +                (r'\s*\)', Text, '#pop'), +                include('object') +            ], +            'object': [ +                include('comments'), +                (r'\s*\[', Text, 'predObj'), +                (r'\s*<[^> ]*>', Name.Attribute), +                (r'\s*("""(?:.|\n)*?""")(\@[a-z]{2-4}|\^\^<?[a-zA-Z0-9\-\:_#/\.]*>?)?\s*', bygroups(Literal.String,Text)), +                (r'\s*".*?[^\\]"(?:\@[a-z]{2-4}|\^\^<?[a-zA-Z0-9\-\:_#/\.]*>?)?\s*', Literal.String), +                (r'\s*[a-zA-Z0-9\-_\:]\s*', Name.Attribute), +                (r'\s*\(', Text, 'objList'), +                (r'\s*;\s*\n?', Text, '#pop'), +                (r'\s*,\s*\n?', Text, '#pop'),  # Added by drobilla so "," is not an error +                (r'(?=\s*\])', Text, '#pop'),             +                (r'(?=\s*\.)', Text, '#pop'),            +            ], +        } +      def getComment(m, urinode):      c = findOne(m, urinode, lv2.documentation, None) @@ -178,6 +232,19 @@ def getComment(m, urinode):                      pygments.formatters.HtmlFormatter())                  markup = code_rgx.sub(code_str, markup, 1) +        # Syntax highlight all Turtle code +        if have_pygments: +            code_rgx = re.compile('<pre class="turtle-code">(.*?)</pre>', re.DOTALL) +            while True: +                code = code_rgx.search(markup) +                if not code: +                    break +                match_str = xml.sax.saxutils.unescape(code.group(1)) +                code_str = pygments.highlight( +                    match_str, +                    Notation3Lexer(), +                    pygments.formatters.HtmlFormatter()) +                markup = code_rgx.sub(code_str, markup, 1)          # Add links to code documentation for identifiers          rgx = re.compile('([^a-zA-Z0-9_:])(' + \  |