การใช้สฟิงซ์กับ Markdown แทน RST


212

ฉันเกลียด RST แต่รักสฟิงซ์ มีวิธีที่สฟิงซ์อ่าน markdown แทนที่จะเป็น reStructuredText หรือไม่?


1
ฉันไม่ได้ตระหนักถึงตัวเลือกใด ๆ สำหรับสิ่งนี้ แต่โปรดทราบว่า RST มีตัวเลือกมากกว่า markdown ในแง่ของความสามารถในการขยาย ดังนั้นขึ้นอยู่กับโครงการของคุณอาจไม่เพียงพอ
Wolph

2
มีส่วนย่อยของ rSTที่ส่วนใหญ่เป็น markdown ที่ถูกต้อง ถ้าคุณเกลียดสฟิงซ์รายการข้อมูล ( :param path:ฯลฯ ) ดูนามสกุลของนโปเลียน
Beni Cherniavsky-Paskin

3
หากคุณต้องการจัดทำเอกสารโครงการ Python ของคุณใน Markdown ด้วยสฟิงซ์ให้ลงคะแนนสำหรับคำขอคุณสมบัติที่bitbucket.org/birkenfeld/sphinx/issue/825/…
Colonel Panic

1
ดูความคิดเห็นนี้ดูเหมือนว่าคุณสามารถผสมทั้งสอง: read-the-docs.readthedocs.org/en/latest/…
Stefan van der Walt

2
ในที่สุดการสนับสนุน Markdown ขั้นสุดท้ายทำให้มันกลายเป็นสฟิงซ์: ดูคำตอบใหม่
Oliver Bestwalter

คำตอบ:


97

วิธีที่ "เหมาะสม" ในการทำเช่นนั้นคือการเขียนตัวแยกวิเคราะห์ docutilsสำหรับการทำเครื่องหมาย (รวมถึงตัวเลือกสฟิงซ์เพื่อเลือกตัวแยกวิเคราะห์) ความสวยงามของสิ่งนี้จะรองรับรูปแบบเอาต์พุต docutils ทั้งหมดทันที (แต่คุณอาจไม่สนใจสิ่งนั้น วิธีในการเข้าถึงโดยไม่พัฒนาโปรแกรมแยกวิเคราะห์ตั้งแต่ต้น:

  1. คุณสามารถโกงและเขียน "parser" ที่ใช้Pandocเพื่อแปลง markdown เป็น RST และส่งต่อไปยัง RST parser :-)

  2. คุณสามารถใช้ markdown-> ตัวแยกวิเคราะห์ XML ที่มีอยู่และแปลงผลลัพธ์ (โดยใช้ XSLT?) เป็น schema docutils

  3. คุณสามารถใช้python markdown python ที่มีอยู่ซึ่งให้คุณกำหนด renderer แบบกำหนดเองและทำให้มันสร้าง tree docutils node tree

  4. คุณสามารถแยกผู้อ่าน RST ที่มีอยู่แล้วคัดลอกทุกอย่างที่ไม่เกี่ยวข้องกับการทำเครื่องหมายและเปลี่ยนไวยากรณ์ที่แตกต่างกัน ( การเปรียบเทียบนี้อาจช่วยได้) ...
    แก้ไข: ฉันไม่แนะนำเส้นทางนี้เว้นแต่คุณจะเตรียมการทดสอบอย่างหนัก มาร์กดาวน์มีภาษาที่แตกต่างกันอย่างละเอียดมากเกินไปและอาจส่งผลให้เกิดอีกภาษาหนึ่ง ...

อัปเดต: https://github.com/sgenoud/remarkdownเป็นผู้อ่าน markdown สำหรับ docutils มันไม่ได้ใช้ทางลัดใด ๆ ดังกล่าวข้างต้น แต่ใช้ผักชีฝรั่งไวยากรณ์ PEG แรงบันดาลใจจากPEG-markdown

