l2hinit.perl 14.4 KB
Newer Older
1 2
#LaTeX2HTML Version 96.1 : dot.latex2html-init		-*- perl -*-
#
3 4 5 6 7
#  Significantly revised by Fred L. Drake, Jr. <fdrake@acm.org> for use
#  with the Python documentation.
#
#  New name to avoid distributing "dot" files with the Python documentation.
#
8

9 10 11 12 13 14 15
package Override;

use Cwd qw(getcwd);


package main;

16
$MAX_LINK_DEPTH = 2;
17
$ADDRESS = '';
18

19
$NO_FOOTNODE = 1;
20 21 22 23 24 25 26 27 28
$NUMBERED_FOOTNOTES = 1;

# Python documentation uses section numbers to support references to match
# in the printed and online versions.
#
$SHOW_SECTION_NUMBERS = 1;

$ICONSERVER = '../icons';

29 30 31 32 33
# Control where the navigation bars should show up:
$TOP_NAVIGATION = 1;
$BOTTOM_NAVIGATION = 1;
$AUTO_NAVIGATION = 0;

Fred Drake's avatar
Fred Drake committed
34
$BODYTEXT = 'bgcolor="#ffffff"';
35 36 37
$CHILDLINE = "\n<p><hr>\n";
$VERBOSITY = 0;

38
# default # of columns for the indexes
39
$INDEX_COLUMNS = 2;
40
$MODULE_INDEX_COLUMNS = 5;
41

42

43 44 45
# 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).
#
46 47 48 49 50 51
use Cwd;
use File::Basename;
($myname, $mydir, $myext) = fileparse(__FILE__, '\..*');
chop $mydir;			# remove trailing '/'
$mydir = getcwd() . "$dd$mydir"
  unless $mydir =~ s|^/|/|;
52
$LATEX2HTMLSTYLES = "$mydir$envkey$LATEX2HTMLSTYLES";
53
push (@INC, $mydir);
54

Fred Drake's avatar
Fred Drake committed
55 56 57
($myrootname, $myrootdir, $myext) = fileparse($mydir, '\..*');
chop $myrootdir;

58

59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
# 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";


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.
    #
    my $file = @_[0];
    my($jobname,$dir,$ext) = fileparse($file, '\..*');
    $dir = make_directory_absolute($dir);
    $dir =~ s/$dd$//;
    $TEXINPUTS = "$dir$envkey$mytexinputs";
    print "\nadding $dir to \$TEXINPUTS\n";
}


88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
sub set_icon_size{
    my($name, $w, $h) = @_;
    $iconsizes{$name} = "width=$w height=$h";
}

foreach $name (split(/ /, 'up next previous contents index modules')) {
    set_icon_size($name, 32, 32);
}
# The '_motif' is really annoying, and makes the HTML larger with no value
# added, so strip it off:
foreach $name (keys %icons) {
    my $icon = $icons{$name};
    $icon =~ s/_motif//;
    $icons{$name} = $icon;
}
103

104 105
$CUSTOM_BUTTONS = '';

106
sub make_nav_panel{
107 108 109 110 111 112 113 114 115 116 117 118 119
    ('<table width="100%" cellpadding=0 cellspacing=0><tr><td width="20%">'
     . ($NEXT_TITLE ? "$NEXT " : '')
     . ($UP_TITLE ? "$UP " : '')
     . ($PREVIOUS_TITLE ? "$PREVIOUS " : '')
     . "</td>\n<td align=center width=\"60%\"><b>$t_title</b>"
     . "</td>\n<td align=right width=\"20%\">"
     . $CONTENTS
     . ' ' . $CUSTOM_BUTTONS
     . ' ' . $INDEX
     . "</td></tr></table>\n<hr>\n"
     . ($NEXT_TITLE ? "<b>Next:</b> $NEXT_TITLE\n" : '')
     . ($UP_TITLE ? "<b>Up:</b> $UP_TITLE\n" : '')
     . ($PREVIOUS_TITLE ? "<b>Previous:</b> $PREVIOUS_TITLE\n" : ''));
120
}
121

122 123
sub top_navigation_panel {
    "<div class=navigation>\n"
124 125
      . make_nav_panel()
      . '<br><hr><p></div>';
126 127 128
}

sub bot_navigation_panel {
129
    "<p>\n<div class=navigation><hr>"
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
      . make_nav_panel()
      . '</div>';
}

sub add_link {
    # Returns a pair (iconic link, textual link)
    my($icon, $current_file, @link) = @_;
    my($dummy, $file, $title) = split($delim,
				      $toc_section_info{join(' ',@link)});
    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 $up_visible_mark && $EXTERNAL_UP_LINK) {
 	return (make_href($EXTERNAL_UP_LINK, $icon),
		make_href($EXTERNAL_UP_LINK, "$EXTERNAL_UP_TITLE"))
	}
    elsif (($icon eq $previous_visible_mark
	    || $icon eq $previous_page_visible_mark)
	   && $EXTERNAL_PREV_LINK && $EXTERNAL_PREV_TITLE) {
	return (make_href($EXTERNAL_PREV_LINK, $icon),
		make_href($EXTERNAL_PREV_LINK, "$EXTERNAL_PREV_TITLE"))
	}
    elsif (($icon eq $next_visible_mark
	    ||  $icon eq $next_page_visible_mark)
	   && $EXTERNAL_DOWN_LINK && $EXTERNAL_DOWN_TITLE) {
	return (make_href($EXTERNAL_DOWN_LINK, $icon),
		make_href($EXTERNAL_DOWN_LINK, "$EXTERNAL_DOWN_TITLE"))
	}
    (&inactive_img($icon), "");
}

sub add_special_link {
    my($icon, $file, $current_file) = @_;
    (($file && ($file ne $current_file)) ? make_href($file, $icon) : undef)
}

sub img_tag {
    local($icon) = @_;
    my $alt;
    my $align = " align=bottom ";

173
    # having this list hardcoded here is really bogus....
174 175 176
    $alt = join('|', 'up', 'next_group', 'previous_group'
		, 'next', 'previous', 'change_begin_right', 'change_begin'
		, 'change_end_right', 'change_end', 'change_delete_right'
177
		, 'change_delete', 'contents', 'index', 'modules');
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201

    if ($icon =~ /(gif|png)$/) {
	$used_icons{$icon} = 1;
	if ($icon =~ /change_(begin|end|delete)_right/) { $align = ' ' };
	my $nav_border = "$NAV_BORDER";
	if ($icon =~ /($alt)/) {
	    $alt = $1;
	}
	else {
	    $nav_border = '1';
	    $alt = '[*]';
	};
	if ($LOCAL_ICONS) {
	    return join('', '<img ', $iconsizes{$1}, $align
			,'border=', $nav_border, ' alt="', $alt
			,'" src="', $icon, '">' );
	}
	return join('', '<img ', $iconsizes{$1}, $align
		    ,'border=', $nav_border, ' alt="', $alt, '"\n'
		    ,' src="', $ICONSERVER, "/$icon", '">' );
    }
    else {
	return $icon;
    }
202 203 204 205 206
}


sub gen_index_id {
    # this is used to ensure common index key generation and a stable sort
Fred Drake's avatar
Fred Drake committed
207
    my($str,$extra) = @_;
208
    sprintf('%s###%s%010d', $str, $extra, ++$global{'max_id'});
209 210
}

211
sub make_index_entry {
Fred Drake's avatar
Fred Drake committed
212
    my($br_id,$str) = @_;
213 214 215 216 217
    # 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, '');
218
    $index{$str} .= make_half_href("$CURRENT_FILE#$br_id");
219 220
    "<a name=\"$br_id\">$anchor_invisible_mark<\/a>";
}
221

222 223

sub insert_index{
224 225 226 227 228 229 230 231 232
    my($mark,$datafile,$columns,$letters) = @_;
    my $prog = "$myrootdir/tools/buildindex.py";
    my $index;
    if ($letters) {
	$index = `$prog --columns $columns --letters $datafile`;
    }
    else {
	$index = `$prog --columns $columns $datafile`;
    }
233 234 235
    s/$mark/$index/;
}

Fred Drake's avatar
Fred Drake committed
236
sub add_idx{
237
    print "\nDoing the index ...";
Fred Drake's avatar
Fred Drake committed
238
    close(IDXFILE);
239
    insert_index($idx_mark, 'index.dat', $INDEX_COLUMNS, 1);
240
}
241 242 243 244 245


