IServ-Wiki:Konvertierungsscript: Unterschied zwischen den Versionen

Aus dem IServ-Wiki
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 sed-Script, dass die Konvertierung von DokuWiki-Artikeln in das MediaWiki-Format erleichern soll. Viele der kleinen Seiten können problemlos per Hand übersetzt werden, bei der Kommandozeilenreferenz ist das allerdings nicht so gut machbar...
+
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...
  
Aktueller Stand des Scripts:
+
'''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>
kommt noch ;)
+
#!/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/%%(.+?)%%/<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>
  
Testdatei mit DokuWiki-Sytnax:
+
== Probleme ==
<pre>
+
Die bisherigen Probleme scheinen alle gelöst zu sein.
dito
+
 
</pre>
+
__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

  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.