flexmark-java — это реализация синтаксического анализатора CommonMark (спецификация 0.28) на языке Java, в которой сначала используются блоки, а затем встраиваются после архитектуры синтаксического анализа Markdown.
Его сильными сторонами являются скорость, гибкость, AST на основе исходных элементов Markdown с детализацией исходной позиции вплоть до отдельных символов лексем, составляющих элемент, и расширяемость.
API обеспечивает детальный контроль процесса анализа и оптимизирован для анализа с большим количеством установленных расширений. Анализатор и расширения имеют множество опций для поведения анализатора и вариантов рендеринга HTML. Конечная цель состоит в том, чтобы синтаксический анализатор и средство визуализации могли имитировать другие анализаторы с большой степенью точности. Теперь это частично завершено с реализацией эмуляции процессора Markdown.
Мотивацией для этого проекта была необходимость заменить парсер pegdown в моем плагине Markdown Navigator для IDE JetBrains. pegdown имеет отличный набор функций, но его скорость в целом далека от идеальной, а при патологическом вводе либо зависает, либо практически зависает во время синтаксического анализа.
Для версий 0.62.2 или ниже: Java 8 или выше, совместимость с Java 9+. Для версий 0.64.0 или выше — Java 11 или выше.
Проект находится на Maven: com.vladsch.flexmark
Ядро не имеет никаких зависимостей, кроме org.jetbrains:annotations:24.0.1
. Расширения см. в описании расширения ниже.
API все еще развивается для внедрения новых расширений и функций.
Для Maven добавьте flexmark-all
в качестве зависимости, которая включает ядро и все модули, в следующий пример:
<зависимость> <groupId>com.vladsch.flexmark</groupId> <artifactId>flexmark-all</artifactId> <версия>0.64.8</версия> </зависимость>
Источник: BasicSample.java.
пакет com.vladsch.flexmark.samples;импорт com.vladsch.flexmark.util.ast.Node;импорт com.vladsch.flexmark.html.HtmlRenderer;импорт com.vladsch.flexmark.parser.Parser;импорт com.vladsch.flexmark .util.data.MutableDataSet;public class BasicSample { public static void main(String[] args) { Опции MutableDataSet = новый MutableDataSet(); // раскомментируйте, чтобы установить дополнительные расширения //options.set(Parser.EXTENSIONS, Arrays.asList(TablesExtension.create(), StrikethroughExtension.create())); // раскомментируем, чтобы преобразовать мягкие разрывы в жесткие //options.set(HtmlRenderer.SOFT_BREAK, "<br />n"); Парсер parser = Parser.builder(options).build(); Средство рендеринга HtmlRenderer = HtmlRenderer.builder(options).build(); // Вы можете повторно использовать экземпляры парсера и рендерера Node document = parser.parse("This is *Sparta*"); Строка html = renderer.render(документ); // "<p>Это <em>Спарта</em></p>n" System.out.println(html); } }
реализация 'com.vladsch.flexmark:flexmark-all:0.64.8'
Дополнительные настройки из-за дубликатов файлов:
Варианты упаковки { исключить «META-INF/LICENSE-LGPL-2.1.txt» исключить «META-INF/LICENSE-LGPL-3.txt» исключить «META-INF/LICENSE-W3C-TEST» исключить 'META-INF/DEPENDENCIES'}
Более подробную информацию можно найти в документации:
Wiki Главная Примеры использования Подробности о расширениях Написание расширений
Класс PegdownOptionsAdapter
преобразует флаги pegdown Extensions.*
в параметры flexmark и список расширений. Pegdown Extensions.java
включен для удобства и новых опций, которых нет в Pegdown 1.6.0. Они расположены в модуле flexmark-profile-pegdown
но вы можете получить исходный код из этого репозитория: PegdownOptionsAdapter.java, Extensions.java и создать свою собственную версию, модифицированную в соответствии с потребностями вашего проекта.
Вы можете передать флаги расширения в статический PegdownOptionsAdapter.flexmarkOptions(int)
или создать экземпляр PegdownOptionsAdapter
и использовать удобные методы для установки, добавления и удаления флагов расширения. PegdownOptionsAdapter.getFlexmarkOptions()
каждый раз будет возвращать новую копию DataHolder
с параметрами, отражающими флаги расширения привязки.
импорт com.vladsch.flexmark.html.HtmlRenderer;импорт com.vladsch.flexmark.parser.Parser;импорт com.vladsch.flexmark.profile.pegdown.Extensions;импорт com.vladsch.flexmark.profile.pegdown.PegdownOptionsAdapter;импорт com .vladsch.flexmark.util.data.DataHolder;публичный класс PegdownOptions {final частные статические ОПЦИИ DataHolder = PegdownOptionsAdapter.flexmarkOptions( Extensions.ALL ); статический окончательный анализатор PARSER = Parser.builder(OPTIONS).build(); статический окончательный HtmlRenderer RENDERER = HtmlRenderer.builder(OPTIONS).build(); // используем PARSER для анализа и RENDERER для рендеринга с совместимостью с привязкой}
Эмуляция привязки flexmark-java по умолчанию использует менее строгий анализ блоков HTML, который прерывает блок HTML на пустой строке. Pegdown прерывает блок HTML на пустой строке только в том случае, если все теги в блоке HTML закрыты.
Чтобы приблизиться к исходному поведению анализа блока HTML с привязкой, используйте метод, который принимает boolean strictHtml
:
импорт com.vladsch.flexmark.html.HtmlRenderer;импорт com.vladsch.flexmark.parser.Parser;импорт com.vladsch.flexmark.profile.pegdown.Extensions;импорт com.vladsch.flexmark.profile.pegdown.PegdownOptionsAdapter;импорт com .vladsch.flexmark.util.data.DataHolder;публичный класс PegdownOptions {final частные статические ОПЦИИ DataHolder = PegdownOptionsAdapter.flexmarkOptions(true, Extensions.ALL ); статический окончательный анализатор PARSER = Parser.builder(OPTIONS).build(); статический окончательный HtmlRenderer RENDERER = HtmlRenderer.builder(OPTIONS).build(); // используем PARSER для анализа и RENDERER для рендеринга с совместимостью с привязкой}
Также доступен образец с настраиваемым преобразователем ссылок, который включает преобразователь ссылок для изменения URL-адресов или атрибутов ссылок, а также настраиваемый модуль визуализации узлов, если вам нужно переопределить сгенерированный HTML-код ссылки.
flexmark-java имеет гораздо больше расширений и опций конфигурации, чем pegdown, в дополнение к расширениям, доступным в pegdown 1.6.0. Доступные расширения через PegdownOptionsAdapter
Основная реорганизация и очистка кода реализации в версии 0.60.0, см. Версия-0.60.0-Изменения. Благодаря отличной работе Алекса Карезина вы можете получить обзор зависимостей модулей с возможностью детализации до пакетов и классов.
Merge API для объединения нескольких документов с уценкой в один документ.
Расширение Docx Renderer: обработка узлов с ограниченными атрибутами
Расширяемый модуль конвертера HTML в Markdown: flexmark-html2md-converter. Пример: HtmlToMarkdownCustomizedSample.java
Совместимость модулей Java9+
Составные нумерованные ссылки Расширение нумерованных ссылок для создания допустимой нумерации элементов и заголовков.
Расширение макросов, позволяющее вставлять произвольное содержимое уценки в виде блочных или встроенных элементов, что позволяет использовать блочные элементы там, где синтаксисом разрешены только встроенные элементы.
GitLab Flavored Markdown для анализа и рендеринга расширений уценки GitLab.
Модуль OSGi предоставлен Дэном Клко (GitHub @klcodanr)
Медиа-теги Расширение преобразователя медиа-ссылок любезно предоставлено Корнелией Шульц (GitHub @CorneliaXaos) преобразует ссылки с использованием пользовательских префиксов в теги HTML5 Audio, Embed, Picture и Video.
API-интерфейс Translation Helper, упрощающий перевод документов с уценкой.
Предупреждение. Создавать побочный контент в блочном стиле. Полную документацию см. в документации Расширение Admonition, Материал для MkDocs.
Перечисляемая ссылка для создания нумерованных ссылок для рисунков, таблиц и других элементов уценки.
Атрибуты для анализа атрибутов формы {name name=value name='value' name="value" #id .class-name}
атрибутов.
YouTube Embedded Link Transformer благодаря Вячеславу Бойко (GitHub @bvn13) преобразует простые ссылки на видео YouTube во встроенный HTML-код iframe видео.
Конвертер Docx с использованием библиотеки docx4j. Как использовать: Образец DocxConverter, как настроить: Настройка рендеринга Docx
Разработка этого модуля спонсировалась Johner Institut GmbH.
Обновите библиотеку, чтобы она соответствовала CommonMark (спецификация 0.28), и добавьте ParserEmulationProfile.COMMONMARK_0_27
и ParserEmulationProfile.COMMONMARK_0_28
чтобы разрешить выбор определенных параметров версии спецификации.
Пользовательский API рендеринга узлов с возможностью вызова стандартного рендеринга для переопределенного узла, что позволяет выполнять настраиваемый рендеринг узлов, который обрабатывает только особые случаи, а остальные визуализируются как обычно. пользовательский преобразователь ссылок
Расширения Gfm-Issues и Gfm-Users для анализа и рендеринга #123
и @user-name
соответственно.
Опция глубокого анализа блоков HTML для лучшей обработки тегов необработанного текста, которые идут после других тегов, а также для совместимости с анализом блоков HTML.
Модуль flexmark-all
, который включает в себя: ядро, все расширения, форматтер, конвертеры JIRA и YouTrack, модуль профиля привязки и преобразование HTML в Markdown.
Модуль вывода PDF Вывод PDF с использованием Open HTML To PDF
Типографика реализована
Расширение макросов XWiki
Джекилл Теги
HTML в уценку
Плагин генератора страниц Maven Markdown
Модуль Markdown Formatter для вывода AST в виде уценки с опциями форматирования.
Таблицы для Markdown Formatter с шириной столбца и выравниванием таблиц уценки:
Вход | Выход |
---|---|
day|time|spent :---|:---:|--: nov. 2. tue|10:00|4h 40m nov. 3. thu|11:00|4h nov. 7. mon|10:20|4h 20m total:|| 13h | | day | time | spent | |:------------|:-----:|--------:| | nov. 2. tue | 10:00 | 4h 40m | | nov. 3. thu | 11:00 | 4h | | nov. 7. mon | 10:20 | 4h 20m | | total: || 13h | |
Я использую flexmark-java в качестве анализатора плагина Markdown Navigator для IDE JetBrains. Я обычно использую последнюю, неизданную версию, чтобы исправить ошибки или получить улучшения. Поэтому, если вы обнаружите ошибку, которая мешает вашему проекту, или увидите ошибку на странице проблем GitHub, помеченную fixed for next release
, которая влияет на ваш проект, дайте мне знать, и я смогу оперативно выпустить новый выпуск для решения этой проблемы. ваша проблема. В противном случае я позволю исправлениям ошибок и улучшениям накапливаться, думая, что то, что уже исправлено, ни на кого не повлияет.
В API есть множество вариантов расширения с их целевым использованием. Хорошим мягким стартом является модуль flexmark-java-samples
, который содержит простые примеры для запрошенных расширений. Следующее лучшее место — это источник существующего расширения, синтаксис которого аналогичен тому, что вы хотите добавить.
Если ваше расширение соответствует правильному API, задача обычно будет очень короткой и приятной. Если ваше расширение использует API непреднамеренным образом или не следует ожидаемым протоколам обслуживания, вы можете столкнуться с тяжелой битвой с крысиным гнездом обработки условий if/else и исправлением одной ошибки, приводящей только к созданию другой.
Как правило, если для добавления простого расширения требуется более нескольких десятков строк, то либо вы делаете это неправильно, либо в API отсутствует точка расширения. Если вы посмотрите на все реализованные расширения, вы увидите, что большинство из них представляют собой несколько строк кода, отличных от шаблона, продиктованного API. В этом и заключается цель этой библиотеки: предоставить расширяемое ядро, позволяющее легко писать расширения.
Более крупные расширения — это flexmark-ext-tables
и flexmark-ext-spec-example
, объем обоих составляет около 200 строк кода. Вы можете использовать их в качестве ориентира для оценки размера вашего расширения.
Мой собственный опыт добавления расширений показывает, что иногда новый тип расширения лучше всего решать с помощью усовершенствования API, чтобы сделать его реализацию бесшовной, или путем исправления ошибки, которая не была видна до того, как расширение правильно нагрузило API. Ваше предполагаемое расширение может быть именно тем, которое требует такого подхода.
Вывод таков: если вы хотите реализовать расширение или функцию, не стесняйтесь открывать проблему, и я подскажу вам, как лучше всего это сделать. Это может сэкономить вам много времени, позволив мне улучшить API для удовлетворения потребностей вашего расширения, прежде чем вы приложите к этому много бесплодных усилий.
Я прошу вас осознать, что я главный повар и мойщик бутылок в этом проекте, не имея ни капли вулканских навыков объединения разумов. Я прошу вас описать, что вы хотите реализовать, потому что я не могу читать ваши мысли. Пожалуйста, проведите некоторую разведку исходного кода и документации, потому что я не могу передать вам то, что знаю, без вашего желания.
Если у вас есть коммерческое приложение и вы не хотите писать расширения самостоятельно или хотите сократить время и усилия по реализации расширений и интеграции flexmark-java, свяжитесь со мной. Я доступен на консультационной/контрактной основе.
Несмотря на свое название, commonmark не является ни надмножеством, ни подмножеством других разновидностей уценки. Скорее, он предлагает стандартную, недвусмысленную спецификацию синтаксиса для исходного, «основного» Markdown, тем самым эффективно представляя еще одну разновидность. Хотя flexmark по умолчанию совместим с Commonmark, его парсер можно настраивать различными способами. Наборы настроек, необходимые для эмуляции наиболее часто используемых парсеров уценки, доступны во flexmark как ParserEmulationProfiles
.
Как следует из названия ParserEmulationProfile
, только синтаксический анализатор настраивается под конкретный вариант уценки. Применение профиля не добавляет функций, помимо тех, которые доступны в commonmark. Если вы хотите использовать flexmark для полной эмуляции поведения другого процессора уценки, вам необходимо настроить анализатор и настроить расширения flexmark, которые предоставляют дополнительные функции, доступные в анализаторе, который вы хотите имитировать.
Перезапись парсера списка для лучшего управления эмуляцией других процессоров уценки в соответствии с эмуляцией процессоров Markdown завершена. Добавление предустановок процессора для эмуляции конкретного поведения обработки уценки этими парсерами входит в короткий список задач.
Некоторые семейства эмуляции лучше справляются с эмуляцией своей цели, чем другие. Большая часть усилий была направлена на имитацию того, как эти процессоры анализируют стандартный Markdown и, в частности, синтаксический анализ, связанный со списками. Для процессоров, которые расширяют исходный Markdown, вам нужно будет добавить те расширения, которые уже реализованы в flexmark-java, в параметры компоновщика Parser/Renderer.
Расширения будут изменены для включения собственных предустановок для эмуляции конкретного процессора, если для этого процессора реализовано эквивалентное расширение.
Если вы обнаружите несоответствие, пожалуйста, откройте проблему, чтобы ее можно было устранить.
Реализованы основные семейства процессоров, а также некоторые члены семейства:
Джекилл
CommonMark для последней реализованной спецификации, в настоящее время CommonMark (спецификация 0.28)
Лига/CommonMark
CommonMark (спецификация 0.27) для совместимости с конкретной версией
CommonMark (спецификация 0.28) для совместимости с конкретной версией
Комментарии на GitHub
Markdown.pl
PHP Markdown Экстра
GitHub Docs (старый парсер уценки GitHub)
Крамдаун
Фиксированный отступ
Мультимаркдаун
Пегдаун
профили для инкапсуляции деталей конфигурации для вариантов внутри семейства были добавлены в версии 0.11.0:
CommonMark (по умолчанию для семейства): ParserEmulationProfile.COMMONMARK
Фиксированный отступ (по умолчанию для семейства): ParserEmulationProfile.FIXED_INDENT
Комментарии GitHub (только CommonMark): ParserEmulationProfile.COMMONMARK
Старая документация GitHub: ParserEmulationProfile.GITHUB_DOC
Kramdown (по умолчанию для семейства): ParserEmulationProfile.KRAMDOWN
Markdown.pl (по умолчанию для семейства): ParserEmulationProfile.MARKDOWN
Мультимаркдаун: ParserEmulationProfile.MULTI_MARKDOWN
Pegdown: с расширениями Pegdown используйте PegdownOptionsAdapter
в flexmark-profile-pegdown
Привязка, без расширений привязки ParserEmulationProfile.PEGDOWN
Правила анализа блоков HTML с привязкой без расширений привязки ParserEmulationProfile.PEGDOWN_STRICT
flexmark-java — это ответвление проекта commonmark-java, модифицированное для создания AST, отражающего все элементы в исходном источнике, полного отслеживания позиции исходного кода для всех элементов в AST и упрощенной генерации PsiTree с помощью JetBrains Open API.
API был изменен, чтобы обеспечить более детальный контроль над процессом анализа, и оптимизирован для анализа с большим количеством установленных расширений. Анализатор и расширения имеют множество настроек поведения анализатора и вариантов рендеринга HTML. Конечная цель состоит в том, чтобы синтаксический анализатор и средство визуализации могли имитировать другие анализаторы с большой степенью точности.
Мотивацией для этого послужила необходимость замены парсера pegdown в плагине Markdown Navigator. pegdown имеет отличный набор функций, но его скорость в целом далека от идеальной, а при патологическом вводе либо зависает, либо практически зависает во время синтаксического анализа.
commonmark-java имеет отличную архитектуру синтаксического анализа, которую легко понять и расширить. Цель заключалась в том, чтобы гарантировать, что добавление отслеживания позиции источника в AST не уменьшит простоту анализа и генерации AST больше, чем это абсолютно необходимо.
Причинами выбора commonmark-java в качестве парсера являются: скорость, простота понимания, простота расширения и скорость. Теперь, когда я переработал ядро и добавил несколько расширений, я чрезвычайно доволен своим выбором.
Другая цель состояла в том, чтобы улучшить способность расширений изменять поведение синтаксического анализатора, чтобы любой диалект уценки мог быть реализован через механизм расширения. Был добавлен расширяемый API параметров, позволяющий устанавливать все параметры в одном месте. Синтаксический анализатор, средство рендеринга и расширения используют эти параметры для настройки, включая отключение некоторых анализаторов основных блоков.
Эта работа находится в стадии разработки и включает множество изменений API. Никаких попыток сохранить обратную совместимость API с исходным проектом и до тех пор, пока набор функций не будет практически завершен, не предпринимается, даже с более ранними версиями этого проекта.
Особенность | Flexmark-Java | Commonmark-Java | привязка |
---|---|---|---|
Относительное время анализа (чем меньше, тем лучше) | 1x (1) | от 0,6x до 0,7x (2) | 25x в среднем, 20 000x до ∞ для патологических входных данных (3) |
Все исходные элементы в AST | |||
Элементы AST с исходной позицией | с некоторыми ошибками и особенностями | ||
AST можно легко манипулировать | Постобработка AST — это механизм расширения. | Постобработка AST — это механизм расширения. | не вариант. Информация о родительском узле отсутствует, дочерние элементы представлены в виде List<>. |
Элементы AST имеют подробное исходное положение для всех частей. | только начало/конец узла | ||
Можно отключить основные функции синтаксического анализа | |||
Базовый парсер, реализованный через API расширения. | instanceOf тестирует определенные классы синтаксического анализатора блоков и узлов. | ядро предоставляет несколько точек расширения | |
Легко понять и изменить реализацию парсера. | один парсер PEG со сложными взаимодействиями (3) | ||
Разбор элементов блока независим друг от друга | все в одной грамматике PEG | ||
Единая конфигурация для парсера, рендеринга и всех расширений. | нет, кроме списка расширений | битовые флаги int для ядра, нет для расширений | |
Производительность синтаксического анализа оптимизирована для использования с расширениями | анализирует производительность ядра, расширения делают все, что могут | производительность не является особенностью | |
Богатый функционал со множеством опций конфигурации и расширений «из коробки». | ограниченные расширения, нет опций | ||
Определения зависимостей для процессоров, гарантирующие правильный порядок обработки. | порядок, указанный в списке расширений, подвержен ошибкам | неприменимо, ядро определяет, где добавляется обработка расширения |
flexmark-java патологический ввод 100 000 [
анализ за 68 мс, 100 000 ]
за 57 мс, 100 000 вложенных [
]
анализ за 55 мс
патологический ввод commonmark-java: 100 000 [
анализ за 30 мс, 100 000 ]
за 30 мс, 100 000 вложенных [
]
анализ за 43 мс
привязка патологического ввода 17 [
анализируется за 650 мс, 18 [
за 1300 мс
Опции парсера, пункты, отмеченные как элемент задачи, должны быть реализованы, остальные выполнены:
Ручные свободные списки
Нумерованные списки всегда начинаются с 1.
Исправлен отступ элементов списка, элементы должны иметь отступ не менее 4 пробелов.
Удобная опция запуска списка, позволяющая запускать списки, если им не предшествует пустая строка.
Джекилл, передняя часть
Элементы тега Jekyll с поддержкой {% include file %}
, включая Markdown и содержимое файла HTML.
Кодирование URL-адреса ссылки GitBook. Непригодный
Узлы комментариев HTML: блочные и встроенные
URL-адреса многострочных изображений
Пример элемента спецификации
встроенный HTML: все, без комментариев, комментарии
HTML-блоки: все, без комментариев, комментарии.
Сокращения
Сноски
Определения
Оглавление
Зачеркивание
Списки задач
Нет места для заголовка Atx
Нет отступов в заголовке
Жесткие переносы (достигается изменением параметра SOFT_BREAK на "<br />"
)
Вариант смягченных правил управления персоналом
Вики-ссылки
Огороженные кодовые блоки
Якорные ссылки для заголовков с автоматической генерацией идентификатора
Опция Table Spans будет реализована для расширения таблиц.
Wiki-ссылки с GitHub и креольским синтаксисом
Ярлыки эмодзи с использованием параметра URL-адреса эмодзи GitHub
Кавычки
Смартс
Типографский
Расширения GitHub
Синтаксис GitHub
Издательский
Подавить
Расширения процессора
Подавление синтаксиса Commonmark
Я очень доволен решением перейти на парсер на основе commonmark-java для своих собственных проектов. Несмотря на то, что мне пришлось сделать серьезную операцию на его внутренностях, чтобы получить полное отслеживание положения источника и AST, который соответствует исходным элементам, работать с ним одно удовольствие, и теперь приятно расширять его. Если вам не нужен элемент исходного уровня AST или остальная часть того, что добавлено flexmark-java, а CommonMark — ваш целевой анализатор уценки, я рекомендую вам использовать commonmark-java, поскольку это отличный выбор для ваших нужд, и его производительность не страдает. за накладные расходы на функции, которые вы не будете использовать.
Последняя версия, 28 января 2017 г. flexmark-java 0.13.1, intellij-markdown из CE EAP 2017, commonmark-java 0.8.0:
Файл | Commonmark-Java | Flexmark-Java | intellij-уценка | привязка |
---|---|---|---|---|
README-МЕДЛЕННЫЙ | 0,420 мс | 0,812 мс | 2,027 мс | 15,483 мс |
ВЕРСИЯ | 0,743 мс | 1,425 мс | 4,057 мс | 42,936 мс |
CommonMarkSpec | 31,025 мс | 44,465 мс | 600,654 мс | 575,131 мс |
уценка_пример | 8,490 мс | 10,502 мс | 223,593 мс | 983,640 мс |
спецификация | 4,719 мс | 6,249 мс | 35,883 мс | 307,176 мс |
стол | 0,229 мс | 0,623 мс | 0,800 мс | 3,642 мс |
табличный формат | 1,385 мс | 2,881 мс | 4,150 мс | 23,592 мс |
сворачивать | 3,804 мс | 4,589 мс | 16,609 мс | 86,383 мс |
Соотношения выше:
Файл | Commonmark-Java | Flexmark-Java | intellij-уценка | привязка |
---|---|---|---|---|
README-МЕДЛЕННЫЙ | 1.00 | 1,93 | 4,83 | 36,88 |
ВЕРСИЯ | 1.00 | 1,92 | 5,46 | 57,78 |
CommonMarkSpec | 1.00 | 1,43 | 19.36 | 18.54 |
уценка_пример | 1.00 | 1.24 | 26.34 | 115,86 |
спецификация | 1.00 | 1.32 | 7.60 | 65.09 |
стол | 1.00 | 2,72 | 3,49 | 15.90 |
табличный формат | 1.00 | 2.08 | 3.00 | 17.03 |
сворачивать | 1.00 | 1.21 | 4.37 | 22.71 |
общий | 1.00 | 1.41 | 17.47 | 40.11 |
Файл | Commonmark-Java | Flexmark-Java | intellij-уценка | привязка |
---|---|---|---|---|
README-МЕДЛЕННЫЙ | 0,52 | 1.00 | 2,50 | 19.07 |
ВЕРСИЯ | 0,52 | 1.00 | 2,85 | 30.12 |
CommonMarkSpec | 0,70 | 1.00 | 13.51 | 12.93 |
уценка_пример | 0,81 | 1.00 | 21.29 | 93,66 |
спецификация | 0,76 | 1.00 | 5,74 | 49.15 |
стол | 0,37 | 1.00 | 1,28 | 5,85 |
табличный формат | 0,48 | 1.00 | 1.44 | 8.19 |
сворачивать | 0,83 | 1.00 | 3,62 | 18.83 |
общий | 0,71 | 1.00 | 12.41 | 28.48 |
Поскольку эти два файла представляют собой патологические входные данные для привязки, я больше не запускаю их как часть теста, чтобы предотвратить искажение результатов. Результаты здесь для потомков.
Файл | Commonmark-Java | Flexmark-Java | Intellij-уценка | привязка |
---|---|---|---|---|
висеть на привязи | 0,082 мс | 0,326 мс | 0,342 мс | 659,138 мс |
висеть-колышек2 | 0,048 мс | 0,235 мс | 0,198 мс | 1312,944 мс |
Соотношения выше:
Файл | Commonmark-Java | Flexmark-Java | Intellij-уценка | привязка |
---|---|---|---|---|
висеть на привязи | 1.00 | 3,98 | 4.17 | 8048,38 |
висеть-колышек2 | 1.00 | 4,86 | 4.10 | 27207.32 |
общий | 1.00 | 4.30 | 4.15 | 15151,91 |
Файл | Commonmark-Java | Flexmark-Java | Intellij-уценка | привязка |
---|---|---|---|---|
висеть на привязи | 0,25 | 1.00 | 1.05 | 2024.27 |
висеть-колышек2 | 0,21 | 1.00 | 0,84 | 5594,73 |
общий | 0,23 | 1.00 | 0,96 | 3519,73 |
VERSION.md — это файл журнала версий, который я использую для Markdown Navigator.
commonMarkSpec.md — это файл размером 33 тыс. строк, используемый в наборе тестов intellij-markdown для оценки производительности.
spec.txt файл уценки спецификации commonmark в проекте commonmark-java
Hang-pegdown.md — это файл, содержащий одну строку из 17 символов [[[[[[[[[[[[[[[[[
, что приводит к переходу pegdown в гиперэкспоненциальное время анализа.
Hang-pegdown2.md - файл, содержащий одну строку из 18 символов [[[[[[[[[[[[[[[[[[
, что приводит к переходу pegdown в гиперэкспоненциальное время анализа.
Wrap.md — это файл, который я использовал для проверки производительности переноса при наборе текста, но обнаружил, что он не имеет ничего общего с переносом при наборе кода, когда для анализа файла привязке требуется 0,1 секунды. В плагине синтаксический анализ может происходить более одного раза: проход подсветки синтаксиса, проход построения пси-дерева, внешний аннотатор.
markdown_example.md — файл с более чем 10 000 строк, содержащий более 500 КБ текста.
Запросы на включение, проблемы и комментарии приветствуются. Для запросов на вытягивание:
Добавьте тесты новых функций и исправления ошибок, желательно в формате ast_spec.md.
Следуйте существующему стилю, чтобы максимально упростить слияние: отступ в 4 пробела, конечные пробелы обрезаны.
Авторские права (c) 2015–2016 Atlassian и другие.
Copyright (c) 2016-2023, Владимир Шнайдер,
Лицензия BSD (2 пункта), см. файл LICENSE.txt.