$idx_module_mark = '<tex2html_idx_module_mark>';
$idx_module_title = 'Module Index';

246
sub add_module_idx{
247
    print "\nDoing the module index ...";
Fred Drake's avatar
Fred Drake committed
248
    my $key;
249
    open(MODIDXFILE, '>modindex.dat') || die "\n$!\n";
Fred Drake's avatar
Fred Drake committed
250 251
    foreach $key (keys %Modules) {
	# dump the line in the data file; just use a dummy seqno field
252
	print MODIDXFILE "$Modules{$key}" . $IDXFILE_FIELD_SEP . "$key###\n";
253
    }
Fred Drake's avatar
Fred Drake committed
254
    close(MODIDXFILE);
255
    insert_index($idx_module_mark, 'modindex.dat', $MODULE_INDEX_COLUMNS, 0);
256 257
}

Fred Drake's avatar
Fred Drake committed
258 259
# replace both indexes as needed:
sub add_idx_hook{
260 261 262
    add_idx() if (/$idx_mark/);
    add_module_idx() if (/$idx_module_mark/);
    process_all_localmoduletables();
Fred Drake's avatar
Fred Drake committed
263
}
264 265 266 267 268 269 270


# In addition to the standard stuff, add label to allow named node files.
sub do_cmd_tableofcontents {
    local($_) = @_;
    $TITLE = $toc_title;
    $tocfile = $CURRENT_FILE;
271 272
    my($closures,$reopens) = preserve_open_tags();
    anchor_label('contents', $CURRENT_FILE, $_);	# this is added
273
    join('', "<BR>\n", $closures
274
	 , make_section_heading($toc_title, 'H2'), $toc_mark
275 276 277 278 279 280 281
	 , $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;
282 283
    my($closures,$reopens) = preserve_open_tags();
    anchor_label('lof', $CURRENT_FILE, $_);		# this is added
284
    join('', "<BR>\n", $closures
285
	 , make_section_heading($lof_title, 'H2'), $lof_mark
286 287 288 289 290 291 292
	 , $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;
293 294
    my($closures,$reopens) = preserve_open_tags();
    anchor_label('lot', $CURRENT_FILE, $_);		# this is added
295
    join('', "<BR>\n", $closures
296
	 , make_section_heading($lot_title, 'H2'), $lot_mark
297 298 299 300 301 302
	 , $reopens, $_);
}
# In addition to the standard stuff, add label to allow named node files.
sub do_cmd_textohtmlinfopage {
    local($_) = @_;
    if ($INFO) {					# 
303
	anchor_label("about",$CURRENT_FILE,$_);		# this is added
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
    }							#
    ( ($INFO == 1)
     ? 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
sub do_cmd_textohtmlindex {
    local($_) = @_;
    $TITLE = $idx_title;
    $idxfile = $CURRENT_FILE;
Fred Drake's avatar
Fred Drake committed
325 326
    if (%index_labels) { make_index_labels(); }
    if (($SHORT_INDEX) && (%index_segment)) { make_preindex(); }
327
    else { $preindex = ''; }
Fred Drake's avatar
Fred Drake committed
328
    my $heading = make_section_heading($idx_title, 'h2') . $idx_mark;
Fred Drake's avatar
Fred Drake committed
329
    my($pre,$post) = minimize_open_tags($heading);
Fred Drake's avatar
Fred Drake committed
330 331
    anchor_label('genindex',$CURRENT_FILE,$_);		# this is added
    '<br>\n' . $pre . $_;
332 333 334 335 336 337
}

# $idx_module_mark will be replaced with the real index at the end
sub do_cmd_textohtmlmoduleindex {
    local($_) = @_;
    $TITLE = $idx_module_title;
338
    anchor_label("modindex",$CURRENT_FILE,$_);
Fred Drake's avatar
Fred Drake committed
339 340
    '<p>' . make_section_heading($idx_module_title, "h2")
      . $idx_module_mark . $_;
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
}

# 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 {
Fred Drake's avatar
Fred Drake committed
358
    my $id = $global{'max_id'};
359 360 361 362 363 364

    s/([\\]begin\s*$O\d+$C\s*thebibliography)/$bbl_cnt++; $1/eg;
    s/([\\]begin\s*$O\d+$C\s*thebibliography)/$id++; "\\bibliography$O$id$C$O$id$C $1"/geo
      #if ($bbl_cnt == 1)
    ;
    #}
Fred Drake's avatar
Fred Drake committed
365 366 367 368 369 370 371 372 373 374
    #----------------------------------------------------------------------
    # (FLD) This was added
    my(@parts) = split(/\\begin\s*$O\d+$C\s*theindex/);
    if (scalar(@parts) == 3) {
	# Be careful to re-write the string in place, since $_ is *not*
	# returned explicity;  *** nasty side-effect dependency! ***
	print "\nadd_bbl_and_idx_dummy_commands ==> adding module index";
	my $rx = "([\\\\]begin\\s*$O\\d+$C\\s*theindex[\\s\\S]*)"
	         . "([\\\\]begin\\s*$O\\d+$C\\s*theindex)";
	s/$rx/\\textohtmlmoduleindex \1 \\textohtmlindex \2/o;
375
	# Add a button to the navigation areas:
376 377
	$CUSTOM_BUTTONS .= ("<a\n href=\"modindex.html\">"
			    . img_tag('modules.'.$IMAGE_TYPE) . "</a>");
Fred Drake's avatar
Fred Drake committed
378 379 380 381 382 383 384
    }
    else {
	$global{'max_id'} = $id; # not sure why....
	s/([\\]begin\s*$O\d+$C\s*theindex)/\\textohtmlindex $1/o;
	s/[\\]printindex/\\textohtmlindex /o;
    }
    #----------------------------------------------------------------------
385
    lib_add_bbl_and_idx_dummy_commands()
Fred Drake's avatar
Fred Drake committed
386
        if defined(&lib_add_bbl_and_idx_dummy_commands);
387 388 389 390 391 392 393
}

# 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;

394 395
sub set_depth_levels {
    # Sets $outermost_level
Fred Drake's avatar
Fred Drake committed
396
    my $level;
397 398 399 400 401 402 403 404 405 406 407 408 409
    #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 };

410 411 412 413 414 415 416 417 418 419
    %unnumbered_section_commands = ('tableofcontents' => $level,
				    'listoffigures' => $level,
				    'listoftables' => $level,
				    'bibliography' => $level,
				    'textohtmlindex' => $level,
				    'textohtmlmoduleindex' => $level);
    $section_headings{'textohtmlmoduleindex'} = 'h1';

    %section_commands = (%unnumbered_section_commands,
			 %section_commands);
Fred Drake's avatar
Fred Drake committed
420 421

    make_sections_rx();
422
}
423 424 425


# Fix from Ross Moore for ']' in \item[...]; this can be removed once the next
Fred Drake's avatar
Fred Drake committed
426 427
# patch to LaTeX2HTML is released and tested ... if the patch gets included.
# Be very careful to keep this around, just in case things break again!
428 429 430
#
sub protect_useritems {
    local(*_) = @_;
Fred Drake's avatar
Fred Drake committed
431
    local($preitems,$thisitem);
432
    while (/\\item\s*\[/) {
Fred Drake's avatar
Fred Drake committed
433 434
        $preitems .= $`;
	$_ = $';
435 436
        $thisitem = $&.'<<'.++$global{'max_id'}.'>>';
        s/^(((($O|$OP)\d+($C|$CP)).*\3|<[^<>]*>|[^\]<]+)*)\]/$thisitem.=$1;''/e;
Fred Drake's avatar
Fred Drake committed
437 438
        $preitems .= $thisitem . '<<' . $global{'max_id'} . '>>]';
	s/^]//;
439 440 441 442
    }
    $_ = $preitems . $_;
}

443 444 445 446 447 448 449 450
# This changes the markup used for {verbatim} environments, and is the
# best way I've found that ensures the <dl> goes one the outside of the
# <pre>...</pre>.
#
# Note that this *must* be done in the init file, not the python.perl
# style support file.  The %declarations must be set before initialize()
# is called in the main script.
#
451
%declarations = ('preform' => '<dl><dd><pre></pre></dl>',
452 453
		 %declarations);

454
1;	# This must be the last line