靜態部落格與輕量標記語言的殘念手記

有持續關注我部落格的朋友們應該能注意到,咱最近又很可恥地把部落格搬回 Blogger 上面了。

稍微回顧一下吧。去年七月的時候,我歡天喜地地申請了新域名,寫了一篇文章宣佈網站搬家,改用「Pelican」這款靜態部落格產生系統,來製作自己的全新部落格。

Pelican 的使用方式,是讓使用者以 markdownreStructuredTextAsciiDoc輕量級標記語言來寫作部落格文章當作底稿,然後透過某些方法將這些文章轉換成一頁頁的網頁,並套用各種模版將它組織起來,變成部落格的模樣。

1.jpg

▲ Pelican 可以從輕量級標記語言的原始檔,來自動生成靜態網頁

因為系統中所有頁面都是「預先產生」的,全是「不會更改」的靜態頁面,所以這種部落格系統又被稱為靜態部落格系統。

靜態部落格有一些好處,而輕量級標記語言的好處也不少,雙劍合壁因此讓人趨之若騖。《像黑客一样写博客——Jekyll入门》與《使用Pelican搭建Blog》這兩篇都有講到為什麼要這麼做。

總而言之:簡單的語法格式!極低的 Server 要求!高效的性能!容易佈署!用自己喜歡的文字編輯器編輯!可直接閱讀的原始碼!可進行版本管理!容易被搜索引擎找到!原始格式完全掌控在自己手上!版面造型彈性很高!……

以上都是正確的大實話,我也是被這些特徵誘拐過去的。不過如此寫上大半年後,我畢竟是受不了了決定斷尾求生。為什麼呢?

以下就來說說我在使用這套系統時碰上的問題。雖然問題主要是針對 Pelican 和 reStructuredText,不過大部份抱怨應該也能或輕或重地反應其他系統的狀況。

那麼開始吧。

輕量級標記語言方面的問題

特殊格式不是難打就是打不出來

輕量級標記語言,相對於 HTML 這種一般的標記語言來說,優點是容易撰寫也容易閱讀,所以經常被用來書寫些簡單的文件。不過這種方便當然是有代價的,有些格式很難用輕量級標記語言來呈現,甚至根本就無法呈現。

想表達的東西根本呈現不出來,這是我寫作過程中很難受的一件事。

舉例來說,我在 reStructuredText 中想要使用 劃掉 效果來吐個嘈,就必須這樣寫……

.. raw:: html
<style>
.strike {
text-decoration: line-through;
}
</style>
.. role:: strike
:class: strike
文字文字文字文字 :strike:`劃掉` 文字文字文字文字。

喂!喂喂……我只是想要劃掉一點蠢台詞而已,非得寫這麼長長一大串東西嗎?

還有約定好的 可讀性 呢?可讀性 跑哪裡去了?

另外還有一些格式則根本打不出來,比方說「 旁註文字(ruby text) 」這種。

2.jpg

▲ 用 Chrome 瀏覽時的效果。這是 W3C 標準,但 Firefox 與一些其他瀏覽器還不支援……

一般格式要打也不簡單

我現在說的不是上面那種罕見的特殊格式,而是一般的格式,比方說經常用在強調的 黑體 斜體 等。

在 reStructuredText 中,如果我想讓文字表現為「我很重視這串文字」,我必須要寫成……

我很\ **重視**\ 這串文字

為什麼要寫成這樣呢?其中包括一大堆很複雜的原因,這包括「語義化」、「文字用空白分隔」、「空白跳脫」、「預設值」、「中文是被歧視的語言」等等。我在這裡無法詳細解說,因為那會很長。

如果您會修改某些預設 CSS 的話,您可以把它縮減成:

我很\ *重視*\ 這串文字

不過如此一來,您在剪貼頁面時又會遇到一些難以處理的靈異問題。此處先不提……

Anyway,它很麻煩……應該說是超麻煩的。我只是要把字塗黑而已,有那麼困難嗎?

反過來說,用一般的所見即所得編輯器又如何呢?Ctrl + B 就搞定了。

