マイルストーンを見ていると、進捗が可視化されますね。
前も書いたかもしれないですが、こんなところにマイルストーンが。
今日の時点で8個close、4個openで、そろそろ2.7.4かなぁ?
…と思ったんですが、このマイルストーン機能、別に普段から使われているわけではなさそうで、ここだけ見ていればリリースのタイミングを予想できるって感じではなさそうですね…。
まぁ8月には更新入るんかなぁ…。
このIssue、現時点でopenなのですが、初見だとなかなか面白い挙動なので見ておくと良いです。
これを、以下のようにplain2をつくって渡してあげるとmb1とmb2は同じになります。1度でも参照してしまうとダメぽい。
local plain = {pandoc.Plain("test")} local plain2 = {pandoc.Plain("test")} local mb1 = pandoc.MetaBlocks(plain) local mb2 = pandoc.MetaBlocks(plain2)
下記のようにしてあげればいいわけですが、これは書き方の例としてどこかにあった方が良い気はしますね…
function Pandoc (doc) doc.meta.b1 = doc.blocks doc.meta.b2 = doc.blocks return doc end
MetaBlockはBlockと基本的に同じ挙動のはずなので、これ以外は特に変なものはない…と思うけど。
Issueを読むと、こういう使い方をする人がいるんだなぁと学びがありますねぇ…。
このIssueを見ていて気付いた。
これでMeta関係の調査がはかどります(大体終わってしまったけど)
具体例がなかったので。
たとえば、以下のように入力する 1。
echo A | pandoc -fmarkdown -tnative -s
と、以下のように出力される。echo A としているのは空だとエラーになってしまったため。
Pandoc (Meta {unMeta = fromList []}) [Para [Str "A"]]
Meta
情報が完全に空の場合はこのようになる。なぜunMeta
が出力される仕様なのかがわからないと言えばわからないが…。
複数行の入力をターミナルから直接行うのは大変なので、別途ファイルを作る。
--- title: aa --- # hoge fuga
これを同様に、以下のようにnative形式で表示する。
pandoc test.md -fmarkdown -tnative -s
すると、このように出力される。fromListの引数であるリスト内に、(Str, Meta [])
のような形で 2 書かれるようだ。インライン要素の集まりとして定義されている。
Pandoc (Meta {unMeta = fromList [("title",MetaInlines [Str "aa"])]}) [Header 1 ("hoge",[],[]) [Str "hoge"] ,Para [Str "fuga"]]
メタ部分を
--- title: aa bb author: - A - B ---
のように書き換えると次のようになる(メタ部分だけ抜粋)。
Pandoc (Meta {unMeta = fromList [("author",MetaList [MetaInlines [Str "A"],MetaInlines [Str "B"]]),("title",MetaInlines [Str "aa",Space,Str "bb"])]})
fromList
に含まれるのはタプルのリストのまま変わらず、複数の要素をリストで含む場合はMetaList
がそれぞれのMetaInlines []
のリストの形で持つようになっている。MetaブロックであってもSpaceは有効である。つまりStrで検索してもマッチしない場合は空白文字を含む可能性を考慮すべきである。
…という風に結構メタ部分は読むのが少し大変になっている。もっと複雑な構造もあるが、それはまた別途記事にまとめよう…。
この辺りの話。
pandoc.Secでアクセスしようとするとnilで怒られるので、うーん、困ったな、と。
Issueはこの辺りが関係してそうだったが、読んでも良くわからず。native形式で吐いてもSecとかでないしなぁ…
https://github.com/jgm/pandoc/pull/3712
と思ってコード読み漁っていましたが、hierarchicalizeでPandocのリポジトリを検索すると、特定のフォーマットのWriterにて使われていそうであることがわかった。
どうやら階層構造をドキュメント内で表現しておく必要がある場合に使われているようで、ちょっと特殊なことをしないとSecのオブジェクトをLuaの方で作るのは難しそうだ(テスト用のコードを見たらわかるようになったが)
ということで、これはいったん後回し。 他の要素を調べてから手を付ける。
当たり前かもですが、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]として扱うためかな…?
みたいなレベルなので、もうちょっと基礎的なところもあわせて勉強していこう…。