将我的降价自述文件包含到 Sphinx 中

Posted

技术标签:

【中文标题】将我的降价自述文件包含到 Sphinx 中【英文标题】:Include my markdown README into Sphinx 【发布时间】:2018-02-26 22:54:51 【问题描述】:

我想将我的项目的 README.md 包含在我的 Sphinx 文档中,例如 Can sphinx link to documents that are not located in directories below the root document? - 在生成的 Sphinx html 文档中,我单击欢迎页面目录中的链接并访问 README.md

为此创建了一个包含行的文档readme_link.rst

Readme File
-----------

.. include:: ../../README.md

然后我添加了一行

README <readme_link>

进入index.rst 的目录树。 随之而来的是,我的 README.md 不会被解析为 Markdown,而是按原样打印到页面上。

我认为另一种想法可能是使用降价文件 readme_link.md 代替,但没有办法包含降价文件。

如何将我的 README.md 解析为降价?

(当然我不想重写为.rst。)

为什么m2r 不起作用

我尝试关注Render output from markdown file inside .rst file,但这不起作用。我的README.md 有一些标题,例如

# First heading

some text

## Second heading 1

some text

## Second heading 2

some text

我收到错误WARNING: ../README.md:48: (SEVERE/4) Title level inconsistent:。我从What does "Title level inconsistent" mean? 了解到我需要使用其他符号 - 但读到它们后我意识到答案是指rst 符号。这意味着我的降价自述文件实际上并没有转换为rst

PS:其他尝试过类似操作的人是 https://muffinresearch.co.uk/selectively-including-parts-readme-rst-in-your-docs/

【问题讨论】:

@Waylan:这不起作用,请参阅更新的问题。 IIRC,在创建 Docutils 文档对象时检查一致的标题(在已经发生解析之后)。文档对象坚持具有一致的标题级别,错误消息只是假设源是rst。如果您使用的是 Docutils(Sphinx 是在其之上构建的),那么您绝对 必须 具有一致的标头级别。您使用什么标记语言并不重要。 作为测试,我建议将readme_link.rst 更改为markdown 文件(毕竟,M2R 将minclude 指令添加到Markdown 解析器中)然后看看会发生什么。我怀疑您可能会收到相同的错误消息。 最后,正如链接问题的 cmets 中所讨论的,除非您有一些非标准的修改,否则不可能将 include Markdown 文件转换为 rst 文件。 M2R 是我所知道的唯一这样的修改。因此,这仍然是重复的,这里没有与那里不同的答案。 @Waylan:我不太确定你建议我应该做什么。我包括m2r。我的标题与降价文档一致。据我了解,不可能将include 另一个文档放入降价文件中。 【参考方案1】:

您需要编辑您的readme_link.rst,如下所示:

Readme File
===========

.. mdinclude:: ../../README.md

请注意,部分标题是用= 字符而不是- 字符指定的。

有两个因素促成了这一点。

包含的工作原理

标准include(不是mdinclude)实际上读取源文件的内容并简单地复制原始文本来代替指令。 M2R 的 mdinclude 首先将源 Markdown 文本转换为 rst,然后像 include 一样,复制该测试来代替指令。

因此,在解析 rst 文档时,您已经拥有来自父文件和包含文件的完整 rst 文档。一份完整的文档必须是有效 rst 文档,这将我们带到第二点......

标题级别必须一致。

提醒一下,reStructuredText Spec 解释说:

不是强加固定数量和顺序的部分标题装饰样式,而是强制执行的顺序将是遇到的顺序。遇到的第一个样式是最外层的标题(如 HTML H1),第二个样式是副标题,第三个是副标题,以此类推。

...

不需要使用所有的节标题样式,也不需要使用任何特定的节标题样式。但是,文档在使用节标题时必须保持一致:一旦建立了标题样式的层次结构,节就必须使用该层次结构。

因此,包含的子项中的标题级别必须与父项中的标题级别一致。由于 M2R 生成一个rst 文档,您(作为最终用户)无法明确使用哪个字符来定义每个部分级别。因此,为了保持一致性,需要使用scheme defined by M2R:

Rst 航向标记目前是硬编码且不可更改。 H1:=,H2:-,H3:^,H4:~,H5:",H6:#

如您所见,1 级标头使用= 字符,2 级标头使用- 字符。因此,需要在父 readme_link.rst 文件中使用相同的方案(您使用的是相反的)。

另一种解决方案

reStructuredText 规范还指出:

仅下划线的装饰样式不同于使用相同字符的上划线和下划线样式。

因此,您可以在父文档中使用上划线和下划线样式,而您在哪个级别使用的字符并不重要,因为 M2R 似乎只使用仅下划线样式。所以这也可以:

-----------
Readme File
-----------

.. mdinclude:: ../../README.md

这有一个额外的好处(或负面的 - 取决于您的观点),包含的子文档中的所有标题现在将比它们自己低一级。因此,子级在语义上更“嵌套”在父级中(单个 HTML 文档中的多个h1 通常被认为是不语义的,尽管它在技术上是“有效的”)。当然,这可能是也可能不是您想要的,这就是为什么它被标记为“替代解决方案”。

