hugoとorg-modeの融合(URLの変更)

Page content

記事の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")))