2017-10-31 12 views
2

Pandocバージョン2.0以降、Lua Filtersを書き込むことができました。しかし、Pandoc 2.0では、要素表のLuaのpairsを使用しても、表のすべてのキーが表示されるわけではありません。Pandoc Luaフィルタ:ペアにテーブルのすべてのキーが表示されない

この点を説明するための最小限の例を示します。 filter.luaでは私が持っている:

function Para(elem) 
    io.stderr:write("A: " .. type(elem) .. "\n") 
    for k, v in pairs(elem) do 
    io.stderr:write("B: " .. k .. "\n") 
    end 
    io.stderr:write("C: " .. elem["t"] .. "\n") 
    io.stderr:write("D: " .. tostring(elem["c"]) .. "\n") 
    -- Return elem unchanged 
    return nil 
end 

さて、コマンドラインから、私が実行します。

echo "Hello." | pandoc -f markdown -t native --lua-filter filter.lua 

これは出力を生成します。

A: table 
B: c 
C: Para 
D: table: 0x53adb40 
[Para [Str "Hello."]] 

ように、私は-t json-t nativeを変更することができます最後の行は次のようになります。

{"blocks":[{"t":"Para","c":[{"t":"Str","c":"Hello."}]}],"pandoc-api-version":[1,17,2],"meta":{}} 

したがって、(B)の出力からelemの唯一の鍵はcですが、(C)tも鍵であることは明らかです。Paraを入手できます。ここで何が起きているのですか。t鍵がループから隠されているのはなぜですか?pairs

+0

ここで答えが無ければ、おそらくpandoc-discussに聞いてください... – mb21

答えて

2

tの値は要素のメタテーブルに隠されています。tの値を各要素に代入するのではなく、各要素のメタテーブルを設定します。これは、ユーザビリティとパフォーマンスのバランスをとるためです。

数値テーブルインデックスをHaskellに戻すのは、文字列インデックス値にアクセスするよりもかなり速いです。しかし、ユーザは、直感的なオブジェクト指向の方法で要素を使用し、可読な文字列属性を介して要素コンポーネントにアクセスすることができます。これが、各要素にメタテーブルを割り当てる理由です。メタデータには要素タイプに関する情報(PlainとParaなど)が含まれ、アクセサーが定義されています(contentはPlain要素とPara要素で0をインデックスするエイリアスです)。

elem.tを呼び出してelemという要素の型を取得できますが、要素自体にはそのキーがないため、metatableはその型を持ちません。だからtは、pairsを使って要素を反復処理すると表示されません。 getmetatable関数を使用して、metatableを受け取ることができます。

アクセサーの名前を知るには次の方法があります(文書化されておらず、変更される可能性があります)。

for k, _ in pairs(getmetatable(elem).getters) do 
    print k 
end 

また、LUAフィルタドキュメントの「モジュールpandoc」のセクションでは、各要素タイプのアクセッサを示しています。

関連する問題