|
Packit Service |
99d393 |
import re
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
from pygments.lexer import Lexer, RegexLexer, ExtendedRegexLexer, \
|
|
Packit Service |
99d393 |
LexerContext, include, combined, do_insertions, bygroups, using
|
|
Packit Service |
99d393 |
from pygments.token import Error, Text, \
|
|
Packit Service |
99d393 |
Comment, Operator, Keyword, Name, String, Number, Generic, Punctuation
|
|
Packit Service |
99d393 |
from pygments.util import get_bool_opt, get_list_opt, shebang_matches
|
|
Packit Service |
99d393 |
from pygments import unistring as uni
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
from sphinx import highlighting
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
line_re = re.compile('.*?\n')
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
class CythonLexer(RegexLexer):
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
For `Cython <http://cython.org>`_ source code.
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
name = 'Cython'
|
|
Packit Service |
99d393 |
aliases = ['cython', 'pyx']
|
|
Packit Service |
99d393 |
filenames = ['*.pyx', '*.pxd', '*.pxi']
|
|
Packit Service |
99d393 |
mimetypes = ['text/x-cython', 'application/x-cython']
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
tokens = {
|
|
Packit Service |
99d393 |
'root': [
|
|
Packit Service |
99d393 |
(r'\n', Text),
|
|
Packit Service |
99d393 |
(r'^(\s*)("""(?:.|\n)*?""")', bygroups(Text, String.Doc)),
|
|
Packit Service |
99d393 |
(r"^(\s*)('''(?:.|\n)*?''')", bygroups(Text, String.Doc)),
|
|
Packit Service |
99d393 |
(r'[^\S\n]+', Text),
|
|
Packit Service |
99d393 |
(r'#.*$', Comment),
|
|
Packit Service |
99d393 |
(r'[]{}:(),;[]', Punctuation),
|
|
Packit Service |
99d393 |
(r'\\\n', Text),
|
|
Packit Service |
99d393 |
(r'\\', Text),
|
|
Packit Service |
99d393 |
(r'(in|is|and|or|not)\b', Operator.Word),
|
|
Packit Service |
99d393 |
(r'(<)([a-zA-Z0-9.?]+)(>)',
|
|
Packit Service |
99d393 |
bygroups(Punctuation, Keyword.Type, Punctuation)),
|
|
Packit Service |
99d393 |
(r'!=|==|<<|>>|[-~+/*%=<>&^|.?]', Operator),
|
|
Packit Service |
99d393 |
(r'(from)(\d+)(<=)(\s+)(<)(\d+)(:)',
|
|
Packit Service |
99d393 |
bygroups(Keyword, Number.Integer, Operator, Name, Operator,
|
|
Packit Service |
99d393 |
Name, Punctuation)),
|
|
Packit Service |
99d393 |
include('keywords'),
|
|
Packit Service |
99d393 |
(r'(def|property)(\s+)', bygroups(Keyword, Text), 'funcname'),
|
|
Packit Service |
99d393 |
(r'(cp?def)(\s+)', bygroups(Keyword, Text), 'cdef'),
|
|
Packit Service |
99d393 |
(r'(class|struct)(\s+)', bygroups(Keyword, Text), 'classname'),
|
|
Packit Service |
99d393 |
(r'(from)(\s+)', bygroups(Keyword, Text), 'fromimport'),
|
|
Packit Service |
99d393 |
(r'(c?import)(\s+)', bygroups(Keyword, Text), 'import'),
|
|
Packit Service |
99d393 |
include('builtins'),
|
|
Packit Service |
99d393 |
include('backtick'),
|
|
Packit Service |
99d393 |
('(?:[rR]|[uU][rR]|[rR][uU])"""', String, 'tdqs'),
|
|
Packit Service |
99d393 |
("(?:[rR]|[uU][rR]|[rR][uU])'''", String, 'tsqs'),
|
|
Packit Service |
99d393 |
('(?:[rR]|[uU][rR]|[rR][uU])"', String, 'dqs'),
|
|
Packit Service |
99d393 |
("(?:[rR]|[uU][rR]|[rR][uU])'", String, 'sqs'),
|
|
Packit Service |
99d393 |
('[uU]?"""', String, combined('stringescape', 'tdqs')),
|
|
Packit Service |
99d393 |
("[uU]?'''", String, combined('stringescape', 'tsqs')),
|
|
Packit Service |
99d393 |
('[uU]?"', String, combined('stringescape', 'dqs')),
|
|
Packit Service |
99d393 |
("[uU]?'", String, combined('stringescape', 'sqs')),
|
|
Packit Service |
99d393 |
include('name'),
|
|
Packit Service |
99d393 |
include('numbers'),
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'keywords': [
|
|
Packit Service |
99d393 |
(r'(assert|break|by|continue|ctypedef|del|elif|else|except\??|exec|'
|
|
Packit Service |
99d393 |
r'finally|for|gil|global|if|include|lambda|nogil|pass|print|raise|'
|
|
Packit Service |
99d393 |
r'return|try|while|yield|as|with)\b', Keyword),
|
|
Packit Service |
99d393 |
(r'(DEF|IF|ELIF|ELSE)\b', Comment.Preproc),
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'builtins': [
|
|
Packit Service |
99d393 |
(r'(?
|
|
Packit Service |
99d393 |
r'bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|'
|
|
Packit Service |
99d393 |
r'complex|delattr|dict|dir|divmod|enumerate|eval|execfile|exit|'
|
|
Packit Service |
99d393 |
r'file|filter|float|frozenset|getattr|globals|hasattr|hash|hex|id|'
|
|
Packit Service |
99d393 |
r'input|int|intern|isinstance|issubclass|iter|len|list|locals|'
|
|
Packit Service |
99d393 |
r'long|map|max|min|next|object|oct|open|ord|pow|property|range|'
|
|
Packit Service |
99d393 |
r'raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|'
|
|
Packit Service |
99d393 |
r'sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|'
|
|
Packit Service |
99d393 |
r'vars|xrange|zip)\b', Name.Builtin),
|
|
Packit Service |
99d393 |
(r'(?
|
|
Packit Service |
99d393 |
r')\b', Name.Builtin.Pseudo),
|
|
Packit Service |
99d393 |
(r'(?
|
|
Packit Service |
99d393 |
r'BaseException|DeprecationWarning|EOFError|EnvironmentError|'
|
|
Packit Service |
99d393 |
r'Exception|FloatingPointError|FutureWarning|GeneratorExit|IOError|'
|
|
Packit Service |
99d393 |
r'ImportError|ImportWarning|IndentationError|IndexError|KeyError|'
|
|
Packit Service |
99d393 |
r'KeyboardInterrupt|LookupError|MemoryError|NameError|'
|
|
Packit Service |
99d393 |
r'NotImplemented|NotImplementedError|OSError|OverflowError|'
|
|
Packit Service |
99d393 |
r'OverflowWarning|PendingDeprecationWarning|ReferenceError|'
|
|
Packit Service |
99d393 |
r'RuntimeError|RuntimeWarning|StandardError|StopIteration|'
|
|
Packit Service |
99d393 |
r'SyntaxError|SyntaxWarning|SystemError|SystemExit|TabError|'
|
|
Packit Service |
99d393 |
r'TypeError|UnboundLocalError|UnicodeDecodeError|'
|
|
Packit Service |
99d393 |
r'UnicodeEncodeError|UnicodeError|UnicodeTranslateError|'
|
|
Packit Service |
99d393 |
r'UnicodeWarning|UserWarning|ValueError|Warning|ZeroDivisionError'
|
|
Packit Service |
99d393 |
r')\b', Name.Exception),
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'numbers': [
|
|
Packit Service |
99d393 |
(r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
|
|
Packit Service |
99d393 |
(r'0\d+', Number.Oct),
|
|
Packit Service |
99d393 |
(r'0[xX][a-fA-F0-9]+', Number.Hex),
|
|
Packit Service |
99d393 |
(r'\d+L', Number.Integer.Long),
|
|
Packit Service |
99d393 |
(r'\d+', Number.Integer)
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'backtick': [
|
|
Packit Service |
99d393 |
('`.*?`', String.Backtick),
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'name': [
|
|
Packit Service |
99d393 |
(r'@[a-zA-Z0-9_]+', Name.Decorator),
|
|
Packit Service |
99d393 |
('[a-zA-Z_][a-zA-Z0-9_]*', Name),
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'funcname': [
|
|
Packit Service |
99d393 |
('[a-zA-Z_][a-zA-Z0-9_]*', Name.Function, '#pop')
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'cdef': [
|
|
Packit Service |
99d393 |
(r'(public|readonly|extern|api|inline)\b', Keyword.Reserved),
|
|
Packit Service |
99d393 |
(r'(struct|enum|union|class)\b', Keyword),
|
|
Packit Service |
99d393 |
(r'([a-zA-Z_][a-zA-Z0-9_]*)(\s*)(?=[(:#=]|$)',
|
|
Packit Service |
99d393 |
bygroups(Name.Function, Text), '#pop'),
|
|
Packit Service |
99d393 |
(r'([a-zA-Z_][a-zA-Z0-9_]*)(\s*)(,)',
|
|
Packit Service |
99d393 |
bygroups(Name.Function, Text, Punctuation)),
|
|
Packit Service |
99d393 |
(r'from\b', Keyword, '#pop'),
|
|
Packit Service |
99d393 |
(r'as\b', Keyword),
|
|
Packit Service |
99d393 |
(r':', Punctuation, '#pop'),
|
|
Packit Service |
99d393 |
(r'(?=["\'])', Text, '#pop'),
|
|
Packit Service |
99d393 |
(r'[a-zA-Z_][a-zA-Z0-9_]*', Keyword.Type),
|
|
Packit Service |
99d393 |
(r'.', Text),
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'classname': [
|
|
Packit Service |
99d393 |
('[a-zA-Z_][a-zA-Z0-9_]*', Name.Class, '#pop')
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'import': [
|
|
Packit Service |
99d393 |
(r'(\s+)(as)(\s+)', bygroups(Text, Keyword, Text)),
|
|
Packit Service |
99d393 |
(r'[a-zA-Z_][a-zA-Z0-9_.]*', Name.Namespace),
|
|
Packit Service |
99d393 |
(r'(\s*)(,)(\s*)', bygroups(Text, Operator, Text)),
|
|
Packit Service |
99d393 |
(r'', Text, '#pop') # all else: go back
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'fromimport': [
|
|
Packit Service |
99d393 |
(r'(\s+)(c?import)\b', bygroups(Text, Keyword), '#pop'),
|
|
Packit Service |
99d393 |
(r'[a-zA-Z_.][a-zA-Z0-9_.]*', Name.Namespace),
|
|
Packit Service |
99d393 |
# ``cdef foo from "header"``, or ``for foo from 0 < i < 10``
|
|
Packit Service |
99d393 |
(r'', Text, '#pop'),
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'stringescape': [
|
|
Packit Service |
99d393 |
(r'\\([\\abfnrtv"\']|\n|N{.*?}|u[a-fA-F0-9]{4}|'
|
|
Packit Service |
99d393 |
r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'strings': [
|
|
Packit Service |
99d393 |
(r'%(\([a-zA-Z0-9]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
|
|
Packit Service |
99d393 |
'[hlL]?[diouxXeEfFgGcrs%]', String.Interpol),
|
|
Packit Service |
99d393 |
(r'[^\\\'"%\n]+', String),
|
|
Packit Service |
99d393 |
# quotes, percents and backslashes must be parsed one at a time
|
|
Packit Service |
99d393 |
(r'[\'"\\]', String),
|
|
Packit Service |
99d393 |
# unhandled string formatting sign
|
|
Packit Service |
99d393 |
(r'%', String)
|
|
Packit Service |
99d393 |
# newlines are an error (use "nl" state)
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'nl': [
|
|
Packit Service |
99d393 |
(r'\n', String)
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'dqs': [
|
|
Packit Service |
99d393 |
(r'"', String, '#pop'),
|
|
Packit Service |
99d393 |
(r'\\\\|\\"|\\\n', String.Escape), # included here again for raw strings
|
|
Packit Service |
99d393 |
include('strings')
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'sqs': [
|
|
Packit Service |
99d393 |
(r"'", String, '#pop'),
|
|
Packit Service |
99d393 |
(r"\\\\|\\'|\\\n", String.Escape), # included here again for raw strings
|
|
Packit Service |
99d393 |
include('strings')
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'tdqs': [
|
|
Packit Service |
99d393 |
(r'"""', String, '#pop'),
|
|
Packit Service |
99d393 |
include('strings'),
|
|
Packit Service |
99d393 |
include('nl')
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
'tsqs': [
|
|
Packit Service |
99d393 |
(r"'''", String, '#pop'),
|
|
Packit Service |
99d393 |
include('strings'),
|
|
Packit Service |
99d393 |
include('nl')
|
|
Packit Service |
99d393 |
],
|
|
Packit Service |
99d393 |
}
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
##TODO: fix this, as shebang lines don't make sense for cython.
|
|
Packit Service |
99d393 |
def analyse_text(text):
|
|
Packit Service |
99d393 |
return shebang_matches(text, r'pythonw?(2\.\d)?')
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
def setup(app):
|
|
Packit Service |
99d393 |
app.add_lexer('cython', CythonLexer())
|