diff --git a/mode/rst.py b/mode/rst.py index 1c560ba..81ebeb1 100644 --- a/mode/rst.py +++ b/mode/rst.py @@ -1,20 +1,77 @@ import color, mode2 from lex3 import Grammar, PatternRule, RegionRule, PatternGroupRule +class RSTString(Grammar): + rules = [ + PatternRule('escaped', r'\\.'), + ] + class RSTGrammar(Grammar): rules = [ - PatternGroupRule(r'title', r'title', r'^.*?\n', r'titlesep', r'^=+\n'), - PatternGroupRule(r'subtitle', r'subtitle', r'^.*?\n', r'subtitlesep', r'^-+\n'), - PatternRule(r'line', r'^.*?\n'), + PatternGroupRule(r'title', r'title_over', r'^=+\n', r'title', r'^.*?\n', + r'title_under', r'^=+\n'), + PatternGroupRule(r'title', r'title', r'^.*?\n', r'title_under', r'^=+\n'), + PatternGroupRule(r'subtitle', r'subtitle_over', r'^-+\n', r'subtitle', + r'^.*?\n', r'subtitle_under', r'^-+\n'), + PatternGroupRule(r'subtitle', r'subtitle', r'^.*?\n', r'subtitle_under', r'^-+\n'), + + # this is kind of a hack, ugh + PatternGroupRule(r'definition', r'term', r'^[^ ]+\n', r'definition', r'^ +'), + PatternRule(r'fieldname', r'^:.+?:'), + PatternRule(r'optionname', r'^(?:--|-|/)[a-zA-Z](?: ?[-a-zA-Z_]+)'), + + PatternRule(r'lineblock', r'^\|'), + RegionRule(r'blocktest', r'>>>', Grammar, '^\n'), + PatternRule(r'transition', r'^[-=.,;]{4,}\n'), + + RegionRule(r'emphasis', r'\*', RSTString, r'\*'), + RegionRule(r'strong_emphasis', r'\*\*', RSTString, r'\*\*'), + RegionRule(r'interpreted', r'`', RSTString, r'`'), + RegionRule(r'inline_literal', r'``', RSTString, r'``'), + RegionRule(r'substitution', r'\|', RSTString, r'\|'), + + PatternRule(r'anonymous', r'[a-zA-Z]+__'), + PatternRule(r'reference', r'[a-zA-Z]+_'), + PatternRule(r'footnote', r'\[[0-9]+\]_'), + PatternRule(r'citation', r'\[.+?\]_'), + PatternRule(r'url', r'http://[^ ]+'), + + PatternRule(r'bullet', r'^ *[-*+]'), + PatternRule(r'enumeration', r'^ *(?:[0-9]+|#)\.'), ] class RST(mode2.Fundamental): grammar = RSTGrammar colors = { - 'title': ('blue', 'default'), - 'titlesep': ('blue', 'default'), - 'subtitle': ('cyan', 'default'), - 'subtitlesep': ('cyan', 'default'), + 'title': ('blue', 'default'), + 'title_over': ('blue', 'default'), + 'title_under': ('blue', 'default'), + 'subtitle': ('cyan', 'default'), + 'subtitle_over': ('cyan', 'default'), + 'subtitle_under': ('cyan', 'default'), + + 'definition': ('green', 'default'), + 'fieldname': ('green', 'default'), + 'optionname': ('green', 'default'), + + 'lineblock': ('cyan', 'default'), + 'blocktest': ('cyan', 'default'), + 'transition': ('cyan', 'default'), + + 'emphasis': ('red', 'default'), + 'strong_emphasis': ('red', 'default'), + 'interpreted': ('magenta', 'default'), + 'inline_literal': ('magenta', 'default'), + 'substitution': ('magenta', 'default'), + + 'anonymous': ('blue', 'default'), + 'reference': ('blue', 'default'), + 'footnote': ('blue', 'default'), + 'citation': ('blue', 'default'), + 'url': ('blue', 'default'), + + 'bullet': ('magenta', 'default'), + 'enumeration': ('magenta', 'default'), } def name(self): return "RST"