niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(Pandoc) Pandoc ASTを出力して中身を確認していく(1回目)

そもそも始めに全ての記法を含んだファイルがあればよいと思うのよね…

ということで、以前宣言だけしていたコレをやっていきます。

niszet.hatenablog.com

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!!..