801 lines · 27.8 KB · Text
RawDownload
# LaTeX2HTML support base for use with Python documentation. package main; use L2hos; $HTML_VERSION = 4.01;$LOWER_CASE_TAGS = 1;$NO_FRENCH_QUOTES = 1; # '' in \code{...} is still converted, so we can't use this yet.#$USE_CURLY_QUOTES = 1; # Force Unicode support to be loaded; request UTF-8 output.do_require_extension('unicode');do_require_extension('utf8');$HTML_OPTIONS = 'utf8'; $MAX_LINK_DEPTH = 2;$ADDRESS = ''; $NO_FOOTNODE = 1;$NUMBERED_FOOTNOTES = 1; # Python documentation uses section numbers to support references to match# in the printed and online versions.#$SHOW_SECTION_NUMBERS = 1; $ICONSERVER = '.';$IMAGE_TYPE = 'gif'; # Control where the navigation bars should show up:$TOP_NAVIGATION = 1;$BOTTOM_NAVIGATION = 1;$AUTO_NAVIGATION = 0; $BODYTEXT = '';$CHILDLINE = "\n<p><br /></p><hr class='online-navigation' />\n";$VERBOSITY = 0; # default # of columns for the indexes$INDEX_COLUMNS = 2;$MODULE_INDEX_COLUMNS = 4; $HAVE_MODULE_INDEX = 0;$HAVE_GENERAL_INDEX = 0;$HAVE_TABLE_OF_CONTENTS = 0; $AESOP_META_TYPE = 'information';  # A little painful, but lets us clean up the top level directory a little,# and not be tied to the current directory (as far as I can tell).  Testing# an existing definition of $mydir is needed since it cannot be computed when# run under mkhowto with recent versions of LaTeX2HTML, since this file is# not read directly by LaTeX2HTML any more.  mkhowto is required to prepend# the required definition at the top of the actual input file.#if (!defined $mydir) {    use Cwd;    use File::Basename;    ($myname, $mydir, $myext) = fileparse(__FILE__, '\..*');    chop $mydir;                        # remove trailing '/'    $mydir = getcwd() . "$dd$mydir"        unless $mydir =~ s|^/|/|;}$LATEX2HTMLSTYLES = "$mydir$envkey$LATEX2HTMLSTYLES";push (@INC, $mydir); ($myrootname, $myrootdir, $myext) = fileparse($mydir, '\..*');chop $myrootdir;  # Hackish way to get the appropriate paper-*/ directory into $TEXINPUTS;# pass in the paper size (a4 or letter) as the environment variable PAPER# to add the right directory.  If not given, the current directory is# added instead for use with HOWTO processing.#if (defined $ENV{'PAPER'}) {    $mytexinputs = "$myrootdir${dd}paper-$ENV{'PAPER'}$envkey";}else {    $mytexinputs = getcwd() . $envkey;}$mytexinputs .= "$myrootdir${dd}texinputs";  # Change this variable to change the text added in "About this document...";# this should be an absolute pathname to get it right.#$ABOUT_FILE = "$myrootdir${dd}html${dd}stdabout.dat";  sub custom_driver_hook {    #    # This adds the directory of the main input file to $TEXINPUTS; it    # seems to be sufficiently general that it should be fine for HOWTO    # processing.    #    # XXX This still isn't quite right; we should actually be inserting    # $mytexinputs just before any empty entry in TEXINPUTS is one    # exists instead of just concatenating the pieces like we do here.    #    my $file = $_[0];    my($jobname, $dir, $ext) = fileparse($file, '\..*');    $dir = L2hos->Make_directory_absolute($dir);    $dir =~ s/$dd$//;    $TEXINPUTS = "$dir$envkey$mytexinputs";    # Push everything into $TEXINPUTS since LaTeX2HTML doesn't pick    # this up on its own; we clear $ENV{'TEXINPUTS'} so the value set    # for this by the main LaTeX2HTML script doesn't contain duplicate    # directories.    if ($ENV{'TEXINPUTS'}) {        $TEXINPUTS .= "$envkey$ENV{'TEXINPUTS'}";        $ENV{'TEXINPUTS'} = undef;    }    print "\nSetting \$TEXINPUTS to $TEXINPUTS\n";     # Not sure why we need to deal with this both here and at the top,    # but this is needed to actually make it work.    do_require_extension('utf8');    $charset = $utf8_str;    $CHARSET = $utf8_str;    $USE_UTF = 1;}  # $CUSTOM_BUTTONS is only used for the module index link.$CUSTOM_BUTTONS = ''; sub make_nav_sectref($$$) {    my($label, $linktype, $title) = @_;    if ($title) {        if ($title =~ /\<[aA] /) {            $title =~ s/\<[aA] /<a class="sectref" rel="$linktype" /;            $title =~ s/ HREF=/ href=/;        }        else {            $title = "<span class=\"sectref\">$title</span>";        }        return "<b class=\"navlabel\">$label:</b>\n$title\n";    }    return '';} @my_icon_tags = ();$my_icon_tags{'next'} = 'Next Page';$my_icon_tags{'next_page'} = 'Next Page';$my_icon_tags{'previous'} = 'Previous Page';$my_icon_tags{'previous_page'} = 'Previous Page';$my_icon_tags{'up'} = 'Up One Level';$my_icon_tags{'contents'} = 'Contents';$my_icon_tags{'index'} = 'Index';$my_icon_tags{'modules'} = 'Module Index'; @my_icon_names = ();$my_icon_names{'previous_page'} = 'previous';$my_icon_names{'next_page'} = 'next'; sub get_my_icon($) {    my $name = $_[0];    my $text = $my_icon_tags{$name};    if ($my_icon_names{$name}) {        $name = $my_icon_names{$name};    }    if ($text eq '') {        $name = 'blank';    }    my $iconserver = ($ICONSERVER eq '.') ? '' : "$ICONSERVER/";    return "<img src='$iconserver$name.$IMAGE_TYPE'\n  border='0'"           . " height='32'  alt='$text' width='32' />";} sub unlinkify($) {    my $text = "$_[0]";    $text =~ s|</[aA]>||;    $text =~ s|<a\s+[^>]*>||i;    return $text;} sub use_icon($$$) {    my($rel,$str,$title) = @_;    if ($str) {        my $s = "$str";        if ($s =~ /\<tex2html_([a-z_]+)_visible_mark\>/) {            my $r = get_my_icon($1);            $s =~ s/\<tex2html_[a-z_]+_visible_mark\>/$r/;        }        $s =~ s/<[aA] /<a rel="$rel" title="$title"\n  /;        $s =~ s/ HREF=/ href=/;        return $s;    }    else {        return get_my_icon('blank');    }} sub make_nav_panel() {    my $s;    # new iconic         rel         iconic     page title    my $next     = use_icon('next',     $NEXT,     unlinkify($NEXT_TITLE));    my $up       = use_icon('parent',   $UP,       unlinkify($UP_TITLE));    my $previous = use_icon('prev',     $PREVIOUS, unlinkify($PREVIOUS_TITLE));    my $contents = use_icon('contents', $CONTENTS, 'Table of Contents');    my $index    = use_icon('index',    $INDEX,    'Index');    if (!$CUSTOM_BUTTONS) {        $CUSTOM_BUTTONS = get_my_icon('blank');    }    $s = ('<table align="center" width="100%" cellpadding="0" cellspacing="2">'          . "\n<tr>"          # left-hand side          . "\n<td class='online-navigation'>$previous</td>"          . "\n<td class='online-navigation'>$up</td>"          . "\n<td class='online-navigation'>$next</td>"          # title box          . "\n<td align=\"center\" width=\"100%\">$t_title</td>"          # right-hand side          . "\n<td class='online-navigation'>$contents</td>"          # module index          . "\n<td class='online-navigation'>$CUSTOM_BUTTONS</td>"          . "\n<td class='online-navigation'>$index</td>"          . "\n</tr></table>\n"          # textual navigation          . "<div class='online-navigation'>\n"          . make_nav_sectref("Previous", "prev", $PREVIOUS_TITLE)          . make_nav_sectref("Up", "parent", $UP_TITLE)          . make_nav_sectref("Next", "next", $NEXT_TITLE)          . "</div>\n"          );    # remove these; they are unnecessary and cause errors from validation    $s =~ s/ NAME="tex2html\d+"\n */ /g;    return $s;} sub add_child_links {    my $toc = add_real_child_links(@_);    $toc =~ s|\s*</[aA]>|</a>|g;    $toc =~ s/ NAME=\"tex2html\d+\"\s*href=/ href=/gi;    $toc =~ s|</UL>(\s*<BR( /)?>)?|</ul>|gi;    if ($toc =~ / NAME=["']CHILD_LINKS["']/) {        return "<div class='online-navigation'>\n$toc</div>\n";    }    return $toc;} sub get_version_text() {    if ($PACKAGE_VERSION ne '' && $t_date) {        return ("<span class=\"release-info\">"                . "Release $PACKAGE_VERSION$RELEASE_INFO,"                . " documentation updated on $t_date.</span>");    }    if ($PACKAGE_VERSION ne '') {        return ("<span class=\"release-info\">"                . "Release $PACKAGE_VERSION$RELEASE_INFO.</span>");    }    if ($t_date) {        return ("<span class=\"release-info\">Documentation released on "                . "$t_date.</span>");    }    return '';}  sub top_navigation_panel() {    return "\n<div id='top-navigation-panel' xml:id='top-navigation-panel'>\n"           . make_nav_panel()           . "<hr /></div>\n";} sub bot_navigation_panel() {    return "\n<div class='online-navigation'>\n"           . "<p></p><hr />\n"           . make_nav_panel()           . "</div>\n"           . "<hr />\n"           . get_version_text()           . "\n";} sub add_link {    # Returns a pair (iconic link, textual link)    my($icon, $current_file, @link) = @_;    my($dummy, $file, $title) = split($delim,                                      $section_info{join(' ',@link)});    if ($icon =~ /\<tex2html_([_a-z]+)_visible_mark\>/) {        my $r = get_my_icon($1);        $icon =~ s/\<tex2html_[_a-z]+_visible_mark\>/$r/;    }    if ($title && ($file ne $current_file)) {        $title = purify($title);        $title = get_first_words($title, $WORDS_IN_NAVIGATION_PANEL_TITLES);        return (make_href($file, $icon), make_href($file, "$title"))        }    elsif ($icon eq get_my_icon('up') && $EXTERNAL_UP_LINK) {        return (make_href($EXTERNAL_UP_LINK, $icon),                make_href($EXTERNAL_UP_LINK, "$EXTERNAL_UP_TITLE"))        }    elsif ($icon eq get_my_icon('previous')           && $EXTERNAL_PREV_LINK && $EXTERNAL_PREV_TITLE) {        return (make_href($EXTERNAL_PREV_LINK, $icon),                make_href($EXTERNAL_PREV_LINK, "$EXTERNAL_PREV_TITLE"))        }    elsif ($icon eq get_my_icon('next')           && $EXTERNAL_DOWN_LINK && $EXTERNAL_DOWN_TITLE) {        return (make_href($EXTERNAL_DOWN_LINK, $icon),                make_href($EXTERNAL_DOWN_LINK, "$EXTERNAL_DOWN_TITLE"))        }    return (&inactive_img($icon), "");} sub add_special_link($$$) {    my($icon, $file, $current_file) = @_;    if ($icon =~ /\<tex2html_([_a-z]+)_visible_mark\>/) {        my $r = get_my_icon($1);        $icon =~ s/\<tex2html_[_a-z]+_visible_mark\>/$r/;    }    return (($file && ($file ne $current_file))            ? make_href($file, $icon)            : undef)} # The img_tag() function seems only to be called with the parameter# 'anchor_invisible_mark', which we want to turn into ''.  Since# replace_icon_marks() is the only interesting caller, and all it really# does is call img_tag(), we can just define the hook alternative to be# a no-op instead.#sub replace_icons_hook {} sub do_cmd_arabic {    # get rid of that nasty <SPAN CLASS="arabic">...</SPAN>    my($ctr, $val, $id, $text) = &read_counter_value($_[0]);    return ($val ? farabic($val) : "0") . $text;}  sub gen_index_id($$) {    # this is used to ensure common index key generation and a stable sort    my($str, $extra) = @_;    sprintf('%s###%s%010d', $str, $extra, ++$global{'max_id'});} sub insert_index($$$$$) {    my($mark, $datafile, $columns, $letters, $prefix) = @_;    my $prog = "$myrootdir/tools/buildindex.py";    my $index;    if ($letters) {        $index = `$prog --columns $columns --letters $datafile`;    }    else {        $index = `$prog --columns $columns $datafile`;    }    if (!s/$mark/$prefix$index/) {        print "\nCould not locate index mark: $mark";    }} sub add_idx() {    print "\nBuilding HTML for the index ...";    close(IDXFILE);    insert_index($idx_mark, 'index.dat', $INDEX_COLUMNS, 1, '');}  $idx_module_mark = '<tex2html_idx_module_mark>';$idx_module_title = 'Module Index'; sub add_module_idx() {    print "\nBuilding HTML for the module index ...";    my $key;    my $first = 1;    my $prevplat = '';    my $allthesame = 1;    my $prefix = '';    foreach $key (keys %Modules) {        $key =~ s/<tt>([a-zA-Z0-9._]*)<\/tt>/$1/;        my $plat = "$ModulePlatforms{$key}";        $plat = ''          if ($plat eq $IGNORE_PLATFORM_ANNOTATION);        if (!$first) {            $allthesame = 0              if ($prevplat ne $plat);        }        else { $first = 0; }        $prevplat = $plat;    }    open(MODIDXFILE, '>modindex.dat') || die "\n$!\n";    foreach $key (keys %Modules) {        # dump the line in the data file; just use a dummy seqno field        my $nkey = $1;        my $moditem = "$Modules{$key}";        my $plat = '';        $key =~ s/<tt>([a-zA-Z0-9._]*)<\/tt>/$1/;        if ($ModulePlatforms{$key} && !$allthesame) {            $plat = (" <em>(<span class=\"platform\">$ModulePlatforms{$key}"                     . '</span>)</em>');        }        print MODIDXFILE $moditem . $IDXFILE_FIELD_SEP              . "<tt class=\"module\">$key</tt>$plat###\n";    }    close(MODIDXFILE);     if ($GLOBAL_MODULE_INDEX) {        $prefix = <<MODULE_INDEX_PREFIX; <p> This index only lists modules documented in this manual.  The <em class="citetitle"><a href="$GLOBAL_MODULE_INDEX">Global Module     Index</a></em> lists all modules that are documented in this set  of manuals.</p>MODULE_INDEX_PREFIX    }    if (!$allthesame) {        $prefix .= <<PLAT_DISCUSS; <p> Some module names are followed by an annotation indicating whatplatform they are available on.</p> PLAT_DISCUSS    }    insert_index($idx_module_mark, 'modindex.dat', $MODULE_INDEX_COLUMNS, 0,                 $prefix);} # replace both indexes as needed:sub add_idx_hook {    add_idx() if (/$idx_mark/);    process_python_state();    if ($MODULE_INDEX_FILE) {        local ($_);        open(MYFILE, "<$MODULE_INDEX_FILE");        sysread(MYFILE, $_, 1024*1024);        close(MYFILE);        add_module_idx();        open(MYFILE,">$MODULE_INDEX_FILE");        print MYFILE $_;        close(MYFILE);    }}  # In addition to the standard stuff, add label to allow named node files and# support suppression of the page complete (for HTML Help use).$MY_CONTENTS_PAGE = '';sub do_cmd_tableofcontents {    local($_) = @_;    $TITLE = $toc_title;    $tocfile = $CURRENT_FILE;    my($closures, $reopens) = preserve_open_tags();    anchor_label('contents', $CURRENT_FILE, $_);        # this is added    $MY_CONTENTS_PAGE = "$CURRENT_FILE";    join('', "\\tableofchildlinks[off]", $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;    my($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;    my($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) {                                        #        anchor_label("about",$CURRENT_FILE,$_);         # this is added    }                                                   #    my $the_version = '';                               # and the rest is    if ($t_date) {                                      # mostly ours        $the_version = ",\n$t_date";        if ($PACKAGE_VERSION) {            $the_version .= ", Release $PACKAGE_VERSION$RELEASE_INFO";        }    }    my $about;    open(ABOUT, "<$ABOUT_FILE") || die "\n$!\n";    sysread(ABOUT, $about, 1024*1024);    close(ABOUT);    $_ = (($INFO == 1)          ? join('',                 $close_all,                 "<strong>$t_title</strong>$the_version\n",                 $about,                 $open_all, $_)

Lines 1–500 of 801.