# CommonMark

CommonMark ist eine vereinfachte Auszeichnungssprache, die von einer kleinen Gruppe Entwicklern um John MacFarlane und Jeff Atwood mit dem Versuch entwickelt wurde, die Mehrdeutigkeiten im Parsing von Markdown zu eliminieren, so dass verschiedene, der Spezifikation entsprechende Parser, das gleiche Ergebnis liefern.

## Geschichte

Markdown, das unter anderem auf Stack Overflow und GitHub zum Verfassen von Beiträgen eingesetzt wird, führt leicht zur Verwirrung – vor allem durch folgende drei Eigenschaften:
* URLs werden nicht automatisch in Hyperlinks umgewandelt. Stattdessen müssen sie explizit gekennzeichnet werden.
* Der Unterstrich (_) zur Formatierung von _kursivem_ und __fettem__ Text greift auch innerhalb eines Wortes, was zu unerwarteten Nebeneffekten führen kann, zum Beispiel in Ausdrücken wie „Eine_Datei“ und „Eine_andere_Datei“ (unerwartetes Ergebnis: „EineandereDatei“).
* Markdown orientiert sich an Absätzen und nicht an Zeilen. Zeilenendmarken (CR/LF) werden nicht automatisch in Zeilenumbrüche umgewandelt. Für einen Absatz werden eine oder mehrere Leerzeilen benötigt.
Ende 2012 riefen David Greenspan und Jeff Atwood ein neues Projekt ins Leben, um eine offizielle Markdown-Spezifikation zu erstellen, deren verschiedene Implementierungen mithilfe einer Standardtestsuite validiert werden können. Damit sollte die Popularität von Markdown weiter gefördert werden, anstatt die Fragmentierung der Sprache fortzusetzen.
Im September 2014 wurde ein erster Entwurf der Syntax zunächst unter dem Namen „Standard Markdown“ veröffentlicht. Nach einer heftigen Reaktion des Markdown-Erfinders John Gruber über Twitter und einer anschließenden Diskussion mit den Verantwortlichen hinter dem Projekt einigte man sich schließlich auf den Namen CommonMark.
Im März 2017 veröffentlichte GitHub für den hauseigenen Markdown-Dialekt eine Spezifikation, welche auf CommonMark basiert, und wechselte auf eine neue Implementierung. Kurz darauf wurde auch die Forensoftware Discourse auf eine neue CommonMark-konforme Implementierung von Markdown, welche einige Erweiterungen beinhaltet, umgestellt.

## Unterschiede zu Markdown

Im Folgenden werden einige Unterschiede zwischen Markdown und CommonMark aufgeführt.
| Auszeichnungselement | Markdown | CommonMark |
| Verschachtelte Aufzählungen | Markdown schreibt hier nur vier Leerzeichen für zu einem Punkt gehörende Folgeabsätze vor. Wie viele für eine verschachtelte Aufzählung benötigt werden, ist nicht explizit geregelt und wurde bisher in verschiedenen Implementierungen unterschiedlich gehandhabt. Beispiel: - foo - bar - baz | In CommonMark muss eine verschachtelte Liste um so viele Zeichen eingerückt werden, wie das auch ein Absatz sein müsste, um zur Liste zu gehören. Beispiel: - foo - bar - baz |
| Leerzeile vor Überschriften und Blöcken | Die meisten Implementierungen benötigen keine Leerzeile, was zu Mehrdeutigkeiten beim Auswerten führt. | Eine Leerzeile beendet einen Block |
| Leerzeile vor eingerücktem Quellcode | Wird von einigen Implementierungen benötigt, aber in der Dokumentation nirgends erwähnt | Eine Leerzeile wird benötigt, um einen neuen Block zu definieren. Der Quellcode wird um vier Zeichen eingerückt. Zum Beispiel: Funktion: int test(void) { return 42; } |