【问题标题】:Resolve Substitutions in RestructuredText解决 RestructuredText 中的替换问题
【发布时间】:2013-02-25 02:02:30
【问题描述】:

我想采用以下重组文本 sn-p 包含substitution definition

text = """

|python|

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

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

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

"""

docutils 或其他模块中是否有功能或实用程序可以做到这一点?

【问题讨论】:

    标签: python substitution restructuredtext docutils


    【解决方案1】:

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

    【讨论】:

    • 谢谢。看起来这是唯一可以采用的方法,我希望已经有一些可用的方法,但似乎没有。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢 - 这是一些替代品的好解决方案,但我希望有一个强大的解决方案可以在任何 rst 上工作
    【解决方案3】:

    看看Docutils Hacker's Guide。它解释了 docutils 的工作原理。

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

    【讨论】:

    • 感谢您的方法。 bmu 在此基础上进一步扩展。
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多