如何在Python中编写这些Pandoc Haskell过滤器?

时间:2015-08-29 22:19:41

标签: python haskell pandoc

问题

我需要使用[pandocfilters]将这些Pandoc Haskell过滤器转换为Python。

user
#!/usr/bin/env runhaskell

import Text.Pandoc.JSON

main :: IO ()
main = toJSONFilter separator
  where separator (Para [Span ("",[],[]) [Str "___separator___"]])
          = RawBlock (Format "html") "<div class=\"separator\">***</div>"
        separator x = x

我希望它会是一般形式

#!/usr/bin/env runhaskel

import Text.Pandoc.JSON

main :: IO ()
main = toJSONFilter separator
  where separator (Para [Span ("",[],[]) [Str "___separator___"]])
          = (Para [Span ("",[],[]) [Str "***"]])
        separator x = x

如果有人知道如何添加&#34;居中&#34;格式化为docx格式的第二个过滤器。

背景

在LaTeX中,我有一个#!/usr/bin/env python from pandocfilters import toJSONFilter, Str def separator(key, value, format, meta): """Need to write this.""" pass if __name__ == '__main__': toJSONFilter(separator) 宏,它使三个居中\separator{}。当使用Pandoc处理html和docx时,我使用***的备用宏定义来创建文本\separator{}。然后我将___separator___替换为以新格式正常工作的内容。出于跨系统兼容性原因,我需要从Haskell切换到Python过滤器。

实施例

输入文件类似于

___separator___

没有过滤器的默认pandoc html输出

\documentclass{memoir}
\begin{document}
    \newcommand{\separator}{\_\_\_separator\_\_\_}

    First paragraph.

    \separator{}

    Second paragraph.
\end{document}

过滤时所需的html输出:

<p>First paragraph.</p>
<p><span>___separator___</span></p>
<p>Second paragraph.</p>

docx过滤器最好使用<p>First paragraph.</p> <div class="separator">***</div> <p>Second paragraph.</p> 生成一个居中的段落。

2 个答案:

答案 0 :(得分:3)

看看这个过滤器:

#!/usr/bin/env python

import sys

from pandocfilters import toJSONFilter, Str, Para

def sep(key, value, format, meta):
    if key == 'Para':
       sys.stderr.write("--- Found a Para with value: " + str(value) + "\n")
       if len(value) == 1:
           if value[0]['t'] == 'Str' and value[0]['c'] == '---separator---':
               return Para( [ Str("FOUND A SEPARATOR") ] )
    return None

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

给出此输入降价时:

This is a paragraph.

---separator---

This is another paragraph.

---separator---

它将通过pandoc --filter ... input.md -o output.html生成此输出HTML:

<p>This is a paragraph.</p>
<p>FOUND A SEPARATOR</p>
<p>This is another paragraph.</p>
<p>FOUND A SEPARATOR</p>

它还会向stderr打印Para节点的结构,以便您可以准确地看到它们的外观。

答案 1 :(得分:0)

对于LaTeX到HTML:

case

对于LaTeX到docx:

#!/usr/bin/env python

from pandocfilters import toJSONFilter, Str, Para, RawBlock

def separator(key, value, format, meta):
    if key == 'Para':
       if len(value) == 1:
           try:
               if value[0]['c'][1][0]['c'] == '___separator___':
                   return RawBlock('html', '<div class="separator">***</div>')
           except KeyError:
               return None
    return Nonepprint

if __name__ == '__main__':
    toJSONFilter(separator)

请注意,这并不是#!/usr/bin/env python from pandocfilters import toJSONFilter, Str, Para, RawBlock def separator(key, value, format, meta): if key == 'Para': if len(value) == 1: try: if value[0]['c'][1][0]['c'] == '___separator___': return Para([Str('***')]) except KeyError: return None return None if __name__ == '__main__': toJSONFilter(separator) 的中心,因为我似乎无法解决如何注入格式。