Einordnung

  • Interaktionmodus: schnittstellendefinition
  • geschätzter Zeitwand:
    • Programmierneulinge: mehr als 8 Stunden (nicht empfohlen)
    • Sprachneulinge: ca. 8 Stunden
    • Spracherfahrene: ca. 5 Stunden
  • Sprachempfehlung:
    • Für jede Sprache interessant
    • Wählt eine Sprache in der ihr euch wohlfühlt

Aufgabe

Texte verstehen ist eine dieser Dinge die Menschen besonders gut können; Computer(-programme) aber eher nicht. Daher müssen wir uns häufig in das Feld der strukturierten Sprachen begeben. Diese Sprachen sind genau definiert, erlauben uns aber genug Freiheiten uns als Menschen auch auszudrücken. Eine der häufigsten Familien denen wir hier begegnen ist diejenige der sogenannten Markup-Sprachen, also Sprachen die dazu dienen Text in besonderer Art und Weise darzustellen. Markdown ist eine dieser Sprachen.

Ihr werdet nun einen Parser schreiben, der ein fest definiertes Subset von Markdown parsen kann. Ihr habt zwei Kernaufgaben. Die eine ist ein gegebenes Markdown-Dokument in ein HTML zu konvertieren. Die zweite ist Markdown Dokumente im Code so zu repräsentieren, dass andere Entwickler eure Anwendung als Bibliothek benutzen können um Markdown in weitere Dokumentenarten zu konvertieren (z.B. PDF, LaTeX oder eine andere noch nicht erfundene Sprache).

Wie genau ihr die Datei einlest sei euch selbst überlassen. Hier sind jedoch einige Vorschläge:

  • Präsentiert ein GUI-Fenster in dem der Text eingegeben werden kann
  • Lest eine Datei von STDIN (Standard Input) ein (Kommandozeilenbasiert)
  • Bekommt den Pfad übergeben und lest die entsprechende Datei ein (kann sowohl kommandozeilenbasiert als auch GUI-basiert sein)
  • Eine Funktion/Methode welche den Markdown-String übergeben bekommt (Low-Budget Lösung)

Tips:

  • Die meisten Sprachen haben existierende Bibliotheken zum Schreiben von Parsern.
  • Sollte eure Wunschsprache keine solche Bibliothek haben, ihr aber die Sprache benutzen wollen, solltet ihr einen Blick auf reguläre Ausdrücke werfen. Versucht aber nicht Markdown als regulären Ausdrück zu definieren, da Markdown rekursive Bestandteile hat. Basiert euren Algorithmus eher auf dem schrittweisen Anwenden von regulären Ausdrücken.
  • Für diejenigen die vor nichts zurückschrecken:
    • Man kann den Parser natürlich auch komplett von Hand schreiben indem man schrittweise einzelne Zeichen einliest und Tokens bildet.

Markdown-Subset Definition

  • Eine Überschrift wird mit einem # (Mesh)-Symbol vorangestellt. Mehrere Meshes geben die Tiefe der Überschrift an. Nach einem Mesh folgt zuerst ein Leerzeichen
    • # Eine HTML h1-Überschrift
    • ## Eine HTML h2-Überschrift
  • Listen werden über - am Zeilenanfang eingeleitet. Verschachtelte Listen werden über Einrückung definiert.

    - Erstes Element einer Liste
      - Erstes Element der verschachtelten Liste
    - Zweites Element der ersten Liste
    
  • Um ein Wort fett zu schreiben wird es mit je zwei Sternen (*) am Anfang und Ende des Wortes umschlossen.
    • **fett**
  • Um ein Wort kursiv zu schreiben wird es mit je einem Stern (*) am Anfang und Ende des Wortes umschlossen.
    • *kursiv*
  • Jeder weitere Text ist Teil eines Paragraphes. Paragraphen werden mit Leerzeilen voneinander getrennt. Ein Paragraph endet auch wenn ein neuer Abschnitt (z.B. durch eine Überschrift oder Liste) beginnt.

    Dies ist der erste Absatz dieses Textes.
    
    Und hier folgt ein zweiter Absatz.
    Diese Zeile gehört ebenfalls zum zweiten Absatz.
    

Beispiele

Beispiel 1

  • Eingabe:
# Informationen zu Markdown

## Einleitung

Diese Informationen sind **nur** für folgende Personen bestimmt:

- Teilnehmer der ONOC
- Personen mit Interesse an minimalem Markdown

## Inhalte

Ein erster Absatz kann auch nur aus einer Zeile bestehen.

Allerdings sind auch mehrere
Zeilen mit weniger Worten möglich
  • HTML-Ausgabe:
<h1>Informationen zu Markdown</h1>

<h2>Einleitung</h2>

<p>
  Diese Informationen sind <b>nur</b> für folgende Personen bestimmt:
</p>

<ul>
  <li>Teilnehmer der ONOC</li>
  <li>Personen mit Interesse an minimalem Markdown</li>
</ul>

<h2>Inhalte</h2>

<p>
  Ein erster Absatz kann auch nur aus einer Zeile bestehen.
</p>

<p>
  Allerdings sind auch mehrere
  Zeilen mit weniger Worten möglich
</p>