"""
-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
"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"
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),
(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),
+ ],
}