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

时间:2019-09-27 10:22:57

标签: python-sphinx restructuredtext

我将Sphinx与reStructuredText输入和HTML输出一起使用来记录基础结构的不同部分。这个想法是,阅读文档的用户可以复制示例并将其粘贴到她的文件中。 Makefile示例如何完成? Makefile在某些位置需要使用制表符,但是Sphinx会将制表符转换为空格。

示例:command行必须以最终HTML中的标签开头。此处用缩进和制表符的三个空格编写:

.. code-block:: Makefile

   target: dependency
    command -i $< -o $@

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

使用 sphinx代码块生成文件选项卡进行的网络搜索可在包含的代码(我希望将其内联)中扩展选项卡,或者如何编辑Sphinx Makefile的答案,但是没有什么可以解决的问题。

1 个答案:

答案 0 :(得分:0)

Tab扩展发生在解析RST的早期,因此您必须自定义解析器以禁用它。我希望这行得通。

from typing import Union
from docutils.nodes import document
from docutils.statemachine import StringList
from sphinx.parsers import RSTParser


class NoTabExpansionRSTParser(RSTParser):
    def parse(self, inputstring: Union[str, StringList], document: document) -> None:
        if isinstance(inputstring, str):
            lines = inputstring.splitlines()
            inputstring = StringList(lines, document.current_source)
        super().parse(inputstring, document)


def setup(app):
    app.add_source_parser(NoTabExpansionRSTParser, override=True)

仅供参考,这是制表符扩展的地方,上面的代码将绕过该扩展名。

sphinx.parsers.RSTParser#parse

lines = docutils.statemachine.string2lines(
    inputstring, tab_width=document.settings.tab_width,
    convert_whitespace=True)

docutils.statemachine.string2lines

return [s.expandtabs(tab_width).rstrip() for s in astring.splitlines()]