import commands, dirutil, grp, mailbox, method, mode, os.path, pwd, re import buffer, default, window from mode.mutt import MuttGrammar from lex import Grammar, PatternRule, RegionRule, PatternGroupRule from point import Point from buffer import Buffer from method import Method, Argument, arg class LineGrammar(Grammar): rules = [PatternRule(name=r'data', pattern=r'^.*\n$')] class MailMsgGrammar(Grammar): rules = [ PatternRule(name=r'mail_pgp', pattern=r'^-----BEGIN PGP SIGNED MESSAGE-----\n$'), RegionRule(r'mail_signature', r'^-----BEGIN PGP SIGNATURE-----\n$', LineGrammar, r'^-----END PGP SIGNATURE-----\n$'), PatternRule(name=r'mail_header', pattern=r'^(?:From|To|Cc|Bcc|Subject|Reply-To|In-Reply-To|Delivered-To|Date):'), PatternRule(name=r'mail_quoteb', pattern=r'^ *(?:(?: *>){3})*(?: *>){2}.*$'), PatternRule(name=r'mail_quotea', pattern=r'^ *(?:(?: *>){3})*(?: *>){1}.*$'), PatternRule(name=r'mail_quotec', pattern=r'^ *(?:(?: *>){3})*(?: *>){3}.*$'), PatternRule(name=r'mail_email', pattern=r'(?:^|(?<=[ :]))@\n ]+@(?:[^<>@\.\n ]+\.)*[^<>@\.\n ]+>?'), PatternRule(name=r'mail_url', pattern=r'(?:^|(?<= ))(?:http|https|ftp|sftp|file|smtp|smtps|torrent|news|jabber|irc|telnet)://(?:[^\.\n ]+\.)*[^\.\n ]+'), ] class MboxMsgBuffer(Buffer): btype = 'mboxmsg' def __init__(self, path, lineno, msg): Buffer.__init__(self) self.path = os.path.realpath(path) self.base = os.path.basename(self.path) self.lineno = lineno self.msg = msg def changed(self): return False def readonly(self): return True def path_exists(self): raise Exception def _make_path(self, name): raise Exception def save(self, force=False): raise Exception, "can't save an mbox message" def save_as(self, path): raise Exception, "can't save an mbox message" def name(self): return 'mbox:%s:%s' % (self.base, self.lineno) def _get_lines(self): lines = [ 'Delivered-To: ' + self.msg.get('delivered-to'), 'To: ' + self.msg.get('to'), 'From: ' + self.msg.get('from'), 'Subject: ' + self.msg.get('subject'), 'Date: ' + self.msg.get('date'), '', ] lines.extend(self.msg.get_payload().split('\n')) return lines def open(self): self.lines = self._get_lines() def reload(self): lines = self._get_lines() self.set_lines(lines, force=True) class MboxListBuffer(Buffer): btype = 'mboxlist' format = '%(pos)4d %(flags)5.5s %(subject)s' re1 = re.compile('[\n\t ]+') def __init__(self, path): Buffer.__init__(self) self.path = os.path.realpath(path) self.base = os.path.basename(self.path) self.size = 0 def changed(self): return False def readonly(self): return True def path_exists(self): raise Exception def _make_path(self, name): raise Exception def save(self, force=False): raise Exception, "can't save an mbox" def save_as(self, path): raise Exception, "can't save an mbox" def name(self): return 'mbox:%s' % (self.base) def _get_lines(self): f = open(self.path, 'r') self.size = len(f.read()) f.close() self.mbox = mailbox.mbox(self.path) # lines = [] pos = 1 for msg in self.mbox: subject = self.re1.sub(' ', msg['subject']) msize = len(str(msg)) d = { 'pos': pos, 'flags': ''.join(msg.get_flags()), 'subject': subject, } s = self.format % d lines.append(s) pos += 1 # return lines def open(self): self.lines = self._get_lines() def reload(self): lines = self._get_lines() self.set_lines(lines, force=True) class MboxRefresh(Method): def _execute(self, w, **vargs): w.buffer.reload() class MboxOpenMsg(Method): def _execute(self, w, **vargs): b = w.buffer b = MboxMsgBuffer(b.path, w.cursor.y, b.mbox[w.cursor.y]) b.open() window.Window(b, w.application, height=0, width=0, mode_name='mboxmsg') w.application.add_buffer(b) w.application.switch_buffer(b) class MboxOpenPath(Method): args = [arg('mbox', dt="path", p="Open Mbox: ", dv=default.path_dirname, ld=True, h="mbox to open")] def _execute(self, w, **vargs): b = MboxListBuffer(vargs['mbox']) b.open() window.Window(b, w.application, height=0, width=0, mode_name='mbox') w.application.add_buffer(b) w.application.switch_buffer(b) class MboxMsg(mode.Fundamental): modename = 'MboxMsg' colors = { 'mail_pgp': ('red', 'default', 'bold'), 'mail_signature.start': ('red', 'default', 'bold'), 'mail_signature.data': ('red', 'default', 'bold'), 'mail_signature.null': ('red', 'default', 'bold'), 'mail_signature.end': ('red', 'default', 'bold'), 'mail_header': ('green', 'default', 'bold'), 'mail_email': ('cyan', 'default', 'bold'), 'mail_url': ('cyan', 'default', 'bold'), 'mail_quotea': ('yellow', 'default', 'bold'), 'mail_quoteb': ('cyan', 'default', 'bold'), 'mail_quotec': ('magenta', 'default', 'bold'), } actions = [] grammar = MailMsgGrammar def __init__(self, w): mode.Fundamental.__init__(self, w) class Mbox(mode.Fundamental): modename = 'Mbox' actions = [MboxRefresh, MboxOpenPath, MboxOpenMsg] def __init__(self, w): mode.Fundamental.__init__(self, w) self.add_bindings('mbox-refresh', ('C-c r',)) self.add_bindings('mbox-open-msg', ('RETURN',)) def install(*args): Mbox.install(*args) MboxMsg.install(*args)