rokom-markdown

Markdown

Thema: Formatierte Textdatei in jedem Editor erstellen

Zielgruppe: IT-Arbeiter auf diversen Betriebssystemen

Motivation: Überall Gedanken festhalten und formatierte Dokumente erstellen

Prolog

Es geht um die Wucht der Einfachheit.

Für Personen mit wenig oder keinem technischen Verständnis, sind einfache Textdateien mit Strukturen nicht schnell zu erfassen oder haben wenig Aussagekraft. Hier hilft Markdown, um ein formatiertes Dokument für die Anwender herzustellen, und zwar aus jedem Editor, jeder Textverarbeitung und jeder Office-Suite.

Kleine Editoren, wie unter anderem Geany, können die Syntax von Markdown erkennen.

Es reichen wenige Zeichen für die Syntax und die Dateiendung .md oder auch die Endungen .mkd oder .markdown aus.

Markdown ist eine Sprache

Es soll die einfachste Auszeichnungssprache sein, um formatierte Dokumente zu erstellen. Zu mindestens sind Dokumente auch ohne Konvertierung lesbar.

Syntax

Syntax-Zeichen

Diese wenigen Zeichen reichen aus, für ein komplett formatiertes Dokument.

# * 1. > - [] () | ` : Tabulator Leerzeichen

Beispiele

EingabeAusgabe
# Überschrift

Überschrift

## Überschrift 2

Überschrift 2

#### Überschrift 4

Überschrift 4

*Kursiv*Kursiv
**Fett**Fett
> Zitat

Zitat

1. Erstens
2. Zweitens
3. Drittens
  1. Erstens
  2. Zweitens
  3. Drittens
* Eintrag a
* Eintrag b
* Eintrag c
  • Eintrag a
  • Eintrag b
  • Eintrag c
Hier `inline code`Hier inline code
Horizontale Linie
---
Horizontale Linie

