bird/doc/sbase/dist/fmt_html.pl
Martin Mares 9c7631235a Updated the documentation building tools to work with a recent linuxdoc-tools package.
Note that this is (and always was) a terrible hack and we really should
replace it with something reasonable which wouldn't need changing every
time linuxdoc-tools evolve.

I also needed to include a patched version of LinuxDocTools.pm, because the
original one explicitly refused to work with a non-linuxdoc DTD. The authors
of linuxdoc recommend to use sgmltools-lite in such cases, but it would mean
rewritting our formatting rules to the DSSSL language which I don't dare to
speak about here :)
2003-04-06 19:35:50 +00:00

172 lines
4.1 KiB
Perl

#
# fmt_html.pl
#
# $Id$
#
# HTML-specific driver stuff
#
# © Copyright 1996, Cees de Groot
#
package LinuxDocTools::fmt_html;
use strict;
use LinuxDocTools::CharEnts;
use LinuxDocTools::Vars;
use LinuxDocTools::FixRef;
my $fixref = $LinuxDocTools::FixRef::fixref;
use LinuxDocTools::Html2Html;
my $html2html = $LinuxDocTools::Html2Html::html2html;
my $html = {};
$html->{NAME} = "html";
$html->{HELP} = "";
$html->{OPTIONS} = [
{ option => "split", type => "l",
'values' => [ "0", "1", "2" ], short => "s" },
{ option => "toc", type => "l",
'values' => [ "0", "1", "2" ], short => "T" },
{ option => "dosnames", type => "f", short => "h" },
{ option => "imagebuttons", type => "f", short => "I"},
{ option => "header", type => "s", short => "H"},
{ option => "footer", type => "s", short => "F"}
];
$html->{'split'} = 1;
$html->{'toc'} = -1;
$html->{dosnames} = 0;
$html->{imagebuttons} = 0;
$html->{header} = "";
$html->{footer} = "";
$html->{preNSGMLS} = sub {
$global->{NsgmlsOpts} .= " -ifmthtml ";
$global->{NsgmlsPrePipe} = "cat $global->{file}";
};
$Formats{$html->{NAME}} = $html;
# HTML escape sub. this is called-back by `parse_data' below in
# `html_preASP' to properly escape `<' and `&' characters coming from
# the SGML source.
my %html_escapes;
$html_escapes{'&'} = '&amp;';
$html_escapes{'<'} = '&lt;';
my $html_escape = sub {
my ($data) = @_;
# replace the char with it's HTML equivalent
$data =~ s|([&<])|$html_escapes{$1}|ge;
return ($data);
};
#
# Translate character entities and escape HTML special chars.
#
$html->{preASP} = sub
{
my ($infile, $outfile) = @_;
# note the conversion of `sdata_dirs' list to an anonymous array to
# make a single argument
my $char_maps = load_char_maps ('.2html', [ Text::EntityMap::sdata_dirs() ]);
while (<$infile>)
{
if (/^-/)
{
my ($str) = $';
chop ($str);
print $outfile "-" . parse_data ($str, $char_maps, $html_escape) . "\n";
}
elsif (/^A/)
{
/^A(\S+) (IMPLIED|CDATA|NOTATION|ENTITY|TOKEN)( (.*))?$/
|| die "bad attribute data: $_\n";
my ($name,$type,$value) = ($1,$2,$4);
if ($type eq "CDATA")
{
# CDATA attributes get translated also
$value = parse_data ($value, $char_maps, $html_escape);
}
print $outfile "A$name $type $value\n";
}
else
{
print $outfile $_;
}
}
return 0;
};
#
# Take the sgmlsasp output, and make something
# useful from it.
#
$html->{postASP} = sub
{
my $infile = shift;
my $filename = $global->{filename};
#
# Set various stuff as a result of option processing.
#
my $ext = "html";
$ext = "htm" if $html->{dosnames};
my $img = 0;
$img = 1 if $html->{imagebuttons};
#
# Bring in file
#
my @file = <$infile>;
#
# Find references
#
&{$fixref->{init}}($html->{'split'});
LINE: foreach (@file) {
foreach my $pat (keys %{$fixref->{rules}}) {
if (/$pat/) {
# Call rule function then skip to next line
&{$fixref->{rules}->{$pat}}; next LINE;
}
}
&{$fixref->{defaultrule}};
}
&{$fixref->{finish}};
#
# Run through html2html, preserving stdout
# Also, handle prehtml.sed's tasks
#
my $filter = "";
# $filter = "|$main::progs->{NKF} -e" if ($global->{language} eq "ja");
open SAVEOUT, ">&STDOUT";
open STDOUT, "$filter>$filename.$ext" or die qq(Cannot open "$filename.$ext");
&{$html2html->{init}}($html->{'split'}, $ext, $img, $filename,
$fixref->{filenum}, $fixref->{lrec},
$html->{'header'}, $html->{'footer'}, $html->{'toc'},
$global->{tmpbase}, $global->{debug});
LINE: foreach (@file) {
s,<P></P>,,g; # remove empty <P></P> containers
foreach my $pat (keys %{$html2html->{rules}}) {
if (/$pat/) {
# Call rule function then skip to next line
&{$html2html->{rules}->{$pat}}; next LINE;
}
}
&{$html2html->{defaultrule}};
}
&{$html2html->{finish}};
close STDOUT;
open STDOUT, ">&SAVEOUT";
return 0;
};
1;