7

我想采用以下包含替换定义的重组文本片段:

text = """

|python|

.. |python| image:: python.jpg
"""

并解析定义,以便显示替换文本:

resolved_text = """
.. image:: python.jpg

"""

docutils 或其他模块中是否有可以执行此操作的功能或实用程序?

4

3 回答 3

2

docutils提供发布者函数以将 docutils 用作库。

因此 usingdocutils.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 实现这个也很复杂。

于 2013-03-18T16:36:20.920 回答
1

查看Docutils 黑客指南。它解释了 docutils 是如何工作的。

Transform您可能会通过对通过解析输入文件生成的节点树应用适当的来逃避。应用转换后,您应该使用Writer对象再次输出 ReStructuredText。这个作家还不存在,所以你必须先创建它。

于 2013-03-12T22:51:40.060 回答
1

不确定我是否完全理解这个问题,但这里是使用列表理解进行提取的一个尝试:

extracted_line = [x for x in text.split("\n") if x[:2] == ".."][0]
resolved_text = """{}""".format(extracted_line.replace("|python|",""))

如果预期不止一次出现 sub def,则需要添加一些逻辑。

于 2013-03-15T05:15:36.050 回答