import re import color, mode, method import mode.text from lex import Grammar, PatternRule class MuttGrammar(Grammar): rules = [ PatternRule(name=r'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 Mutt(mode.Fundamental): modename = 'Mutt' grammar = MuttGrammar() colors = { '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'), } def __init__(self, w): mode.Fundamental.__init__(self, w) self.add_action_and_bindings(mode.text.LearnWord(), ('C-c l',)) self.add_action_and_bindings(MuttWrapParagraph(), ('M-q',)) self.add_action_and_bindings(MuttInsertSpace(), ('SPACE',)) class MuttWrapLine(method.WrapLine): limit = 72 #class MuttWrapParagraph(method.WrapParagraph): class MuttWrapParagraph(method.WrapParagraph2): wrapper = MuttWrapLine empty_re = re.compile('^[ >\n]*$') class MuttInsertSpace(mode.text.TextInsertSpace): limit = 72 wrapper = MuttWrapParagraph install = Mutt.install