PukiWikiをMoinMoinに

以前 PukiWiki から MoinMoin に切り替えたときに、データを変換するために書いたスクリプトです。

割り切って、変換できなかったところは手で修正することにしたため、かなり adHoc なスクリプトになっており汎用性は低いですが、もしかしたら役に立つことがあるかも知れないので掲載しておきます。


```puki2moin.pl
#!/usr/bin/perl
while (<>) {
  if (/^\S/ && $text_block) {
      undef $text_block;
    print "}}}\n";
  }
  if (m!^//!) {
    s/^/##/; print; next;
  }
  if (/^#contents/) {
    print "<<TableOfContents>>\n"; next;
  }
  if (/^#comment/) {
    print "<<Comments>>\n";
    print "<<AddComment>>\n";
    next;
  }
  if (/^#setlinebreak(\((on|off|default)\))?/) {
    if ($1 == 'on') {
      $linebreak = 1;
    } elsif ($1 == 'off') {
      $linebreak = 0;
    } elsif ($1 == 'default') {
      $linebreak = 1;
    } else {
      $linebreak = 1;
    }
    s/^#(setlinebreak)/##$1/;
  }
  if (/^#lsx/) {
    print '##<<Include(^@PAGE@/[^/]*$, , 2, sort=ascending, titlesonly)>>', "\n";
    print '<<ListPages(search_term=^@PAGE@/[^/]*$, list_type=number_list, link=subpage)>>', "\n";
    next;
  }
  if (/#fold/) {
    s/^/SeeSaw/;
  }
  s/#br/<<BR>>/g;
  s/\&br;/<<BR>>/g;
  if (/^\~$/) {
    print "\n";
    next;
  }
  s/\~$/<<BR>>/;
  if (/^\&size\(\d+\){"?(.*?)"?};/i) {
    print "= $1 =\n"; next;
  }
  s/^(\*+.*?)\s*\[#g5c2de5c.*\]$/$1/;
  s/^(\*+)\&size\(\d+\){"?(.*?)"?};/$1$2/i;
  s/^\&color\((\w+)\){(.*)};?/<<Color2("$2",$1)>>/i;
  s/\&size\(\d+\){(.*)};?/~+$1+~/i;
  s/\%{2}(.*)\%{2}/--($1)--/g;
  s/^(--(.+)--)/\`\`$1/; # mark to avoid itemize
  s/''/'''/g;
  if (/^\|/) {
    if (/\|h$/) {
      s/\|h$/|/;
      s/^\|/|<rowstyle="background-color:  #E0E0FF;">/;
    }
    if (/\|c$/) {
      # row style
      s/\|c$/|/;
    }
    s/\|LEFT:/|<style="text-align: left;">/g;
    s/\|RIGHT:/|<style="text-align: right;">/g;
    s/\|BGCOLOR\((.*)\):/|<bgcolor="$1">/g;
    s/\|/||/g;
  }
  s/\[\[(.*)>(.*)\]\]/[[$2|$1]]/;
  s/#ref\((\S+\.(png|gif|jpg))\)/{{attachment:$1}}/;
  s/\&ref\((\S+\.(png|gif|jpg)),,(\S+)\);?/{{attachment:$1|$3}}/;
  s/#ref\((\S+\.(png|gif|jpg)),(\S+)\);?/{{attachment:$1}}/;
  if (/^:/) {
    s/^:(.*)\|(.*)/ $1:: $2/;
    print; next;
  }
  if (/^[*]/ && $depth) {
    undef $depth;
  }
  if (/^(\*+)/) {
    $tag = $1;
    $tag =~ s/\*/=/g;
    $_ =~ s/^(\*+)\s*(.*?)(\s*\[#[a-z0-9]*\])?$/=$tag $2 $tag=/;
    print; next;
  }
  if (/^----+$/) {
    print; next;
  }
  if (/^(-{1,3})/) {
    # itemize
    $depth = length($1);
    print ' ' x $depth;
    print '* ', $';
    next;
  }
  if (/^(\+{1,3})/) {
    # enumerate
    $depth = length($1);
    print ' ' x $depth;
    print '1. ', $';
    next;
  }
  if (/^\s+/) {
    # text block
    unless ($text_block) {
      if (/^$/) { print; next; }
      $text_block = 1;
      print ' ' x $depth if ($depth);
      print "{{{\n";
    }
    print $';
    next;
  }
  if ($depth > 0) {
    print ' ' x $depth;
    if ($linebreak) { s/$/<<BR>>/; }
    print $_;
    next;
  }
  if (/^$/) {
    print; next;
  }
  s/\&lastmod;/<<lastmodified()>>/;
  if (/^RIGHT:(更新日時.*)$/) {
    print "<<span(style=\"float: right; vertical-align: bottom\")>>$1<<span>><<BR>>\n";
    next;
  }
  s/\`\`(--(.+)--)/$1/; # drop mark
  print;
  #if ($linebreak && $last !~ /^$/) { print "\n"; }
  #$last = $_;
}
if ($text_block) {
  undef $text_block;
  print "}}}\n";
}
```