[Link](http://ro-kom.de)Link
![Image](http://ro-kom.de/f8a418.webp)#f8a418
Tabelle
| A | B | C |
|---|---|---|
| 3 | 1 | 4 |
| 1 | 5 | 9 |
Tabelle
markdown-tabelle

Weitere Formatierungen

Das war nur eine kurze Übersicht. Weitere Formatierungen, wenn überhaupt gewünscht, sind auch möglich.

  • Codeblock, auch als sichtbaren Kommentar
  • Nicht angezeigter Kommentar
  • Ausrichtung des Textes in den Tabellen, wie links- und rechtsbündig sowie zentriert
  • Mit css und html sind unter anderem auch farbige Komponenten möglich

Also, um Markdown-Dokumente zu formatieren, sind fast keine Grenzen gesetzt.

Programme

Selbstverständlich gibt es auch direkt Markdown-Editoren für Linux, Windows und macOS. Ich selbst nutzte eine Zeit lang „Ghostwriter“, auch für jedes Betriebssystem vorhanden. Doch es gibt mehrere Markdown-Editoren und bestimmt hübscherer.

markdown-gw
Der Editor „Ghostwriter“

Momentan nehme ich hauptsächlich Marker, manchmal Geany oder Retext, weil einfacher für mich schneller bedeutet.

Bildschirmfoto_2025-09-07_09-49-53
Der Editor „Marker“

markdown_2025-09-07_10-57-44
Der Editor „Geany“

Nummerierung der Überschriften und Inhaltsverzeichnis

In einfachen Markdown-Editoren gibt es keine automatische Nummerierung der Überschriften und kein toc-Modul. Dafür habe ich mir ein Bash-Script gebastelt, nicht schön, aber funktioniert.

Funktionen des Bash-Script

  • Arbeitet mehrere Markdown-Dateien in einem Stapel ab
  • Fragt nach dem Verzeichnis der Markdown-Dateien
  • Erstellt jeweils eine Backup-Datei
  • H1, also der Titel wird von der Nummerierung ausgeschlossen
  • Ab H2 bis H6 wird nummeriert, beginnend mit der Ziffer 1
  • von der Nummerierung ebenfalls ausgeschlossen ist die Überschrift „Inhaltsverzeichnis“

Ansonsten ist es dreckige Programmierung > quick and dirty, aber jeder darf es bereinigen und optimieren, eine Rückmeldung wäre wünschenswert :-)

Bash-Script

#!/bin/bash

# Pfad abfragen
read -p "Verzeichnis mit Markdown-Dateien: " DIR

if [[ ! -d "$DIR" ]]; then
  echo "Verzeichnis existiert nicht."
  exit 1
fi

for file in "$DIR"/*.md; do
  # Nur ein Backup pro Datei erstellen (.bak), falls noch nicht existiert
  if [[ ! -f "$file.bak" ]]; then
    cp "$file" "$file.bak"
  fi

  # ============================
  # Teil 1: Überschriften nummerieren
  # ============================
  awk '
    BEGIN {
      for (i = 2; i <= 6; i++) num[i] = 0;
    }
    {
      if ($0 ~ /^# /) {
        # H1 nicht nummerieren
        print;
        next;
      }
      # H2–H6 nummerieren
      for (i = 6; i >= 2; i--) {
        prefix = sprintf("%*s", i, ""); sub(/ /, "#", prefix) # schneller: generiere richtige Regex
        regex = "^" substr("######",1,i) " ";
        if ($0 ~ regex) {
          num[i]++;
          for (k = i + 1; k <= 6; k++) num[k] = 0;
          numbering=num[2];
          for (k = 3; k <= i; k++) numbering=numbering "." num[k];
          sub(/^#+ +/, "&" numbering " ");
          print;
          next;
        }
      }
      print;
    }
  ' "$file" > "$file.tmp" && mv "$file.tmp" "$file"

  # ============================
  # Teil 2: Inhaltsverzeichnis einfügen
  # ============================
  TOC=$(awk '
    /^##+ / {
      hlevel = length($1) - 1   # Anzahl # - 1
      line = $0
      sub(/^#+ +/, "", line)    # führende # entfernen
      printf "%*s- %s\n", hlevel * 2, "", line
    }
  ' "$file")

  if [[ -n "$TOC" ]]; then
    awk -v toc="$TOC" '
      BEGIN { inserted=0 }
      /^# / && inserted==0 {
        print
        print ""
        print "## Inhaltsverzeichnis"
        print ""
        print toc
        print ""
        inserted=1
        next
      }
      { print }
    ' "$file" > "$file.tmp" && mv "$file.tmp" "$file"
  fi

  echo "Bearbeitet: $file (Backup: $file.bak)"
done

Reguläre Ausdrücke

Sie vereinfachen die Erstellung von Markdown-Dokumenten.

Hier eine kleine Liste von Ausdrücken, die ich nutze.

Es gibt einen Unterschied zwischen den flexiblen „Nicht-POSIX-Regulären Ausdrücken“ und den strengen „POSIX-konformen regulären Ausdrücken“.

Kein Posix  = \w
Posix       = [:word:]

Wobei beide Ausdrücke nicht komplett identisch sind.

Anker-Zeichen

^ = Caret: Zeilenanfang; Ersetze ^kkk durch \t* kkk
$ = Dollar: Zeilenende; Ersetze $ durch "Ende"

Meta-Zeichen

. = Punkt: Jedes Zeichen
| = Pipe: Alternativen; Mann|Frau
\ = Backslash: Nur in Verbindung mit weiteren Zeichen; \t = Tab

Escape-Zeichen

\t = Tabulator
\n = Zeilenumbruch; bis zur vererbten Zeile; Beispiel Listenpunkt
\r = Wagenrücklauf; bis direkt an Zeilenanfang
\v = Erzeugt Leerzeile; Cursor bleibt in selbiger Spalte
\s = Whitespace; Baum\sKrone ~ Baum \t Krone und Baum \n Krone

Alpha-Zeichen

[axz] = Findet alles mit a oder x oder z
[^axz] = Findet alles außer mit a oder x oder z

Numerik-Zeichen

\d = Jede Ziffer; Ersetze \d (alle Ziffern) durch das Wort digital
\D = Jedes Zeichen außer Ziffern

Export

Export ist auch als Textdatei .txt möglich. Ebenfalls möglich als .xml, .pdf und .html. Doch das ist unterschiedlich zwischen den Editoren und den vorhandenen PDF-Drucker.

Epilog

Manchmal steht man wie vor einer Wand, dieser Beitrag soll den Wanddurchbruch ermöglichen, zumindest die Umgehung der Wand.

Eigentum

Die Bilder sind allermeist im Quellformat hochauflösende Vektorgrafiken und meine Schöpfungen sowie mein Eigentum. Wenn nicht anders gekennzeichnet, sind die Bilder, Grafiken und Websites-Screenshots von mir erstellt und mein Eigentum.