安裝 hexo 的一些細節

hexo 是一個靜態網站產生器,用 markdown 寫完文章內容之後,它會自動幫你生成 html 頁面。因著這個特性,hexo 網頁可以架設在任何 http server 上,而不需要用到資料庫(如 mysql)、伺服器端程式碼(如 php)之類的東西。因為是用 markdown 寫文章,你可以用任何的文字編輯器來編輯 hexo blog,也可以用版本控制系統來紀錄 blog 的更動,比起 wordpress 或 blogger 這一類的 WYSIWYG
的編輯器來的有彈性許多。

我的這個 blog 就是用 hexo 架設的,在安裝的時候,碰到了一些問題,在這裡做個筆記,希望讓之後碰到相同問題的人可以不用再花時間做重複的事。

1. 安裝 hexo-renderer-discount 失敗

discount 是一個用 C 語言實作的 markdown compiler,功能比內建的 marked 還要強。因此,我想要安裝 discount 作為預設的 markdown renderer。然而在安裝 hexo-renderer-discount 的時候,出現以下錯誤訊息:

g++: error: unrecognized command line option ‘-mimpure-text’

其實這跟 hexo-renderer-discount 這個套件本身無關,問題出在 discount 套件。在寫這篇文章的時候(2013/10/12),discount 的 build script 裡面的 linker flag
包含了 -mimpure-text 這個選項。我用 Google 查了一下,發現這個 flag 是針對
SPARC 處理器,而在我系統上的 gcc 則沒有這個選項,所以才會發生錯誤。我對這個錯誤的解決方法是,修改 discount 的 linker flag,手動安裝 discount,然後再安裝 hexo-renderer-discount

在開始手動安裝之前,先確定你的系統上有 node-waf 這個程式,在 openSUSE 12.3
裡面,這表示必須安裝 nodejs-devel 套件。

第一個步驟是先將 discount 的原始碼下載到 node_modules 目錄,最方便的方法是用 npm 下載,但是不要讓它安裝,一出現 Checking for program ... 訊息之後就立刻按 Ctrl-C 停止 npm:

# 先切換到 hexo blog 的根目錄
npm install discount # 一出現 "Checking for program g++ or c++" 就立刻按 Ctrl-C
cd npm_modules/discount # 切換到下載的 discount 目錄

開啟 wscript,找到這一行

obj.linkflags = ["-lmarkdown", "-mimpure-text", "-L."]

去掉 -mimpure-text,改成這樣:

obj.linkflags = ["-lmarkdown", "-L."]

接下來,編譯 discount

node-waf configure build

如果沒有錯誤訊息的話,就表示 discount 已經成功安裝了。接下來切換回 hexo 的根目錄,然後安裝 hexo-renderer-discount

cd ../..
npm install hexo-renderer-discount

如此一來就可以在 hexo 裡面使用 discount markdown 來寫文章了。

2. 中文分行書寫問題

中文的語詞之間並沒有空格,markdown 的設計者顯然沒有考慮到這一點,因為 markdown
的語法並沒有內建分行書寫的功能,如果把中文分為兩行:

中文分行
書寫

這樣會被 markdown 轉換為 中文分行 書寫,中間被加入了空白。若是硬要用 markdown
達成分行書寫又不要在中間加空白的話,只能寫成這樣:

中文分行<!--
-->書寫

利用 html 註解來把分行符號吃掉,但是行數一多就變得很麻煩了。

為了解決這個問題,我加入了一個自訂的 renderer script ,將所有 *.md 裡面以 \
結尾的行與它的下一行合併,這樣就可以寫成這樣:

中文分行\
書寫

而輸出結果為 中文分行書寫。要達到這個效果,把以下的 script 複製到 hexo
根目錄下的 scripts/ 目錄裡面:

// markdown-preproc.js
// import synchronous renderers
markdown = hexo.extend.renderer.list(true)["md"];

// override renderer function for *.md
hexo.extend.renderer.register('md', 'html', function(data, options) {
   var result = data.text.replace(/\\\n/g, ''); // join lines separated with '\<newline>'
   result = markdown({text: result}, options); // render with default markdown renderer
   return result;
}, true);

我會選擇使用 \ 是因為我常用 reStructuredText
,所以習慣這樣寫。如果你比較常用 latex 寫文章,你或許會想要使用 % 符號來連接中文行,若是這樣的話,請將以上的 script 中的 /\\\n/g 改成 /%\n/g 即可。