อัปเดต: https://github.com/readthedocs/recommonmarkและเป็นเครื่องอ่าน docutils อีกเครื่องหนึ่งซึ่งได้รับการสนับสนุนบน ReadTheDocs ได้มาจากการบอกกล่าว แต่ใช้ตัวแยกวิเคราะห์CommonMark-py

  • มันสามารถแปลงไวยากรณ์ Markdown ธรรมชาติที่เฉพาะเจาะจงมากขึ้นหรือน้อยลงเป็นโครงสร้างที่เหมาะสมเช่นรายการลิงก์ไปยัง toctree * ไม่มีไวยากรณ์พื้นฐานดั้งเดิมสำหรับบทบาท
  • รองรับการฝังตัวใด ๆเนื้อหา RST รวมทั้งสั่งกับ```eval_rstบล็อกไม่พอใจDIRECTIVE_NAME:: ...เช่นเดียวกับชวเลขสั่ง

UPDATE : MySTเป็นอีกหนึ่งโปรแกรมอ่าน docutins / Sphinx อิงจาก markdown-it-py, CommonMark ที่เข้ากันได้

  • มี{ROLE_NAME}`...`ไวยากรณ์ทั่วไปสำหรับบทบาท
  • มีไวยากรณ์ทั่วไปสำหรับคำสั่งที่มี ```{DIRECTIVE_NAME} ...บล็อกไม่พอใจ

ในทุกกรณีคุณจะต้องคิดค้นขยาย Markdown เพื่อเป็นตัวแทนของคำสั่งสฟิงซ์และบทบาท แม้ว่าคุณอาจไม่ต้องการทั้งหมด แต่บางอย่าง.. toctree::ก็เป็นสิ่งจำเป็น
ฉันคิดว่านี่เป็นส่วนที่ยากที่สุด reStructuredText ก่อนที่ส่วนขยาย Sphinx จะสมบูรณ์ยิ่งขึ้นกว่า markdown แม้แต่ markdown ที่ยืดเยื้อเช่นpandocก็เป็นชุดย่อยของชุดคุณลักษณะ rST นั่นเป็นพื้นดินมากมายที่จะครอบคลุม!

การนำไปปฏิบัติได้อย่างชาญฉลาดสิ่งที่ง่ายที่สุดคือการเพิ่มโครงสร้างทั่วไปเพื่อแสดงบทบาท / คำสั่ง docutils ใด ๆ ผู้สมัครที่เห็นได้ชัดสำหรับแรงบันดาลใจไวยากรณ์คือ:

  • ไวยากรณ์ของแอททริบิวซึ่ง pandoc และการใช้งานอื่น ๆ บางอย่างอนุญาตแล้วในโครงสร้างแบบอินไลน์และบล็อกจำนวนมาก ยกตัวอย่างเช่น->`foo`{.method}`foo`:method:
  • HTML / XML จาก<span class="method">foo</span>วิธีการ kludgiest เพียงแทรก docutils ภายใน XML!
  • YAML บางอย่างสำหรับคำสั่ง?

แต่เช่นการทำแผนที่ทั่วไปจะไม่เป็นวิธีการแก้ปัญหา markdown-ish มากที่สุด ... ปัจจุบันสถานที่ใช้งานมากที่สุดเพื่อหารือเกี่ยวกับส่วนขยาย markdown มีhttps://groups.google.com/forum/#!topic/pandoc-discuss , https: // github.com/scholmd/scholmd/

นอกจากนี้ยังหมายความว่าคุณไม่สามารถใช้ตัวแยกวิเคราะห์มาร์คดาวน์ซ้ำได้โดยไม่ขยายออกไป Pandoc อีกครั้งชีวิตถึงชื่อเสียงเป็นมีดสวิสกองทัพของการแปลงเอกสารโดยการสนับสนุนfiltes ที่กำหนดเอง (อันที่จริงถ้าฉันจะเข้าใกล้สิ่งนี้ฉันจะพยายามสร้างสะพานเชื่อมระหว่างผู้อ่าน docutils / transformers / นักเขียนและผู้อ่าน pandoc / ตัวกรอง / นักเขียนมันมากกว่าที่คุณต้องการ แต่ผลตอบแทนจะกว้างกว่าแค่สฟิงซ์ / markdown.)


แนวคิดทางเลือกที่บ้าคลั่ง: แทนที่จะขยาย markdown เพื่อจัดการ Sphinx ให้ขยาย reStructuredText เพื่อสนับสนุน (ส่วนใหญ่) superset of markdown! ความงามคือคุณจะสามารถใช้คุณสมบัติสฟิงซ์ใด ๆ ได้ตามที่เป็นอยู่ แต่สามารถเขียนเนื้อหาส่วนใหญ่ได้ในมาร์คดาวน์

