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