Auswahl des richtigen Markdown Parsers

Avatar of Ray Villalobos
Ray Villalobos am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Der folgende Beitrag ist ein Gastbeitrag von Ray Villalobos. Ray wird viele verschiedene Varianten von Markdown untersuchen. Alle bieten Funktionen, die über das hinausgehen, was das ursprüngliche Markdown leisten kann, aber sie bieten unterschiedliche Funktionen untereinander. Wenn Sie eine Version zur Verwendung auswählen (oder eine Version, die Sie Benutzern in Ihrem Webprodukt anbieten), lohnt es sich zu wissen, worauf Sie sich einlassen, da ein Wechsel nach der Wahl schwierig ist und Inhalte vorhanden sind, die von diesen Funktionen abhängen. Ray, der einen Kurs über Markdown hat, wird darlegen, welche Versionen welche Funktionen bieten, um Ihnen bei einer fundierten Entscheidung zu helfen.

Markdown hat die Art und Weise verändert, wie Fachleute in vielen Bereichen schreiben. Die Sprache verwendet einfachen Text mit minimaler Markierung und kann in eine wachsende Anzahl von Formaten konvertiert werden. Nicht alle Markdown-Parser sind jedoch gleichwertig. Da sich die ursprüngliche Spezifikation im Laufe der Zeit nicht weiterentwickelt hat, haben alternative Versionen wie Multi-Markdown, GFM (Github Flavored Markdown), Markdown Extra und andere die Sprache erweitert.

Der ursprüngliche Parser wurde in Perl geschrieben. Die Kernfunktionen umfassen das Parsen von Blockelementen (wie Absätze, Zeilenumbrüche, Überschriften, Blockquotes, Listen, Codeblöcke und horizontale Linien) und Spannelementen (Links, Betonung, Code-Schnipsel und Bilder). Seitdem wurde die Sprache von ihrem Schöpfer John Gruber nicht weiterentwickelt, sodass eine Reihe von Ergänzungen und Implementierungen aufgetaucht sind, wobei verschiedene Parser je nach Bedarf Unterstützung für verschiedene Implementierungen hinzufügen oder interpretieren, wie bestimmte Elemente geparst werden.

Auswahl einer Version

Bei der Implementierung von Markdown in einem Projekt gibt es viel zu beachten, einschließlich der Sprache, in der Sie entwickeln werden, sowie der Funktionen, die Sie unterstützen möchten. Die ursprüngliche Implementierung wurde in Perl geschrieben, aber das ist keine praktische Option für jedes Projekt. Es gibt Implementierungen in den meisten beliebten Sprachen, darunter: PHP, Ruby und JavaScript. Welche Sprache Sie wählen, hat Auswirkungen darauf, welche Funktionen Sie unterstützen können und welche Bibliotheken verfügbar sein werden. Sehen wir uns einige der Optionen an.

Sprache Bibliothek (Projekt herunterladen)
Perl Ursprüngliche Version
JavaScript CommonMark, Marked, Markdown-it, Remarkable, Showdown
Ruby Github Flavored Markup, Kramdown, Maruku, Redcarpet
PHP Cebe Markdown, Ciconia, Parsedown, PHP Markdown Extended
Python Python Markdown

Es gibt zusätzliche Implementierungen in vielen anderen Sprachen, falls Sie Markdown in anderen Sprachen implementieren möchten.

Kernfunktionen

Die Kern-Markdown-Sprache unterstützt eine Reihe von Standardfunktionen, die sehr nützlich sind. Obwohl verschiedene Implementierungen eine Reihe von erweiterten Funktionen unterstützen, sollten sie alle mindestens die folgende Kernsyntax unterstützen: Inline-HTML, automatische Absätze, Überschriften, Blockquotes, Listen, Codeblöcke, horizontale Linien, Links, Hervorhebung, Inline-Code und Bilder.

Bemerkenswerte Erweiterungen

