Bearbeiten: Ich habe kürzlich von einem Projekt namens CommonMark erfahren, das die Mehrdeutigkeiten in der ursprünglichen Markdown-Spezifikation korrekt identifiziert und behandelt. http://commonmark.org/ Es bietet hervorragende Unterstützung für die C # -Bibliothek.
Die Syntax finden Sie hier .
Die Quelle, die mit dem Download folgt, ist in Perl geschrieben , was ich nicht zu ehren beabsichtige. Es ist voller regulärer Ausdrücke und basiert auf MD5- Hashes, um bestimmten Zeichen zu entkommen. Daran stimmt einfach etwas nicht!
Ich bin dabei, einen Parser für Markdown hart zu codieren . Was ist Erfahrung damit?
Wenn Sie nichts Sinnvolles über das eigentliche Parsen von Markdown zu sagen haben, sparen Sie mir die Zeit. (Das mag hart klingen, aber ja, ich suche nach Einsicht, nicht nach einer Lösung, dh nach einer Bibliothek eines Drittanbieters.)
Um ein bisschen bei den Antworten zu helfen, sollen reguläre Ausdrücke Muster identifizieren ! NICHT eine ganze Grammatik zu analysieren. Dass die Leute dies in Betracht ziehen, ist foobar.
- Wenn Sie an Markdown denken, basiert es im Wesentlichen auf dem Konzept der Absätze.
- Daher könnte ein vernünftiger Ansatz darin bestehen, die Eingabe in Absätze aufzuteilen.
- Es gibt viele Arten von Absätzen, z. B. Überschrift, Text, Liste, Blockzitat und Code.
- Die Herausforderung besteht daher darin, diese Absätze zu identifizieren und in welchem Kontext sie auftreten.
Ich werde mit einer Lösung zurück sein, sobald ich finde, dass es sich lohnt, geteilt zu werden.
Antworten:
Der einzige Abschlag Implementierung ich kenne, die einen tatsächlichen Parser verwendet, ist Jon MacFarleane ‚s peg-Abschlag . Sein Parser basiert auf einem Parser-Generator der Parsing Expression Grammar namens peg .
EDIT: Mauricio Fernandez hat kürzlich seinen Simple Markup Markdown Parser veröffentlicht , den er als Teil seiner OcsiBlog Weblog Engine geschrieben hat. Da der Parser in geschrieben OCaml , ist es extrem einfach und kurz (268 SLOC für den Parser , 43 SLOC für die HTML - Emitter ), noch blazingly schnell (20% schneller als Rabatt (geschrieben in der Hand optimierte C) und sixhundred mal schneller als BlueCloth ( Ruby)), obwohl es noch nicht einmal für die Leistung optimiert ist. Da es nur für den internen Gebrauch durch Mauricio selbst für sein Weblog vorgesehen ist, gibt es einige Abweichungen von der offiziellen Markdown-Spezifikation , aber Mauricio hat einen Zweig erstellt, der die meisten dieser Änderungen rückgängig macht .
quelle
Ich habe letzte Woche eine neue parserbasierte Markdown Java-Implementierung namens pegdown veröffentlicht . pegdown verwendet einen PEG-Parser, um zunächst einen abstrakten Syntaxbaum zu erstellen, der anschließend in HTML geschrieben wird. Als solches ist es ziemlich sauber und viel einfacher zu lesen, zu warten und zu erweitern als ein auf Regex basierender Ansatz. Die PEG-Grammatik basiert auf der Implementierung "peg-markdown" von John MacFarlanes C.
Vielleicht etwas, das Sie interessiert ...
quelle
Wenn ich versuchen würde, Markdown (und seine Erweiterung Markdown extra ) zu analysieren , würde ich versuchen, eine Zustandsmaschine zu verwenden und jeweils ein Zeichen zu analysieren, indem ich einige interne Strukturen, die Textbits darstellen, einmal miteinander verknüpfe Alles wird analysiert, wodurch die Ausgabe der Objekte generiert wird, die alle aneinandergereiht sind.
Grundsätzlich würde ich beim Lesen der Eingabedatei einen Mini-DOM-ähnlichen Baum erstellen.
Um eine Ausgabe zu generieren, würde ich einfach den Baum durchlaufen und HTML oder etwas anderes ausgeben (PS, LaTex, RTF, ...)
Dinge, die die Komplexität erhöhen können:
Die Tatsache, dass Sie HTML und Markdown mischen können, obwohl die Regel leicht zu implementieren sein könnte: Ignorieren Sie einfach alles, was zwischen zwei ausgeglichenen Tags liegt, und geben Sie es wörtlich aus.
URLs und Notizen können am Ende des Textes referenziert werden. Die Verwendung von Datenstrukturen für Hyperlinks könnte einfach Folgendes aufzeichnen:
Überschriften können mit einer Unterstreichung definiert werden, die uns zwingen könnte, eine einfache Datenstruktur für einen generischen Absatz zu verwenden und seine Eigenschaften beim Lesen der Datei zu ändern:
Wie auch immer, nur ein paar Gedanken.
Ich bin mir sicher, dass es viele kleine Details gibt, um die man sich kümmern muss, und ich bin mir ziemlich sicher, dass Regexes während des Prozesses nützlich sein könnten.
Schließlich sollten sie Text verarbeiten.
quelle
Ich würde die Syntaxspezifikation wahrscheinlich oft genug lesen, um sie zu kennen und ein Gefühl dafür zu bekommen, wie man sie analysiert.
Das Lesen des vorhandenen Parser-Codes ist natürlich brillant, sowohl um zu sehen, was die Hauptursache für Komplexität zu sein scheint, als auch um spezielle clevere Tricks zu verwenden. Die Verwendung von MD5-Prüfsummen scheint etwas seltsam, aber ich habe den Code nicht genug studiert, um zu verstehen, warum er ausgeführt wird. Ein Kommentar in einer Routine namens
_EscapeSpecialChars()
Staaten:Das Ersetzen eines einzelnen Zeichens durch ein vollständiges MD5 scheint extravagant, ist aber vielleicht wirklich sinnvoll.
Natürlich wäre es klug, eine "echte" Syntax zu erstellen, damit ein Tool wie Flex aus dem Regex-Sumpf herauskommt.
quelle
Wenn Perl nicht Ihr Ding ist, gibt es Markdown-Implementierungen in mindestens 10 anderen Sprachen . Sie sind wahrscheinlich nicht alle zu 100% kompatibel, liegen aber eher nahe beieinander.
quelle
MarkdownPapers ist eine weitere Java-Implementierung, deren Parser in einer JavaCC- Grammatik definiert ist.
quelle
Wenn Sie eine Programmiersprache verwenden, die mehr als drei andere Benutzer hat, sollten Sie in der Lage sein, eine Bibliothek zu finden, um sie für Sie zu analysieren. Ein schnelles Google-ing enthüllt Bibliotheken für CL, Haskell, Python, JavaScript, Ruby und so weiter. Es ist sehr unwahrscheinlich, dass Sie dieses Rad neu erfinden müssen.
Wenn Sie es wirklich von Grund auf neu schreiben müssen, empfehle ich, einen geeigneten Parser zu schreiben. Mit dieser Technik müssen Sie mit MD5-Hashes nicht entkommen. (Ich bin damit einverstanden, dass es Zeit ist, Ihr Design zu überdenken, wenn Sie so etwas tun müssen.)
quelle
Es gibt Bibliotheken in einer Reihe von Sprachen, einschließlich PHP, Ruby, Java, C #, Javascript. Ich würde vorschlagen, einige davon nach Ideen zu durchsuchen.
Es hängt davon ab, welche Sprache Sie verwenden möchten. Für die beste Implementierung gibt es idiomatische und nicht idiomatische Möglichkeiten.
Regexes funktionieren in Perl, weil Perl und Regex beste Freunde sind.
quelle
Markdown ist eine JAWL (nur eine andere Wiki-Sprache)
Es gibt viele Open-Source-Wikis, in denen Sie den Code des Parsers überprüfen können. Die meisten verwenden REGEX
Schauen Sie sich das Screwturn-Wiki an, es hat eine interessante Multi-Pass-Formatierer-Pipeline, eine sehr schöne Technik - siehe /core/Formatter.cs und /core/FormatterPipeline.cs
Am besten ist es, ein bestehendes Projekt zu verwenden / daran teilzunehmen. Diese Art von Dingen ist immer viel schwieriger als sie erscheinen
quelle
Hier finden Sie eine JavaScript-Implementierung von Markdown. Es stützt sich auch stark auf reguläre Ausdrücke, da dies nur der schnellste und einfachste Weg ist, den Text zu analysieren.
Aber es schont den MD5-Teil.
Ich kann nicht direkt bei der Codierung der Analyse helfen, aber vielleicht kann dieser Link Ihnen auf die eine oder andere Weise helfen.
quelle