Preliminary LaTeX2HTML 98.1p1 support. Includes patch from Ross Moore to

get some funky quoting of ']' in \item[...] to work right without having to
do really ugly things to the documents themselves.

There are a lot of things relating to indexing that are commented out;
parts need to be examined and dealt with with respect to changes in
LaTeX2HTML internals.  I'll work with Ross to see what it takes to make
this sort of stuff reasonable.
This commit is contained in:
Fred Drake 1998-03-04 05:36:59 +00:00
parent 2da947af87
commit 34d6f5b0be
1 changed files with 244 additions and 210 deletions

View File

@ -4,96 +4,18 @@
$INFO = 1; # 0 = do not make a "About this document..." section
$MAX_LINK_DEPTH = 3;
$NUMBERED_FOOTNOTES = 1;
# Python documentation uses section numbers to support references to match
# in the printed and online versions.
#
$SHOW_SECTION_NUMBERS = 1;
$HTML_VERSION = '3.0';
$ICONSERVER = '../icons';
# This replacement adds the "BORDER=0" attribute to the generated icon
# markup. This is done for no better reason than that it looks better.
#
sub img_tag {
local($icon) = @_;
( ($icon =~ /(gif)/) ?
do {
$icon =~ /(up|next|previous|next_page|previous_page|change_begin|change_end|change_delete|contents|index)/;
join('','<img ',$iconsizes{$1},' align=bottom alt="',$1,
'" src="',$ICONSERVER,"/$icon",'" border=0>')
} :
$icon);
}
$CHILDLINE = "\n<p><hr>\n";
$VERBOSITY = 0;
# This replacement for process_command() is needed to add the case for
# "\,"; it is unfortunate we need to do it this way.
#
sub process_command {
local ($cmd_rx, *ref_contents) = @_;
local($ref_before, $cmd, $after);
local($cmd_sub, $cmd_msub, $cmd_trans, $mathentity);
local (@open_font_tags,@open_size_tags);
$ref_contents = &convert_iso_latin_chars($ref_contents);
for (;;) { # Do NOT use the o option
last unless ($ref_contents =~ /$cmd_rx/ );
($ref_before, $cmd, $after) = ($`, $1, "$2$'");
print(".");
# $after =~ s/^[ ]+/ /o; Collapse all spaces that follow a command
if ($cmd =~ /[a-zA-Z]$/) { # Eat redundant spaces that follow a command
$after =~ s/^[ \t]+//o; }
else {
$after =~ s/^[ \t]+/ /o; }
if ( $cmd = &normalize($cmd) ) {
($cmd_sub, $cmd_msub, $cmd_trans, $mathentity) =
("do_cmd_$cmd", "do_math_cmd_$cmd",
$declarations{$cmd}, $mathentities{$cmd});
if (defined &$cmd_sub) {
# $ref_before may also be modified ...
if ($cmd =~ /$sizechange_rx/o) {
$after = &$cmd_sub($after, @open_size_tags);
} else {
$after = &$cmd_sub($after, @open_font_tags);
};
}
elsif (defined &$cmd_msub) {
# $ref_before may also be modified ...
$after = &$cmd_msub($after, @open_font_tags);
if ( !$math_mode ) {
$after = "<math>" . $after . "</math>";
++$commands_outside_math{$cmd};
};
}
elsif ($cmd_trans) { # One to one transform
$cmd_trans =~ m|</.*$|;
$after = $` . $after . $&;
push(@open_font_tags, $cmd) if ($cmd =~ /$fontchange_rx/o);
push(@open_size_tags, $cmd) if ($cmd =~ /$sizechange_rx/o);}
elsif ($mathentity) {
if ( $math_mode ) {
$after = "&$mathentity;" . $after;
} else {
$after = "<math>&$mathentity;</math>" . $after;
++$commands_outside_math{$cmd};
}; }
# Here's the hack:
elsif ($cmd == ',' && ! $AUX_FILE) {
$ref_before = $ref_before . ",";
}
elsif ($ignore{$cmd}) { # Ignored command
print "."}
elsif ($cmd =~ /^the(.+)$/) { # Counter
$counter = $1;
$after = &do_cmd_thecounter($after);}
else {
# Do not add if reading an auxiliary file
++$unknown_commands{$cmd} unless $AUX_FILE;
}
}
$ref_contents = join('', $ref_before, $after);
}
$ref_contents;
}
sub top_navigation_panel {
@ -113,13 +35,13 @@ sub top_navigation_panel {
($PREVIOUS_TITLE ? "<b> Previous:</b> $PREVIOUS_TITLE\n" : undef) .
# Line Break, horizontal rule (3-d dividing line) and new paragraph
"<br><hr><p></div>\n"
"<br><hr><p></div>"
}
sub bot_navigation_panel {
# Start with a horizontal rule (3-d dividing line)
"\n<div class=navigation><hr>".
"<div class=navigation><hr>".
# Now add a few buttons with a space between them
"$NEXT\n$UP\n$PREVIOUS\n$CONTENTS\n$INDEX $CUSTOM_BUTTONS" .
@ -135,88 +57,141 @@ sub bot_navigation_panel {
# ... and the ``previous'' title
($PREVIOUS_TITLE ? "<b> Previous:</b> $PREVIOUS_TITLE\n" : undef) .
"</div>\n"
"</div>"
}
# sub make_section_heading {
# local($text, $level, $anchors) = @_;
# local($section_tag) = join('', @curr_sec_id);
# local($align,$pre_anchors);
# # separate any invisible anchors or alignment, if this has not already been done
# if (!($anchors)){ ($anchors,$text) = &extract_anchors($text) }
# else {
# $anchors =~ s/(ALIGN=\"\w*\")/$align = " $1";''/e;
# $anchors = &translate_commands($anchors) if ($anchors =~ /\\/);
# }
# if (!($text)) {
# # anchor to a single `.' only
# $text = "<a name=SECTION$section_tag>.</a>$anchors\n";
# } elsif ($anchors) {
# # keep it short and simple!
# $text = "<a name=SECTION$section_tag>$text</a>";
# } elsif (!($text =~ /<A[^\w]/io)) {
# # no embedded anchors, so anchor it all
# $text = "<a name=SECTION$section_tag>\n" . $text . "</a>";
# } else {
# # there are embedded anchors; these cannot be nested
# local ($tmp) = $text;
# $tmp =~ s/<//o ; # find 1st <
# if ($`) { # anchor text before the first <
# # $text = "<A NAME=\"SECTION$section_tag\">\n" . $` . "</A>\n<" . $';
# $text = "<a name=SECTION$section_tag>\n" . $` . "</a>";
# $pre_anchors = "<" . $';
# if ($pre_anchors =~ /^(<A NAME=\"[^\"]+>${anchor_invisible_mark}<\/A>\s*)+$/) {
# $pre_anchors .= "\n"
# } else { $text .= $pre_anchors; $pre_anchors = '' }
# } else {
# # $text starts with a tag
# local($after,$tmp) = ($','');
# if ( $after =~ /^A[^\w]/i ) {
# # it is an anchor already, so need a separate line
# $text = "<a name=SECTION$section_tag>$anchor_invisible_mark</a><br>\n$text";
# } else {
# # Is it a tag enclosing the anchor ?
# $after =~ s/^(\w)*[\s|>]/$tmp = $1;''/eo;
# if ($after =~ /<A.*<\/$tmp>/) {
# # it encloses an anchor, so use anchor_mark + break
# $text = "<a name=SECTION$section_tag>$anchor_invisible_mark</a><br>\n$text";
# } else {
# # take up to the anchor
# $text =~ s/^(.*)<A([^\w])/"<a name=SECTION$section_tag>$1<A$2"/oe;
# }
# }
# }
# }
# "$pre_anchors\n<$level$align>$text\n<\/$level>";
# }
sub gen_index_id {
# this is used to ensure common index key generation and a stable sort
local($str,$extra) = @_;
sprintf("%s###%s%010d", $str, $extra, ++$global{'max_id'});
}
sub make_index_entry {
local($br_id,$str) = @_;
# If TITLE is not yet available (i.e the \index command is in the title of the
# current section), use $ref_before.
$TITLE = $ref_before unless $TITLE;
# Save the reference
$str = gen_index_id($str, '');
$index{$str} .= &make_half_href("$CURRENT_FILE#$br_id");
"<a name=\"$br_id\">$anchor_invisible_mark<\/a>";
}
# sub make_index_entry {
# local($br_id,$str) = @_;
# # If TITLE is not yet available (i.e the \index command is in the title of the
# # current section), use $ref_before.
# $TITLE = $ref_before unless $TITLE;
# # Save the reference
# $str = gen_index_id($str, '');
# $index{$str} .= &make_half_href("$CURRENT_FILE#$br_id");
# "<a name=\"$br_id\">$anchor_invisible_mark<\/a>";
# }
sub add_idx {
print "\nDoing the index ...";
local($key, $str, @keys, $index, $level, $count, @previous, @current);
@keys = keys %index;
@keys = sort keysort @keys;
$level = 0;
foreach $key (@keys) {
@current = split(/!/, $key);
$count = 0;
while ($current[$count] eq $previous[$count]) {
$count++;
}
while ($count > $level) {
$index .= "<dl compact>\n";
$level++;
}
while ($count < $level) {
$index .= "</dl>\n";
$level--;
}
foreach $term (@current[$count .. $#current-1]) {
# need to "step in" a little
$index .= "<dt>" . $term . "\n<dl compact>\n";
$level++;
}
$str = $current[$#current];
$str =~ s/\#\#\#\d+$//o; # Remove the unique id's
$str =~ s/\#\#\#[DR]EF\d+$//o; # Remove the unique id's
if (&index_key_eq(join('',@current), join('',@previous))) {
$index .= ",\n$index{$key}" . $cross_ref_visible_mark . "</a>"; }
else {
$index .= "\n<dt>$index{$key}" . $str . "</a>"; }
@previous = @current;
}
while ($count < $level) {
$index .= "</dl>\n";
$level--;
}
s/$idx_mark/<dl compact>$index<\/dl>/o;
}
# sub add_idx {
# print "\nDoing the index ...";
# local($key, $str, @keys, $index, $level, $count, @previous, @current);
# @keys = keys %index;
# @keys = sort keysort @keys;
# $level = 0;
# foreach $key (@keys) {
# @current = split(/!/, $key);
# $count = 0;
# while ($current[$count] eq $previous[$count]) {
# $count++;
# }
# while ($count > $level) {
# $index .= "<dl compact>\n";
# $level++;
# }
# while ($count < $level) {
# $index .= "</dl>\n";
# $level--;
# }
# foreach $term (@current[$count .. $#current-1]) {
# # need to "step in" a little
# $index .= "<dt>" . $term . "\n<dl compact>\n";
# $level++;
# }
# $str = $current[$#current];
# $str =~ s/\#\#\#\d+$//o; # Remove the unique id's
# $str =~ s/\#\#\#[DR]EF\d+$//o; # Remove the unique id's
# if (&index_key_eq(join('',@current), join('',@previous))) {
# $index .= ",\n$index{$key}" . $cross_ref_visible_mark . "</a>"; }
# else {
# $index .= "\n<dt>$index{$key}" . $str . "</a>"; }
# @previous = @current;
# }
# while ($count < $level) {
# $index .= "</dl>\n";
# $level--;
# }
# s/$idx_mark/<dl compact>$index<\/dl>/o;
# }
sub index_key_eq {
local($a,$b) = @_;
$a = &clean_key($a);
$a =~ s/\#\#\#\d+$//o; # Remove the unique id's
$a =~ s/\#\#\#[dr]ef\d+$//o; # Remove the unique id's
$b = &clean_key($b);
$b =~ s/\#\#\#\d+$//o; # Remove the unique id's
$b =~ s/\#\#\#[dr]ef\d+$//o; # Remove the unique id's
$a eq $b;
}
# sub index_key_eq {
# local($a,$b) = @_;
# $a = &clean_key($a);
# $a =~ s/\#\#\#\d+$//o; # Remove the unique id's
# $a =~ s/\#\#\#[dr]ef\d+$//o; # Remove the unique id's
# $b = &clean_key($b);
# $b =~ s/\#\#\#\d+$//o; # Remove the unique id's
# $b =~ s/\#\#\#[dr]ef\d+$//o; # Remove the unique id's
# $a eq $b;
# }
# need to remove leading <...>
sub clean_key {
local ($_) = @_;
tr/A-Z/a-z/;
s/\s//;
s/^<[a-z][-._a-z0-9]*>//; # Remove leading <gi>
$_
}
# sub clean_key {
# local ($_) = @_;
# tr/A-Z/a-z/;
# s/\s//;
# s/^<[a-z][-._a-z0-9]*>//; # Remove leading <gi>
# $_;
# }
$idx_module_mark = '<tex2html_idx_module_mark>';
@ -235,68 +210,88 @@ sub add_module_idx {
}
sub remove_general_markers {
s/$lof_mark/<UL>$figure_captions<\/UL>/o;
s/$lot_mark/<UL>$table_captions<\/UL>/o;
&replace_citations if /$bbl_mark/;
&add_toc if (/$toc_mark/);
&add_idx if (/$idx_mark/);
&add_module_idx if (/$idx_module_mark/);
&replace_cross_references if /$cross_ref_mark/;
&replace_external_references if /$external_ref_mark/;
&replace_cite_references if /$cite_mark/;
if (defined &replace_user_references) {
&replace_user_references if /$user_ref_mark/;
}
}
# sub remove_general_markers {
# s/$lof_mark/<UL>$figure_captions<\/UL>/o;
# s/$lot_mark/<UL>$table_captions<\/UL>/o;
# &replace_citations if /$bbl_mark/;
# &add_toc if (/$toc_mark/);
# &add_idx if (/$idx_mark/);
# &add_module_idx if (/$idx_module_mark/);
# &replace_cross_references if /$cross_ref_mark/;
# &replace_external_references if /$external_ref_mark/;
# &replace_cite_references if /$cite_mark/;
# if (defined &replace_user_references) {
# &replace_user_references if /$user_ref_mark/;
# }
# }
# In addition to the standard stuff, add label to allow named node files.
sub do_cmd_tableofcontents {
local($_) = @_;
$tocfile = $CURRENT_FILE;
$TITLE = $toc_title;
$tocfile = $CURRENT_FILE;
local($closures,$reopens) = &preserve_open_tags();
&anchor_label("contents",$CURRENT_FILE,$_); # this is added
join('', '<P>', &make_section_heading($toc_title, "H2"), $toc_mark, $_);
join('', "<BR>\n", $closures
, &make_section_heading($toc_title, "H2"), $toc_mark
, $reopens, $_);
}
# In addition to the standard stuff, add label to allow named node files.
sub do_cmd_listoffigures {
local($_) = @_;
$TITLE = $lof_title;
$loffile = $CURRENT_FILE;
&anchor_label("figures",$CURRENT_FILE,$_); # this is added
join('', '<P>' , &make_section_heading($lof_title, "H2"), $lof_mark, $_);
}
local($closures,$reopens) = &preserve_open_tags();
&anchor_label("lof",$CURRENT_FILE,$_); # this is added
join('', "<BR>\n", $closures
, &make_section_heading($lof_title, "H2"), $lof_mark
, $reopens, $_);
}
# In addition to the standard stuff, add label to allow named node files.
sub do_cmd_listoftables {
local($_) = @_;
$TITLE = $lot_title;
$lotfile = $CURRENT_FILE;
&anchor_label("tables",$CURRENT_FILE,$_); # this is added
join('', '<P>' , &make_section_heading($lot_title, "H2"), $lot_mark, $_);
local($closures,$reopens) = &preserve_open_tags();
&anchor_label("lot",$CURRENT_FILE,$_); # this is added
join('', "<BR>\n", $closures
, &make_section_heading($lot_title, "H2"), $lot_mark
, $reopens, $_);
}
# In addition to the standard stuff, add label to allow named node files.
sub do_cmd_textohtmlinfopage {
local($_) = @_;
if ($INFO) {
if ($INFO) { #
&anchor_label("about",$CURRENT_FILE,$_); # this is added
}
} #
( ($INFO == 1)
? join('', "<STRONG>$t_title</STRONG><P>\nThis document was generated using the <A HREF=\"$TEX2HTMLADDRESS\"><STRONG>LaTeX</STRONG>2<tt>HTML</tt></A> translator Version $TEX2HTMLVERSION Copyright &#169; 1993, 1994, 1995, 1996, <A HREF=\"$AUTHORADDRESS\">Nikos Drakos</A>, Computer Based Learning Unit, University of Leeds. <P> The command line arguments were: <BR>
<STRONG>latex2html</STRONG> <tt>$argv</tt>. <P>The translation was initiated by $address_data[0] on $address_data[1]", $_)
: join('',$INFO,$_))
? join('', $close_all
, "<STRONG>$t_title</STRONG><P>\nThis document was generated using the\n"
, "<A HREF=\"$TEX2HTMLADDRESS\"><STRONG>LaTeX</STRONG>2<tt>HTML</tt></A>"
, " translator Version $TEX2HTMLVERSION\n"
, "<P>Copyright &#169; 1993, 1994, 1995, 1996, 1997,\n"
, "<A HREF=\"$AUTHORADDRESS\">Nikos Drakos</A>, \n"
, "Computer Based Learning Unit, University of Leeds.\n"
, "<P>The command line arguments were: <BR>\n "
, "<STRONG>latex2html</STRONG> <tt>$argv</tt>.\n"
, "<P>The translation was initiated by $address_data[0] on $address_data[1]"
, $open_all, $_)
: join('', $close_all, $INFO,"\n", $open_all, $_))
}
# $idx_mark will be replaced with the real index at the end.
# In addition to the standard stuff, add label to allow named node files.
# $idx_mark will be replaced with the real index at the end
sub do_cmd_textohtmlindex {
local($_) = @_;
$TITLE = $idx_title;
$idxfile = $CURRENT_FILE;
if (%index_labels) { &make_index_labels(); }
if (($SHORT_INDEX) && (%index_segment)) { &make_preindex(); }
else { $preindex = ''; }
local($heading) = join('',&make_section_heading($idx_title, "H2"),
$idx_mark);
local($pre,$post) = &minimize_open_tags($heading);
&anchor_label("genindex",$CURRENT_FILE,$_); # this is added
join('','<P>' , &make_section_heading($idx_title, "H2"), $idx_mark, $_);
join('',"<BR>\n" , $pre, $_);
}
# $idx_module_mark will be replaced with the real index at the end
@ -324,17 +319,24 @@ sub do_cmd_textohtmlmoduleindex {
# it.
sub add_bbl_and_idx_dummy_commands {
local($id);
local($id) = $global{'max_id'};
$section_commands{'textohtmlmoduleindex'} = 2;
s/([\\]begin\s*$O\d+$C\s*thebibliography)/$bbl_cnt++; $1/eg;
#print STDERR "\nthebibliography: $bbl_cnt\n";
#if ($bbl_cnt == 1) {
s/([\\]begin\s*$O\d+$C\s*thebibliography)/do { $id = ++$global{'max_id'}; "\\bibliography$O$id$C$O$id$C $1"}/geo;
s/([\\]begin\s*$O\d+$C\s*thebibliography)/$id++; "\\bibliography$O$id$C$O$id$C $1"/geo
#if ($bbl_cnt == 1)
;
#}
local(@parts) = split(/\\begin\s*$O\d+$C\s*theindex/);
if (scalar(@parts) == 3) {
print "\n&add_bbl_and_idx_dummy_commands ==> adding module index";
s/([\\]begin\s*$O\d+$C\s*theindex)/\\textohtmlmoduleindex $1/o;
}
#----------------------------------------------------------------------#
# (FLD) This was added #
local(@parts) = split(/\\begin\s*$O\d+$C\s*theindex/); #
if (scalar(@parts) == 3) { #
print "\n&add_bbl_and_idx_dummy_commands ==> adding module index"; #
s/([\\]begin\s*$O\d+$C\s*theindex)/\\textohtmlmoduleindex $1/o; #
} #
#----------------------------------------------------------------------#
$global{'max_id'} = $id;
s/([\\]begin\s*$O\d+$C\s*theindex)/\\textohtmlindex $1/o;
s/[\\]printindex/\\textohtmlindex /o;
&lib_add_bbl_and_idx_dummy_commands() if defined(&lib_add_bbl_and_idx_dummy_commands);
@ -344,22 +346,54 @@ sub add_bbl_and_idx_dummy_commands {
# etc. must appear in the contents table at the same level as the outermost
# sectioning command. This subroutine finds what is the outermost level and
# sets the above to the same level;
sub set_depth_levels {
$section_headings['textohtmlmoduleindex'] = 'h1';
# Sets $outermost_level
local($level);
foreach $level ("part", "chapter", "section", "subsection",
"subsubsection", "paragraph") {
last if (($outermost_level) = /\\($level)$delimiter_rx/);
}
$level = ($outermost_level ? $section_commands{$outermost_level} :
do {$outermost_level = 'section'; 3;});
$MAX_SPLIT_DEPTH = $MAX_SPLIT_DEPTH + $level;
%section_commands = ('tableofcontents', $level, 'listoffigures', $level,
'listoftables', $level, 'bibliography', $level,
'textohtmlindex', $level,
'textohtmlmoduleindex', $level,
%section_commands);
%section_commands = ('textohtmlmoduleindex', 2, %section_commands);
# sub set_depth_levels {
# # Sets $outermost_level
# local($level);
# #RRM: do not alter user-set value for $MAX_SPLIT_DEPTH
# foreach $level ("part", "chapter", "section", "subsection",
# "subsubsection", "paragraph") {
# last if (($outermost_level) = /\\($level)$delimiter_rx/);
# }
# $level = ($outermost_level ? $section_commands{$outermost_level} :
# do {$outermost_level = 'section'; 3;});
# #RRM: but calculate value for $MAX_SPLIT_DEPTH when a $REL_DEPTH was given
# if ($REL_DEPTH && $MAX_SPLIT_DEPTH) {
# $MAX_SPLIT_DEPTH = $level + $MAX_SPLIT_DEPTH;
# } elsif (!($MAX_SPLIT_DEPTH)) { $MAX_SPLIT_DEPTH = 1 };
# %unnumbered_section_commands = (
# 'tableofcontents', $level
# , 'listoffigures', $level
# , 'listoftables', $level
# , 'bibliography', $level
# , 'textohtmlindex', $level
# , 'textohtmlmoduleindex', $level
# );
# %section_commands = (
# %unnumbered_section_commands
# , %section_commands
# );
# }
# Fix from Ross Moore for ']' in \item[...]; this can be removed once the next
# patch to LaTeX2HTML is released and tested.
#
sub protect_useritems {
local(*_) = @_;
local($preitems, $thisitem);
while (/\\item\s*\[/) {
$preitems .= $`; $_ = $';
$thisitem = $&.'<<'.++$global{'max_id'}.'>>';
s/^(((($O|$OP)\d+($C|$CP)).*\3|<[^<>]*>|[^\]<]+)*)\]/$thisitem.=$1;''/e;
$preitems .= $thisitem.'<<'.$global{'max_id'}.'>>]'; s/^]//;
}
$_ = $preitems . $_;
}
1; # This must be the last line