Pandoc:用于修改定义列表术语的Python过滤器

时间:2016-01-25 20:07:33

标签: python json pandoc

我正在寻找一些帮助来调整Pandoc过滤器(用Python编写)来修改Markdown输出。

我最近帮助解决了类似的问题(Pandoc: HTML-to-Markdown--can I replace elements using templates or scripts),但是我在修改这个新过滤器时遇到了错误。

我正在将HTML转换为Markdown(严格),我希望定义列表中的术语是粗体,所以我想我可以从pandocfilters开始deflists.py

这是deflists.py:

from pandocfilters import toJSONFilter, BulletList, Para, Strong

def deflists(key, value, format, meta):
    if key == 'DefinitionList':
        return BulletList([tobullet(t, d) for [t, d] in value])

def tobullet(term, defs):
    return([Para([Strong(term)])] + [b for d in defs for b in d])

if __name__ == "__main__":
    toJSONFilter(deflists)

我想替换DefinitionList,例如(来自AST),

DefinitionList
[([Str "TERM",Space,Str "1"],
  [[Plain [Str "DEFN",Space,Str "1"]]])
,([Str "TERM",Space,Str "2"],
  [[Plain [Str "DEFN",Space,Str "2"]]])]

这样定义术语就像[Strong[Str "TERM",Space,Str "1"]]

这是我到目前为止所尝试的内容:

from pandocfilters import toJSONFilter, DefinitionList, Para, Strong

def dlterm_strong(key, value, format, meta):
    if key == 'DefinitionList':
        return DefinitionList([todlist(t, d) for [t, d] in value])

def todlist(term, defs):
    #return([Para([Strong(term)])] + [b for d in defs for b in d])
    #return(([Str(Strong(term))],[[Para [b for d in defs for b in d]]]))
    return(([Str(Strong(term))],[[b for d in defs for b in d]]))

if __name__ == "__main__":
    toJSONFilter(dlterm_strong)

我得到的错误与Pandoc预期[a]和看到对象等有关。

我的Python,JSON和Pandoc知识目前非常肤浅,所以任何有关我接下来可以尝试的内容的建议或建议都会受到赞赏。

非常感谢。

1 个答案:

答案 0 :(得分:1)

不确定回答我自己的问题是否合适,但经过一些试验和错误以及更多时间使用Pandoc文档,我设法让过滤器正常工作:

from pandocfilters import toJSONFilter, DefinitionList, Para, Strong, Plain

def dlterm_strong(key, value, format, meta):
    if key == 'DefinitionList':
        return DefinitionList([todlist(t, d) for [t, d] in value])

def todlist(term, defs):
    return(([Strong(term)], defs))

if __name__ == "__main__":
    toJSONFilter(dlterm_strong)