X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=tools%2Finform.py;h=1fa4e5b2290b3a02173cb4df2560c73d66e1c7fb;hb=54830106a3ef48c411e0346f54bfb56f3072b8a2;hp=63d098b790eedc43b6d6b85dbb07b8de82510882;hpb=32e6323676b92eb33f4d8300e790003303be3cc1;p=ibg.git diff --git a/tools/inform.py b/tools/inform.py index 63d098b..1fa4e5b 100644 --- a/tools/inform.py +++ b/tools/inform.py @@ -1,7 +1,9 @@ """ -Inform syntax highlighting. +Inform 6 syntax highlighting. -TODO: get it working! +This is an ultra-minimal version compared to the standard Pygments Inform6 +lexer, but is much more forgiving of syntax errors. And it handles the +exclamation-inside-string case properly. """ from pygments.lexer import RegexLexer @@ -42,16 +44,18 @@ properties = ["n_to", "s_to", "e_to", "w_to", "ne_to", "se_to", "nw_to", "time_left", "time_out", "when_closed", "when_open", "when_on", "when_off", "with_key"] -keywords = ["box", "break", "continue", "do", "else", "font off", "font on", +extension_properties = ["pname"] + +keywords = ["box", "break", "continue", "do", "else", "font", "for", "give", "has", "hasnt", "if", "in", "inversion", "jump", "move", "new_line", "notin", "objectloop", "ofclass", "or", "print", "print_ret", "provides", "quit", "read", "remove", "restore", "return", "rfalse", "rtrue", "save", "spaces", "string", "style bold", "style fixed", "style reverse", "style roman", "style underline", "switch", "to", "until", - "while"] + "while", "with"] -action_re = r"\s-*\*" +constants = ["false", "true"] def wordlist(list): return "(" + "|".join(list) + r")\b" @@ -61,29 +65,34 @@ class InformLexer(RegexLexer): Inform code lexer. """ - name = 'Inform' - aliases = ['inform'] + name = 'Inform 6' + aliases = ['inform', 'inform6', 'i6'] filenames = ['*.inf'] mimetypes = ['text/x-inform', 'application/x-inform'] tokens = { 'root': [ + (r'"', String.Double, 'string-double'), + (r"'", String.Single, 'string-single'), + (r"\[ *", Text, 'function-name'), + (r'\n', Text), (r'[^\S\n]+', Text), (r'!.*$', Comment.Single), (r'\\\n', Text), (r'\\', Text), (r'=', Operator), - (r'"[^"]*"', String.Double), - (r"'[^']*'", String.Single), - (r"\S+:", Name.Label), - (r"<<.+>>", Name.Label), + (r"[A-Za-z_,]+:", Name.Label), + (r"<.+?>", Name.Label), (wordlist(objects), Name.Class), (wordlist(keywords), Token.Keyword.Reserved), (wordlist(properties), Name.Builtin), (wordlist(directives), Name.Entity), (wordlist(attributes), Name.Attribute), + (wordlist(constants), Name.Constant), + + (wordlist(extension_properties), Name.Builtin), (r'[a-zA-Z_][a-zA-Z0-9_.]*', Name), (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float), @@ -91,4 +100,20 @@ class InformLexer(RegexLexer): (r'.', Punctuation), ], + + 'function-name': [ + (r"[ ;]", Text, '#pop'), + (r".", Name.Function), + ], + + 'string-double': [ + (r'"', String.Double, '#pop'), + (r'.', String.Double), + (r'\n', String.Double), + ], + + 'string-single': [ + (r"'", String.Single, '#pop'), + (r'.', String.Single), + ], }