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庫沒有提供對HTTPProxy 伺服器的支援,所以我參照這篇日誌中介紹的為xmlrpc添加HTTPProxy 伺服器支援的方法,對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寫博最大的不便在於無法做到所見即所得 (WYSIWYG)。對於寫好的博文,如果想要檢查完稿,需要進行編譯,並使用瀏覽器查看才行。所以使用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的代碼進行了一些小修改,使其能夠使用HTTPProxy 伺服器。
執行以下命令可以將目前的目錄下的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.