#!/usr/bin/perl

use MDK::Common;

# convert twiki to mediawiki syntax

foreach my $file (@ARGV) {
    print "processing $file\n";
    my ($toc_found, $header_found, $in_a_link);
    substInFile {
        # the meat, the regexps were taken from http://twiki.org/cgi-bin/view/Plugins/MediawikiEditSyntaxRegex#TWiki
        s/\*([^*]*?)\*/''$1'''/g; # bold
        s/\b__(.*?)__/''<b>$1<\/b>''/g; # italic bold
        s/\b_([^_]*?)_/''$1''/g; # italic
        s/(^|[\s\(])==([^ ].*?[^ ])==([\s\)\.,\:;!\?]|$)/$1'''<tt>$2<\/tt>'''$3/; # monospaced bold
        s/(^|[\s\(])=([^ ].*?[^ ])=([\s\)\.,\:;!\?]|$)/$1<tt>$2<\/tt>$3/; # monospaced
        s/(^|[\n\r])---\+\+\+\+\+\+([^\n\r]*)/$1======$2 ======/; # H6
        s/(^|[\n\r])---\+\+\+\+\+([^\n\r]*)/$1=====$2 =====/; # H5
        s/(^|[\n\r])---\+\+\+\+([^\n\r]*)/$1====$2 ====/; # H4
        s/(^|[\n\r])---\+\+\+([^\n\r]*)/$1===$2 ===/; # H3
        s/(^|[\n\r])---\+\+([^\n\r]*)/$1==$2 ==/; # H2
        s/(^|[\n\r])---\+([^\n\r]*)/${1}=${2} =/; # H1
        s/\[\[(http\:.*?)\]\[(.*?)\]\]/\[$1 $2\]/g; # FIXME: THIS WORKAROUNDS AN ISSUE IN NEXT REGEXP
        s/\[\[(https?\:.*?)\]\[(.*?)\]\]/\[$1 $2\]/g; # external link [[http:...][label]]
        s/\[\[([^\]]*)\]\]/\[\[$1\|$1\]\]/g; # internal link [[WikiWord][WikiWord]]
        s/\[\[([^\]]*)\]\[(.*?)\]\]/\[\[$1\|$2\]\]/g; # internal link [[WikiWord][label]]
        s/(^|[\n\r])[ ]{3}\* /$1\* /; # level 1 bullet
        s/(^|[\n\r])[ ]{6}\* /$1\*\* /; # level 2 bullet
        s/(^|[\n\r])[ ]{9}\* /$1\*\*\* /; # level 3 bullet
        s/(^|[\n\r])[ ]{12}\* /$1\*\*\*\* /; # level 4 bullet
        s/(^|[\n\r])[ ]{15}\* /$1\*\*\*\*\* /; # level 5 bullet
        s/(^|[\n\r])[ ]{18}\* /$1\*\*\*\*\*\* /; # level 6 bullet
        s/(^|[\n\r])[ ]{21}\* /$1\*\*\*\*\*\*\* /; # level 7 bullet
        s/(^|[\n\r])[ ]{24}\* /$1\*\*\*\*\*\*\*\* /; # level 8 bullet
        s/(^|[\n\r])[ ]{27}\* /$1\*\*\*\*\*\*\*\*\* /; # level 9 bullet
        s/(^|[\n\r])[ ]{30}\* /$1\*\*\*\*\*\*\*\*\*\* /; # level 10 bullet
        s/(^|[\n\r])[ ]{3}[0-9]\.? /$1# /; # level 1 bullet
        s/(^|[\n\r])[ ]{6}[0-9]\.? /$1## /; # level 2 bullet
        s/(^|[\n\r])[ ]{9}[0-9]\.? /$1### /; # level 3 bullet
        s/(^|[\n\r])[ ]{12}[0-9]\.? /$1#### /; # level 4 bullet
        s/(^|[\n\r])[ ]{15}[0-9]\.? /$1##### /; # level 5 bullet
        s/(^|[\n\r])[ ]{18}[0-9]\.? /$1######/g; # level 6 bullet
        s/(^|[\n\r])[ ]{21}[0-9]\.? /$1#######/g; # level 7 bullet
        s/(^|[\n\r])[ ]{24}[0-9]\.? /$1########/g; # level 8 bullet
        s/(^|[\n\r])[ ]{27}[0-9]\.? /$1#########/g; # level 9 bullet
        s/(^|[\n\r])[ ]{30}[0-9]\.? /$1##########/g; # level 10 bullet
        s/(^|[\n\r])[ ]{3}\$ ([^\:]*)/$1; $2/g;  # $ definition: term

        #-----------------------------------------
        # extra stuff:
        # TOC:
        $toc_found ||= s/<div id="toc">//;
        if ($toc_found && m!</div>!) {
            s!</div>!!;
            undef $toc_found;
        }
        s/\%TOC\%/__TOC__/;

        # headers:
        $header_found ||= s/<div id="header">/<!--/;
        if ($header_found && m!</div>!) {
            s!</div>!-->!;
            undef $header_found;
        }
        s/\%TOC\%/__TOC__/;
        $old_empty_line = $empty_line;
        $empty_line = /^\n/;
        undef $_ if $empty_line && $old_empty_line;

        # images:
        s/<img src="([^"]*)">/[[Image::$1]]/;

        # auto keywords:
        s/(\s)([A-Z][a-z0-9_'-][A-Za-z0-9_'.-]+[A-Z][A-Za-z0-9_'-]*)/${1}[[$2]]/g if !/\[\[/; # don't mess up by creating links in links (poorly done)
        s/<nop>//g;
    } $file;
}

