PandocをライブラリAPIで呼び出す場合(Hakyllなど)に東アジアの文字列に余計な空白が入ってしまうことの解決策
問題
私はちょっと前から句読点の種類を「,.」から「、。」に切り替えています。
それで気がついたのですが、このサイトで読点を打った直後に改行すると余計な空白が入ります。
その問題の原因と解決策は知っていたはずです。
それは以下の記事を読むと分かり易いでしょう。
日本語Markdown文書をPandocする際に「余計な空白」をどうにかしたい - Qiita
私はこの問題に対処していると思っていました。
のような解決策ですね。
しかし動いてないので謎だなあと思って調べました。
とりあえずpandocのソースコードを見るとExt_east_asian_line_breaksを参照して動作を分岐しているのはこの一箇所だけのようです。
pandoc/App.hs at master · jgm/pandoc
(if extensionEnabled Ext_east_asian_line_breaks
       readerExts &&
    not (extensionEnabled Ext_east_asian_line_breaks
         (writerExtensions writerOptions) &&
         writerWrapText writerOptions == WrapPreserve)
    then (eastAsianLineBreakFilter :)
    else id) .
なるほどこの条件に従ってオプションを設定すれば良いのかな、
writerにも適当に設定してたのが悪いのかなあ?
とか色々探ってみましたけど、それは見当違いで、そもそもAppなのですからこれはコマンドラインからの呼び出しにしか反応しなくて、ライブラリとして使う時はExt_east_asian_line_breaksは一切使えないようです。
- east_asian_line_breaks Extension for Org-mode input · Issue #3703 · jgm/pandoc
- emphasize Ext_east_asian_line_breaks will not take effect when called as libraries by kaizhang91 · Pull Request #4674 · jgm/pandoc
According to #3703, Ext_east_asian_line_breaks will not take effect when readers/writers are called as libraries. And I think this is a nice solution for universal conversion with Ext_east_asian_line_breaks. However, I have spent hours to find out why my reader options don't take effect, until discover your discussion in #3703. So I think it would be great if we add some description about the limitation.
つまり先程上げた設定は全て無効です。
流石に動作確認を一切しないということは無いでしょうし、昔は動いていたのですかね?
何故ライブラリ層で無効な拡張が存在するのかこれが分からない。コマンドライン引数としてだけ存在していれば良いのでは…?
作者も取扱にちょっと悩んでいるようですね。
解決
サポートされてないならどうすれば良いかと言うと、コマンドラインから呼び出した時に適用されるフィルタをこちらでかけてやれば良いわけですね。
in pandocCompilerWithTransformM
   defaultHakyllReaderOptions
   { readerExtensions = extensions
   }
   defaultHakyllWriterOptions
   { writerHTMLMathMethod = MathJax ""
   , writerSectionDivs = True
   , writerExtensions = extensions
   , writerHighlightStyle = Nothing
   }
   (bottomUpM transform . eastAsianLineBreakFilter) -- 東アジアの文字列に余計な空白が入らないようにする
これは私のHakyllでの例になります。
 hatena-bookmark
hatena-bookmark