!!! Wiki-Konverter

Der Wiki-Konverter ist ein Perl-Script, das UseModWiki-Seiten in JspWiki-Seiten umwandelt. Bisher habe ich eine Beta-Version, die ich hier mal poste. Ich bitte um Tests und Anmerkungen, was noch fehlt. Ein bekanntes Problem sind Einrückungen mit ":".

Das Programm editiert nur die Seiten, die Peter verändert (gewrappt) und ins JspWiki kopiert hat. Ich hoffe, daß ich möglichst viele der von uns benutzten Formatierungen erwischt habe und dabei nichts "gefressen" habe. Besonders empfindlich sind z.B. Zeilenvorschübe, deren Verschwinden einiges durcheinanderbringen kann. Wenn hier keiner meckert, mache ich dann eine Version, die über das ganze Wiki geht.

''MarkusMonderkamp am 04.11.2006:\\Danke und Hut ab, die Version scheint alle Sonderfälle, auch meine kruden HTML-Einschübe, zu berücksichtigen. HTML-Entitäten für Umlaute sollen Plattform-Unabhängigkeit gewährleisten und Fett-Auszeichnungen per <b /> wirkten bei usemodwiki auch über mehrere Zeilen, die eingebauten Apostrophen nur für die aktuelle Zeile.''

