Skip to content

Wie Markdown funktioniert ​

Das Verständnis, wie Markdown funktioniert, hilft Ihnen, dieses leistungsstarke Werkzeug besser zu nutzen. In diesem Kapitel erfahren Sie, wie aus einfachem Text ein schön formatiertes Dokument wird.

Grundlegender Ablauf ​

Der Markdown-Workflow lässt sich in folgende Schritte zusammenfassen:

Markdown-Quelldatei (.md) → Markdown-Parser → HTML-Dokument → Browser-Rendering

1. Schreiben der Markdown-Quelldatei ​

Sie verwenden einen beliebigen Texteditor, um eine .md-Datei zu erstellen und Inhalte mit Markdown-Syntax zu schreiben:

markdown
# Mein Dokument

Dies ist ein **wichtiger** Absatz.

## Listenbeispiel

- Element 1
- Element 2
- Element 3

2. Verarbeitung durch den Markdown-Parser ​

Der Parser liest die Markdown-Datei, erkennt Syntaxelemente und wandelt sie in entsprechendes HTML um:

html
<h1>Mein Dokument</h1>
<p>Dies ist ein <strong>wichtiger</strong> Absatz.</p>
<h2>Listenbeispiel</h2>
<ul>
  <li>Element 1</li>
  <li>Element 2</li>
  <li>Element 3</li>
</ul>

3. Browser-Rendering ​

Das generierte HTML wird im Browser als formatiertes Dokument angezeigt.

Wie Parser arbeiten ​

Lexikalische Analyse ​

Der Parser führt zuerst eine lexikalische Analyse durch und zerlegt den Markdown-Text in Tokens:

  • # wird als Überschriften-Token erkannt
  • **text** als Fett-Token
  • - element als Listenelement-Token

Syntaxanalyse ​

Anschließend erfolgt die Syntaxanalyse zur Erstellung eines abstrakten Syntaxbaums (AST):

Dokument
├── Überschrift (Ebene 1): "Mein Dokument"
├── Absatz
│   ├── Text: "Dies ist ein"
│   ├── Fett: "wichtiger"
│   └── Text: "Absatz."
├── Überschrift (Ebene 2): "Listenbeispiel"
└── Ungeordnete Liste
    ├── Listenelement: "Element 1"
    ├── Listenelement: "Element 2"
    └── Listenelement: "Element 3"

HTML-Generierung ​

Abschließend wird der Syntaxbaum durchlaufen und das entsprechende HTML erzeugt.

Gängige Parser ​

CommonMark ​

  • Standard-Spezifikation – Einheitlicher Parsing-Standard
  • Streng definiert – Beseitigt Mehrdeutigkeiten zwischen Implementierungen
  • Weit verbreitet – Von vielen Parsern übernommen

GitHub Flavored Markdown (GFM) ​

Basiert auf CommonMark, mit Erweiterungen:

  • Tabellenunterstützung
  • Durchgestrichen
  • Aufgabenlisten
  • Autolink-Erkennung
  • Syntaxhervorhebung für Codeblöcke

Weitere Parser ​

ParserSpracheMerkmale
markedJavaScriptSchnell, leichtgewichtig
markdown-itJavaScriptErweiterbar, viele Plugins
Python-MarkdownPythonFunktionsreich, Plugin-System
kramdownRubyUnterstützt mehrere Ausgabeformate
PandocHaskellUniverseller Dokumentenkonverter

Rendering-Engines ​

Clientseitiges Rendering ​

Markdown wird im Browser in Echtzeit geparst:

javascript
// Mit marked.js
const html = marked.parse('# Hallo Welt');
document.body.innerHTML = html;

Vorteile:

  • Keine Serververarbeitung nötig
  • Echtzeit-Vorschau
  • Entlastet den Server

Nachteile:

  • Abhängig von JavaScript
  • Nicht SEO-freundlich
  • Langsamer initialer Ladevorgang

Serverseitiges Rendering ​

HTML wird auf dem Server vorab generiert:

javascript
// Node.js Beispiel
const fs = require('fs');
const marked = require('marked');

const markdown = fs.readFileSync('dokument.md', 'utf8');
const html = marked.parse(markdown);

Vorteile:

  • SEO-freundlich
  • Schnelles Laden
  • Keine Abhängigkeit von clientseitigem JavaScript

Nachteile:

  • Serverlast
  • Komplexes Cache-Management

Statische Seitengenerierung ​

Alle Seiten werden beim Build vorab generiert:

bash
# Mit VitePress
npm run build

Vorteile:

  • Schnellste Ladezeiten
  • Beste SEO
  • Hohe Sicherheit
  • Einfache Bereitstellung

Nachteile:

  • Begrenzte Unterstützung für dynamische Inhalte
  • Längere Build-Zeiten

Erweiterungsmechanismen ​

Plugin-System ​

Viele Parser unterstützen Plugin-Erweiterungen:

javascript
// markdown-it Plugin-Beispiel
const md = require('markdown-it')()
  .use(require('markdown-it-footnote'))
  .use(require('markdown-it-deflist'))
  .use(require('markdown-it-abbr'));

Benutzerdefinierter Renderer ​

javascript
// Benutzerdefinierter Link-Renderer
const renderer = new marked.Renderer();
renderer.link = function(href, title, text) {
  return `<a href="${href}" target="_blank">${text}</a>`;
};

Performance-Optimierung ​

Caching-Strategie ​

javascript
const cache = new Map();

function parseMarkdown(content) {
  const hash = generateHash(content);
  if (cache.has(hash)) {
    return cache.get(hash);
  }
  
  const result = marked.parse(content);
  cache.set(hash, result);
  return result;
}

Lazy Loading ​

javascript
// Nur sichtbaren Bereich parsen
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      parseAndRender(entry.target);
    }
  });
});

Streaming-Verarbeitung ​

javascript
// Stream-Parsing für große Dateien
const fs = require('fs');
const { Transform } = require('stream');

const markdownTransform = new Transform({
  transform(chunk, encoding, callback) {
    const html = marked.parse(chunk.toString());
    callback(null, html);
  }
});

fs.createReadStream('großes-dokument.md')
  .pipe(markdownTransform)
  .pipe(fs.createWriteStream('output.html'));

Häufige Probleme ​

1. Zeilenumbruch-Probleme ​

Verschiedene Parser behandeln Zeilenumbrüche unterschiedlich:

markdown
Zeile 1
Zeile 2        ← Kann als gleicher Absatz geparst werden

Zeile 1  
Zeile 2        ← Zwei Leerzeichen am Zeilenende erzwingen einen Zeilenumbruch

Zeile 1

Zeile 2        ← Leere Zeile trennt Absätze

2. HTML-Mischung ​

markdown
Dies ist eine Mischung aus **Markdown** und <em>HTML</em>.

Achten Sie auf korrektes Schließen und Verschachteln von HTML-Tags.

3. Escaping von Sonderzeichen ​

markdown
Hier müssen Sie \* und \_ escapen.

Praktische Anwendungsszenarien ​

1. Blogsysteme ​

Markdown-Artikel → Statischer Seitengenerator → HTML-Website

2. Dokumentationsseiten ​

.md-Dokumente → VitePress/Docusaurus → Online-Dokumentation

3. README-Dateien ​

README.md → GitHub/GitLab → Projekt-Homepage

4. Notiz-Apps ​

Markdown-Notizen → Echtzeit-Rendering → Rich-Text-Anzeige

Nächste Schritte ​

Jetzt, da Sie wissen, wie Markdown funktioniert, können Sie:

Built by www.markdownlang.com