IServ-Wiki:Konvertierungsscript: Unterschied zwischen den Versionen

Aus dem IServ-Wiki
Zur Navigation springen Zur Suche springen
K
K
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...
:Ich bin gerade dabei, das Script mit Jörgs Hilfe nach Perl zu portieren. Das ermöglicht es dem Script, einige Sachen besser zu machen. --[[Benutzer:Martin von Wittich|Martin von Wittich]] 23:53, 3. Aug 2006 (CEST)
 
  
== Konvertierungs-Script ==
+
Das Konvertierungsscript besteht in Wirklichkeit aus zwei Scripts. Das Erste (<tt>convert.pl</tt>) arbeitet die Eingabedatei zeilenweise ab, das Zweite (<tt>convert2.pl</tt>) 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 ==
 
<pre>
 
<pre>
#!/bin/sed -f
+
#!/usr/bin/perl -p -w
  
 
# Ueberschriften
 
# Ueberschriften
s/======/=/g;t headersdone
+
if (/^=/m)      { s/======/=/g or s/=====/==/g or s/====/===/g or s/===/====/g or s/==/=====/g; }
s/=====/==/g;t headersdone
+
# Schreibmaschinenschrift-Tags
s/====/===/g;t headersdone
+
s/''(.+?)''/<tt>$1<\/tt>/g;
s/===/====/g;t headersdone
+
# Kursiv-Tags
s/==/=====/g;t headersdone
+
s~//~''~g;
:headersdone
+
# Fettgedruckt-Tags
 +
s~**~'''~g;
 +
# Platzhalter für leere Tabellenzellen sind jetzt überflüssig
 +
s/%% %%//g;
  
 
##############################
 
##############################
Zeile 21: Zeile 28:
 
# Tabellen gar nicht eingeleitet. Wir suchen daher einfach alle DokuWiki-
 
# Tabellen gar nicht eingeleitet. Wir suchen daher einfach alle DokuWiki-
 
# Tabellenheader heraus, und stellen ihnen die MediaWiki-Einleitung voran.
 
# Tabellenheader heraus, und stellen ihnen die MediaWiki-Einleitung voran.
/^\^/ i\
 
{| class="wikitable"
 
  
 
# Das DokuWiki beendet eine TH-Zeile mit einem ^, eine TD-Zeile mit einem |.
 
# Das DokuWiki beendet eine TH-Zeile mit einem ^, eine TD-Zeile mit einem |.
 
# Das MediaWiki beendet Zeilen nur mit dem Zeilenumbruch, daher muessen wir
 
# Das MediaWiki beendet Zeilen nur mit dem Zeilenumbruch, daher muessen wir
# die ueberstehenden Zeichen entfernen.
+
# die ueberstehenden Zeichen ^ und | entfernen.
/^\^/ s/\(.*\)\^/\1/
+
if(/^\^/m)      { s/(.*)\^/$1/; }
/^|/ s/\(.*\)|/\1/
+
if(/^\|/m)      { s/(.*)\|/$1/; }
  
 
# Das erste ^ ersetzen wir nun durch ein "! ", das erste | wird nur um ein
 
# Das erste ^ ersetzen wir nun durch ein "! ", das erste | wird nur um ein
 
# Leerzeichen ergaenzt.
 
# Leerzeichen ergaenzt.
/^\^/ s/^\^/! /
+
if(/^\^/m)      { s/^\^/! /; }
/^|/ s/^|/| /
+
if(/^\|/m)      { s/^\|/\| /; }
  
 
# Alle weiteren ^ ersetzen wir durch " !! ".
 
# Alle weiteren ^ ersetzen wir durch " !! ".
/^!/ s/\^/ !! /g
+
if(/^!/m)      { s/\^/ !! /g; }
 
# Alle weiteren | ersetzen wir durch " || ".
 
# Alle weiteren | ersetzen wir durch " || ".
 
# Zu dem Zweck muessen wir das erste | temporaer entfernen, es wird nachher
 
# Zu dem Zweck muessen wir das erste | temporaer entfernen, es wird nachher
 
# wiederhergestellt. Sonst wuerde das erste auch ersetzt werden :-/
 
# wiederhergestellt. Sonst wuerde das erste auch ersetzt werden :-/
/^|/ s/|//
+
if(/^\|/m)      { s/^\|//m; }          # das erste | löschen
/|/ s/|/ || /g
+
if(/\|/m)      { s/%%\|%%/{pipe}/g }  # escapte | maskieren
/|/ s/.*/|&/
+
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;
 +
</pre>
 +
 
 +
== convert2.pl ==
 +
<pre>
 +
#!/usr/bin/perl -w
 +
 
 +
undef $/;
 +
 
 +
while (<>)
 +
{
 +
        s/(.*!.*|.*)\n\n/$1\n|}\n/g;
 +
        print;
 +
 
 +
}
 
</pre>
 
</pre>
  
Zeile 58: Zeile 85:
  
 
== Probleme ==
 
== Probleme ==
 +
Die bisherigen Probleme scheinen alle gelöst zu sein.
  
<ol>
+
__NOTOC__
<li>Das Tabellenende wird im MediaWiki mit <tt><nowiki>|}</nowiki></tt> markiert, das Script ist jedoch nicht in der Lage, dies an die Tabellen anzuhängen. Mir ist es nicht gelungen, mit <tt>sed</tt> das Ende einer DokuWiki-Tabelle zu erkennen, unter anderem deshalb, weil <tt>sed</tt> den Zeilenumbruch vor Scriptausführung ausfiltert.
 
:Jörg hat einen Lösungsvorschlag, ich bin allerdings noch nicht dazu gekommen, ihn zu testen. --[[Benutzer:Martin von Wittich|Martin von Wittich]] 23:53, 3. Aug 2006 (CEST)</li>
 
<li><del>Die Schreibmaschinenschrift wird im Dokuwiki mit <nowiki>''</nowiki> ein- und ausgeschaltet. Die entsprechenden Tags dazu im MediaWiki sind <tt><nowiki><tt></nowiki></tt> und <tt><nowiki></tt></nowiki></tt>. Das sed-Script ersetzt einfachheitshalber alle <nowiki>''</nowiki> durch <tt><nowiki><tt></nowiki></tt>.</del> gelöst --[[Benutzer:Martin von Wittich|Martin von Wittich]] 23:53, 3. Aug 2006 (CEST)</li>
 
</ol>
 

Version vom 4. August 2006, 23: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...

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.