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