noqqe » blog | sammelsurium | photos | projects | about

>1000 Codeblocks identifizieren

2020-04-17 @ markdown, python

Endlich kann Hugo natives Syntax Highlighting. Endlich? Seit 2017! Scheinbar ging das immer an mir vorbei.

Früher hatte ich über Javascript pygments geladen und damit die Codeblöcke bunt angemalt, als wären sie Besucher eines Holi Festivals. Die clientseitige JS Lösung hatte mir nie gefallen, aber war damals die einzige Möglichkeit. Es hat sie Seite langsamer gemacht. Ich baute es bei irgendeinem Layoutwechsel wieder aus.

Als Engine benutzt Hugo Chroma. Aber als ich es aktivierte, blieb trotzdem das meiste in tristem Schwarz & Weiss zurück. Natürlich hatte ich über Jahre die jeweilige Sprache in den Fenced Codeblocks nicht gepflegt. Ohne Auszeichnung kein Highlighting.

“Das müsste ich jetzt alles mal nachholen”, dachte ich so. Wie? vim content/*.md? Das wären 600 Dateien! “Und wenn ich nur die Files mit Codeblöcken darin öffne?”

$ grep ``` -R content/ | wc -l
    2226

Holy Shit. Über 1000 Codeblöcke! Was ich brauchte, war ein Weg um schnell durch unidentifizierte Codeblocks zu gehen und diesen die jeweilige Syntax zuzuordnen.

Ich setzte mich kurz hin und schrieb etwas python. Die Idee: Mein Script findet alle untypisierten Codeblöcke eines Blogpostm, zeigt mir diese nacheinander an und fragt mich, welche Sprache das ist.

for pos, line in enumerate(data):

  # does line contain a code fence?
  if re.findall('^```', line):

    # ignore closing ``` fences
    no = no + 1
    if no % 2 == 0:
        continue

    # ignore already typed codeblocks
    if re.findall('^```\s?\S', line):
        continue

    print("Found Codeblock:")
    print(line, end = '')

    # print lines until next occurence of ```
    print_codeblock(data[pos+1:])

Oben ist der eigentliche Auszug der Logik des Skripts. Das Ergebnis für einen gefundenen Codeblock sah so aus:

Ausgabe des Skripts

Ausgabe des Skripts

Das ganze Script ist auf github zu finden. Angewendet habe ich es auf alle Dateien und es hat ungefährt 20 Minuten gedauert alle zu identifizieren:

> for x in (ag -l ```); identify-codeblock.py $x ; end
> git diff e9a2924bb57bd59ddf3b975baa0cb9d4f864d00b 947398b3c4930f33d9620de6e2831540c107d0fd --shortstat
 159 files changed, 376 insertions(+), 376 deletions(-)

kkthxbye :wq!