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.