1#!/usr/bin/env perl
2
3use strict;
4use warnings;
5use bytes;
6
7my @nl_counts;
8my $last_nl_count_level;
9
10my @bl_counts;
11my $last_bl_count_level;
12
13sub fmt_pos ($) {
14    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};
15    $s;
16}
17
18sub fmt_mark ($$) {
19    my ($tag, $s) = @_;
20    my $max_level = 0;
21    while ($s =~ /([<>])\1*/g) {
22        my $level = length $&;
23        if ($level > $max_level) {
24            $max_level = $level;
25        }
26    }
27
28    my $times = $max_level + 1;
29    if ($times > 1) {
30        $s = " $s ";
31    }
32    return $tag . ('<' x $times) . $s . ('>' x $times);
33}
34
35while (<>) {
36    if ($. == 1) {
37        # strip the leading U+FEFF byte in MS-DOS text files
38        my $first = ord(substr($_, 0, 1));
39        #printf STDERR "0x%x", $first;
40        #my $second = ord(substr($_, 2, 1));
41        #printf STDERR "0x%x", $second;
42        if ($first == 0xEF) {
43            substr($_, 0, 1, '');
44            #warn "Hit!";
45        }
46    }
47    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;
48    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;
49    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;
50    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;
51    s{''(.*?)''}{fmt_mark('I', $1)}ge;
52    if (s{^\s*<[^>]+>\s*$}{}) {
53        next;
54    }
55
56    if (/^\s*$/) {
57        print "\n";
58        next;
59    }
60
61=begin cmt
62
63    if ($. == 1) {
64        warn $_;
65        for my $i (0..length($_) - 1) {
66            my $chr = substr($_, $i, 1);
67            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";
68        }
69    }
70
71=end cmt
72=cut
73
74    if (/(=+) (.*) \1$/) {
75        #warn "HERE! $_" if $. == 1;
76        my ($level, $title) = (length $1, $2);
77        collapse_lists();
78
79        print "\n=head$level $title\n\n";
80    } elsif (/^(\#+) (.*)/) {
81        my ($level, $txt) = (length($1) - 1, $2);
82        if (defined $last_nl_count_level && $level != $last_nl_count_level) {
83            print "\n=back\n\n";
84        }
85        $last_nl_count_level = $level;
86        $nl_counts[$level] ||= 0;
87        if ($nl_counts[$level] == 0) {
88            print "\n=over\n\n";
89        }
90        $nl_counts[$level]++;
91        print "\n=item $nl_counts[$level].\n\n";
92        print "$txt\n";
93    } elsif (/^(\*+) (.*)/) {
94        my ($level, $txt) = (length($1) - 1, $2);
95        if (defined $last_bl_count_level && $level != $last_bl_count_level) {
96            print "\n=back\n\n";
97        }
98        $last_bl_count_level = $level;
99        $bl_counts[$level] ||= 0;
100        if ($bl_counts[$level] == 0) {
101            print "\n=over\n\n";
102        }
103        $bl_counts[$level]++;
104        print "\n=item *\n\n";
105        print "$txt\n";
106    } else {
107        collapse_lists();
108        print;
109    }
110}
111
112collapse_lists();
113
114sub collapse_lists {
115    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {
116        print "\n=back\n\n";
117        $last_nl_count_level--;
118    }
119    undef $last_nl_count_level;
120    undef @nl_counts;
121
122    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {
123        print "\n=back\n\n";
124        $last_bl_count_level--;
125    }
126    undef $last_bl_count_level;
127    undef @bl_counts;
128}
129
130