Von den vielen verfügbaren Markdown-Versionen hatten einige einen erheblichen Einfluss auf andere Versionen. So sehr, dass sie oft als Teil anderer Versionen zitiert werden. Bibliotheken erwähnen beispielsweise die Unterstützung von CommonMark, GFM oder Multi-Markdown. Sehen wir uns an, was das bedeutet.

GFM

Einer der Gründe, warum Markdown bei Entwicklern so beliebt wurde, ist, dass Github, die Plattform zum Teilen von Open-Source-Projekten, die Sprache akzeptierte und mit einer Version namens Github Flavored Markup (GFM) erweiterte, um Fenced Codeblocks, URL Autolinking, Strikethrough, Tabellen und sogar die Möglichkeit, To-dos innerhalb von Repositories zu erstellen, einzuschließen. Wenn also eine Version GFM-Unterstützung erwähnt, suchen Sie nach der Implementierung dieser Erweiterungen.

Unterstützt: Fenced Codeblocks, Syntax-Hervorhebung, Tabellen, URL-AutoLinking, To-dos, Durchgestrichen.

CommonMark

In jüngster Zeit gab es eine Bewegung zur Standardisierung von Markdown. Eine Gruppe von Markdown-Entwicklern hat sich zusammengetan, um eine Version, Tests und Dokumentationen für die Sprache zu erstellen, die zu einer robusteren Spezifikation der Sprache führte, genannt CommonMark. Zu diesem Zeitpunkt fügte die Implementierung fenced codeblocks hinzu, detaillierte aber vor allem die Besonderheiten, wie bestimmte Funktionen implementiert werden sollten, um konsistente Ausgaben und Konvertierungen zu gewährleisten. Viele weitere Erweiterungen, die dies stärker an das anpassen würden, was in anderen Sprachen verfügbar ist, wurden für die Zukunft vorgeschlagen.

Dieses Format ist relativ neu und unterstützt nicht viele Funktionen, aber es wird aktiv entwickelt und es gibt Pläne, viele Multi-Markdown-Funktionen hinzuzufügen.

Unterstützt: Fenced Codeblocks, URL AutoLinking

Multi-Markdown

Die ersten ernsthaften Projekte, die die Sprache erweiterten, waren Multi-Markdown. Es fügte der Sprache eine Reihe von Funktionen hinzu, die von anderen Versionen unterstützt werden. Ursprünglich wurde es wie Markdown in Perl geschrieben, wechselte dann aber zu C. Wenn Sie also sehen, dass ein Projekt Multi-Markdown-Unterstützung hat, dann hat es wahrscheinlich die meisten dieser Funktionen.

Unterstützt: Fenced Codeblocks, Syntax-Hervorhebung, Tabellen, Metadaten, Fragmente/Referenzlinks, Fußnoten, Durchgestrichen, Definitionslisten, Mathematik.

Optionale Funktionen

Werfen wir einen Blick auf die Funktionen, die über verschiedene Implementierungen verfügbar sind.

Fenced Codeblocks

