"""
-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
"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, '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"<<\S+>>", 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),
(r'[a-zA-Z_][a-zA-Z0-9_.]*', Name),
(r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
(r'.', Punctuation),
],
+
+ 'stringdouble': [
+ (r'"', String.Double, '#pop'),
+ (r'.', String.Double),
+ (r'\n', String.Double),
+ ],
+
+ 'stringsingle': [
+ (r"'", String.Single, '#pop'),
+ (r'.', String.Single),
+ ],
}