Використання сфінкса з Markdown замість RST


212

Я ненавиджу RST, але люблю сфінкса. Чи існує спосіб, як сфінкс читає розмітку замість reStructuredText?


1
Я не знаю жодного варіанту для цього. Але зауважте, що RST має набагато більше варіантів, ніж розмітка з точки зору розширюваності. Тож залежно від вашого проекту це може бути недостатньо.
Вольф

2
Існує підмножина rST, яка в основному є дійсною розміткою. Якщо ви ненавидите списки полів Сфінкса ( :param path:тощо), див. Розширення Наполеона .
Бені Чернявський-Паскін

3
Якщо ви хочете задокументувати ваш проект Python у Markdown за допомогою Sphinx, проголосуйте за запит на функцію на bitbucket.org/birkenfeld/sphinx/issue/825/…
полковник Паніка

1
Дивлячись на цей коментар, здається, що ви можете змішати два: read-the-docs.readthedocs.org/en/latest/…
Стефан ван дер Уолт

2
Основна підтримка Markdown нарешті пробилася в Сфінкс: дивіться нову відповідь
Олівер Бедвальтер

Відповіді:


97

"Правильним" способом зробити це було б написання документального аналізатора для розмітки . (Плюс опція Sphinx для вибору аналізатора.) Краса цього була б миттєвою підтримкою всіх вихідних форматів документів (але вам це може бути не байдуже, оскільки подібні засоби розмітки вже існують для більшості). Способи наблизитись до цього, не розробляючи парсер з нуля:

  1. Ви можете обдурити і написати "аналізатор", який використовує Pandoc для перетворення розмітки в RST і передачі цього в RST аналізатору :-).

  2. Ви можете використовувати існуючий розміт-> XML-аналізатор і трансформувати результат (використовуючи XSLT?) В схему docutils.

  3. Ви можете взяти деякий існуючий аналізатор розмітки python, який дозволяє визначити користувальницький рендер і змусити його будувати дерево вузлів документів.

  4. Ви можете роздрібнити наявний RST-зчитувач, викресливши все, що не має значення для розмітки та зміни різних синтаксисів ( це порівняння може допомогти) ...
    EDIT: Я не рекомендую цей маршрут, якщо ви не готові сильно його перевірити. У Markdown вже є занадто багато тонко різних діалектів, і це, ймовірно, призведе до ще одного-іншого ...

ОНОВЛЕННЯ: https://github.com/sgenoud/remarkdown - це програма для читання відміток для документів. Він не взяв жодного з перерахованих вище ярликів, але використовує граматику PEG петрушки, натхненну позначкою прив'язки .

  • Ще не підтримує директиви.

ОНОВЛЕННЯ: https://github.com/readthedocs/recommonmark і є ще одним читачем документів, підтримується в ReadTheDocs. Отриманий із зауваження, але використовує аналізатор CommonMark-py .

  • Це може конвертувати конкретні більш-менш природні синтаксиси Markdown у відповідні структури, наприклад, список посилань на toctree. * Не має загального нативного синтаксису для ролей.
  • Підтримує вбудовування будь- якого вмісту rST, включаючи директиви, з ```eval_rstогородженим блоком , а також скороченням директив DIRECTIVE_NAME:: ....

ОНОВЛЕННЯ : MyST - це ще одна документація / читач сфінксів. На основі розмітки, сумісний із CommonMark.

  • Має загальний {ROLE_NAME}`...`синтаксис ролей.
  • Має загальний синтаксис для директив із ```{DIRECTIVE_NAME} ...огородженими блоками.

У всіх випадках вам потрібно буде винайти розширення Markdown, щоб представити директиви та ролі Сфінкса . Хоча вам можуть не знадобитися всі вони, деякі подібні .. toctree::є важливими.
Це я вважаю найважчою частиною. reStructuredText до розширень Sphinx був уже багатшим, ніж розмітка. Навіть сильно розширений розміт, такий як pandoc , є здебільшого набором функцій rST. Це багато ґрунту для вкриття!

Найпростішим у впровадженні є додавання загальної конструкції для вираження будь-якої ролі / директиви документів. Очевидними кандидатами для натхнення синтаксису є:

  • Синтаксис атрибутів, який pandoc та деякі інші реалізації вже дозволяють на багатьох вбудованих та блокових конструкціях. Наприклад `foo`{.method}-> `foo`:method:.
  • HTML / XML З<span class="method">foo</span> найяскравішого підходу просто вставляти документи у внутрішній XML!
  • Якась YAML для директив?

Але таке загальне відображення не буде найвищим рішенням для відмітки… Наразі найактивніші місця для обговорення розширень розмітки - https://groups.google.com/forum/#!topic/pandoc-discuss , https: // github.com/scholmd/scholmd/

Це також означає, що ви не можете просто використати аналізатор розмітки, не розширивши його якось. Pandoc знову переживає свою репутацію швейцарського армійського ножа перетворення документів, підтримуючи власні фільти . (Насправді, якби я підійшов до цього, я б спробував побудувати загальний міст між читачами / трансформерами / сценаристами та читачами пандоків / фільтрами / сценаристами. Це більше, ніж потрібно, але окупність буде набагато ширшою, ніж просто сфінкс / відмітка.)


