#!/usr/bin/perl =head1 NAME pw2sfwiki.pl - pw2sfwiki.pl convert format from pukiwiki to sourceforge wiki. =head1 SYNOPSIS $ pw2sfwiki =head1 AUTHOR Yasumichi Akahoshi =cut use strict; use warnings; use Encode qw(from_to); # Options of convertion filename my $src_enc="euc-jp"; my $dist_enc="utf8"; # convert headline sub convert_headline { my $str = $_[0]; if($str =~ /^\*/) { $str =~ s/^\*\*\*/=== /; $str =~ s/^\*\*/== /; $str =~ s/^\*/= /; } return $str; } # convert link sub convert_link { my $str = $_[0]; if($str =~ /^\S/) { $str =~ s/\[\[([^:\]]+):([^\]]+)\]\]/\[$2 $1\]/g; $str =~ s/\[\[([^\]]+)\]\]/\[$1\]/g; } return $str; } # convert list sub convert_list { my $str = $_[0]; # unnumbering list if($str =~ /^-/) { $str =~ s/^---/ \* /; $str =~ s/^--/ \* /; $str =~ s/^-/ \* /; } # ordered list if($str =~ /^\+/) { $str =~ s/^\+\+\+/ 1\. /; $str =~ s/^\+\+/ 1\. /; $str =~ s/^\+/ 1\. /; } return $str; } # convert table sub convert_table { my $str = $_[0]; if($str =~ /^\|/) { $str =~ s/\|/\|\|/g; } return $str; } # convert plugin sub convert_plugin { my $str = $_[0]; $str =~ s/^#contents/\[\[PageOutline\]\]/; $str =~ s/^#ref\(([^\)])\)/\[\[Embed\($1\)\]\]/; $str =~ s/^#p?comment/\[\[LineComment\]\]/; $str =~ s/^#ls2\(([^\,]+)/\[\[TitleIndex\($1\)\]\]/; $str =~ s/^#ls2/\[\[TitleIndex\]\]/; return $str; } # make result filename from source filename. sub get_result_filename { my $filename = $_[0]; # decode pukiwiki filename. $filename =~ s/[a-fA-F\d]+/pack("H*", $&)/eg; from_to($filename, $src_enc, $dist_enc); # escape meta character. $filename =~ s/([\\\/\*\?\|"<>:,;% ])/'%' . unpack('H2', $1)/eg; # from Walrus,Digit. - http://digit.que.ne.jp/work/ # remove braket $filename =~ s/\[//g; $filename =~ s/\]//g; return $filename; } # main program # define variables my $results_dir='./pw2sfwiki_results'; my $result_file; my $contents; my $line; # make directory which save resulsts if (!-d $results_dir) { mkdir $results_dir or die "Error: directory $results_dir was not created."; } foreach (<*.txt>) { $result_file = $_; open(IN, $_); $contents = join('', ); close(IN); # skip comment $contents =~ s/^\/\/.*$//mg; $contents =~ s/\n{3,}/\n\n/sg; # preformatted text $contents =~ s/((\n |^ )[^\n]*){1,}/\n\{\{\{\n$&\n\}\}\}\n/sg; $contents =~ s/\{\{\{\n{2,}/\{\{\{\n/sg; # Get distination filename. $result_file = &get_result_filename($_); open(OUT, "> $results_dir/$result_file"); foreach $line (split(/\n/,$contents)) { # convert $line = &convert_headline($line); # Headline $line = &convert_link($line); # Link $line = &convert_list($line); # List $line = &convert_table($line); # Table $line =~ s/&br;/\[\[BR\]\]/g; # force break. if ($line =~ /^#/) { $line = &convert_plugin($line); # plugin } # output result print OUT $line."\n"; } close(OUT); }