整理一下思绪,把当初的想法记录一下。
问题描述
建立一个博客发布平台,以便分享和记录自己的一些想法。
功能需求
- 在页面布局上基本兼容各种浏览器。
- 在页面主题上简洁、或可以让我完全自定义。
- RSS完全供稿。
- 自动投递,使我第一时间获取评论内容。
- 二级域名。
- 可以使用通用接口发布文章,Email或单独的API。
- 可以最大限度控制文章的格式,或直接支持使用HTML。
- 文章的保存有保证。
- 我可以用VIM写文章。
- 具备一定的分类管理功能。
- 访问速度不能太慢。
理想方案
打开VIM,写东西,发送。(自动发表、分类存档、备份源文件)
自己开发还是使用现成的?
自己开发的好处我可以完全控制所有的环节,随意添加我需要的功能,花点钱还能弄个顶级域名。但代价是,要花费比较多的时间,还要每年投入个几百元的主机费用。还有以后系统升级时可能非常折腾。而我现在又没很多的时间也没有钱,所以还是用一个现成的好。
用现成的我就选了Blogger。
实现方案
在VIM中如何发送?
一个比较通用方式是,在本机架设一个SMTP服务器,然后使用一个可以用VIM作编辑器的客户端,写好内容后本地投递。但这种方式太麻烦了,不但要一个独立的SMTP服务器,而且在写东西时你实际上还需要去打开一个客户端。
最简单的方式应该感谢gmail的开放API。因为gmail有开放的API,所以你使用这个API甚至可以把你的gmail账户当成是一个SMTP服务器。还有一个关键的因素就是,gmail有python的API,而VIM的脚本中是可以直接嵌入python的。剩下的事就比较简单了。
首先,从http://libgmail.sourceforge.net/下载libgmai。
在VIM中使用libgmail直接发送邮件到指定地址(参考: http://djcraven5.blogspot.com/2006/10/send-gmail-message-from-vim.html):
" Make sure the Vim was compiled with +python before loading the script... if !has("python") finish endif :command! -nargs=? GMSend :call GMailSend("<args>") function! GMailSend(args) python << EOF import vim to = vim.eval('a:args') GSend(to) EOF endfunction python << EOF ########### BEGIN USER CONFIG ########## account = 'xxxx@gmail.com' password = 'xxxxx' ########### END USER CONFIG ########### def GSend(to): """ Send the current buffer as a Gmail message to a given user. """ import libgmail subject = vim.current.buffer[0] attachments = vim.current.buffer[2].split(',') if attachments[0] == 'None': attachments = None body = '\n'.join(vim.current.buffer[4:]) ga = libgmail.GmailAccount(account, password) try: ga.login() except libgmail.GmailLoginFailure: print account, password print "Login failed!!. (Wrong username/password?)" gmsg = libgmail.GmailComposedMessage(to, subject, body, filenames = attachments) result = ga.sendMessage(gmsg) if result: print "Message sent `%s` successfully." % subject else: print "Could not send message." EOF
格式如何控制?
Blogger中可以直接使用HTML,所以直接发送HTML格式的邮件就可以了。
但是,如果直接写HTML不是太折腾了吗?所以我想用一种wiki的语法来写,然后解析成HTML后发送出去。最先考虑的是用与MoinMoin一样的语法,不过MoinMoin中似乎并没有把它的语法parser分离出来,google了一下,也有人对此进行了相关的探索,但我没找到比较圆满的结果。于是我决定使用markdown,它比较简单,网上相关的扩展实现也不少,使用面还是很广的,重要的是它有python的实现,可以从这里下载(http://pypi.python.org/pypi/markdown2/)。
markdown2只有一个文件,使用非常简单:
>>> import markdown2
>>> markdown2.markdown('*syntax*')
u'<p><em>syntax</em></p>\n'
>>>
要在VIM中正常使用markdown2解析后的结果,需要对结果进行一次utf8的编码。
body = markdown2.markdown(body).encode('utf8')
然后对于解析后得到的HTML结果,可以先生成一个本机的临时文件,在本地浏览器中预览一下。
file = open('/home/zys/temp/' + subject + '.html','w')
print >> file,body
file.close()
cmd = 'firefox /home/zys/temp/%s.html' % subject
os.system(cmd)
备份源文件
每一篇文章的markdown2格式的源文件,都在发布文章的同时发送到我指定的邮箱当中保存。
file = open('/home/zys/temp/' + subject + '.markdown', 'w')
print >> file,source
file.close()
if not attachments: attachments = []
attachments.append('/home/zys/temp/' + subject + '.markdown')
gmsg2 = libgmail.GmailComposedMessage('xxxxx@gmail.com',
'[带着梦想走天涯]' + subject, body, filenames = attachments)
TODO
经过上面提到一番折腾后,已经可以比较顺手地使用了,但还有一些比较麻烦的问题还没有解决。
在文章中插图。这点的麻烦之处在于自动上传图片。如果在邮件当中添加图片附件,那么这些图片会被自动上传到picasa中,同时自动在文章的最前面插入这些图片,只是最前面,你不能把它插入到文章的其它部分中。如果在文章中间手动使用HTML标签插入图片,那么需要自己先将图片上传,获得URL后才能进一步操作。其实在gmail中已经可以自由插图,系统会自动上传,但在本机的VIM中,如何在邮件中自由插图我还无解T_T。这个在文章中间插图的需求还影响到其它一些功能的实现,如使用LaTeX的语法写一些公式或画一些图,本来可以自动转成图片插入到HTML页面中的。
为文章添加标签。很遗憾,通过邮件方式发布文章,我就是不知道怎么添加标签,google也无结果。
markdown2的hack。把markdown2改成尽量接近MoinMoin的语法,还要给它添加表格的相关语法,因为直接用HTML写一个表格还是比较烦的。
结束语
反正现在使用这个解决方案还是可以说比较顺手的。接下来会去看一下Blogger Data API,看能不能解决存在的问题。