diff options
author | Reuben Morais <reuben.morais@gmail.com> | 2011-11-27 02:03:18 -0200 |
---|---|---|
committer | Reuben Morais <reuben.morais@gmail.com> | 2011-11-27 02:03:18 -0200 |
commit | 3b1cfe84fc9b10f541bf4df97c1ae0aca87dcf7c (patch) | |
tree | 434facbe2eeda7af3206fdc54c905ddc9aa2a85c /pygments/lexers/compiled.py | |
parent | 254267afdd6a9609ec62948a3ef23084f338dfbc (diff) | |
download | pygments-3b1cfe84fc9b10f541bf4df97c1ae0aca87dcf7c.tar.gz |
Add SourcePawn support
Diffstat (limited to 'pygments/lexers/compiled.py')
-rw-r--r-- | pygments/lexers/compiled.py | 108 |
1 files changed, 107 insertions, 1 deletions
diff --git a/pygments/lexers/compiled.py b/pygments/lexers/compiled.py index 0e14c74b..a6887fb7 100644 --- a/pygments/lexers/compiled.py +++ b/pygments/lexers/compiled.py @@ -27,7 +27,7 @@ __all__ = ['CLexer', 'CppLexer', 'DLexer', 'DelphiLexer', 'ECLexer', 'JavaLexer' 'FortranLexer', 'GLShaderLexer', 'PrologLexer', 'CythonLexer', 'ValaLexer', 'OocLexer', 'GoLexer', 'FelixLexer', 'AdaLexer', 'Modula2Lexer', 'BlitzMaxLexer', 'NimrodLexer', 'GosuLexer', - 'GosuTemplateLexer'] + 'GosuTemplateLexer', 'SourcePawnLexer'] class CLexer(RegexLexer): @@ -2887,3 +2887,109 @@ class GosuTemplateLexer(Lexer): for item in self.lexer.get_tokens_unprocessed(text, stack): yield item + +class SourcePawnLexer(RegexLexer): + """ + For SourcePawn source code with preprocessor directives. + """ + name = 'SourcePawn' + aliases = ['sp'] + filenames = ['*.sp'] + mimetypes = ['text/x-sourcepawn'] + + #: optional Comment or Whitespace + _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+' + + tokens = { + 'root': [ + # preprocessor directives: without whitespace + ('^#if\s+0', Comment.Preproc, 'if0'), + ('^#', Comment.Preproc, 'macro'), + # or with whitespace + ('^' + _ws + r'#if\s+0', Comment.Preproc, 'if0'), + ('^' + _ws + '#', Comment.Preproc, 'macro'), + (r'\n', Text), + (r'\s+', Text), + (r'\\\n', Text), # line continuation + (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single), + (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline), + (r'[{}]', Punctuation), + (r'L?"', String, 'string'), + (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char), + (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float), + (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float), + (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex), + (r'0[0-7]+[LlUu]*', Number.Oct), + (r'\d+[LlUu]*', Number.Integer), + (r'\*/', Error), + (r'[~!%^&*+=|?:<>/-]', Operator), + (r'[()\[\],.;]', Punctuation), + (r'(case|const|continue|native|' + r'default|else|enum|for|if|new|operator|' + r'public|return|sizeof|static|decl|struct|switch)\b', Keyword), + (r'(bool|Float)\b', Keyword.Type), + (r'(true|false)\b', Keyword.Constant), + ('[a-zA-Z_][a-zA-Z0-9_]*', Name), + ], + 'string': [ + (r'"', String, '#pop'), + (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape), + (r'[^\\"\n]+', String), # all other characters + (r'\\\n', String), # line continuation + (r'\\', String), # stray backslash + ], + 'macro': [ + (r'[^/\n]+', Comment.Preproc), + (r'/[*](.|\n)*?[*]/', Comment.Multiline), + (r'//.*?\n', Comment.Single, '#pop'), + (r'/', Comment.Preproc), + (r'(?<=\\)\n', Comment.Preproc), + (r'\n', Comment.Preproc, '#pop'), + ], + 'if0': [ + (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'), + (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'), + (r'.*?\n', Comment), + ] + } + + sm_types = ['Action', 'bool', 'Float', 'Plugin', 'String', 'any', + 'AdminFlag','OverrideType','OverrideRule','ImmunityType', + 'GroupId','AdminId','AdmAccessMode','AdminCachePart', + 'CookieAccess','CookieMenu','CookieMenuAction','NetFlow', + 'ConVarBounds','QueryCookie','ReplySource','ConVarQueryResult', + 'ConVarQueryFinished','Function','Action','Identity','PluginStatus', + 'PluginInfo','DBResult','DBBindType','DBPriority','PropType', + 'PropFieldType', 'MoveType','RenderMode','RenderFx','EventHookMode', + 'EventHook','FileType', 'FileTimeMode','PathType','ParamType', + 'ExecType','DialogType','Handle', 'KvDataTypes','NominateResult', + 'MapChange','MenuStyle','MenuAction', 'MenuSource','RegexError', + 'SDKCallType','SDKLibrary','SDKFuncConfSource','SDKType', + 'SDKPassMethod','RayType','TraceEntityFilter','ListenOverride', + 'SortOrder','SortType','SortFunc2D','APLRes','FeatureType', + 'FeatureStatus','SMCResult','SMCError','TFClassType','TFTeam', + 'TFCond','TFResourceType','Timer','TopMenuAction','TopMenuObjectType', + 'TopMenuPosition','TopMenuObject','UserMsg'] + + def __init__(self, **options): + self.smhighlighting = get_bool_opt(options, + 'sourcemod', True) + + self._functions = list() + if self.smhighlighting: + from pygments.lexers._sourcemodbuiltins import FUNCTIONS + for func in FUNCTIONS: + self._functions.append(func) + RegexLexer.__init__(self, **options) + + def get_tokens_unprocessed(self, text): + for index, token, value in \ + RegexLexer.get_tokens_unprocessed(self, text): + if token is Name: + if self.smhighlighting: + if value in self.sm_types: + token = Keyword.Type + elif value in self._functions: + token = Name.Builtin + yield index, token, value + |