#!/usr/bin/perl
#
# See COPYRIGHT
#
# Script to generate a pod file from an html source (the same one as for text files too)
# and later this pod file it passed through pod2man
#
# Use:
# html2man [ <man-dir> [<version-dir>] ] <file.html
#
# <Man-dir> is the directory where the man pages will be created
# (current directory by default). If a file name is given instead of
# directory then the directory of that file is used.
# <Version-dir> is the directory containing the ttf2pt1 files version.h
# and CHANGES.html which are used to generate the release name and date
# for the man page (by default looks in current directory and then in up to
# 5 ancestor directories).
# If the version files can not be found then the release defaults to
# "current" and the date defaults to today.
#
# Special formatting in the html file is:
# All controls are hidden within HTML comments that must occupy a whole separate line
# Such a line looks like:
# <!-- =<html2man_directive> <arguments> -->
# <!-- ==<pod_directive> <arguments> -->
# Any sort of directive must be followed by a space. The pod directives are
# automatically surrounded by empty lines in the output file.
# The html2man directives are:
#
# <!-- =defdoc <docid> <file> <section> -->
# Define a man page. Multiple man pages can be defined in the same HTML
# file. <Docid> is a short name by which this man page will be referred in the
# other directives. <File> is the name of the man page, and <section> is the
# section of the manual (do not confuse with sections within a man page).
#
# <!-- =section <docid> <page_section_name> -->
# All the text following this directive is copied (with translation)
# into the specified section of the specified man page. The sections
# may appear in arbitrary order, they will be rearranged to the standard
# order before output. Only standard section names are permitted (see @stdsect
# below). The pod directives which occur outside of man sections are ignored,
# just like the common text. The translation of HTML tags is:
#
# <br> - to paragraph break
# <b> - to B<>
# <i> - to I<>
# <tt> - to C<>
# <a href> - to F<>
# <ul>, <li>, </ul> - to =over 2, =item *, =back
# , &, <, > - to their symbols, appropriately encoded
#
# The rest of HTML tags is removed
#
# If the same section is started more than once, the text from the
# second appearance will be added to the first, etc.
#
# <!-- =stop -->
# Stop copying text to the man page.
#
# <!-- =cont -->
# Continue copying text to the man page, same section as before.
#
# <!-- =text <text> -->
# Insert this <text> into the man page (works only when copying is enabled).
# Characters <, >, & are converted as usual.
@mons = qw(January February March April May June July August September October November December);
$dir = $ARGV[0];
$maindir = $ARGV[1];
if($dir eq "") {
$dir = ".";
} elsif( ! -d $dir ) {
if( ! ($dir =~ s|\/[^/]*$||) ) {
$dir = ".";
}
}
if($maindir eq "") {
$maindir = ".";
for($i=0; $i<5; $i++) {
if(-f "$maindir/version.h") {
last;
}
$maindir = "../$maindir";
}
}
if( open(VERFILE, "<$maindir/version.h") ) {
while(<VERFILE>) {
if( /^\s*\#define\s+TTF2PT1_VERSION\s+\"(.*)\"/ ) {
$release = "version $1";
}
}
close(VERFILE);
if( $release =~ /SNAP-([0-9][0-9])([0-9][0-9])([0-9][0-9])/ ) {
$date = sprintf("%s %d, 20%02d", $mons[$2-1], $3, $1);
} elsif( open(CFILE, "<$maindir/CHANGES.html") ) {
while(<CFILE>) {
if( /\<H4\>/) {
last;
}
}
$_ = <CFILE>;
chomp;
if( $_ =~ s/^.*?-- // ) {
$date = $_;
}
close(CFILE);
}
}
if($release eq "") {
$release = "current";
}
if($date eq "") {
@lt = localtime(time);
$date = sprintf("%s %d, %d", $mons[$lt[4]], $lt[3], 1900+$lt[5]);
}
#printf(STDERR "date=%s release=%s\n", $date, $release);
$writemode = 0;
while(<STDIN>) {
if( s/^\<\!\-\- \=(\S+)\s+//) {
$cmd = $1;
s/\s*--\>\s*$//;
#printf(STDERR "cmd=%s args=%s\n", $cmd, $_);
if($cmd =~ /^=/) {
if($writemode) {
$text{$tosect} .= "\n\n$cmd $_\n\n";
}
} elsif($cmd eq "defdoc") {
@sl = split;
push(@allids, $sl[0]);
$file{$sl[0]} = $sl[1];
$mansect{$sl[0]} = $sl[2];
} elsif($cmd eq "section") {
# tosect includes the file id
$tosect = $_;
$text{$tosect} .= "\n\n";
$writemode = 1;
} elsif($cmd eq "stop") {
$writemode = 0;
$text{$tosect} .= "\n";
} elsif($cmd eq "cont") {
$writemode = 1;
} elsif($cmd eq "text") {
if($writemode) {
s/\<\;/</gi;
s/\>\;/>/gi;
s/\&\;/\&/gi;
$text{$tosect} .= "$_\n";
}
}
} elsif($writemode) {
s/^\s+//;
s/\{/\&lbr;/g;
s/\}/\&rbr;/g;
s/\<br\>/\n\n/gi;
#s/\<blockquote\>/\n\n=over 4\n\n/gi;
#s/\<\/blockquote\>/\n\n=back\n\n/gi;
s/\<ul\>/\n\n=over 4\n\n/gi;
s/\<\/ul\>/\n\n=back\n\n/gi;
s/\<li\>\s*/\n\n=item \*\n\n/gi;
s/\<i\>(.*?)\<\/i\>/I\{\1\}/gi;
s/\<b\>(.*?)\<\/b\>/B\{\1\}/gi;
s/\<tt\>(.*?)\<\/tt\>/C\{\1\}/gi;
s/\<a href\=\.*?\>(.*?)\<\/a\>/F\{\1\}/gi;
s/\<.*?\>//g;
s/\{/\</g;
s/\}/\>/g;
s/\ \;/S< >/gi;
s/\&\;/\&/gi;
s/\<\;/E<lt>/gi;
s/\>\;/E<gt>/gi;
#s/\|/E<verbar>/g;
#s/\//E<sol>/g;
s/\&lbr\;/\{/g;
s/\&rbr\;/\}/g;
#printf(STDERR "section=%s add=%s", $tosect, $_);
$text{$tosect} .= $_;
}
}
@stdsect = (
"NAME",
"SYNOPSIS",
"DESCRIPTION",
"OPTIONS",
"RETURN VALUE",
"ERRORS",
"EXAMPLES",
"ENVIRONMENT",
"FILES",
"SEE ALSO",
"NOTES",
"CAVEATS",
"DIAGNOSTICS",
"BUGS",
"RESTRICTIONS",
"AUTHOR",
"HISTORY" );
#printf(STDERR "allids= @allids\n");
for $id (@allids) {
#print(STDERR "creating man page $id $file{$id} $mansect{$id}\n\n");
die "Unable to create pod file $dir/$file{$id}.pod"
unless open(PODF, ">$dir/$file{$id}.pod");
print(PODF "=pod\n\n");
for $sect (@stdsect) {
$sid = "$id $sect";
#printf(STDERR "trying %s\n", $sid);
if(defined $text{$sid}) {
print(PODF "=head1 $sect\n\n$text{$sid}\n\n");
}
}
print(PODF "=cut\n");
close(PODF);
die "Unable to generate the man page $dir/$file{$id}.1"
if system("pod2man --section=\"$mansect{$id}\" --release=\"$release\" "
. "--center=\"TTF2PT1 Font Converter\" --date=\"$date\" "
. "$dir/$file{$id}.pod >$dir/$file{$id}.1");
unlink("$dir/$file{$id}.pod");
}
|