#!/usr/bin/perl
use Pod::Tree;
sub escape_texi($) {
local $_ = shift;
s/([\@\{\}])/\@$1/g;
s/\n+/ /g;
$_;
}
sub example {
my $text = $_[0];
print "\n\n\@example\n";
$text =~ s/\n+$//;
$text =~ s/([\@\{\}])/\@$1/g;
print $text;
print "\n\@end example\n\n";
}
while (<>) {
if (/^\@c INCLUDE-(\S+) (\S+)/) {
my $type = $1;
my $name = $2;
my $path = $2;
$name =~ s/\.(\d)$/($1)/;
print "\@chapter $name\n\n";
if ($type eq "POD") {
open my $x, "<$path.pod" or die "$path.pod: $!";
my $data = do { local $/; <$x> };
my $pod = new Pod::Tree;
$pod->load_string($data);
my $walker; $walker = sub {
my $n = $_[0];
if ($n->is_code) {
# nop
} elsif ($n->is_link) {
my $target = $n->get_target;
my $page = $target->get_page;
my $section = $target->get_section;
#print "";
$walker->($_) for @{$n->get_children};
#print "";
} elsif ($n->is_text) {
print escape_texi $n->get_text;
} elsif ($n->is_verbatim) {
example $n->get_text;
} elsif ($n->is_sequence) {
if ($n->get_letter eq "C") {
print "\@t{";
$walker->($_) for @{$n->get_children};
print "}";
} elsif ($n->get_letter eq "B") {
print "\@strong{";
$walker->($_) for @{$n->get_children};
print "}";
} elsif ($n->get_letter eq "I" or $n->get_letter eq "F") {
print "\@emph{";
$walker->($_) for @{$n->get_children};
print "}";
} else {
# S would mean to use nbsp
$walker->($_) for @{$n->get_children};
}
} elsif ($n->is_command) {
if ($n->is_c_head1) {
print "\n\@section ";
$walker->($_) for @{$n->get_children};
print "\n";
} elsif ($n->is_c_head2) {
print "\n\n\@subsection ";
$walker->($_) for @{$n->get_children};
print "\n";
} else {
# nop?
}
} elsif ($n->is_ordinary) {
$walker->($_) for @{$n->get_children};
print "\@refill\n";
} elsif ($n->is_root) {
$walker->($_) for @{$n->get_children};
} elsif ($n->is_list) {
print "\n\n\@itemize\n";
$walker->($_) for @{$n->get_children};
print "\@end itemize\n\n";
} elsif ($n->is_item) {
print "\n\n\@item\n";
print "\@b{";
$walker->($_) for @{$n->get_children};
print "}\n\n";
$walker->($_) for @{$n->get_siblings};
} else {
die "UNKNOWN NODE $_[0]{type}
";
$walker->($_) for @{$n->get_children};
}
};
$walker->($pod->get_root);
} elsif ($type eq "TEXT") {
open my $x, "<$path" or die "$path: $!";
my $data = do { local $/; <$x> };
print $data;
} elsif ($type eq "EXAMPLE") {
open my $x, "<$path" or die "$path: $!";
my $data = do { local $/; <$x> };
example $data;
}
} else {
print;
}
}