niszetの日記

細かい情報を載せていくブログ

(Pandoc) east_asian_line_breaksの実装を読む

Haskell自体を理解していく…。

当たり前かもですが、Pandocの各オプションに対して対応する関数が存在します。そのため、各オプションに対応する関数を少しずつ読むことでHaskellとかPandocの理解が深まるのでは?ということでやっていく。今回はeast_asian_line_breaksオプションに関連する箇所。

コードはこんな感じ。

-- | Remove soft breaks between East Asian characters.
eastAsianLineBreakFilter :: Pandoc -> Pandoc
eastAsianLineBreakFilter = bottomUp go
  where go (x:SoftBreak:y:zs) =
         case (stringify x, stringify y) of
               (xs@(_:_), c:_)
                 | charWidth (last xs) == 2 && charWidth c == 2 -> x:y:zs
               _ -> x:SoftBreak:y:zs
        go xs = xs

コード自体はここから追っても良いかも。 https://hackage.haskell.org/package/pandoc-2.7.2/docs/Text-Pandoc-Shared.html

SoftBreak前後にある要素に対して、文字として扱ったときにcharWidthがともに2となる場合にSoftBreakを削除するような挙動をしている。

…っぽいことはわかるのですが、bottomUpがどこから来ているのか、とかwhere以降をちゃんと読み解けているのか?などは疑問…。

stringifyで文字列化したあとに、xsの末尾とcがcharWidth==2を満たしているかどうかを見ているのはわかるぽいのだけど、なぜxsをas構文で:の形にしないといけないのか?とかが良くわかっていない。Stringじゃなくて明示的に[Char]として扱うためかな…?

みたいなレベルなので、もうちょっと基礎的なところもあわせて勉強していこう…。