目录下 org 文件自动导出成 hugo md 文件
Contents
Intro
目前在从 org 使用 ox-hugo 导出成 hugo 的 blog 时,只能手动的执行 C-c C-e
, 然后选择导出成 Hugo 形式的 markdown. 如果原始的 org 文件进行了修改,就需要每次自己手动去进行导出,有一些不方便,所以我想写一个函数,来直接将指定目录下,所有已经导出过 hugo blog 的 org 文件,全部重新导出,这样只要定期执行这个命令,就可以保证文件在修改后能够被更新地导出到 hugo blogs. 目前的实现代码如下:
;; 检测文件是否已经被导出 hugo
(defun lxs-org-is-hugo-file-p (fPath)
"Predict if the org file has been converted into hugo"
(with-temp-buffer
(let ((keyline "#+HUGO_DRAFT: false\n"))
(insert-file-contents fPath)
(and (search-forward keyline nil t) t)
)
))
(defun lxs-list-org-in-directory (dPath)
"list org files under a directory path"
(directory-files-recursively dPath "\.org$")
)
(defun my--export-to-hugo (dPath)
"Convert org files under a directory path into hugo .md files"
(mapc
(lambda (file-name)
(progn
(if (lxs-org-is-hugo-file-p file-name)
(with-current-buffer (find-file-noselect file-name)
(org-hugo-export-wim-to-md)
))
))
(lxs-list-org-in-directory dPath)
)
(message "export to hugo md file end!"))
(defun my--choose-directory ()
"Return a directory chosen by the user. The user will be prompted
to choose a directory"
(let* ((ivy-read-prompt "Choose directory: ")
(counsel--find-file-predicate #'file-directory-p)
(selected-directory
(ivy-read
ivy-read-prompt
#'read-file-name-internal
:matcher #'counsel--find-file-matcher)))
selected-directory))
(defun lxs-export-org-to-hugo ()
(interactive)
(let ((directory (my--choose-directory)))
(my--export-to-hugo directory)))
Outro
- 如果只针对单个 org 文件,也可以不用
C-c C-e
命令来选择导出成什么形式,直接执行org-hugo-export-wim-to-md
即可 - TODO: 自动加入 Hugo 的 header lines, 一旦希望这个 org 文件被导出成 hugo blogs, 就插入 hugo 的头文件信息到 org 文件中
- TODO: 自动部署到 github pages 上,现在还需要手动再执行部署的脚本,这一步也可以集成到一起,实现从一个 org 文件到网页 blog 的流程
Author Li Xunsong
LastMod 2021-04-10