import re
import color, mode, method
import mode.text
from lex import Grammar, PatternRule

class MuttGrammar(Grammar):
    rules = [
        PatternRule(name=r'mutt_header', pattern=r'^(?:From|To|Cc|Bcc|Subject|Reply-To|In-Reply-To|Delivered-To|Date):'),
        PatternRule(name=r'quoteb', pattern=r'^ *(?:(?: *>){3})*(?: *>){2}.*$'),
        PatternRule(name=r'quotea', pattern=r'^ *(?:(?: *>){3})*(?: *>){1}.*$'),
        PatternRule(name=r'quotec', pattern=r'^ *(?:(?: *>){3})*(?: *>){3}.*$'),
        PatternRule(name=r'email', pattern=r'(?:^|(?<=[ :]))<?[^<>@\n ]+@(?:[^<>@\.\n ]+\.)*[^<>@\.\n ]+>?'),
        PatternRule(name=r'url', pattern=r'(?:^|(?<= ))(?:http|https|ftp|sftp|file|smtp|smtps|torrent|news|jabber|irc|telnet)://(?:[^\.\n ]+\.)*[^\.\n ]+'),
        mode.text.ContinuedRule(),
        mode.text.WordRule(),
        PatternRule(name=r'punct', pattern=r'[^a-zA-Z0-9_]'),
        PatternRule(name=r'stuff', pattern=r'[a-zA-Z0-9_]+'),
    ]

class MuttWrapParagraph(method.WrapParagraph):
    limit    = 72
    empty_re = re.compile('^(?: *>.*| *)$')
class MuttInsertSpace(mode.text.TextInsertSpace):
    wrapper = MuttWrapParagraph

class Mutt(mode.Fundamental):
    modename = 'Mutt'
    grammar  = MuttGrammar()
    colors   = {
        'mutt_header': ('green', 'default', 'bold'),
        'email':       ('cyan', 'default', 'bold'),
        'url':         ('cyan', 'default', 'bold'),
        'quotea':      ('yellow', 'default', 'bold'),
        'quoteb':      ('cyan', 'default', 'bold'),
        'quotec':      ('magenta', 'default', 'bold'),
        'misspelled':  ('red', 'default', 'bold'),
        'cont.start':  ('default', 'default', 'bold'),
        'cont.end':    ('default', 'default', 'bold'),
        'word':        ('default', 'default', 'bold'),
        'punct':       ('default', 'default', 'bold'),
        'stuff':       ('default', 'default', 'bold'),
    }
    actions = [MuttInsertSpace, MuttWrapParagraph]
    config = {
        'mutt.margin': 72,
    }
    def __init__(self, w):
        mode.Fundamental.__init__(self, w)
        self.add_bindings('learn-word', ('C-c l',))
        self.add_bindings('mutt-wrap-paragraph', ('M-q',))
        self.add_bindings('mutt-insert-space', ('SPACE',))

install = Mutt.install