Eine der besten Ergänzungen für Entwickler ist die Möglichkeit, Code einfach zu Ihrem Markdown hinzuzufügen. Die ursprüngliche Implementierung betrachtete einen Textblock automatisch als Code, wenn er um 4 Leerzeichen oder einen einzelnen Tab eingerückt war. Das ist manchmal umständlich, daher haben mehrere Implementierungen gefesselte Codeblöcke integriert, indem sie es erlauben, drei Anführungszeichen (`) oder in einigen Fällen drei Tildenzeichen (~) am Anfang eines Textblocks zu setzen, um ihn als Code zu markieren.

```
body {
  margin: 0;
  padding: 0;
  color: #222;
  background-color: white;
  font-family: sans-serif;
  font-size: 1.8rem;
  line-height: 160%;
  font-weight: 400;
}
```

Verfügbar mit
Cebe Markdown, Ciconia, Github Flavored Markdown, Kramdown, Markdown-it, Marked, Maruku, Multi-Markdown, Parsedown, PHP Markdown Extended, Python Markdown, Redcarpet, Remarkable, Showdown

Syntax-Hervorhebung

Das Hinzufügen von Codeblöcken ist großartig, aber standardmäßig wickeln Markdown-Interpreter die Blöcke einfach in <code>- und <pre>-Tags ein, wodurch der Text als vorformatierter Text in einer Schriftart mit fester Breite angezeigt wird. Einige Implementierungen können dies verbessern, indem sie es Ihnen ermöglichen, eine Sprache neben den Anführungszeichen anzugeben und einen Parser einzubinden, der es Ihnen automatisch ermöglicht, verschiedene Farbstile auszuwählen und die Sprache Ihres Codes anzugeben, damit die Farben aussagekräftiger sind.

```css
body {
  margin: 0;
  padding: 0;
  color: #222;
  background-color: white;
  font-family: sans-serif;
  font-size: 1.8rem;
  line-height: 160%;
  font-weight: 400;
}
```

Verfügbar mit
Ciconia, Github Flavored Markdown, Kramdown*, Marked, Maruku, Multi-Markdown, Parsedown, PHP Markdown Extended, Python Markdown, Redcarpet, Remarkable, Showdown

* Ein Teil dieser Unterstützung ist nicht in den Parser eingebettet, sondern hängt von anderen Bibliotheken wie highlight.js ab.

Tabellen

Tabellen in HTML zu schreiben kann umständlich sein. Einige Markdown-Versionen können dies handhaben, indem sie es Ihnen ermöglichen, Tabellen mit einer recht einfachen Syntax hinzuzufügen.

Dimensions | Megapixels
---|---
1,920 x 1,080 | 2.1MP
3,264 x 2,448 | 8MP
4,288 x 3,216 | 14MP

Rendert so

Dimensionen Megapixel
1.920 x 1.080 2,1 MP
3.264 x 2.448 8 MP
4.288 x 3.216 14 MP

Es dauert ein paar Minuten, um den Dreh beim Erstellen von Tabellen wie dieser herauszufinden, aber nachdem Sie es ein paar Mal gemacht haben, werden Sie es als umständlich empfinden, HTML zu verwenden. Wenn Sie Hilfe beim Erstellen von Tabellen benötigen, schauen Sie sich diesen Markdown Tables Generator an.

Markdown Tables Generator

Verfügbar mit
Cebe Markdown, Ciconia, Github Flavored Markdown, Kramdown, Markdown-it, Marked, Maruku, Multi-Markdown, Parsedown, PHP Markdown Extended, Python Markdown, Redcarpet, Remarkable, Showdown

Metadaten

Einige Erweiterungen ermöglichen es Ihnen, Metadaten hinzuzufügen, die Sie verwenden können, um Informationen hinzuzufügen, die Ihre App analysieren kann, wie z. B. die Auswahl einer Vorlage oder das Festlegen des Seitentitels. Einige verwenden die Multi-Markdown-Struktur für diese Metadaten, und andere wie der Jekyll-Parser verwenden YAML als Format, was es Ihnen ermöglicht, komplexe Daten innerhalb dieses Metadatenbereichs auszudrücken. Dies kann eine wirklich nützliche Funktion für App-Entwickler sein.

---
Title:  SVG Article
Author: Ray Villalobos
Date:   January 6, 2016
heroimage: "http://i.imgur.com/rBX9z0k.png"
tags:
- data visualization
- bitmap
- raster graphics
- navigation
---

Verfügbar mit
Markdown-it, Maruku, Multi-Markdown, PHP Markdown Extended, Python Markdown, Redcarpet, Remarkable, Showdown

URL-AutoLinking

Diese recht einfache Erweiterung ermöglicht es, URLs, die natürlich in Ihrem Text vorkommen, durch den Parser in Links umzuwandeln. Das ist wirklich praktisch und nützlich in einer Implementierung wie GFM, wo das Klicken auf URLs ohne zusätzlichen Aufwand das Erstellen von Dokumentation erleichtert.

Verfügbar mit
Cebe Markdown, Ciconia, CommonMark, Github Flavored Markdown, Kramdown, Markdown-it, Marked, Maruku, Multi-Markdown, Parsedown, PHP Markdown Extended, Python Markdown, Redcarpet, Remarkable, Showdown

Fragmente/Referenzlinks

Mit HTML können Sie einfach Referenzen innerhalb Ihres Dokuments erstellen, indem Sie ein Hash-Zeichen in Ihrem Anker-Tag mit der ID eines Elements auf einer Seite verwenden. Einige Implementierungen ermöglichen es Ihnen, eine Verknüpfung für diese Art von Referenz zu erstellen. Das ist besonders nützlich, da es Ihnen ermöglicht, Ihr eigenes Dokument schnell zu referenzieren, ohne viele HTML-Tags schreiben zu müssen. Diese Funktion ist sehr unterschiedlich implementiert, daher sollten Sie vorsichtig sein und die Dokumentation für die spezifische Version lesen, die Sie verwenden werden.

You can link to a headline called 'myheadline' in your document using this [My Headline][].

## My Headline
The word 'reference' right next to this will get a link that links via an href to the headline above. The headline, in other words, gets an ID that the link points to.

Verfügbar mit
Ciconia, Multi-Markdown, Maruku, Multi-Markdown, Parsedown, PHP Markdown Extended, Redcarpet, Showdown

Benutzerdefinierte IDs für Überschriften

Eine weitere nützliche Funktion ist die Möglichkeit, IDs in Ihren Überschriften zu haben, damit Sie diese einfacher mit CSS ansprechen können. Einige Parser weisen allen Überschriften automatisch IDs zu (insbesondere wenn sie Fragmente/Referenzen unterstützen), sodass diese Funktion nicht immer notwendig ist. Es ist jedoch schön, dass einige Versionen es Ihnen ermöglichen, anzupassen, wie der Parser die IDs benennt, was manchmal bequemer ist, als Dinge automatisch zu benennen.

### Custom IDs {#custom-id}
The headline above, when rendered by the parser, will have a custom ID that you specify in the curly braces.

Verfügbar mit
Cebe Markdown, Kramdown

Fußnoten & Andere Link-Typen

Fußnoten ermöglichen es Ihnen, Links innerhalb Ihres Dokuments zu Referenzen zu erstellen, die am Ende der Markdown-Seite platziert werden. Das unterscheidet sich von normalen Links, die inline in Ihrem Inhalt platziert werden. Dies ermöglicht es den Benutzern, alle zugehörigen Links innerhalb eines Dokuments in einem einzigen Abschnitt anzuzeigen, was manchmal praktisch ist.

You can find a demo of a site[^Demo] built with PostCSS in our footnotes, or you can checkout the [^Github Repo] for the project.

#### Footnotes
[Demo](http://iviewsource.com/exercises/postcsslayouts)
[Github Repo](https://github.com/planetoftheweb/postcsslayouts)

Verfügbar mit
Cebe Markdown, Kramdown, Markdown-it, Maruku, Multi-Markdown, Parsedown, PHP Markdown Extended, Python Markdown, Redcarpet, Remarkable, Showdown

**Hinweis**: Es gibt viele alternative Linkmethoden in Parsern wie Multi-Markdown. Die Unterstützung dafür ist in den einzelnen Versionen sehr lückenhaft. Das bedeutet, dass auch wenn der Parser „Multi-Markdown“-Kompatibilität bewirbt, verschiedene Parser unterschiedliche Arten von Linkreferenzen implementieren. Dazu gehören Dinge wie Zitate, automatisch generierte IDs in Überschriften, die Möglichkeit, benutzerdefinierte IDs zu erstellen, Referenzlinks und andere. Einige Parser erfinden sogar eigene Link-Funktionen.

To-dos

Dies ist eine Funktion von Github Flavored Markdown, die sich in einigen Implementierungen durchgesetzt hat. Sie fügt Markup für To-do-Listen hinzu, sodass Sie Kontrollkästchen neben Inhalten erstellen können, um eine To-do-Liste zu simulieren.

- [ ] Run `> npm-install` to install the project dependencies
- [X] Install gulp.js via the Mac terminal or Gitbash on a PC `> npm install -g gulp`
- [ ] Run the Gulp command `> gulp`

Verfügbar mit
Ciconia, Github Flavored Markdown, Markdown-it, Marked, Python Markdown, Redcarpet, Showdown

Durchgestrichen

Wenn Sie Text mit Durchstreichen markieren möchten, können Sie in vielen Versionen eine Notation verwenden, die den Text mit dem &lt;s&gt;-Tag umschließt. Für eine umfassendere Implementierung von Redaktionshinweisen sollten Sie jedoch das verwandte Format namens CriticMarkup in Betracht ziehen.

Verfügbar mit
Ciconia, Markdown-it, Marked, Multi-Markdown, Parsedown, Remarkable, Redcarpet, Showdown

Definitionslisten

Obwohl Definitionslisten nicht so verbreitet sind wie andere Listentypen, sind sie eine großartige Möglichkeit, bestimmte Arten von Elementen in HTML zu kodieren. Einige Implementierungen fügen eine Möglichkeit hinzu, diese auf wesentlich einfachere Weise zu erstellen. Es gibt zwei Möglichkeiten, sie zu definieren, abhängig von der Sprache: Verwendung eines Doppelpunkts (`:`) oder einer Tilde (`~`), obwohl die Implementierung mit Doppelpunkten gebräuchlicher ist.

ES6/ES2015
:   The new version of the popular JavaScript language

TypeScript
  ~ TypeScript is a language that is a superset of JavaScript that can be compiled through a transpiler to JavaScript that will work with most browsers.

Verfügbar mit
Kramdown, Markdown-it*, Maruku, Multi-Markdown, PHP Markdown Extended, Python Markdown, Remarkable

* erfordert eine Erweiterung

Mathematik

Die Möglichkeit, mathematische Formeln zu erstellen, kann für einige Benutzer nützlich sein. Daher ist eine Sprache zum Erstellen dieser Formeln in einigen Implementierungen wie Multi-Markdown aufgetaucht. Obwohl einige Sprachen behaupten, sie zu unterstützen, ist Unterstützung in anderen Sprachen verfügbar, manchmal durch eine Erweiterung.

Verfügbar mit
Kramdown*, Maruku, Multi-Markdown, Markdown-it, Python Markdown*

* erfordert eine Erweiterung

Oh, dieser süße I/O

Eine Sache, auf die Sie achten müssen, ist, wie verschiedene Versionen Ein- und Ausgaben behandeln. Nur weil eine Version angibt, Tabellen zu unterstützen, bedeutet das nicht, dass es eine standardisierte Möglichkeit gibt, den Code für die Tabellen zu erstellen. Einige Versionen generieren viel HTML-Code und einige rendern minimalistischen Code.

Es gibt auch Unterschiede in der Art und Weise, wie Dinge wie Leerzeichen behandelt werden. Einige Versionen fügen jeder Überschrift IDs hinzu, andere nicht. Dies war einer der Bedenken, die die OpenMark-Plattform anzugehen versucht, nämlich wie konsistente Ausgaben generiert werden können. Der beste Weg, um herauszufinden, wie die von Ihnen gewählte Version damit umgeht, ist die Verwendung des Babelmark 2 Tests. Fügen Sie etwas Code ein, und er zeigt Ihnen, wie verschiedene Parser die Ausgabe verarbeiten und eine Vorschau, wie diese in einem Browser aussieht.