Untersuchen, was in Python als Markdown-Parser verwendet werden kann

Ich möchte ein Markdown-Dokument manipulieren.

Wenn ich solche Dinge in Python nachgeschlagen habe, scheint es üblich zu sein, Markdown in HTML zu konvertieren. Wenn Sie stattdessen mit Dokumenten im Markdown-Format arbeiten möchten, müssen Sie in der Lage sein, so etwas wie AST zu verwenden. Da an sich nicht viel war, suchte ich nach etwas, das als Basis für den Umbau dienen könnte.

Grundwissen

Das Verwalten eines Markdown-Dokuments ist schwierig.

Angenommen, Sie möchten eine Oleore-Erweiterung (Nanbuwks-Erweiterung) erstellen, die eine bestimmte Vorlage einfügt, wenn Sie den folgenden Kommentar in den Satz schreiben.


[](nanbuwks:template)

Ist es möglich, einfach eine Zeichenfolge nach Makrdown-Text zu suchen / zu ersetzen?

――Nein, wenn diese Zeile im Codeblock enthalten ist, müssen Sie sie ignorieren.

Schließlich müssen Sie die Markdown-Dokumentstruktur analysieren, um festzustellen, ob sie als Rohtext betrachtet werden kann, und dann die Zeichenfolge suchen / ersetzen.

Dies ist nicht nur auf die Oleore-Erweiterung beschränkt, sondern auch auf das Ändern des Bildpfads, das Ändern der Überschriftenebene, die automatische Formatierung usw.

・ ・ ・ Wie analysiere ich die Dokumentstruktur von Markdown?

Allgemeiner Parser

Im Allgemeinen scheint es Markdown in HTML auszugeben.

Markdown → Talkerizer → Dokumentstrukturdaten → Renderer → Ausgabe in HTML

Wird sein. Stellen Sie sich Folgendes vor.

Sprecher

So was?

--markdown hat Block- und Span-Level

Dokumentstrukturdaten

Speichern Sie die vom Sprecher untersuchte Dokumentstruktur in internen Daten Dokumentstrukturdaten haben eine Baumstruktur

Renderer

Rekonstruieren Sie das Dokument, indem Sie Tags und Steuertext basierend auf den Dokumentstrukturdaten hinzufügen. Im Allgemeinen gibt es hier viele Dinge, um HTML zu erstellen.

Was du willst

Diejenigen, die rohen Markdown betreiben können

Wenn Sie die Dokumentstrukturdaten erhalten können, indem Sie sie mit der ursprünglichen Markdown-Textstruktur verknüpfen, können Sie unter Bezugnahme auf die Dokumentstruktur arbeiten. Aber ich konnte es nicht finden. Dann wollte ich so etwas machen, indem ich versuchte, das vorhandene zu modifizieren, aber es scheint viel Zeit zu dauern, also gab ich dieses Mal auf.

Was kann Markdown aus abstrakten Daten machen

Markdown kann aus Dokumentstrukturdaten und -kontext neu generiert werden. Da es sich jedoch um abstrakte Daten handelt, kann das Originaldokument nicht vollständig reproduziert werden. Gibt es so etwas nicht, weil es in Ordnung ist? → Es schien nicht da zu sein.

Diejenigen, die abstrakte Daten ausgeben können

Können Sie so etwas wie AST bekommen? Es scheint keine Ausgabe zu geben, ohne den Code zu ändern.

(Hinzugefügt am 4. Januar 2020. Ich habe einige Dinge gefunden, die später von Markdown in JSON konvertiert werden können. Ich habe die Details nicht untersucht, aber sie haben möglicherweise die Anforderungen erfüllt.)

Dinge, die Markdown aus abstrakten Daten machen könnten

Es scheint, dass Markdown durch Ändern des vorhandenen Codes ausgegeben werden kann. Ist es einfach, weitere Funktionen hinzuzufügen, wenn dies möglich ist?

Umfrage

Untersuchen Sie mit den folgenden Anforderungen

Python-Markdown

https://github.com/Python-Markdown/markdown Es fühlt sich an wie eine Standardbibliothek. Es gibt viele Plug-Ins. Es scheint jedoch nicht in etwas anderes als HTML konvertiert zu sein. Zum Beispiel scheint Markdown-LaTeX auch die Inline-Markdown-LaTeXTEX-Notation in Markdown in HTML zu konvertieren. Ich habe aufgegeben, weil es scheint, dass es anders ist als das, was ich will.

commonmark.py

https://github.com/readthedocs/commonmark.py

Commonmark-Port zu Python. Die gemeinsame Marke wird mit der Standardidee von Markdown erstellt. Die Referenzimplementierung ist unten. https://github.com/commonmark/commonmark.js

Ich konzentriere mich auf den Referenzteil und gebe auf, weil er anscheinend nicht für die Anwendung geeignet ist.

mistune

Die Verarbeitung scheint schnell zu sein Version2 ist am 12.12.2019 erschienen, aber ab dem 1.1.2019 ist 0.8.4 auf Ubuntu pip3 installiert. Ich habe Folgendes getan, um die neueste Version zu installieren.


