vim+\LaTeX+TtH+Python+MetaWeblog API写博攻略
vim+LATEX+TtH+Python+MetaWeblog API写博攻略
mdyang
Chapter 1
准备工作
首先需要安装LATEX环境,本文使用Ubuntu + tex live,编辑器则使用vim。如果熟悉其他编辑器如emacs也可。
有了LATEX环境后,即可使用latex、pdflatex等命令编译LATEX源代码,生成对应的DVI或PDF文件。由于我们要写博文,需要HTML格式的文档,因此需要将LATEX转换为HTML的工具。在此推荐TtH,一个将LATEX编译为HTML的工具。
1.1 TtH: TEXto HTML的转换工具
TtH最简单的用法为:
tth input.tex
执行该命令将会将input.tex编译为input.html,注意TtH忽略CJK宏包,因此中文LATEX文档里的\usepackage{CJK(utf8)}、\begin{CJK}和\end{CJK}等可以省略。虽然忽略了CJK宏包,但TtH仍然可以正确处理中文,由于TtH生成的HTML文件是UTF-8编码的,所以只需保证输入的LATEX源代码也是UTF-8编码的即可。当使用浏览器打开生成的.html文件时可能会发现中文都是乱码,这是由于TtH生成的HTML文件中缺少<head>段中的一个<meta>标签:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
这一行告诉浏览器页面编码是UTF-8,缺少这一行浏览器可能会选择错误的编码集显示页面,例如在中文版Windows系统下可能使用GBK编码显示该页面,造成中文乱码。如果在浏览器的查看设置里将页面编码手动设置为UTF-8,就会发现里面的中文都能够正确显示。所以这只是一个小问题,只需在HTML文件中插入上述<meta>标签即可。
1.2 pyblog: MetaWeblog API的Python实现
MetaWeblog是RFC的一套规范,MetaWeblog API是一套基于XML-RPC实现的远程调用API,可以使用这些API进行博客操作,包括发布日志、修改日志、分类管理等。主流的编程语言都有XML-RPC的程序库。在Python中这个库是xmlrpclib。不过在自己实现基于Python的MetaWeblog API之前本着避免重复发明车轮的原则去Google Code上搜索了一下,果然发现了一个MetaWeblog API的Python库:pyblog。这个库封装了MetaWeblog API的一些常用函数,并且还支持Wordpress API(MetaWeblog API的超集)。美中不足的是这个库似乎有一些错误,在我的Windows Server 2008 R2 + Python 2.7.2 AMD64上报错。经过研究发现第91行的代码有错误:
r = getattr(self.server, methodname)(args)
应该是:
r = getattr(self.server, methodname)(*args)
另外一个对我个人来说美中不足的地方是pyblog库没有提供对HTTP代理服务器的支持,所以我参照这篇日志中介绍的为xmlrpc添加HTTP代理服务器支持的方法,对pyblog的代码进行了一点改进。需要注意的是这篇日志中实现的UrllibTransport类的构造函数里缺了这么一句:
self._use_datetime = True
我加了这么一句是因为原日志中UrllibTransport类的代码在应用到pyblog中时报了一个错,说UrllibTransport类没有_use_datetime这个属性。我根据命名猜测这个属性应该是个布尔型,所以添加了上面那一句。添加以后代码工作正确。
至此两个最重要的问题已经解决了:
- 将LATEX代码转换为HTML(使用TtH)
- 通过MetaWeblog API将HTML代码的日志发布到博客(使用pyblog)
接下来要做的是将这两个步骤连接起来。考虑pyblog是用Python写的,因此这里使用Python作为胶水语言连接这两步。
Chapter 2
pyposter: 连接LATEX与MetaWeblog API的Python脚本
2.1 设计目标
相比于WYSIWYG编辑器,使用LATEX写博最大的不便在于无法做到所见即所得。对于写好的博文,如果想要检查完稿,需要进行编译,并使用浏览器查看才行。所以使用LaTeX进行博文撰写主要分为以下几个阶段:
- 编写LATEX源码
- 编译LATEX源码为HTML并在浏览器中预览,如无问题进入下一步,否则返回1.修改
- 将写好的博文发送至博客
基于以上考虑,我为pyposter设计了两个功能:build和post。其中build将LATEX源码编译为HTML,并启动一个HTTP服务器方便预览,post使用MetaWeblog API将HTML源码发布至博客。下面分两个小节分别讲述功能细节。
2.2 build: LATEX源码编译、博文预览
pyposter是一个Python脚本,其文件名就叫pyposter。该脚本具备build和post两项功能。本节介绍build功能。
对于LATEX源码编译,只需调用TtH即可。Python中可以通过os.system()执行命令。
编译完毕后需要预览,首先需要在TtH生成的HTML中加入那个缺失的<meta>标签,声明文件的编码,这样无需手动修改浏览器的显示编码页面就可以正常显示。这可以通过简单的文本处理实现,可参见pyposter中的build()实现。
至于预览,Python内置了一个简单的HTTP服务器SimpleHTTPServer,可以通过如下命令启动:
python -m SimpleHTTPServer
启动后的HTTP服务器在8000端口侦听(也可以设置为其他端口),HTTP地址的根目录对应执行该命令的当前目录,如果当前目录下有index.html则默认主页为该文件,否则会显示文件列表。
编译、预览都搞定了以后,就需要对pyposter进行一些处理,使其在系统的任意位置都可以使用。通过以下三个设置,可以在任意位置执行pyposter Python脚本:
- 在pyposter的首行添加#!/usr/bin/python(告诉系统该文件由Python执行)
- 为文件pyposter添加执行权限(chmod +x pyposter)
- 将pyposter所在的路径加入环境变量$PATH
设置完毕后,可使用以下命令编译、预览使用LATEX编写的博文:
pyposter build
以上命令使用TtH编译当前目录下的main.tex,生成main.html,逐行扫描main.html,为其添加如下编码信息:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
经过修改的HTML代码被输出至index.html,然后一个HTTP服务器在当前目录下启动,在浏览器中访问http://HOST:8000即可预览(注意:将HOST替换为具体的主机名或IP)。预览完毕后按CTRL+C即可结束pyposter build进程。如果需要修改则返回vim进行修改,修改完毕后再编译、预览,如果文章已完成则可以进入下一步。
2.3 post: 发布博文
发布博文需要解决的一个小问题是调用MetaWeblog API的new_post方法时需要单独指定博文标题。因此需要HTML文件中提取文章标题。只需将<title>标签中的文字提取出来即可,简单的文本处理,在此不再详述,可参见pyposter的post()函数。
发布操作的实现则简单得多,直接调用pyblog中封装好的MetaWeblog API即可。我对pyblog的代码进行了一些小修改,使其能够使用HTTP代理服务器。
执行以下命令可以将当前目录下的index.html发布为博文:
pyposter post
Chapter 3
小结
我已经把pyposter放到Google Code上:pyposter at Google Code。通过修改配置文件conf.py可使pyposter应用于其他博客。
pyposter现在已经可以做到:
- 一条命令编译LATEX源码并预览HTML(通过pyposter build)
- 一条命令发布HTML博文至博客(通过pyposter post)
pyposter已经具有了基本的功能。但仍然有很多功能需要完善:
- 虽然已经可以正确获取所有类别(通过pyblog的MetaWeblog.get_categories()),但仍然无法为博文添加类别标签
- 无法管理类别标签(添加、删除类别标签)
- 暂时不支持设置博文的entryName
- 未考虑博文包含图片时的情况
- 暂时不支持编辑博文(更改已发布博文的内容)
这些都是留待以后完善的功能。并且限于目前的应用情景,pyposter还只能用于博客园的MetaWeblog API,其他的博客系统暂时还没有进行验证。除MetaWeblog API外,pyblog中还实现了Wordpress API,其功能也有待验证。
欢迎有兴趣试用的各位朋友指正。
File translated from
TEX
by
TTH,
version 4.01.
On 15 May 2012, 09:32.