pmacs3/mode/mbox.py

154 lines
5.8 KiB
Python
Raw Normal View History

2008-11-10 10:18:08 -05:00
import commands, dirutil, grp, mailbox, method, mode, os.path, pwd, re
import buffer, default, window
2008-11-10 19:55:13 -05:00
from mode.mutt import MuttGrammar
2008-11-10 10:18:08 -05:00
from lex import Grammar, PatternRule, RegionRule, PatternGroupRule
from point import Point
from buffer import Buffer
from method import Method, Argument, arg
2008-11-10 19:55:13 -05:00
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 ]+'),
]
2008-11-10 10:18:08 -05:00
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):
2008-11-10 19:55:13 -05:00
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
2008-11-10 10:18:08 -05:00
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):
2008-11-10 19:55:13 -05:00
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)
2008-11-10 10:18:08 -05:00
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)
2008-11-10 19:55:13 -05:00
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)
2008-11-10 10:18:08 -05:00
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',))
2008-11-10 19:55:13 -05:00
def install(*args):
Mbox.install(*args)
MboxMsg.install(*args)