python.perl 25 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
# python.perl by Fred L. Drake, Jr. <fdrake@acm.org>		-*- perl -*-
#
# Heavily based on Guido van Rossum's myformat.perl (now obsolete).
#
# Extension to LaTeX2HTML for documents using myformat.sty.
# Subroutines of the form do_cmd_<name> here define translations
# for LaTeX commands \<name> defined in the corresponding .sty file.

package main;


# words typeset in a special way (not in HTML though)

sub do_cmd_ABC{ 'ABC' . @_[0]; }
sub do_cmd_UNIX{ 'Unix'. @_[0]; }
sub do_cmd_ASCII{ 'ASCII' . @_[0]; }
sub do_cmd_POSIX{ 'POSIX' . @_[0]; }
sub do_cmd_C{ 'C' . @_[0]; }
sub do_cmd_Cpp{ 'C++' . @_[0]; }
sub do_cmd_EOF{ 'EOF' . @_[0]; }
sub do_cmd_NULL{ '<tt>NULL</tt>' . @_[0]; }

sub do_cmd_e{ '&#92;' . @_[0]; }

$AUTHOR_ADDRESS = '';
$PYTHON_VERSION = '';

sub do_cmd_version{ $PYTHON_VERSION . @_[0]; }
sub do_cmd_release{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
31
    s/$next_pair_pr_rx//;
32 33 34 35 36 37
    $PYTHON_VERSION = "$2";
    $_;
}

sub do_cmd_authoraddress{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
38
    s/$next_pair_pr_rx//;
39 40 41 42 43 44
    $AUTHOR_ADDRESS = "$2";
    $_;
}

sub do_cmd_hackscore{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
45
    s/$next_pair_pr_rx/_/;
46 47 48 49 50
    $_;
}

sub do_cmd_optional{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
51
    s|$next_pair_pr_rx|</var><big>\[</big><var>\2</var><big>\]</big><var>|;
52 53 54 55 56
    $_;
}

sub do_cmd_varvars{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
57
    s|$next_pair_pr_rx|<var>\2</var>|;
58 59 60
    $_;
}

Fred Drake's avatar
Fred Drake committed
61
sub use_current{
62 63 64 65 66
    local($_) = @_;
    s|$next_pair_pr_rx|\2|;
    $_;
}

Fred Drake's avatar
Fred Drake committed
67 68 69
sub do_cmd_pytype{ use_current(); }
sub do_cmd_makevar{ use_current(); }

Fred Drake's avatar
Fred Drake committed
70 71 72 73
# Logical formatting (some based on texinfo), needs to be converted to
# minimalist HTML.  The "minimalist" is primarily to reduce the size of
# output files for users that read them over the network rather than
# from local repositories.
74 75 76

sub do_cmd_code{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
77 78 79 80 81 82 83 84 85 86 87 88 89
    s|$next_pair_pr_rx|<tt>\2</tt>|;
    $_;
}

sub use_sans_serif{
    local($_) = @_;
    s|$next_pair_pr_rx|<font face=sans-serif>\2</font>|;
    $_;
}

sub use_italics{
    local($_) = @_;
    s|$next_pair_pr_rx|<i>\2</i>|;
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
    $_;
}

sub do_cmd_sectcode{ &do_cmd_code(@_); }
sub do_cmd_module{ &do_cmd_code(@_); }
sub do_cmd_keyword{ &do_cmd_code(@_); }
sub do_cmd_exception{ &do_cmd_code(@_); }
sub do_cmd_class{ &do_cmd_code(@_); }
sub do_cmd_function{ &do_cmd_code(@_); }
sub do_cmd_constant{ &do_cmd_code(@_); }
sub do_cmd_member{ &do_cmd_code(@_); }
sub do_cmd_method{ &do_cmd_code(@_); }
sub do_cmd_cfunction{ &do_cmd_code(@_); }
sub do_cmd_cdata{ &do_cmd_code(@_); }
sub do_cmd_ctype{ &do_cmd_code(@_); }
Fred Drake's avatar
Fred Drake committed
105 106
sub do_cmd_regexp{ &do_cmd_code(@_); }
sub do_cmd_key{ &do_cmd_code(@_); }
107

108 109
sub do_cmd_character{ &do_cmd_samp(@_); }

Fred Drake's avatar
Fred Drake committed
110
sub do_cmd_program{ &do_cmd_strong(@_); }
111

Fred Drake's avatar
Fred Drake committed
112 113
sub do_cmd_email{ &use_sans_serif(@_); }
sub do_cmd_mimetype{ &use_sans_serif(@_); }
114

Fred Drake's avatar
Fred Drake committed
115
sub do_cmd_var{ &use_italics(@_); }
Fred Drake's avatar
Fred Drake committed
116
sub do_cmd_dfn{ &use_italics(@_); }	# make an index entry?
Fred Drake's avatar
Fred Drake committed
117
sub do_cmd_emph{ &use_italics(@_); }
118

119 120 121 122 123 124 125 126
sub do_cmd_newsgroup{
    local($_) = @_;
    s/$next_pair_pr_rx//o;
    my $newsgroup = $2;
    my $stuff = "<a href=\"news:$newsgroup\"><font face=sans-serif>"
      . "$newsgroup</font></a>";
    $stuff . $_;
}
Fred Drake's avatar
Fred Drake committed
127 128

sub do_cmd_envvar{
129
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
130 131 132
    s/$next_pair_pr_rx//;
    my($br_id,$envvar) = ($1, $2);
    my($name,$aname,$ahref) = link_info($br_id);
133 134 135 136
    # The <tt> here is really to keep buildindex.py from making
    # the variable name case-insensitive.
    add_index_entry("environment variables!$envvar@<tt>\$$envvar</tt>",
		    $ahref);
Fred Drake's avatar
Fred Drake committed
137 138
    add_index_entry("$envvar@\$$envvar", $ahref);
    "$aname\$$envvar</a>" . $_;
139 140 141 142 143
}

