IServ-Wiki:Konvertierungsscript

Aus dem IServ-Wiki
Version vom 22. August 2006, 14:10 Uhr von Martin von Wittich (Diskussion | Beiträge) (IServ-Wiki:Konvertierung wurde nach IServ-Wiki:Konvertierungsscript verschoben)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
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

  1. Eine Datei konvertieren (mit Pipes). Das Ergebnis wird auf stdout ausgegeben.
    cat datei.txt | ./convert.pl
  2. Eine Datei konvertieren (ohne Pipes). Das Ergebnis wird als _datei.txt abgespeichert.
    ./convert.pl datei.txt
  3. 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/%% %%/\&nbsp\;/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.