You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.1 KiB
132 lines
3.1 KiB
6 months ago
|
#!/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{<code>(.*?)</code>}{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;
|
||
|
}
|
||
|
|