はじめに
.org ファイルを HTML ファイルにエクスポートしたりする時に、#+TITLE: ...
や #+TOC: ...
みたいな記述をすると、エクスポートされる HTML のファイルのタイトルを設定できたり、目次を挿入できたりする機能があります。
Jekyll の Markdown ファイルの Front Matter みたいな感じで、この機能を使って自分で勝手に作ったキーワードで、エクスポート時の挙動をカスタマイズできたりすると良いなと思い、ox.el
を中心にソースを読みました。読んだ結果、キーワードの取り出し方がわかったので備忘録として記事にしておきます。
#+KEYWORD:
#+
から始まる文字列は、ソースを読む限りキーワードと命名されているっぽいです。なので、読み方わかってませんでしたが、#+TITLE:
はタイトルキーワードと読めばいいんですね。余談でした。
org-element
ox.el
のソースを読んでいたら、org-element.el
の機能を使っている箇所が多々あり、キーワードを処理している部分も org-element.el
にあるっぽい感じでした。
org-element.el
は Org モードのパーサらしくて、Org 文書をパースするコマンドの他、Org Element API という形でバース後のオブジェクトの操作をいろいろ提供しているようです。(とは言え、パースされてできるオブジェクトはS式なので、なんとでも触れる)
ググったらドキュメントも見つかりました。
Org モードでいろんなことができるようになりそうなので、これは覚えておこうと思いました。
自分で適当に作ったキーワードの値を取りだす
下記のような感じの .org ファイル( /tmp/test.org
)があったとします。
#+TITLE: Org モードの #+ から始まるキーワードの値の取り出し方
#+MYKEYWORD: 私のキーワード
* 私のキーワードのテスト
取れるかな?
以下のようなコードを書くと、("私のキーワード")
という値が取得できます。
(with-current-buffer (find-file-noselect "/tmp/test.org")
(org-element-map (org-element-parse-buffer) 'keyword
(lambda (kwd)
(when (equal (org-element-property :key kwd) "MYKEYWORD")
(org-element-property :value kwd)))))
まとめ
この仕組みを使えば、Front Matter 的なことは実現できそうです。
副産物として org-element
というパッケージの存在を知れたのですが、こちらの方が実りがあった気がします。
Org モードの AST(S式)と AST の操作ができるようになるので、Emacs と真面目に付き合うなら色々捗りそうです。
以上。