Mengdong的技术博客

学习,记录,分享

导航

vim+\LaTeX+TtH+Python+MetaWeblog API写博攻略

vim+\LaTeX+TtH+Python+MetaWeblog API写博攻略

vim+LATEX+TtH+Python+MetaWeblog API写博攻略

mdyang

 

Chapter 1
准备工作

首先需要安装LATEX环境,本文使用Ubuntu + tex live,编辑器则使用vim。如果熟悉其他编辑器如emacs也可。

 

有了LATEX环境后,即可使用latexpdflatex等命令编译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进行博文撰写主要分为以下几个阶段:

 
  1. 编写LATEX源码
     
  2. 编译LATEX源码为HTML并在浏览器中预览,如无问题进入下一步,否则返回1.修改
     
  3. 将写好的博文发送至博客
     
 

基于以上考虑,我为pyposter设计了两个功能:buildpost。其中buildLATEX源码编译为HTML,并启动一个HTTP服务器方便预览,post使用MetaWeblog API将HTML源码发布至博客。下面分两个小节分别讲述功能细节。

 

2.2  build: LATEX源码编译、博文预览

 

pyposter是一个Python脚本,其文件名就叫pyposter。该脚本具备buildpost两项功能。本节介绍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>标签中的文字提取出来即可,简单的文本处理,在此不再详述,可参见pyposterpost()函数。

 

发布操作的实现则简单得多,直接调用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.

posted on 2012-05-15 11:25  mdyang  阅读(827)  评论(0编辑  收藏  举报