最近, org-mode というEmacsで使えるMarkdownの超すごいバージョンみたいなのを使い始めました.

このorg-modeには,プレインテキストをHTMLやLaTeXなど,様々な形式に変換する機能があります.さらには,org2blog.elという拡張を入れることで,org-modeで書いたものをそのままブログへ投稿することも可能です.すごい.

ただ,少し気になったところとして,変換されるHTMLをそのままブラウザで見るとなにかがおかしい.たとえば,以下のようにorg-modeで書いたとします.

吾輩は
猫である

これをHTMLに変換すると,

<p>
    吾輩は
    猫である
</p>

になります.これをブラウザで見た場合,「吾輩は」と「猫である」の間に半角スペースが入ってしまいます.英語の場合はこの動作でいいのですが日本語の場合はここには半角スペースを入れてほしくありません.これはorg-modeが悪いわけではありません.Markdownとかでも同様の問題が起こります.(こちらのページを見る限りでは,ブラウザが悪いそうです.確かにLaTeXみたいに改行無視してくれたらいいのに・・・)

以下のページでは,この問題に対して,1文ごとに改行するという方法が提案されています.(ここで述べられているfill-paragraphは僕もよく使います.)

しかし,HTMLの仕様のせいでorg-modeでの書き方が制限されるのはなんか嫌だ.そこで,以下のようなものを書いてみました.

;; HTML出力時,無駄なスペースを削除
;; jhtml-filter.plを利用 https://github.com/fjyuu/jhtml-filter
(when (executable-find "jhtml-filter.pl")
  (defun my/org-export-jhtml-filter ()
    "A filter which removes spaces between japanese characters"
    (let ((filtered-html nil)
          (tempfile (make-temp-name
                     (expand-file-name "jhtml-filter"
                                       temporary-file-directory))))
      (write-region (point-min) (point-max) tempfile nil 'nomsg)
      (setq filtered-html (shell-command-to-string
                           (concat "jhtml-filter.pl -e utf8 " tempfile)))
      (delete-region (point-min) (point-max))
      (insert filtered-html)))
  (add-hook 'org-export-html-final-hook 'my/org-export-jhtml-filter))

Elispはコピペしかしたことないので,なんかマズイかもしれませんが,一応これでHTML出力時の余分な改行は削除できました.Elispで全部やるのがカッコイイと思いますが,それは(実力的に)無理だったので,自作のjhtml-filter.plというのを使っています.

この設定を書いておくと,先ほどのorg-modeのテキストは,

<p>
    吾輩は猫である
</p>

に変換されて,余分なスペースが消えます.

追記(2013.10.2.)

org-mode version 8.xでは,上記のElispが動きません.以下に書きかえてください.

(when (executable-find "jhtml-filter.pl")
    (defun my/org-export-jhtml-filter (string backend info)
      "A filter which removes spaces between japanese characters"
      (if (org-export-derived-backend-p backend 'html)
          (let ((filtered-html nil)
                (tempfile (make-temp-name
                           (expand-file-name "jhtml-filter"
                                             temporary-file-directory))))
            (write-region string nil tempfile nil 'nomsg)
            (shell-command-to-string
             (concat "jhtml-filter.pl -e utf8 " tempfile)))))
    (eval-after-load 'ox-html
      '(add-to-list 'org-export-filter-final-output-functions
                    'my/org-export-jhtml-filter)))