Org Mode 博客的标签索引

5

由于不断有人询问这个博客是如何搭建的,而我又不想公开那些拼凑而成、糟糕透顶的代码,所以我决定分模块逐步讲解其中的各个部分。一般来说,每当遇到问题需要修复时,我都会记录下自己做了什么,以及它与哪些部分相关联。

最近的一个问题是:在生成标签索引时,一个辅助函数导致栈溢出。我当时将其写成了显式的递归形式,在文章数量较少时运行良好,但随着文章数量的增加就不再适用了。标签索引的生成过程与上一篇文章中介绍的 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))
参与讨论