#!/usr/bin/env perl use strict; use warnings; use bytes; my @nl_counts; my $last_nl_count_level; my @bl_counts; my $last_bl_count_level; sub fmt_pos ($) { (my $s = $_[0]) =~ s{\#(.*)}{/"$1"}; $s; } sub fmt_mark ($$) { my ($tag, $s) = @_; my $max_level = 0; while ($s =~ /([<>])\1*/g) { my $level = length $&; if ($level > $max_level) { $max_level = $level; } } my $times = $max_level + 1; if ($times > 1) { $s = " $s "; } return $tag . ('<' x $times) . $s . ('>' x $times); } print "=encoding utf-8\n\n"; while (<>) { if ($. == 1) { # strip the leading U+FEFF byte in MS-DOS text files my $first = ord(substr($_, 0, 1)); #printf STDERR "0x%x", $first; #my $second = ord(substr($_, 2, 1)); #printf STDERR "0x%x", $second; if ($first == 0xEF) { substr($_, 0, 1, ''); #warn "Hit!"; } } s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi; s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe; s{(.*?)}{fmt_mark('C', $1)}gie; s{'''(.*?)'''}{fmt_mark('B', $1)}ge; s{''(.*?)''}{fmt_mark('I', $1)}ge; if (s{^\s*<[^>]+>\s*$}{}) { next; } if (/^\s*$/) { print "\n"; next; } =begin cmt if ($. == 1) { warn $_; for my $i (0..length($_) - 1) { my $chr = substr($_, $i, 1); warn "chr ord($i): ".ord($chr)." \"$chr\"\n"; } } =end cmt =cut if (/(=+) (.*) \1$/) { #warn "HERE! $_" if $. == 1; my ($level, $title) = (length $1, $2); collapse_lists(); print "\n=head$level $title\n\n"; } elsif (/^(\#+) (.*)/) { my ($level, $txt) = (length($1) - 1, $2); if (defined $last_nl_count_level && $level != $last_nl_count_level) { print "\n=back\n\n"; } $last_nl_count_level = $level; $nl_counts[$level] ||= 0; if ($nl_counts[$level] == 0) { print "\n=over\n\n"; } $nl_counts[$level]++; print "\n=item $nl_counts[$level].\n\n"; print "$txt\n"; } elsif (/^(\*+) (.*)/) { my ($level, $txt) = (length($1) - 1, $2); if (defined $last_bl_count_level && $level != $last_bl_count_level) { print "\n=back\n\n"; } $last_bl_count_level = $level; $bl_counts[$level] ||= 0; if ($bl_counts[$level] == 0) { print "\n=over\n\n"; } $bl_counts[$level]++; print "\n=item *\n\n"; print "$txt\n"; } else { collapse_lists(); print; } } collapse_lists(); sub collapse_lists { while (defined $last_nl_count_level && $last_nl_count_level >= 0) { print "\n=back\n\n"; $last_nl_count_level--; } undef $last_nl_count_level; undef @nl_counts; while (defined $last_bl_count_level && $last_bl_count_level >= 0) { print "\n=back\n\n"; $last_bl_count_level--; } undef $last_bl_count_level; undef @bl_counts; }