diff options
author | Daniel J. Ramirez <djrmuv@gmail.com> | 2017-09-14 15:08:08 -0500 |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2019-11-28 06:18:16 +0100 |
commit | 0347b9811b7605c411ac52b75967e929e72c9c6f (patch) | |
tree | 3ac886bf8111a69a7a77977b74d73003723af270 | |
parent | b45777fd2713bc3c6b80680168563afa5c96b46d (diff) | |
download | pygments-git-732/djrm0/gdscript.tar.gz |
Added GDScript lexer732/djrm0/gdscript
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | pygments/lexers/_mapping.py | 1 | ||||
-rw-r--r-- | pygments/lexers/gdscript.py | 166 |
3 files changed, 168 insertions, 0 deletions
@@ -163,6 +163,7 @@ Other contributors, listed alphabetically, are: * Oleh Prypin -- Crystal lexer (based on Ruby lexer) * Elias Rabel -- Fortran fixed form lexer * raichoo -- Idris lexer +* Daniel Ramirez -- GDScript lexer * Kashif Rasul -- CUDA lexer * Nathan Reed -- HLSL lexer * Justin Reidy -- MXML lexer diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index acb71ad9..e082e2cc 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -168,6 +168,7 @@ LEXERS = { 'FoxProLexer': ('pygments.lexers.foxpro', 'FoxPro', ('foxpro', 'vfp', 'clipper', 'xbase'), ('*.PRG', '*.prg'), ()), 'FreeFemLexer': ('pygments.lexers.freefem', 'Freefem', ('freefem',), ('*.edp',), ('text/x-freefem',)), 'GAPLexer': ('pygments.lexers.algebra', 'GAP', ('gap',), ('*.g', '*.gd', '*.gi', '*.gap'), ()), + 'GDScriptLexer': ('pygments.lexers.gdscript', 'GDScript', ('gdscript', 'gd'), ('*.gd',), ('text/x-gdscript', 'application/x-gdscript')), 'GLShaderLexer': ('pygments.lexers.graphics', 'GLSL', ('glsl',), ('*.vert', '*.frag', '*.geo'), ('text/x-glslsrc',)), 'GasLexer': ('pygments.lexers.asm', 'GAS', ('gas', 'asm'), ('*.s', '*.S'), ('text/x-gas',)), 'GenshiLexer': ('pygments.lexers.templates', 'Genshi', ('genshi', 'kid', 'xml+genshi', 'xml+kid'), ('*.kid',), ('application/x-genshi', 'application/x-kid')), diff --git a/pygments/lexers/gdscript.py b/pygments/lexers/gdscript.py new file mode 100644 index 00000000..45c9685f --- /dev/null +++ b/pygments/lexers/gdscript.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- +""" + pygments.lexers.gdscript + ~~~~~~~~~~~~~~~~~~~~~~ + + Lexer for GDScript. + + :copyright: Copyright 2xxx by The Godot Engine Community + :license: MIT. + + modified by Daniel J. Ramirez <djrmuv@gmail.com> based on the original python.py pygment +""" + +import re + +from pygments.lexer import Lexer, RegexLexer, include, bygroups, using, \ + default, words, combined, do_insertions +from pygments.util import get_bool_opt, shebang_matches +from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ + Number, Punctuation, Generic, Other, Error +from pygments import unistring as uni + +__all__ = ['GDScriptLexer'] + +line_re = re.compile('.*?\n') + + +class GDScriptLexer(RegexLexer): + """ + For `Godot source code <https://www.godotengine.org>`_ source code. + """ + + name = 'GDScript' + aliases = ['gdscript', 'gd'] + filenames = ['*.gd'] + mimetypes = ['text/x-gdscript', 'application/x-gdscript'] + + def innerstring_rules(ttype): + return [ + # the old style '%s' % (...) string formatting + (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?' + '[hlL]?[E-GXc-giorsux%]', String.Interpol), + # backslashes, quotes and formatting signs must be parsed one at a time + (r'[^\\\'"%\n]+', ttype), + (r'[\'"\\]', ttype), + # unhandled string formatting sign + (r'%', ttype), + # newlines are an error (use "nl" state) + ] + + tokens = { + 'root': [ + (r'\n', Text), + (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")', + bygroups(Text, String.Affix, String.Doc)), + (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')", + bygroups(Text, String.Affix, String.Doc)), + (r'[^\S\n]+', Text), + (r'#.*$', Comment.Single), + (r'[]{}:(),;[]', Punctuation), + (r'\\\n', Text), + (r'\\', Text), + (r'(in|and|or|not)\b', Operator.Word), + (r'!=|==|<<|>>|&&|\+=|-=|\*=|/=|%=|&=|\|=|\|\||[-~+/*%=<>&^.!|$]', Operator), + include('keywords'), + (r'(func)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'funcname'), + (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'classname'), + include('builtins'), + ('([rR]|[uUbB][rR]|[rR][uUbB])(""")', + bygroups(String.Affix, String.Double), 'tdqs'), + ("([rR]|[uUbB][rR]|[rR][uUbB])(''')", + bygroups(String.Affix, String.Single), 'tsqs'), + ('([rR]|[uUbB][rR]|[rR][uUbB])(")', + bygroups(String.Affix, String.Double), 'dqs'), + ("([rR]|[uUbB][rR]|[rR][uUbB])(')", + bygroups(String.Affix, String.Single), 'sqs'), + ('([uUbB]?)(""")', bygroups(String.Affix, String.Double), + combined('stringescape', 'tdqs')), + ("([uUbB]?)(''')", bygroups(String.Affix, String.Single), + combined('stringescape', 'tsqs')), + ('([uUbB]?)(")', bygroups(String.Affix, String.Double), + combined('stringescape', 'dqs')), + ("([uUbB]?)(')", bygroups(String.Affix, String.Single), + combined('stringescape', 'sqs')), + include('name'), + include('numbers'), + ], + 'keywords': [ + (words(( + 'do', 'var', 'const', 'extends', 'is', 'export', 'onready', 'tool', + 'static', 'setget', 'signal', 'breakpoint', 'switch', 'case', + 'assert', 'break', 'continue', 'elif', 'else', 'for', 'if', + 'pass', 'return', 'while', 'match', 'master', 'sync', 'slave', 'rpc', 'enum'), suffix=r'\b'), + Keyword), + ], + 'builtins': [ + (words(( + 'Color8', 'ColorN', 'abs', 'acos', 'asin', 'assert', 'atan', 'atan2', + 'bytes2var', 'ceil', 'char', 'clamp', 'convert', 'cos', 'cosh', + 'db2linear', 'decimals', 'dectime', 'deg2rad', 'dict2inst', + 'ease', 'exp', 'floor', 'fmod', 'fposmod', 'funcref', 'hash', + 'inst2dict', 'instance_from_id', 'is_inf', 'is_nan', 'lerp', + 'linear2db', 'load', 'log', 'max', 'min', 'nearest_po2', 'pow', + 'preload', 'print', 'print_stack', 'printerr', 'printraw', + 'prints', 'printt', 'rad2deg', 'rand_range', 'rand_seed', + 'randf', 'randi', 'randomize', 'range', 'round', 'seed', 'sign', + 'sin', 'sinh', 'sqrt', 'stepify', 'str', 'str2var', 'tan', + 'tan', 'tanh', 'type_exist', 'typeof', 'var2bytes', 'var2str', + 'weakref', 'yield'), + prefix=r'(?<!\.)', suffix=r'\b'), + Name.Builtin), + (r'((?<!\.)(self|false|true)|(PI|NAN|INF)' + r')\b', Name.Builtin.Pseudo), + (words(( + 'bool', 'int', 'float', 'String', 'NodePath' + 'Vector2', 'Rect2', 'Transform2D', + 'Vector3', 'Rect3', 'Plane', 'Quat', 'Basis', 'Transform', + 'Color', "RID", 'Object', 'NodePath', 'Dictionary', + 'Array', 'PoolByteArray', 'PoolIntArray', 'PoolRealArray', + 'PoolStringArray', 'PoolVector2Array', 'PoolVector3Array', 'PoolColorArray', + 'null', + ), prefix=r'(?<!\.)', suffix=r'\b'), Name.Builtin.Type), + ], + 'numbers': [ + (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?', Number.Float), + (r'\d+[eE][+-]?[0-9]+j?', Number.Float), + (r'0[xX][a-fA-F0-9]+', Number.Hex), + (r'\d+j?', Number.Integer) + ], + 'name': [ + ('[a-zA-Z_]\w*', Name), + ], + 'funcname': [ + ('[a-zA-Z_]\w*', Name.Function, '#pop'), + default('#pop'), + ], + 'classname': [ + ('[a-zA-Z_]\w*', Name.Class, '#pop') + ], + 'stringescape': [ + (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|' + r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape) + ], + 'strings-single': innerstring_rules(String.Single), + 'strings-double': innerstring_rules(String.Double), + 'dqs': [ + (r'"', String.Double, '#pop'), + (r'\\\\|\\"|\\\n', String.Escape), # included here for raw strings + include('strings-double') + ], + 'sqs': [ + (r"'", String.Single, '#pop'), + (r"\\\\|\\'|\\\n", String.Escape), # included here for raw strings + include('strings-single') + ], + 'tdqs': [ + (r'"""', String.Double, '#pop'), + include('strings-double'), + (r'\n', String.Double) + ], + 'tsqs': [ + (r"'''", String.Single, '#pop'), + include('strings-single'), + (r'\n', String.Single) + ], + } |