在ReStructuredText中解析替代项

7 投票
3 回答
646 浏览
提问于 2025-04-17 18:30

我想处理下面这段重构文本,它包含一个替换定义

text = """

|python|

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

然后把这些定义解析出来,让替换的文本显示出来:

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

"""

请问在docutils或者其他模块里,有没有什么函数或者工具可以做到这一点?

3 个回答

1

我不太确定我完全理解这个问题,不过我试着用列表推导式来提取数据:

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

如果你预期会有多个子定义出现,那你需要添加一些逻辑来处理这种情况。

1

看看这个 Docutils黑客指南。里面讲解了docutils是怎么工作的。

你可以尝试对解析输入文件生成的节点树应用一个合适的 Transform。在应用这个转换后,你需要使用一个 Writer 对象来重新输出ReStructuredText。不过,这个写入器现在还不存在,所以你需要先创建它。

2

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">

默认情况下,publish_string 使用的是 pseudoxml 写入器,你可以在输出中看到这一点。不过,如果你真的想要从你的问题中得到纯文本输出,你需要创建一个自定义的写入器类,这个类要从 docutils.writers.Writer 继承。我不太确定怎么实现这个,或许 SphinxTextWriter 可以作为一个起点。

看起来如果你只是需要简单的替换,直接在你的文本上使用 replace 会是一个更简单的解决方案。如果你需要更复杂的功能,使用 docutils 来实现会比较复杂。

撰写回答