Skip to main content

Hugo 開發的空白去除(trim space)規範

是否應該 trim space({{- -}})沒有規範,你想去除就去除,不想就不要去除,但是這裡我要講的是我自己的規範。

Hugo 是小眾語言,構建出來的模板輸出如 HTML/CSS/JS 也都空白不敏感,因此你想怎麼做就怎麼做,基本不會有任何問題。

但是 nested shortcode 調用時就會因為模板中包含空白造成 HTML 內容被錯誤的當成 Markdown 渲染,而有空白的 indent 在 CommonMark 規範中就會被當成 codeblock 處理。

因此至少在 shortcode 調用區域,你應該手動 trim spaces 避免此問題。

然而這種飄渺不明確的規範就會造成你的專案源碼看起來很亂,語法不一致,因此我的建議是永遠 trim spaces,除非那個地方不能 trim,比如 HTML attribute。

這不會造成視覺混亂問題,因為所有模板都是 {{- -}} 格式都一致,不能 trim 的地方也會有 locality(通常在 HTML attribute 內部),而當你有時 trim、有時不 trim,這才真正會造成混亂。

並且我可以舉出另一個例子支撐,在同樣是模板語言的 Jinja 中,各大使用 Jinja 的工具(如 Ansible)、開發者都建議開啟全局設定 trim_blocks,只有 trim_blocks 覆蓋不到的地方才手動加入,也就是說 Jinja 這個知名的模板語言,這個生態系的工具,大部分的態度就是「你本來就該 trim spaces」。回到 Hugo,我們只是因為 go template 沒有這種自動判讀功能,把缺乏功能的事實反推回「沒有自動功能,因此應該預設不要 trim」是完全不合理的。反之,統一 trim 至少還確保整份代碼外觀看起來都一樣,而且也沒有 shortcode 渲染錯誤的煩惱,最重要的是不用腦,扣掉 HTML attribute,你永遠不用想這裡到底需不需要 trim,trim 就對了。