Wie bereits erwähnt, habe ich mich in den letzten Wochen etwas mit Python-Programmierung beschäftigt.
Nun bin ich bei der Anforderungsanalyse für mein nächstes Projekt auf den Gedanken gekommen, dass es schön wäre, wenn ich ein kleines Tool hätte, mit dem ich fix Markdown-Dateien in HTML konvertieren kann. Mir beginnt Markdown nämlich mittlerweile immer mehr zu gefallen; vielleicht, weil ich auch diese Blogeinträge darin verfasse. Daher dachte ich mir, dass es praktisch wäre über ein komfortables kleines Kommando zu verfügen, das mir sämtliche als Argumente übergebene Markdown-Dateien in HTML konvertiert und sie direkt neben ihren Markdown-Quelldateien speichert.
Stellen wir uns folgendes Verzeichnis vor:
$ ls
ignore.txt subdir test1.md test2.md
$ ls subdir
test3.md test4.md
Hier haben wir ein Unterverzeichnis namens subdir
, das zwei Markdown-Dokumente namens test3.md
und test4.md
beinhaltet. Des Weiteren befinden sich im Stammverzeichnis die Markdown-Dateien test1.md
, test2.md
und die zu ignorierende Datei ignore.txt
.
Indem ich nun folgenden Befehl absetze (Anm.: das Programm mdany
ist in /usr/bin/
registriert)
$ mdany .
führe ich mdany
aus, das kleine Tool, das ich mir vorhin geschrieben habe.
Überprüfen wir anschließend die Verzeichnisinhalte
$ ls
ignore.txt subdir test1.html test1.md
test2.html test2.md
$ ls subdir
test3.html test3.md test4.html test4.md
so können wir sehen, dass durch den Aufruf auf das gesamt aktuelle Verzeichnis (Punkt als Argument) alle .md-Dateien in dem Verzeichnis UND allen Unterverzeichnissen in HTML-Dateien konvertiert wurden.
Kürzer und schneller geht's kaum!
Hier ist der Quelltext für dieses kleine Tool:
import sys
import markdown
import os
def convert(path):
#Handle directories
if os.path.isdir(path):
for file in os.scandir(path):
convert(os.path.abspath(file))
return
#Handle files
#ignore every file that does not have the .md file type
if os.path.basename(path).split('.')[-1] != 'md':
return
#convert MD files
data = None
with open(path, 'r', encoding='utf-8') as mdfile:
data = mdfile.read()
targetfile = os.path.basename(path).split('.')[0] + '.html'
targetpath = os.path.dirname(path) + '/' + targetfile
with open(targetfile, 'w', encoding='utf-8') as htmlfile:
htmlfile.write(markdown.markdown(data))
def main(args):
for arg in args:
#only handle existing files
if os.path.exists(arg):
convert(os.path.abspath(arg))
if __name__ == '__main__':
main(sys.argv[1:])
Fun fact: seit diesem Blog-Eintrag funktioniert in diesem Blog auch Syntax-Highlighting in Code-Blöcken.