将Sphinx与Markdown而不是RST一起使用


212

我讨厌RST,但喜欢狮身人面像。有没有一种方法可以让狮身人面像读取markdown而不是reStructuredText?


1
我不知道有任何可用的选项。但请注意,就可扩展性而言,RST比markdown拥有更多的选择。因此,根据您的项目,可能还不够。
Wolph

2
rST一部分是有效降价。如果您讨厌狮身人面像字段列表(:param path:等),请参阅Napoleon扩展名
Beni Cherniavsky-Paskin 2014年

3
如果您想使用Sphinx在Markdown中记录您的Python项目,请通过bitbucket.org/birkenfeld/sphinx/issue/825/…
Panic Panic

1
查看此评论,似乎您可以将两者混合使用:read-the-docs.readthedocs.org/en/latest/…–
Stefan van der Walt

2
基本的Markdown支持终于使它成为了狮身人面像的方式:看到新的答案
Oliver Bestwalter 2016年

Answers:


97

做到这一点的“正确”方法是为降价编写docutils解析器。(加上一个Sphinx选项来选择解析器。)它的优点是可以立即支持所有docutils输出格式(但是您可能并不在意,因为大多数降价工具已经存在)。无需从头开发解析器的方法:

  • 您可以作弊并编写一个“解析器”,该解析器使用Pandoc将markdown转换为RST并将其传递给RST解析器:-)。

  • 您可以使用现有的markdown-> XML解析器,并将结果(使用XSLT?)转换为docutils模式。

  • 您可以使用一些现有的python markdown解析器,使您可以定义自定义渲染器,并使其构建docutils节点树。

  • 您可以分叉现有的RST阅读器,删除与降价无关的所有内容并更改不同的语法(此比较可能会有所帮助)...
    编辑:除非您准备好对其进行大量测试,否则我不建议您使用此路由。Markdown已经有太多不同的方言,这很可能会导致另一方言……

更新: https : //github.com/sgenoud/remarkdown是docutils的降价阅读器。它没有采用上述任何快捷方式,而是使用了受peg-markdown启发的Parsley PEG语法。尚不支持指令。

更新:https : //github.com/rtfd/recommonmark,这是另一个docutils阅读器,ReadTheDocs本身支持。 源自remarkdown,但使用CommonMark-py解析器。不支持指令,但可以将或多或少的自然Markdown语法转换为适当的结构,例如toctree的链接列表。对于其他需求,带```eval_rst围栏的块可让您嵌入任何rST指令。


所有情况下,您都需要发明Markdown的扩展来表示Sphinx指令和角色。虽然您可能不需要全部,但有些.. toctree::是必不可少的。
我认为这是最困难的部分。Sphinx扩展之前的reStructuredText已经比markdown丰富。即使是大幅扩展的降价促销(例如pandoc),也大多是rST功能集的子集。有很多方面需要解决!

在实现方面,最简单的方法是添加泛型构造以表达任何docutils角色/指令。语法启发的显而易见的候选人是:

  • pandoc和其他一些实现已允许在许多内联和块构造中使用属性语法。例如`foo`{.method}-> `foo`:method:
  • HTML / XML。从<span class="method">foo</span>只是插入docutils内部XML的kludgiest方法开始!
  • 某种针对指令的YAML?

但是这样的通用映射不会是最降价十岁上下的解决方案。目前最活跃的地方,讨论降价扩展是https://groups.google.com/forum/#!topic/pandoc-discusshttps://开头github.com/scholmd/scholmd/

这也意味着您不能只使用markdown解析器而不以某种方式扩展它。潘多克(Pandoc)通过支持定制过滤器(fils),再次履行其作为瑞士转换文件的军刀的声誉。(实际上,如果我要采用这种方法,我会尝试在docutils读取器/变压器/编写器与pandoc读取器/过滤器/编写器之间建立通用的桥梁。这超出了您的需求,但收益将远远超过狮身人面像/降价。)


另一个疯狂的主意:扩展reStructuredText而不是扩展markdown来处理Sphinx,以(主要)支持markdown的超集!这样做的好处是,您可以按原样使用任何Sphinx功能,但可以在markdown中编写大多数内容。

已经有相当多的语法重叠 ; 最明显的是链接语法不兼容。我认为,如果您为markdown链接和###-style标头添加了对RST的支持,并将默认`backticks`角色更改为文字,并且可能将缩进的块更改为文字(现在的RST支持> ...引号),那么您将获得支持大多数markdown的有用信息。


17
我从这方面缺乏进展得出的结论是,ReST可能就足够好了,并且相差不远,因此Markdown对于这样的事业是值得的。
Falken教授

5
TLDR:使用recommonmark通过Markdown编写Sphinx文档。
ostrokach '16

建议在myst-parser此答案中添加新内容。它会赢。
Rick在

92

您可以在同一Sphinx项目中使用Markdown和reStructuredText。如何完成此操作,请参见“ 阅读文档”

安装recommonmark(pip install recommonmark),然后编辑conf.py

from recommonmark.parser import CommonMarkParser

source_parsers = {
    '.md': CommonMarkParser,
}

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

我已经在Github上创建了一个小示例项目(serra / sphinx-with-markdown),展示了它的工作原理。它使用CommonMark 0.5.4和recommonmark 0.4.0。


4
贝尼在上面非常全面的回答中提到了这种方法。但是,我觉得这个问题值得这个简单的答案。
Marijn 2015年