;: Die HTML-Entitäten scheinen im normalen Text zu gehen, im preformatierten Teil nicht. Soweit ich das sehe, sollten HTML-Entitäten nicht nötig sein (sollte aber auch nicht stören). Wie ich bemerkte, hatte jede Deiner HTML-Verwendungen Ihren Sinn und hat die Usemod-Syntax sinnvoll erweitert. Leider scheint JspWiki viele Dinge einfach nicht zu können. AFAIK kann man hier auch HTML-Markup einschalten. Entweder ist das die Lösung oder wir schreiben eine eigene Markup-Engine für Usemod-Markup (oder [Wikicreole|http://www.wikicreole.org/] oder Wikipedia-Markup). Ich kann mich einfach nicht an die Ausrufungszeichen gewöhnen... Vielleicht diskutieren wir das mal im Limericks.


!! Version 0.3m

{{{
#!/usr/bin/perl

# WikiKonverter V0.3
#
# Aufruf mit 
# $ WikiKonverter.pl eingabe.txt >ausgabe.txt



# Datei einlesen
$_=join '',<>;

# Ist das überhaupt ein von Peter eingezogener 
# und noch nicht korrigierter Text?
unless (/^Dies.*?{{{/s){
  # ist kein unbearbeiteter Text
  print $_;
  exit;
}

# Hilfsvariable, weil ich das Skript sonst nicht ins Wiki stellen kann
$klammer='}' x 3;

# erstmal den Header und Footer wegmachen, die Peter angefügt hat
s/^Dies.*?{{{//s;
s/}{3}$//;

# Die meiste Verwirrung macht Peters Zeilen-gewrappe... :-(

# Die gewrapten Zeilen wieder zusammenbauen
#s/([^\n=-])\n([^* \n=-])/$1 $2/g;
s/(?<!(.\n|.=|--))\n([^* \n=:-])/$1 $2/g;
# manchmal hat Peter das = am Ende in eine eigene Zeile geschrieben
s/(?<!(.\n|.=|--))\n(=+\n)/$1 $2/g;
# manchmal steht auch sowas wie --ThomasBayen am Anfang einer Zeile
s/(?<!(.\n|.=|--))\n(--\s?[A-Z][a-z])/$1 $2/g;
# manchmal steht auch -- am Ende und ThomasBayen in der nächsten
s/[^-]--\n([A-Z][a-z])/-- $1/g;
# Freizeile am Anfang wegmachen
s/^\n//;

# Bereinigung von Seltsamigkeiten, die meine Regexe verwirren könnten
s/^\s+$//mg;

# Titelzeilen
s/^= (.*) =$/\!!! $1/mg;
s/^== (.*) ==$/\!! $1/mg;
s/^=== (.*) ===$/\! $1/mg;
s/^==== (.*) ====$/\__$1__/mg;

# Fettdruck
s/'''''(.*?)'''''/__''$1''__/sg;
s/'''(.*?)'''/__$1__/sg;

# <pre> vorsortieren
s/(.+)<\/pre>/$1\n<\/pre>/mg;

# vorformatierter Text durch Einrückung
s/((?:^(?: )+[^ :].*\n)+)/{{{\n$1$klammer\n/mg;

# Eingerückt und pre ist dopelt gemoppelt
s/<pre>(\s)*{{{/{{{/sg;
s/$klammer(\s)*<\/pre>/$klammer/sg;

# vorformatierter Text mit pre
s/<pre>(.*?)<\/pre>/{{{$1$klammer/sg;

# Links mit Text
s/\[(http:\S*) ([^\]]*)\]/[$2|$1]/g;

# nowiki gibt es in der Form nicht im JspWiki, 
# aber preformat kommt ihm vielleicht etwas nahe
# Leider kommt so alles im Monospaced Font
s/<nowiki>(.*?)<\/nowiki>/{{{$1$klammer/sg;

# Einrückungen gibt es nicht im JspWiki
# die Mehrfacheinrückungen gehen so nur in der ersten Zeile
#s/^\s*:\s*([^:])/;: $1/mg;
#s/^\s*::\s*([^:])/;:{{{    $klammer $1/mg;
#s/^\s*:::\s*([^:])/;:{{{        $klammer $1/mg;
#s/^\s*::::\s*([^:])/;:{{{            $klammer $1/mg;
#s/^\s*:::::\s*/;:{{{                $klammer/mg;

# Einrückungen per * sehen meistens besser aus
# sind aber blöd, wenn sie mit Aufzählungen kombiniert sind
s/^\s*:\s*([^:])/** $1/mg;
s/^\s*::\s*([^:])/*** $1/mg;
s/^\s*:::\s*([^:])/**** $1/mg;
s/^\s*::::\s*([^:])/***** $1/mg;
s/^\s*:::::\s*/****** /mg;

# <br> wird von MarkusMonderkamp gerne innerhalb von Einrückungen benutzt
# Das gleiche Ergebnis gibt's in JspWiki nicht
# So wie ich es mache, gibt es eine gleichwertige Einrückung
# ::: Sorry f&uuml;r die Inline-Antwort. &lt;br/> sorgte f.den Erhalt der umliegenden Usemodwiki-Auszeichnung.
# ::: Danke f. die Umwandlung - MarkusMonderkamp
s/^(\*+)([^*].*)<br>/$1$2\n$1 /mg;
s/^(\*+)([^*].*)<br>/$1$2\n$1 /mg;
s/^(\*+)([^*].*)<br>/$1$2\n$1 /mg;
s/^(\*+)([^*].*)<br>/$1$2\n$1 /mg;
s/^(\*+)([^*].*)<br>/$1$2\n$1 /mg;
s/<br>/\n\n/mg;

# <b> wurde von MarkusMonderkamp benutzt. Baeh!
# ::: Ack - volle Zustimmung, Fett-Auszeichnungen per ''' ... ''' gelten in Usemodwiki nur 
# ::: f. die aktuelle Zeile. MarkusMonderkamp 
s/<\/?b>/__/mg;


# Bemerkung zum Abschluss:
# Das WikiMarkup von JspWiki ist klar unterlegen!

# und das Ergebnis ausgeben
print;
}}}

!!JSPWiki Filter

Als Alternative zum Konvertierungsskript von Thomas habe ich einen Filter für das JSPWiki angefangen. Die Sourcen als Anhang...

Das mache ich ganz ohne reguläre Ausdrücke (Schande über mein Haupt).

;: Was heisst hier Schande?!? Das Perl-Motto ist schliesslich [TMTOWDTI|http://catb.org/jargon/html/T/TMTOWTDI.html]

Was der Filter noch nicht kann:
* Links umsetzen
** normale Links funktionieren jetzt, InterWiki-Links jedoch nicht.
* die nowiki-Syntax
* HTML-Code von Markus
** IMO nicht erforderlich, solange JSP-Wiki-Tags über mehrere Zeilen wirken,\\denn daf&uuml;r waren die HTML-Knubbel in Usemodwiki hilfreich
* in {{{ {{{ }}}-Umgebung wird trotzdem ersetzt :-(
** Das Problem ist gelöst.
* bitte fortsetzen...

;: Also ehrlich gesagt war die Entwicklung obigen Skriptes ein Try & Error-Verfahren mit -zig Versuchen. D.h. Austesten musst Du den Code wohl selber (oder wir machen mal eine Session zum Thema in der LUG). Es waren gerade die subtilen Problemchen, die mich aufgehalten haben. Andererseits ist die Frage, ob das Ergebnis unbedingt 100% Usemod-konform sein soll (wir also kein Byte ändern müssen) oder ob wir nur eine "saubere" Implementation wollen, die alles kann, was wir wollen (wenn auch in Details anders als vorher). IMHO würde letzteres reichen - wenn dann ab und an jemandem ein Fehlerchen auffällt, kann man das ja von Hand reparieren. -- ThomasBayen

::So, jetzt ist eine Version des [Filters|WikiKonverter/UseModFilter.java] installiert. Ich hoffe es gibt keine größeren Unfälle damit (geprüft per [Test|WikiKonverter/UseModFilterTest.java]).