IServ-Wiki:Konvertierungsscript: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
K |
K (IServ-Wiki:Konvertierung wurde nach IServ-Wiki:Konvertierungsscript verschoben) |
||
(8 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | Ich arbeite zur Zeit an einem | + | 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 == | ||
+ | <ol> | ||
+ | <li>Eine Datei konvertieren (mit Pipes). Das Ergebnis wird auf stdout ausgegeben. | ||
+ | <pre>cat datei.txt | ./convert.pl</pre> | ||
+ | </li> | ||
+ | <li>Eine Datei konvertieren (ohne Pipes). Das Ergebnis wird als _datei.txt abgespeichert. | ||
+ | <pre>./convert.pl datei.txt</pre> | ||
+ | </li> | ||
+ | <li>Mehrere Dateien konvertieren. Die Dateien werden als _<Dateiname>.txt abgespeichert. | ||
+ | <pre>./convert.pl *.txt</pre> | ||
+ | </li> | ||
+ | </ol> | ||
+ | |||
+ | == convert.pl == | ||
<pre> | <pre> | ||
− | + | #!/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/%%(.+?)%%/<nowiki>$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> || </nowiki> reparieren (muss <nowiki>|</nowiki> 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) | ||
</pre> | </pre> | ||
− | + | == Probleme == | |
− | + | Die bisherigen Probleme scheinen alle gelöst zu sein. | |
− | + | ||
− | + | __NOTOC__ |
Aktuelle Version vom 22. August 2006, 14:10 Uhr
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.