import color, method, mode from lex import Grammar, PatternRule, RegionRule, PatternGroupRule from mode.text import TextInsertSpace class RSTString(Grammar): rules = [ PatternRule('escaped', r'\\.'), ] class RSTGrammar(Grammar): rules = [ 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'rst_url', r'http://[^ ]+'), PatternRule(r'bullet', r'^ *[-*+]'), PatternRule(r'enumeration', r'^ *(?:[0-9]+|#)\.'), ] class RstInsertSpace(TextInsertSpace): limit = 75 class RstWrapParagraph(method.WrapParagraph): limit = 75 class RST(mode.Fundamental): modename = 'RST' extensions = ['.rst'] grammar = RSTGrammar colors = { 'title': ('blue', 'default', 'bold'), 'title_over': ('blue', 'default', 'bold'), 'title_under': ('blue', 'default', 'bold'), 'subtitle': ('cyan', 'default', 'bold'), 'subtitle_over': ('cyan', 'default', 'bold'), 'subtitle_under': ('cyan', 'default', 'bold'), 'definition': ('green', 'default', 'bold'), 'fieldname': ('green', 'default', 'bold'), 'optionname': ('green', 'default', 'bold'), 'lineblock': ('cyan', 'default', 'bold'), 'blocktest': ('cyan', 'default', 'bold'), 'transition': ('cyan', 'default', 'bold'), 'emphasis': ('red', 'default', 'bold'), 'strong_emphasis': ('red', 'default', 'bold'), 'interpreted': ('magenta', 'default', 'bold'), 'inline_literal': ('magenta', 'default', 'bold'), 'substitution': ('magenta', 'default', 'bold'), 'anonymous': ('blue', 'default', 'bold'), 'reference': ('blue', 'default', 'bold'), 'footnote': ('blue', 'default', 'bold'), 'citation': ('blue', 'default', 'bold'), 'rst_url': ('blue', 'default', 'bold'), 'bullet': ('magenta', 'default', 'bold'), 'enumeration': ('magenta', 'default', 'bold'), } actions = [RstInsertSpace, RstWrapParagraph] def __init__(self, w): mode.Fundamental.__init__(self, w) self.add_bindings('rst-insert-space', ('SPACE',)) self.add_bindings('rst-wrap-paragraph', ('M-q',)) install = RST.install