howm上のorg記法ではてなダイアリーへ投稿

とりあえず、howm上のorg記法ではてなダイアリーへアップロードまで出来る様になった*1ので、作業環境を移行させた。ここまでに使えるまでに行ったことを書いておく。

org-modeを8.0以降にする。

emacs24にインストールされているorg-modeは少し古く、ox-hatena.elはorg-mode ver8.0以上が必要なので、package.elでorg-mode最新版をインストールした。

ox-hatena.elのインストール

ox-hatena.el自身はgit-hubからダウンロードして、pathの通った所においた。この状態でexportを試してみると、理由はよくわからんがorg-with-silent-modificationsでエラーが出るので暫定回避した。メチャクチャな方法だけど、とりあえず動いたので先に進めた。

.emacsには下記を追加。

(require 'ox-hatena)

;; Bad Code.
(defun org-with-silent-modifications (x)
  x)
書籍・音楽・映画などの紹介リンクの出力

この日記本来の目的は、本やDVDの記録を取る事だったので、

asin:
isdn:

がそのまま出力される事は確認した。

実践 FreeBSD サーバ構築・運用ガイド

実践 FreeBSD サーバ構築・運用ガイド

howmのタイトル欄と日付の消去

howmのデフォルトだと

= ■ ←(タイトル欄)
[2002-09-16 20:08] >>> /home/hira/elisp/howm/howm-mode.el
↑(作成日 & その前に見てたファイル)

が先頭行にあるので、org-modeのexport前に削除する必要がある。

org-export-before-processing-hookがexport処理前に実行してくれるらしく、これが使えるとわかった。
今回は、単純にマッチした行を出力バッファ上で消してしまうことにした。*2

(defun my-headline-removal (backend)
  (interactive)
  (when (eq backend 'hatena)
	(goto-char (point-min))
	(while (re-search-forward "^=[^\t\n]*$\\|^\\[[0-9]+-[0-9]+-[0-9]+ ?.*\\].*$" nil t)
	  (goto-char (match-beginning 0))
	  (kill-whole-line)
	  (goto-char (point-at-bol)))))

(add-hook 'org-export-before-processing-hook 'my-headline-removal)

export先のパス指定

デフォルトだとexport先のパスがhowmファイルと同一のディレクトリになる。これだとhowmのファイル管理に邪魔となるので、出力先を変更する必要があった。
で、調べたけどorg-modeの標準的な方法がわからない。仕方が無いので、ox-hatena.el自体に手を入れた。

;(outfile (org-export-output-file-name extension subtreep))
 (outfile (org-export-output-file-name extension subtreep "~/tmp")) ;; modify

export完了後にはてなへアップロードする外部コマンドを実行する

全てemacsで完結させるつもりはないので、外部コマンドでアップロードさせる。いちいちターミナルでコマンド入力まではしたくない。
下記の関数で出力からアップロードコマンドまでを実行させた。

(defun my_upload_org ()
  (interactive)
  (org-export-dispatch)
  ;; 外部アップロードコマンド実行
  (let* ((outfile (org-export-output-file-name ".txt" nil "~/tmp")))
  (start-process-shell-command "my_upload_org" nil "アップロードする外部コマンド" (expand-file-name outfile))))

*1:不満、課題は残っているので、最悪の場合、元に戻すかもしれませんが。

*2:debugで止めたりしていると、元のバッファ(howmファイル)のヘッダが消えることがある。普段は大丈夫なのでこのままとするが、まずいことをしているのかもしれない。