最早的架構準備直接使用 Marmite。它的內容模型清楚,能把 Markdown 轉成文章、標籤、彙整、RSS 和 sitemap,也很適合放進自動部署流程。
不過,Poise 的目標不只是「部署時只有一個執行檔」,還希望專案能完整掌控生成器本身。當第三方生成器提供大量用不到的功能時,我們仍必須追蹤它的版本、設定、模板回退行為和輸出變化。對一個刻意縮小邊界的網站來說,這些都成了額外的不確定性。
因此,專案最後移除 Marmite 依賴,重新實作只服務 Poise 的 light-marmite。
單檔與零套件
light-marmite 是一個單一 Python 檔案,只使用標準函式庫。建置環境只要有 Python 3,就不需要 pip、Node.js、Ruby,也不需要下載 Markdown 套件。
這個限制讓生成器保持容易閱讀,也讓供應鏈變得很短。它不嘗試成為通用框架,只實作本站真正使用的能力:
- 解析簡單的 YAML frontmatter。
- 支援安全且足夠寫作的 Markdown 子集。
- 產生文章頁、首頁、分頁、標籤與年份彙整。
- 產生上一篇、下一篇與 backlinks。
- 產生 RSS 和 sitemap。
- 檢查內部連結。
- 對原始 HTML 全程跳脫。
Markdown 的支援範圍包含標題、段落、清單、引用、表格、程式碼與普通連結。對 Poise 來說,這已涵蓋純文字技術文章需要的主要表達方式。
草稿不是一種公開狀態
許多生成器把草稿放在公開內容目錄,再透過 frontmatter 決定是否輸出。Poise 採用更直接的方式:正式文章放在 content/,未發布內容放在 drafts/。
light-marmite 完全不讀取 drafts/。這使草稿隔離不再依賴某個布林欄位是否寫對,也避免草稿意外出現在 RSS、sitemap 或標籤頁。檔案所在的位置,就是它的發布狀態。
將規格變成可驗證的輸出
生成網站只完成一半工作。Poise 的建置腳本會先驗證原稿,再執行 light-marmite,最後稽核整個輸出目錄。
只要出現禁止的檔案類型、HTML 標籤、事件屬性、外部資源或 JavaScript,建置就會失敗。內部連結錯誤也會阻止部署。這些檢查讓「純文字、零 JavaScript」不是 README 裡的願望,而是每次發布都必須通過的測試。
light-marmite 最重要的價值並不是重新實作一個龐大的生態系,而是把問題縮小到能完全理解。它只負責 Poise 需要的事情,因此每次輸出都更容易預測、檢查與長期維護。