Contents

blog-from-org

从Org同步到Hugo

Hello Org mode and thanks ox-hugo。 Org mode非常适合作为个人的TODO 管理,笔记记录管理,同样也可以用来写blog。Hugo原生支持org格式的文件,使用的go-org来实现。另一种方式是在emacs中将org文件导出为Hugo使用的markdown语法。

工作流

使用org roam管理笔记和blog。对于有blog tag的node 自动同步到blog仓库中,并发布。这中间使用了gitea的webhook 自动触发org到markdown的转换。

#!/usr/bin/env emacs --batch
;; export-blog.el
;; 本脚本遍历指定目录下的所有 Org 文件,
;; 对包含博客标记(如 "#+blog: true" 或 "#+blog: yes")的文件,
;; 使用 ox-hugo 导出为 Markdown 格式。


(setq dired-use-ls-dired nil)

(setq org-export-with-author nil) ;; Org 导出时不包含作者
(with-eval-after-load 'ox-hugo
  (setq org-hugo-front-matter-key-replace-alist '(("author" . nil))))

;; 配置 package 源并加载包管理器
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

;; 如果 ox-hugo 尚未安装,可以选择自动安装(建议先手动安装以免批处理模式下交互问题)
(unless (package-installed-p 'ox-hugo)
  (package-refresh-contents)
  (package-install 'ox-hugo))

(require 'ox-hugo)

;; 判断文件是否包含博客标记
(defun has-blog-marker-p (file)
  "检查 FILE 是否包含博客标记,假定标记格式为 '#+blog: true' 或 '#+blog: yes'。"
  (with-temp-buffer
    (insert-file-contents file)
    (if (re-search-forward "^[ \t]*#\\+blog:\\s-+\\(true\\|yes\\)" nil t)
        t
      nil)))

;; 利用 ox-hugo 导出 org 文件为 Markdown

(defun export-org-file-to-md (file)
  "打开 FILE,保存后使用 ox-hugo 导出为 Markdown,然后关闭缓冲区,并返回生成的 Markdown 文件路径。"
  (with-current-buffer (find-file-noselect file)
    (save-buffer)
    ;; 这里调用同步导出,不使用异步模式
    (let ((exported-file (org-hugo-export-to-md nil nil nil)))
      (message "Exported MD file: %s" exported-file)
      (kill-buffer)
      exported-file)))

;; 遍历目录下所有 Org 文件,并对包含博客标记的文件进行导出
(defun process-directory (dir)
  "递归遍历目录 DIR 下所有扩展名为 .org 的文件,遇到含博客标记的文件则导出为 Markdown。"
  (let ((files (directory-files-recursively dir "\\.org$")))
    (dolist (file files)
      (when (has-blog-marker-p file)
        (message "Exporting %s" file)
        (export-org-file-to-md file)))))

;; 脚本入口:从命令行参数中获取仓库目录
(let ((target-dir (or (car command-line-args-left)
                      (read-directory-name "请输入仓库目录: "))))
  (process-directory target-dir))

保存为export-blog.el 然后就可以使用这个脚本将仓库目录下的文件自动转换为md格式了。

emacs --batch -l export-blog.el <org-repo>

emacs 也可以成为构建过程中的一部分了。

目前的问题

每次org变更都会触发blog构建,其实没有必要,可以优化一下检查范围限定在commit的文件中。 可以按照修改更新了