Как бы вы пошли на разбор Markdown? [закрытый]




Edit: недавно я узнал о проекте под названием CommonMark, который
правильно идентифицирует и разбирается с неоднозначностями в оригинале
Спецификация уценки. http://commonmark.org/ он имеет большую библиотеку C#
поддержка.




вы можете найти синтаксис здесь.



источник, который следует за загрузкой, написан в Perl, который я не собираюсь чтить. Он пронизан регулярными выражения, и он полагается на MD5 хэши, чтобы избежать некоторых символов. Что-то здесь не так!



Я собираюсь жестко закодировать парсер для Markdown. Какой опыт с этим?



Если у вас нет ничего значимого, чтобы сказать о фактическом разборе Markdown, избавьте меня от времени. (Это может показаться суровым, но да, я ищу понимание, а не решение, то есть стороннюю библиотеку).



чтобы немного помочь ответы, регулярные выражения предназначены для выявить закономерности! Не разбирать всю грамматику. То, что люди считают это foobar.




  • если вы думаете о Markdown, это принципиально основано на концепции абзацев.

  • таким образом, разумный подход может заключаться в том, чтобы разделить ввод на пункты.

  • есть много видов абзацев, например, заголовок, текст, список, blockquote и код.

  • в таким образом, задача состоит в том, чтобы определить эти пункты и в каком контексте они происходят.


Я вернусь с решением, как только найду его достойным быть разделенным.

733   10  

10 ответов:

единственная реализация markdown, о которой я знаю, которая использует фактический парсер, это Джон Макфарлин ' s peg-markdown. его парсер на основе Синтаксический Анализ Грамматики Выражений генератор парсеров под названием peg.


EDIT:Маурисио Фернандес недавно вышел его простая разметка Markdown parser, который он написал в рамках своего OcsiBlog Движок Блога. Потому что парсер написан в OCaml, это очень простой и короткий (268 SLOC для парсер, 43 Слок для HTML-код излучатель), но все же невероятно быстро (на 20% быстрее, чем скидка (написано от руки-оптимизированный C) и sixhundred раза быстрее, чем BlueCloth (Рубин)), несмотря на то, что он еще даже не оптимизирован для производительности. Потому что он предназначен только для внутреннего использования самим Маурисио для своего блога, есть несколько отклонений от официальная спецификация Markdown, но Маурисио создал ветвь, которая отменяет большинство этих изменений.

на прошлой неделе я выпустил новую реализацию Java Markdown на основе парсера под названием pegdown. pegdown использует синтаксический анализатор PEG для первого построения абстрактного синтаксического дерева, которое впоследствии записывается в HTML. Таким образом, он довольно чистый и гораздо легче читать, поддерживать и расширять, чем подход на основе регулярных выражений. Грамматика PEG основана на реализации John MacFarlanes C "peg-markdown".

может что-то интересное для вас...

Если бы я попытался разобрать markdown (и его расширение Markdown extra) Я думаю, что я бы попытался использовать машину состояний и анализировать ее по одному символу за раз, связывая вместе некоторые внутренние структуры, представляющие биты текста, когда я иду дальше, как только все будет проанализировано, генерируя вывод из объектов, которые все строятся вместе.

в принципе, я бы построил мини-DOM-подобное дерево, когда я читаю входной файл.
Чтобы сгенерировать вывод, я бы просто пересек дерево и вывел HTML или что-нибудь еще (PS, LaTex, RTF,...)

вещи, которые могут увеличить уровень сложности:

  • тот факт, что вы можете смешивать HTML и markdown, хотя правило может быть легко реализовать: просто игнорируйте все, что находится между двумя сбалансированными тегами, и выводите его дословно.

  • URL-адреса и заметки могут иметь свою ссылку в нижней части текста. Использование структур данных для гиперссылок может просто записать что-то например:

    [my text to a link][linkkey]
    results in a structure like: 
        URLStructure: 
        |  InnerText : "my text to a link"
        |  Key       : "linkkey"
        |  URL       : <null>
    
  • заголовки могут быть определены с подчеркиванием, что может заставить нас использовать простую структуру данных для общего абзаца и изменять его свойства при чтении файла:

    ParagraphStructure:
    |  InnerText    : the current paragraph text 
    |                 (beginning of line until end of line).
    |  HeadingLevel : <null> or 1-4 when we can assess 
    |                 that paragraph heading level, if any.
    

в любом случае, просто некоторые мысли.

Я уверен, что есть много мелких деталей, о которых нужно позаботиться, и я уверен, что регулярные выражения могут стать удобными во время процесса.
Ведь они были предназначены для обработки текста.

Я бы, вероятно, прочитал спецификацию синтаксиса достаточно раз, чтобы знать ее и понять, как ее анализировать.

чтение существующего кода парсера, конечно, блестяще, как для того, чтобы увидеть, что кажется основным источником сложности, так и если используются какие-либо специальные умные трюки. Использование контрольной суммы MD5 кажется немного странным, но я недостаточно изучил код, чтобы понять, почему это делается. Комментарий в подпрограмме под названием _EscapeSpecialChars() гласит:

мы замена каждого такого символа соответствующим значением контрольной суммы MD5; это, вероятно, перебор, но это должно помешать нам столкнуться с побегом значения случайно.

замена одного символа на полный MD5 действительно кажется экстравагантным, но, возможно, это действительно имеет смысл.

конечно, было бы разумно рассмотреть возможность создания" истинного " синтаксиса для такого инструмента, как гибкий график работы чтобы выбраться из болота регулярных выражений.

Если Perl не ваша вещь, есть реализации Markdown в по крайней мере, 10 других языков. Они, вероятно, не все имеют 100% совместимость, но, как правило, довольно близко.

MarkdownPapers - это еще одна реализация Java, синтаксический анализатор которой определен в JavaCC грамматика.

существуют библиотеки, доступные на нескольких языках, включая php, ruby, java, c#, javascript. Я бы предложил посмотреть на некоторые из них для идей.

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

регулярные выражения работают в Perl, потому что Perl и регулярные выражения являются лучшими друзьями.

Если вы используете язык программирования, который имеет более трех других пользователей, вы должны быть в состоянии найти библиотеку, чтобы разобрать его для вас. Один быстрый Google-ing показывает библиотеки для CL, Haskell, Python, JavaScript, Ruby и так далее. Крайне маловероятно, что вам понадобится чтобы изобрести это колесо.

Если вам действительно нужно написать его с нуля, я рекомендую написать правильный парсер. С помощью этой техники вам не придется избегать вещей с хэшами MD5. (Я согласен, что если вы нужно сделать что-то вроде этого, пришло время пересмотреть свой дизайн.)

Markdown-это JAWL (просто еще один язык Вики)

есть много Вики с открытым исходным кодом там, что вы можете изучить код парсера. Большинство используют регулярное выражение

Проверьте screwturn wiki, имеет интересный многопроходный конвейер форматирования, очень хороший метод - см. /core/Formatter.cs и / core / FormatterPipeline.cs

лучше всего использовать / присоединиться к существующему проекту, такие вещи всегда намного сложнее, чем они кажутся

здесь Вы можете найти JavaScript-реализацию Markdown. Он также сильно зависит от регулярных выражений, так как это просто самый быстрый и простой способ разбора текста.

но это щадит часть MD5.

Я не могу помочь непосредственно с кодированием парсинга, но, возможно, эта ссылка может помочь вам так или иначе.

Comments

    Ничего не найдено.