sub do_cmd_url{
    # use the URL as both text and hyperlink
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
144 145
    s/$next_pair_pr_rx//;
    my $url = $2;
146
    $url =~ s/~/&#126;/g;
Fred Drake's avatar
Fred Drake committed
147
    "<a href=\"$url\"><font face=sans-serif>$url</font></a>" . $_;
148 149 150 151 152
}

sub do_cmd_manpage{
    # two parameters:  \manpage{name}{section}
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
153 154
    my $rx = "$next_pair_pr_rx$any_next_pair_pr_rx3";
    s|$rx|<i>\2</i>(\4)|;
155 156 157 158 159 160
    $_;
}

sub do_cmd_rfc{
    local($_) = @_;
    s/$next_pair_pr_rx//;
Fred Drake's avatar
Fred Drake committed
161
    my($br_id,$rfcnumber) = ($1, $2);
162 163

    # Save the reference
Fred Drake's avatar
Fred Drake committed
164
    my $nstr = &gen_index_id("RFC!RFC $rfcnumber", '');
165
    $index{$nstr} .= &make_half_href("$CURRENT_FILE#$br_id");
Fred Drake's avatar
Fred Drake committed
166
    "<a name=$br_id>RFC $rfcnumber</a>" .$_;
167 168 169 170
}

sub do_cmd_kbd{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
171
    s|$next_pair_pr_rx|<kbd>\2</kbd>|;
172 173 174 175 176
    $_;
}

sub do_cmd_strong{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
177
    s|$next_pair_pr_rx|<b>\2</b>|;
178 179 180 181 182 183
    $_;
}

sub do_cmd_deprecated{
    # two parameters:  \deprecated{version}{whattodo}
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
184 185 186
    my $rx = "$next_pair_pr_rx$any_next_pair_pr_rx3";
    s|$rx|<b>Deprecated since release \2.</b>\n\4<p>|;
    $_;
187 188 189 190 191 192 193 194 195
}

# file and samp are at the end of this file since they screw up fontlock.

# index commands

$INDEX_SUBITEM = "";

sub get_indexsubitem{
196 197
    #$INDEX_SUBITEM ? " $INDEX_SUBITEM" : '';
    '';
198 199 200 201
}

sub do_cmd_setindexsubitem{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
202
    s/$next_pair_pr_rx//;
203 204 205 206
    $INDEX_SUBITEM = $2;
    $_;
}

207 208 209 210 211 212
sub do_cmd_withsubitem{
    # We can't really do the right right thing, because LaTeX2HTML doesn't
    # do things in the right order, but we need to at least strip this stuff
    # out, and leave anything that the second argument expanded out to.
    #
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
213
    my $any_next_pair_pr_rx3 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
214
    s/$next_pair_pr_rx$any_next_pair_pr_rx3/\4/;
Fred Drake's avatar
Fred Drake committed
215
    $INDEX_SUBITEM = $2;
216 217 218 219 220
    $_;
}

sub do_cmd_makemodindex{ @_[0]; }

Fred Drake's avatar
Fred Drake committed
221
# We're in the document subdirectory when this happens!
222
#
Fred Drake's avatar
Fred Drake committed
223 224
open(IDXFILE, ">index.dat") || die "\n$!\n";
open(INTLABELS, ">intlabels.pl") || die "\n$!\n";
225 226 227 228 229 230 231 232
print INTLABELS "%internal_labels = ();\n";
print INTLABELS "1;		# hack in case there are no entries\n\n";

# Using \0 for this is bad because we can't use common tools to work with the
# resulting files.  Things like grep can be useful with this stuff!
#
$IDXFILE_FIELD_SEP = "\1";

Fred Drake's avatar
Fred Drake committed
233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259

sub gen_target_name{
    "l2h-" . @_[0];
}

sub gen_target{
    "<a name=\"" . @_[0] . "\">";
}

sub gen_link{
    my($node,$target) = @_;
    print INTLABELS "\$internal_labels{\"$target\"} = \"$URL/$node\";\n";
    "<a href=\"$node#$target\">";
}

sub make_index_entry{
    my($br_id,$str) = @_;
    my($name,$aname,$ahref) = link_info($br_id);
    add_index_entry($str, $ahref);
    "$aname$anchor_invisible_mark</a>";
}

sub add_index_entry{
    # add an entry to the index structures; ignore the return value
    my($str,$ahref) = @_;
    $str = gen_index_id($str, '');
    $index{$str} .= $ahref;
260
    print IDXFILE $ahref, $IDXFILE_FIELD_SEP, $str, "\n";
Fred Drake's avatar
Fred Drake committed
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
}

sub link_info{
    my $name = gen_target_name(@_[0]);
    my $aname = gen_target($name);
    my $ahref = gen_link($CURRENT_FILE, $name);
    return ($name, $aname, $ahref);
}

sub do_cmd_index{
    local($_) = @_;
    s/$next_pair_pr_rx[\n]?//o;
    my($br_id,$str) = ($1, $2);
    #
    my($name,$aname,$ahref) = link_info($br_id);
    add_index_entry("$str", $ahref);
    "$aname$anchor_invisible_mark</a>" . $_;
}

