====== Parser fuer Dokuwiki-Markup ======
{{tag>project software computing }}
{{process:shack-heritage-badge.png}}
===== Plan =====
Einen Parser fuer Dokuwiki-Markupup nach XML.
Fernziel ist ein Toolkit, um Wikimarkups ueber ein Zwischenformat
ineinander ueberfuehren zu koennen, so wie netpbm das fuer Pixelformate
kann.
===== Status =====
Killed.
Es war einfacher, die passenden Plugins fuer Dokuwiki zu suchen und einzurichten,
als den Parser nachzuprogrammieren.
===== Ansaetze =====
==== 1. s/// ====
Ersetze %%'%%''%%//%%''' durch %%'%%''''' bzw. jedes 2. %%'%%''%%//%%''' eben durch %%'%%'''''.
Failt bei der ersten URL: %%'%%''%%http://www...%%''' -> %%'%%''%%http:www...%%'''
==== 2. Lex & Yacc ====
Hier in der Variante der Perlmodule Parse::Lex und Parse::Yacc.
Besondere Schmankerl:
* Wikicode ist natuerlich keine Programmiersprache:
* zwischen relevanten Tags fliegt viel Zeug rum, das fuer die Auszeichnung irrelvant, aber tatsaechlich wichtig ist: der Inhalt. %%;-)%%
* die Auszeichnungstoken genuegen keiner einheitlichen Syntax z.B.:
// | {{...}}
* innerhalb bestimmter Tags verhalten sich Auszeichnungstoken nochmal anders (s.o.)
* manche Token gelten nur am Zeilenanfang:
' *' ' 1'
* newline ( 0x0a ) ist kein any-char sondern braucht ne Extra-Aufforderung:
(\n|.)
* whitespace ( 0x20 ) ist auch kein any-char. die ueblichen RE-Tricks ziehen nicht. Man muss es im Lexer einstellen:
$lexer->skip('');
=== next steps ===
Die Vorrangregeln sind undurchsichtig. Diese muessen als naechste erfasst werden.
* Ueberschriften (====== .. = zwischen \n) haben Vorrang vor Tags (%%,,%%)
* Tags (%%,,%%) haben Vorrang vor Fontangaben (%% ** // __ %%)
* Bei verzahnten (a b a b ) Tags (%%,,%%) hat das erstgenannte Vorrang
* Bei verschachtelten Tags (a b a b) Tags (%%,,%%) hat das aeussere Vorrang
* "Block"-Tags (%%,%%) haben Vorrang vor "Dekorations"-Tags (%% %%)
* ...
* Images
* Links koennen Images enthalten, rangieren also nach nach diesen
* ...
* Zeilenorientierte Auszeichnung ( ' *' , \n ) rangiert weit hinten