Ich verwende das universelle Tool zur Konvertierung des Dokumentformats pandoc. Weitere Informationen zu Pandoc finden Sie im Japanischen Benutzerhandbuch.
In einigen Fällen möchten Sie das Dokument jedoch möglicherweise während der Konvertierung geringfügig ändern. Beispielsweise möchten Sie möglicherweise die Link-URLs auf einmal ersetzen, wenn Sie ein in Markdown geschriebenes Dokument in HTML konvertieren. Es ist einfach, mit einem regulären Ausdruck zu konvertieren, aber pandoc bietet tatsächlich eine Filterfunktion. Mit Filtern können Sie den Syntaxbaum der analysierten Dokumente nutzen. Filter können sowohl in Haskell als auch in Pandoc selbst geschrieben werden, aber mechanisch können sie in jeder Sprache geschrieben werden und Python wird offiziell unterstützt.
Wie unten gezeigt, wird der Syntaxbaum des von pandoc analysierten Dokuments in das JSON-Format konvertiert und über die Standardeingabe / -ausgabe an den Filter übergeben (die Abbildung stammt aus dem Handbuch).
source format
↓
(pandoc)
↓
JSON-formatted AST
↓
(filter)
↓
JSON-formatted AST
↓
(pandoc)
↓
target format
Sie können damit intelligente Filter schreiben. Lassen Sie uns zunächst die offiziell bereitgestellten Pandoc-Filter installieren.
pip install pandocfilters
Verwenden Sie dies, um einen Filter zu schreiben, der die Link-URL im Dokument sofort ändert.
convertlink.py
from pandocfilters import toJSONFilter, Link
def myfilter(key, value, format_, meta):
if key == 'Link':
value[1][0] = "prefix/" + value[1][0]
return Link(*value)
if __name__ == "__main__":
toJSONFilter(myfilter)
Geben Sie zum Ausführen die Filteroption an, wenn Sie pandoc ausführen. Beachten Sie, dass Sie "./convertlink.py" schreiben müssen, um das Skript für das aktuelle Verzeichnis anzugeben.
sample.txt
## sample document
text text text
[link](path/to/otherpage)
$ pandoc --filter=./convertlink.py -t markdown sample.txt
sample document
---------------
text text text
[link](prefix/path/to/otherpage)
Ein von pandoc verwendeter Beispielsyntaxbaum (pandoc AST) kann mit pandoc ausgegeben werden. Wenn Sie json angeben, können Sie es im JSON-Format überprüfen. Wenn Sie native angeben, können Sie es im Haskell-Format überprüfen.
$ pandoc -t json sample.txt
[{"unMeta":{}},[{"t":"Header","c":[2,["sample-document",[],[]],[{"t":"Str","c":"sample"},{"t":"Space","c":[]},{"t":"Str","c":"document"}]]},{"t":"Para","c":[{"t":"Str","c":"text"},{"t":"Space","c":[]},{"t":"Str","c":"text"},{"t":"Space","c":[]},{"t":"Str","c":"text"}]},{"t":"Para","c":[{"t":"Link","c":[[{"t":"Str","c":"link"}],["path/to/otherpage",""]]}]}]]
$ pandoc -t native sample.txt
[Header 2 ("sample-document",[],[]) [Str "sample",Space,Str "document"]
,Para [Str "text",Space,Str "text",Space,Str "text"]
,Para [Link [Str "link"]("path/to/otherpage","")]]
Details zum Format finden Sie in Text.Pandoc.Definition Documentation.
Die Filteroptionsspezifikation entspricht auch der folgenden Befehlspipeline, die beim Debuggen verwendet werden kann.
$ pandoc -t json sample.txt | python ./convertlink.py | pandoc -f json -t markdown
Recommended Posts