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", когда он явно отличается, здесь не по теме и лучше спросить самих авторов.