我想采用以下包含substitution definition的重组文本代码段:
text = """
|python|
.. |python| image:: python.jpg
"""
解析定义,以便显示替换文本:
resolved_text = """
.. image:: python.jpg
"""
在docutils或其他模块中是否有可以执行此操作的函数或实用程序?
答案 0 :(得分:2)
docutils
提供publisher functions将docutils用作库。
因此,使用docutils.core.publish_string
可能是您的用例的选项。
In [90]: from docutils import core
In [91]: text = '|python|\n\n.. |python| image:: python.jpg\n'
In [92]: print core.publish_string(text)
<document source="<string>">
<paragraph>
<image alt="python" uri="python.jpg">
<substitution_definition names="python">
<image alt="python" uri="python.jpg">
默认情况下,puplish_string
使用pseudoxml
编写器,您可以在输出中看到它。
但是,如果您确实希望从问题中获得纯文本输出,则需要一个派生自docutils.writers.Writer
的自定义编写器类。
我不确定如何实现这一点,也许Sphinx
TextWriter可能是一个起点。
似乎如果你真的只需要简单替换,在你的文本上使用replace
将是一个更简单的解决方案,如果你需要更复杂的东西,使用docutils实现它也很复杂。
答案 1 :(得分:1)
查看Docutils Hacker's Guide。它解释了docutils的工作原理。
您可以通过解析输入文件生成的节点树应用适当的Transform
。应用转换后,您应该使用Writer
对象再次输出ReStructuredText。这位作者还不存在,所以你必须先创建它。
答案 2 :(得分:1)
不确定我是否完全理解这个问题,但这里是使用列表理解进行提取的一个例子:
extracted_line = [x for x in text.split("\n") if x[:2] == ".."][0]
resolved_text = """{}""".format(extracted_line.replace("|python|",""))
如果预期会出现多次sub def,则需要添加一些逻辑。