มีอยู่แล้วทับซ้อนไวยากรณ์มาก ; ไวยากรณ์ลิงก์ที่สะดุดตาที่สุดนั้นเข้ากันไม่ได้ ฉันคิดว่าถ้าคุณเพิ่มการสนับสนุนให้กับ RST สำหรับลิงก์มาร์คดาวน์และ###- ส่วนหัวสไตล์และเปลี่ยน`backticks`บทบาทเริ่มต้นเป็นตัวอักษรและอาจเปลี่ยนบล็อกที่เยื้องเป็นค่าเฉลี่ยตัวอักษร (RST รองรับ> ...การเสนอราคาทุกวันนี้) คุณจะได้รับสิ่งที่สนับสนุน .


17
ฉันสรุปจากการขาดความก้าวหน้าในพื้นที่นี้ ReST อาจจะดีพอและไม่แตกต่างกันมากพอดังนั้น Markdown สำหรับกิจการดังกล่าวจึงคุ้มค่า
ศ. Falken

5
TLDR: ใช้recommonmarkเพื่อเขียนเอกสารสฟิงซ์โดยใช้ Markdown
ostrokach

แนะนำให้เพิ่มmyst-parserคำตอบใหม่เข้าไป มันจะชนะ
Rick สนับสนุนโมนิก้า

92

คุณสามารถใช้ 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
Beni กล่าวถึงวิธีการนี้ของเขาในคำตอบที่ครอบคลุมมากดังกล่าวข้างต้น อย่างไรก็ตามฉันรู้สึกว่าคำถามนี้สมควรได้รับคำตอบง่ายๆนี้
Marijn

2
เป็นสิ่งสำคัญที่จะอ่านrecommonmark.readthedocs.org/en/latest/auto_structify.htmlโดยเฉพาะอย่างยิ่งวิธีสร้าง toctree และวิธีใช้eval_rstfenced blockเพื่อแทรก rST build / directive ใด ๆ
Beni Cherniavsky-Paskin

สิ่งนี้จำเป็นในการติดตั้ง recommonmark และ commonmark
XavierCLL

1
ฉันImportError: cannot import name 'DocParser'ไปที่สฟิงซ์ 1.4.1 ภายใต้ Python 3.4.3
detly

2
@detly: ผู้ ImportError เป็นเพราะรุ่นล่าสุดของ commonmark (0.6.0) ที่จะหมดความเข้ากันได้กับ recommonmark: ดูgithub.com/rtfd/recommonmark/issues/24 การแก้ปัญหา:pip install commonmark==0.5.5 --upgrade
kadee

30

สิ่งนี้ไม่ได้ใช้สฟิงซ์ แต่MkDocsจะสร้างเอกสารของคุณโดยใช้ Markdown ฉันยังเกลียด rst และมีความสุขกับ MkDocs จริงๆ


5
MkDocs ทำงานได้ดีที่นี่เช่นกันสำหรับเอกสารผู้ใช้ปลายทาง ยังคงต้องการใช้ markdown ภายใน docstrings ..
Marcus Ottosson

2
ใช่เลยสำหรับเรื่องนี้
jkmacc

1
เฮ้ขอบคุณ - MkDocs ยอดเยี่ยม ! ฉันหลวมพลังและฟีเจอร์ต่าง ๆ เมื่อเทียบกับ Sphinx และ RST แน่นอนว่า ... แต่มันไม่ซับซ้อนเรียบง่ายคล่องตัวและใช้งานง่ายและรวดเร็ว สมบูรณ์แบบสำหรับกรณีการใช้งานเกือบทั้งหมดของฉัน - เช่นคำแนะนำการติดตั้งแบบสั้นและแบบฝึกหัดเริ่มต้นอย่างรวดเร็วพร้อมตัวอย่าง สำหรับบางกรณีที่ฉันต้องการซอร์สโค้ดจำนวนมากอธิบาย - คลาส ig และเอกสารการเรียกใช้ฟังก์ชัน - ฉันติดกับสฟิงซ์
บรูตัส

ในขณะที่เขียนสิ่งนี้จะสนับสนุนการเยื้องของ TOC เพียง 2 ระดับเท่านั้น
wrygiel

@wrygiel คุณไม่ถูกต้อง - จำนวนระดับ TOC ที่แสดงผลขึ้นอยู่กับธีมที่คุณใช้
Ale

27

UPDATE:ตอนนี้สนับสนุนอย่างเป็นทางการและการบันทึกไว้ในเอกสารสฟิงซ์

ดูเหมือนว่าการใช้งานขั้นพื้นฐานทำให้มันกลายเป็นสฟิงซ์ แต่คำว่ายังไม่ได้รับรอบ ดูความคิดเห็นปัญหา 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
Roger Dahl

