#!/usr/bin/perl -w # # Bad hack to convert Swiki to DokuWiki use strict; my $in= $ENV{'HOME'}."/Applications/ComSwiki/swiki/wiki"; my $out=$ENV{'HOME'}."/WebServer/Documents/wiki/data"; # -------------- # Scan directory # -------------- my @pages; opendir DIR, $in."/pages"; while ($_=readdir(DIR)) { if (/(\d+)\.xml/) { push @pages, $1; } } closedir DIR; @pages=sort {$a <=> $b} @pages; # ---------- # Read Pages # ---------- my %pages; foreach my $id (@pages) { $pages{$id}=""; open IN, $in."/pages/$id.xml"; while() { s/\r/\n/g; $pages{$id}.="$_\n"; } close IN; } my %title; my %text; foreach my $id (@pages) { my $temp; my $eof=0; foreach (split(/\n/, $pages{$id})) { chomp; if (m/(.*)<\/name>/) { $title{$id}=$1; } if (defined $temp) { if (/(.*)<\/text>/) { $temp.="$1\n"; $eof=1; } else { if (! $eof) { $temp.=$_."\n"; } } } else { if (/(.*)/) { $temp="$1\n"; } } } $text{$id}=$temp; } # ----------- # Write Pages # ----------- foreach my $id (@pages) { my $title=$title{$id}; my $text=$text{$id}; my $file=$title; $file=~tr/A-Z/a-z/; # lowercase $file=~s/^\///; # leading slash $file=~s/^\.//; # leading dot $file=~tr/ '+\//____/; # special characters $file=~s/[_]+/_/g; # multiple underscores open OUT, ">".$out."/pages/".$file.".txt"; print OUT "====== $title ======\n"; foreach (split(/\n/, $text)) { chomp; s/\*(\d+)\*/[[$title{$1}]]/g; # other wiki page s/\*\+([^\+]+)\+\*/{{$file:$1|$1}}/g; # embedded media s/\*([^&]+)>([^\*]+)\*/[[$2|$1]]/g; # link with description s/\*([^\*]*)\*/[[$1]]/g; # external link s/<font color="white">/<\/html>/g; s/<\/font>/<\/font><\/html>/g; s/<strike>/<\/html>/g; s/<\/strike>/<\/strike><\/html>/g; s/<i>/\/\//g; s/<\/i>/\/\//g; s/<b>/**/g; s/<\/b>/**/g; s/^- / * /g; s/^-- / * /g; s/^--- / * /g; s/^---- / * /g; s/^_$//g; s/^!(.*)$/===== $1 =====/g; s/<br>/
<\/html>/g; s/<tt>/''/g; s/<\/tt>/''/g; s/&star;/*/g; s/&nbsp;/ /g; s/<code>//g; s/<\/code>/<\/code>/g; s/<//g; s/&lt;//g; print OUT "$_\n"; } close OUT; }