2017-11-17 15 views
1

私は、メタデータをそのままにして、文書の本文を変更するだけのLUAフィルタを適用しようとしています。それは私が思ったよりも難しいです。luaとwalk_blockのpandocフィルタ

フィルタは、ブロック要素と同様に、インライン要素にテキストを付加して追加する必要があります。インライン要素(Code)で機能する場合は、ブロック要素CodeBlockで失敗します。

function Pandoc(doc) 
    blocks = {} 
    for k,block in pairs(doc.blocks) do 
    table.insert(blocks, pandoc.walk_block(block, { 
     -- Doesn't work!? 
     CodeBlock = function(el) 
     return { 
      pandoc.Para({pandoc.Str("Before")}), 
      el, 
      pandoc.Para({pandoc.Str("After")})} 
     end, 
     -- Works! 
     Code = function(el) 
     return {pandoc.Str("Before"), el, pandoc.Str("After")} 
     end, 
    })) 
    end 

    return pandoc.Pandoc(blocks, doc.meta) 
end 

何が欠けていますか?乾杯、ここ

答えて

1

問題はそのwalk_blockwalk_inlineプロセスが要素ではなく、要素自体の内容です。

wrapperは、あなたのフィルタテーブルである場合、これはあなたが欲しいものを行う必要があります。

function Pandoc (doc) 
    local div = pandoc.Div(doc.blocks) 
    local blocks = pandoc.walk_block(div, wrapper).content 
    return pandoc.Pandoc(blocks, doc.meta) 
end 

そうのような代替ソリューションは、メタデータを保存し、復元するために、次のようになります。

local meta = {} 
return { 
    { Meta = function(m) meta = m; return {} end }, 
    wrapper, 
    { Meta = function(_) return meta; end }, 
} 

これはおそらくですメタデータとコード/ CodeBlock要素のみをシリアライズ/デシリアライズする方が、フルドキュメントでも同じ処理を行うよりも高速になる可能性があります。

+1

私は 'pandoc.Div'ソリューションに問題がありました。 manフィルタのソリューションは、魅力のように機能しますが。どうもありがとう! – greut

+1

残念ながら、 'div'の' .content'フィールドにアクセスしてブロックを戻すのを忘れてしまいました。最初の解決策は今でも機能するはずです。 – tarleb