在ReStructuredText中解析替代项
我想处理下面这段重构文本,它包含一个替换定义:
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
继承。我不太确定怎么实现这个,或许 Sphinx
的 TextWriter 可以作为一个起点。
看起来如果你只是需要简单的替换,直接在你的文本上使用 replace
会是一个更简单的解决方案。如果你需要更复杂的功能,使用 docutils 来实现会比较复杂。