貼圖麻煩

以下是 reStructuredText 中的貼圖指令:

.. image:: images/1.jpg

上面是最基本的貼圖格式。

此處問題已經很明顯了,那就是您非得記住「圖檔檔名是什麼」才有可能正確貼圖。

1.jpg 很好記,2qa01w4_pic.jpg 就絕非如此。當然您也可以手動改檔名或是剪貼檔名,但那又是另一種麻煩……

麻煩 2 上面看不出來,因為上面什麼東西都沒設定。我們看下面:

.. image:: images/1.jpg
:width: 500
:align: center
:target: images/1.jpg

這張圖片被設定為寬度 500px、水平置中、按圖片會顯示出大圖……

很一般的設定是吧?但我非得寫這麼多東西才能讓它正常運作。如果我寫一篇文章要貼五幅圖,光是管理這些貼圖指令就會給我帶來許多麻煩。

更多麻煩的指令一大堆

引言:

.. epigraph:: 假如你告訴那些大人們說:「我看見一間用玫瑰色紅磚蓋成的房子,窗裡有天竺葵,屋頂上有鴿子……」他們無法想像得出這間房子。你應該告訴他們說:「我看到一間值得十萬法郎的房子。」然後他們才叫道:「多麼美呀!」

閱讀更多:

.. raw:: html
<!-- READMORE -->

空行:

正文正文
|
正文正文

超連結:

`原討論串 <http://www.cool3c.com/article/69460>`_

……我就不繼續舉例了。總之一個比一個難打,而且也難記。用起來累死我了。

上面還只是單獨看。你能想像一個段落裡面套用了五個超連結後,段落會變成多麼妖艷的樣子嗎?工具限制了我們的表達能力,就是這個意思。

容錯率低

使用輕量級標記語言時你必須要完美寫對。寫錯一個字符,整篇文章就可能直接爆炸。

有時候是編譯不過跳出 Error,有時候是格式全面跑掉。因為輕量級標記語言沒有所見即所得,所以文章生成後的結果,可能會和作者想像中大不相同。

要求完美帶來心理壓力,這讓我寫作時總是十分謹慎,審視再三,寫作的樂趣被剝奪大半。

輕量級標記語言的理想之一是讓作者忽略格式,專注寫作,但這事實上卻反而讓人不得不更加關注格式。因為那怕錯一個字符甚至一個空格,都有可能讓文章完全走樣,甚至根本渲染不出來。

可轉移性不如想像中高

使用輕量級標記語言的其中一項優點,就是它是純文字的,因此不會被綁死在當前系統裡。

理論上是如此。但另一方面,輕量級標記語言設計初衷並非為了寫部落格,如今為了供部落格使用,有必要在文章中插入了不少額外的自訂語法標記。

舉例來說……

:status: draft
:date: 2013-11-27
:category: 書籍
:tags: 化學, 科普
:slug: bookreview-05

以上這種也就罷了,好歹還在框架的設計範圍之內。

.. image:: |filename|images/1.jpg

這條語句就傷腦筋了……|filename| 關鍵字是 Pelican 用來幫助文章產生「相對連結」用的,這對文章的附件(如圖檔)有其必要性。但 reStructuredText 的標準生成器 docutil 卻不認識這個關鍵字,如果餵給它吃這篇文章,就會得到警告與錯誤。

這結果暗示了,我的文章其實不如我想像中地那麼容易轉移。

靜態部落格系統的問題

支援文章數有限

這分成幾個方面。首先先講「生成文章」的問題。

在 Pelican 中,每次要加入新文章時,都會需要生成整個站點中全部的文章。假設生成一篇文章需要 0.2 秒,站點中有一百篇文章就要花二十秒,三百篇文章就要一分鐘……

看出問題在哪裡了嗎?

隨著文章數量愈來愈多,生成所需要花費的時間也會跟著增加。

更糟的是,Pelican 沒有「所見即所得」編輯器,故無法直觀地看出網頁最終呈現的樣貌,因此更加依賴生成來調試結果。結果修兩個錯字就得重複生成一次,這耗時相當可觀,簡直是噩夢,而且這噩夢還會隨文章數量增加而愈來愈嚴重。