【讨论】:

mdinclude 不再受支持 @pjk 你有这个说法的来源吗?在 M2R 的docs 中仍然提到它。 基于 github.com/sphinx-doc/sphinx/issues/7420#issuecomment-609814898 和 github.com/sparkfun/Qwiic_Template_Py/issues/1 。 m2r2 似乎对我有用。无法让 m2r 完成我的工作。 啊,我明白了,它还没有更新到可以与 Sphinx 3 一起使用。看来m2r2 是一个更新的分支,可以与 Sphinx 3 一起使用。 m2r2 无法从 README 导入图像。任何提示为什么会这样?【参考方案2】:

如果您只想将 Markdown 文档作为单独的文件包含在项目中(并且不需要将该文件的内容嵌入到 .rst 文件中),还有另一种方法:

1。确保您具备必要的先决条件

(这些步骤也是接受答案所必需的。)

1.1 确保您已安装 Markdown 渲染器:

$ pip install -U sphinx>=1.8.3 recommonmark>=0.5.0

1.2 将recommonmark添加到conf.py中的extensions列表中

有关这方面的规范说明,请参阅 the documentation。

1.3 为您的降价文件创建符号链接

$ cd docs             # or docs/source
$ ln -s ../README.md  # or to ../../README.md if using docs/source

2。在您的文档中包含所需的降价文件

将文件链接到您的toctree:

.. toctree::
   :maxdepth: 2
   :caption: Contents:

   source/README.md

【讨论】:

我认为链接可能对版本控制有问题。有没有办法直接使用相对路径?我试过 ../README.md 。但 Sphinix 找不到。 对于步骤 1.2,您能否准确说明如何将 recommonmark 添加到 conf.py 中的扩展名列表中? @chrisinmtown 我添加了指向文档相关部分的链接。我不想在这里的配置中“硬编码”,以免当他们改变某些东西时答案变得陈旧。 任何事情都可以随时改变 :) 这种提示真的很有帮助:extensions = [ 'recommonmark' ] 您认为现在只需点击一下官方文档,您所在位置的未来读者就会得到充分的指导吗?【参考方案3】:

如果你也遇到错误TypeError: add_source_parser(),解决方法如下:

使用m2r2 代替m2r。也就是说,

在文件readme_link.rst中,我们写

.. mdinclude:: ../README.md

我们在文件conf.py 中添加

extensions = [
    # ...
    'm2r2'
]
# ...

# source_suffix = '.rst'
source_suffix = ['.rst', '.md']

【讨论】:

【参考方案4】:

我已安装 myst-parser 扩展并尝试将 Markdown 文件包含到 .rst 文件中

.. include:: README.md

它没有被解析。添加了:parser: markdown 选项,但 docutils 抱怨未安装“recommonmark”扩展。我找到了一种方法来包含已解析的 md 文件:

.. include:: README.md
   :parser: myst_parser.sphinx_

【讨论】:

:parser: myst_parser.sphinx_ 对我来说是关键。在我添加之前解析无法正常工作。 我遇到了一个问题,它抱怨unknown option: "parser".。原来我在 0.17 之前有一个 docuitils 版本,升级它解决了这个问题。 这个解决方案现在在文档中:) myst-parser.readthedocs.io/en/latest/sphinx/…【参考方案5】:

最简单的方法是使用 MyST-Parser,恰好是扩展 now recommended in Sphinx docs 用于处理 Markdown。不需要m2r

MyST-Parser allows reStructuredText 样式指令嵌入到 Markdown 文件中。我们将使用该功能将您的 Markdown README.md 包含到占位符 Markdown 文件中,然后将其呈现为 HTML。

conf.py:

extensions = [
    # ...
    "myst_parser"
]

您的 readme_link 文件应该是 Markdown 格式而不是 reStructuredText 即创建一个包含 include 指令的 readme_link.md 文件:

```include ../../README.md
```

该指令只是将README.md 的内容转储到readme_link.md 中,readme_link.md 本身就是 Markdown 中的,因此此时无需对 reStructuredText 进行任何转换。由于myst_parser 扩展,readme_link.md 将与所有其他源文件一起呈现为 HTML。

【讨论】:

这是自2020年myst_parser正式推荐以来的正确答案【参考方案6】:

一个相当简单的解决方案,例如

.. literalinclude:: ../README.md

可能会为您解决问题。

这不会解析 .md 文件,而是将其显示为文字代码块。

根据您的情况,这可能是一个可接受的解决方案。好消息是这不需要(可能未维护的)扩展,适用于不支持符号链接的 Windows,允许您将 README 的内容放入现有的 .rst 文件中,并且不与 .rst 标头冲突.明显的缺点是没有进行解析。

【讨论】:

以上是关于将我的降价自述文件包含到 Sphinx 中的主要内容,如果未能解决你的问题,请参考以下文章

在自述文件中包含许可证文件

在分发中包含 Psyco 文件

将纹理文件包含到 collada 文件中

如何在邮件组件中包含 Laravel 刀片降价?

如何在我的 github 自述文件中设置 pyversions 图标?

生成一个分层降价列表,其元素是指向我的 git 存储库中文件的链接?