flexmark-java ist eine Java-Implementierung des CommonMark-Parsers (Spezifikation 0.28), der zuerst die Blöcke und dann Inlines nach der Markdown-Parsing-Architektur verwendet.
Seine Stärken sind Geschwindigkeit, Flexibilität, auf Markdown-Quellelementen basierendes AST mit Details der Quellposition bis hin zu einzelnen Zeichen von Lexemen, aus denen das Element besteht, und Erweiterbarkeit.
Die API ermöglicht eine detaillierte Steuerung des Parsing-Prozesses und ist für das Parsen mit einer großen Anzahl installierter Erweiterungen optimiert. Der Parser und die Erweiterungen bieten zahlreiche Optionen für das Parserverhalten und HTML-Rendering-Variationen. Das Endziel besteht darin, dass der Parser und der Renderer andere Parser mit einem hohen Maß an Genauigkeit nachahmen können. Mit der Implementierung der Markdown-Prozessor-Emulation ist dies nun teilweise abgeschlossen
Die Motivation für dieses Projekt war die Notwendigkeit, den Pegdown-Parser in meinem Markdown Navigator-Plugin für JetBrains-IDEs zu ersetzen. Pegdown verfügt über einen großartigen Funktionsumfang, aber seine Geschwindigkeit ist im Allgemeinen nicht optimal und bei pathologischen Eingaben bleibt es beim Parsen entweder hängen oder bleibt praktisch hängen.
Für Versionen 0.62.2 oder niedriger, Java 8 oder höher, Java 9+ kompatibel. Für Versionen 0.64.0 oder höher, Java 11 oder höher.
Das Projekt ist auf Maven: com.vladsch.flexmark
Der Kern hat keine anderen Abhängigkeiten als org.jetbrains:annotations:24.0.1
. Informationen zu Erweiterungen finden Sie in der Erweiterungsbeschreibung unten.
Die API wird ständig weiterentwickelt, um neue Erweiterungen und Funktionen zu berücksichtigen.
Fügen Sie für Maven flexmark-all
als Abhängigkeit hinzu, die den Kern und alle Module zum folgenden Beispiel enthält:
<Abhängigkeit> <groupId>com.vladsch.flexmark</groupId> <artifactId>flexmark-all</artifactId> <version>0.64.8</version> </Abhängigkeit>
Quelle: BasicSample.java
Paket com.vladsch.flexmark.samples;import com.vladsch.flexmark.util.ast.Node;import com.vladsch.flexmark.html.HtmlRenderer;import com.vladsch.flexmark.parser.Parser;import com.vladsch.flexmark .util.data.MutableDataSet;public class BasicSample { public static void main(String[] args) { MutableDataSet-Optionen = new MutableDataSet(); // Kommentar entfernen, um optionale Erweiterungen festzulegen //options.set(Parser.EXTENSIONS, Arrays.asList(TablesExtension.create(), StrikethroughExtension.create())); // Kommentar entfernen, um Soft-Breaks in Hard-Breaks umzuwandeln //options.set(HtmlRenderer.SOFT_BREAK, "<br />n"); Parser parser = Parser.builder(options).build(); HtmlRenderer renderer = HtmlRenderer.builder(options).build(); // Sie können Parser- und Renderer-Instanzen wiederverwenden Node document = parser.parse("This is *Sparta*"); String html = renderer.render(document); // "<p>Das ist <em>Sparta</em></p>n" System.out.println(html); } }
Implementierung 'com.vladsch.flexmark:flexmark-all:0.64.8'
Zusätzliche Einstellungen aufgrund doppelter Dateien:
Verpackungsoptionen { 'META-INF/LICENSE-LGPL-2.1.txt' ausschließen 'META-INF/LICENSE-LGPL-3.txt' ausschließen 'META-INF/LICENSE-W3C-TEST' ausschließen 'META-INF/DEPENDENCIES' ausschließen}
Weitere Informationen finden Sie in der Dokumentation:
Wiki-Startseite Anwendungsbeispiele Erweiterungsdetails Erweiterungen schreiben
PegdownOptionsAdapter
-Klasse konvertiert Pegdown Extensions.*
Flags in die Liste der Flexmark-Optionen und -Erweiterungen. Pegdown Extensions.java
ist der Einfachheit halber enthalten und bietet neue Optionen, die in Pegdown 1.6.0 nicht enthalten sind. Diese befinden sich im Modul flexmark-profile-pegdown
, aber Sie können die Quelle aus diesem Repo abrufen: PegdownOptionsAdapter.java, Extensions.java und Ihre eigene Version erstellen, die an die Anforderungen Ihres Projekts angepasst ist.
Sie können Ihre Erweiterungsflags an static PegdownOptionsAdapter.flexmarkOptions(int)
übergeben oder PegdownOptionsAdapter
instanziieren und praktische Methoden verwenden, um Erweiterungsflags festzulegen, hinzuzufügen und zu entfernen. PegdownOptionsAdapter.getFlexmarkOptions()
gibt jedes Mal eine neue Kopie von DataHolder
zurück, wobei die Optionen Pegdown-Erweiterungsflags widerspiegeln.
import com.vladsch.flexmark.html.HtmlRenderer;import com.vladsch.flexmark.parser.Parser;import com.vladsch.flexmark.profile.pegdown.Extensions;import com.vladsch.flexmark.profile.pegdown.PegdownOptionsAdapter;import com .vladsch.flexmark.util.data.DataHolder;public class PegdownOptions { final private static DataHolder OPTIONS = PegdownOptionsAdapter.flexmarkOptions( Extensions.ALL ); static final Parser PARSER = Parser.builder(OPTIONS).build(); static final HtmlRenderer RENDERER = HtmlRenderer.builder(OPTIONS).build(); // Verwenden Sie PARSER zum Parsen und RENDERER zum Rendern mit Pegdown-Kompatibilität}
Die standardmäßige Flexmark-Java-Pegdown-Emulation verwendet eine weniger strenge HTML-Blockanalyse, die einen HTML-Block in einer Leerzeile unterbricht. Pegdown unterbricht einen HTML-Block nur dann in einer Leerzeile, wenn alle Tags im HTML-Block geschlossen sind.
Um dem ursprünglichen Pegdown-HTML-Block-Parsing-Verhalten näher zu kommen, verwenden Sie die Methode, die ein boolean strictHtml
Argument annimmt:
import com.vladsch.flexmark.html.HtmlRenderer;import com.vladsch.flexmark.parser.Parser;import com.vladsch.flexmark.profile.pegdown.Extensions;import com.vladsch.flexmark.profile.pegdown.PegdownOptionsAdapter;import com .vladsch.flexmark.util.data.DataHolder;public class PegdownOptions { final private static DataHolder OPTIONS = PegdownOptionsAdapter.flexmarkOptions(true, Extensions.ALL ); statischer finaler Parser PARSER = Parser.builder(OPTIONS).build(); static final HtmlRenderer RENDERER = HtmlRenderer.builder(OPTIONS).build(); // Verwenden Sie PARSER zum Parsen und RENDERER zum Rendern mit Pegdown-Kompatibilität}
Es ist auch ein Beispiel mit einem benutzerdefinierten Link-Resolver verfügbar, der einen Link-Resolver zum Ändern von URLs oder Attributen von Links und einen benutzerdefinierten Knoten-Renderer enthält, wenn Sie den generierten Link-HTML überschreiben müssen.
Flexmark-Java verfügt zusätzlich zu den in Pegdown 1.6.0 verfügbaren Erweiterungen über viel mehr Erweiterungen und Konfigurationsoptionen als Pegdown. Verfügbare Erweiterungen über PegdownOptionsAdapter
Umfangreiche Neuorganisation und Codebereinigung der Implementierung in Version 0.60.0, siehe Version-0.60.0-Änderungen. Dank der großartigen Arbeit von Alex Karezin erhalten Sie einen Überblick über Modulabhängigkeiten mit der Möglichkeit, einen Drilldown auf Pakete und Klassen durchzuführen.
Merge-API zum Zusammenführen mehrerer Markdown-Dokumente in einem einzigen Dokument.
Docx-Renderer-Erweiterung: Knotenbehandlung mit eingeschränkten Attributen
Erweiterbares HTML-zu-Markdown-Konvertermodul: flexmark-html2md-converter. Beispiel: HtmlToMarkdownCustomizedSample.java
Kompatibilität mit Java9+-Modulen
Zusammengesetzte Aufzählungsreferenzen Aufzählungsreferenzen Erweiterung zum Erstellen einer gültigen Nummerierung für Elemente und Überschriften.
Makros-Erweiterung, um das Einfügen beliebiger Markdown-Inhalte als Block- oder Inline-Elemente zu ermöglichen, sodass Blockelemente verwendet werden können, wenn die Syntax nur Inline-Elemente zulässt.
GitLab Flavored Markdown zum Parsen und Rendern von GitLab-Markdown-Erweiterungen.
OSGi-Modul mit freundlicher Genehmigung von Dan Klco (GitHub @klcodanr)
Medien-Tags Medien-Link-Transformer-Erweiterung mit freundlicher Genehmigung von Cornelia Schultz (GitHub @CorneliaXaos) wandelt Links mithilfe benutzerdefinierter Präfixe in HTML5-Tags für Audio, Einbettung, Bild und Video um.
Übersetzungshilfe-API zur einfacheren Übersetzung von Markdown-Dokumenten.
Hinweis: So erstellen Sie Seiteninhalte im Blockstil. Eine vollständige Dokumentation finden Sie in der Admonition Extension, Material for MkDocs-Dokumentation.
Aufzählungsreferenz zum Erstellen von Aufzählungsreferenzen für Abbildungen, Tabellen und andere Markdown-Elemente.
Attribute zum Parsen von Attributen der Form {name name=value name='value' name="value" #id .class-name}
Attribute.
YouTube Embedded Link Transformer dank Vyacheslav N. Boyko (GitHub @bvn13) wandelt einfache Links zu YouTube-Videos in eingebettetes Video-Iframe-HTML um.
Docx-Konverter unter Verwendung der docx4j-Bibliothek. Verwendung: DocxConverter-Beispiel, Anpassung: Anpassen des Docx-Renderings
Die Entwicklung dieses Moduls wurde von der Johner Institut GmbH gefördert.
Aktualisieren Sie die Bibliothek so, dass sie mit CommonMark (Spezifikation 0.28) kompatibel ist, und fügen Sie ParserEmulationProfile.COMMONMARK_0_27
und ParserEmulationProfile.COMMONMARK_0_28
hinzu, um die Auswahl einer bestimmten Spezifikationsversionsoption zu ermöglichen.
Benutzerdefinierte Knoten-Rendering-API mit der Möglichkeit, Standard-Rendering für einen überschriebenen Knoten aufzurufen, sodass benutzerdefinierte Knoten-Renderings möglich sind, die nur Sonderfälle verarbeiten und den Rest wie gewohnt rendern lassen. Benutzerdefinierter Link-Resolver
Gfm-Issues- und Gfm-Users-Erweiterungen zum Parsen und Rendern von #123
bzw. @user-name
.
Deep-HTML-Block-Parsing-Option für eine bessere Handhabung von Rohtext-Tags, die nach anderen Tags stehen, und für Pegdown-HTML-Block-Parsing-Kompatibilität.
flexmark-all
Modul, das Folgendes umfasst: Kern, alle Erweiterungen, Formatierer, JIRA- und YouTrack-Konverter, Pegdown-Profilmodul und HTML-zu-Markdown-Konvertierung.
PDF-Ausgabemodul PDF-Ausgabe mit Open HTML To PDF
Typografisch umgesetzt
XWiki-Makroerweiterung
Jekyll-Tags
HTML zum Markdown
Maven Markdown Page Generator Plugin
Markdown-Formatierungsmodul zur Ausgabe von AST als Markdown mit Formatierungsoptionen.
Tabellen für Markdown Formatter mit Spaltenbreite und Ausrichtung der Markdown-Tabellen:
Eingang | Ausgabe |
---|---|
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 | |
Ich verwende Flexmark-Java als Parser für das Markdown Navigator-Plugin für JetBrains-IDEs. Ich neige dazu, die neueste, unveröffentlichte Version zu verwenden, um Fehler zu beheben oder Verbesserungen zu erhalten. Wenn Sie also einen Fehler finden, der Ihr Projekt stört, oder auf der Github-Problemseite einen Fehler sehen, der fixed for next release
markiert ist und Ihr Projekt betrifft, lassen Sie es mich bitte wissen, dann kann ich möglicherweise umgehend eine neue Version zur Behebung erstellen Ihr Problem. Andernfalls lasse ich zu, dass sich Fehlerkorrekturen und Verbesserungen ansammeln, in der Annahme, dass niemand von den bereits behobenen Fehlern betroffen ist.
Es gibt viele Erweiterungsmöglichkeiten in der API mit ihrem Verwendungszweck. Ein guter Softstarter ist das Modul flexmark-java-samples
, das einfache Beispiele für gewünschte Erweiterungen enthält. Der nächstbeste Ort ist die Quelle einer vorhandenen Erweiterung, deren Syntax derjenigen ähnelt, die Sie hinzufügen möchten.
Wenn Ihre Erweiterung mit der richtigen API übereinstimmt, ist die Aufgabe normalerweise sehr kurz und bündig. Wenn Ihre Erweiterung die API auf unbeabsichtigte Weise verwendet oder nicht den erwarteten Verwaltungsprotokollen folgt, kann es zu einem harten Kampf mit einem Rattennest aus if/else-Bedingungen und der Behebung eines Fehlers kommen, der nur zur Entstehung eines weiteren führt.
Wenn zum Hinzufügen einer einfachen Erweiterung mehr als ein paar Dutzend Zeilen erforderlich sind, machen Sie im Allgemeinen entweder einen Fehler oder der API fehlt ein Erweiterungspunkt. Wenn Sie sich alle implementierten Erweiterungen ansehen, werden Sie feststellen, dass es sich bei den meisten um ein paar Codezeilen handelt, die nicht von der API vorgegeben werden. Das ist das Ziel dieser Bibliothek: Bereitstellung eines erweiterbaren Kerns, der das Schreiben von Erweiterungen zum Kinderspiel macht.
Die größeren Erweiterungen sind flexmark-ext-tables
und flexmark-ext-spec-example
, der Kern beider umfasst etwa 200 Codezeilen. Sie können sie als Orientierungshilfe für die Größenschätzung Ihrer Erweiterung verwenden.
Meine eigenen Erfahrungen mit dem Hinzufügen von Erweiterungen zeigen, dass ein neuer Erweiterungstyp manchmal am besten mit einer API-Verbesserung angegangen werden kann, um die Implementierung nahtlos zu gestalten, oder indem ein Fehler behoben wird, der vor der Erweiterung nicht sichtbar war und die API genau richtig belastet. Möglicherweise ist gerade Ihre beabsichtigte Erweiterung diejenige, die einen solchen Ansatz erfordert.
Das Fazit lautet: Wenn Sie eine Erweiterung oder eine Funktion implementieren möchten, zögern Sie bitte nicht, ein Problem zu eröffnen, und ich gebe Ihnen Hinweise, wie Sie am besten vorgehen können. Es kann Ihnen viel Zeit sparen, wenn ich die API verbessern kann, um den Anforderungen Ihrer Erweiterung gerecht zu werden, bevor Sie viel vergeblichen Aufwand in sie stecken.
Ich bitte Sie, sich darüber im Klaren zu sein, dass ich bei diesem Projekt Chefkoch und Flaschenreiniger bin, ohne auch nur ein Jota an vulkanischen Mind Melding-Fähigkeiten zu besitzen. Ich bitte Sie, zu beschreiben, was Sie umsetzen möchten, da ich Ihre Gedanken nicht lesen kann. Bitte recherchieren Sie den Quellcode und die Dokumentation im Hintergrund, da ich ohne Ihre freiwillige Anstrengung nicht das, was ich weiß, an Sie weitergeben kann.
Wenn Sie eine kommerzielle Anwendung haben und die Erweiterung(en) nicht selbst schreiben möchten oder den Zeit- und Arbeitsaufwand für die Implementierung von Erweiterungen und die Integration von Flexmark-Java reduzieren möchten, können Sie mich gerne kontaktieren. Ich stehe Ihnen auf Beratungs-/Vertragsbasis zur Verfügung.
Trotz seines Namens ist Commonmark weder eine Obermenge noch eine Teilmenge anderer Markdown-Varianten. Vielmehr schlägt es eine standardmäßige, eindeutige Syntaxspezifikation für den ursprünglichen „Kern“-Markdown vor und führt so effektiv eine weitere Variante ein. Obwohl Flexmark standardmäßig Commonmark-kompatibel ist, kann der Parser auf verschiedene Arten optimiert werden. Die zur Emulation der am häufigsten verwendeten Markdown-Parser erforderlichen Anpassungen sind in Flexmark als ParserEmulationProfiles
verfügbar.
Wie der Name ParserEmulationProfile
andeutet, wird nur der Parser an die spezifische Markdown-Variante angepasst. Durch die Anwendung des Profils werden keine Funktionen hinzugefügt, die über die in commonmark verfügbaren Funktionen hinausgehen. Wenn Sie Flexmark verwenden möchten, um das Verhalten eines anderen Markdown-Prozessors vollständig zu emulieren, müssen Sie den Parser anpassen und die Flexmark-Erweiterungen konfigurieren, die die zusätzlichen Funktionen bereitstellen, die in dem Parser verfügbar sind, den Sie emulieren möchten.
Eine Neufassung des Listenparsers zur besseren Steuerung der Emulation anderer Markdown-Prozessoren gemäß der Markdown-Prozessor-Emulation ist abgeschlossen. Das Hinzufügen von Prozessorvoreinstellungen zur Emulation des spezifischen Markdown-Verarbeitungsverhaltens dieser Parser steht auf einer kurzen Aufgabenliste.
Einige Emulationsfamilien können ihr Ziel besser emulieren als andere. Der größte Teil des Aufwands richtete sich darauf, zu emulieren, wie diese Prozessoren Standard-Markdown und speziell Listen-bezogenes Parsen analysieren. Für Prozessoren, die das ursprüngliche Markdown erweitern, müssen Sie die Erweiterungen, die bereits in Flexmark-Java implementiert sind, zu den Parser/Renderer-Builder-Optionen hinzufügen.
Erweiterungen werden so geändert, dass sie ihre eigenen Voreinstellungen für eine bestimmte Prozessoremulation enthalten, wenn für diesen Prozessor eine entsprechende Erweiterung implementiert ist.
Wenn Sie eine Diskrepanz feststellen, öffnen Sie bitte ein Problem, damit es behoben werden kann.
Wichtige Prozessorfamilien sind implementiert und einige Familienmitglieder außerdem:
Jekyll
CommonMark für die neueste implementierte Spezifikation, derzeit CommonMark (Spezifikation 0,28)
Liga/CommonMark
CommonMark (Spezifikation 0.27) für spezifische Versionskompatibilität
CommonMark (Spezifikation 0.28) für spezifische Versionskompatibilität
GitHub-Kommentare
Markdown.pl
PHP Markdown Extra
GitHub-Dokumente (alter GitHub-Markdown-Parser)
Kramdown
FixedIndent
MultiMarkdown
Pegdown
Profile zum Kapseln von Konfigurationsdetails für Varianten innerhalb der Familie wurden in 0.11.0 hinzugefügt:
CommonMark (Standard für Familie): ParserEmulationProfile.COMMONMARK
FixedIndent (Standard für Familie): ParserEmulationProfile.FIXED_INDENT
GitHub-Kommentare (nur CommonMark): ParserEmulationProfile.COMMONMARK
Alte GitHub-Dokumente: ParserEmulationProfile.GITHUB_DOC
Kramdown (Standard für Familie): ParserEmulationProfile.KRAMDOWN
Markdown.pl (Standard für Familie): ParserEmulationProfile.MARKDOWN
MultiMarkdown: ParserEmulationProfile.MULTI_MARKDOWN
Pegdown, mit Pegdown-Erweiterungen verwenden Sie PegdownOptionsAdapter
in flexmark-profile-pegdown
Pegdown, ohne Pegdown-Erweiterungen ParserEmulationProfile.PEGDOWN
Pegdown-HTML-Block-Parsing-Regeln, ohne Pegdown-Erweiterungen ParserEmulationProfile.PEGDOWN_STRICT
Flexmark-Java ist ein Zweig des Commonmark-Java-Projekts, der geändert wurde, um einen AST zu generieren, der alle Elemente in der Originalquelle widerspiegelt, eine vollständige Quellpositionsverfolgung für alle Elemente im AST und eine einfachere JetBrains Open API-PsiTree-Generierung bietet.
Die API wurde geändert, um eine detailliertere Steuerung des Parsing-Prozesses zu ermöglichen und für das Parsen mit einer großen Anzahl installierter Erweiterungen optimiert. Der Parser und die Erweiterungen verfügen über viele Optimierungsoptionen für das Parser-Verhalten und HTML-Rendering-Varianten. Das Endziel besteht darin, dass der Parser und der Renderer andere Parser mit einem hohen Maß an Genauigkeit nachahmen können.
Der Grund dafür war die Notwendigkeit, den Pegdown-Parser im Markdown Navigator-Plugin zu ersetzen. Pegdown verfügt über einen großartigen Funktionsumfang, aber seine Geschwindigkeit ist im Allgemeinen nicht optimal und bei pathologischen Eingaben bleibt es beim Parsen entweder hängen oder bleibt praktisch hängen.
commonmark-java verfügt über eine hervorragende Parsing-Architektur, die leicht zu verstehen und zu erweitern ist. Das Ziel bestand darin, sicherzustellen, dass das Hinzufügen der Quellpositionsverfolgung im AST die Einfachheit des Parsens und Generierens des AST nicht mehr als unbedingt erforderlich beeinträchtigen würde.
Gründe für die Wahl von Commonmark-Java als Parser sind: Geschwindigkeit, einfache Verständlichkeit, einfache Erweiterbarkeit und Geschwindigkeit. Nachdem ich nun den Kern überarbeitet und einige Erweiterungen hinzugefügt habe, bin ich äußerst zufrieden mit meiner Wahl.
Ein weiteres Ziel bestand darin, die Fähigkeit von Erweiterungen zu verbessern, das Parserverhalten zu ändern, sodass jeder Markdown-Dialekt über den Erweiterungsmechanismus implementiert werden kann. Eine erweiterbare Options-API wurde hinzugefügt, um die Einstellung aller Optionen an einem Ort zu ermöglichen. Parser, Renderer und Erweiterungen nutzen diese Optionen zur Konfiguration, einschließlich der Deaktivierung einiger Kernblockparser.
Dies ist eine laufende Arbeit mit vielen API-Änderungen. Es wird kein Versuch unternommen, die Abwärts-API-Kompatibilität zum Originalprojekt aufrechtzuerhalten und bis der Funktionsumfang größtenteils vollständig ist, nicht einmal zu früheren Versionen dieses Projekts.
Besonderheit | Flexmark-Java | commonmark-java | Pegdown |
---|---|---|---|
Relative Analysezeit (weniger ist besser) | 1x (1) | 0,6x bis 0,7x (2) | 25x Durchschnitt, 20.000x bis ∞ für pathologische Eingabe (3) |
Alle Quellelemente im AST | |||
AST-Elemente mit Quellposition | mit einigen Fehlern und Eigenheiten | ||
AST kann leicht manipuliert werden | Die AST-Nachbearbeitung ist ein Erweiterungsmechanismus | Die AST-Nachbearbeitung ist ein Erweiterungsmechanismus | keine Option. Keine übergeordneten Knoteninformationen, untergeordnete Elemente als Liste<>. |
AST-Elemente verfügen über eine detaillierte Quellposition für alle Teile | nur Knotenanfang/-ende | ||
Kann Kernanalysefunktionen deaktivieren | |||
Kernparser, implementiert über die Erweiterungs-API | instanceOf testet für bestimmte Blockparser- und Knotenklassen | Der Kern macht nur wenige Erweiterungspunkte verfügbar | |
Leicht verständliche und modifizierbare Parser-Implementierung | ein PEG-Parser mit komplexen Interaktionen (3) | ||
Das Parsen von Blockelementen ist unabhängig voneinander | alles in einer PEG-Grammatik | ||
Einheitliche Konfiguration für: Parser, Renderer und alle Erweiterungen | keine über die Erweiterungsliste hinaus | int -Bit-Flags für den Kern, keine für Erweiterungen | |
Parsing-Leistung optimiert für die Verwendung mit Erweiterungen | Parsing-Leistung für den Kern, Erweiterungen tun, was sie können | Leistung ist kein Feature | |
Umfangreicher Funktionsumfang mit vielen Konfigurationsoptionen und sofort einsatzbereiten Erweiterungen | begrenzte Erweiterungen, keine Optionen | ||
Abhängigkeitsdefinitionen für Prozessoren, um die richtige Verarbeitungsreihenfolge zu gewährleisten | Reihenfolge wird durch die Reihenfolge der Erweiterungsliste angegeben, fehleranfällig | Nicht anwendbar, der Kern definiert, wo die Erweiterungsverarbeitung hinzugefügt wird |
Pathologische Flexmark-Java-Eingabe von 100.000 [
Parsen in 68 ms, 100.000 ]
in 57 ms, 100.000 verschachtelten [
]
Parsen in 55 ms
Pathologische Commonmark-Java-Eingabe von 100.000 [
Parsen in 30 ms, 100.000 ]
in 30 ms, 100.000 verschachtelten [
]
Parsen in 43 ms
Pathologische Pegdown-Eingabe von 17 [
analysiert in 650 ms, 18 [
in 1300 ms
Parser-Optionen, als Aufgabenelement markierte Elemente sollen implementiert werden, der Rest ist abgeschlossen:
Manuelle lose Listen
Nummerierte Listen beginnen immer mit 1.
Einzug der Listenelemente korrigiert, Elemente müssen um mindestens 4 Leerzeichen eingerückt werden
Entspannte Listenstartoption, ermöglicht den Start von Listen, wenn keine Leerzeile vorangestellt ist.
Jekyll-Frontsache
Jekyll-Tag-Elemente mit Unterstützung für {% include file %}
, Include Markdown und HTML-Dateiinhalt
GitBook-Link-URL-Codierung. Nicht anwendbar
HTML-Kommentarknoten: Block und Inline
Mehrzeilige Bild-URLs
Spec-Beispielelement
Inline-HTML: alle, Nicht-Kommentare, Kommentare
HTML-Blöcke: alle, Nicht-Kommentare, Kommentare
Abkürzungen
Fußnoten
Definitionen
Inhaltsverzeichnis
Durchgestrichen
Aufgabenlisten
Kein ATX-Header-Platz
Keine Einrückungen in der Kopfzeile
Hard Wraps (erreicht mit der in "<br />"
geänderten Option SOFT_BREAK)
Option für entspannte HR-Regeln
Wiki-Links
Eingezäunte Codeblöcke
Ankerlinks für Header mit automatischer ID-Generierung
Table Spans-Option, die für die Tabellenerweiterung implementiert werden soll
Wiki-Links mit GitHub und kreolischer Syntax
Emoji-Verknüpfungen mit GitHub-Emoji-URL-Option
Zitate
Klugheit
Typografisch
GitHub-Erweiterungen
GitHub-Syntax
Veröffentlichung
Unterdrücken
Prozessorerweiterungen
Unterdrückung der Commonmark-Syntax
Ich bin sehr zufrieden mit der Entscheidung, für meine eigenen Projekte auf einen Commonmark-Java-basierten Parser umzusteigen. Auch wenn ich große Eingriffe in das Innere vornehmen musste, um eine vollständige Quellpositionsverfolgung und AST zu erhalten, die den Quellelementen entsprechen, ist es ein Vergnügen, damit zu arbeiten, und es macht jetzt Freude, es zu erweitern. Wenn Sie kein Element AST auf Quellebene oder den Rest der von Flexmark-Java hinzugefügten Elemente benötigen und CommonMark Ihr Ziel-Markdown-Parser ist, empfehle ich Ihnen, CommonMark-Java zu verwenden, da es eine ausgezeichnete Wahl für Ihre Anforderungen ist und seine Leistung nicht beeinträchtigt für den Mehraufwand an Funktionen, die Sie nicht nutzen werden.
Neueste, 28. Januar 2017 Flexmark-Java 0.13.1, Intellij-Markdown von CE EAP 2017, Commonmark-Java 0.8.0:
Datei | commonmark-java | Flexmark-Java | Intellij-Markdown | Pegdown |
---|---|---|---|---|
README-SLOW | 0,420 ms | 0,812 ms | 2,027 ms | 15,483 ms |
VERSION | 0,743 ms | 1,425 ms | 4,057 ms | 42,936 ms |
commonMarkSpec | 31,025 ms | 44,465 ms | 600,654 ms | 575,131 ms |
markdown_example | 8,490 ms | 10,502 ms | 223,593 ms | 983,640 ms |
spez | 4,719 ms | 6,249 ms | 35,883 ms | 307,176 ms |
Tisch | 0,229 ms | 0,623 ms | 0,800 ms | 3,642 ms |
Tabellenformat | 1,385 ms | 2,881 ms | 4.150 ms | 23,592 ms |
wickeln | 3,804 ms | 4,589 ms | 16,609 ms | 86,383 ms |
Verhältnisse von oben:
Datei | commonmark-java | Flexmark-Java | Intellij-Markdown | Pegdown |
---|---|---|---|---|
README-SLOW | 1,00 | 1,93 | 4,83 | 36,88 |
VERSION | 1,00 | 1,92 | 5.46 | 57,78 |
commonMarkSpec | 1,00 | 1,43 | 19.36 | 18.54 |
markdown_example | 1,00 | 1.24 | 26.34 | 115,86 |
spez | 1,00 | 1.32 | 7,60 | 65.09 |
Tisch | 1,00 | 2,72 | 3.49 | 15,90 |
Tabellenformat | 1,00 | 2.08 | 3,00 | 17.03 |
wickeln | 1,00 | 1.21 | 4.37 | 22.71 |
gesamt | 1,00 | 1.41 | 17.47 | 40.11 |
Datei | commonmark-java | Flexmark-Java | Intellij-Markdown | Pegdown |
---|---|---|---|---|
README-SLOW | 0,52 | 1,00 | 2,50 | 19.07 |
VERSION | 0,52 | 1,00 | 2,85 | 30.12 |
commonMarkSpec | 0,70 | 1,00 | 13.51 | 12.93 |
markdown_example | 0,81 | 1,00 | 21.29 | 93,66 |
spez | 0,76 | 1,00 | 5,74 | 49.15 |
Tisch | 0,37 | 1,00 | 1.28 | 5,85 |
Tabellenformat | 0,48 | 1,00 | 1,44 | 8.19 |
wickeln | 0,83 | 1,00 | 3,62 | 18.83 |
gesamt | 0,71 | 1,00 | 12.41 | 28.48 |
Da diese beiden Dateien die pathologische Eingabe für Pegdown darstellen, führe ich sie nicht mehr als Teil des Benchmarks aus, um eine Verzerrung der Ergebnisse zu verhindern. Die Ergebnisse sind hier für die Nachwelt.
Datei | commonmark-java | Flexmark-Java | Intellij-Markdown | Pegdown |
---|---|---|---|---|
Herunterhängen | 0,082 ms | 0,326 ms | 0,342 ms | 659,138 ms |
hang-pegdown2 | 0,048 ms | 0,235 ms | 0,198 ms | 1312,944 ms |
Verhältnisse von oben:
Datei | commonmark-java | Flexmark-Java | Intellij-Markdown | Pegdown |
---|---|---|---|---|
Herunterhängen | 1,00 | 3,98 | 4.17 | 8048.38 |
hang-pegdown2 | 1,00 | 4,86 | 4.10 | 27207.32 |
gesamt | 1,00 | 4.30 | 4.15 | 15151.91 |
Datei | commonmark-java | Flexmark-Java | Intellij-Markdown | Pegdown |
---|---|---|---|---|
Herunterhängen | 0,25 | 1,00 | 1.05 | 2024.27 |
hang-pegdown2 | 0,21 | 1,00 | 0,84 | 5594,73 |
gesamt | 0,23 | 1,00 | 0,96 | 3519,73 |
VERSION.md ist die Versionsprotokolldatei, die ich für Markdown Navigator verwende
commonMarkSpec.md ist eine 33-KByte-Zeilendatei, die in der Intellij-Markdown-Testsuite zur Leistungsbewertung verwendet wird.
spec.txt Commonmark-Spec-Markdown-Datei im Commonmark-Java-Projekt
hang-pegdown.md ist eine Datei mit einer einzelnen Zeile mit 17 Zeichen [[[[[[[[[[[[[[[[[
wodurch Pegdown in eine hyperexponentielle Analysezeit übergeht.
hang-pegdown2.md eine Datei mit einer einzelnen Zeile mit 18 Zeichen [[[[[[[[[[[[[[[[[[
wodurch Pegdown in eine hyperexponentielle Analysezeit übergeht.
„wrap.md“ ist eine Datei, die ich zum Testen der Wrap-on-Typing-Leistung verwendet habe, nur um festzustellen, dass sie nichts mit dem Wrap-on-Typing-Code zu tun hat, wenn Pegdown 0,1 Sekunden zum Parsen der Datei benötigt. Im Plugin kann das Parsen mehr als einmal erfolgen: Syntax-Highlighter-Pass, Psi-Baum-Building-Pass, externer Annotator.
markdown_example.md ist eine Datei mit mehr als 10.000 Zeilen und mehr als 500 KB Text.
Pull-Anfragen, Probleme und Kommentare sind willkommen. Für Pull-Anfragen:
Fügen Sie Tests für neue Funktionen und Fehlerbehebungen hinzu, vorzugsweise im Format ast_spec.md
Befolgen Sie den vorhandenen Stil, um das Zusammenführen so weit wie möglich zu vereinfachen: Einzug mit 4 Leerzeichen, nachgestellte Leerzeichen gekürzt.
Copyright (c) 2015-2016 Atlassian und andere.
Copyright (c) 2016-2023, Vladimir Schneider,
BSD (2-Klausel) lizenziert, siehe Datei LICENSE.txt.