280 281 282
sub do_cmd_indexii{
    local($_) = @_;
    s/$next_pair_pr_rx//o;
Fred Drake's avatar
Fred Drake committed
283
    my($br_id1,$str1) = ($1, $2);
Fred Drake's avatar
Fred Drake committed
284
    s/$next_pair_pr_rx[\n]?//o;
Fred Drake's avatar
Fred Drake committed
285
    my($br_id2,$str2) = ($1, $2);
Fred Drake's avatar
Fred Drake committed
286 287 288 289 290
    #
    my($name,$aname,$ahref) = link_info($br_id1);
    add_index_entry("$str1!$str2", $ahref);
    add_index_entry("$str2!$str1", $ahref);
    "$aname$anchor_invisible_mark</a>" . $_;
291 292 293 294 295
}

sub do_cmd_indexiii{
    local($_) = @_;
    s/$next_pair_pr_rx//o;
Fred Drake's avatar
Fred Drake committed
296
    my($br_id1,$str1) = ($1, $2);
297
    s/$next_pair_pr_rx//o;
Fred Drake's avatar
Fred Drake committed
298
    my($br_id2,$str2) = ($1, $2);
Fred Drake's avatar
Fred Drake committed
299
    s/$next_pair_pr_rx[\n]?//o;
Fred Drake's avatar
Fred Drake committed
300
    my($br_id3,$str3) = ($1, $2);
Fred Drake's avatar
Fred Drake committed
301 302 303 304 305 306
    #
    my($name,$aname,$ahref) = link_info($br_id1);
    add_index_entry("$str1!$str2 $str3", $ahref);
    add_index_entry("$str2!$str3, $str1", $ahref);
    add_index_entry("$str3!$str1 $str2", $ahref);
    "$aname$anchor_invisible_mark</a>" . $_;
307 308 309 310 311
}

sub do_cmd_indexiv{
    local($_) = @_;
    s/$next_pair_pr_rx//o;
Fred Drake's avatar
Fred Drake committed
312
    my($br_id1,$str1) = ($1, $2);
313
    s/$next_pair_pr_rx//o;
Fred Drake's avatar
Fred Drake committed
314
    my($br_id2,$str2) = ($1, $2);
315
    s/$next_pair_pr_rx//o;
Fred Drake's avatar
Fred Drake committed
316
    my($br_id3,$str3) = ($1, $2);
Fred Drake's avatar
Fred Drake committed
317
    s/$next_pair_pr_rx[\n]?//o;
Fred Drake's avatar
Fred Drake committed
318
    my($br_id4,$str4) = ($1, $2);
Fred Drake's avatar
Fred Drake committed
319 320 321 322 323 324 325
    #
    my($name,$aname,$ahref) = link_info($br_id1);
    add_index_entry("$str1!$str2 $str3 $str4", $ahref);
    add_index_entry("$str2!$str3 $str4, $str1", $ahref);
    add_index_entry("$str3!$str4, $str1 $str2", $ahref);
    add_index_entry("$str4!$$str1 $str2 $str3", $ahref);
    "$aname$anchor_invisible_mark</a>" . $_;
326 327
}

Fred Drake's avatar
Fred Drake committed
328 329
sub do_cmd_ttindex{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
330
    s/$next_pair_pr_rx[\n]?//;
Fred Drake's avatar
Fred Drake committed
331 332 333
    my($br_id,$str) = ($1, $2);
    &make_index_entry($br_id, $str . &get_indexsubitem) . $_;
}
334 335

sub my_typed_index_helper{
Fred Drake's avatar
Fred Drake committed
336
    local($word,$_) = @_;
Fred Drake's avatar
Fred Drake committed
337
    s/$next_pair_pr_rx[\n]?//o;
Fred Drake's avatar
Fred Drake committed
338
    my($br_id,$str) = ($1, $2);
Fred Drake's avatar
Fred Drake committed
339 340 341 342 343
    #
    my($name,$aname,$ahref) = link_info($br_id1);
    add_index_entry("$str $word", $ahref);
    add_index_entry("$word!$str", $ahref);
    "$aname$anchor_invisible_mark</a>" . $_;
344 345 346 347 348 349 350 351
}

sub do_cmd_stindex{ &my_typed_index_helper('statement', @_); }
sub do_cmd_opindex{ &my_typed_index_helper('operator', @_); }
sub do_cmd_exindex{ &my_typed_index_helper('exception', @_); }
sub do_cmd_obindex{ &my_typed_index_helper('object', @_); }

sub my_parword_index_helper{
Fred Drake's avatar
Fred Drake committed
352
    local($word,$_) = @_;
Fred Drake's avatar
Fred Drake committed
353
    s/$next_pair_pr_rx[\n]?//o;
Fred Drake's avatar
Fred Drake committed
354
    my($br_id,$str) = ($1, $2);
Fred Drake's avatar
Fred Drake committed
355
    make_index_entry($br_id, "$str ($word)") . $_;
356 357 358 359
}


sub make_mod_index_entry{
Fred Drake's avatar
Fred Drake committed
360
    my($br_id,$str,$define) = @_;
Fred Drake's avatar
Fred Drake committed
361 362 363 364
    my($name,$aname,$ahref) = link_info($br_id);
    # equivalent of add_index_entry() using $define instead of ''
    $str = gen_index_id($str, $define);
    $index{$str} .= $ahref;
365
    print IDXFILE $ahref, $IDXFILE_FIELD_SEP, $str, "\n";
Fred Drake's avatar
Fred Drake committed
366

Fred Drake's avatar
Fred Drake committed
367
    if ($define eq 'DEF') {
Fred Drake's avatar
Fred Drake committed
368
	# add to the module index
Fred Drake's avatar
Fred Drake committed
369
	my($nstr,$garbage) = split / /, $str, 2;
Fred Drake's avatar
Fred Drake committed
370
	$Modules{$nstr} .= $ahref;
371
    }
Fred Drake's avatar
Fred Drake committed
372
    "$aname$anchor_invisible_mark</a>";
373 374
}