其次,文章愈多,修改與管理都會愈來愈辛苦。因為資料夾中會逐漸塞滿文章與附件圖檔,這些東西又很難讓它依照時間排列。

要修改上回與上上回寫過的文章?記得檔名或資料夾名(與網誌上的標題名不同)的話還可以試著找找,不然就只能用 grep 指令先查出檔名再找找看了,這是哪門子茹毛飲血的使用方式啊……

3.jpg

▲ 怎麼翻查修改文章?……果然還是 grep 萬歲?

我想這就是網上那些用靜態部落格系統的朋友,很少能寫上上百篇文章的原因了。

基本功能有限

我不清楚理由,但這類靜態部落格系統中,官方預設提供的功能通常都較少。就算看似很基本的功能,常常也必須透過外掛才能支援提供。比方說 Pelican 中「摘要/閱讀更多」功能就是如此。

沒必要的功能不用裝,這是不錯,但許多功能得手動裝裝拆拆,也意味著額外的複雜性。

這種複雜性平常沒什麼,升級時就頭痛了,特別是主系統與外掛升級節奏不匹配時更是如此。此外,某些外掛還會提供特殊語法讓使用者在文章中使用,結果就是事後把外掛移除的話,整套系統就無法工作。這些外掛只能裝不能拆,相當要命,升級升不上去時更加讓人抓狂。

系統複雜無法隨處更新網誌

我家有三台電腦,但更新部落格時只能用其中一台來更新,這是因為有兩台的 Pelican 環境用了不同的 Pelican 版本(Pelican 3.3 與 Pelican 3.2 有差異),又或是依賴不完整,想把環境安裝好難度較高的緣故。

除此之外,儘管理論上輕量級標記語言可以隨處繕打,但現實中,在缺乏執行環境的機器上打字,就算打了一些文字也無法藉由預覽來查找錯誤,因此無法完稿,結果終究只能在特定機器上使用,讓我非常著惱。

寫新文章時桌面混亂&前置作業一大堆

每次要開始撰寫新文章之前,我的桌面上得開兩個終端機:

  1. 其中一個用來生成靜態文稿
  2. 另一個用來維持一個預覽用的臨時 local server;
  3. 此外還要開瀏覽器、文字編輯器、檔案瀏覽器各一
4.jpg

▲ 寫部落格時讓人抓狂的混亂桌面狀態

每次要寫部落格時都得開個半打程式,桌面亂成一團。

部落格系統升級時的混亂

我的部落格採用 Pelican 3.2 版本,但 3.2 的部落格無法透過 3.3 版程式來生成。而眾 Linux 發行版pip 中,預提供的 Pelican 卻陸續升級到 3.3,這逼得我升級不是不升級也不是。之所以不想升級的原因,是因為升級過程中要調試一堆東西,一度試了半天還沒法讓自訂的模版與插件升上去,因此暫時放棄。

升級不是無痛,是很痛。

當然,動態部落格也是會有升級的問題。不過我可以選擇不升級擱置它,或是把問題丟給服務提供商解決,而不一定非要自己處理。

抱怨這麼多,Blogger 就那麼好嗎?

才怪!Blogger 問題還是有不少,不然我當初也不會把它丟掉逃跑了。

Blogger 版面造型限制很大、頁面中莫名其妙的標記與結構很多、程式碼看起來十分骯髒、讀取載入速度相對慢,這都是問題。

其中的編輯器,大概是最有助於讓人微笑著取出柴刀的項目--連個 <p> 標記都打不出來是怎樣?全用 <br /> 像話嗎?如果手動修改 HTML 原始碼,它還會很自動地把我的原始碼給改掉恢復原狀,真是智能得讓人涕泗橫流啊,混帳。

罵歸罵,總地來說,Blogger 的問題還是比較好解決的。反正在剛 逃出老婆毒手 的伊邪那岐眼中,黃泉比良坂看上去也和天國相差彷彿?大概就是這種感覺吧?