Do a bunch of proofreading fixes.
[ibg.git] / tools / inform.py
index 63d098b790eedc43b6d6b85dbb07b8de82510882..73b0d0d76e580351645e2752e15a05fae61aa9b4 100644 (file)
@@ -1,7 +1,9 @@
 """
-Inform syntax highlighting.
+Inform 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,33 @@ 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, 'stringdouble'),
+            (r"'", String.Single, 'stringsingle'),
+
             (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 +99,15 @@ class InformLexer(RegexLexer):
 
             (r'.', Punctuation),
         ],
+
+        'stringdouble': [
+            (r'"', String.Double, '#pop'),
+            (r'.', String.Double),
+            (r'\n', String.Double),
+        ],
+
+        'stringsingle': [
+            (r"'", String.Single, '#pop'),
+            (r'.', String.Single),
+        ],
     }