RSTの代わりにMarkdownでsphinxを使用する


212

私はRSTが嫌いですが、スフィンクスが大好きです。reStructuredTextの代わりにsphinxがmarkdownを読み取る方法はありますか?


1
これで利用できるオプションは知りません。ただし、RSTには拡張性の点でマークダウンよりもはるかに多くのオプションがあることに注意してください。したがって、プロジェクトによっては十分ではない場合があります。
Wolph

2
ほとんどが有効なマークダウンあるrSTのサブセットがあります。Sphinxフィールドリスト(:param path:など)が嫌いな場合は、ナポレオン拡張を参照してください。
Beni Cherniavsky-Paskin 14

3
あなたがPythonのプロジェクトがスフィンクスと値下げして文書化したい場合は、機能の要求のための投票bitbucket.org/birkenfeld/sphinx/issue/825/...
大佐はパニック

1
:あなたは2混在させることができるかのようにこのコメントを見てみると、それはそうですread-the-docs.readthedocs.org/en/latest/...
ウォルト・デア・ステファン・バン

2
基本的なMarkdownサポートがついにSphinxに導入されました:新しい回答を
Oliver Bestwalter

回答:


97

これを行う「適切な」方法は、マークダウン用のdocutilsパーサーを作成することです。(さらに、パーサーを選択するためのSphinxオプション。)これの利点は、すべてのdocutils出力形式を即座にサポートできることです(ただし、ほとんどの場合、同様のマークダウンツールがすでに存在しているため、気にする必要はありません)。パーサーをゼロから開発せずにそれに取り組む方法:

  1. Pandocを使用してマークダウンをRSTに変換し、それをRSTパーサーに渡す"パーサー"をカンニングして作成できます。

  2. 既存のmarkdown-> XMLパーサーを使用して、結果を(XSLT?を使用して)docutilsスキーマに変換できます。

  3. カスタムレンダラーを定義してdocutilsノードツリーを構築できるようにする既存のpythonマークダウンパーサーをいくつか使用できます。

  4. あなたは、異なる構文をマークダウンし、変化に無関係なすべてのもの(リッピング、既存のRST読者をforkでき、この比較かもしれないのヘルプ)...
    EDITを:あなたは重く、それをテストするために用意しない限り、私はこのルートをお勧めしません。マークダウンにはすでに微妙に異なる方言が多すぎます。これはおそらくもう1つになります...

更新: https : //github.com/sgenoud/remarkdownは、docutilsのマークダウンリーダーです。上記のショートカットはありませんが、peg-markdownに触発されたパセリ PEG文法を使用します。

更新:https : //github.com/readthedocs/recommonmarkは、ReadTheDocsでネイティブにサポートされている別のdocutilsリーダーです。 remarkdownから派生しましたが、CommonMark-pyパーサーを使用しています。

  • これは、変換することができます toctreeへのリンクの適切な構造例えばリストに特定多かれ少なかれ自然マークダウン構文を。*ロールの一般的なネイティブ構文はありません。
  • ディレクティブを含むrSTコンテンツの埋め込みを fenced ```eval_rstブロックとディレクティブの省略形でサポートしますDIRECTIVE_NAME:: ...

更新MySTはさらに別のdocutins / Sphinxリーダーです。markdown-it-py、CommonMark互換に基づいています。

  • {ROLE_NAME}`...`ロールの一般的な構文があります。
  • ```{DIRECTIVE_NAME} ...フェンス付きブロックを使用したディレクティブの一般的な構文があります。

では、すべての例は、表現するためにMarkdown記法の拡張を考案する必要がありますスフィンクスディレクティブとロールを。それらのすべてが必要なわけではありませんが、のようなもの.. toctree::が不可欠です。
これが一番難しいと思います。Sphinx拡張機能がマークダウンよりも豊富になる前のreStructuredText。pandocのような大幅に拡張されたマークダウンでさえ、rST機能セットのサブセットです。それはカバーするべき多くの根拠です!

実装に関しては、最も簡単なことは、あらゆるdocutilsロール/ディレクティブを表現するための一般的な構成を追加することです。構文インスピレーションの明らかな候補は次のとおりです。

  • pandocおよび他の一部の実装では、すでに多くのインラインおよびブロック構成で許可されている属性構文。たとえば`foo`{.method}-> `foo`:method:です。
  • HTML / XML。から<span class="method">foo</span>docutils内部XMLを挿入するだけの最も扱いにくいアプローチに!
  • ディレクティブ用のある種のYAML?

しかし、このような一般的なマッピングは、ほとんどのマークダウンっぽいソリューションではありません...現在値下げ拡張を議論するための最も活発な場所ですhttps://groups.google.com/forum/#!topic/pandoc-discusshttps://でgithub.com/scholmd/scholmd/

これはまた、なんらかの方法で拡張せずにマークダウンパーサーを再利用できないことを意味します。Pandocは、カスタムフィルトをサポートすることにより、ドキュメント変換のスイスアーミーナイフとしての評判を再び満たしています。(実際、私がこれに近づくとしたら、私はdocutilsリーダー/トランスフォーマー/ライターとpandocリーダー/フィルター/ライターの間に一般的なブリッジを構築しようとします。それは必要以上ですが、スフィンクス/値下げ。)


代替クレイジーなアイデア:Sphinxを処理するためにマークダウンを拡張する代わりに、(ほとんど)マークダウンのスーパーセットをサポートするようにreStructuredTextを拡張します!優れている点は、Sphinxの機能をそのまま使用できる一方で、ほとんどのコンテンツをマークダウンで記述できることです。

