保留 Sphinx Makefile 代码块中的选项卡

hol*_*ger 5 restructuredtext python-sphinx

我使用带有 reStructuredText 输入和 HTML 输出的 Sphinx 来记录基础设施的不同部分。这个想法是,阅读文档的用户可以复制示例并将其粘贴到她的文件中。对于 Makefile 示例如何做到这一点?Makefile 在某些地方需要制表符,但 Sphinx 将制表符转换为空格。

示例:该command行必须以最终 HTML 中的制表符开头。这里写成三个空格缩进和一个制表符:

.. code-block:: Makefile

   target: dependency
    command -i $< -o $@
Run Code Online (Sandbox Code Playgroud)

code-block没有控制选项卡扩展的选项。

使用sphinx 代码块 makefile 选项卡进行网络搜索,可以找到有关包含代码中的选项卡扩展(我更喜欢将其内联)或如何编辑 Sphinx Makefile 的答案,但没有解决我的问题。

小智 1

制表符扩展发生在解析 RST 的早期阶段,因此您必须自定义解析器本身以禁用它。我希望这能起作用。

\n\n
from typing import Union\nfrom docutils.nodes import document\nfrom docutils.statemachine import StringList\nfrom sphinx.parsers import RSTParser\n\n\nclass NoTabExpansionRSTParser(RSTParser):\n    def parse(self, inputstring: Union[str, StringList], document: document) -> None:\n        if isinstance(inputstring, str):\n            lines = inputstring.splitlines()\n            inputstring = StringList(lines, document.current_source)\n        super().parse(inputstring, document)\n\n\ndef setup(app):\n    app.add_source_parser(NoTabExpansionRSTParser, override=True)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

仅供参考,这里是制表符扩展发生的地方,上面的代码绕过了它。

\n\n

sphinx.parsers.RSTParser#parse

\n\n
lines = docutils.statemachine.string2lines(\n    inputstring, tab_width=document.settings.tab_width,\n    convert_whitespace=True)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x86\x93

\n\n

docutils.statemachine.string2lines

\n\n
return [s.expandtabs(tab_width).rstrip() for s in astring.splitlines()]\n
Run Code Online (Sandbox Code Playgroud)\n