IServ-Wiki:Konvertierungsscript
Version vom 4. August 2006, 23:10 Uhr von Martin von Wittich (Diskussion | Beiträge)
Ich arbeite zur Zeit mit Jörgs Hilfe an einem Perl-Script, das die Konvertierung von DokuWiki-Artikeln in das MediaWiki-Format erleichern soll. Viele der kleinen Seiten können problemlos per Hand übersetzt werden, bei der Seiten wie der Kommandozeilenreferenz ist das allerdings nicht so gut machbar...
Das Konvertierungsscript besteht in Wirklichkeit aus zwei Scripts. Das Erste (convert.pl) arbeitet die Eingabedatei zeilenweise ab, das Zweite (convert2.pl) lädt die gesamte Datei auf einmal in den Puffer, da die Erkennung von DokuWiki-Tabellenenden mehrere Zeilen durchsucht werden müssen.
Aufruf
cat artikel.txt | ./convert.pl | ./convert2.pl
convert.pl
#!/usr/bin/perl -p -w # Ueberschriften if (/^=/m) { s/======/=/g or s/=====/==/g or s/====/===/g or s/===/====/g or s/==/=====/g; } # Schreibmaschinenschrift-Tags s/''(.+?)''/<tt>$1<\/tt>/g; # Kursiv-Tags s~//~''~g; # Fettgedruckt-Tags s~**~'''~g; # Platzhalter für leere Tabellenzellen sind jetzt überflüssig s/%% %%//g; ############################## ### Tabellen ################# ############################## # Im MediaWiki werden Tabellen durch {| eingeleitet, im DokuWiki werden # Tabellen gar nicht eingeleitet. Wir suchen daher einfach alle DokuWiki- # Tabellenheader heraus, und stellen ihnen die MediaWiki-Einleitung voran. # Das DokuWiki beendet eine TH-Zeile mit einem ^, eine TD-Zeile mit einem |. # Das MediaWiki beendet Zeilen nur mit dem Zeilenumbruch, daher muessen wir # die ueberstehenden Zeichen ^ und | entfernen. if(/^\^/m) { s/(.*)\^/$1/; } if(/^\|/m) { s/(.*)\|/$1/; } # Das erste ^ ersetzen wir nun durch ein "! ", das erste | wird nur um ein # Leerzeichen ergaenzt. if(/^\^/m) { s/^\^/! /; } if(/^\|/m) { s/^\|/\| /; } # Alle weiteren ^ ersetzen wir durch " !! ". if(/^!/m) { s/\^/ !! /g; } # Alle weiteren | ersetzen wir durch " || ". # Zu dem Zweck muessen wir das erste | temporaer entfernen, es wird nachher # wiederhergestellt. Sonst wuerde das erste auch ersetzt werden :-/ if(/^\|/m) { s/^\|//m; } # das erste | löschen if(/\|/m) { s/%%\|%%/{pipe}/g } # escapte | maskieren if(/\|/m) { s/\|/ \|\| /g; } # | durch || ersetzen if(/\|/m) { s/.*/\|$&/; } # das erste | wiederherstellen # demaskieren und übersetzen if(/{pipe}/m) { s/{pipe}/<nowiki>\|<\/nowiki>/g; } # Tabellenanfangs-Tag # muss zuletzt ausgeführt werden, da diese Anweisung die Zeilenumbrüche # verfummelt. s/^!/{| class="wikitable"\n$&/g;
convert2.pl
#!/usr/bin/perl -w undef $/; while (<>) { s/(.*!.*|.*)\n\n/$1\n|}\n/g; print; }
Testdatei mit DokuWiki-Sytnax
== Header 1 == === Header 2 === ^Kopf^Kopf^Kopf^Kopf^ |Spalte|Spalte|Spalte|Spalte| |Spalte|Spalte|Spalte|Spalte| |Spalte|Spalte|Spalte|Spalte|
Probleme
Die bisherigen Probleme scheinen alle gelöst zu sein.