IServ-Wiki:Konvertierungsscript
Zur Navigation springen
Zur Suche springen
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...
Update: Das Script scheint nun praktisch fertig zu sein. Es funktioniert genau genommen besser, als ich das je erwartet hätte :)
Aufruf
- Eine Datei konvertieren (mit Pipes). Das Ergebnis wird auf stdout ausgegeben.
cat datei.txt | ./convert.pl
- Eine Datei konvertieren (ohne Pipes). Das Ergebnis wird als _datei.txt abgespeichert.
./convert.pl datei.txt
- Mehrere Dateien konvertieren. Die Dateien werden als _<Dateiname>.txt abgespeichert.
./convert.pl *.txt
convert.pl
#!/usr/bin/perl -w use File::Basename; $outfile = ""; $outfile2 = ""; while (<>) { if($ARGV ne "-") { if($ARGV ne $outfile) { # bisher geöffnete Datei schließen if($outfile) { close(OUT); } # neuen Dateinamen bestimmen $outfile = $ARGV; $outfile2 = dirname($ARGV) . "/_" . basename($ARGV); print STDERR "Verarbeite Datei $outfile2...\n"; open(OUT, ">$outfile2"); } } else { if(!$open) { open(OUT, ">&STDOUT"); $open = 1; } } # Artikel-Überschriften entfernen, die sind im MW automatisch s/====== [^=]* ======//g; # 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~//(.+?)//~''$1''~g; # Fettgedruckt-Tags s~\*\*(.+?)\*\*~'''$1'''~g; # Platzhalter für leere Tabellenzellen sind jetzt überflüssig s/%% %%/\ \;/g; # nowiki-Tags s/%%(.+?)%%/$1<\/nowiki>/g; # Zeilenumbrüche s/([ \n])\\\\([ \n])/$1\<br\/\>$2/g; # Fußnoten s/\(\((.*)\)\)/\<ref\>$1\<\/ref\>/g; # HTTP-Links etc. s~\[(\[.+//.*\])\]~$1~g; s~(\[.+)\|(.+\])~$1 $2~g; # Listen s/^ -/#/g; s/^ \*/\*/g; ### Tabellen ################# # Das DokuWiki beendet eine TH-Zeile mit einem ^, eine TD-Zeile mit einem |. # Das MediaWiki beendet Zeilen nur mit dem Zeilenumbruch, daher müssen wir # die überstehenden Zeichen ^ und | entfernen. if(/^\^/) { s/(.*)\^/$1/; } if(/^\|/) { s/(.*)\|/$1/; } # Das erste ^ ersetzen wir nun durch ein "! ", das erste | wird nur um ein # Leerzeichen ergaenzt. if(/^\^/) { s/^\^/! /; } if(/^\|/) { s/^\|/\| /; } # Alle weiteren ^ ersetzen wir durch " !! ". if(/^!/) { s/\^/ !! /g; } # Alle weiteren | ersetzen wir durch " || ". if(/^\|/) { s/^\|/\{pipe\}/; } # das erste | maskieren s/(\[\[.+)\|(.+\]\])/$1\{pipe\}$2/g; # | in Links maskieren if(/\|/) { s/\|/ \|\| /g; } # | durch || ersetzen s/\{pipe\}/\|/g; # maskierte | wiederherstellen # TR-Tags: |- if(/^!/) { s/$/\n\|-/; } if(/^\|/) { s/$/\n\|-/; } # <nowiki> || reparieren (muss | heißen) s/\<nowiki\> *\|\| *\<\/nowiki\>/\<nowiki\>\|\<\/nowiki\>/g; # Tabellenanfangs-Tag s/^!/{| class="wikitable"\n$&/g; #------------------------------------------------------------------------------- # dieser Teil arbeitet nicht zeilenweise, sondern absatzweise! # das ist eigentlich nur nötig, um das Tabellenende-Tag |} einzufügen. $old = $/; $/ = "\n\n"; s/(.*?{\|.*?)\n\n/$1\n\|}\n\n/gs; $/ = $old; #------------------------------------------------------------------------------- print OUT; } close(OUT)
Probleme
Die bisherigen Probleme scheinen alle gelöst zu sein.