«Правильный» способ сделать это - написать анализатор документов для уценки. (Плюс опция Sphinx для выбора синтаксического анализатора.) Красота этого заключается в мгновенной поддержке всех форматов вывода documenttils (но вы можете не заботиться об этом, так как подобные инструменты уценки уже существуют для большинства). Способы подойти к этому без разработки парсера с нуля:
Вы можете обмануть и написать «парсер», который использует Pandoc для преобразования уценки в RST и передачи его в парсер RST: -).
Вы можете использовать существующий анализатор markdown-> XML и преобразовать результат (используя XSLT?) В схему Docutils.
Вы можете взять существующий синтаксический анализатор разметки Python , который позволит вам определить пользовательский рендерер и заставить его построить дерево узлов документирования.
Вы можете раскошелиться на существующий RST-ридер, вырвать все, что не имеет отношения к уценке, и изменить различные синтаксисы ( это сравнение может помочь) ...
РЕДАКТИРОВАТЬ: я не рекомендую этот маршрут, если вы не готовы тщательно его протестировать. У Markdown уже слишком много тонко отличающихся диалектов, и это, вероятно, приведет к еще одному-другому ...
ОБНОВЛЕНИЕ: https://github.com/sgenoud/remarkdown - программа чтения уценок для документов. Для этого не потребовалось ни одного из указанных выше сочетаний клавиш, но использовалась грамматика Parsley PEG, вдохновленная peg-markdown . Еще не поддерживают директивы.
ОБНОВЛЕНИЕ: https://github.com/rtfd/recommonmark и еще одно средство чтения документов, изначально поддерживаемое в ReadTheDocs. Получено из комментария, но использует синтаксический анализатор CommonMark-py . Не поддерживает директивы, но может преобразовать более или менее естественный синтаксис Markdown в соответствующие структуры, например список ссылок на тектри. Для других нужд ```eval_rst
огражденный блок позволяет встраивать любую директиву rST.
Во всех случаях вам нужно будет изобрести расширения Markdown для представления директив и ролей Sphinx . Хотя вам может не понадобиться все из них, некоторые, как .. 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 снова оправдывает свою репутацию швейцарского армейского ножа конвертации документов, поддерживая нестандартные филе . (На самом деле, если бы я подошел к этому, я бы попытался построить общий мост между читателями / преобразователями / авторами документов и читателями / фильтрами / писателями pandoc. Это больше, чем вам нужно, но выигрыш был бы намного шире, чем просто сфинкс / уценки.)
Альтернативная сумасшедшая идея: вместо расширения уценки для обработки Sphinx, расширьте reStructuredText для поддержки (в основном) супернабора уценки! Прелесть в том, что вы сможете использовать любые функции Sphinx как есть, но сможете писать большую часть контента в уценке.
Уже значительное синтаксическое перекрытие ; прежде всего синтаксис ссылок несовместим. Я думаю, что если вы добавите поддержку RST для ссылок на разметку и заголовки в стиле ###
, и поменяете роль по умолчанию `backticks`
на литерал, и, возможно, замените блоки с отступом на буквальные (в настоящее время RST поддерживает > ...
для цитат), вы Вы получите что-то полезное, что поддерживает большинство уценки.