標籤:

寫作工具的取經之路

公眾號寫了一年,穿插著寫了一本書,在工具的使用上,也漸漸有了些心得,不敢獨專,跟大家分享一下。

最早我使用的是reST [1] ,使用sphinx [2] 來撰寫文章。使用reST/sphinx最大的好處是格式簡單,擴展性強,便於生成PDF和多種文檔結構。

然而我的博客在用octopress等工具生成的 [3] ,使用的是markdown。做類似的事,卻用兩種格式,這讓人十分抓狂。再三考慮後,我決定也使用markdown來寫公眾號。

使用markdown惱人的是格式太簡單,有時候需要一些變化,便只好直接上html。不過簡單有簡單的好處,它讓我更專註於內容,而非作為點綴的形式。

為了便於版本管理,我所有的稿子都放在一個git repo下,同步到github(private repo,嘻嘻)。這樣做的好處是我不必擔心丟稿子,同時github自動為markdown生成的展示頁面讓我可以copy & paste到公眾號上。

最初公眾號對github的格式的支持是良好的,但七八月間的某次調整,公眾號突然對各種外部粘入的內容不友好了,格式丟得一塌糊塗,惱人得很。後來從知乎上,我了解到markdown here這個chrome神器,你只需把原始的markdown文稿粘入公眾號的輸入框,按下一個快捷鍵(記得是ctrl + alt + M),markdown here就會自動幫你轉換成html,還保留所有格式。稍稍研究了一下markdown here,我才明白但凡公眾號上發布的文章,格式都需要是inline的,就跟html email一樣。markdown here自帶一個基礎樣式表,然後在生成html的時候,把這個樣式表inline到每一行html代碼中。

了解了這一點後,便再也沒人能阻擋我對公眾號文章的「美」的追求。在不同的文章里,我不斷嘗試,一點點修改樣式表,使其至少符合我的審美。

在此期間,我還用node-webkit + ace + marked做了個簡單的osx下的編輯器,但因為沒有比sublime text + markdown here更好用,我自己都沒在用,所以便罷了。

隨著「途客圈創業記」連載的不斷深入,我發現自己需要一個好的PDF生成工具。最初我在LaTeX [4] 上艱難前行,生成了也還算過得去的PDF,後來發現了kitabu [5] + princexml [6] 的解決方案,便全面轉換到這個方案,「途客圈創業記」便是用其生成的。

後來讀者朋友先後給我推薦了gitbook [7] 和asciidoctor [8]。gitbook的能力自不必說,不少出版社都在使用,而且其生成的html可以用做互動式教學,很適合技術類的電子書。但gitbook目前只支持markdown格式,使得其擴展成為問題。在未來的版本中,gitbook有可能會加入asciidoc的支持。

相對於大家都很了解的markdown,知道asciidoc的人不多。這也是一個純文本的寫作語言,和markdown一樣很好掌握,但格式豐富得多。想了解asciidoc的語法,可以google asciidoctor syntax。

我的新書「奇博士的管理課」便使用asciidoc撰寫,之所以這麼選擇,是因為我喜歡嘗鮮,就跟不斷變換寫作風格一樣,我喜歡在未知的世界裡探索。

asciidoc的世界裡沒有kitabu這樣的工具,至少我沒發現。所以我只好自己寫一個,使用了這些工具:

  • asciidoctor,一個基於ruby的asciidoc → html的命令行工具。

  • 自己寫的cssliner,用於生成公眾號友好的網頁,使用python的premailer lib

  • princexml,用於生成PDF。

  • makefile,把所有工具連接起來。

Makefile如下:

ADOCTOR=asciidoctornPRINCE=princenCSSLINER=bin/csslinernCAT=catnnBOOK=book.adocnSUFFIX=suffix.adocnnOUT=./outnnALL_CHAPTERS=$(shell find chapters -name "*.adoc" | grep -v index.adoc)nALL_HTML=$(ALL_CHAPTERS:%.adoc=$(OUT)/%.html)nnHTML_CSS=./templates/html/style.cssnWEIXIN_CSS=./templates/weixin/style.cssnnHTML_FILE=$(OUT)/book.htmlnWEIXIN_FILE=$(OUT)/weixin.htmlnPDF_FILE=$(OUT)/book.pdfnn.PHONY: html weixinnnhtml:n @$(ADOCTOR) -o $(HTML_FILE) -a stylesheet=$(HTML_CSS) $(BOOK)n @$(PRINCE) $(HTML_FILE) -o $(PDF_FILE)n @echo "Done!"nn$(ALL_HTML): $(OUT)/%.html: %.adocn @echo "Working on $<..."n @$(CAT) $< $(SUFFIX) > $(OUT)/tmp.adocn @$(ADOCTOR) -o $@ -a stylesheet=$(WEIXIN_CSS) $(OUT)/tmp.adocn @rm $(OUT)/tmp.adocn @$(CSSLINER) $@ $@nnweixin: $(ALL_HTML)n @echo "Done!"nnclean:n @rm -rf $(OUT)/*n

稍稍解釋一下:

1) 我的所有文章都放在chapters目錄下,$(ALL_CHAPTERS) 獲取所有adoc文檔。

2) 每個新的章節單獨一個文檔,為了公眾號發表方便,生成獨立的html。由於每篇文章末尾我都要加一段共同的內容,所以:

@$(CAT) $< $(SUFFIX) > $(OUT)/tmp.adocn

用於生成一個臨時的,包含 $(SUFFIX) 的文檔,然後再用 cssliner 將css inline化。

其它的不解釋。這樣,對於「奇博士的管理課」,當我想生成PDF時:

$ make htmln

想生成用於公眾號的內容時:

$ make weixinn

就一切OK了。如果大家覺得這工具有用,也許我可以將其做成一個python命令行工具包,一條命令完成所有工作。

歡迎訂閱公眾號『程序人生』(搜索微信號 programmer_life)。每篇文章都力求原汁原味,早8點與您相會。

1. restructured text

2. 一個基於python的文檔生成工具

3. 最早是octopress,後來使用wintersmith,最後又遷移到docpad上

4. 一個基於TeX的排版系統,沒聽過TeX?你還記得那個神一樣的the art of computer progrmming的作者Donald Knuth,寫書的時候他覺得排版工具不爽,便花了差不多十年時間發明了TeX

5. 一個ruby下的電子書生成工具

6. 最好的將html轉換成PDF的工具,沒有之一

7. 一個通過markdown生成印刷級質量的電子書的工具

8. 一個使用asciidoc生成精美html和docbook的工具
推薦閱讀:

永恆不變的魅力
ps4和swich選擇哪個比較好?
拳皇14. 鐵拳7.街霸終極版,這三個PS4遊戲只能選一個的話如何抉擇?
全面對比 Xbox One 和 PS4,入手哪個更好?

TAG:迷思 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |