| #LaTeX2HTML Version 96.1 : dot.latex2html-init -*- perl -*- |
| # |
| |
| $INFO = 1; # 0 = do not make a "About this document..." section |
| $MAX_LINK_DEPTH = 3; |
| |
| # 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); |
| } |
| |
| # 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 { |
| |
| # Now add a few buttons with a space between them |
| "<div class=navigation>\n" . |
| "$NEXT $UP $PREVIOUS $CONTENTS $INDEX $CUSTOM_BUTTONS" . |
| |
| "<br>\n" . # Line break |
| |
| # If ``next'' section exists, add its title to the navigation panel |
| ($NEXT_TITLE ? "<b> Next:</b> $NEXT_TITLE\n" : undef) . |
| |
| # Similarly with the ``up'' title ... |
| ($UP_TITLE ? "<b>Up:</b> $UP_TITLE\n" : undef) . |
| |
| # ... and the ``previous'' title |
| ($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" |
| } |
| |
| sub bot_navigation_panel { |
| |
| # Start with a horizontal rule (3-d dividing line) |
| "\n<div class=navigation><hr>". |
| |
| # Now add a few buttons with a space between them |
| "$NEXT $UP $PREVIOUS $CONTENTS $INDEX $CUSTOM_BUTTONS" . |
| |
| "<br>\n" . # Line break |
| |
| # If ``next'' section exists, add its title to the navigation panel |
| ($NEXT_TITLE ? "<b> Next:</b> $NEXT_TITLE\n" : undef) . |
| |
| # Similarly with the ``up'' title ... |
| ($UP_TITLE ? "<b>Up:</b> $UP_TITLE\n" : undef) . |
| |
| # ... and the ``previous'' title |
| ($PREVIOUS_TITLE ? "<b> Previous:</b> $PREVIOUS_TITLE\n" : undef) . |
| |
| "</div>\n" |
| } |
| |
| |
| 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 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; |
| } |
| |
| # need to remove leading <...> |
| 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>'; |
| $idx_module_title = 'Module Index'; |
| $idxmodulefile = ''; |
| |
| sub add_module_idx { |
| print "\nDoing the module index ..."; |
| local($key, @keys, $index); |
| $index = "<p>"; |
| @keys = keys %Modules; |
| @keys = sort keysort @keys; |
| foreach $key (@keys) { |
| $index .= "$Modules{$key}$key</a><br>\n" |
| } |
| s/$idx_module_mark/$index<p>/o; |
| } |
| |
| |
| 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/; |
| } |
| } |
| |
| |
| # $idx_mark will be replaced with the real index at the end |
| sub do_cmd_textohtmlmoduleindex { |
| local($_) = @_; |
| $TITLE = $idx_module_title; |
| $idxmodulefile = $CURRENT_FILE; |
| join('', '<p>' , &make_section_heading($idx_module_title, "h2"), |
| $idx_module_mark, $_); |
| } |
| |
| # The bibliography and the index should be treated as separate sections |
| # in their own HTML files. The \bibliography{} command acts as a sectioning command |
| # that has the desired effect. But when the bibliography is constructed |
| # manually using the thebibliography environment, or when using the |
| # theindex environment it is not possible to use the normal sectioning |
| # mechanism. This subroutine inserts a \bibliography{} or a dummy |
| # \textohtmlindex command just before the appropriate environments |
| # to force sectioning. |
| |
| # XXX This *assumes* that if there are two {theindex} environments, the |
| # first is the module index and the second is the standard index. This |
| # is sufficient for the current Python documentation, but that's about |
| # it. |
| |
| sub add_bbl_and_idx_dummy_commands { |
| local($id); |
| 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; |
| #} |
| 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; |
| } |
| 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); |
| } |
| |
| # The bibliographic references, the appendices, the lists of figures and tables |
| # 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); |
| } |
| |
| 1; # This must be the last line |