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\nfrom 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)\nRun Code Online (Sandbox Code Playgroud)\n\n仅供参考,这里是制表符扩展发生的地方,上面的代码绕过了它。
\n\n在sphinx.parsers.RSTParser#parse
lines = docutils.statemachine.string2lines(\n inputstring, tab_width=document.settings.tab_width,\n convert_whitespace=True)\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x86\x93
\n\n在docutils.statemachine.string2lines
return [s.expandtabs(tab_width).rstrip() for s in astring.splitlines()]\nRun Code Online (Sandbox Code Playgroud)\n