Hakyllで日本語文中の余分な空白を削除する

Posted: 2016-09-18

静的サイト作成ツールHakyllで日本語を含むページを作成したとき、以下の図の反転部分のように余分な空白が入ってしまうことがあります。

Hakyllによって生成された、余分な空白を含むページ

これは内部で動いているPandocが、Markdownファイルに含まれている改行文字を空白文字に変換するために起こります。

---
title: Test
date: 2016-02-27
---
Pandoc converts newline characters in a
sentence into whitespaces.
したがって日本語の文章の途中で
改行すると、不自然な空白が挿入されてしまいます。

このような挙動を望まないユーザーのために1.16.0.1からeast_asian_line_breaksという拡張が加えられています。以下でその使い方を説明します。

まず上記の拡張を使うため<project_name>.cabalで使用するpandocのバージョンが1.16.0.1以降になるようにしてください。また以下で示すコードにおいて集合の演算を使うため、それをそのまま使う場合は<project_name>.cabalの依存関係にcontainersも追加してください。

依存関係の設定が終わったら、以下のようにsite.hsを変更します。

import qualified Data.Set as S
import Text.Pandoc.Options (Extension(Ext_east_asian_line_breaks), readerExtensions)
-- omission --
customPandocCompiler =
    let
        defaultExtensions = readerExtensions defaultHakyllReaderOptions
        newExtensions = S.insert Ext_east_asian_line_breaks defaultExtensions
        readerOptions = defaultHakyllReaderOptions { readerExtensions = newExtensions }
    in
        pandocCompilerWith readerOptions defaultHakyllWriterOptions

今回追加するExt_east_asian_line_breakswriterExtensionsではなくreaderExtensionsに追加するようです。その後、このcustomPandocCompilerpandocCompilerを置き換え、stack buildしてください。

最後にexec site clean, stack exec site watchで出来上がりを確認して終わりです。

Hakyllによって生成された、余分な空白を含まないページ