hugoとorg-modeの融合(URLの変更)
記事のURLは、デフォルトではファイル名となる。
この場合、
├── content
│ └── posts
│ ├── 日本語.org
日本語.org のurlは
https://my.blog.site/posts/日本語/
となる。
ファイル名がそのままurlになると、urlとしての見栄えがあまりよくないように思うので、もうちょっと淡白なタイムスタンプになるようにしたい。
同じようなことを考える方が他にもいらしたので、そちらを参考にさせていただくことにする。
https://qiita.com/minoruGH/items/b01deb41952dc5d2bc35
ファイル名を工夫する
ファイル名を、作成日と概要のセットにすることで、整理しやすくする。
201907281906.概要説明.org
とすれば、これだけで扱いやすくなるだろう。
ただ、ファイルを作成するときに手でこのように入力するのは馬鹿げているので、新しい記事を作成する関数を作ることにする。 easy-hugo の easy-hugo-newpost 関数を参考に、このようにしてみた。
(defun my/easy-hugo-newpost (post-file)
"easy-hugo-newpost customized version."
(interactive (list (read-from-minibuffer
"Filename: "
`(,easy-hugo-default-ext . 1) nil nil nil)))
(let* ((slug (format-time-string "%Y%m%d%H%M"))
(new-post-file (concat slug "." post-file)))
(easy-hugo-with-env
(let ((filename (expand-file-name new-post-file easy-hugo-postdir)))
(when (file-exists-p (file-truename filename))
(error "%s already exists!" filename))
(find-file filename)
(insert (my/easy-hugo--org-headers (file-name-base post-file) slug))
(goto-char (point-max))
(save-buffer)))))
新規記事を作成するのに、hugo new コマンドは使用しないようにしている。 というのも、コマンドだとfront matterを archetypes/default.md を使って作ってしまうためである。 ここでは、front matterはorg-mode形式で、かつ後述の細工を施したいため、 ファイルをelispで作成し、生成したfront matterをファイルの先頭に挿入している。
urlをタイムスタンプにする
記事のファイル名が、例えば 201907281906.概要説明.org の場合、urlは https://my.blog.site/posts/201907281906.概要説明/ となってしまうのは前述の通りである。
ファイル名につけたタイムスタンプだけにしたいため、front matterの slug オプションを用いる。
#+slug: 201907281906
このようにしておくと、urlは https://my.blog.site/posts/201907281906/ となる。
slug オプションをつけるために、front matterは作成時に関数で生成するようにしている。
(defun my/easy-hugo--org-headers (file slug)
"Return a draft org mode header string for a new article as FILE."
(let ((datetimezone
(concat
(format-time-string "%Y-%m-%dT%T")
(easy-hugo--orgtime-format (format-time-string "%z")))))
(concat
"#+TITLE: " file
"\n#+DATE: " datetimezone
"\n#+PUBLISHDATE: " datetimezone
"\n#+categories: uncategorized"
"\n#+DRAFT: nil"
"\n#+TAGS: nil"
"\n#+author: tounosumura302"
"\n#+slug: "
slug
"\n\n")))