そもそも始めに全ての記法を含んだファイルがあればよいと思うのよね…
ということで、以前宣言だけしていたコレをやっていきます。
PandocのPATHが通っている場所で(あるいはPandocの絶対パスを指定して)下記のように実行してみます。
pandoc.exe --from markdown hoge.md --to native --output hoge.ast
ここで、入力ファイルhoge.mdは下記のように書いたものを使用します。ここでは見てもわかりませんが、line2の後ろには半角スペースが2つ入っています(改行)。line3のバックスラッシュ()の直後で改行する方法も変換後に改行となる記法ですね。
# Header1
line1
line2
line3\
line4
line5
生成された、hoge.astは下記のようになります。
[Header 1 ("header1",[],[]) [Str "Header1"] ,Para [Str "line1",SoftBreak,Str "line2",LineBreak,Str "line3",LineBreak,Str "line4"] ,Para [Str "line5"]]
パッと見、記号の意味は分かりづらいですが、対応関係から少し読み解けますね。#
の行はHeader 1
に変換され、そのあとの文字列Header1
がStr型で含まれているように見えます。
次の行はPara
となっており、パラグラフ(段落)として扱われていますね。ここで、line1とline2の間はMarkdown中で単純に改行しただけ(変換後に改行にならない記法)でしたが、間にSoftBreak
というものが入っています。これの挙動をLineBreak
と同じにすればMarkdown中の単純な改行も変換後に改行に出来そうだなー…とか見えてきます。
lin4とline5の間には空行が入っているため、別の段落として扱われていることがわかりますね。
と、こういった形で--to native
を指定することでPandocが内部的にどのようにデータを保持しているのか?がわかります。本当?はReaderやWriterを理解してく方が良いのですが、実装が変わることがあるので、まずはデータ構造を把握した方が良いかなと思っています(処理が変わってもデータ構造は大きくは変わらないため)
このあたりの知識は自作のフィルタを作ろうと思ったときに役に立つのかなと思います。日本語の資料だとこのあたりですね。
Pandocチュートリアル 第2回 HaskellでPandocフィルタを実装しよう
来年はこの辺りから順次やっていきます。
Enjoy!!..