Fred Drake's avatar
Fred Drake committed
375
$THIS_MODULE = '';
Fred Drake's avatar
Fred Drake committed
376
$THIS_CLASS = '';
Fred Drake's avatar
Fred Drake committed
377

378 379 380
sub my_module_index_helper{
    local($word, $_) = @_;
    s/$next_pair_pr_rx[\n]*//o;
Fred Drake's avatar
Fred Drake committed
381 382
    my($br_id, $str) = ($1, $2);
    my $section_tag = join('', @curr_sec_id);
383
    $word = "$word " if $word;
Fred Drake's avatar
Fred Drake committed
384
    $THIS_MODULE = "$str";
Fred Drake's avatar
Fred Drake committed
385 386
    make_mod_index_entry("SECTION$section_tag",
			 "<tt>$str</tt> (${word}module)", 'DEF') . $_;
387 388 389 390
}

sub ref_module_index_helper{
    local($word, $_) = @_;
Fred Drake's avatar
Fred Drake committed
391
    s/$next_pair_pr_rx[\n]?//o;
Fred Drake's avatar
Fred Drake committed
392
    my($br_id, $str) = ($1, $2);
393
    $word = "$word " if $word;
Fred Drake's avatar
Fred Drake committed
394
    make_mod_index_entry($br_id, "<tt>$str</tt> (${word}module)", 'REF') . $_;
395 396
}

Fred Drake's avatar
Fred Drake committed
397 398
sub do_cmd_bifuncindex{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
399
    s/$next_pair_pr_rx[\n]?//o;
Fred Drake's avatar
Fred Drake committed
400
    my($br_id,$str,$fname) = ($1, $2, "<tt>$2()</tt>");
Fred Drake's avatar
Fred Drake committed
401
    make_index_entry($br_id, "$fname (built-in function)") . $_;
Fred Drake's avatar
Fred Drake committed
402 403
}

Fred Drake's avatar
Fred Drake committed
404 405 406 407
sub do_cmd_modindex{ my_module_index_helper('', @_); }
sub do_cmd_bimodindex{ my_module_index_helper('built-in', @_); }
sub do_cmd_exmodindex{ my_module_index_helper('extension', @_); }
sub do_cmd_stmodindex{ my_module_index_helper('standard', @_); }
408 409

# these should be adjusted a bit....
Fred Drake's avatar
Fred Drake committed
410 411 412 413
sub do_cmd_refmodindex{ ref_module_index_helper('', @_); }
sub do_cmd_refbimodindex{ ref_module_index_helper('built-in', @_); }
sub do_cmd_refexmodindex{ ref_module_index_helper('extension', @_); }
sub do_cmd_refstmodindex{ ref_module_index_helper('standard', @_); }
414

Fred Drake's avatar
Fred Drake committed
415
sub do_cmd_nodename{ do_cmd_label(@_); }
416 417 418 419 420

sub init_myformat{
    # XXX need some way for this to be called after &initialise; ???
    $anchor_mark = '';
    $icons{'anchor_mark'} = '';
Fred Drake's avatar
Fred Drake committed
421
    my $cmark = "(?:$comment_mark)?";
422
    # <<2>>...<<2>>
Fred Drake's avatar
Fred Drake committed
423 424 425 426 427
    $next_pair_rx = "^[\\s\n%]*$O(\\d+)$C([\\s\\S]*)$O\\1$C";
    $any_next_pair_rx3 = "[\\s\n%]*$O(\\d+)$C([\\s\\S]*)$O\\3$C";
    $any_next_pair_rx5 = "[\\s\n%]*$O(\\d+)$C([\\s\\S]*)$O\\5$C";
    $any_next_pair_rx7 = "[\\s\n%]*$O(\\d+)$C([\\s\\S]*)$O\\7$C";
    $any_next_pair_rx9 = "[\\s\n%]*$O(\\d+)$C([\\s\\S]*)$O\\9$C";
428
    # <#2#>...<#2#>
Fred Drake's avatar
Fred Drake committed
429 430 431 432 433 434 435
    $next_pair_pr_rx = "^[\\s\n%]*$OP(\\d+)$CP([\\s\\S]*)$OP\\1$CP$cmark";
    $any_next_pair_pr_rx3 = "[\\s\n%]*$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP$cmark";
    $any_next_pair_pr_rx5 = "[\\s\n%]*$OP(\\d+)$CP([\\s\\S]*)$OP\\5$CP$cmark";
    $any_next_pair_pr_rx7 = "[\\s\n%]*$OP(\\d+)$CP([\\s\\S]*)$OP\\7$CP$cmark";
    $any_next_pair_pr_rx9 = "[\\s\n%]*$OP(\\d+)$CP([\\s\\S]*)$OP\\9$CP$cmark";
}
init_myformat();
436 437 438 439 440

# similar to make_index_entry(), but includes the string in the result
# instead of the dummy filler.
#
sub make_str_index_entry{
Fred Drake's avatar
Fred Drake committed
441
    my($br_id,$str) = @_;
Fred Drake's avatar
Fred Drake committed
442 443 444
    my($name,$aname,$ahref) = link_info($br_id);
    add_index_entry($str, $ahref);
    "$aname$str</a>";
445 446 447 448 449 450 451 452
}

# Changed from the stock version to indent {verbatim} sections,
# and make them smaller, to better match the LaTeX version:

# (Used with LaTeX2HTML 96.1*)
sub replace_verbatim {
    # Modifies $_
Fred Drake's avatar
Fred Drake committed
453
    my($prefix,$suffix) = ("\n<p><dl><dd><pre>\n", "</pre></dl>");
454 455 456 457 458
    s/$verbatim_mark(verbatim)(\d+)/$prefix$verbatim{$2}$suffix/go;
    s/$verbatim_mark(rawhtml)(\d+)/$verbatim{$2}/ego;	# Raw HTML
}

# (Used with LaTeX2HTML 98.1)
Fred Drake's avatar
Fred Drake committed
459 460
# The HTML this produces is bad; the <PRE> is on the outside of the <dl>,
# but I haven't found a workaround yet.
461 462
sub replace_verbatim_hook{
    # Modifies $_
Fred Drake's avatar
Fred Drake committed
463
    my($prefix,$suffix) = ("\n<p><dl><dd>", "</dl>");
464 465 466 467 468 469 470 471 472 473
    s/$math_verbatim_rx/&put_comment("MATH: ".$verbatim{$1})/eg;
    s/$verbatim_mark(\w*[vV]erbatim\*?)(\d+)\#/$prefix$verbatim{$2}$suffix/go;
    # Raw HTML, but replacements may have protected characters
    s/$verbatim_mark(rawhtml)(\d+)#/&unprotect_raw_html($verbatim{$2})/eg;
    s/$verbatim_mark$keepcomments(\d+)#/$verbatim{$2}/ego; # Raw TeX
    s/$unfinished_mark$keepcomments(\d+)#/$verbatim{$2}/ego; # Raw TeX
}

sub do_env_cfuncdesc{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
474 475 476 477
    my($return_type,$function_name,$arg_list,$idx) = ('', '', '', '');
    my $any_next_pair_rx3 = "$O(\\d+)$C([\\s\\S]*)$O\\3$C";
    my $any_next_pair_rx5 = "$O(\\d+)$C([\\s\\S]*)$O\\5$C";
    my $cfuncdesc_rx = "$next_pair_rx$any_next_pair_rx3$any_next_pair_rx5";
478 479 480 481
    if (/$cfuncdesc_rx/o) {
	$return_type = "$2";
	$function_name = "$4";
	$arg_list = "$6";
Fred Drake's avatar
Fred Drake committed
482
	$idx = make_str_index_entry($3,
Fred Drake's avatar
Fred Drake committed
483
			"<tt>$function_name()</tt>" . &get_indexsubitem);
484
	$idx =~ s/ \(.*\)//;
Fred Drake's avatar
Fred Drake committed
485
	$idx =~ s/\(\)//;
486 487
    }
    "<dl><dt>$return_type <b>$idx</b>"
Fred Drake's avatar
Fred Drake committed
488
      . "(<var>$arg_list</var>)\n<dd>$'</dl>"
489 490 491 492
}

sub do_env_ctypedesc{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
493 494
    my $type_name = ('');
    my $cfuncdesc_rx = "$next_pair_rx";
495 496
    if (/$cfuncdesc_rx/o) {
	$type_name = "$2";
Fred Drake's avatar
Fred Drake committed
497
	$idx = make_str_index_entry($1,
498 499 500
			"<tt>$type_name</tt>" . &get_indexsubitem);
	$idx =~ s/ \(.*\)//;
    }
Fred Drake's avatar
Fred Drake committed
501
    "<dl><dt><b>$idx</b>\n<dd>$'</dl>"
502 503 504 505
}

sub do_env_cvardesc{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
506 507
    my($var_type,$var_name,$idx) = ('', '', '');
    my $cfuncdesc_rx = "$next_pair_rx$any_next_pair_rx3";
508 509 510
    if (/$cfuncdesc_rx/o) {
	$var_type = "$2";
	$var_name = "$4";
Fred Drake's avatar
Fred Drake committed
511
	$idx = make_str_index_entry($3,
512 513 514 515
			"<tt>$var_name</tt>" . &get_indexsubitem);
	$idx =~ s/ \(.*\)//;
    }
    "<dl><dt>$var_type <b>$idx</b>\n"
Fred Drake's avatar
Fred Drake committed
516
      . "<dd>$'</dl>";
517 518 519 520
}

sub do_env_funcdesc{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
521 522
    my($function_name,$arg_list,$idx) = ('', '', '');
    my $funcdesc_rx = "$next_pair_rx$any_next_pair_rx3";
523 524 525
    if (/$funcdesc_rx/o) {
	$function_name = "$2";
	$arg_list = "$4";
Fred Drake's avatar
Fred Drake committed
526
	$idx = make_str_index_entry($3, "<tt>$function_name()</tt>"
Fred Drake's avatar
Fred Drake committed
527
				     . &get_indexsubitem);
528
	$idx =~ s/ \(.*\)//;
Fred Drake's avatar
Fred Drake committed
529
	$idx =~ s/\(\)//;
530
    }
Fred Drake's avatar
Fred Drake committed
531
    "<dl><dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>$'</dl>";
532 533 534 535
}

sub do_env_funcdescni{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
536 537
    my($function_name,$arg_list,$idx) = ('', '', '');
    my $funcdesc_rx = "$next_pair_rx$any_next_pair_rx3";
538 539 540
    if (/$funcdesc_rx/o) {
	$function_name = "$2";
	$arg_list = "$4";
541
	$idx = "<tt>$function_name</tt>";
542
    }
Fred Drake's avatar
Fred Drake committed
543
    "<dl><dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>$'</dl>";
544 545 546 547
}

