Wie viel Authentifizierung hättens denn gern? Qualitätsprodukt

Wie man HTML (nicht) zu Markdown konvertiert

Published on Monday, May 2, 2016 9:57:20 AM UTC in Programming

In einem ersten Schritt zur Befreiung meines Blogs habe ich vorgefühlt, was es bedeuten würde, den bestehenden Content (den BlogEngine.NET als HTML in XML ablegt) umzuwandeln in Markdown. Das (XML-codierte) HTML aus den Dateien der jetzigen Engine zu extrahieren war natürlich nicht schwer. Nun aber stand ich vor der Aufgabe, aus dem heterogenen Wust an HTML schönes, einheitliches Markdown zu gewinnen.

Wenn es um die Bearbeitung von HTML geht, rät jeder davon ab, Regular Expressions zu verwenden. Also habe ich mir das Quellmaterial stichprobenartig angesehen und evaluiert, welche Frameworks, Tools und andere Methoden für diesen Zweck existieren. Schließlich kam ich zum Schluss, dass mir ein Dutzend Regular Expressions bei der Aufgabe am besten helfen würden. Wo ich sogar zu faul war, die zu schreiben begnügte ich mich mit einfach String-Ersetzungen. Für manche Quell-Elemente habe ich auch ein Scan-Verfahren eingesetzt, etwa wenn ich temporär Zustandsinformationen zwischen öffnendem und schließendem Tag halten musste, wofür meine Ninja-RegEx-Skills bei weiten nicht ausreichen. Und so entstanden in kurzer Zeit etwa 300 Zeilen Wegwerf-Logik, die sehr passable Ergebnisse ausspucken - wobei ich in weniger als einer Hand voll Fälle manuell nachbessern musste. Lediglich Tabellen lasse ich momentan unangetastet, da ich sie nur ganz selten eingesetzt habe. Die harmlosen Teile sehen etwa so aus:

result = Regex.Replace(result, "<em>(.*?)</em>", "*$1*", RegexOptions.Singleline | RegexOptions.IgnoreCase);
result = Regex.Replace(result, "<i>(.*?)</i>", "*$1*", RegexOptions.Singleline | RegexOptions.IgnoreCase);
result = Regex.Replace(result, "<b>(.*?)</b>", "**$1**", RegexOptions.Singleline | RegexOptions.IgnoreCase);

Man sollte meinen, dass es zum Geduldsspiel wird, mehrere hundert Posts aus dem Dateisystem zu laden und dann jeweils zwei Dutzend Mal über die nicht unerheblich langen Texte zu iterieren und mit Regular Expressions zu bewerfen. Tatsächlich dauert es aber nur wenige Augenblicke (sehr deutlich unter 10 Sekunden), bis alle Konvertierungen abgeschlossen sind und das Ergebnis zurück auf die Platte geschrieben ist - ein wieder einmal imposantes Beispiel für die Leistungsfähigkeit moderner Festplatten (SSD), CPUs und auch Programmiersprachen. Damit habe ich einen ersten Daten-Grundstock für die Migration des Blogs geschaffen, an dem ich für den endgültigen Stand sicherlich noch ein wenig nachfeilen werde.

Die Achterbahnfahrt geht weiter

Zwischenzeitlich gibt es weiteren, ausgesprochen fragwürdigen "Fortschritt" bei BlogEngine.NET. Fast hätte ich vorgestern im Dashboard blind auf den Update-Button gedrückt, der Version 3.3 ankündigte. Neugierig (und vorsichtig) wie ich nunmal aber bin, habe ich mir zuerst die Änderungen angesehen, Zitat:

In 3.3 most of the user controls were removed and all widgets replaced with Razor views. Because it was rewrite (almost) from scratch, some of the widgets were combined and others renamed for consistency. This makes new widgets incompatible with currently used. Auto update will completely remove custom/widgets folder and replace it with new. [...] If you have customized widgets, or if you added your own - you will loose them! So be careful.

Da hat wohl jemand sein SemVer-Müsli nicht gegessen. Für mich ist es völlig unverständlich, wie man bei einem Produkt, das vermutlich diverse tausend Male weltweit eingesetzt wird, ein derart gravierendes Update mit solchen Breaking Changes als Minor Version veröffentlichen kann. Die Warnungen erfährt man auch nur im zugehörigen Release-Post, die Schaltfläche im Backend warnt nicht davor; wehe dem, der dem Komfortversprechen des einfachen Updates folgt in der Annahme, dass es sich im Sinne von semantischer Versionierung tatsächlich nur um rückwärtskompatible neue Funktionalitäten handelt.

P.S.: beim Durchstöbern einiger Diskussionen stieß ich übrigens auf diesen Link (Vorsicht, Spam!) auf der offziellen BlogEngine.NET-Seite. Da scheint wohl jemand in der Vergangenheit Opfer seiner eigenen Sicherheitslücken geworden zu sein und hat die eigene Installation danach nicht vollständig gesäubert. Oder aber einer der Autoren geht einem Nebengeschäft als Apotheker nach... ;). Auch wenn ich mich wiederhole: nicht besonders vertrauenserweckend.

Tags: BlogEngine.NET · Regex