#!/usr/bin/perl

=head1 NAME

pw2sfwiki.pl - pw2sfwiki.pl convert format from pukiwiki to sourceforge wiki.

=head1 SYNOPSIS

$ pw2sfwiki

=head1 AUTHOR

Yasumichi Akahoshi <yasumichi@users.sourceforge.jp>

=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('', <IN>);
	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);
}
