in meinem Blog nutze ich Pandoc, um aus Markdown HTML zu erzeugen. Pandoc ist so ziemlich der beste und umfangreichste Konverter für Markdown, mit Ausnahme des Syntax-Highlightings: Zwar unterstützt Pandoc Syntax-Highlighting, kommt aber im Bezug auf unterstützte Sprachen und Qualität nicht einmal annähernd an Pygments heran.
Dank der tollen Pandoc-API ist es nicht weiter schwierig, das Syntax-Highlighting durch Pygments zu ersetzen. Bisher habe ich einfach die offensichtliche Lösung verwendet, und einfach "pygmentize" mit dem Quelltext aufgerufen. Nicht weiter schwer, und schnell implementiert, allerdings auch sehr, sehr langsam.
Mithin habe ich mich am Wochenende mal daran gesetzt, Pygments direkt über Python's C-API heraus aufzurufen. Das ist dabei herausgekommen:
- Foreign.Python.Native.hsc – Prototypen der entsprechenden C-Funktionen, und Deklarationen der C-Typen. Dank "hsc2hs" ist der GHC weitgehend selbstständig in der Lage, die richtigen C-Typen herauszufinden, so dass man sich nicht durch zig Header und Typedefs wühlen muss, um die “echten” Typen der CPython-API herauszufinden.
- Foreign.Python – Der High-Level Wrapper um die C-API. Kann Module importieren, Attribute abfragen, Objekte aufrufen, und ein paar Haskell Typen zu Python-Typen hin und her konvertieren.
- Text.Highlighting.Pygments – Der Pygments-Wrapper. Importiert die nötigen Module aus "pygments", und ruft "highlight" auf, um aus dem übergebenen Quelltext hübsches HTML zu erzeugen.
Noch einfacher wäre es gewesen, wenn die C-API von Python 2 nicht so… bescheiden wäre. Insbesondere die ABI-Unterschiede zwischen UCS2 und UCS4 Builds machen die Angelegenheit komplizierter als nötig. Vielleicht reizt es mich ja noch mal irgendwann, dass ganze auf Python 3 zu portieren, dessen C-ABI ja einfacher sein soll…
Ich dachte, ich poste das hier einfach mal, falls es jemanden interessiert (und auch, weil ich ein ganz klein bisschen stolz darauf bin, wie weit meine eher bescheidenen Haskell-Kenntnisse dann doch tragen)