すでにかなりの構文の重複があります。特にリンク構文には互換性がありません。マークダウンリンクと###スタイルヘッダーのサポートをRSTに追加し、デフォルトの`backticks`役割をリテラルに変更し、インデントされたブロックをリテラルを意味するように変更すると(RSTは> ...今日の引用をサポート)、ほとんどのマークダウンをサポートする使用可能なものになると思います。


17
私はこの分野での進歩の欠如から結論付けます、ReSTは十分によく、十分に似ているわけではないかもしれないので、Markdownはそのような事業に価値があると考えています。
ファルケン教授

5
TLDR:recommonmarkを使用して、Markdownを使用したSphinxドキュメントを作成します。
ostrokach 16

myst-parserこの回答に新しいものを追加することをお勧めします。勝つだろう。
リックは

92

MarkdownとreStructuredTextを同じSphinxプロジェクトで使用できます。これを行う方法は、Read The Docsに簡潔に文書化されています。

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の作成方法と、fenced eval_rstブロックを使用してrST構成/ディレクティブを挿入する方法を読むことが重要です。
Beni Cherniavsky-Paskin

これはrecommonmarkおよびcommonmarkをインストールするために必要
XavierCLL

1
私が手ImportError: cannot import name 'DocParser'のPython 3.4.3の下スフィンクス1.4.1に。
16年

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を使用してドキュメントを構築します。私も最初は嫌いで、これまでMkDocsを本当に楽しんでいます。


5
MkDocsは、エンドユーザー向けのドキュメントとして、ここでも非常にうまく機能しています。それでもドキュメンテーション文字列内で使用の値下げに探して...
マーカスOttosson

2
本当にそうですね。
jkmacc

1
ねえ、ありがとう— MkDocsは素晴らしいです!SphinxやRSTと比較して、私は多くのパワーと機能を失っています。それは確かです…しかし、それは驚くほど複雑でなく、合理化されており、とても簡単で高速に使用できます。短いインストール手順やいくつかの例を含むクイックスタートチュートリアルなど、ほとんどすべてのユースケースに最適です。いくつかのソースコードの説明が必要な場合(igクラスと関数呼び出しのドキュメント)については、Sphinxを使用しています。
Brutus

これを書いている時点では、TOCインデントは2レベルしかサポートしていません。
wrygiel

@wrygiel正確ではありません—レンダリングされるTOCレベルの数は、使用しているテーマによって異なります。
エール

27

更新:これは正式にサポートされ、sphinx docsに文書化されています。

基本的な実装によってSphinxへの道が開かれたようですが、言葉はまだ定着していません。github issueコメントを参照してください

インストール依存関係:

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
Roger Dahl

1
スフィンクスのドキュメントへのリンクは、sphinx-doc.org / en / master / usage / markdown.html
Paul Brannan

21

MarkdownとReSTは異なる処理を行います。

RSTは、ドキュメントを操作するためのオブジェクトモデルを提供します。

Markdownは、テキストの一部を刻む方法を提供します。

RSTを使用して全体的な情報アーキテクチャとより大きなドキュメントのフローをスタブ化するために、sphinxプロジェクトからMarkdownコンテンツのビットを参照したいのは理にかなっているようです。markdownがそれを行うようにします。これにより、ライターはテキストの書き込みに集中できます。

マークダウンドメインを参照して、コンテンツをそのまま彫刻する方法はありますか?RST / sphinxはtoctree、マークダウンでそれらを複製せずに機能を処理したようです。


5
「スフィンクスプロジェクトからMarkdownコンテンツを少し参照したいのは理にかなっているようです」—これが実際に私がやりたいことです。README.mdより包括的なSphinxドキュメンテーションにマークダウンコンテンツ(my )を含めたいのですが。これが可能かどうか知っていますか?
14


8

私はこの作業にパンドックを使用するというベニの提案に同意しました。次のスクリプトをインストールすると、ソースディレクトリ内のすべてのマークダウンファイルがrstファイルに変換されるため、すべてのドキュメントをマークダウンに書き込むことができます。これが他の人に役立つことを願っています。

#!/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を生成します。
MarkdownをreStructuredTextに変換するためにドキュメントを生成するたびに、MakefileからPandocを簡単に呼び出すことができます。


3
私が何か間違ったことをしているのでなければ、ReSTをMarkdownで置き換えるのはそれほど簡単ではありません。Markdownソースファイルでtoctreeのような指示を使用すると、Pandocはそれらを1行に変更し.. toctree:: :maxdepth: 2 :glob:ます。変換中に、それらは機能しなくなります。つまり、この方法でディレクティブを使用することは不可能です。
Wiktor Walc

@WiktorWalc私はpandocにあまり詳しくないので、実際に試したことはありませんが、それは理解できるでしょう。しかたがない。私は試した。バグレポートを提出できると思いますか?
the_drow 2013年

@WiktorWalc:..toctreeは有効なMarkdown構文ではありません。文書全体をMarkdownで書く(そしてReStの優れた点を失う)か、ReSTを使用します。ケーキを持って食べることもできません。
Aditya 2013

1
ヒント:解決策は、パンドックフィルターを使用してこれらの特別な指示をスキップし、出力生成のままにすることです。私はパンドックフィルターのウィザードではありませんが、これによりスキームがさらに複雑になります。
zmo 2015年


0

Mavenおよび組み込みのSphinx + MarkDownサポートを使用したドキュメントの構築は、次のMavenプラグインで完全にサポートされています。

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.