1
ลิงก์ไปยังเอกสารสฟิงซ์ควรเป็นsphinx-doc.org/en/master/usage/markdown.html
Paul Brannan

21

Markdown และ ReST ทำสิ่งต่าง ๆ

RST ให้รูปแบบวัตถุสำหรับการทำงานกับเอกสาร

Markdown เป็นวิธีการแกะสลักข้อความขนาดเล็ก

ดูเหมือนว่าสมเหตุสมผลที่จะต้องการอ้างอิงบิตของเนื้อหา Markdown ของคุณจากโครงการสฟิงซ์ของคุณโดยใช้ RST เพื่อแยกสถาปัตยกรรมข้อมูลโดยรวมและการไหลของเอกสารขนาดใหญ่ ให้ markdown ทำในสิ่งที่ทำซึ่งอนุญาตให้ผู้เขียนมุ่งเน้นที่การเขียนข้อความ

มีวิธีในการอ้างอิงโดเมน markdown เพียงเพื่อแกะสลักเนื้อหาตามที่เป็นอยู่หรือไม่ RST / sphinx ดูเหมือนว่าจะได้รับการดูแลคุณสมบัติเช่นtoctreeโดยไม่ต้องทำซ้ำใน markdown


5
"ดูเหมือนว่าสมเหตุสมผลที่จะต้องการอ้างอิงบิตของเนื้อหา Markdown ของคุณจากโครงการสฟิงซ์ของคุณ" - นี่คือสิ่งที่ฉันต้องการทำจริง ๆ ฉันต้องการรวมเนื้อหา markdown (ของฉันREADME.md) ไว้ในเอกสารสฟิงซ์ที่ครอบคลุมยิ่งขึ้น คุณรู้หรือไม่ว่าสิ่งนี้เป็นไปได้?
Detly


8

ฉันไปกับข้อเสนอแนะของเบนิในการใช้แพนโดกสำหรับงานนี้ เมื่อติดตั้งแล้วสคริปต์ต่อไปนี้จะแปลงไฟล์ 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
คุณสามารถเรียกใช้ Pandoc ได้อย่างง่ายดายจาก Makefile ทุกครั้งที่คุณต้องการสร้างเอกสารเพื่อแปลง Markdown เป็น reStructuredText


3
ถ้าฉันไม่ได้ทำอะไรผิดมันไม่ง่ายเลยที่จะแทนที่ ReST ด้วย Markdown หากคุณใช้คำสั่งเช่นtoctreeในไฟล์ต้นฉบับ Markdown แล้ว Pandoc จะเปลี่ยนเป็นบรรทัดเดียว: .. toctree:: :maxdepth: 2 :glob:ระหว่างการแปลงและพวกเขาจะหยุดทำงาน มันเป็นไปไม่ได้ที่จะใช้คำสั่งด้วยวิธีนี้
Wiktor Walc

@WiktorWalc ฉันไม่คุ้นเคยกับแพนโดกมากและฉันไม่ได้ลองจริงๆ แต่มันก็สมเหตุสมผลฉันเดา โอ้ดี ฉันเหนื่อย. ฉันเดาว่าคุณสามารถรายงานข้อผิดพลาดได้?
the_drow

@WiktorWalc: ..toctreeไม่ใช่ไวยากรณ์ที่ถูกต้อง คุณอาจเขียนเอกสารทั้งหมดใน Markdown (และทำให้นิโคตินของ ReSt หลวม) หรือคุณใช้ ReST คุณไม่สามารถมีเค้กของคุณและกินมันเกินไป
Aditya

1
เพียงคำใบ้: วิธีแก้ปัญหาคือการใช้ตัวกรองแพนโดกเพื่อข้ามคำแนะนำพิเศษเหล่านั้นและปล่อยให้มันอยู่ในการสร้างผลลัพธ์ ฉันไม่ได้เป็นตัวช่วยสร้างตัวกรองแพนโดกและเพิ่มความซับซ้อนให้กับโครงร่าง
zmo

1

นี่คือตัวเลือกใหม่ MyST เพิ่มคุณสมบัติบางอย่างให้กับ Markdown ที่อนุญาตให้ Sphinx สร้างเอกสารเช่นเดียวกับ rst https://myst-parser.readthedocs.io/en/latest/


เพิ่งเริ่มใช้สิ่งนี้และมันวิเศษมาก
Rick สนับสนุนโมนิก้า

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.