14. Markup converter design

pandoc(1) most probably implements a central generic DOM for markup conversion vs. a direct conversion between markup languages. The difference being development requirements of \(\Theta(n)\) vs. \(\Theta(n^2)\).

14.1. Direct conversion between markup languages

For each new markup language \(n\), a parser supporting \(n-1\) renderers must be written for translating the new language to all implemented languages. For \(n-1\) parsers a renderer must be added for translating the implemented languages to the new language.

digraph pandoc { layout = circo; RST [label="ReST"]; MD [label="markdown"]; HTML [label="HTML"]; MW [label="MediaWiki"]; JSON [label="MediaWiki"]; RST -> MD [label="p+r>"]; RST -> HTML [label="p+r>"]; RST -> MW [label="p+r>"]; RST -> JSON [label="p+r>"]; MD -> RST [label="p+r>"]; MD -> HTML [label="p+r>"]; MD -> MW [label="p+r>"]; MD -> JSON [label="p+r>"]; HTML -> RST [label="p+r>"]; HTML -> MD [label="p+r>"]; HTML -> MW [label="p+r>"]; HTML -> JSON [label="p+r>"]; MW -> RST [label="p+r>"]; MW -> MD [label="p+r>"]; MW -> HTML [label="p+r>"]; MW -> JSON [label="p+r>"]; JSON -> RST [label="p+r>"]; JSON -> MD [label="p+r>"]; JSON -> HTML [label="p+r>"]; JSON -> MW [label="p+r>"]; }

Progression for number of nodes and total number of edges / 2:

\[\begin{split}\begin{matrix} \mbox{nodes} & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\ \mbox{edges} / 2 & 0 & 0 & 1 & 3 & 6 & 10 & 15 & 21 & 28 & 36 & 45 \end{matrix}\end{split}\]

Identified on OEIS as sequence A161680 \(a(n) = \binom{n}{2} = \frac{n^2 - n}{2}\) (zero followed by a000217, triangular numbers: \(a(n) = \binom{n+1}{2} = \frac{n (n+1)}{2}\)).

14.2. Conversion via central abstract DOM

For each new markup language one parser (markup -> DOM) and one renderer (DOM -> markup) must be written to fully support translations between all previously implemented languages and the new language.

digraph pandoc { layout = circo; DOM [label="DOM"]; RST [label="ReST"]; MD [label="markdown"]; HTML [label="HTML"]; MW [label="MediaWiki"]; JSON [label="MediaWiki"]; RST -> DOM [label="parse>"]; MD -> DOM [label="parse>"]; HTML -> DOM [label="parse>"]; MW -> DOM [label="parse>"]; JSON -> DOM [label="parse>"]; DOM -> RST [label="render>"]; DOM -> MD [label="render>"]; DOM -> HTML [label="render>"]; DOM -> MW [label="render>"]; DOM -> JSON [label="render>"]; }

Progression for number of nodes and total number of edges / 2:

\[\begin{split}\begin{matrix} \mbox{nodes} & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\ \mbox{edges} / 2 & 0 & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \end{matrix}\end{split}\]

\(a(n) = \max(0, n-1)\) (see also A289207).