CommonMark Parsing ***

Допустим, я хочу разобрать строку ***cat*** в Markdown, используя стандарт CommonMark. Стандарт гласит ( http://spec.commonmark.org/0.28/):

....

Если один найден:

Выясните, есть ли у нас акцент или сильный акцент: если и более близкие и открывающие промежутки имеют длину>= 2, мы имеем сильный, иначе регулярный.

Вставьте узел emph или strong emph соответственно после текстового узла, соответствующего открывателю.

Удалите все разделители между открывателем и доводчиком из стопки разделителей.

Удалите 1 (для обычного emph) или 2 (для сильного emph) разделителей из открывающих и закрывающих текстовых узлов. Если они в результате станут пустыми, удалите их и удалите соответствующий элемент из стека разделителей. Если закрывающий узел удален, сбросьте current_position для следующего элемента в стеке.

....

Исходя из моего прочтения, результат должен быть <em><strong>cat</strong></em> с самого начала <strong> добавлено, ТО <em>, Тем не менее, все онлайн-редакторы уценки я пробовал это в выходных <strong><em>cat</em></strong>, Что мне не хватает?

Вот наглядное представление о том, что, по моему мнению, должно происходить

TextNode[***] TextNode[cat] TextNode[***]

TextNode[*] StrongEmphasis TextNode[cat] TextNode[*]

TextNode[] Сильное выделение Сильное выделение TextNode[кошка] TextNode[]

Акцент Сильный Emphasis TextNode[кошка]

1 ответ

Решение

Важно помнить, что Commonmark и Markdown - это не обязательно одно и то же. Commonmark - это недавний вариант уценки. Большинство анализаторов Markdown существовали и устанавливали свое поведение задолго до того, как была запущена спецификация Commonmark.

В то время как оригинальные правила уценки не комментируют <em> или же <strong> тег должен быть первым в данном примере, фактическим поведением эталонной реализации (markdown.pl) было перечисление <strong> тег перед <em> тег в выводе. Фактически, пакет MarkdownTest, который был создан автором Markdown и markdown.pl, явно требовал вывода (оригинал больше не доступен в Интернете, о котором я знаю, но mdtest является точной копией, история которой не показывает изменений). этот тест с момента первоначального импорта из MarkdownTest). AFAICT, каждый (не Commonmark) анализатор Markdown точно следовал этому поведению.

Спецификация Commonmark пошла другим путем. В спецификации, в частности, говорится в правиле 14 раздела 6.4 (акцент и сильный акцент):

Интерпретация <em><strong>...</strong></em> всегда предпочтительнее <strong><em>...</em></strong>,

... и подкрепляет это примером 444:

***foo***

<p><em><strong>foo</strong></em></p>

Фактически, вы можете видеть, что это именно поведение эталонной реализации Commonmark.

Кроме того, оригинальный вопрос цитируется в Приложении к спецификации, в которой рекомендуется, как реализовать синтаксический анализатор. Хотя это потенциально полезно для создателя синтаксического анализатора, я бы не рекомендовал использовать этот раздел для определения правильной обработки синтаксиса и / или вывода. Вместо этого следует ознакомиться с фактическими правилами; и на самом деле, они явно обеспечивают ожидаемый результат в этом случае. Но этот вопрос касается очевидного несоответствия между реализациями и спецификацией, а не интерпретацией спецификации.

Для более полного сравнения см. Babelmark. За исключением нескольких (полностью) неработающих реализаций, каждый "классический" анализатор Markdown следует markdown.pl, а каждый анализатор Commonmark следует спецификации Commonmark. Следовательно, нет фактического несоответствия между спецификацией и реализациями. Несоответствие между Markdown и Commonmark.

Что касается того, почему авторы Commonmark выбрали другой путь в этом отношении, или почему они настаивают на том, чтобы называть Commonmark " Markdown", когда он явно отличается, здесь не по теме и лучше спросить самих авторов.

Другие вопросы по тегам