79 lines
3.5 KiB
Python
79 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
import re
|
|
|
|
from pygments.lexer import RegexLexer, DelegatingLexer, bygroups, include, using, this, default
|
|
from pygments.token import Punctuation, Text, Comment, Operator, Keyword, Name, String, Number, Literal, Other
|
|
from pygments.util import get_choice_opt, iteritems
|
|
from pygments import unistring as uni
|
|
|
|
from pygments.lexers.html import XmlLexer
|
|
|
|
class CSharp6Lexer(RegexLexer):
|
|
name = 'C#6'
|
|
aliases = ['csharp6', 'c#6']
|
|
filenames = ['*.cs']
|
|
mimetypes = ['text/x-csharp']
|
|
|
|
flags = re.MULTILINE | re.DOTALL | re.UNICODE
|
|
|
|
cs_ident = ('@?[_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl') + ']' +
|
|
'[' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc',
|
|
'Cf', 'Mn', 'Mc') + ']*')
|
|
|
|
tokens = {
|
|
'root': [
|
|
# method names
|
|
(r'^([ \t]*(?:' + cs_ident + r'(?:\[\])?\s+)+?)' # return type
|
|
r'(' + cs_ident + ')' # method name
|
|
r'(\s*)(\()', # signature start
|
|
bygroups(using(this), Name.Function, Text, Punctuation)),
|
|
(r'^\s*\[.*?\]', Name.Attribute),
|
|
(r'[^\S\n]+', Text),
|
|
(r'\\\n', Text), # line continuation
|
|
(r'//.*?\n', Comment.Single),
|
|
(r'/[*].*?[*]/', Comment.Multiline),
|
|
(r'\n', Text),
|
|
(r'[~!%^&*()+=|\[\]:;,.<>/?-]', Punctuation),
|
|
(r'[{}]', Punctuation),
|
|
(r'@\$?"(""|[^"])*"', String),
|
|
(r'"\$?(\\\\|\\"|[^"\n])*["\n]', String),
|
|
(r"'\\.'|'[^\\]'", String.Char),
|
|
(r"[0-9](\.[0-9]*)?([eE][+-][0-9]+)?"
|
|
r"[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?", Number),
|
|
(r'#[ \t]*(if|endif|else|elif|define|undef|'
|
|
r'line|error|warning|region|endregion|pragma)\b.*?\n',
|
|
Comment.Preproc),
|
|
(r'\b(extern)(\s+)(alias)\b', bygroups(Keyword, Text,
|
|
Keyword)),
|
|
(r'(abstract|as|async|await|base|break|case|catch|'
|
|
r'checked|const|continue|default|delegate|'
|
|
r'do|else|enum|event|explicit|extern|false|finally|'
|
|
r'fixed|for|foreach|goto|if|implicit|in|interface|'
|
|
r'internal|is|lock|new|null|operator|'
|
|
r'out|override|params|private|protected|public|readonly|'
|
|
r'ref|return|sealed|sizeof|stackalloc|static|'
|
|
r'switch|this|throw|true|try|typeof|'
|
|
r'unchecked|unsafe|virtual|var|void|while|'
|
|
r'get|set|new|partial|yield|add|remove|value|alias|ascending|'
|
|
r'descending|from|group|into|orderby|select|where|'
|
|
r'join|equals)\b', Keyword),
|
|
(r'(global)(::)', bygroups(Keyword, Punctuation)),
|
|
(r'(bool|byte|char|decimal|double|dynamic|float|int|long|object|'
|
|
r'sbyte|short|string|uint|ulong|ushort|var)\b\??', Keyword.Type),
|
|
(r'(class|struct)(\s+)', bygroups(Keyword, Text), 'class'),
|
|
(r'(namespace|using)(\s+)', bygroups(Keyword, Text), 'namespace'),
|
|
(cs_ident, Name),
|
|
],
|
|
'class': [
|
|
(cs_ident, Name.Class, '#pop'),
|
|
default('#pop'),
|
|
],
|
|
'namespace': [
|
|
(r'(?=\()', Text, '#pop'), # using (resource)
|
|
('(' + cs_ident + r'|\.)+', Name.Namespace, '#pop'),
|
|
]
|
|
}
|
|
|
|
def setup(app):
|
|
from sphinx.highlighting import lexers
|
|
lexers['csharp6'] = CSharp6Lexer() |