sub do_cmd_funcline{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
548
    my $any_next_pair_pr_rx3 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
549

Fred Drake's avatar
Fred Drake committed
550 551 552 553
    s/$next_pair_pr_rx//o;
    my $function_name = $2;
    s/$next_pair_pr_rx//o;
    my($br_id,$arg_list) = ($1, $2);
Fred Drake's avatar
Fred Drake committed
554 555
    my $idx = make_str_index_entry($br_id, "<tt>$function_name()</tt>"
				   . &get_indexsubitem);
Fred Drake's avatar
Fred Drake committed
556
    $idx =~ s/\(\)//;
557 558 559 560 561 562 563 564 565 566 567 568

    "<dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>" . $_;
}

# Change this flag to index the opcode entries.  I don't think it's very
# useful to index them, since they're only presented to describe the dis
# module.
#
$INDEX_OPCODES = 0;

sub do_env_opcodedesc{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
569 570
    my($opcode_name,$arg_list,$stuff,$idx) = ('', '', '', '');
    my $opcodedesc_rx = "$next_pair_rx$any_next_pair_rx3";
571 572 573 574
    if (/$opcodedesc_rx/o) {
	$opcode_name = "$2";
	$arg_list = "$4";
	if ($INDEX_OPCODES) {
Fred Drake's avatar
Fred Drake committed
575
	    $idx = make_str_index_entry($3,
576 577 578 579 580 581 582 583 584 585 586
			"<tt>$opcode_name</tt> (byte code instruction)");
	    $idx =~ s/ \(byte code instruction\)//;
	}
	else {
	    $idx = "<tt>$opcode_name</tt>";
	}
      }
    $stuff = "<dl><dt><b>$idx</b>";
    if ($arg_list) {
	$stuff .= "&nbsp;&nbsp;&nbsp;&nbsp;<var>$arg_list</var>";
    }
Fred Drake's avatar
Fred Drake committed
587
    $stuff . "\n<dd>$'</dl>";
588 589 590 591
}

sub do_env_datadesc{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
592
    my $idx = '';
593
    if (/$next_pair_rx/o) {
Fred Drake's avatar
Fred Drake committed
594
	$idx = make_str_index_entry($1, "<tt>$2</tt>" . &get_indexsubitem);
595 596
	$idx =~ s/ \(.*\)//;
    }
Fred Drake's avatar
Fred Drake committed
597
    "<dl><dt><b>$idx</b>\n<dd>$'</dl>"
598 599 600 601
}

sub do_env_datadescni{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
602
    my $idx = '';
603 604 605 606 607 608
    if (/$next_pair_rx/o) {
	if ($STRING_INDEX_TT) {
	    $idx = "$2"; }
	else {
	    $idx = "<tt>$2</tt>"; }
    }
Fred Drake's avatar
Fred Drake committed
609
    "<dl><dt><b>$idx</b>\n<dd>$'</dl>"
610 611 612 613 614 615
}

sub do_cmd_dataline{
    local($_) = @_;

    s/$next_pair_pr_rx//o;
Fred Drake's avatar
Fred Drake committed
616
    my($br_id, $data_name) = ($1, $2);
Fred Drake's avatar
Fred Drake committed
617 618
    my $idx = make_str_index_entry($br_id, "<tt>$data_name</tt>"
				   . &get_indexsubitem);
619 620
    $idx =~ s/ \(.*\)//;

Fred Drake's avatar
Fred Drake committed
621
    "<dt><b>$idx</b><dd>" . $_;
622 623
}