2
阅读recommonmark.readthedocs.org/en/latest/auto_structify.html非常重要,尤其是如何创建toctree以及如何使用eval_rst围栏插入任何rST构造/指令。
贝尼·切尔尼亚夫斯基-帕斯金

这需要安装recommonmark和commonmark
XavierCLL '16

1
ImportError: cannot import name 'DocParser'在Python 3.4.3下使用Sphinx 1.4.1。
熟练地

2
@detly:ImportError是由于最新版本的commonmark(0.6.0)破坏了与recommonmark的兼容性:请参阅github.com/rtfd/recommonmark/issues/24。解决方案:pip install commonmark==0.5.5 --upgrade
kadee

30

它不使用Sphinx,但是MkDocs将使用Markdown构建您的文档。我也讨厌rst,到目前为止,我非常喜欢MkDocs。


5
对于最终用户文档,MkDocs在这里也非常有效。仍然希望使用降价文档字符串中..
马库斯Ottosson

2
为此,是的。
jkmacc 2014年

1
嘿,谢谢-MkDocs很棒!与Sphinx和RST相比,我释放了很多功能和特性,但这是肯定的……但是它非常简单,精简并且易于使用和快速。非常适合我几乎所有的用例,例如简短的安装说明以及一些示例的快速入门教程。在少数情况下,我需要大量源代码解释-ig类和函数调用文档-但是我坚持使用Sphinx。
Brutus

在撰写本文时,它仅支持2级TOC缩进。
wrygiel

@wrygiel您不太正确-呈现的TOC级别数取决于您使用的主题。
Ale

27

更新:现在已正式支持此功能,并在sphinx docs中进行了记录

看起来,基本的实现方式已将其引入Sphinx,但尚未达成共识。查看github问题评论

安装依赖项:

pip install commonmark recommonmark

调整conf.py

source_parsers = {
    '.md': 'recommonmark.parser.CommonMarkParser',
}
source_suffix = ['.rst', '.md']

1
如果可以cannot import name DocParser,请尝试pip install commonmark==0.5.5
罗杰·达尔


21

Markdown和ReST做不同的事情。

RST提供了用于处理文档的对象模型。

Markdown提供了一种雕刻文字的方法。

想要从sphinx项目中引用您的Markdown内容似乎是合理的,使用RST存根整个信息结构和较大文档的流程。让markdown做什么,这使作者可以专注于编写文本。

有没有一种方法可以引用降价域名,仅按原样雕刻内容?RST / sphinx似乎已经照顾好功能,例如toctree没有在markdown中复制它们。


5
“从您的狮身人面像项目中引用您的Markdown内容似乎是合理的” –这实际上是我想做的;我想README.md在我更全面的Sphinx文档中包括一些markdown内容。你知道这有可能吗?
2014年


8

我同意贝尼(Beni)的建议,将pandoc用于此任务。安装后,以下脚本会将源目录中的所有markdown文件转换为rst文件,以便您可以将所有文档写入markdown中。希望这对其他人有用。

#!/usr/bin/env python
import os
import subprocess

DOCUMENTATION_SOURCE_DIR = 'documentation/source/'
SOURCE_EXTENSION = '.md'
OUTPUT_EXTENSION = '.rst'

for _, __, filenames in os.walk(DOCUMENTATION_SOURCE_DIR):
    for filename in filenames:
        if filename.endswith('.md'):
            filename_stem = filename.split('.')[0]
            source_file = DOCUMENTATION_SOURCE_DIR + filename_stem + SOURCE_EXTENSION
            output_file = DOCUMENTATION_SOURCE_DIR + filename_stem + OUTPUT_EXTENSION
            command = 'pandoc -s {0} -o {1}'.format(source_file, output_file)
            print(command)
            subprocess.call(command.split(' '))

1

有一种解决方法。
sphinx-quickstart.py脚本生成一个Makefile。
每次您想要生成文档时,都可以轻松地从Makefile中调用Pandoc,以将Markdown转换为reStructuredText。


3
除非我做错了事,否则用Markdown替换ReST并不容易。如果您在Markdown源文件中使用toctree之类的说明,那么Pandoc会将它们更改为一行:.. toctree:: :maxdepth: 2 :glob:在转换期间,它们将停止工作。换句话说,不可能以这种方式使用指令。
维克多·沃尔克

@WiktorWalc我对pandoc不太熟悉,我还没有真正尝试过,但是我想这很有道理。那好吧。我试过了。我想您可以提交错误报告?
the_drow

@WiktorWalc:..toctree无效的Markdown语法。您可以在Markdown中编写整个文档(并释放ReSt的细节),或者使用ReST。你不能吃蛋糕也不能吃。
Aditya 2013年

1
只是一个提示:一种解决方案是使用pandoc过滤器跳过那些​​特殊指令,并将其保留在输出生成中。我不是pandoc筛选器的向导,它为方案增加了额外的复杂性。
zmo 2015年


0

请注意,以下maven插件完全支持使用maven和嵌入式Sphinx + MarkDown支持构建文档:

https://trustin.github.io/sphinx-maven-plugin/index.html

<plugin>
  <groupId>kr.motd.maven</groupId>
  <artifactId>sphinx-maven-plugin</artifactId>
  <version>1.6.1</version>
  <configuration>
    <outputDirectory>${project.build.directory}/docs</outputDirectory>
  </configuration>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>generate</goal>
      </goals>
    </execution>
  </executions>
</plugin>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.