Blogger の HTML 編集はとてもブラウザ上では厳しいので、Emacs 上で編集するための 仕組みを考えた。Emacs に付属の org-mode はアウトライン記述したテキストデータから HTML を出力する機能を備えているのでこれを利用する。
*.org のようなファイルに適当に文章を書いて、C-c C-e を実行すると他のテキスト形式 に変換することができる。例えば b を押すと HTML に変換されたテキストがブラウザ上 にプレビューされる。
ただし、このままでは目次や著者情報がそのまま表示されてしまうので、 以下の設定をテキストにあらかじめ記述しておく。
#+TITLE: org-mode で blog 編集 #+OPTIONS: title:nil toc:nil \n:nil num:nil author:nil creator:nil f:nil #+TAGS: Emacs
最後の f:nil はテキスト中の数字を含むブラケット([])が footnote として 解釈されてしまうことを防ぐために指定している。 例えば配列のインデックスを書いたつもりで proc[1] と書いても [1] が footnote として解釈されてしまう。 (実はこの方法がわからず解決までかなり時間がかかってしまった、というのは内緒。 Emacs のディレクトリにある lisp/org/org-ext.el の org-export-with-footnotes というカスタム変数の定義にあるコメントを偶然見つけて気づいた・・・。)
以下に示すように、HTML への変換から Blogger に張り付ける部分のコピーまでを 自動的に行うための Emacs Lisp を書いた。
;; コードブロックをモードと同じ色でハイライト (setq org-src-fontify-natively t) ;; "*" の h4 にする(Blogger の設定の都合) (setq org-export-html-toplevel-hlevel 4) (require 'noflet) (require 'smartparens) (defun export-html () "Publish HTML file and copy it into clipboard." (interactive) (let ((buf (buffer-name))) ;; org-export の中で read-char-exclusive が ?H を返すように一時的に動的束縛 ;; 新規ウィンドウが作成されないように switch-to-buffer-other-window を動的束縛 (noflet ((read-char-exclusive () ?H) (switch-to-buffer-other-window (arg) (switch-to-buffer arg))) (org-export)) (switch-to-buffer buf)) ;; *Org HTML Export* バッファから Blogger に張る部分の HTML をコピーする ;; HTML のパースには smartparens を使用 (with-current-buffer "*Org HTML Export*" (search-forward "<div id=\"content\">") (search-backward "<") (sp-kill-sexp nil 'yank))) ;; 適当なキーに割り当てる (org-defkey org-mode-map "\C-ce" 'export-html))
まあ、この方法でも先頭に <h1 class="title"> タグが挿入されてしまうのだけれど、 タイトル欄にカット & ペーストするためにそのままでもよいかなと思っている。 一度タイトル欄に入力した後は、微修正のために毎回 publish する度に、 手作業で削除する羽目になるのだけれど。
一応、先日の howm と org-mode の連携方法を利用して Emacs 上でブログの執筆から 管理までを行えるようになった。howm 化することで一覧表示や検索が容易になるのが うれしい。
0 件のコメント:
コメントを投稿