My Email: yeshengzou@gmail.com

整理一下思绪,把当初的想法记录一下。

问题描述

建立一个博客发布平台,以便分享和记录自己的一些想法。

功能需求

  1. 在页面布局上基本兼容各种浏览器。
  2. 在页面主题上简洁、或可以让我完全自定义。
  3. RSS完全供稿。
  4. 自动投递,使我第一时间获取评论内容。
  5. 二级域名。
  6. 可以使用通用接口发布文章,Email或单独的API。
  7. 可以最大限度控制文章的格式,或直接支持使用HTML。
  8. 文章的保存有保证。
  9. 我可以用VIM写文章。
  10. 具备一定的分类管理功能。
  11. 访问速度不能太慢。

理想方案

打开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,看能不能解决存在的问题。

0 Comments:

Post a Comment



较新的博文 较早的博文 主页