niszetの日記

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

(Pandoc)BulletListの探索順序(メモ)

Lua filter特有かもしれないが…

Lua filterでBulletListの処理順序を確認するために、下記のようなコードを書いた。

function BulletList(el)
  print(pandoc.utils.stringify(el))
end

子要素が全部潰されて1つの文字列になってしまうが、そこは目をつぶるとして、これでどの順に処理されているか確認できる。

調査対象はこんな感じとした。

- para1
  - para1.1
    - para1.1.1
  - para1.2
    - para1.2.1
      - para1.2.1.1
- para2
  - para2.2
    - para2.2.1
      - para2.2.1.1

実行結果は下記のとおり

para1.1.1
para1.2.1.1
para1.2.1para1.2.1.1
para1.1para1.1.1para1.2para1.2.1para1.2.1.1
para2.2.1.1
para2.2.1para2.2.1.1
para2.2para2.2.1para2.2.1.1
para1para1.1para1.1.1para1.2para1.2.1para1.2.1.1para2para2.2para2.2.1para2.2.1.1

ASTはこんな感じ。

[BulletList
 [[Plain [Str "para1"]
  ,BulletList
   [[Plain [Str "para1.1"]
    ,BulletList
     [[Plain [Str "para1.1.1"]]]]
   ,[Plain [Str "para1.2"]
    ,BulletList
     [[Plain [Str "para1.2.1"]
      ,BulletList
       [[Plain [Str "para1.2.1.1"]]]]]]]]
 ,[Plain [Str "para2"]
  ,BulletList
   [[Plain [Str "para2.2"]
    ,BulletList
     [[Plain [Str "para2.2.1"]
      ,BulletList
       [[Plain [Str "para2.2.1.1"]]]]]]]]]]

とりあえず一番手前の要素の一番下まで潜っていって、横方向に順次見ていくような挙動ですね。この探索順序は一般的になんて呼ばれているのだろう(不勉強)

BulletListのタグはリストの最初の要素の手前にあるので、同階層で複数要素があっても対応するprintは1回だけです(para1.1とpara1.2は同階層だが、para1.1が先頭の表示が対応するBulletList)

フィルタを書くときは処理順に気をつけないといけないので、参考程度にメモです。

なお、バージョン依存があるかもしれません。今回は 2.10.1 を使用しています。