Альтернативна божевільна ідея: замість того, щоб розширювати розмітку для обробки Sphinx, розширити reStructuredText для підтримки (в основному) суперсети розмітки! Краса полягає в тому, що ви зможете використовувати будь-які функції Сфінкса як є, але зможете записувати більшу частину вмісту у розмітку.

Вже є значне перекриття синтаксису ; найбільш помітний синтаксис зв'язку є несумісним. Я думаю, якщо ви додасте підтримку RST для посилань на розмітку та ###заголовки -style і зміните `backticks`роль за замовчуванням на буквальну, і, можливо, зміните відрізні блоки на літеральні (RST підтримує > ...котирування в наші дні), ви отримаєте щось корисне, що підтримує більшість відміток .


17
Я роблю висновок із недостатнього прогресу в цій галузі, ReST може бути достатньо хорошим і не досить різним, тому Markdown для такого починання вартий того.
Проф. Фолкен

5
TLDR: Використовуйте рекомендаційну позначку для написання документації на Сфінкс за допомогою Markdown.
ostrokach

пропоную додати нове myst-parserдо цієї відповіді. це виграє.
Рік підтримує Моніку

92

Ви можете використовувати Markdown та reStructuredText в одному проекті Sphinx. Як це зробити коротко задокументовано в програмі Read The Docs .

Встановіть рекомендаційну позначку ( 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 і передзвонити 0,4.0.


4
Такий підхід Бені згадує у своїй вичерпній відповіді вище . Однак я вважаю, що це питання заслуговує на цю просту відповідь.
Марійн

2
Важливо прочитати Recommonmark.readthedocs.org/en/latest/auto_structify.html , особливо як створити toctree та як використовувати eval_rstогороджений блок для вставки будь-якої конструкції / директиви rST.
Бені Чернявський-Паскін

для цього потрібно встановити рекомендацію та
загальну позначку

1
Я потрапляю ImportError: cannot import name 'DocParser'на Sphinx 1.4.1 під Python 3.4.3.
грудня

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 тут дуже добре працювали і для документації для кінцевих користувачів. Все ще хочеться використовувати розмітку в docstrings ..
Маркус Оттоссон

2
Стільки так для цього.
jkmacc

1
Гей, дякую - MkDocs - це приголомшливо! Я втрачаю багато енергії та можливостей порівняно зі Sphinx та RST, це точно ... але це дивовижно непросте, спрощене та таке просте та швидке використання. Ідеально підходить для майже всіх моїх випадків використання - наприклад, коротких інструкцій із встановлення та підручника з швидкого запуску з деякими прикладами. У кількох випадках, де мені потрібно пояснити багато вихідного коду - документацію про клас дзвінків і функцію виклику функцій - я все-таки дотримуюся Сфінкса.
Брут

На момент написання цього документа він підтримує лише два рівні відступу TOC.
wrygiel

@wrygiel Ви не зовсім праві - кількість наданих рівнів TOC залежить від теми, яку ви використовуєте.
Але

27

Оновлення: це зараз офіційно підтримується і задокументовано у документах сфінкса .

Схоже, основна реалізація зробила шлях до Сфінкса, але слово ще не обійшло. Дивіться коментар випуску 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.
Роджер Даль

1
Посилання на документи сфінкса повинні бути sphinx-doc.org/en/master/usage/markdown.html
Пол Браннан

21

Markdown і ReST роблять різні речі.

RST надає об'єктну модель для роботи з документами.

Розмітка надає спосіб гравірування шматочків тексту.

Здається розумним хотіти посилатись на ваші шматочки вмісту Markdown з вашого проекту сфінксів, використовуючи RST, щоб заглушити загальну архітектуру інформації та потік більшого документа. Нехай розмітка робить те, що вона робить, що дозволяє письменникам зосередитись на написанні тексту.

Чи є спосіб посилатися на домен розмітки, просто гравірувати вміст таким, яким він є? RST / сфінкс, здається, піклувався про такі функції, як toctreeне дублюючи їх у відмітці.


5
"Здається розумним хотіти посилатися на ваші шматочки вмісту Markdown з вашого проекту сфінксів" - це власне те, що я хочу зробити; Я хочу включити деякий вміст розмітки (мій README.md) у свою більш вичерпну документацію щодо Сфінкса. Чи знаєте ви, чи можливо це?
detly


8

Я пішов із пропозицією Бені використати pandoc для цього завдання. Після встановлення наступний скрипт перетворить усі файли розмітки у вихідному каталозі в перші файли, так що ви можете просто записати всю документацію в розмітку. Сподіваюся, це корисно для інших.

#!/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 Я не дуже знайомий з pandoc, і я не дуже його пробував, але, мабуть, має сенс. Що ж, добре. Я намагався. Я думаю, ви можете подати звіт про помилку?
the_drow

@WiktorWalc: ..toctreeнедійсний синтаксис Markdown. Ви або пишете весь документ у Markdown (і втрачаєте смаки ReSt), або використовуєте ReST. Ви не можете мати свій торт і їсти його теж.
Aditya

1
лише натяк: рішенням буде використовувати фільтри pandoc, щоб пропустити ці спеціальні інструкції та залишити їх такими, як є у вихідному поколінні. Я не є майстром фільтрів pandoc, але це додає додаткової складності схемі.
змо


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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.