群英汇邮件列表更新
经过近两周的工作,群英汇邮件列表系统(Mailman)更新了,主要修正了以下四个方面的问题。
归档附件链接由绝对路径改为相对路径
发给邮件列表的邮件若有附件,Mailman 在生成归档网页时会将附件保存到相应文件,并在归档网页中建立链接。通常会用华丽的分割符“---”来界限,然后是相应的链接。链接是相应归档附件的绝对地址,即用 http打头,紧跟着是域名,可以点击链接查看或下载附件。 群英汇邮件列表有一个改进就是将绝对地址转换为相对地址,这样当用户的邮件列表主机的域名修改后或者因为安全上的需要由HTTP转换为HTTPS协议的时候,归档的链接也依然有效。否则,在更换域名时这些网页必须重新生成,这对有大量邮件存档的服务器来说将是一个梦魇。 但是,群英汇之前的实现有一个副作用,就是当使用相对路径则没有生成链接,而只是文本显示出来-------------- next part -------------- 一个HTML附件被移除... URL: </mailman/private/tech/attachments/20101111/79f938b2/attachment.htm>在经过反复的研究之后,终于定位在代码 Mailman/Archiver/HyperArch.py:
158 # Argh! This pattern is buggy, and will choke on URLs with GET parameters. 159 # MAS: Given that people are not constrained in how they write URIs in plain 160 # text, it is not possible to have a single regexp to reliably match them. 161 # The regexp below is intended to match straightforward cases. Even humans 162 # can't reliably tell whether various punctuation at the end of a URI is part 163 # of the URI or not. 164 urlpat = re.compile(r'([a-z]+://.*?)(?:_\s|_$|$|[]})>\'"\s])', re.IGNORECASE)神马意思呢?就是说:
当你看到这个正则表达式的时候,它已下了一个艰难的决定,就是以http://开头的文本行将进行一系列操作,添加上<a>标签,制作成链接,否则无视。
我们为了让相对URL和绝对URL不再打架,不再让用户为难,我们做出一个超级强大的正则表达式,并和QQ 100% 兼容。index a532c81..9aa8c6f 100644 --- a/Mailman/Archiver/HyperArch.py +++ b/Mailman/Archiver/HyperArch.py @@ -161,7 +161,7 @@ emailpat = re.compile(r'([-+,.\w]+@[-+.\w]+)') # The regexp below is intended to match straightforward cases. Even humans # can't reliably tell whether various punctuation at the end of a URI is part # of the URI or not. -urlpat = re.compile(r'([a-z]+://.*?)(?:_\s|_$|$|[]})>\'"\s])', re.IGNORECASE) +urlpat = re.compile(r'(?P<prefix>url:\s*<)?(?P<url>(?(prefix)[^\s\'">]+|[a-z]+://.*?))(?:_\s|_$|$|[])>\'"\s])', re.IGNORECASE) # Blank lines blankpat = re.compile(r'^\s*$') @@ -1224,19 +1225,19 @@ class HyperArchive(pipermail.T): if kr is None: k = -1 else: - k = kr.start(0) + k = kr.start('url') if j != -1 and (j < k or k == -1): text = jr.group(1) length = len(text) ... ... URL = 'mailto:' + text pos = j elif k != -1 and (j > k or j == -1): - text = URL = kr.group(1) + text = URL = kr.group('url') length = len(text) pos = k else: # j==k上面的正则表达式有哪位网友不解,待我有时间,下回分解。