import lex, lex_text class MuttGrammar(lex.Grammar): GRAMMAR_LIST = [ {'name': 'header', 'expr': r'(?:^|(?<=\n))(?:From|To|Cc|Bcc|Subject|Reply-To|In-Reply-To|Delivered-To|Date):', 'action': lex.make_token, }, {'name': 'quote1', 'expr': r'(?:^|(?<=\n))(?:(?: *>){3})*(?: *>){1} *(?:[^ >\n][^\n]*)?(?:$|\n)', 'action': lex.make_token, }, {'name': 'quote2', 'expr': r'(?:^|(?<=\n))(?:(?: *>){3})*(?: *>){2} *(?:[^ >\n][^\n]*)?(?:$|\n)', 'action': lex.make_token, }, {'name': 'quote3', 'expr': r'(?:^|(?<=\n))(?:(?: *>){3})*(?: *>){3} *(?:[^ >\n][^\n]*)?(?:$|\n)', 'action': lex.make_token, }, {'name': 'email', 'expr': r'(?:^|(?<=[ :\n]))@\n ]+@(?:[^<>@\.\n ]+\.)*[^<>@\.\n ]+>?', 'action': lex.make_token, }, {'name': 'url', 'expr': r'(?:^|(?<=[ \n]))(?:http|https|ftp|sftp|file|smtp|smtps|torrent|news|jabber|irc|telnet)://(?:[^\.\n ]+\.)*[^\.\n ]+', 'action': lex.make_token, }, {'name': 'continued word', 'expr': r"""([a-zA-Z][a-zA-Z-']*[a-zA-Z])-\n *([a-zA-Z][a-zA-Z-]*[a-zA-Z])""", 'action': lex_text.make_token_spell, }, {'name': 'word', 'expr': r"""(?:[a-zA-Z][-']?)*[a-zA-Z]""", 'action': lex_text.make_token_spell, }, {'name': 'stuff', 'expr': r"""[^ \n]+""", 'action': lex.make_token, }, {'name': "default", 'expr': r'.| |\n', 'action': lex.silent, }, ] def _default_rules(self): """subclasses can override this to define defaults for a grammar""" for rdir in self.GRAMMAR_LIST: self.add_rule(**rdir)