From 32e6323676b92eb33f4d8300e790003303be3cc1 Mon Sep 17 00:00:00 2001 From: Glenn Hutchings Date: Thu, 31 Mar 2016 19:59:44 +0100 Subject: [PATCH] Add syntax highlighting. --- .hgignore | 2 + README.md | 1 - about.rst | 2 + chapters/01.rst | 2 + conf.py | 12 +++++- tools/inform.py | 94 +++++++++++++++++++++++++++++++++++++++++++++ tools/transcript.py | 29 ++++++++++++++ 7 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 tools/inform.py create mode 100644 tools/transcript.py diff --git a/.hgignore b/.hgignore index aea98ed..aac1488 100644 --- a/.hgignore +++ b/.hgignore @@ -1,3 +1,5 @@ syntax: glob output/ + +*.pyc diff --git a/README.md b/README.md index e3f5773..6c0485f 100644 --- a/README.md +++ b/README.md @@ -66,5 +66,4 @@ others. Also, in parallel with that, other niceties: * Add a glossary * Add an index -* Add Inform syntax highlighting * Prepare a new PDF version, via the Sphinx LaTeX converter diff --git a/about.rst b/about.rst index 13b4b0b..84c4437 100644 --- a/about.rst +++ b/about.rst @@ -2,6 +2,8 @@ About this guide ================== +.. highlight:: inform + .. epigraph:: | *If they asked me, I could write a book;* diff --git a/chapters/01.rst b/chapters/01.rst index ece83a9..958000f 100644 --- a/chapters/01.rst +++ b/chapters/01.rst @@ -2,6 +2,8 @@ 1: Just what is interactive fiction? ====================================== +.. highlight:: transcript + .. epigraph:: | *A was an archer, who shot at a frog;* diff --git a/conf.py b/conf.py index 5f579c0..0e3fb33 100644 --- a/conf.py +++ b/conf.py @@ -19,7 +19,15 @@ import shlex # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +sys.path.insert(0, os.path.abspath('tools')) + +from inform import InformLexer +from transcript import TranscriptLexer + +# Setup function. +def setup(app): + app.add_lexer('inform', InformLexer()) + app.add_lexer('transcript', TranscriptLexer()) # -- General configuration ------------------------------------------------ @@ -92,7 +100,7 @@ default_role = "any" #show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = 'default' # The default Pygments highlight language. highlight_language = 'none' diff --git a/tools/inform.py b/tools/inform.py new file mode 100644 index 0000000..63d098b --- /dev/null +++ b/tools/inform.py @@ -0,0 +1,94 @@ +""" +Inform syntax highlighting. + +TODO: get it working! +""" + +from pygments.lexer import RegexLexer +from pygments.token import (Text, Comment, Operator, Keyword, Name, + String, Number, Punctuation, Token) + +objects = ["Class", "Nearby", "Object"] + +directives = ["Abbreviate", "Array", "Attribute", "Btrace", "Class", + "Constant", "Default", "Dictionary", "End", "Endif", "Etrace", + "Extend", "Fake_action", "Global", "Ifdef", "Iffalse", + "Ifndef", "Ifnot", "Iftrue", "Ifv3", "Ifv5", "Import", + "Include", "Link", "Listsymbols", "Listdict", "Listverbs", + "Lowstring", "Ltrace", "Message", "Nearby", "Nobtrace", + "Noetrace", "Noltrace", "Notrace", "Object", "Property", + "Release", "Replace", "Serial", "Statusline", "Stub", + "Switches", "System_file", "Trace", "Verb", "Version", + "Zcharacter"] + +defining = ["[", "array", "attribute", "class", "constant", "fake_action", + "global", "lowstring", "nearby", "object", "property"] + +attributes = ["absent", "animate", "clothing", "concealed", "container", + "door", "edible", "enterable", "female", "general", "light", + "lockable", "locked", "male", "moved", "neuter", "on", "open", + "openable", "pluralname", "proper", "scenery", "scored", + "static", "supporter", "switchable", "talkable", "transparent", + "visited", "workflag", "worn"] + +properties = ["n_to", "s_to", "e_to", "w_to", "ne_to", "se_to", "nw_to", + "sw_to", "u_to", "d_to", "in_to", "out_to", "add_to_scope", + "after", "article", "articles", "before", "cant_go", "capacity", + "daemon", "describe", "description", "door_dir", "door_to", + "each_turn", "found_in", "grammar", "initial", + "inside_description", "invent", "life", "list_together", + "name", "number", "orders", "parse_name", "plural", + "react_after", "react_before", "short_name", "short_name_indef", + "time_left", "time_out", "when_closed", "when_open", "when_on", + "when_off", "with_key"] + +keywords = ["box", "break", "continue", "do", "else", "font off", "font on", + "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"] + +action_re = r"\s-*\*" + +def wordlist(list): + return "(" + "|".join(list) + r")\b" + +class InformLexer(RegexLexer): + """ + Inform code lexer. + """ + + name = 'Inform' + aliases = ['inform'] + filenames = ['*.inf'] + mimetypes = ['text/x-inform', 'application/x-inform'] + + tokens = { + 'root': [ + (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), + + (wordlist(objects), Name.Class), + (wordlist(keywords), Token.Keyword.Reserved), + (wordlist(properties), Name.Builtin), + (wordlist(directives), Name.Entity), + (wordlist(attributes), Name.Attribute), + + (r'[a-zA-Z_][a-zA-Z0-9_.]*', Name), + (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float), + (r'\d+', Number.Integer), + + (r'.', Punctuation), + ], + } diff --git a/tools/transcript.py b/tools/transcript.py new file mode 100644 index 0000000..8fe45ce --- /dev/null +++ b/tools/transcript.py @@ -0,0 +1,29 @@ +""" +IF transcript syntax highlighting. +""" + +import re + +from pygments.lexer import RegexLexer +from pygments.token import Generic, Text + +class TranscriptLexer(RegexLexer): + """ + IF transcript lexer. + """ + + name = 'Interactive Fiction transcript' + aliases = ['transcript'] + filenames = ['*.scr'] + mimetypes = ['text/x-scr', 'application/x-scr'] + + tokens = { + 'root': [ + (r'\n', Text), + (r'^[^>].*', Text), + (r'^>', Text, 'command'), + ], + 'command': [ + (r'.*', Generic.Strong, '#pop'), + ], + } -- 2.31.1