diff --git a/mode/mutt.py b/mode/mutt.py index e73e31a..b967e81 100644 --- a/mode/mutt.py +++ b/mode/mutt.py @@ -2,21 +2,24 @@ import re from mode import Fundamental from method import WrapParagraph from mode.text import ContinuedRule, WordRule, TextInsertSpace -from lex import Grammar, PatternRule +from lex import Grammar, PatternRule, RegionRule, PatternMatchRule -class MuttGrammar(Grammar): - rules = [ - PatternRule('mutt_header', '^(?:From|To|Cc|Bcc|Subject|Reply-To|In-Reply-To|Delivered-To|Date):'), - PatternRule('quotec', '^ *(?:(?: *>){3})*(?: *>){3}.*$'), - PatternRule('quoteb', '^ *(?:(?: *>){3})*(?: *>){2}.*$'), - PatternRule('quotea', '^ *(?:(?: *>){3})*(?: *>){1}.*$'), - PatternRule('email', r'(?:^|(?<=[ :]))@\n ]+@(?:[^<>@\.\n ]+\.)*[^<>@\.\n ]+>?'), - PatternRule('url', r'(?:^|(?<= ))(?:http|https|ftp|sftp|file|smtp|smtps|torrent|news|jabber|irc|telnet)://(?:[^\.\n ]+\.)*[^\.\n ]+'), - ContinuedRule(), - WordRule(), - PatternRule('punct', '[^a-zA-Z0-9_]'), - PatternRule('stuff', '[a-zA-Z0-9_]+'), - ] +rules = [ + PatternRule('quotec', '^ *(?:(?: *>){3})*(?: *>){3}.*$'), + PatternRule('quoteb', '^ *(?:(?: *>){3})*(?: *>){2}.*$'), + PatternRule('quotea', '^ *(?:(?: *>){3})*(?: *>){1}.*$'), + PatternRule('email', r'(?:^|(?<=[ :]))@\n ]+@(?:[^<>@\.\n ]+\.)*[^<>@\.\n ]+>?'), + PatternRule('url', r'(?:^|(?<= ))(?:http|https|ftp|sftp|file|smtp|smtps|torrent|news|jabber|irc|telnet)://(?:[^\.\n ]+\.)*[^\.\n ]+'), + ContinuedRule(), + WordRule(), + PatternRule('punctuation', '[^a-zA-Z0-9_]'), + PatternRule('data', '[a-zA-Z0-9_]+'), +] + +class HeaderGrammar(Grammar): rules = [PatternRule('header', '^.+:')] + rules +class BodyGrammar(Grammar): rules = rules +class MuttGrammar(Grammar): + rules = [RegionRule('mutt', '^', HeaderGrammar, '^\n$', BodyGrammar, '')] class MuttWrapParagraph(WrapParagraph): limit = 72 @@ -28,18 +31,18 @@ class Mutt(Fundamental): name = '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'), + 'mutt.header': ('green', 'default', 'bold'), + 'mutt.email': ('cyan', 'default', 'bold'), + 'mutt.url': ('cyan', 'default', 'bold'), + 'mutt.quotea': ('yellow', 'default', 'bold'), + 'mutt.quoteb': ('cyan', 'default', 'bold'), + 'mutt.quotec': ('magenta', 'default', 'bold'), + 'mutt.misspelled': ('red', 'default', 'bold'), + 'mutt.cont.start': ('default', 'default'), + 'mutt.cont.end': ('default', 'default'), + 'mutt.word': ('default', 'default'), + 'mutt.punctuation': ('default', 'default'), + 'mutt.data': ('default', 'default'), } actions = [MuttInsertSpace, MuttWrapParagraph] config = {