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'), 'cont.start': ('default', 'default'), 'cont.end': ('default', 'default'), 'word': ('default', 'default'), 'punct': ('default', 'default'), 'stuff': ('default', 'default'), } actions = [MuttInsertSpace, MuttWrapParagraph] 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