pmacs3/mode/rst.py

91 lines
3.3 KiB
Python

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 RST(mode.Fundamental):
modename = 'RST'
extensions = ['.rst']
grammar = RSTGrammar
colors = {
'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'),
'rst_url': ('blue', 'default'),
'bullet': ('magenta', 'default'),
'enumeration': ('magenta', 'default'),
}
def __init__(self, w):
mode.Fundamental.__init__(self, w)
self.add_action_and_bindings(RstInsertSpace(), ('SPACE',))
self.add_action_and_bindings(RstWrapParagraph(), ('M-q',))
install = RST.install
class RstInsertSpace(TextInsertSpace):
limit = 75
class RstWrapParagraph(method.WrapParagraph):
limit = 75
#spacer = RstInsertSpace