2016-03-04 58 views
1

我使用Pandoc進行技術報告,並修改了Python pandocfilters包示例metavars.py以提供變量替換。 Markdown中的%{test}被替換爲YAML元數據中的值test。很棒!使用Pandoc的JSON AST在段落內插入表的正確語法是什麼?

它適用於單線和「塊」風格的YAML。

我想要做同樣的事情,而不是放在Markdown格式化表格中的文本塊中。這裏是我最小的測試文檔(example.md):

--- 
test: |- 
    | a | 
    |---| 
    | 1 | 
block: |- 
    This Markdown _formatted_ a block \ 
    of YAML \ 
    text. 
... 

After this paragraph you should see a block: 

%{block} 

After this paragraph you should see a table: 

%{test} 

你可以看到我在這個gist修改metavars.py

如果您註釋掉%{test}文字和運行它,你會看到正確的輸出:

$ pandoc -t json example.md | ./metavars.py | pandoc -f json -t plain 
After this paragraph you should see a block: 

This Markdown _formatted_ a block 
of YAML 
text. 

After this paragraph you should see a table: 

當我取消%{test}我結束了一個錯誤,沒有回溯:

$ pandoc -t json example.md | ./metavars.py | pandoc -f json -t plain 

test -> [[], [{u'c': [], u't': u'AlignDefault'}], [0.0], [[{u'c': 
[{u'c': u'a', u't': u'Str'}], u't': u'Plain'}]], [[[{u'c': 
[{u'c': u'1', u't': u'Str'}], u't': u'Plain'}]]]] 

pandoc: Error in $[3][0]: expected Object, encountered Array 

我被困在這裏!我的假設是我已經構建了一個無效的Pandoc AST的有效JSON文檔。我找不到關於Pandoc AST的文檔,並且當我比較生成的手動構建的Markdown轉換爲AST時,我看不到差異。

這就是我想要得到的結果:

$ pandoc -t json example.md | ./metavars.py | pandoc -f json -t plain 
After this paragraph you should see a block: 

This Markdown _formatted_ a block 
of YAML 
text. 

After this paragraph you should see a table: 

    a 
    --- 
    1 

我真的很接近,從一個diff基礎:

任何建議如何發出讓我的表插入Para?我希望我沒有陷入一種我無法做到的情況。

+0

Pandoc AST定義是在Haskell中編寫的(與所有的pandoc一樣)和[在它自己的版本庫中](https://github.com/jgm/pandoc-types/blob/master/Text/Pandoc/Definition.hs #L196)...從你的差異來看,問題顯而易見,對吧?你發出了一個'Para'而不是'Table' ..順便說一句,我想你會比使用過濾器更好地使用預處理器,請參閱[這篇博文](http://randomdeterminism.wordpress.com/2012/06/01/how-i-stopped-worring-and-started-using-markdown-like-tex/)。 – mb21

+0

我會研究使用預處理器。感謝您對源代碼的深入鏈接。是的,我看到差異。 :)如果有一個有效的語法來做我想從過濾器中得到的東西,那麼最好,因爲我已經有了一個過濾器。也許沒有。感謝您的幫助。 –

+0

你的評論讓我想到了......爲什麼不在段落中「向下看」,看它是否包含將被替換的嵌套元素?這裏有一個[metavars.py]的[更新版本](https://gist.github.com/bbbd7364ed7ea1f5f2a9),它符合我的意圖。感謝您的幫助@ mb21。 –

回答

0

至於靈感來自@ MB21的評論我的問題:

表元素是同行在AST para元素嵌套這樣一個段落內的表被禁止。解決這個問題的最好方法是在AST中將提升到一個水平。對於AST掃描中的每個Para元素,查看它是否包含一個嵌套元素,該嵌套元素包含一個將被表替換的變量(例如%{test})。如果是這樣,則用Table替換整個Para元素。

這是根據預期工作的更新版本metavars.py

再次......感謝@ mb21的幫助。