Новая версия библиотеки — и снова множество нововведений. Конечно же, главным изменением стала поддержка новой версии спецификации CommonMark за номером 0.21. В ней поменялась обработка символа ’, из-за чего пришлось не только переписать значительную часть кода, но и поправить библиотеку комбинаторов парcеров (parsers), на которой базируется md_proc. Второе значительно изменение спецификации — новые правила разбора встроенных html-блоков. На мой взгляд, всё стало проще и логичнее.
Я давно ничего не писал об этом моём проекте. Но это совершенно не значит, что он забыт и заброшен. Конечно, он не в самой активной фазе разработки, тем не менее обновления я публикую с некоторой периодичностью. В первую очередь период связан с обновлениями спецификации CommonMark. Нынешняя версия библиотеки (0.5.0) реализует спецификацию 0.20.
Кроме того, с момента предыдущего поста были добавлены следующие нововведения:
Поддержка умной пунктуации, т.е. автоматическая замена
...
,---
,--
,"
и'
на соответствующий типографический символ.Поддержка автоматический генерации ссылок по имени. Это может быть полезно, например, для разбора markdown из DartDoc-комментариев. Таким образом можно передать парсеру функцию, которая будет заниматься всеми теми ссылками, для которых известно только имя.
Continuous Integration с помощью Travis и покрытие кода на Coveralls. По крайней мере, подключение этих систем к проекту было интересным опытом.
Как обычно, библиотеку можно взять на GitHub или pub.dartlang.
Продолжаю работать над библиотекой для работы с CommonMark. Следующий этап — генерация Markdown из AST — готов. Теперь можно использовать библиотеку для автоматического преобразования Markdown. Собственно, это то, к чему я стремлюсь. Но до завершения, к сожалению, ещё далеко. Во-первых, сама спецификация CommonMark ещё не готова, а во-вторых, для использования библиотеки с теми файлами, что у меня уже есть, неплохо было бы реализовать некоторое количество расширений, выходящих за рамки официальной спецификации.
План на ближайшее будущее:
- Продолжать следовать изменениям в спецификации.
- Реализовать некоторые расширения Markdown из pandoc (формулы, сноски и прочее). Затем преобразовать их в расширения CommonMark по мере их принятия в стандарт.
- Код для преобразования абстрактного синтаксического дерева. Я пока не слишком много думал об этом, поэтому всякие советы только приветствуются.
Как обычно, библиотеку можно взять на GitHub или pub.dartlang.
Обновил парсер CommonMark, написанный на Dart. Теперь он соответствует версии 0.12 спецификации. Правда один из тестов не проходит, но исключительно из-за ошибки в самом тесте. Ошибку уже поправили, так что следующая версия спецификации выйдет без неё.
Сама спецификация несколько поменялась со времени публикации предыдущей версии парсера. Самое крупное изменение: теперь можно использовать вложенные emphasis и strong. Например:
*Это *вложенный* emphasis*
**Это **вложенный** strong**
Не знаю, насколько это применимо на практике, но, видимо, изменению спецификации предшествовало продолжительное обсуждение.
В общем, милости прошу за библиотекой на GitHub или pub.dartlang.
Все началось с того, что мне понадобился парсер для Markdown, который строит AST, а не пытается сразу выдавать готовый HTML. А ещё было желательно, чтобы парсер был написан на Dart, так как проект я собирался писать именно на этом языке. Но, к сожалению, обнаружился только один парсер для Markdown, написанный на Dart. Поэтому идею пришлось отложить до лучших времён и сесть за написание своего велосипеда парсера.
Примерно через неделю после начала появилась спецификация CommonMark, которая помогла избавиться от некоторых вопросов, правда ценой полного переписывания: некоторые концепции из спецификации никак не хотели ложиться на уже написанный код.
И вот, спустя месяц, я рад вам представить свою реализацию, которая проходит все тесты CommonMark. И да, она позволяет получить AST для последующей обработки.
Библиотека md_proc на GitHub, pub.dartlang.
В самых ближайших планах реализовать восстановление Markdown обратно из AST, а также поддержка самых распространённых и нужных расширений, вроде TexMath, Footnotes, Smart punctuation и других. Ну и, конечно, поддержка совместимости с CommonMark тоже обязательно будет, тем более, что CommonMark ещё должен немного поменяться до того, как будет опубликована официальная версия 1.0. И уже после этого можно будет вернуться к первоначальному проекту.