Jak nie tworzyć parsera Markdown w Node.js
Wymyśliłem sobie ostatnio nowy projekt - parser markdown w node.Założenia były proste - parser miał wczytywać plik tekstowy (proste) i zwracać wynikowy HTML (trudne).
Tekstu nie można parsować po prostu linia po linii, bo (przykładowo), w bloku blockquote może znaleźć się dowolny inny znacznik i on też musi być poprawnie sparsowany.
W projekcie wyodrębniłem kilka warstw:
- Tokenizer, dzielący tekst na zagnieżdżone podbloki tekstu o takim samym formatowaniu. Jest potrzebny, ponieważ Markdown może zawierać zagnieżdżone cytaty czy bloki list.
- TemplateChooser, który przyporządkowuje parser do bloku, na podstawie analizy tekstu przez regexy.
- Kilka parserów, do parsowania różnych typów tekstu objętego znacznikami. Przykładowe nazwy, to HeaderParser czy BlockquoteParser. Każdy parser, wykorzystuje odpowiedni regex pobierany z utils.
- Format danych, w którym słownie opisuje, jaki typ danych zawiera dany block i linia.
- Obsługę wejścia.