$ sudo pip3 install git+https://github.com/lepture/mistune.git

Geben Sie wegen fehlender Dokumentation auf

mistletoe

Standardmäßig hat Mistel zusätzlich zu HTML eine Ausgabe an LaTeX.

Es scheint einfach zu bedienen zu sein, daher werde ich es darauf aufbauen.

Was ich nach der Umfrage gelernt habe

Derjenige, der gut zu sein scheint, der herauskam, nachdem er die obigen vier untersucht und mit Mistel gemacht hatte. Ich habe es nicht richtig überprüft, aber ich werde eine andere Gelegenheit nutzen.

pycmark

https://github.com/tk0miya/pycmark

Es gibt eine Beschreibung, dass "aufgrund der Erweiterbarkeit flexibles Parsen wie die Unterstützung von GFM (GitHub Flavored Markdown) und das Hinzufügen der ursprünglichen Notation möglich ist". https://www.papercall.io/speakers/tk0miya/speaker_talks/78833-markdown

marko

https://pypi.org/project/marko/#extend-marko

Among all implementations of Python's markdown parser, it is a common issue that user can't easily extend it to add his own features. ein.

Recommended Posts

Untersuchen, was in Python als Markdown-Parser verwendet werden kann
Ein Datensatz, den GAMEBOY mit Python nicht erstellen konnte. (PYBOY)
33 Zeichenfolgen, die in Python nicht als Variablennamen verwendet werden sollten
Tkinter konnte nicht in Python importiert werden
Was passiert, wenn Sie in Python "A, B als C importieren"?
Ich habe versucht, ein scheinbar Windows-Snipper-Tool mit Python zu implementieren
Um Japanisch mit Python in der Docker-Umgebung verwenden zu können
Geben Sie in Python einen Unterbefehl als Befehlszeilenargument an
Eine Code-Sammlung, die häufig in persönlichem Python verwendet wird
Listenverständnis, da operator.methodcaller nicht mit Python 2.5 verwendet werden kann
So zeigen Sie DataFrame als Tabelle in Markdown an
Operatoren ++, - können nicht in Python verwendet werden (Unterschied zu PHP)
Markdown mit Python behandeln
Kann bei Wettkampfprofis eingesetzt werden! Python-Standardbibliothek
[Redash] Die Standardbibliothek kann nicht in der Python-Funktion verwendet werden
Was bedeutet das letzte () in einer Funktion in Python?
Was scheint eine Vorlage für den Standardeingabe-Teil des Competition Pro in Python3 zu sein
Das Graustufenbild wird in OpenCV / Python als Farbbild angezeigt
Skripte, die bei der Verwendung von Bottle in Python verwendet werden können
Machen Sie einen Screenshot in Python
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Lesezeichen in Python
Zeichne ein Herz in Python
Was ich in Python gelernt habe
Compiler in Python: PL / 0-Parser
Führen Sie den Ausgabecode auf dem lokalen Webserver in Python als "A, gibt vor, B zu sein" aus
[Python] Ein Memo häufig verwendeter Phrasen in Python-Skripten
Was tun, wenn in Python minus Null angezeigt wird?
Ein Timer (Ticker), der im Feld verwendet werden kann (kann überall verwendet werden)
Neue Funktionen in Python 3.9 (1) - Der Summensatzoperator kann im Wörterbuchtyp verwendet werden.
Zusammenfassung der Standardeingabe von Python, die in Competition Pro verwendet werden kann
Eine Klasse, die häufig verwendete Methoden in Twitter API (Python) zusammenfasst.
Rufen Sie die Formel in der Excel-Datei als Zeichenfolge in Python ab
Ich habe einen Tri-Tree geschrieben, der für die Implementierung von Hochgeschwindigkeitswörterbüchern in D-Sprache und Python verwendet werden kann
[Python] Was ist eine Zip-Funktion?
Wahrscheinlich in einer Nishiki-Schlange (Originaltitel: Vielleicht in Python)
[Python] Was ist eine with-Anweisung?
Schreiben Sie eine Dichotomie in Python
Verwenden Sie Pymol als Python-Bibliothek
[Python] Verwalten Sie Funktionen in einer Liste
Drücken Sie einen Befehl in Python (Windows)
8 häufig verwendete Befehle in Python Django
Erstellen Sie einen DI-Container mit Python
Zeichnen Sie eine Streudiagrammmatrix mit Python
ABC166 in Python A ~ C Problem
Schreiben Sie A * (A-Stern) -Algorithmen in Python
[Python] Grundkenntnisse in AtCoder
Verwenden Sie Blender als Python-Modul
Löse ABC036 A ~ C mit Python
Schreiben Sie ein Kreisdiagramm in Python
Schreiben Sie das Vim-Plugin in Python
Schreiben Sie eine Suche mit Tiefenpriorität in Python
Implementierung eines einfachen Algorithmus in Python 2
Löse ABC037 A ~ C mit Python
Starten Sie das Python-Skript im Dienst
Führen Sie einen einfachen Algorithmus in Python aus