Fred Drake's avatar
Fred Drake committed
624 625 626 627
sub do_env_excdesc{
    local($_) = @_;
    /$next_pair_rx/o;
    my($br_id,$excname,$rest) = ($1, $2, $');
628
    my $idx = make_str_index_entry($br_id, "<tt>$excname</tt>");
Fred Drake's avatar
Fred Drake committed
629 630 631 632
    "<dl><dt><b>$idx</b>\n<dd>$rest</dl>"
}

sub do_env_fulllineitems{ do_env_itemize(@_); }
633 634


Fred Drake's avatar
Fred Drake committed
635 636
sub do_env_classdesc{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
637
    my($class_name,$arg_list,$idx) = ('', '', '');
Fred Drake's avatar
Fred Drake committed
638 639
    my $funcdesc_rx = "$next_pair_rx$any_next_pair_rx3";
    if (/$funcdesc_rx/o) {
Fred Drake's avatar
Fred Drake committed
640
	$class_name = "$2";
Fred Drake's avatar
Fred Drake committed
641
	$arg_list = "$4";
Fred Drake's avatar
Fred Drake committed
642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667
	$THIS_CLASS = $class_name;
	$idx = make_str_index_entry($3,
			"<tt>$class_name</tt> (class in $THIS_MODULE)" );
	$idx =~ s/ \(.*\)//;
    }
    "<dl><dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>$'</dl>";
}


sub do_env_methoddesc{
    local($_) = @_;
    my($class_name,$arg_list,$idx,$extra);
    # Predefined $opt_arg_rx & $optional_arg_rx don't work because they
    # require the argument to be there.
    my $opt_arg_rx = "^\\s*(\\[([^]]*)\\])?";
    my $funcdesc_rx = "$opt_arg_rx$any_next_pair_rx3$any_next_pair_rx5";
    if (/$funcdesc_rx/o) {
	$class_name = $2;
	$class_name = $THIS_CLASS
	    unless $class_name;
	$method_name = $4;
	$arg_list = $6;
	if ($class_name) {
	    $extra = " ($class_name method)";
	}
	$idx = make_str_index_entry($3, "<tt>$method_name()</tt>$extra");
Fred Drake's avatar
Fred Drake committed
668
	$idx =~ s/ \(.*\)//;
Fred Drake's avatar
Fred Drake committed
669
	$idx =~ s/\(\)//;
Fred Drake's avatar
Fred Drake committed
670
    }
Fred Drake's avatar
Fred Drake committed
671
    "<dl><dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>$'</dl>";
Fred Drake's avatar
Fred Drake committed
672 673
}

Fred Drake's avatar
Fred Drake committed
674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718

sub do_env_methoddescni{
    local($_) = @_;
    # Predefined $opt_arg_rx & $optional_arg_rx don't work because they
    # require the argument to be there.
    my $opt_arg_rx = "^\\s*(\\[([^]]*)\\])?";
    my $funcdesc_rx = "$opt_arg_rx$any_next_pair_rx3$any_next_pair_rx5";
    /$funcdesc_rx/o;
    my $method = $4;
    my $arg_list = $6;
    "<dl><dt><b>$method</b> (<var>$arg_list</var>)\n<dd>$'</dl>";
}


sub do_env_memberdesc{
    local($_) = @_;
    # Predefined $opt_arg_rx & $optional_arg_rx don't work because they
    # require the argument to be there.
    my $opt_arg_rx = "^\\s*(\\[([^]]*)\\])?";
    my $funcdesc_rx = "$opt_arg_rx$any_next_pair_rx3$any_next_pair_rx5";
    /$funcdesc_rx/o;
    my($class,$member,$arg_list) = ($2, $4, $6);
    $class = $THIS_CLASS
        unless $class;
    $extra = " ($class_name attribute)"
        if $class;
    my $idx = make_str_index_entry($3, "<tt>$member()</tt>$extra");
    $idx =~ s/ \(.*\)//;
    $idx =~ s/\(\)//;
    "<dl><dt><b>$idx</b>\n<dd>$'</dl>";
}


sub do_env_memberdescni{
    local($_) = @_;
    # Predefined $opt_arg_rx & $optional_arg_rx don't work because they
    # require the argument to be there.
    my $opt_arg_rx = "^\\s*(\\[([^]]*)\\])?";
    my $funcdesc_rx = "$opt_arg_rx$any_next_pair_rx3";
    /$funcdesc_rx/o;
    my $member = $4;
    "<dl><dt><b>$member</b>\n<dd>$'</dl>";
}


719 720 721 722
@col_aligns = ("<td>", "<td>", "<td>");

sub setup_column_alignments{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
723 724
    my($j1,$a1,$a2,$a3,$j4) = split(/[|]/,$_);
    my($th1,$th2,$th3) = ('<th>', '<th>', '<th>');
725 726 727 728 729 730 731 732 733 734 735 736 737 738 739
    $col_aligns[0] = (($a1 eq "c") ? "<td align=center>" : "<td>");
    $col_aligns[1] = (($a2 eq "c") ? "<td align=center>" : "<td>");
    $col_aligns[2] = (($a3 eq "c") ? "<td align=center>" : "<td>");
    # return the aligned header start tags; only used for \begin{tableiii?}
    $th1 = (($a1 eq "l") ? "<th align=left>"
	    : ($a1 eq "r" ? "<th align=right>" : "<th>"));
    $th2 = (($a2 eq "l") ? "<th align=left>"
	    : ($a2 eq "r" ? "<th align=right>" : "<th>"));
    $th3 = (($a3 eq "l") ? "<th align=left>"
	    : ($a3 eq "r" ? "<th align=right>" : "<th>"));
    ($th1, $th2, $th3);
}

sub do_env_tableii{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
740 741
    my($font,$h1,$h2) = ('', '', '');
    my $tableiii_rx =
742 743 744
      "$next_pair_rx$any_next_pair_rx3$any_next_pair_rx5$any_next_pair_rx7";
    if (/$tableiii_rx/o) {
	$font = $4;
745 746
	$font = ''
	    if ($font eq 'textrm');
747 748 749
	$h1 = $6;
	$h2 = $8;
    }
Fred Drake's avatar
Fred Drake committed
750
    my($th1,$th2,$th3) = setup_column_alignments($2);
751 752 753 754 755 756 757 758 759 760
    $globals{"lineifont"} = $font;
    "<table border align=center>"
      . "\n  <tr>$th1<b>$h1</b></th>"
      . "\n      $th2<b>$h2</b></th>$'"
      . "\n</table>";
}

sub do_cmd_lineii{
    local($_) = @_;
    s/$next_pair_pr_rx//o;
Fred Drake's avatar
Fred Drake committed
761
    my $c1 = $2;
762
    s/$next_pair_pr_rx//o;
763 764 765 766 767
    my($c2,$font,$efont) = ($2, $globals{"lineifont"}, '');
    if ($font) {
	$font = "<$font>";
	$efont = "</$font>";
    }
Fred Drake's avatar
Fred Drake committed
768
    my($c1align,$c2align) = @col_aligns[0,1];
769
    "<tr>$c1align$font$c1$efont</td>\n"
770 771 772 773 774
      . "      $c2align$c2</td>$'";
}

sub do_env_tableiii{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
775
    my($font,$h1,$h2,$h3) = ('', '', '', '');
776
  
Fred Drake's avatar
Fred Drake committed
777
    my $tableiii_rx =
778 779 780 781
      "$next_pair_rx$any_next_pair_rx3$any_next_pair_rx5$any_next_pair_rx7"
	. "$any_next_pair_rx9";
    if (/$tableiii_rx/o) {
	$font = $4;
782 783
	$font = ''
	    if ($font eq 'textrm');
784 785 786 787
	$h1 = $6;
	$h2 = $8;
	$h3 = $10;
    }
Fred Drake's avatar
Fred Drake committed
788
    my($th1,$th2,$th3) = setup_column_alignments($2);
789 790 791 792 793 794 795 796 797 798 799
    $globals{"lineifont"} = $font;
    "<table border align=center>"
      . "\n  <tr>$th1<b>$h1</b></th>"
      . "\n      $th2<b>$h2</b></th>"
      . "\n      $th3<b>$h3</b></th>$'"
      . "\n</table>";
}

sub do_cmd_lineiii{
    local($_) = @_;
    s/$next_pair_pr_rx//o;
Fred Drake's avatar
Fred Drake committed
800
    my $c1 = $2;
801
    s/$next_pair_pr_rx//o;
Fred Drake's avatar
Fred Drake committed
802
    my $c2 = $2;
803
    s/$next_pair_pr_rx//o;
804 805 806 807 808
    my($c3,$font,$efont) = ($2, $globals{"lineifont"}, '');
    if ($font) {
	$font = "<$font>";
	$efont = "</$font>";
    }
Fred Drake's avatar
Fred Drake committed
809
    my($c1align, $c2align, $c3align) = @col_aligns;
810
    "<tr>$c1align$font$c1$efont</td>\n"
811 812 813 814 815 816 817 818 819 820 821 822
      . "      $c2align$c2</td>\n"
      . "      $c3align$c3</td>$'";
}

sub do_env_seealso{
    "<p><b>See Also:</b></p>\n" . @_[0];
}

sub do_cmd_seemodule{
    # Insert the right magic to jump to the module definition.  This should
    # work most of the time, at least for repeat builds....
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
823 824 825 826 827 828 829 830
    my $any_next_pair_pr_rx3 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
    my $any_next_pair_pr_rx5 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\5$CP";
    # Predefined $opt_arg_rx & $optional_arg_rx don't work because they
    # require the argument to be there.
    my $opt_arg_rx = "^\\s*(\\[([^]]*)\\])?";
    s/$opt_arg_rx$any_next_pair_pr_rx3$any_next_pair_pr_rx5//;
    my($key,$module,$text) = ($2, $4, $6);
    $key = $module unless $key;
831
    "<p>Module <tt><b><a href=\"module-$key.html\">$module</a></b></tt>"
832 833 834 835 836 837 838 839 840 841 842
      . "&nbsp;&nbsp;&nbsp;($text)</p>"
      . $_;
}

sub do_cmd_seetext{
    "<p>" . @_[0];
}


sub do_cmd_maketitle {
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
843
    my $the_title = '';
844
    if ($t_title) {
Fred Drake's avatar
Fred Drake committed
845
	$the_title .= "<h1 align=center>$t_title</h1>";
846
    } else { &write_warnings("\nThis document has no title."); }
Fred Drake's avatar
Fred Drake committed
847
    $the_title .= "\n<center>";
848 849
    if ($t_author) {
	if ($t_authorURL) {
Fred Drake's avatar
Fred Drake committed
850
	    my $href = &translate_commands($t_authorURL);
851
	    $href = &make_named_href('author', $href, "<strong>${t_author}</strong>");
Fred Drake's avatar
Fred Drake committed
852
	    $the_title .= "\n<p>$href</p>";
853
	} else {
Fred Drake's avatar
Fred Drake committed
854
	    $the_title .= "\n<p><strong>$t_author</strong></p>";
855 856 857
	}
    } else { &write_warnings("\nThere is no author for this document."); }
    if ($t_institute) {
Fred Drake's avatar
Fred Drake committed
858
        $the_title .= "\n<p>$t_institute</p>";}
859
    if ($AUTHOR_ADDRESS) {
Fred Drake's avatar
Fred Drake committed
860
        $the_title .= "\n<p>$AUTHOR_ADDRESS</p>";}
861
    if ($t_affil) {
Fred Drake's avatar
Fred Drake committed
862
	$the_title .= "\n<p><i>$t_affil</i></p>";}
863
    if ($t_date) {
Fred Drake's avatar
Fred Drake committed
864
	$the_title .= "\n<p><strong>$t_date</strong>";
865 866 867 868
	if ($PYTHON_VERSION) {
	    $the_title .= "<br><strong>Release $PYTHON_VERSION</strong>";}
	$the_title .= "</p>"
    }
Fred Drake's avatar
Fred Drake committed
869
    $the_title .= "\n</center>";
870
    if ($t_address) {
Fred Drake's avatar
Fred Drake committed
871 872
	$the_title .= "\n<p>$t_address</p>";
    } else { $the_title .= "\n<p>"}
873
    if ($t_email) {
Fred Drake's avatar
Fred Drake committed
874 875 876
	$the_title .= "\n<p>$t_email</p>";
    }# else { $the_title .= "</p>" }
    $the_title . "<hr>\n" . $_ ;
877 878 879
}


Fred Drake's avatar
Fred Drake committed
880 881 882
# sub do_cmd_indexlabel{
#     "genindex" . @_[0];
# }
Fred Drake's avatar
Fred Drake committed
883

884 885

# These are located down here since they screw up fontlock.  -- used to.
886 887 888 889 890 891 892 893

sub do_cmd_file{
    # This uses a weird HTML construct to adjust the font to be
    # reasonable match that used in the printed form as much as
    # possible.  The expected behavior is that a browser that doesn't
    # understand "<font face=...>" markup will use courier (or whatever
    # the font is for <tt>).
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
894
    s|$next_pair_pr_rx|\"<tt>\2</tt>\"|;
895 896 897 898 899
    $_;
}

sub do_cmd_samp{
    local($_) = @_;
Fred Drake's avatar
Fred Drake committed
900
    s|$next_pair_pr_rx|\"<tt>\2</tt>\"|;
901 902 903 904
    $_;
}

1;				# This must be the last line