blog-from-org
Contents
从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的文件中。
可以按照修改更新了