Org Mode 博客的标签索引
由于不断有人询问这个博客是如何搭建的,而我又不想公开那些拼凑而成、糟糕透顶的代码,所以我决定分模块逐步讲解其中的各个部分。一般来说,每当遇到问题需要修复时,我都会记录下自己做了什么,以及它与哪些部分相关联。
最近的一个问题是:在生成标签索引时,一个辅助函数导致栈溢出。我当时将其写成了显式的递归形式,在文章数量较少时运行良好,但随着文章数量的增加就不再适用了。标签索引的生成过程与上一篇文章中介绍的 RSS 订阅源生成模式类似。
In[1]:
(defun tw-tag-index (project)
"为 PROJECT 生成标签索引页面。"
(let* ((filename (concat (project-dir "src" "org") "tags.org"))
;; 获取该项目中所有已公开列出的文件。
(files (seq-filter (lambda (entry) (plist-get entry :indexed))
(tw-get-all-files project)))
;; 转换为按标签排序的标签-文章对列表。
(all-tags (sort (tw-get-all-file-tags files)
(lambda (a b) (string< (car a) (car b))))))
(with-temp-file filename
(insert (concat
"#+TITLE: Tags\n"
;; 不显示作者和发布日期。
"#+AUTHOR: \n"
;; 不列入公共索引。
"#+FILETAGS: :page:\n\n"
;; 包含目录。
"#+TOC: headlines:1\n\n"
;; 然后为每个标签生成标题。
(org-element-interpret-data
(tw-article-entry-headlines all-tags)))))
;; 返回所创建文件的路径名。我也不太记得为什么这么做了,也许其实没必要。
filename))
参与讨论