File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / readline / doc / texi2html
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jul 30 08:16:46 2014 UTC (9 years, 10 months ago) by misho
Branches: readline, MAIN
CVS tags: v8_2p0, v8_1p0, v6_3p10_cross, v6_3p10, v6_3, p6, HEAD
readline 6.3

    1: #! /usr/bin/perl
    2: 'di ';
    3: 'ig 00 ';
    4: #+##############################################################################
    5: #
    6: # texi2html: Program to transform Texinfo documents to HTML
    7: #
    8: #    Copyright (C) 1999, 2000  Free Software Foundation, Inc.
    9: #
   10: #   This program is free software: you can redistribute it and/or modify
   11: #   it under the terms of the GNU General Public License as published by
   12: #   the Free Software Foundation, either version 3 of the License, or
   13: #   (at your option) any later version.
   14: #
   15: #   This program is distributed in the hope that it will be useful,
   16: #   but WITHOUT ANY WARRANTY; without even the implied warranty of
   17: #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   18: #   GNU General Public License for more details.
   19: #
   20: #   You should have received a copy of the GNU General Public License
   21: #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
   22: #
   23: #-##############################################################################
   24: 
   25: # This requires perl version 5 or higher
   26: require 5.0;
   27: 
   28: #++##############################################################################
   29: #
   30: # NOTE FOR DEBUGGING THIS SCRIPT:
   31: # You can run 'perl texi2html.pl' directly, provided you have
   32: # the environment variable T2H_HOME set to the directory containing
   33: # the texi2html.init file
   34: #
   35: #--##############################################################################
   36: 
   37: # CVS version:
   38: # $Id: texi2html,v 1.1.1.1 2014/07/30 08:16:46 misho Exp $
   39: 
   40: # Homepage:
   41: $T2H_HOMEPAGE = <<EOT;
   42: http://www.mathematik.uni-kl.de/~obachman/Texi2html
   43: EOT
   44: 
   45: # Authors:  
   46: $T2H_AUTHORS = <<EOT;
   47: Written by: Lionel Cons <Lionel.Cons\@cern.ch> (original author)
   48:             Karl Berry  <karl\@freefriends.org>
   49:             Olaf Bachmann <obachman\@mathematik.uni-kl.de>
   50:             and many others.
   51: Maintained by: Olaf Bachmann <obachman\@mathematik.uni-kl.de>
   52: Send bugs and suggestions to <texi2html\@mathematik.uni-kl.de>
   53: EOT
   54: 
   55: # Version: set in configure.in
   56: $THISVERSION = '1.64';
   57: $THISPROG = "texi2html $THISVERSION";	# program name and version
   58:   
   59: # The man page for this program is included at the end of this file and can be
   60: # viewed using the command 'nroff -man texi2html'.
   61: 
   62: # Identity:
   63: 
   64: $T2H_TODAY = &pretty_date;		# like "20 September 1993"
   65: # the eval prevents this from breaking on system which do not have
   66: # a proper getpwuid implemented
   67: eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i
   68: 
   69: #+++############################################################################
   70: #                                                                              #
   71: # Initialization                                                               #
   72: # Pasted content of File $(srcdir)/texi2html.init: Default initializations     # 
   73: #                                                                              #
   74: #---############################################################################
   75: 
   76: # leave this within comments, and keep the require statement
   77: # This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
   78: # exists.
   79: 
   80: # 
   81: # -*-perl-*-
   82: ######################################################################
   83: # File: texi2html.init
   84: #
   85: # Sets default values for command-line arguments and for various customizable
   86: # procedures
   87: #
   88: # A copy of this file is pasted into the beginning of texi2html by
   89: # 'make texi2html'
   90: #
   91: # Copy this file and make changes to it, if you like.
   92: # Afterwards, either, load it with command-line option -init_file <your_init_file>
   93: #
   94: # $Id: texi2html,v 1.1.1.1 2014/07/30 08:16:46 misho Exp $
   95: 
   96: ######################################################################
   97: # stuff which can also be set by command-line options
   98: #
   99: #
  100: # Note: values set here, overwrite values set by the command-line
  101: # options before -init_file and might still be overwritten by
  102: # command-line arguments following the -init_file option
  103: #
  104: 
  105: # T2H_OPTIONS is a hash whose keys are the (long) names of valid
  106: # command-line options and whose values are a hash with the following keys:
  107: # type    ==> one of !|=i|:i|=s|:s (see GetOpt::Long for more info)
  108: # linkage ==> ref to scalar, array, or subroutine (see GetOpt::Long for more info)
  109: # verbose ==> short description of option (displayed by -h)
  110: # noHelp  ==> if 1 -> for "not so important options": only print description on -h 1
  111: #                2 -> for obsolete options: only print description on -h 2
  112: 
  113: $T2H_DEBUG = 0;
  114: $T2H_OPTIONS -> {debug} =
  115: {
  116:  type => '=i',
  117:  linkage => \$main::T2H_DEBUG,
  118:  verbose => 'output HTML with debuging information',
  119: };
  120: 
  121: $T2H_DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'; 
  122: $T2H_OPTIONS -> {doctype} = 
  123: {
  124:  type => '=s',
  125:  linkage => \$main::T2H_DOCTYPE,
  126:  verbose => 'document type which is output in header of HTML files',
  127:  noHelp => 1
  128: };
  129: 
  130: $T2H_CHECK = 0;
  131: $T2H_OPTIONS -> {check} =
  132: {
  133:  type => '!',
  134:  linkage => \$main::T2H_CHECK,
  135:  verbose => 'if set, only check files and output all things that may be Texinfo commands',
  136:  noHelp => 1
  137: };
  138: 
  139: # -expand
  140: # if set to "tex" (or, "info") expand @iftex and @tex (or, @ifinfo) sections
  141: # else, neither expand @iftex, @tex, nor @ifinfo sections
  142: $T2H_EXPAND = "info";
  143: $T2H_OPTIONS -> {expand} = 
  144: {
  145:  type => '=s',
  146:  linkage => \$T2H_EXPAND,
  147:  verbose => 'Expand info|tex|none section of texinfo source',
  148: };
  149: 
  150: # - glossary
  151: #if set, uses section named `Footnotes' for glossary
  152: $T2H_USE_GLOSSARY = 0;
  153: T2H_OPTIONS -> {glossary} =
  154: {
  155:  type => '!',
  156:  linkage => \$T2H_USE_GLOSSARY,
  157:  verbose => "if set, uses section named `Footnotes' for glossary",
  158:  noHelp  => 1,
  159: };
  160: 
  161: 
  162: # -invisible
  163: # $T2H_INVISIBLE_MARK is the text used to create invisible destination
  164: # anchors for index links (you can for instance use the invisible.xbm
  165: # file shipped with this program). This is a workaround for a known
  166: # bug of many WWW browsers, including netscape.
  167: # For me, it works fine without it -- on the contrary: if there, it
  168: # inserts space between headers and start of text (obachman 3/99)
  169: $T2H_INVISIBLE_MARK = '';
  170: # $T2H_INVISIBLE_MARK = '&#160;';
  171: $T2H_OPTIONS -> {invisible} =
  172: {
  173:  type => '=s',
  174:  linkage => \$T2H_INVISIBLE_MARK,
  175:  verbose => 'use text in invisble anchot',
  176:  noHelp  => 1,
  177: };
  178: 
  179: # -iso
  180: # if set, ISO8879 characters are used for special symbols (like copyright, etc)
  181: $T2H_USE_ISO = 0;
  182: $T2H_OPTIONS -> {iso} =
  183: {
  184:  type => 'iso',
  185:  linkage => \$T2H_USE_ISO,
  186:  verbose => 'if set, ISO8879 characters are used for special symbols (like copyright, etc)',
  187:  noHelp => 1,
  188: };
  189: 
  190: # -I
  191: # list directories where @include files are searched for (besides the
  192: # directory of the doc file) additional '-I' args add to this list
  193: @T2H_INCLUDE_DIRS = (".");
  194: $T2H_OPTIONS -> {I} =
  195: {
  196:  type => '=s',
  197:  linkage => \@T2H_INCLUDE_DIRS,
  198:  verbose => 'append $s to the @include search path',
  199: };
  200: 
  201: # -top_file
  202: # uses file of this name for top-level file
  203: # extension is manipulated appropriately, if necessary.
  204: # If empty, <basename of document>.html is used
  205: # Typically, you would set this to "index.html".
  206: $T2H_TOP_FILE = '';
  207: $T2H_OPTIONS -> {top_file} =
  208: {
  209:  type => '=s',
  210:  linkage => \$T2H_TOP_FILE,
  211:  verbose => 'use $s as top file, instead of <docname>.html',
  212: };
  213: 
  214: 
  215: # -toc_file
  216: # uses file of this name for table of contents file
  217: # extension is manipulated appropriately, if necessary.
  218: # If empty, <basename of document>_toc.html is used
  219: $T2H_TOC_FILE = '';
  220: $T2H_OPTIONS -> {toc_file} =
  221: {
  222:  type => '=s',
  223:  linkage => \$T2H_TOC_FILE,
  224:  verbose => 'use $s as ToC file, instead of <docname>_toc.html',
  225: };
  226: 
  227: # -frames
  228: # if set, output two additional files which use HTML 4.0 "frames".
  229: $T2H_FRAMES = 0;
  230: $T2H_OPTIONS -> {frames} =
  231: {
  232:  type => '!',
  233:  linkage => \$T2H_FRAMES,
  234:  verbose => 'output files which use HTML 4.0 frames (experimental)',
  235:  noHelp => 1,
  236: };
  237: 
  238: 
  239: # -menu | -nomenu
  240: # if set, show the Texinfo menus
  241: $T2H_SHOW_MENU = 1;
  242: $T2H_OPTIONS -> {menu} =
  243: {
  244:  type => '!',
  245:  linkage => \$T2H_SHOW_MENU,
  246:  verbose => 'ouput Texinfo menus',
  247: };
  248: 
  249: # -number | -nonumber
  250: # if set, number sections and show section names and numbers in references 
  251: # and menus
  252: $T2H_NUMBER_SECTIONS = 1;
  253: $T2H_OPTIONS -> {number} =
  254: {
  255:  type => '!',
  256:  linkage => \$T2H_NUMBER_SECTIONS,
  257:  verbose => 'use numbered sections'
  258: };
  259: 
  260: # if set, and T2H_NUMBER_SECTIONS is set, then use node names in menu
  261: # entries, instead of section names
  262: $T2H_NODE_NAME_IN_MENU = 0;
  263: 
  264: # if set and menu entry equals menu descr, then do not print menu descr.
  265: # Likewise, if node name equals entry name, do not print entry name.
  266: $T2H_AVOID_MENU_REDUNDANCY = 1;
  267: 
  268: # -split section|chapter|none 
  269: # if set to 'section' (resp. 'chapter') create one html file per (sub)section
  270: # (resp. chapter) and separate pages for Top, ToC, Overview, Index,
  271: # Glossary, About.
  272: # otherwise, create monolithic html file which contains whole document
  273: #$T2H_SPLIT = 'section';
  274: $T2H_SPLIT = '';
  275: $T2H_OPTIONS -> {split} =
  276: {
  277:  type => '=s',
  278:  linkage => \$T2H_SPLIT,
  279:  verbose => 'split document on section|chapter else no splitting',
  280: };
  281: 
  282: # -section_navigation|-no-section_navigation
  283: # if set, then navigation panels are printed at the beginning of each section
  284: # and, possibly at the end (depending on whether or not there were more than 
  285: # $T2H_WORDS_IN_PAGE  words on page
  286: # This is most useful if you do not want to have section navigation 
  287: # on -split chapter
  288: $T2H_SECTION_NAVIGATION = 1;
  289: $T2H_OPTIONS -> {sec_nav} =
  290: {
  291:  type => '!',
  292:  linkage => \$T2H_SECTION_NAVIGATION,
  293:  verbose => 'output navigation panels for each section',
  294: };
  295: 
  296: # -subdir
  297: # if set put result files in this directory
  298: # if not set result files are put into current directory
  299: #$T2H_SUBDIR = 'html';
  300: $T2H_SUBDIR = '';
  301: $T2H_OPTIONS -> {subdir} =
  302: {
  303:  type => '=s',
  304:  linkage => \$T2H_SUBDIR,
  305:  verbose => 'put HTML files in directory $s, instead of $cwd',
  306: };
  307: 
  308: # -short_extn
  309: # If this is set all HTML file will have extension ".htm" instead of
  310: # ".html". This is helpful when shipping the document to PC systems.
  311: $T2H_SHORTEXTN = 0;
  312: $T2H_OPTIONS -> {short_ext} =
  313: {
  314:  type => '!',
  315:  linkage => \$T2H_SHORTEXTN,
  316:  verbose => 'use "htm" extension for output HTML files',
  317: };
  318: 
  319: 
  320: # -prefix
  321: # Set the output file prefix, prepended to all .html, .gif and .pl files.
  322: # By default, this is the basename of the document
  323: $T2H_PREFIX = '';
  324: $T2H_OPTIONS -> {prefix} =
  325: {
  326:  type => '=s',
  327:  linkage => \$T2H_PREFIX,
  328:  verbose => 'use as prefix for output files, instead of <docname>',
  329: };
  330: 
  331: # -o filename
  332: # If set, generate monolithic document output html into $filename
  333: $T2H_OUT = '';
  334: $T2H_OPTIONS -> {out_file} =
  335: {
  336:  type => '=s',
  337:  linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';},
  338:  verbose => 'if set, all HTML output goes into file $s',
  339: };
  340: 
  341: # -short_ref
  342: #if set cross-references are given without section numbers
  343: $T2H_SHORT_REF = '';
  344: $T2H_OPTIONS -> {short_ref} =
  345: {
  346:  type => '!',
  347:  linkage => \$T2H_SHORT_REF,
  348:  verbose => 'if set, references are without section numbers',
  349: };
  350: 
  351: # -idx_sum
  352: # if value is set, then for each @prinindex $what
  353: # $docu_name_$what.idx is created which contains lines of the form
  354: # $key\t$ref sorted alphabetically (case matters)
  355: $T2H_IDX_SUMMARY = 0;
  356: $T2H_OPTIONS -> {idx_sum} =
  357: {
  358:  type => '!',
  359:  linkage => \$T2H_IDX_SUMMARY,
  360:  verbose => 'if set, also output index summary',
  361:  noHelp  => 1,
  362: };
  363: 
  364: # -verbose
  365: # if set, chatter about what we are doing
  366: $T2H_VERBOSE = '';
  367: $T2H_OPTIONS -> {Verbose} =
  368: {
  369:  type => '!',
  370:  linkage => \$T2H_VERBOSE,
  371:  verbose => 'print progress info to stdout',
  372: };
  373: 
  374: # -lang
  375: # For page titles use $T2H_WORDS->{$T2H_LANG}->{...} as title.
  376: # To add a new language, supply list of titles (see $T2H_WORDS below).
  377: # and use ISO 639 language codes (see e.g. perl module Locale-Codes-1.02 
  378: # for  definitions)
  379: # Default's to 'en' if not set or no @documentlanguage is specified
  380: $T2H_LANG = '';
  381: $T2H_OPTIONS -> {lang} =
  382: {
  383:  type => '=s',
  384:  linkage => sub {SetDocumentLanguage($_[1])},
  385:  verbose => 'use $s as document language (ISO 639 encoding)',
  386: };
  387: 
  388: # -l2h
  389: # if set, uses latex2html for generation of math content 
  390: $T2H_L2H = '';
  391: $T2H_OPTIONS -> {l2h} =
  392: {
  393:  type => '!',
  394:  linkage => \$T2H_L2H,
  395:  verbose => 'if set, uses latex2html for @math and @tex',
  396: };
  397: 
  398: ######################
  399: # The following options are only relevant if $T2H_L2H is set
  400: #
  401: # -l2h_l2h
  402: # name/location of latex2html progam
  403: $T2H_L2H_L2H = "latex2html";
  404: $T2H_OPTIONS -> {l2h_l2h} =
  405: {
  406:  type => '=s',
  407:  linkage => \$T2H_L2H_L2H,
  408:  verbose => 'program to use for latex2html translation',
  409:  noHelp => 1,
  410: };
  411: 
  412: # -l2h_skip
  413: # if set, skips actual call to latex2html tries to reuse previously generated 
  414: # content, instead
  415: $T2H_L2H_SKIP = '';
  416: $T2H_OPTIONS -> {l2h_skip} =
  417: {
  418:  type => '!',
  419:  linkage => \$T2H_L2H_SKIP,
  420:  verbose => 'if set, tries to reuse previously latex2html output',
  421:  noHelp => 1,
  422: };
  423: 
  424: # -l2h_tmp
  425: # if set, l2h uses this directory for temporarary files. The path
  426: # leading to this directory may not contain a dot (i.e., a "."),
  427: # otherwise, l2h will fail
  428: $T2H_L2H_TMP = '';
  429: $T2H_OPTIONS -> {l2h_tmp} =
  430: {
  431:  type => '=s',
  432:  linkage => \$T2H_L2H_TMP,
  433:  verbose => 'if set, uses $s as temporary latex2html directory',
  434:  noHelp => 1,
  435: };
  436: 
  437: # if set, cleans intermediate files (they all have the prefix $doc_l2h_) 
  438: # of l2h 
  439: $T2H_L2H_CLEAN = 1;
  440: $T2H_OPTIONS -> {l2h_clean} =
  441: {
  442:  type => '!',
  443:  linkage => \$T2H_L2H_CLEAN,
  444:  verbose => 'if set, do not keep intermediate latex2html files for later reuse',
  445:  noHelp => 1,
  446: };
  447: 
  448: $T2H_OPTIONS -> {D} =
  449: {
  450:  type => '=s',
  451:  linkage => sub {$main::value{@_[1]} = 1;},
  452:  verbose => 'equivalent to Texinfo "@set $s 1"',
  453:  noHelp => 1,
  454: };
  455: 
  456: $T2H_OPTIONS -> {init_file} =
  457: {
  458:  type => '=s',
  459:  linkage => \&LoadInitFile,
  460:  verbose => 'load init file $s'
  461: };
  462: 
  463: 
  464: ##############################################################################
  465: #
  466: # The following can only be set in the init file
  467: #
  468: ##############################################################################
  469: 
  470: # if set, center @image by default
  471: # otherwise, do not center by default
  472: $T2H_CENTER_IMAGE = 1;
  473: 
  474: # used as identation for block enclosing command @example, etc
  475: # If not empty, must be enclosed in <td></td>
  476: $T2H_EXAMPLE_INDENT_CELL = '<td>&nbsp;</td>';
  477: # same as above, only for @small
  478: $T2H_SMALL_EXAMPLE_INDENT_CELL = '<td>&nbsp;</td>';
  479: # font size for @small
  480: $T2H_SMALL_FONT_SIZE = '-1';
  481: 
  482: # if non-empty, and no @..heading appeared in Top node, then
  483: # use this as header for top node/section, otherwise use value of 
  484: # @settitle or @shorttitle (in that order)
  485: $T2H_TOP_HEADING = '';
  486: 
  487: # if set, use this chapter for 'Index' button, else
  488: # use first chapter whose name matches 'index' (case insensitive)
  489: $T2H_INDEX_CHAPTER = '';
  490: 
  491: # if set and $T2H_SPLIT is set, then split index pages at the next letter
  492: # after they have more than that many entries
  493: $T2H_SPLIT_INDEX = 100;
  494: 
  495: # if set (e.g., to index.html) replace hrefs to this file 
  496: # (i.e., to index.html) by ./
  497: $T2H_HREF_DIR_INSTEAD_FILE = '';
  498: 
  499: ########################################################################
  500: # Language dependencies: 
  501: # To add a new language extend T2H_WORDS hash and create $T2H_<...>_WORDS hash
  502: # To redefine one word, simply do:
  503: # $T2H_WORDS->{<language>}->{<word>} = 'whatever' in your personal init file.
  504: #
  505: $T2H_WORDS_EN =
  506: {
  507:  # titles  of pages
  508:  'ToC_Title' => 'Table of Contents',
  509:  'Overview_Title' => 'Short Table of Contents',
  510:  'Index_Title' => 'Index',
  511:  'About_Title' => 'About this document',
  512:  'Footnotes_Title' => 'Footnotes',
  513:  'See' => 'See',
  514:  'see' => 'see',
  515:  'section' => 'section',
  516: # If necessary, we could extend this as follows: 
  517: #  # text for buttons
  518: #  'Top_Button' => 'Top',
  519: #  'ToC_Button' => 'Contents',
  520: #  'Overview_Button' => 'Overview',
  521: #  'Index_button' => 'Index',
  522: #  'Back_Button' => 'Back',
  523: #  'FastBack_Button' => 'FastBack',
  524: #  'Prev_Button' => 'Prev',
  525: #  'Up_Button' => 'Up',
  526: #  'Next_Button' => 'Next',
  527: #  'Forward_Button' =>'Forward',
  528: #  'FastWorward_Button' => 'FastForward',
  529: #  'First_Button' => 'First',
  530: #  'Last_Button' => 'Last',
  531: #  'About_Button' => 'About'
  532: };
  533: 
  534: $T2H_WORD_DE =
  535: {
  536:  'ToC_Title' => 'Inhaltsverzeichniss',
  537:  'Overview_Title' => 'Kurzes Inhaltsverzeichniss',
  538:  'Index_Title' => 'Index',
  539:  'About_Title' => '&Uuml;ber dieses Dokument',
  540:  'Footnotes_Title' => 'Fu&szlig;noten',
  541:  'See' => 'Siehe',
  542:  'see' => 'siehe',
  543:  'section' => 'Abschnitt',
  544: };
  545: 
  546: $T2H_WORD_NL =
  547: {
  548:  'ToC_Title' => 'Inhoudsopgave',
  549:  'Overview_Title' => 'Korte inhoudsopgave',
  550:  'Index_Title' => 'Index', #Not sure ;-)
  551:  'About_Title' => 'No translation available!', #No translation available!
  552:  'Footnotes_Title' => 'No translation available!', #No translation available!
  553:  'See' => 'Zie',
  554:  'see' => 'zie',
  555:  'section' => 'sectie',
  556: };
  557: 
  558: $T2H_WORD_ES =
  559: {
  560:  'ToC_Title' => '&iacute;ndice General',
  561:  'Overview_Title' => 'Resumen del Contenido',
  562:  'Index_Title' => 'Index', #Not sure ;-)
  563:  'About_Title' => 'No translation available!', #No translation available!
  564:  'Footnotes_Title' => 'Fu&szlig;noten',
  565:  'See' => 'V&eacute;ase',
  566:  'see' => 'v&eacute;ase',
  567:  'section' => 'secci&oacute;n',
  568: };
  569: 
  570: $T2H_WORD_NO =
  571: {
  572:  'ToC_Title' => 'Innholdsfortegnelse',
  573:  'Overview_Title' => 'Kort innholdsfortegnelse',
  574:  'Index_Title' => 'Indeks', #Not sure ;-)
  575:  'About_Title' => 'No translation available!', #No translation available!
  576:  'Footnotes_Title' => 'No translation available!',
  577:  'See' => 'Se',
  578:  'see' => 'se',
  579:  'section' => 'avsnitt',
  580: };
  581: 
  582: $T2H_WORD_PT =
  583: {
  584:  'ToC_Title' => 'Sum&aacute;rio',
  585:  'Overview_Title' => 'Breve Sum&aacute;rio',
  586:  'Index_Title' => '&Iacute;ndice', #Not sure ;-)
  587:  'About_Title' => 'No translation available!', #No translation available!
  588:  'Footnotes_Title' => 'No translation available!',
  589:  'See' => 'Veja',
  590:  'see' => 'veja',
  591:  'section' => 'Se&ccedil;&atilde;o',
  592: };
  593: 
  594: $T2H_WORDS =
  595: {
  596:  'en' => $T2H_WORDS_EN,
  597:  'de' => $T2H_WORDS_DE,
  598:  'nl' => $T2H_WORDS_NL,
  599:  'es' => $T2H_WORDS_ES,
  600:  'no' => $T2H_WORDS_NO,
  601:  'pt' => $T2H_WORDS_PT
  602: };
  603: 
  604: @MONTH_NAMES_EN =
  605: (
  606:  'January', 'February', 'March', 'April', 'May',
  607:  'June', 'July', 'August', 'September', 'October',
  608:  'November', 'December'
  609: );
  610: 
  611: @MONTH_NAMES_DE =
  612: (
  613:  'Januar', 'Februar', 'M&auml;rz', 'April', 'Mai',
  614:  'Juni', 'Juli', 'August', 'September', 'Oktober',
  615:  'November', 'Dezember'
  616: );
  617: 
  618: @MONTH_NAMES_NL =
  619: (
  620:  'Januari', 'Februari', 'Maart', 'April', 'Mei',
  621:  'Juni', 'Juli', 'Augustus', 'September', 'Oktober',
  622:  'November', 'December'
  623: );
  624: 
  625: @MONTH_NAMES_ES =
  626: (
  627:  'enero', 'febrero', 'marzo', 'abril', 'mayo',
  628:  'junio', 'julio', 'agosto', 'septiembre', 'octubre',
  629:  'noviembre', 'diciembre'
  630: );
  631: 
  632: @MONTH_NAMES_NO =
  633: (
  634: 
  635:  'januar', 'februar', 'mars', 'april', 'mai',
  636:  'juni', 'juli', 'august', 'september', 'oktober',
  637:  'november', 'desember'
  638: );
  639: 
  640: @MONTH_NAMES_PT =
  641: (
  642:  'Janeiro', 'Fevereiro', 'Mar&ccedil;o', 'Abril', 'Maio',
  643:  'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro',
  644:  'Novembro', 'Dezembro'
  645: );
  646: 
  647: 
  648: $MONTH_NAMES =
  649: {
  650:     'en' => \@MONTH_NAMES_EN,
  651:     'de' => \@MONTH_NAMES_DE,
  652:     'es' => \@MONTH_NAMES_ES,
  653:     'nl' => \@MONTH_NAMES_NL,
  654:     'no' => \@MONTH_NAMES_NO,
  655:     'pt' => \@MONTH_NAMES_PT
  656: };
  657: ########################################################################
  658: # Control of Page layout:
  659: # You can make changes of the Page layout at two levels:
  660: # 1.) For small changes, it is often enough to change the value of
  661: #     some global string/hash/array variables
  662: # 2.) For larger changes, reimplement one of the T2H_DEFAULT_<fnc>* routines,
  663: #     give them another name, and assign them to the respective
  664: #     $T2H_<fnc> variable.
  665: 
  666: # As a general interface, the hashes T2H_HREF, T2H_NAME, T2H_NODE hold 
  667: # href, html-name, node-name of
  668: # This     -- current section (resp. html page)
  669: # Top      -- top page ($T2H_TOP_FILE)
  670: # Contents -- Table of contents
  671: # Overview -- Short table of contents
  672: # Index    -- Index page
  673: # About    -- page which explain "navigation buttons"
  674: # First    -- first node 
  675: # Last     -- last node
  676: #
  677: # Whether or not the following hash values are set, depends on the context 
  678: # (all values are w.r.t. 'This' section)
  679: # Next        -- next node of texinfo
  680: # Prev        -- previous node of texinfo
  681: # Up          -- up node of texinfo
  682: # Forward     -- next node in reading order
  683: # Back        -- previous node in reading order
  684: # FastForward -- if leave node, up and next, else next node
  685: # FastBackward-- if leave node, up and prev, else prev node
  686: #
  687: # Furthermore, the following global variabels are set:
  688: # $T2H_THISDOC{title}     -- title as set by @setttile
  689: # $T2H_THISDOC{fulltitle} -- full title as set by @title...
  690: # $T2H_THISDOC{subtitle}  -- subtitle as set by @subtitle
  691: # $T2H_THISDOC{author}    -- author as set by @author
  692: # 
  693: # and pointer to arrays of lines which need to be printed by t2h_print_lines 
  694: # $T2H_OVERVIEW      -- lines of short table of contents
  695: # $T2H_TOC           -- lines of table of contents
  696: # $T2H_TOP           -- lines of Top texinfo node 
  697: # $T2H_THIS_SECTION  -- lines of 'This' section
  698: 
  699: #
  700: # There are the following subs which control the layout:
  701: #
  702: $T2H_print_section            = \&T2H_DEFAULT_print_section;
  703: $T2H_print_Top_header         = \&T2H_DEFAULT_print_Top_header;       
  704: $T2H_print_Top_footer	      = \&T2H_DEFAULT_print_Top_footer;       
  705: $T2H_print_Top		      = \&T2H_DEFAULT_print_Top;              
  706: $T2H_print_Toc		      = \&T2H_DEFAULT_print_Toc;              
  707: $T2H_print_Overview	      = \&T2H_DEFAULT_print_Overview;         
  708: $T2H_print_Footnotes	      = \&T2H_DEFAULT_print_Footnotes;        
  709: $T2H_print_About	      = \&T2H_DEFAULT_print_About;            
  710: $T2H_print_misc_header	      = \&T2H_DEFAULT_print_misc_header;      
  711: $T2H_print_misc_footer	      = \&T2H_DEFAULT_print_misc_footer;      
  712: $T2H_print_misc		      = \&T2H_DEFAULT_print_misc;
  713: $T2H_print_chapter_header     = \&T2H_DEFAULT_print_chapter_header;      
  714: $T2H_print_chapter_footer     = \&T2H_DEFAULT_print_chapter_footer;      
  715: $T2H_print_page_head	      = \&T2H_DEFAULT_print_page_head;        
  716: $T2H_print_page_foot	      = \&T2H_DEFAULT_print_page_foot;        
  717: $T2H_print_head_navigation    = \&T2H_DEFAULT_print_head_navigation;  
  718: $T2H_print_foot_navigation    = \&T2H_DEFAULT_print_foot_navigation;  
  719: $T2H_button_icon_img	      = \&T2H_DEFAULT_button_icon_img;        
  720: $T2H_print_navigation	      = \&T2H_DEFAULT_print_navigation;       
  721: $T2H_about_body		      = \&T2H_DEFAULT_about_body;            
  722: $T2H_print_frame              = \&T2H_DEFAULT_print_frame;
  723: $T2H_print_toc_frame          = \&T2H_DEFAULT_print_toc_frame;
  724: 
  725: ########################################################################
  726: # Layout for html for every sections
  727: #
  728: sub T2H_DEFAULT_print_section
  729: {
  730:   my $fh = shift;
  731:   local $T2H_BUTTONS = \@T2H_SECTION_BUTTONS;
  732:   &$T2H_print_head_navigation($fh) if $T2H_SECTION_NAVIGATION;
  733:   my $nw = t2h_print_lines($fh);
  734:   if ($T2H_SPLIT eq 'section' && $T2H_SECTION_NAVIGATION)
  735:   {
  736:     &$T2H_print_foot_navigation($fh, $nw);
  737:   }
  738:   else
  739:   {
  740:     print $fh '<HR SIZE="6">' . "\n";
  741:   }
  742: }
  743: 
  744: ###################################################################
  745: # Layout of top-page I recommend that you use @ifnothtml, @ifhtml,
  746: # @html within the Top texinfo node to specify content of top-level
  747: # page. 
  748: #
  749: # If you enclose everything in @ifnothtml, then title, subtitle,
  750: # author and overview is printed
  751: # T2H_HREF of Next, Prev, Up, Forward, Back are not defined
  752: # if $T2H_SPLIT then Top page is in its own html file
  753: sub T2H_DEFAULT_print_Top_header
  754: {
  755:   &$T2H_print_page_head(@_) if $T2H_SPLIT;
  756:   t2h_print_label(@_); # this needs to be called, otherwise no label set
  757:   &$T2H_print_head_navigation(@_);
  758: }
  759: sub T2H_DEFAULT_print_Top_footer
  760: {
  761:   &$T2H_print_foot_navigation(@_);
  762:   &$T2H_print_page_foot(@_) if $T2H_SPLIT; 
  763: }
  764: sub T2H_DEFAULT_print_Top
  765: {
  766:   my $fh = shift;
  767: 
  768:   # for redefining navigation buttons use:
  769:   # local $T2H_BUTTONS = [...];
  770:   # as it is, 'Top', 'Contents', 'Index', 'About' are printed
  771:   local $T2H_BUTTONS = \@T2H_MISC_BUTTONS;
  772:   &$T2H_print_Top_header($fh);
  773:   if ($T2H_THIS_SECTION)
  774:   {
  775:     # if top-level node has content, then print it with extra header
  776:     print $fh "<H1>$T2H_NAME{Top}</H1>"
  777:       unless ($T2H_HAS_TOP_HEADING);
  778:     t2h_print_lines($fh, $T2H_THIS_SECTION)
  779:   }
  780:   else
  781:   {
  782:     # top-level node is fully enclosed in @ifnothtml
  783:     # print fulltitle, subtitle, author, Overview
  784:     print $fh 
  785:       "<CENTER>\n<H1>" .
  786:       join("</H1>\n<H1>", split(/\n/,  $T2H_THISDOC{fulltitle})) .
  787:       "</H1>\n";
  788:     print $fh "<H2>$T2H_THISDOC{subtitle}</H2>\n" if $T2H_THISDOC{subtitle};
  789:     print $fh "$T2H_THISDOC{author}\n" if $T2H_THISDOC{author};
  790:     print $fh <<EOT;
  791: </CENTER>
  792: <HR>
  793: <P></P>  
  794: <H2> Overview: </H2>
  795: <BLOCKQUOTE>  
  796: EOT
  797:     t2h_print_lines($fh, $T2H_OVERVIEW);
  798:     print $fh "</BLOCKQUOTE>\n";
  799:   }
  800:   &$T2H_print_Top_footer($fh);
  801: }
  802: 
  803: ###################################################################
  804: # Layout of Toc, Overview, and Footnotes pages
  805: # By default, we use "normal" layout 
  806: # T2H_HREF of Next, Prev, Up, Forward, Back, etc are not defined
  807: # use: local $T2H_BUTTONS = [...] to redefine navigation buttons
  808: sub T2H_DEFAULT_print_Toc
  809: {
  810:   return &$T2H_print_misc(@_);
  811: }
  812: sub T2H_DEFAULT_print_Overview
  813: {
  814:   return &$T2H_print_misc(@_);
  815: }
  816: sub T2H_DEFAULT_print_Footnotes
  817: {
  818:   return &$T2H_print_misc(@_);
  819: }
  820: sub T2H_DEFAULT_print_About
  821: {
  822:   return &$T2H_print_misc(@_);
  823: }
  824: 
  825: sub T2H_DEFAULT_print_misc_header
  826: {
  827:   &$T2H_print_page_head(@_) if $T2H_SPLIT;
  828:   # this needs to be called, otherwise, no labels are set
  829:   t2h_print_label(@_); 
  830:   &$T2H_print_head_navigation(@_);
  831: }
  832: sub T2H_DEFAULT_print_misc_footer
  833: {
  834:   &$T2H_print_foot_navigation(@_);
  835:   &$T2H_print_page_foot(@_) if $T2H_SPLIT; 
  836: }
  837: sub T2H_DEFAULT_print_misc
  838: {
  839:   my $fh = shift;
  840:   local $T2H_BUTTONS = \@T2H_MISC_BUTTONS;
  841:   &$T2H_print_misc_header($fh);
  842:   print $fh "<H1>$T2H_NAME{This}</H1>\n";
  843:   t2h_print_lines($fh);
  844:   &$T2H_print_misc_footer($fh);
  845: }
  846: 
  847: ###################################################################
  848: # chapter_header and chapter_footer are only called if
  849: # T2H_SPLIT eq 'chapter'
  850: # chapter_header: after print_page_header, before print_section
  851: # chapter_footer: after print_section of last section, before print_page_footer
  852: # 
  853: # If you want to get rid of navigation stuff after each section,
  854: # redefine print_section such that it does not call print_navigation,
  855: # and put print_navigation into print_chapter_header
  856: @T2H_CHAPTER_BUTTONS =
  857:   (
  858:    'FastBack', 'FastForward', ' ', 
  859:    ' ', ' ', ' ', ' ',
  860:    'Top', 'Contents', 'Index', 'About', 
  861:   );
  862: 
  863: sub T2H_DEFAULT_print_chapter_header
  864: {
  865:   # nothing to do there, by default
  866:   if (! $T2H_SECTION_NAVIGATION)
  867:   {
  868:     my $fh = shift;
  869:     local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS;
  870:     &$T2H_print_navigation($fh);
  871:     print $fh "\n<HR SIZE=2>\n";
  872:   }
  873: }
  874: 
  875: sub T2H_DEFAULT_print_chapter_footer
  876: {
  877:   local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS;
  878:   &$T2H_print_navigation(@_);
  879: }
  880: ###################################################################
  881: $T2H_TODAY = &pretty_date;		# like "20 September 1993"
  882: 
  883: sub pretty_date {
  884:     local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
  885: 
  886:     ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
  887:     $year += ($year < 70) ? 2000 : 1900;
  888:     # obachman: Let's do it as the Americans do
  889:     return($MONTH_NAMES->{$T2H_LANG}[$mon] . ", " . $mday . " " . $year);
  890: }
  891: 
  892: 
  893: ###################################################################
  894: # Layout of standard header and footer
  895: #
  896: 
  897: # Set the default body text, inserted between <BODY ... > 
  898: ###$T2H_BODYTEXT = 'LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"';
  899: $T2H_BODYTEXT = 'LANG="' . $T2H_LANG . '" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"';
  900: # text inserted after <BODY ...>
  901: $T2H_AFTER_BODY_OPEN = '';
  902: #text inserted before </BODY>
  903: $T2H_PRE_BODY_CLOSE = '';
  904: # this is used in footer
  905: $T2H_ADDRESS = "by <I>$T2H_USER</I> " if $T2H_USER;
  906: $T2H_ADDRESS .= "on <I>$T2H_TODAY</I>";
  907: # this is added inside <HEAD></HEAD> after <TITLE> and some META NAME stuff
  908: # can be used for <style> <script>, <meta> tags
  909: $T2H_EXTRA_HEAD = '';
  910: 
  911: sub T2H_DEFAULT_print_page_head
  912: {
  913:   my $fh = shift; 
  914:   my $longtitle = "$T2H_THISDOC{title}: $T2H_NAME{This}";
  915:   print $fh <<EOT;
  916: <HTML>
  917: $T2H_DOCTYPE
  918: <!-- Created on $T2H_TODAY by $THISPROG -->
  919: <!-- 
  920: $T2H_AUTHORS 
  921: -->
  922: <HEAD>
  923: <TITLE>$longtitle</TITLE>
  924: 
  925: <META NAME="description" CONTENT="$longtitle">
  926: <META NAME="keywords" CONTENT="$longtitle">
  927: <META NAME="resource-type" CONTENT="document">
  928: <META NAME="distribution" CONTENT="global">
  929: <META NAME="Generator" CONTENT="$THISPROG">
  930: $T2H_EXTRA_HEAD
  931: </HEAD>
  932: 
  933: <BODY $T2H_BODYTEXT>
  934: $T2H_AFTER_BODY_OPEN
  935: EOT
  936: }
  937: 
  938: sub T2H_DEFAULT_print_page_foot
  939: {
  940:   my $fh = shift;
  941:   print $fh <<EOT;
  942: <BR>  
  943: <FONT SIZE="-1">
  944: This document was generated
  945: $T2H_ADDRESS
  946: using <A HREF="$T2H_HOMEPAGE"><I>texi2html</I></A>
  947: $T2H_PRE_BODY_CLOSE
  948: </BODY>
  949: </HTML>
  950: EOT
  951: }
  952: 
  953: ###################################################################
  954: # Layout of navigation panel
  955: 
  956: # if this is set, then a vertical navigation panel is used
  957: $T2H_VERTICAL_HEAD_NAVIGATION = 0;
  958: sub T2H_DEFAULT_print_head_navigation
  959: {
  960:   my $fh = shift;
  961:   if ($T2H_VERTICAL_HEAD_NAVIGATION)
  962:   {
  963:     print $fh <<EOT;
  964: <TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
  965: <TR VALIGN="TOP">
  966: <TD ALIGN="LEFT">
  967: EOT
  968:   }
  969:   &$T2H_print_navigation($fh, $T2H_VERTICAL_HEAD_NAVIGATION);
  970:   if ($T2H_VERTICAL_HEAD_NAVIGATION)
  971:   {
  972:     print $fh <<EOT;
  973: </TD>
  974: <TD ALIGN="LEFT">
  975: EOT
  976:   }
  977:   elsif ($T2H_SPLIT eq 'section')
  978:   {
  979:     print $fh "<HR SIZE=1>\n";
  980:   }
  981: }
  982: 
  983: # Specifies the minimum page length required before a navigation panel
  984: # is placed at the bottom of a page (the default is that of latex2html)
  985: # T2H_THIS_WORDS_IN_PAGE holds number of words of current page
  986: $T2H_WORDS_IN_PAGE = 300;
  987: sub T2H_DEFAULT_print_foot_navigation
  988: {
  989:   my $fh = shift;
  990:   my $nwords = shift;
  991:   if ($T2H_VERTICAL_HEAD_NAVIGATION)
  992:   {
  993:     print $fh <<EOT;
  994: </TD>
  995: </TR>
  996: </TABLE>
  997: EOT
  998:   }
  999:   print $fh "<HR SIZE=1>\n";
 1000:   &$T2H_print_navigation($fh) if ($nwords >= $T2H_WORDS_IN_PAGE)
 1001: }
 1002: 
 1003: ######################################################################
 1004: # navigation panel
 1005: #
 1006: # specify in this array which "buttons" should appear in which order
 1007: # in the navigation panel for sections; use ' ' for empty buttons (space)
 1008: @T2H_SECTION_BUTTONS =
 1009:   (
 1010:    'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward',  
 1011:    ' ', ' ', ' ', ' ',
 1012:    'Top', 'Contents', 'Index', 'About', 
 1013:   );
 1014: 
 1015: # buttons for misc stuff
 1016: @T2H_MISC_BUTTONS = ('Top', 'Contents', 'Index', 'About');
 1017: 
 1018: # insert here name of icon images for buttons 
 1019: # Icons are used, if $T2H_ICONS and resp. value are set
 1020: %T2H_ACTIVE_ICONS =
 1021:   (
 1022:    'Top',      '',
 1023:    'Contents', '',
 1024:    'Overview', '',
 1025:    'Index',    '',
 1026:    'Back',     '',
 1027:    'FastBack', '',
 1028:    'Prev',     '',
 1029:    'Up',       '',
 1030:    'Next',     '',
 1031:    'Forward',  '',
 1032:    'FastForward', '',
 1033:    'About' ,    '',
 1034:    'First',    '',
 1035:    'Last',     '',
 1036:    ' ',        ''
 1037:   );
 1038: 
 1039: # insert here name of icon images for these, if button is inactive
 1040: %T2H_PASSIVE_ICONS =
 1041:   (
 1042:    'Top',      '',
 1043:    'Contents', '',
 1044:    'Overview', '',
 1045:    'Index',    '',
 1046:    'Back',     '',
 1047:    'FastBack', '',
 1048:    'Prev',     '',
 1049:    'Up',       '',
 1050:    'Next',     '',
 1051:    'Forward',  '',
 1052:    'FastForward', '',
 1053:    'About',     '',
 1054:    'First',    '',
 1055:    'Last',     '',
 1056:   );
 1057: 
 1058: # how to create IMG tag
 1059: sub T2H_DEFAULT_button_icon_img
 1060: {
 1061:   my $button = shift;
 1062:   my $icon = shift;
 1063:   my $name = shift;
 1064:   return qq{<IMG SRC="$icon" BORDER="0" ALT="$button: $name" ALIGN="MIDDLE">};
 1065: }
 1066: 
 1067: # Names of text as alternative for icons
 1068: %T2H_NAVIGATION_TEXT =
 1069:   (
 1070:    'Top',      'Top',
 1071:    'Contents', 'Contents',
 1072:    'Overview', 'Overview',
 1073:    'Index',    'Index',
 1074:    ' ',        ' &nbsp; ',
 1075:    'Back',     ' &lt; ',
 1076:    'FastBack', ' &lt;&lt; ',
 1077:    'Prev',     'Prev',
 1078:    'Up',       ' Up ',
 1079:    'Next',     'Next',
 1080:    'Forward',  ' &gt; ',
 1081:    'FastForward',  ' &gt;&gt; ',
 1082:    'About',     ' ? ',
 1083:    'First',    ' |&lt; ',
 1084:    'Last',     ' &gt;| '
 1085:   );
 1086: 
 1087: sub T2H_DEFAULT_print_navigation
 1088: {
 1089:   my $fh = shift;
 1090:   my $vertical = shift;
 1091:   my $spacing = 1;
 1092:   print $fh "<TABLE CELLPADDING=$spacing CELLSPACING=$spacing BORDER=0>\n";
 1093: 
 1094:   print $fh "<TR>" unless $vertical;
 1095:   for $button (@$T2H_BUTTONS)
 1096:   {
 1097:     print $fh qq{<TR VALIGN="TOP" ALIGN="LEFT">\n} if $vertical;
 1098:     print $fh qq{<TD VALIGN="MIDDLE" ALIGN="LEFT">};
 1099: 
 1100:     if (ref($button) eq 'CODE')
 1101:     {
 1102:       &$button($fh, $vertical);
 1103:     }
 1104:     elsif ($button eq ' ')
 1105:     { # handle space button
 1106:       print $fh 
 1107: 	$T2H_ICONS && $T2H_ACTIVE_ICONS{' '} ? 
 1108: 	 &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{' '}) :
 1109: 	 $T2H_NAVIGATION_TEXT{' '};
 1110:       next;
 1111:     }
 1112:     elsif ($T2H_HREF{$button})
 1113:     { # button is active
 1114:       print $fh   
 1115: 	 $T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? # use icon ? 
 1116: 	   t2h_anchor('', $T2H_HREF{$button},  # yes
 1117: 		    &$T2H_button_icon_img($button,
 1118: 					$T2H_ACTIVE_ICONS{$button},
 1119: 					$T2H_NAME{$button})) 
 1120: 	 : # use text
 1121: 	 "[" . 
 1122: 	 t2h_anchor('', $T2H_HREF{$button}, $T2H_NAVIGATION_TEXT{$button}) .
 1123: 	 "]";  
 1124:     }
 1125:     else
 1126:     { # button is passive 
 1127:       print $fh 
 1128: 	$T2H_ICONS && $T2H_PASSIVE_ICONS{$button} ?
 1129: 	 &$T2H_button_icon_img($button,
 1130: 			       $T2H_PASSIVE_ICONS{$button},
 1131: 			       $T2H_NAME{$button}) :
 1132: 	 
 1133: 	 "[" . $T2H_NAVIGATION_TEXT{$button} . "]";
 1134:     }
 1135:     print $fh "</TD>\n";
 1136:     print $fh "</TR>\n" if $vertical;
 1137:   }
 1138:   print $fh "</TR>" unless $vertical;
 1139:   print $fh "</TABLE>\n";
 1140: }
 1141: 
 1142: ######################################################################
 1143: # Frames: this is from "Richard Y. Kim" <ryk@coho.net>
 1144: # Should be improved to be more conforming to other _print* functions
 1145: 
 1146: sub T2H_DEFAULT_print_frame
 1147: {
 1148:   my $fh = shift;
 1149:   print $fh <<EOT;
 1150: <HTML>
 1151: <HEAD><TITLE>$T2H_THISDOC{title}</TITLE></HEAD>
 1152: <FRAMESET cols="140,*"> 
 1153:   <FRAME name=toc  src="$docu_toc_frame_file">
 1154:   <FRAME name=main src="$docu_doc">
 1155: </FRAMESET> 
 1156: </HTML>
 1157: EOT
 1158: }
 1159: 
 1160: sub T2H_DEFAULT_print_toc_frame
 1161: {
 1162:   my $fh = shift;
 1163:   &$T2H_print_page_head($fh);
 1164:   print $fh <<EOT;
 1165: <H2>Content</H2>
 1166: EOT
 1167:   print $fh map {s/HREF=/target=\"main\" HREF=/; $_;} @stoc_lines;
 1168:   print $fh "</BODY></HTML>\n";
 1169: }
 1170: 
 1171: ######################################################################
 1172: # About page
 1173: #
 1174: 
 1175: # T2H_PRE_ABOUT might be a function
 1176: $T2H_PRE_ABOUT = <<EOT;
 1177: This document was generated $T2H_ADDRESS
 1178: using <A HREF="$T2H_HOMEPAGE"><I>texi2html</I></A>
 1179: <P></P>  
 1180: EOT
 1181: $T2H_AFTER_ABOUT = '';
 1182: 
 1183: sub T2H_DEFAULT_about_body
 1184: {
 1185:   my $about;
 1186:   if (ref($T2H_PRE_ABOUT) eq 'CODE')
 1187:   {
 1188:     $about = &$T2H_PRE_ABOUT();
 1189:   }
 1190:   else
 1191:   {
 1192:     $about = $T2H_PRE_ABOUT;
 1193:   }
 1194:   $about .= <<EOT;
 1195: The buttons in the navigation panels have the following meaning:
 1196: <P></P>
 1197: <table border = "1">
 1198: <TR>
 1199: <TH> Button </TH>
 1200: <TH> Name </TH>
 1201: <TH> Go to </TH>
 1202: <TH> From 1.2.3 go to</TH>
 1203: </TR>
 1204: EOT
 1205:   
 1206:   for $button (@T2H_SECTION_BUTTONS)
 1207:   {
 1208:     next if $button eq ' ' || ref($button) eq 'CODE';
 1209:     $about .= <<EOT;
 1210: <TR>
 1211: <TD ALIGN="CENTER">
 1212: EOT
 1213:     $about .= 	
 1214:       ($T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ?
 1215:        &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{$button}) :
 1216:        " [" . $T2H_NAVIGATION_TEXT{$button} . "] ");
 1217:     $about .= <<EOT;
 1218: </TD>
 1219: <TD ALIGN="CENTER">
 1220: $button
 1221: </TD>
 1222: <TD>
 1223: $T2H_BUTTONS_GOTO{$button}
 1224: </TD>
 1225: <TD>
 1226: $T2H_BUTTONS_EXAMPLE{$button}
 1227: </TD>
 1228: </TR>
 1229: EOT
 1230:   }
 1231: 
 1232:   $about .= <<EOT;
 1233: </TABLE>
 1234: <P></P>
 1235: where the <STRONG> Example </STRONG> assumes that the current position 
 1236: is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of 
 1237: the following structure:
 1238: <UL>
 1239: <LI> 1. Section One  </LI>
 1240: <UL>
 1241: <LI>1.1 Subsection One-One</LI>
 1242: <UL>
 1243: <LI> ... </LI>
 1244: </UL>
 1245: <LI>1.2 Subsection One-Two</LI>
 1246: <UL>
 1247: <LI>1.2.1 Subsubsection One-Two-One
 1248: </LI><LI>1.2.2 Subsubsection One-Two-Two
 1249: </LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
 1250: &lt;== Current Position </STRONG>
 1251: </LI><LI>1.2.4 Subsubsection One-Two-Four
 1252: </LI></UL>
 1253: <LI>1.3 Subsection One-Three</LI>
 1254: <UL>
 1255: <LI> ... </LI>
 1256: </UL>
 1257: <LI>1.4 Subsection One-Four</LI>
 1258: </UL>
 1259: </UL>
 1260: $T2H_AFTER_ABOUT
 1261: EOT
 1262:   return $about;  
 1263: }
 1264: 
 1265:   
 1266: %T2H_BUTTONS_GOTO =
 1267:   (
 1268:    'Top',      'cover (top) of document',
 1269:    'Contents', 'table of contents',
 1270:    'Overview', 'short table of contents',
 1271:    'Index',    'concept index',
 1272:    'Back',     'previous section in reading order',
 1273:    'FastBack', 'previous or up-and-previous section ',
 1274:    'Prev',     'previous section same level',
 1275:    'Up',       'up section',
 1276:    'Next',     'next section same level',
 1277:    'Forward',  'next section in reading order',
 1278:    'FastForward', 'next or up-and-next section',
 1279:    'About' ,    'this page',
 1280:    'First',    'first section in reading order',
 1281:    'Last',     'last section in reading order',
 1282:   );
 1283: 
 1284: %T2H_BUTTONS_EXAMPLE = 
 1285: (
 1286:    'Top',      ' &nbsp; ',
 1287:    'Contents', ' &nbsp; ',
 1288:    'Overview', ' &nbsp; ',
 1289:    'Index',    ' &nbsp; ',
 1290:    'Back',     '1.2.2',
 1291:    'FastBack', '1.1',
 1292:    'Prev',     '1.2.2',
 1293:    'Up',       '1.2',
 1294:    'Next',     '1.2.4',
 1295:    'Forward',  '1.2.4',
 1296:    'FastForward', '1.3',
 1297:    'About',     ' &nbsp; ',
 1298:    'First',    '1.',
 1299:    'Last',     '1.2.4',
 1300: );
 1301: 
 1302: 
 1303: ######################################################################
 1304: # from here on, its l2h init stuff 
 1305: #
 1306: 
 1307: ## initialization for latex2html as for Singular manual generation
 1308: ## obachman 3/99
 1309: 
 1310: #
 1311: # Options controlling Titles, File-Names, Tracing and Sectioning
 1312: #
 1313: $TITLE = '';
 1314: 
 1315: $SHORTEXTN = 0;
 1316: 
 1317: $LONG_TITLES = 0;
 1318: 
 1319: $DESTDIR = ''; # should be overwritten by cmd-line argument
 1320: 
 1321: $NO_SUBDIR = 0;# should be overwritten by cmd-line argument
 1322: 
 1323: $PREFIX = '';  # should be overwritten by cmd-line argument
 1324: 
 1325: $AUTO_PREFIX = 0; # this is needed, so that prefix settings are used
 1326: 
 1327: $AUTO_LINK = 0; 
 1328: 
 1329: $SPLIT = 0;
 1330: 
 1331: $MAX_LINK_DEPTH = 0;
 1332: 
 1333: $TMP = ''; # should be overwritten by cmd-line argument
 1334: 
 1335: $DEBUG = 0;
 1336: 
 1337: $VERBOSE = 1;
 1338: 
 1339: #
 1340: # Options controlling Extensions and Special Features 
 1341: #
 1342: $HTML_VERSION = "3.2";
 1343: 
 1344: $TEXDEFS = 1; # we absolutely need that
 1345: 
 1346: $EXTERNAL_FILE = '';
 1347: 
 1348: $SCALABLE_FONTS = 1;
 1349: 
 1350: $NO_SIMPLE_MATH = 1;
 1351: 
 1352: $LOCAL_ICONS = 1;
 1353: 
 1354: $SHORT_INDEX = 0;
 1355: 
 1356: $NO_FOOTNODE = 1;
 1357: 
 1358: $ADDRESS = '';
 1359: 
 1360: $INFO = '';
 1361: 
 1362: #
 1363: # Switches controlling Image Generation 
 1364: #
 1365: $ASCII_MODE = 0;
 1366: 
 1367: $NOLATEX = 0;
 1368: 
 1369: $EXTERNAL_IMAGES = 0;
 1370: 
 1371: $PS_IMAGES = 0;
 1372: 
 1373: $NO_IMAGES = 0;
 1374: 
 1375: $IMAGES_ONLY = 0;
 1376: 
 1377: $REUSE = 2;
 1378: 
 1379: $ANTI_ALIAS = 1;
 1380: 
 1381: $ANTI_ALIAS_TEXT = 1;
 1382: 
 1383: #
 1384: #Switches controlling Navigation Panels
 1385: #
 1386: $NO_NAVIGATION = 1;
 1387: $ADDRESS = '';
 1388: $INFO = 0;              # 0 = do not make a "About this document..." section 
 1389: 
 1390: #
 1391: #Switches for Linking to other documents 
 1392: #
 1393: # actuall -- we don't care
 1394: 
 1395: $MAX_SPLIT_DEPTH = 0;	# Stop making separate files at this depth
 1396: 
 1397: $MAX_LINK_DEPTH = 0;    # Stop showing child nodes at this depth   
 1398: 
 1399: $NOLATEX = 0;           # 1 = do not pass unknown environments to Latex
 1400: 
 1401: $EXTERNAL_IMAGES = 0;   # 1 = leave the images outside the document 
 1402: 
 1403: $ASCII_MODE = 0;        # 1 = do not use any icons or internal images
 1404: 
 1405: # 1 =  use links to external postscript images rather than inlined bitmap
 1406: # images.
 1407: $PS_IMAGES = 0;
 1408: $SHOW_SECTION_NUMBERS = 0;
 1409: 
 1410: ### Other global variables ###############################################
 1411: $CHILDLINE = "";
 1412: 
 1413: # This is the line width measured in pixels and it is used to right justify
 1414: # equations and equation arrays; 
 1415: $LINE_WIDTH = 500;		
 1416: 
 1417: # Used in conjunction with AUTO_NAVIGATION
 1418: $WORDS_IN_PAGE = 300;	
 1419: 
 1420: # Affects ONLY the way accents are processed 
 1421: $default_language = 'english';	
 1422: 
 1423: # The value of this variable determines how many words to use in each 
 1424: # title that is added to the navigation panel (see below)
 1425: # 
 1426: $WORDS_IN_NAVIGATION_PANEL_TITLES = 0;
 1427: 
 1428: # This number will determine the size of the equations, special characters,
 1429: # and anything which will be converted into an inlined image
 1430: # *except* "image generating environments" such as "figure", "table" 
 1431: # or "minipage".
 1432: # Effective values are those greater than 0.
 1433: # Sensible values are between 0.1 - 4.
 1434: $MATH_SCALE_FACTOR = 1.5;
 1435: 
 1436: # This number will determine the size of 
 1437: # image generating environments such as "figure", "table" or "minipage".
 1438: # Effective values are those greater than 0.
 1439: # Sensible values are between 0.1 - 4.
 1440: $FIGURE_SCALE_FACTOR = 1.6;
 1441: 
 1442: 
 1443: #  If both of the following two variables are set then the "Up" button
 1444: #  of the navigation panel in the first node/page of a converted document
 1445: #  will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set
 1446: #  to some text which describes this external link.
 1447: $EXTERNAL_UP_LINK = "";
 1448: $EXTERNAL_UP_TITLE = "";
 1449: 
 1450: # If this is set then the resulting HTML will look marginally better if viewed 
 1451: # with Netscape.
 1452: $NETSCAPE_HTML = 1;
 1453: 
 1454: # Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0"
 1455: # Paper sizes has no effect other than in the time it takes to create inlined
 1456: # images and in whether large images can be created at all ie
 1457: #  - larger paper sizes *MAY* help with large image problems 
 1458: #  - smaller paper sizes are quicker to handle
 1459: $PAPERSIZE = "a4";
 1460: 
 1461: # Replace "english" with another language in order to tell LaTeX2HTML that you 
 1462: # want some generated section titles (eg "Table of Contents" or "References")
 1463: # to appear in a different language. Currently only "english" and "french"
 1464: # is supported but it is very easy to add your own. See the example in the
 1465: # file "latex2html.config" 
 1466: $TITLES_LANGUAGE = "english";
 1467: 
 1468: 1;	# This must be the last non-comment line
 1469: 
 1470: # End File texi2html.init
 1471: ######################################################################
 1472: 
 1473: 
 1474: require "$ENV{T2H_HOME}/texi2html.init" 
 1475:   if ($0 =~ /\.pl$/ &&
 1476:       -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init");
 1477: 
 1478: #+++############################################################################
 1479: #                                                                              #
 1480: # Initialization                                                               #
 1481: # Pasted content of File $(srcdir)/MySimple.pm: Command-line processing        #
 1482: #                                                                              #
 1483: #---############################################################################
 1484: 
 1485: # leave this within comments, and keep the require statement
 1486: # This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
 1487: # exists.
 1488: 
 1489: # 
 1490: package Getopt::MySimple;
 1491: 
 1492: # Name:
 1493: #	Getopt::MySimple.
 1494: #
 1495: # Documentation:
 1496: #	POD-style (incomplete) documentation is in file MySimple.pod
 1497: #
 1498: # Tabs:
 1499: #	4 spaces || die.
 1500: #
 1501: # Author:
 1502: #	Ron Savage	rpsavage@ozemail.com.au.
 1503: #	1.00	19-Aug-97	Initial version.
 1504: #	1.10	13-Oct-97	Add arrays of switches (eg '=s@').
 1505: #	1.20	 3-Dec-97	Add 'Help' on a per-switch basis.
 1506: #	1.30	11-Dec-97	Change 'Help' to 'verbose'. Make all hash keys lowercase.
 1507: #	1.40	10-Nov-98	Change width of help report. Restructure tests.
 1508: #               1-Jul-00        Modifications for Texi2html
 1509: 
 1510: # --------------------------------------------------------------------------
 1511: # Locally modified by obachman (Display type instead of env, order by cmp)
 1512: # $Id: texi2html,v 1.1.1.1 2014/07/30 08:16:46 misho Exp $
 1513: 
 1514: # use strict;
 1515: # no strict 'refs';
 1516: 
 1517: use vars qw(@EXPORT @EXPORT_OK @ISA);
 1518: use vars qw($fieldWidth $opt $VERSION);
 1519: 
 1520: use Exporter();
 1521: use Getopt::Long;
 1522: 
 1523: @ISA		= qw(Exporter);
 1524: @EXPORT		= qw();
 1525: @EXPORT_OK	= qw($opt);	# An alias for $self -> {'opt'}.
 1526: 
 1527: # --------------------------------------------------------------------------
 1528: 
 1529: $fieldWidth	= 20;
 1530: $VERSION	= '1.41';
 1531: 
 1532: # --------------------------------------------------------------------------
 1533: 
 1534: sub byOrder
 1535: {
 1536: 	my($self) = @_;
 1537: 	
 1538: 	return uc($a) cmp (uc($b));
 1539: }
 1540: 
 1541: # --------------------------------------------------------------------------
 1542: 
 1543: sub dumpOptions
 1544: {
 1545: 	my($self) = @_;
 1546: 
 1547: 	print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n";
 1548: 
 1549: 	for (sort byOrder keys(%{$self -> {'opt'} }) )
 1550: 	{
 1551: 	  print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n";
 1552: 	}
 1553: 
 1554: 	print "\n";
 1555: 
 1556: }	# End of dumpOptions.
 1557: 
 1558: # --------------------------------------------------------------------------
 1559: # Return:
 1560: #	0 -> Error.
 1561: #	1 -> Ok.
 1562: 
 1563: sub getOptions
 1564: {
 1565: 	push(@_, 0) if ($#_ == 2);	# Default for $ignoreCase is 0.
 1566: 	push(@_, 1) if ($#_ == 3);	# Default for $helpThenExit is 1.
 1567: 
 1568: 	my($self, $default, $helpText, $versionText, 
 1569: 	   $helpThenExit, $versionThenExit, $ignoreCase) = @_;
 1570: 	
 1571: 	$helpThenExit = 1 unless (defined($helpThenExit));
 1572: 	$versionThenExit = 1 unless (defined($versionThenExit));
 1573: 	$ignoreCase = 0 unless (defined($ignoreCase));
 1574: 
 1575: 	$self -> {'default'}		= $default;
 1576: 	$self -> {'helpText'}		= $helpText;
 1577: 	$self -> {'versionText'}        = $versionText;
 1578: 	$Getopt::Long::ignorecase	= $ignoreCase;
 1579: 
 1580: 	unless (defined($self -> {'default'}{'help'}))
 1581: 	{
 1582: 	  $self -> {'default'}{'help'} = 
 1583: 	  { 
 1584: 	   type => ':i', 
 1585: 	   default => '',
 1586: 	   linkage => sub {$self->helpOptions($_[1]); exit (0) if $helpThenExit;},
 1587: 	   verbose => "print help and exit"
 1588: 	  };
 1589: 	}
 1590: 
 1591: 	unless (defined($self -> {'default'}{'version'}))
 1592: 	{
 1593: 	  $self -> {'default'}{'version'} = 
 1594: 	  { 
 1595: 	   type => '', 
 1596: 	   default => '',
 1597: 	   linkage => sub {print $self->{'versionText'};  exit (0) if versionTheExit;},
 1598: 	   verbose => "print version and exit"
 1599: 	  };
 1600: 	}
 1601: 
 1602: 	for (keys(%{$self -> {'default'} }) )
 1603: 	{
 1604: 	  my $type = ${$self -> {'default'} }{$_}{'type'};
 1605: 	  push(@{$self -> {'type'} }, "$_$type");
 1606: 	  $self->{'opt'}->{$_} =  ${$self -> {'default'} }{$_}{'linkage'}
 1607:             if ${$self -> {'default'} }{$_}{'linkage'};
 1608: 	}
 1609: 
 1610: 	my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} });
 1611: 
 1612:         return $result unless $result;
 1613: 
 1614: 	for (keys(%{$self -> {'default'} }) )
 1615: 	{
 1616:  	   if (! defined(${$self -> {'opt'} }{$_})) #{
 1617:             {
 1618:  	     ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'};
 1619:             }
 1620: 	}
 1621: 
 1622: 	$result;
 1623: }	# End of getOptions.
 1624: 
 1625: # --------------------------------------------------------------------------
 1626: 
 1627: sub helpOptions
 1628: {
 1629: 	my($self) = shift;
 1630: 	my($noHelp) = shift;
 1631: 	$noHelp = 0 unless $noHelp;
 1632: 	my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth) 
 1633: 	  = (10, 5, 9, 78, 4, 11);
 1634: 
 1635: 	print "$self->{'helpText'}" if ($self -> {'helpText'});
 1636: 
 1637: 	print ' Option', ' ' x ($optwidth - length('Option') -1 ),
 1638: 		'Type', ' ' x ($typewidth - length('Type') + 1),
 1639: 		'Default', ' ' x ($defaultwidth - length('Default') ),
 1640: 	        "Description\n";
 1641: 
 1642: 	for (sort byOrder keys(%{$self -> {'default'} }) )
 1643: 	{
 1644: 	  my($line, $help, $option, $val);
 1645: 	  $option = $_;
 1646: 	  next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp;
 1647: 		$line = " -$_ " . ' ' x ($optwidth - (2 + length) ) .
 1648: 			"${$self->{'default'} }{$_}{'type'} ".
 1649: 			' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) ));
 1650: 
 1651:                  $val = ${$self->{'default'} }{$_}{'linkage'};
 1652:                 if ($val)
 1653:                 {
 1654:                   if (ref($val) eq 'SCALAR')
 1655: 		  {
 1656: 		    $val = $$val; 
 1657: 		  }
 1658: 		  else
 1659: 		  {
 1660: 		    $val = '';
 1661: 		  }
 1662:                 }
 1663: 		else
 1664: 		{
 1665: 		  $val = ${$self->{'default'} }{$_}{'default'};
 1666: 		}
 1667: 	        $line .= "$val  ";
 1668: 		$line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line));
 1669: 		
 1670: 		if (defined(${$self -> {'default'} }{$_}{'verbose'}) &&
 1671: 		  ${$self -> {'default'} }{$_}{'verbose'} ne '')
 1672: 	      {
 1673: 		$help = "${$self->{'default'} }{$_}{'verbose'}";
 1674: 	      }
 1675: 	      else
 1676: 	      {
 1677: 		$help = ' ';
 1678: 	      }
 1679: 	      if ((length("$line") + length($help)) < $maxlinewidth)
 1680: 	      {
 1681: 		print $line , $help, "\n";
 1682: 	      }
 1683: 	      else
 1684: 	      {
 1685: 		print $line, "\n", ' ' x $valind, $help, "\n";
 1686: 	      }
 1687: 	      for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}}))
 1688: 	      {
 1689: 	        print ' ' x ($valind + 2);
 1690: 	        print $val, '  ', ' ' x ($valwidth - length($val) - 2);
 1691: 	        print ${$self->{'default'}}{$option}{'values'}{$val}, "\n";
 1692: 	      }
 1693: 	}
 1694: 
 1695: 	print <<EOT;
 1696: Note: 'Options' may be abbreviated. 'Type' specifications mean:
 1697:  <none>| !    no argument: variable is set to 1 on -foo (or, to 0 on -nofoo)
 1698:     =s | :s   mandatory (or, optional)  string argument
 1699:     =i | :i   mandatory (or, optional)  integer argument
 1700: EOT
 1701: }	# End of helpOptions.
 1702: 
 1703: #-------------------------------------------------------------------
 1704: 
 1705: sub new
 1706: {
 1707: 	my($class)				= @_;
 1708: 	my($self)				= {};
 1709: 	$self -> {'default'}	= {};
 1710: 	$self -> {'helpText'}	= '';
 1711: 	$self -> {'opt'}		= {};
 1712: 	$opt					= $self -> {'opt'};	 # An alias for $self -> {'opt'}.
 1713: 	$self -> {'type'}		= ();
 1714: 
 1715: 	return bless $self, $class;
 1716: 
 1717: }	# End of new.
 1718: 
 1719: # --------------------------------------------------------------------------
 1720: 
 1721: 1;
 1722: 
 1723: # End MySimple.pm
 1724: 
 1725: require "$ENV{T2H_HOME}/MySimple.pm" 
 1726:   if ($0 =~ /\.pl$/ &&
 1727:       -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init");
 1728: 
 1729: package main;
 1730: 
 1731: #+++############################################################################
 1732: #                                                                              #
 1733: # Constants                                                                    #
 1734: #                                                                              #
 1735: #---############################################################################
 1736: 
 1737: $DEBUG_TOC   =  1;
 1738: $DEBUG_INDEX =  2;
 1739: $DEBUG_BIB   =  4;
 1740: $DEBUG_GLOSS =  8;
 1741: $DEBUG_DEF   = 16;
 1742: $DEBUG_HTML  = 32;
 1743: $DEBUG_USER  = 64;
 1744: $DEBUG_L2H   = 128;
 1745: 
 1746: 
 1747: $BIBRE = '\[[\w\/-]+\]';		# RE for a bibliography reference
 1748: $FILERE = '[\/\w.+-]+';			# RE for a file name
 1749: $VARRE = '[^\s\{\}]+';			# RE for a variable name
 1750: $NODERE = '[^,:]+';		        # RE for a node name
 1751: $NODESRE = '[^:]+';		        # RE for a list of node names
 1752: 
 1753: $ERROR = "***";			        # prefix for errors 
 1754: $WARN  = "**";                          # prefix for warnings
 1755:   
 1756:                                         # program home page
 1757: $PROTECTTAG = "_ThisIsProtected_";	# tag to recognize protected sections
 1758: 
 1759: $CHAPTEREND = "<!-- End chapter -->\n"; # to know where a chpater ends
 1760: $SECTIONEND = "<!-- End section -->\n"; # to know where section ends
 1761: $TOPEND     = "<!-- End top     -->\n"; # to know where top ends
 1762: 
 1763:   
 1764: 
 1765: #
 1766: # pre-defined indices
 1767: #
 1768: $index_properties =
 1769: {
 1770:  'c' => { name => 'cp'},
 1771:  'f' => { name => 'fn', code => 1},
 1772:  'v' => { name => 'vr', code => 1},
 1773:  'k' => { name => 'ky', code => 1},
 1774:  'p' => { name => 'pg', code => 1},
 1775:  't' => { name => 'tp', code => 1}
 1776: };
 1777: 
 1778: 
 1779: %predefined_index = (
 1780: 		    'cp', 'c',
 1781: 		    'fn', 'f',
 1782: 		    'vr', 'v',
 1783: 		    'ky', 'k',
 1784: 		    'pg', 'p',
 1785: 		    'tp', 't',
 1786: 	            );
 1787: 
 1788: #
 1789: # valid indices
 1790: #
 1791: %valid_index = (
 1792: 		    'c', 1,
 1793: 		    'f', 1,
 1794: 		    'v', 1,
 1795: 		    'k', 1,
 1796: 		    'p', 1,
 1797: 		    't', 1,
 1798: 		);
 1799: 
 1800: #
 1801: # texinfo section names to level
 1802: #
 1803: %sec2level = (
 1804: 	      'top', 0,
 1805: 	      'chapter', 1,
 1806: 	      'unnumbered', 1,
 1807: 	      'majorheading', 1,
 1808: 	      'chapheading', 1,
 1809: 	      'appendix', 1,
 1810: 	      'section', 2,
 1811: 	      'unnumberedsec', 2,
 1812: 	      'heading', 2,
 1813: 	      'appendixsec', 2,
 1814: 	      'appendixsection', 2,
 1815: 	      'subsection', 3,
 1816: 	      'unnumberedsubsec', 3,
 1817: 	      'subheading', 3,
 1818: 	      'appendixsubsec', 3,
 1819: 	      'subsubsection', 4,
 1820: 	      'unnumberedsubsubsec', 4,
 1821: 	      'subsubheading', 4,
 1822: 	      'appendixsubsubsec', 4,
 1823: 	      );
 1824: 
 1825: #
 1826: # accent map, TeX command to ISO name
 1827: #
 1828: %accent_map = (
 1829: 	       '"',  'uml',
 1830: 	       '~',  'tilde',
 1831: 	       '^',  'circ',
 1832: 	       '`',  'grave',
 1833: 	       '\'', 'acute',
 1834: 	       );
 1835: 
 1836: #
 1837: # texinfo "simple things" (@foo) to HTML ones
 1838: #
 1839: %simple_map = (
 1840: 	       # cf. makeinfo.c
 1841: 	       "*", "<BR>",		# HTML+
 1842: 	       " ", " ",
 1843: 	       "\t", " ",
 1844:   	       "-", "&#173;",	# soft hyphen
 1845: 	       "\n", "\n",
 1846: 	       "|", "",
 1847: 	       'tab', '<\/TD><TD>',
 1848: 	       # spacing commands
 1849: 	       ":", "",
 1850: 	       "!", "!",
 1851: 	       "?", "?",
 1852: 	       ".", ".",
 1853: 	       "-", "",
 1854: 	       );
 1855: 
 1856: #
 1857: # texinfo "things" (@foo{}) to HTML ones
 1858: #
 1859: %things_map = (
 1860: 	       'TeX', 'TeX',
 1861: 	       'br', '<P>',		# paragraph break
 1862: 	       'bullet', '*',
 1863: 	       'copyright', '(C)',
 1864: 	       'dots', '<small>...<\/small>',
 1865: 	       'enddots', '<small>....<\/small>',
 1866: 	       'equiv', '==',
 1867: 	       'error', 'error-->',
 1868: 	       'expansion', '==>',
 1869: 	       'minus', '-',
 1870: 	       'point', '-!-',
 1871: 	       'print', '-|',
 1872: 	       'result', '=>',
 1873: 	       'today', $T2H_TODAY,
 1874: 	       'aa', '&aring;',
 1875: 	       'AA', '&Aring;',
 1876: 	       'ae', '&aelig;',
 1877: 	       'oe', '&#156;',
 1878: 	       'AE', '&AElig;',
 1879: 	       'OE', '&#140;',
 1880: 	       'o',  '&oslash;',
 1881: 	       'O',  '&Oslash;',
 1882: 	       'ss', '&szlig;',
 1883: 	       'l', '\/l',
 1884: 	       'L', '\/L',
 1885: 	       'exclamdown', '&iexcl;',
 1886: 	       'questiondown', '&iquest;',
 1887: 	       'pounds', '&pound;'
 1888: 	       );
 1889: 
 1890: #
 1891: # texinfo styles (@foo{bar}) to HTML ones
 1892: #
 1893: %style_map = (
 1894: 	      'acronym', '&do_acronym',
 1895: 	      'asis', '',
 1896: 	      'b', 'B',
 1897: 	      'cite', 'CITE',
 1898: 	      'code', 'CODE',
 1899: 	      'command', 'CODE',
 1900: 	      'ctrl', '&do_ctrl',	# special case
 1901: 	      'dfn', 'EM',		# DFN tag is illegal in the standard
 1902: 	      'dmn', '',		# useless
 1903: 	      'email', '&do_email',     # insert a clickable email address
 1904: 	      'emph', 'EM',
 1905: 	      'env', 'CODE',
 1906: 	      'file', '"TT',		# will put quotes, cf. &apply_style
 1907: 	      'i', 'I',
 1908: 	      'kbd', 'KBD',
 1909: 	      'key', 'KBD',
 1910: 	      'math', '&do_math',
 1911: 	      'option', '"SAMP',        # will put quotes, cf. &apply_style
 1912: 	      'r', '',			# unsupported
 1913: 	      'samp', '"SAMP',		# will put quotes, cf. &apply_style
 1914: 	      'sc', '&do_sc',		# special case
 1915: 	      'strong', 'STRONG',
 1916: 	      't', 'TT',
 1917: 	      'titlefont', '',		# useless
 1918: 	      'uref', '&do_uref',       # insert a clickable URL
 1919: 	      'url', '&do_url',         # insert a clickable URL
 1920: 	      'var', 'VAR',
 1921: 	      'w', '',			# unsupported
 1922: 	      'H', '&do_accent',
 1923: 	      'dotaccent', '&do_accent',
 1924: 	      'ringaccent','&do_accent',
 1925: 	      'tieaccent', '&do_accent',
 1926: 	      'u','&do_accent',
 1927: 	      'ubaraccent','&do_accent',
 1928: 	      'udotaccent','&do_accent',
 1929: 	      'v', '&do_accent',
 1930: 	      ',', '&do_accent',
 1931: 	      'dotless', '&do_accent'
 1932: 	      );
 1933: 
 1934: #
 1935: # texinfo format (@foo/@end foo) to HTML ones
 1936: #
 1937: %format_map = (
 1938: 	       'quotation', 'BLOCKQUOTE',
 1939: 	       # lists
 1940: 	       'itemize', 'UL',
 1941: 	       'enumerate', 'OL',
 1942: 	       # poorly supported
 1943: 	       'flushleft', 'PRE',
 1944: 	       'flushright', 'PRE',
 1945: 	       );
 1946: 
 1947: #
 1948: # an eval of these $complex_format_map->{what}->[0] yields beginning
 1949: # an eval of these $complex_format_map->{what}->[1] yieleds end
 1950: $complex_format_map =
 1951: {
 1952:  example => 
 1953:  [
 1954:   q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=example><pre>"},
 1955:   q{'</pre></td></tr></table>'}
 1956:  ],
 1957:  smallexample => 
 1958:  [
 1959:   q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smallexample><FONT SIZE=$T2H_SMALL_FONT_SIZE><pre>"},
 1960:   q{'</FONT></pre></td></tr></table>'}
 1961:  ],
 1962:  display =>
 1963:  [
 1964:   q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=display><pre " . 'style="font-family: serif">'},
 1965:   q{'</pre></td></tr></table>'}
 1966:  ],
 1967:  smalldisplay =>
 1968:  [
 1969:   q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smalldisplay><FONT SIZE=$T2H_SMALL_FONT_SIZE><pre " . 'style="font-family: serif">'},
 1970:   q{'</pre></FONT></td></tr></table>'}
 1971:  ]
 1972: };
 1973: 
 1974: $complex_format_map->{lisp} = $complex_format_map->{example};
 1975: $complex_format_map->{smalllisp} = $complex_format_map->{smallexample};
 1976: $complex_format_map->{format} = $complex_format_map->{display};
 1977: $complex_format_map->{smallformat} = $complex_format_map->{smalldisplay};
 1978: 
 1979: #
 1980: # texinfo definition shortcuts to real ones
 1981: #
 1982: %def_map = (
 1983: 	    # basic commands
 1984: 	    'deffn', 0,
 1985: 	    'defvr', 0,
 1986: 	    'deftypefn', 0,
 1987: 	    'deftypevr', 0,
 1988: 	    'defcv', 0,
 1989: 	    'defop', 0,
 1990: 	    'deftp', 0,
 1991: 	    # basic x commands
 1992: 	    'deffnx', 0,
 1993: 	    'defvrx', 0,
 1994: 	    'deftypefnx', 0,
 1995: 	    'deftypevrx', 0,
 1996: 	    'defcvx', 0,
 1997: 	    'defopx', 0,
 1998: 	    'deftpx', 0,
 1999: 	    # shortcuts
 2000: 	    'defun', 'deffn Function',
 2001: 	    'defmac', 'deffn Macro',
 2002: 	    'defspec', 'deffn {Special Form}',
 2003: 	    'defvar', 'defvr Variable',
 2004: 	    'defopt', 'defvr {User Option}',
 2005: 	    'deftypefun', 'deftypefn Function',
 2006: 	    'deftypevar', 'deftypevr Variable',
 2007: 	    'defivar', 'defcv {Instance Variable}',
 2008: 	    'deftypeivar', 'defcv {Instance Variable}', # NEW: FIXME
 2009: 	    'defmethod', 'defop Method',
 2010: 	    'deftypemethod', 'defop Method', # NEW:FIXME
 2011: 	    # x shortcuts
 2012: 	    'defunx', 'deffnx Function',
 2013: 	    'defmacx', 'deffnx Macro',
 2014: 	    'defspecx', 'deffnx {Special Form}',
 2015: 	    'defvarx', 'defvrx Variable',
 2016: 	    'defoptx', 'defvrx {User Option}',
 2017: 	    'deftypefunx', 'deftypefnx Function',
 2018: 	    'deftypevarx', 'deftypevrx Variable',
 2019: 	    'defivarx', 'defcvx {Instance Variable}',
 2020: 	    'defmethodx', 'defopx Method',
 2021: 	    );
 2022: 
 2023: #
 2024: # things to skip
 2025: #
 2026: %to_skip = (
 2027: 	    # comments
 2028: 	    'c', 1,
 2029: 	    'comment', 1,
 2030:             'ifnotinfo', 1,
 2031:             'ifnottex', 1,
 2032: 	    'ifhtml', 1,
 2033: 	    'end ifhtml', 1,
 2034:             'end ifnotinfo', 1,
 2035:             'end ifnottex', 1,
 2036: 	    # useless
 2037: 	    'detailmenu', 1,
 2038:             'direntry', 1,
 2039: 	    'contents', 1,
 2040: 	    'shortcontents', 1,
 2041: 	    'summarycontents', 1,
 2042: 	    'footnotestyle', 1,
 2043: 	    'end ifclear', 1,
 2044: 	    'end ifset', 1,
 2045: 	    'titlepage', 1,
 2046: 	    'end titlepage', 1,
 2047: 	    # unsupported commands (formatting)
 2048: 	    'afourpaper', 1,
 2049: 	    'cropmarks', 1,
 2050: 	    'finalout', 1,
 2051: 	    'headings', 1,
 2052:             'sp', 1,
 2053: 	    'need', 1,
 2054: 	    'page', 1,
 2055: 	    'setchapternewpage', 1,
 2056: 	    'everyheading', 1,
 2057: 	    'everyfooting', 1,
 2058: 	    'evenheading', 1,
 2059: 	    'evenfooting', 1,
 2060: 	    'oddheading', 1,
 2061: 	    'oddfooting', 1,
 2062: 	    'smallbook', 1,
 2063: 	    'vskip', 1,
 2064: 	    'filbreak', 1,
 2065: 	    'paragraphindent', 1,
 2066: 	    # unsupported formats
 2067: 	    'cartouche', 1,
 2068: 	    'end cartouche', 1,
 2069: 	    'group', 1,
 2070: 	    'end group', 1,
 2071: 	    );
 2072: 
 2073: #+++############################################################################
 2074: #                                                                              #
 2075: # Argument parsing, initialisation                                             #
 2076: #                                                                              #
 2077: #---############################################################################
 2078: 
 2079: #
 2080: # flush stdout and stderr after every write
 2081: #
 2082: select(STDERR);
 2083: $| = 1;
 2084: select(STDOUT);
 2085: $| = 1;
 2086: 
 2087: 
 2088: %value = ();				# hold texinfo variables, see also -D
 2089: $use_bibliography = 1;
 2090: $use_acc = 1;
 2091: 
 2092: #
 2093: # called on -init-file
 2094: sub LoadInitFile
 2095: {
 2096:   my $init_file = shift;
 2097:   # second argument is value of options
 2098:   $init_file = shift;
 2099:   if (-f $init_file)
 2100:   {
 2101:     print "# reading initialization file from $init_file\n" 
 2102:       if ($T2H_VERBOSE);
 2103:     require($init_file);
 2104:   }
 2105:   else
 2106:   {
 2107:     print "$ERROR Error: can't read init file $int_file\n";
 2108:     $init_file = '';
 2109:   }
 2110: }
 2111: 
 2112: #
 2113: # called on -lang
 2114: sub SetDocumentLanguage
 2115: {
 2116:   my $lang = shift;
 2117:   if (! exists($T2H_WORDS->{$lang}))
 2118:   {
 2119:     warn "$ERROR: Language specs for '$lang' do not exists. Reverting to '" . 
 2120:       ($T2H_LANG ? T2H_LANG : "en") . "'\n";
 2121:   }
 2122:   else
 2123:   {
 2124:     print "# using '$lang' as document language\n" if ($T2H_VERBOSE);
 2125:     $T2H_LANG = $lang;
 2126:   }
 2127: }
 2128: 
 2129: ##
 2130: ## obsolete cmd line options
 2131: ##
 2132: $T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} =
 2133: {
 2134:  type => '!',
 2135:  linkage => sub {$main::T2H_SECTION_NAVIGATION = 0;},
 2136:  verbose => 'obsolete, use -nosec_nav',
 2137:  noHelp => 2,
 2138: };
 2139: $T2H_OBSOLETE_OPTIONS -> {use_acc} =
 2140: {
 2141:  type => '!',
 2142:  linkage => \$use_acc,
 2143:  verbose => 'obsolete',
 2144:  noHelp => 2
 2145: };
 2146: $T2H_OBSOLETE_OPTIONS -> {expandinfo} =
 2147: {
 2148:  type => '!',
 2149:  linkage => sub {$main::T2H_EXPAND = 'info';},
 2150:  verbose => 'obsolete, use "-expand info" instead',
 2151:  noHelp => 2,
 2152: };
 2153: $T2H_OBSOLETE_OPTIONS -> {expandtex} =
 2154: {
 2155:  type => '!',
 2156:  linkage => sub {$main::T2H_EXPAND = 'tex';},
 2157:  verbose => 'obsolete, use "-expand tex" instead',
 2158:  noHelp => 2,
 2159: };
 2160: $T2H_OBSOLETE_OPTIONS -> {monolithic} =
 2161: {
 2162:  type => '!',
 2163:  linkage => sub {$main::T2H_SPLIT = '';},
 2164:  verbose => 'obsolete, use "-split no" instead',
 2165:  noHelp => 2
 2166: };
 2167: $T2H_OBSOLETE_OPTIONS -> {split_node} =
 2168: {
 2169:  type => '!',
 2170:  linkage => sub{$main::T2H_SPLIT = 'section';},
 2171:  verbose => 'obsolete, use "-split section" instead',
 2172:  noHelp => 2,
 2173: };
 2174: $T2H_OBSOLETE_OPTIONS -> {split_chapter} =
 2175: {
 2176:  type => '!',
 2177:  linkage => sub{$main::T2H_SPLIT = 'chapter';},
 2178:  verbose => 'obsolete, use "-split chapter" instead',
 2179:  noHelp => 2,
 2180: };
 2181: $T2H_OBSOLETE_OPTIONS -> {no_verbose} =
 2182: {
 2183:  type => '!',
 2184:  linkage => sub {$main::T2H_VERBOSE = 0;},
 2185:  verbose => 'obsolete, use -noverbose instead',
 2186:  noHelp => 2,
 2187: };
 2188: $T2H_OBSOLETE_OPTIONS -> {output_file} =
 2189: {
 2190:  type => '=s',
 2191:  linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';},
 2192:  verbose => 'obsolete, use -out_file instead',
 2193:  noHelp => 2
 2194: };
 2195: 
 2196: $T2H_OBSOLETE_OPTIONS -> {section_navigation} =
 2197: {
 2198:  type => '!',
 2199:  linkage => \$T2H_SECTION_NAVIGATION,
 2200:  verbose => 'obsolete, use -sec_nav instead',
 2201:  noHelp => 2,
 2202: };
 2203: 
 2204: $T2H_OBSOLETE_OPTIONS -> {verbose} =
 2205: {
 2206:  type => '!',
 2207:  linkage => \$T2H_VERBOSE,
 2208:  verbose => 'obsolete, use -Verbose instead',
 2209:  noHelp => 2
 2210: };
 2211: 
 2212: # read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc
 2213: my $home = $ENV{HOME};
 2214: defined($home) or $home = '';
 2215: foreach $i ('/usr/local/etc/texi2htmlrc', "$home/.texi2htmlrc") {
 2216:     if (-f $i) {
 2217: 	print "# reading initialization file from $i\n" 
 2218: 	    if ($T2H_VERBOSE);
 2219: 	require($i);
 2220:     }
 2221: }
 2222: 
 2223: 
 2224: #+++############################################################################
 2225: #                                                                              #
 2226: # parse command-line options
 2227: #                                                                              #
 2228: #---############################################################################
 2229: $T2H_USAGE_TEXT = <<EOT;
 2230: Usage: texi2html  [OPTIONS] TEXINFO-FILE
 2231: Translates Texinfo source documentation to HTML.
 2232: EOT
 2233: $T2H_FAILURE_TEXT = <<EOT;
 2234: Try 'texi2html -help' for usage instructions.
 2235: EOT
 2236: $options = new Getopt::MySimple;
 2237: 
 2238: # some older version of GetOpt::Long don't have 
 2239: # Getopt::Long::Configure("pass_through")
 2240: eval {Getopt::Long::Configure("pass_through");};
 2241: $Configure_failed = $@ && <<EOT;
 2242: **WARNING: Parsing of obsolete command-line options could have failed. 
 2243:            Consider to use only documented command-line options (run
 2244:            'texi2html -help 2' for a complete list) or upgrade to perl 
 2245:            version 5.005 or higher.
 2246: EOT
 2247: 
 2248: if (! $options->getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
 2249: {
 2250:   print $Configure_failed if $Configure_failed;
 2251:   die $T2H_FAILURE_TEXT;
 2252: }
 2253: 
 2254: if (@ARGV > 1)
 2255: {
 2256:   eval {Getopt::Long::Configure("no_pass_through");};
 2257:   if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
 2258:   {
 2259:     print $Configure_failed if $Configure_failed;
 2260:     die $T2H_FAILURE_TEXT;
 2261:   }
 2262: }
 2263: 
 2264: if ($T2H_CHECK) {
 2265:     die "Need file to check\n$T2H_FAILURE_TEXT" unless @ARGV > 0;
 2266:     &check;
 2267:     exit;
 2268: }
 2269: 
 2270: #+++############################################################################
 2271: #                                                                              #
 2272: # evaluation of cmd line options
 2273: #                                                                              #
 2274: #---############################################################################
 2275: 
 2276: if ($T2H_EXPAND eq 'info') 
 2277: {
 2278:   $to_skip{'ifinfo'} = 1;
 2279:   $to_skip{'end ifinfo'} = 1;
 2280: } 
 2281: elsif ($T2H_EXPAND eq 'tex')
 2282: {
 2283:   $to_skip{'iftex'} = 1;
 2284:   $to_skip{'end iftex'} = 1;
 2285:   
 2286: }
 2287: 
 2288: $T2H_INVISIBLE_MARK = '<IMG SRC="invisible.xbm">' if $T2H_INVISIBLE_MARK eq 'xbm';
 2289: 
 2290: #
 2291: # file name buisness
 2292: #
 2293: die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1;
 2294: $docu = shift(@ARGV);
 2295: if ($docu =~ /.*\//) {
 2296:     chop($docu_dir = $&);
 2297:     $docu_name = $';
 2298: } else {
 2299:     $docu_dir = '.';
 2300:     $docu_name = $docu;
 2301: }
 2302: unshift(@T2H_INCLUDE_DIRS, $docu_dir);
 2303: $docu_name =~ s/\.te?x(i|info)?$//;	# basename of the document
 2304: $docu_name = $T2H_PREFIX if ($T2H_PREFIX);
 2305: 
 2306: # subdir
 2307: if ($T2H_SUBDIR && ! $T2H_OUT)
 2308: {
 2309:   $T2H_SUBDIR =~ s|/*$||;
 2310:   unless (-d "$T2H_SUBDIR" && -w "$T2H_SUBDIR")
 2311:   {
 2312:     if ( mkdir($T2H_SUBDIR, oct(755)))
 2313:     {
 2314:       print "# created directory $T2H_SUBDIR\n" if ($T2H_VERBOSE);
 2315:     }
 2316:     else
 2317:     {
 2318:       warn "$ERROR can't create directory $T2H_SUBDIR. Put results into current directory\n";
 2319:       $T2H_SUBDIR = '';
 2320:     }
 2321:   }
 2322: }
 2323: 
 2324: if ($T2H_SUBDIR && ! $T2H_OUT)
 2325: {
 2326:   $docu_rdir = "$T2H_SUBDIR/";
 2327:   print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
 2328: }
 2329: else
 2330: {
 2331:   if ($T2H_OUT && $T2H_OUT =~ m|(.*)/|)
 2332:   {
 2333:     $docu_rdir = "$1/";
 2334:     print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
 2335:   }
 2336:   else
 2337:   {
 2338:     print "# putting result files into current directory \n" if ($T2H_VERBOSE);
 2339:     $docu_rdir = '';
 2340:   }
 2341: }
 2342: 
 2343: # extension
 2344: if ($T2H_SHORTEXTN)
 2345: {
 2346:   $docu_ext = "htm";
 2347: }
 2348: else
 2349: {
 2350:   $docu_ext = "html";
 2351: }
 2352: if ($T2H_TOP_FILE =~ /\..*$/)
 2353: {
 2354:   $T2H_TOP_FILE = $`.".$docu_ext";
 2355: }
 2356: 
 2357: # result files
 2358: if (! $T2H_OUT && ($T2H_SPLIT =~ /section/i || $T2H_SPLIT =~ /node/i))
 2359: {
 2360:   $T2H_SPLIT = 'section';
 2361: }
 2362: elsif (! $T2H_OUT && $T2H_SPLIT =~ /chapter/i)
 2363: {
 2364:   $T2H_SPLIT = 'chapter'
 2365: }
 2366: else
 2367: {
 2368:   undef $T2H_SPLIT;
 2369: }
 2370: 
 2371: $docu_doc = "$docu_name.$docu_ext";		# document's contents
 2372: $docu_doc_file = "$docu_rdir$docu_doc";
 2373: if ($T2H_SPLIT) 
 2374: {
 2375:   $docu_toc  = $T2H_TOC_FILE || "${docu_name}_toc.$docu_ext"; # document's table of contents
 2376:   $docu_stoc = "${docu_name}_ovr.$docu_ext"; # document's short toc
 2377:   $docu_foot = "${docu_name}_fot.$docu_ext"; # document's footnotes
 2378:   $docu_about = "${docu_name}_abt.$docu_ext"; # about this document
 2379:   $docu_top  = $T2H_TOP_FILE || $docu_doc;
 2380: }
 2381: else
 2382: {
 2383:   if ($T2H_OUT)
 2384:   {
 2385:     $docu_doc = $T2H_OUT;
 2386:     $docu_doc =~ s|.*/||;
 2387:   }
 2388:   $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc;
 2389: }
 2390: 
 2391: $docu_toc_file  = "$docu_rdir$docu_toc";
 2392: $docu_stoc_file = "$docu_rdir$docu_stoc";
 2393: $docu_foot_file = "$docu_rdir$docu_foot";
 2394: $docu_about_file = "$docu_rdir$docu_about";
 2395: $docu_top_file  = "$docu_rdir$docu_top";
 2396: 
 2397: $docu_frame_file =     "$docu_rdir${docu_name}_frame.$docu_ext";
 2398: $docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext";
 2399: 
 2400: #
 2401: # variables
 2402: #
 2403: $value{'html'} = 1;			# predefine html (the output format)
 2404: $value{'texi2html'} = $THISVERSION;	# predefine texi2html (the translator)
 2405: # _foo: internal to track @foo
 2406: foreach ('_author', '_title', '_subtitle',
 2407: 	 '_settitle', '_setfilename', '_shorttitle') {
 2408:     $value{$_} = '';		        # prevent -w warnings
 2409: }
 2410: %node2sec = ();				# node to section name
 2411: %sec2node = ();				# section to node name
 2412: %sec2number = ();                       # section to number
 2413: %number2sec = ();                       # number to section 
 2414: %idx2node = ();                         # index keys to node
 2415: %node2href = ();			# node to HREF
 2416: %node2next = ();			# node to next
 2417: %node2prev = ();			# node to prev
 2418: %node2up   = ();			# node to up
 2419: %bib2href = ();				# bibliography reference to HREF
 2420: %gloss2href = ();			# glossary term to HREF
 2421: @sections = ();				# list of sections
 2422: %tag2pro = ();				# protected sections
 2423: 
 2424: #
 2425: # initial indexes
 2426: #
 2427: $bib_num = 0;
 2428: $foot_num = 0;
 2429: $gloss_num = 0;
 2430: $idx_num = 0;
 2431: $sec_num = 0;
 2432: $doc_num = 0;
 2433: $html_num = 0;
 2434: 
 2435: #
 2436: # can I use ISO8879 characters? (HTML+)
 2437: #
 2438: if ($T2H_USE_ISO) {
 2439:     $things_map{'bullet'} = "&bull;";
 2440:     $things_map{'copyright'} = "&copy;";
 2441:     $things_map{'dots'} = "&hellip;";
 2442:     $things_map{'equiv'} = "&equiv;";
 2443:     $things_map{'expansion'} = "&rarr;";
 2444:     $things_map{'point'} = "&lowast;";
 2445:     $things_map{'result'} = "&rArr;";
 2446: }
 2447: 
 2448: #
 2449: # read texi2html extensions (if any)
 2450: #
 2451: $extensions = 'texi2html.ext'; # extensions in working directory
 2452: if (-f $extensions) {
 2453:     print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
 2454:     require($extensions);
 2455: }
 2456: ($progdir = $0) =~ s/[^\/]+$//;
 2457: if ($progdir && ($progdir ne './')) {
 2458:     $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory
 2459:     if (-f $extensions) {
 2460: 	print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
 2461: 	require($extensions);
 2462:     }
 2463: }
 2464: 
 2465: 
 2466: print "# reading from $docu\n" if $T2H_VERBOSE;
 2467: 
 2468: #########################################################################
 2469: #
 2470: # latex2html stuff
 2471: # 
 2472: # latex2html conversions consist of three stages:
 2473: # 1) ToLatex: Put "latex" code into a latex file
 2474: # 2) ToHtml: Use latex2html to generate corresponding html code and images
 2475: # 3) FromHtml: Extract generated code and images from latex2html run
 2476: #
 2477: 
 2478: ##########################
 2479: # default settings
 2480: #
 2481: 
 2482: # defaults for files and names
 2483: 
 2484: sub l2h_Init 
 2485: {
 2486:   local($root) = @_;
 2487:   
 2488:   return 0 unless ($root);
 2489:   
 2490:   $l2h_name =  "${root}_l2h";
 2491:   
 2492:   $l2h_latex_file = "$docu_rdir${l2h_name}.tex";
 2493:   $l2h_cache_file = "${docu_rdir}l2h_cache.pm";
 2494:   $T2H_L2H_L2H = "latex2html" unless ($T2H_L2H_L2H);
 2495:   
 2496:   # destination dir -- generated images are put there, should be the same
 2497:   # as dir of enclosing html document -- 
 2498:   $l2h_html_file = "$docu_rdir${l2h_name}.html";
 2499:   $l2h_prefix = "${l2h_name}_";
 2500:   return 1;
 2501: }
 2502: 
 2503: 
 2504: ##########################
 2505: # 
 2506: # First stage: Generation of Latex file
 2507: # Initialize with: l2h_InitToLatex
 2508: # Add content with: l2h_ToLatex($text) --> HTML placeholder comment
 2509: # Finish with: l2h_FinishToLatex
 2510: # 
 2511: 
 2512: $l2h_latex_preample = <<EOT;
 2513: % This document was automatically generated by the l2h extenstion of texi2html
 2514: % DO NOT EDIT !!!
 2515: \\documentclass{article}
 2516: \\usepackage{html}
 2517: \\begin{document}
 2518: EOT
 2519: 
 2520: $l2h_latex_closing = <<EOT;
 2521: \\end{document}
 2522: EOT
 2523: 
 2524: # return used latex 1, if l2h could be initalized properly, 0 otherwise
 2525: sub l2h_InitToLatex
 2526: {
 2527:   %l2h_to_latex = ();
 2528:   unless ($T2H_L2H_SKIP)
 2529:   {
 2530:     unless (open(L2H_LATEX, ">$l2h_latex_file"))
 2531:     {
 2532:       warn "$ERROR Error l2h: Can't open latex file '$latex_file' for writing\n";
 2533:       return 0;
 2534:     }  
 2535:     print "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE);
 2536:     print L2H_LATEX $l2h_latex_preample;
 2537:   }
 2538:   # open database for caching
 2539:   l2h_InitCache();
 2540:   $l2h_latex_count = 0;
 2541:   $l2h_to_latex_count = 0;
 2542:   $l2h_cached_count = 0;
 2543:   return  1;
 2544: }
 2545: 
 2546: # print text (1st arg) into latex file (if not already there), return
 2547: # HTML commentary which can be later on replaced by the latex2html
 2548: # generated text
 2549: sub l2h_ToLatex
 2550: {
 2551:   my($text) = @_;
 2552:   my($count);
 2553:   
 2554:   $l2h_to_latex_count++;
 2555:   $text =~ s/(\s*)$//;
 2556:   
 2557:   # try whether we can cache it
 2558:   my $cached_text = l2h_FromCache($text);
 2559:   if ($cached_text)
 2560:   {
 2561:     $l2h_cached_count++;
 2562:     return $cached_text;
 2563:   }
 2564:   
 2565:   # try whether we have text already on things to do
 2566:   unless ($count = $l2h_to_latex{$text})
 2567:   {
 2568:     $count = $l2h_latex_count;
 2569:     $l2h_latex_count++;
 2570:     $l2h_to_latex{$text} = $count;
 2571:     $l2h_to_latex[$count] = $text;
 2572:     unless ($T2H_L2H_SKIP)
 2573:     {
 2574:       print L2H_LATEX "\\begin{rawhtml}\n";
 2575:       print L2H_LATEX "<!-- l2h_begin ${l2h_name} ${count} -->\n";
 2576:       print L2H_LATEX "\\end{rawhtml}\n";
 2577:       
 2578:       print L2H_LATEX "$text\n";
 2579:       
 2580:       print L2H_LATEX "\\begin{rawhtml}\n";
 2581:       print L2H_LATEX "<!-- l2h_end ${l2h_name} ${count} -->\n";
 2582:       print L2H_LATEX "\\end{rawhtml}\n";
 2583:     }
 2584:   }
 2585:   return "<!-- l2h_replace ${l2h_name} ${count} -->"; 
 2586: }
 2587: 
 2588: # print closing into latex file and close it
 2589: sub l2h_FinishToLatex
 2590: {
 2591:   local ($reused);
 2592:   
 2593:   $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count;
 2594:   unless ($T2H_L2H_SKIP)
 2595:   {
 2596:     print L2H_LATEX $l2h_latex_closing;
 2597:     close(L2H_LATEX);
 2598:   }
 2599:   print "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE);
 2600:   unless ($l2h_latex_count)
 2601:   {
 2602:     l2h_Finish();
 2603:     return 0;
 2604:   }
 2605:   return 1;
 2606: }
 2607: 
 2608: ###################################
 2609: # Second stage: Use latex2html to generate corresponding html code and images
 2610: #
 2611: # l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]):
 2612: #   Call latex2html on $l2h_latex_file
 2613: #   Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir
 2614: #   Return 1, on success
 2615: #          0, otherwise
 2616: #
 2617: sub l2h_ToHtml
 2618: {
 2619:   local($call, $ext, $root, $dotbug);
 2620:   
 2621:   if ($T2H_L2H_SKIP)
 2622:   {
 2623:     print "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE);
 2624:     return 1;
 2625:   }
 2626:   
 2627:   # Check for dot in directory where dvips will work
 2628:   if ($T2H_L2H_TMP)
 2629:   {
 2630:     if ($T2H_L2H_TMP =~ /\./)
 2631:     {
 2632:       warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n";
 2633:       $dotbug = 1;
 2634:     }
 2635:   }
 2636:   else
 2637:   {
 2638:     if (&getcwd =~ /\./)
 2639:     {
 2640:      warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n";
 2641:      $dotbug = 1;
 2642:    }
 2643:   }
 2644:   # fix it, if necessary and hope that it works 
 2645:   $T2H_L2H_TMP = "/tmp" if ($dotbug);
 2646:     
 2647:   $call = $T2H_L2H_L2H;
 2648:   # use init file, if specified
 2649:   $call = $call . " -init_file " . $init_file if ($init_file && -f $init_file);
 2650:   # set output dir
 2651:   $call .=  ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir");
 2652:   # use l2h_tmp, if specified
 2653:   $call = $call . " -tmp $T2H_L2H_TMP" if ($T2H_L2H_TMP);
 2654:   # options we want to be sure of
 2655:   $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link";
 2656:   $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file"; 
 2657: 
 2658:   print "# l2h: executing '$call'\n" if ($T2H_VERBOSE);
 2659:   if (system($call))
 2660:   {
 2661:     warn "l2h ***Error: '${call}' did not succeed\n";
 2662:     return 0;
 2663:   }
 2664:   else
 2665:   {
 2666:     print "# l2h: latex2html finished successfully\n" if ($T2H_VERBOSE);
 2667:     return 1;
 2668:   }
 2669: }
 2670: 
 2671: # this is directly pasted over from latex2html
 2672: sub getcwd {
 2673:     local($_) = `pwd`;
 2674: 
 2675:     die "'pwd' failed (out of memory?)\n"
 2676: 	unless length;
 2677:     chop;
 2678:     $_;
 2679: }
 2680: 
 2681: 
 2682: ##########################
 2683: # Third stage: Extract generated contents from latex2html run
 2684: # Initialize with: l2h_InitFromHtml
 2685: #   open $l2h_html_file for reading
 2686: #   reads in contents into array indexed by numbers
 2687: #   return 1,  on success -- 0, otherwise
 2688: # Extract Html code with: l2h_FromHtml($text)
 2689: #   replaces in $text all previosuly inserted comments by generated html code
 2690: #   returns (possibly changed) $text
 2691: # Finish with: l2h_FinishFromHtml
 2692: #   closes $l2h_html_dir/$l2h_name.".$docu_ext" 
 2693: 
 2694: sub l2h_InitFromHtml
 2695: {
 2696:   local($h_line, $h_content, $count, %l2h_img);
 2697: 
 2698:   if (! open(L2H_HTML, "<${l2h_html_file}"))
 2699:   {
 2700:     print "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n";
 2701:     return 0;
 2702:   }
 2703:   print "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE);
 2704: 
 2705:   $l2h_html_count = 0;
 2706:   
 2707:   while ($h_line = <L2H_HTML>)
 2708:   {
 2709:     if ($h_line =~ /^<!-- l2h_begin $l2h_name ([0-9]+) -->/)
 2710:     {
 2711:       $count = $1;
 2712:       $h_content = "";
 2713:       while ($h_line = <L2H_HTML>)
 2714:       {
 2715: 	if ($h_line =~ /^<!-- l2h_end $l2h_name $count -->/)
 2716: 	{
 2717: 	  chomp $h_content;
 2718: 	  chomp $h_content;
 2719: 	  $l2h_html_count++;
 2720: 	  $h_content = l2h_ToCache($count, $h_content);
 2721: 	  $l2h_from_html[$count] = $h_content;
 2722: 	  $h_content = '';
 2723: 	  last;
 2724: 	}
 2725: 	$h_content = $h_content.$h_line;
 2726:       }
 2727:       if ($hcontent)
 2728:       {
 2729: 	print "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n" 
 2730: 	  if ($T2H_VERBOSE);
 2731: 	close(L2H_HTML);
 2732: 	return 0;
 2733:       }
 2734:     }
 2735:   }
 2736:   print "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n"
 2737:     if ($T2H_VERBOSE);
 2738: 
 2739:   close(L2H_HTML);
 2740:   return 1;
 2741: }
 2742: 
 2743: sub l2h_FromHtml
 2744: {
 2745:   local($text) = @_;
 2746:   local($done, $to_do, $count);
 2747:   
 2748:   $to_do = $text;
 2749:   
 2750:   while ($to_do =~ /([^\000]*)<!-- l2h_replace $l2h_name ([0-9]+) -->([^\000]*)/)
 2751:   {
 2752:     $to_do = $1;
 2753:     $count = $2;
 2754:     $done = $3.$done;
 2755:     
 2756:     $done = "<!-- l2h_end $l2h_name $count -->".$done
 2757:       if ($T2H_DEBUG & $DEBUG_L2H);
 2758: 
 2759:     $done = &l2h_ExtractFromHtml($count) . $done;
 2760: 
 2761:     $done = "<!-- l2h_begin $l2h_name $count -->".$done
 2762:       if ($T2H_DEBUG & $DEBUG_L2H);
 2763:   }
 2764:   return $to_do.$done;
 2765: }
 2766: 
 2767: 
 2768: sub l2h_ExtractFromHtml
 2769: {
 2770:   local($count) = @_;
 2771:   
 2772:   return $l2h_from_html[$count] if ($l2h_from_html[$count]);
 2773:   
 2774:   if ($count >= 0 && $count < $l2h_latex_count)
 2775:   {
 2776:     # now we are in trouble
 2777:     local($l_l2h, $_);
 2778: 
 2779:     $l2h_extract_error++;
 2780:     print "$ERROR l2h: can't extract content $count from html\n" 
 2781:       if ($T2H_VERBOSE);
 2782:     # try simple (ordinary) substition (without l2h)
 2783:     $l_l2h = $T2H_L2H;
 2784:     $T2H_L2H = 0;
 2785:     $_ = $l2h_to_latex{$count};
 2786:     $_ = &substitute_style($_); 
 2787:     &unprotect_texi;
 2788:     $_ = "<!-- l2h: ". __LINE__ . " use texi2html -->" . $_
 2789:       if ($T2H_DEBUG & $DEBUG_L2H);
 2790:     $T2H_L2H = $l_l2h;
 2791:     return $_;
 2792:   }
 2793:   else
 2794:   {
 2795:     # now we have been incorrectly called
 2796:     $l2h_range_error++;
 2797:     print "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n";
 2798:     return "<!-- l2h: ". __LINE__ . " out of range count $count -->"
 2799:       if ($T2H_DEBUG & $DEBUG_L2H);
 2800:     return "<!-- l2h: out of range count $count -->";
 2801:   }
 2802: }
 2803:     
 2804: sub l2h_FinishFromHtml
 2805: {
 2806:   if ($T2H_VERBOSE)
 2807:   {
 2808:     if ($l2h_extract_error + $l2h_range_error)
 2809:     {
 2810:       print "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n";
 2811:     }
 2812:     else
 2813:     {
 2814:       print "# l2h: finished from html (no errors)\n";
 2815:     }
 2816:   }
 2817: }
 2818: 
 2819: sub l2h_Finish
 2820: {
 2821:   l2h_StoreCache();
 2822:   if ($T2H_L2H_CLEAN)
 2823:   {
 2824:     print "# l2h: removing temporary files generated by l2h extension\n"
 2825:       if $T2H_VERBOSE;
 2826:     while (<"$docu_rdir$l2h_name"*>)
 2827:     {
 2828:       unlink $_;
 2829:     }
 2830:   }
 2831:   print "# l2h: Finished\n" if $T2H_VERBOSE;
 2832:   return 1;
 2833: }
 2834: 
 2835: ##############################
 2836: # stuff for l2h caching
 2837: #
 2838: 
 2839: # I tried doing this with a dbm data base, but it did not store all
 2840: # keys/values. Hence, I did as latex2html does it
 2841: sub l2h_InitCache
 2842: {
 2843:   if (-r "$l2h_cache_file")
 2844:   {
 2845:     my $rdo = do "$l2h_cache_file";
 2846:     warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n")
 2847:       unless ($rdo);
 2848:   }
 2849: }
 2850: 
 2851: sub l2h_StoreCache
 2852: {
 2853:   return unless $l2h_latex_count;
 2854:   
 2855:   my ($key, $value);
 2856:   open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n";
 2857: 
 2858:   
 2859:   while (($key, $value) = each %l2h_cache)
 2860:   {
 2861:     # escape stuff
 2862:     $key =~ s|/|\\/|g;
 2863:     $key =~ s|\\\\/|\\/|g;
 2864:     # weird, a \ at the end of the key results in an error
 2865:     # maybe this also broke the dbm database stuff
 2866:     $key =~ s|\\$|\\\\|;
 2867:     $value =~ s/\|/\\\|/g; 
 2868:     $value =~ s/\\\\\|/\\\|/g; 
 2869:     $value =~ s|\\\\|\\\\\\\\|g;
 2870:     print FH "\n\$l2h_cache_key = q/$key/;\n";
 2871:     print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n";
 2872:   }
 2873:   print FH "1;";
 2874:   close(FH);
 2875: }
 2876: 
 2877: # return cached html, if it exists for text, and if all pictures
 2878: # are there, as well
 2879: sub l2h_FromCache
 2880: {
 2881:   my $text = shift;
 2882:   my $cached = $l2h_cache{$text};
 2883:   if ($cached)
 2884:   {
 2885:     while ($cached =~ m/SRC="(.*?)"/g)
 2886:     {
 2887:       unless (-e "$docu_rdir$1")
 2888:       {
 2889: 	return undef;
 2890:       }
 2891:     }
 2892:     return $cached;
 2893:   }
 2894:   return undef;
 2895: }
 2896: 
 2897: # insert generated html into cache, move away images, 
 2898: # return transformed html
 2899: $maximage = 1;
 2900: sub l2h_ToCache
 2901: {
 2902:   my $count = shift;
 2903:   my $content = shift;
 2904:   my @images = ($content =~ /SRC="(.*?)"/g);
 2905:   my ($src, $dest);
 2906: 
 2907:   for $src (@images)
 2908:   {
 2909:     $dest = $l2h_img{$src};
 2910:     unless ($dest)
 2911:     {
 2912:       my $ext;
 2913:       if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext)
 2914:       {
 2915: 	$ext = $1;
 2916:       }
 2917:       else
 2918:       {
 2919: 	warn "$ERROR: L2h image $src has invalid extension\n";
 2920: 	next;
 2921:       }
 2922:       while (-e "$docu_rdir${docu_name}_$maximage.$ext") { $maximage++;}
 2923:       $dest = "${docu_name}_$maximage.$ext";
 2924:       system("cp -f $docu_rdir$src $docu_rdir$dest");
 2925:       $l2h_img{$src} = $dest;
 2926:       unlink "$docu_rdir$src" unless ($DEBUG & DEBUG_L2H);
 2927:     }
 2928:     $content =~ s/$src/$dest/g;
 2929:   }
 2930:   $l2h_cache{$l2h_to_latex[$count]} = $content;
 2931:   return $content;
 2932: }
 2933: 
 2934: 
 2935: #+++############################################################################
 2936: #                                                                              #
 2937: # Pass 1: read source, handle command, variable, simple substitution           #
 2938: #                                                                              #
 2939: #---############################################################################
 2940: 
 2941: @lines = ();				# whole document
 2942: @toc_lines = ();			# table of contents
 2943: @stoc_lines = ();			# table of contents
 2944: $curlevel = 0;				# current level in TOC
 2945: $node = '';				# current node name
 2946: $node_next = '';                        # current node next name               
 2947: $node_prev = '';                        # current node prev name
 2948: $node_up = '';                          # current node up name
 2949: $in_table = 0;				# am I inside a table
 2950: $table_type = '';			# type of table ('', 'f', 'v', 'multi')
 2951: @tables = ();			        # nested table support
 2952: $in_bibliography = 0;			# am I inside a bibliography
 2953: $in_glossary = 0;			# am I inside a glossary
 2954: $in_top = 0;				# am I inside the top node
 2955: $has_top = 0;				# did I see a top node?
 2956: $has_top_command = 0;			# did I see @top for automatic pointers?
 2957: $in_pre = 0;				# am I inside a preformatted section
 2958: $in_list = 0;				# am I inside a list
 2959: $in_html = 0;				# am I inside an HTML section
 2960: $first_line = 1;		        # is it the first line
 2961: $dont_html = 0;				# don't protect HTML on this line
 2962: $deferred_ref = '';			# deferred reference for indexes
 2963: @html_stack = ();			# HTML elements stack
 2964: $html_element = '';			# current HTML element
 2965: &html_reset;
 2966: %macros = ();                           # macros
 2967: 
 2968: # init l2h
 2969: $T2H_L2H = &l2h_Init($docu_name) if ($T2H_L2H);
 2970: $T2H_L2H = &l2h_InitToLatex      if ($T2H_L2H);    
 2971: 
 2972: # build code for simple substitutions
 2973: # the maps used (%simple_map and %things_map) MUST be aware of this
 2974: # watch out for regexps, / and escaped characters!
 2975: $subst_code = '';
 2976: foreach (keys(%simple_map)) {
 2977:     ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars
 2978:     $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n";
 2979: }
 2980: foreach (keys(%things_map)) {
 2981:     $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n";
 2982: }
 2983: if ($use_acc) {
 2984:     # accentuated characters
 2985:     foreach (keys(%accent_map)) {
 2986: 	if ($_ eq "`") {
 2987: 	    $subst_code .= "s/$;3";
 2988: 	} elsif ($_ eq "'") {
 2989: 	    $subst_code .= "s/$;4";
 2990: 	} else {
 2991: 	    $subst_code .= "s/\\\@\\$_";
 2992: 	}
 2993: 	$subst_code .= "([a-z])/&\${1}$accent_map{$_};/gi;\n";
 2994:     }
 2995: }
 2996: eval("sub simple_substitutions { $subst_code }");
 2997: 
 2998: &init_input;
 2999: INPUT_LINE: while ($_ = &next_line) {
 3000:     #
 3001:     # remove \input on the first lines only
 3002:     #
 3003:     if ($first_line) {
 3004: 	next if /^\\input/;
 3005: 	$first_line = 0;
 3006:     }
 3007:     # non-@ substitutions cf. texinfmt.el
 3008:     #
 3009:     # parse texinfo tags
 3010:     #
 3011:     $tag = '';
 3012:     $end_tag = '';
 3013:     if (/^\s*\@end\s+(\w+)\b/) {
 3014: 	$end_tag = $1;
 3015:     } elsif (/^\s*\@(\w+)\b/) {
 3016: 	$tag = $1;
 3017:     }
 3018:     #
 3019:     # handle @html / @end html
 3020:     #
 3021:     if ($in_html) {
 3022: 	if ($end_tag eq 'html') {
 3023: 	    $in_html = 0;
 3024: 	} else {
 3025: 	    $tag2pro{$in_html} .= $_;
 3026: 	}
 3027: 	next;
 3028:     } elsif ($tag eq 'html') {
 3029: 	$in_html = $PROTECTTAG . ++$html_num;
 3030: 	push(@lines, $in_html);
 3031: 	next;
 3032:     }
 3033: 
 3034:     #
 3035:     # try to remove inlined comments
 3036:     # syntax from tex-mode.el comment-start-skip
 3037:     #
 3038:     s/((^|[^\@])(\@\@)*)\@c(omment | |\{|$).*/$1/;
 3039: 
 3040: # Sometimes I use @c right at the end of  a line ( to suppress the line feed )
 3041: #    s/((^|[^\@])(\@\@)*)\@c(omment)?$/$1/;
 3042: #     s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/;
 3043: #     s/(.*)\@c{.*?}(.*)/$1$2/;
 3044: #     s/(.*)\@comment{.*?}(.*)/$1$2/;
 3045: #     s/^(.*)\@c /$1/;
 3046: #     s/^(.*)\@comment /$1/;
 3047: 
 3048:     #############################################################
 3049:     # value substitution before macro expansion, so that
 3050:     # it works in macro arguments			    
 3051:     s/\@value{($VARRE)}/$value{$1}/eg;
 3052: 			    
 3053:     #############################################################
 3054:     # macro substitution
 3055:     while (/\@(\w+)/g)
 3056:     {
 3057:       if (exists($macros->{$1}))    
 3058:       {
 3059: 	my $before = $`;
 3060: 	my $name = $1;
 3061: 	my $after = $';
 3062: 	my @args;
 3063: 	my $args;
 3064: 	if ($after =~ /^\s*{(.*?[^\\])}(.*)/)  
 3065: 	{
 3066: 	  $args = $1;
 3067: 	  $after = $2;
 3068: 	}
 3069: 	elsif (@{$macros->{$name}->{Args}} == 1)
 3070: 	{
 3071: 	  $args = $after;
 3072: 	  $args =~ s/^\s*//;
 3073: 	  $args =~ s/\s*$//;
 3074: 	  $after = '';
 3075: 	}
 3076: 	$args =~ s|\\\\|\\|g;
 3077: 	$args =~ s|\\{|{|g;
 3078:         $args =~ s|\\}|}|g;
 3079: 	if (@{$macros->{$name}->{Args}} > 1)
 3080: 	{
 3081: 	  $args =~ s/(^|[^\\]),/$1$;/g ;
 3082: 	  $args =~ s|\\,|,|g;
 3083: 	  @args = split(/$;\s*/, $args) if (@{$macros->{$name}->{Args}} > 1);
 3084: 	}
 3085: 	else
 3086: 	{
 3087: 	  $args =~ s|\\,|,|g;
 3088: 	  @args = ($args);
 3089: 	}
 3090: 	my $macrobody = $macros->{$name}->{Body};
 3091: 	for ($i=0; $i<=$#args; $i++)
 3092: 	{
 3093: 	  $macrobody =~ s|\\$macros->{$name}->{Args}->[$i]\\|$args[$i]|g;
 3094: 	}
 3095: 	$macrobody =~ s|\\\\|\\|g;
 3096: 	$_ = $before . $macrobody . $after;
 3097: 	unshift @input_spool, map {$_ = $_."\n"} split(/\n/, $_);
 3098: 	next INPUT_LINE;
 3099:       }
 3100:     }				#
 3101: 			    
 3102:     
 3103:     #
 3104:     # try to skip the line
 3105:     #
 3106:     if ($end_tag) {
 3107:         $in_titlepage = 0 if $end_tag eq 'titlepage';
 3108: 	next if $to_skip{"end $end_tag"};
 3109:     } elsif ($tag) {
 3110:       $in_titlepage = 1 if $tag eq 'titlepage';
 3111:       next if $to_skip{$tag};
 3112:       last if $tag eq 'bye';
 3113:     }
 3114:     if ($in_top) {
 3115: 	# parsing the top node
 3116: 	if ($tag eq 'node' || 
 3117: 	    ($sec2level{$tag} && $tag !~ /unnumbered/ && $tag !~ /heading/))
 3118: 	{
 3119: 	    # no more in top
 3120: 	    $in_top = 0;
 3121: 	    push(@lines, $TOPEND);
 3122: 	}
 3123:     }
 3124:     unless ($in_pre) {
 3125: 	s/``/\"/g;
 3126: 	s/''/\"/g;
 3127: 	s/([\w ])---([\w ])/$1--$2/g;
 3128:     }
 3129:     #
 3130:     # analyze the tag
 3131:     #
 3132:     if ($tag) {
 3133: 	# skip lines
 3134: 	&skip_until($tag), next if $tag eq 'ignore';
 3135: 	&skip_until($tag), next if $tag eq 'ifnothtml';
 3136: 	if ($tag eq 'ifinfo')
 3137: 	{
 3138: 	  &skip_until($tag), next unless $T2H_EXPAND eq 'info';
 3139: 	}
 3140: 	if ($tag eq 'iftex')
 3141: 	{
 3142: 	  &skip_until($tag), next unless $T2H_EXPAND eq 'tex';
 3143: 	} 
 3144: 	if ($tag eq 'tex')
 3145: 	{
 3146: 	  # add to latex2html file
 3147: 	  if ($T2H_EXPAND eq 'tex' && $T2H_L2H && ! $in_pre)
 3148: 	  {
 3149: 	    # add space to the end -- tex(i2dvi) does this, as well 
 3150: 	    push(@lines, &l2h_ToLatex(&string_until($tag) . " "));
 3151: 	  }
 3152: 	  else
 3153: 	  {
 3154: 	    &skip_until($tag);
 3155: 	  }
 3156: 	  next;
 3157: 	}
 3158: 	if ($tag eq 'titlepage')
 3159: 	{
 3160: 	  next;
 3161: 	}
 3162: 	# handle special tables
 3163: 	if ($tag =~ /^(|f|v|multi)table$/) {
 3164: 	    $table_type = $1;
 3165: 	    $tag = 'table';
 3166: 	}
 3167: 	# special cases
 3168: 	if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) {
 3169: 	    $in_top = 1;
 3170: 	    $has_top = 1;
 3171: 	    $has_top_command = 1 if $tag eq 'top';
 3172: 	    @lines = (); # ignore all lines before top (title page garbage)
 3173: 	    next;
 3174: 	} elsif ($tag eq 'node') {
 3175: 	  if ($in_top)
 3176: 	  {
 3177: 	    $in_top = 0;
 3178: 	    push(@lines, $TOPEND);
 3179: 	  }
 3180: 	  warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o;
 3181: 	  # request of "Richard Y. Kim" <ryk@ap.com>
 3182: 	  s/^\@node\s+//;
 3183: 	  $_ = &protect_html($_); # if node contains '&' for instance
 3184: 	  ($node, $node_next, $node_prev, $node_up) = split(/,/);
 3185: 	  &normalise_node($node);
 3186: 	  &normalise_node($node_next);
 3187: 	  &normalise_node($node_prev);
 3188: 	  &normalise_node($node_up);
 3189: 	  $node =~ /\"/ ?
 3190: 	    push @lines, &html_debug("<A NAME='$node'></A>\n", __LINE__) :
 3191: 	    push @lines, &html_debug("<A NAME=\"$node\"></A>\n", __LINE__);
 3192: 	  next;
 3193: 	} elsif ($tag eq 'include') {
 3194: 	    if (/^\@include\s+($FILERE)\s*$/o) {
 3195: 		$file = LocateIncludeFile($1);
 3196: 		if ($file && -e $file) {
 3197: 		    &open($file);
 3198: 		    print "# including $file\n" if $T2H_VERBOSE;
 3199: 		} else {
 3200: 		    warn "$ERROR Can't find $1, skipping";
 3201: 		}
 3202: 	    } else {
 3203: 		warn "$ERROR Bad include line: $_";
 3204: 	    }
 3205: 	    next;
 3206: 	} elsif ($tag eq 'ifclear') {
 3207: 	    if (/^\@ifclear\s+($VARRE)\s*$/o) {
 3208: 		next unless defined($value{$1});
 3209: 		&skip_until($tag);
 3210: 	    } else {
 3211: 		warn "$ERROR Bad ifclear line: $_";
 3212: 	    }
 3213: 	    next;
 3214: 	} elsif ($tag eq 'ifset') {
 3215: 	    if (/^\@ifset\s+($VARRE)\s*$/o) {
 3216: 		next if defined($value{$1});
 3217: 		&skip_until($tag);
 3218: 	    } else {
 3219: 		warn "$ERROR Bad ifset line: $_";
 3220: 	    }
 3221: 	    next;
 3222: 	} elsif ($tag eq 'menu') {
 3223: 	    unless ($T2H_SHOW_MENU) {
 3224: 		&skip_until($tag);
 3225: 		next;
 3226: 	    }
 3227: 	    &html_push_if($tag);
 3228: 	    push(@lines, &html_debug('', __LINE__));
 3229: 	} elsif ($format_map{$tag}) {
 3230: 	    $in_pre = 1 if $format_map{$tag} eq 'PRE';
 3231: 	    &html_push_if($format_map{$tag});
 3232: 	    push(@lines, &html_debug('', __LINE__));
 3233: 	    $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ;
 3234: #	    push(@lines, &debug("<BLOCKQUOTE>\n", __LINE__))
 3235: #	      if $tag =~ /example/i;
 3236: 	    # sunshine@sunshineco.com: <PRE>bla</PRE> looks better than
 3237: 	    # <PRE>\nbla</PRE> (at least on NeXTstep browser
 3238: 	    push(@lines, &debug("<$format_map{$tag}>" . 
 3239: 				($in_pre ? '' : "\n"), __LINE__));
 3240: 	    next;
 3241: 	}
 3242: 	elsif (exists $complex_format_map->{$tag})
 3243: 	{
 3244: 	  my $start = eval $complex_format_map->{$tag}->[0];
 3245: 	  if ($@)
 3246: 	  {
 3247: 	    print "$ERROR: eval of complex_format_map->{$tag}->[0] $complex_format_map->{$tag}->[0]: $@";
 3248: 	    $start = '<pre>'
 3249: 	  }
 3250: 	  $in_pre = 1 if $start =~ /<pre/;
 3251: 	  push(@lines, html_debug($start. ($in_pre ? '' : "\n"), __LINE__));
 3252: 	  next;
 3253: 	} elsif ($tag eq 'table') {
 3254: 	  # anorland@hem2.passagen.se
 3255: 	  # if (/^\s*\@(|f|v|multi)table\s+\@(\w+)/) {
 3256: 	     if (/^\s*\@(|f|v|multi)table\s+\@(\w+)|(\{[^\}]*\})/) {
 3257: 		$in_table = $2;
 3258: 		unshift(@tables, join($;, $table_type, $in_table));
 3259: 		if ($table_type eq "multi") {
 3260: 		    # don't use borders -- gets confused by empty cells
 3261: 		    push(@lines, &debug("<TABLE>\n", __LINE__));
 3262: 		    &html_push_if('TABLE');
 3263: 		} else {
 3264: 		    push(@lines, &debug("<DL COMPACT>\n", __LINE__));
 3265: 		    &html_push_if('DL');
 3266: 		}
 3267: 		push(@lines, &html_debug('', __LINE__));
 3268: 	    } else {
 3269: 		warn "$ERROR Bad table line: $_";
 3270: 	    }
 3271: 	    next;
 3272: 	} 
 3273: 	elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') 
 3274: 	{
 3275: 	  if (/^\@$tag\s+(\w+)\s+(\w+)\s*$/) 
 3276: 	  {
 3277: 	    my $from = $1;
 3278: 	    my $to = $2;
 3279: 	    my $prefix_from = IndexName2Prefix($from);
 3280: 	    my $prefix_to = IndexName2Prefix($to);
 3281: 
 3282: 	    warn("$ERROR unknown from index name $from ind syn*index line: $_"), next
 3283: 	      unless $prefix_from;
 3284: 	    warn("$ERROR unknown to index name $to ind syn*index line: $_"), next
 3285: 	      unless $prefix_to;
 3286: 
 3287: 	    if ($tag eq 'syncodeindex')
 3288: 	    {
 3289: 	      $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1;
 3290: 	    }
 3291: 	    else
 3292: 	    {
 3293: 	       $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1;
 3294: 	    }
 3295: 	  } 
 3296: 	  else 
 3297: 	  {
 3298: 	    warn "$ERROR Bad syn*index line: $_";
 3299: 	  }
 3300: 	  next;
 3301: 	} 
 3302: 	elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') 
 3303: 	{
 3304: 	  if (/^\@$tag\s+(\w+)\s*$/) 
 3305: 	  {
 3306: 	    my $name = $1;
 3307: 	    $index_properties->{$name}->{name} = $name;
 3308: 	    $index_properties->{$name}->{code} = 1 if $tag eq 'defcodeindex';
 3309: 	  } 
 3310: 	  else 
 3311: 	  {
 3312: 	    warn "$ERROR Bad defindex line: $_";
 3313: 	  }
 3314: 	  next;
 3315: 	}
 3316: 	elsif (/^\@printindex/)
 3317: 	{
 3318: 	  push (@lines, "<!--::${section}::-->$_");
 3319: 	  next;
 3320: 	}
 3321: 	elsif ($tag eq 'sp') {
 3322: 	    push(@lines, &debug("<P>\n", __LINE__));
 3323: 	    next;
 3324: 	} elsif ($tag eq 'center') {
 3325: 	    push(@lines, &debug("<center>\n", __LINE__));
 3326: 	    s/\@center//;
 3327: 	} elsif ($tag eq 'setref') {
 3328: 	    &protect_html; # if setref contains '&' for instance
 3329: 	    if (/^\@$tag\s*{($NODERE)}\s*$/) {
 3330: 		$setref = $1;
 3331: 		$setref =~ s/\s+/ /g; # normalize
 3332: 		$setref =~ s/ $//;
 3333: 		$node2sec{$setref} = $name;
 3334: 		$sec2node{$name} = $setref;
 3335: 		$node2href{$setref} = "$docu_doc#$docid";
 3336: 	    } else {
 3337: 		warn "$ERROR Bad setref line: $_";
 3338: 	    }
 3339: 	    next;
 3340: 	} elsif ($tag eq 'lowersections') {
 3341: 	    local ($sec, $level);
 3342: 	    while (($sec, $level) = each %sec2level) {
 3343: 		$sec2level{$sec} = $level + 1;
 3344: 	    }
 3345: 	    next;
 3346: 	} elsif ($tag eq 'raisesections') {
 3347: 	    local ($sec, $level);
 3348: 	    while (($sec, $level) = each %sec2level) {
 3349: 		$sec2level{$sec} = $level - 1;
 3350: 	    }
 3351: 	    next;
 3352: 	}
 3353: 	elsif ($tag eq 'macro' || $tag eq 'rmacro')
 3354: 	{
 3355: 	  if (/^\@$tag\s*(\w+)\s*(.*)/)
 3356: 	  {
 3357: 	    my $name = $1;
 3358: 	    my @args;
 3359: 	    @args = split(/\s*,\s*/ , $1)
 3360: 	      if ($2 =~ /^\s*{(.*)}\s*/);
 3361: 	    
 3362: 	    $macros->{$name}->{Args} = \@args;
 3363: 	    $macros->{$name}->{Body} = '';
 3364: 	    while (($_ = &next_line) && $_ !~ /\@end $tag/)
 3365: 	    {
 3366: 	      $macros->{$name}->{Body} .= $_;
 3367: 	    }
 3368: 	    die "ERROR: No closing '\@end $tag' found for macro definition of '$name'\n"
 3369: 	      unless (/\@end $tag/);
 3370: 	    chomp $macros->{$name}->{Body};
 3371: 	  }
 3372: 	  else
 3373: 	  {
 3374: 	    warn "$ERROR: Bad macro defintion $_"
 3375: 	  }
 3376: 	  next;
 3377: 	}
 3378: 	elsif ($tag eq 'unmacro')
 3379: 	{
 3380: 	  delete $macros->{$1} if (/^\@unmacro\s*(\w+)/);
 3381: 	  next;
 3382: 	}
 3383: 	elsif ($tag eq 'documentlanguage')
 3384: 	{
 3385: 	  SetDocumentLanguage($1) if (!$T2H_LANG && /documentlanguage\s*(\w+)/);
 3386: 	}
 3387: 	elsif (defined($def_map{$tag})) {
 3388: 	    if ($def_map{$tag}) {
 3389: 		s/^\@$tag\s+//;
 3390: 		$tag = $def_map{$tag};
 3391: 		$_ = "\@$tag $_";
 3392: 		$tag =~ s/\s.*//;
 3393: 	    }
 3394: 	} elsif (defined($user_sub{$tag})) {
 3395: 	    s/^\@$tag\s+//;
 3396: 	    $sub = $user_sub{$tag};
 3397: 	    print "# user $tag = $sub, arg: $_" if $T2H_DEBUG & $DEBUG_USER;
 3398: 	    if (defined(&$sub)) {
 3399: 		chop($_);
 3400: 		&$sub($_);
 3401: 	    } else {
 3402: 		warn "$ERROR Bad user sub for $tag: $sub\n";
 3403: 	    }
 3404: 	    next;
 3405: 	  } 
 3406: 	if (defined($def_map{$tag})) {
 3407: 	    s/^\@$tag\s+//;
 3408: 	    if ($tag =~ /x$/) {
 3409: 		# extra definition line
 3410: 		$tag = $`;
 3411: 		$is_extra = 1;
 3412: 	    } else {
 3413: 		$is_extra = 0;
 3414: 	    }
 3415: 	    while (/\{([^\{\}]*)\}/) {
 3416: 		# this is a {} construct
 3417: 		($before, $contents, $after) = ($`, $1, $');
 3418: 		# protect spaces
 3419: 		$contents =~ s/\s+/$;9/g;
 3420: 		# restore $_ protecting {}
 3421: 		$_ = "$before$;7$contents$;8$after";
 3422: 	    }
 3423: 	    @args = split(/\s+/, &protect_html($_));
 3424: 	    foreach (@args) {
 3425: 		s/$;9/ /g;	# unprotect spaces
 3426: 		s/$;7/\{/g;	# ... {
 3427: 		s/$;8/\}/g;	# ... }
 3428: 	    }
 3429: 	    $type = shift(@args);
 3430: 	    $type =~ s/^\{(.*)\}$/$1/;
 3431: 	    print "# def ($tag): {$type} ", join(', ', @args), "\n"
 3432: 		if $T2H_DEBUG & $DEBUG_DEF;
 3433: 	    $type .= ':'; # it's nicer like this
 3434: 	    my $name = shift(@args);
 3435: 	    $name =~ s/^\{(.*)\}$/$1/;
 3436: 	    if ($is_extra) {
 3437: 		$_ = &debug("<DT>", __LINE__);
 3438: 	    } else {
 3439: 		$_ = &debug("<DL>\n<DT>", __LINE__);
 3440: 	    }
 3441: 	    if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') {
 3442: 		$_ .= "<U>$type</U> <B>$name</B>";
 3443: 		$_ .= " <I>@args</I>" if @args;
 3444: 	    } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr'
 3445: 		     || $tag eq 'defcv' || $tag eq 'defop') {
 3446: 		$ftype = $name;
 3447: 		$name = shift(@args);
 3448: 		$name =~ s/^\{(.*)\}$/$1/;
 3449: 		$_ .= "<U>$type</U> $ftype <B>$name</B>";
 3450: 		$_ .= " <I>@args</I>" if @args;
 3451: 	    } else {
 3452: 		warn "$ERROR Unknown definition type: $tag\n";
 3453: 		$_ .= "<U>$type</U> <B>$name</B>";
 3454: 		$_ .= " <I>@args</I>" if @args;
 3455: 	    }
 3456:  	    $_ .= &debug("\n<DD>", __LINE__);
 3457: 	    $name = &unprotect_html($name);
 3458: 	    if ($tag eq 'deffn' || $tag eq 'deftypefn') {
 3459: 	      EnterIndexEntry('f', $name, $docu_doc, $section, \@lines);
 3460: #		unshift(@input_spool, "\@findex $name\n");
 3461: 	    } elsif ($tag eq 'defop') {
 3462: 	      EnterIndexEntry('f', "$name on $ftype", $docu_doc, $section, \@lines);
 3463: #		unshift(@input_spool, "\@findex $name on $ftype\n");
 3464: 	    } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') {
 3465: 	      EnterIndexEntry('v', $name, $docu_doc, $section, \@lines);
 3466: #		unshift(@input_spool, "\@vindex $name\n");
 3467: 	    } else {
 3468: 	      EnterIndexEntry('t', $name, $docu_doc, $section, \@lines);
 3469: #		unshift(@input_spool, "\@tindex $name\n");
 3470: 	    }
 3471: 	    $dont_html = 1;
 3472: 	}
 3473:     } elsif ($end_tag) {
 3474: 	if ($format_map{$end_tag}) {
 3475: 	    $in_pre = 0 if $format_map{$end_tag} eq 'PRE';
 3476: 	    $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ;
 3477: 	    &html_pop_if('P');
 3478: 	    &html_pop_if('LI');
 3479: 	    &html_pop_if();
 3480: 	    push(@lines, &debug("</$format_map{$end_tag}>\n", __LINE__));
 3481: 	    push(@lines, &html_debug('', __LINE__));
 3482: 	}
 3483: 	elsif (exists $complex_format_map->{$end_tag})
 3484: 	{
 3485: 	  my $end = eval $complex_format_map->{$end_tag}->[1];
 3486: 	  if ($@)
 3487: 	  {
 3488: 	    print "$ERROR: eval of complex_format_map->{$end_tag}->[1] $complex_format_map->{$end_tag}->[0]: $@";
 3489: 	    $end = '</pre>'
 3490: 	  }
 3491: 	  $in_pre = 0 if $end =~ m|</pre>|;
 3492: 	  push(@lines, html_debug($end, __LINE__));
 3493: 	} elsif ($end_tag =~ /^(|f|v|multi)table$/) {
 3494: 	    unless (@tables) {
 3495: 		warn "$ERROR \@end $end_tag without \@*table\n";
 3496: 		next;
 3497: 	    }
 3498: 	    &html_pop_if('P');
 3499: 	    ($table_type, $in_table) = split($;, shift(@tables));
 3500: 	    unless ($1 eq $table_type) {
 3501: 		warn "$ERROR \@end $end_tag without matching \@$end_tag\n";
 3502: 		next;
 3503: 	    }
 3504: 	    if ($table_type eq "multi") {
 3505: 		push(@lines, "</TR></TABLE>\n");
 3506: 		&html_pop_if('TR');
 3507: 	    } else {
 3508: 		push(@lines, "</DL>\n");
 3509: 		&html_pop_if('DD');
 3510: 	    }
 3511: 	    &html_pop_if();
 3512: 	    if (@tables) {
 3513: 		($table_type, $in_table) = split($;, $tables[0]);
 3514: 	    } else {
 3515: 		$in_table = 0;
 3516: 	    }
 3517: 	} elsif (defined($def_map{$end_tag})) {
 3518:  	    push(@lines, &debug("</DL>\n", __LINE__));
 3519: 	} elsif ($end_tag eq 'menu') {
 3520: 	    &html_pop_if();
 3521: 	    push(@lines, $_); # must keep it for pass 2
 3522: 	} 
 3523: 	next;
 3524:     }
 3525:     #############################################################
 3526:     # anchor insertion
 3527:     while (/\@anchor\s*\{(.*?)\}/)
 3528:     {
 3529:       $_ = $`.$';
 3530:       my $anchor = $1;
 3531:       $anchor = &normalise_node($anchor);
 3532:       push @lines, &html_debug("<A NAME=\"$anchor\"></A>\n");
 3533:       $node2href{$anchor} = "$docu_doc#$anchor";
 3534:       next INPUT_LINE if $_ =~ /^\s*$/;
 3535:     }
 3536: 
 3537:     #############################################################
 3538:     # index entry generation, after value substitutions
 3539:     if (/^\@(\w+?)index\s+/)
 3540:     {
 3541:       EnterIndexEntry($1, $', $docu_doc, $section, \@lines);
 3542:       next;
 3543:     }
 3544:     #
 3545:     # protect texi and HTML things
 3546:     &protect_texi;
 3547:     $_ = &protect_html($_) unless $dont_html;
 3548:     $dont_html = 0;
 3549:     # substitution (unsupported things)
 3550:     s/^\@exdent\s+//g;
 3551:     s/\@noindent\s+//g;
 3552:     s/\@refill\s+//g;
 3553:     # other substitutions
 3554:     &simple_substitutions;
 3555:     s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4
 3556:     #
 3557:     # analyze the tag again
 3558:     #
 3559:     if ($tag) {
 3560:       if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) {
 3561: 	    if (/^\@$tag\s+(.+)$/) {
 3562: 		$name = $1;
 3563: 		$name = &normalise_node($name);
 3564: 		$level = $sec2level{$tag};
 3565: 		# check for index
 3566: 		$first_index_chapter = $node
 3567: 		  if ($level == 1 && !$first_index_chapter && 
 3568: 		      $name =~ /index/i);
 3569: 		if ($in_top && /heading/){
 3570: 		    $T2H_HAS_TOP_HEADING = 1;
 3571:                     $_ = &debug("<H$level>$name</H$level>\n", __LINE__);
 3572: 		    &html_push_if('body');
 3573: 		    print "# top heading, section $name, level $level\n"
 3574: 			if $T2H_DEBUG & $DEBUG_TOC;
 3575: 		}
 3576: 		else
 3577: 		{
 3578: 		  unless (/^\@\w*heading/)
 3579: 		  {
 3580: 		    unless (/^\@unnumbered/)
 3581: 		    {
 3582: 		      my $number = &update_sec_num($tag, $level);
 3583: 		      $name = $number. ' ' . $name if $T2H_NUMBER_SECTIONS;
 3584: 		      $sec2number{$name} = $number;
 3585: 		      $number2sec{$number} = $name;
 3586: 		    }
 3587: 		    if (defined($toplevel))
 3588: 		    {
 3589: 		      push @lines, ($level==$toplevel ? $CHAPTEREND : $SECTIONEND);
 3590: 		    }
 3591: 		    else
 3592: 		    {
 3593: 		      # first time we see a "section"
 3594: 		      unless ($level == 1) 
 3595: 		      {
 3596: 			warn "$WARN The first section found is not of level 1: $_";
 3597: 		      }
 3598: 		      $toplevel = $level;
 3599: 		    }
 3600: 		    push(@sections, $name);
 3601: 		    next_doc() if ($T2H_SPLIT eq 'section' ||
 3602: 				   $T2H_SPLIT && $level == $toplevel);
 3603: 		  }
 3604: 		  $sec_num++;
 3605: 		  $docid = "SEC$sec_num";
 3606: 		  $tocid = (/^\@\w*heading/ ? undef : "TOC$sec_num");
 3607: 		  # check biblio and glossary
 3608: 		  $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i);
 3609: 		  $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i);
 3610: 		  # check node
 3611: 		  if ($node)
 3612: 		  {
 3613: 		    warn "$ERROR Duplicate node found: $node\n"
 3614: 		      if ($node2sec{$node});
 3615: 		  }
 3616: 		  else
 3617: 		  {
 3618: 		    $name .= ' ' while ($node2sec{$name});
 3619: 		    $node = $name;
 3620: 		  }
 3621: 		  $name .= ' ' while ($sec2node{$name});
 3622: 		  $section = $name; 
 3623: 		  $node2sec{$node} = $name;
 3624: 		  $sec2node{$name} = $node;
 3625: 		  $node2href{$node} = "$docu_doc#$docid";
 3626: 		  $node2next{$node} = $node_next;
 3627: 		  $node2prev{$node} = $node_prev;
 3628: 		  $node2up{$node} = $node_up;
 3629: 		  print "# node $node, section $name, level $level\n"
 3630: 		    if $T2H_DEBUG & $DEBUG_TOC;
 3631: 
 3632: 		  $node = '';
 3633: 		  $node_next = '';
 3634: 		  $node_prev = '';
 3635: 		  $node_next = '';
 3636: 		  if ($tocid)
 3637: 		  {
 3638: 		    # update TOC
 3639: 		    while ($level > $curlevel) {
 3640: 		      $curlevel++;
 3641: 		      push(@toc_lines, "<UL>\n");
 3642: 		    }
 3643: 		    while ($level < $curlevel) {
 3644: 		      $curlevel--;
 3645: 		      push(@toc_lines, "</UL>\n");
 3646: 		    }
 3647: 		    $_ = &t2h_anchor($tocid, "$docu_doc#$docid", $name, 1);
 3648: 		    $_ = &substitute_style($_);
 3649: 		    push(@stoc_lines, "$_<BR>\n") if ($level == 1);
 3650: 		    if ($T2H_NUMBER_SECTIONS)
 3651: 		    {
 3652: 		      push(@toc_lines, $_ . "<BR>\n")
 3653: 		    }
 3654: 		    else
 3655: 		    {
 3656: 		      push(@toc_lines, "<LI>" . $_ ."</LI>");
 3657: 		    }
 3658: 		  }
 3659: 		  else
 3660: 		  {
 3661: 		    push(@lines, &html_debug("<A NAME=\"$docid\"></A>\n", 
 3662: 					   __LINE__));
 3663: 		  }
 3664: 		  # update DOC
 3665: 		  push(@lines, &html_debug('', __LINE__));
 3666: 		  &html_reset;
 3667: 		  $_ =  "<H$level> $name </H$level>\n<!--docid::${docid}::-->\n";
 3668: 		  $_ = &debug($_, __LINE__);
 3669: 		  push(@lines, &html_debug('', __LINE__));
 3670: 		}
 3671: 		# update DOC
 3672: 		foreach $line (split(/\n+/, $_)) {
 3673: 		    push(@lines, "$line\n");
 3674: 		}
 3675: 		next;
 3676: 	    } else {
 3677: 		warn "$ERROR Bad section line: $_";
 3678: 	    }
 3679: 	} else {
 3680: 	    # track variables
 3681: 	    $value{$1} = Unprotect_texi($2), next if /^\@set\s+($VARRE)\s+(.*)$/o;
 3682: 	    delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o;
 3683: 	    # store things
 3684: 	    $value{'_shorttitle'} = Unprotect_texi($1), next if /^\@shorttitle\s+(.*)$/;
 3685: 	    $value{'_setfilename'}   = Unprotect_texi($1), next if /^\@setfilename\s+(.*)$/;
 3686: 	    $value{'_settitle'}      = Unprotect_texi($1), next if /^\@settitle\s+(.*)$/;
 3687: 	    $value{'_author'}   .= Unprotect_texi($1)."\n", next if /^\@author\s+(.*)$/;
 3688: 	    $value{'_subtitle'} .= Unprotect_texi($1)."\n", next if /^\@subtitle\s+(.*)$/;
 3689: 	    $value{'_title'}    .= Unprotect_texi($1)."\n", next if /^\@title\s+(.*)$/;
 3690: 
 3691: 	    # list item
 3692: 	    if (/^\s*\@itemx?\s+/) {
 3693: 		$what = $';
 3694: 		$what =~ s/\s+$//;
 3695: 		if ($in_bibliography && $use_bibliography) {
 3696: 		    if ($what =~ /^$BIBRE$/o) {
 3697: 			$id = 'BIB' . ++$bib_num;
 3698: 			$bib2href{$what} = "$docu_doc#$id";
 3699: 			print "# found bibliography for '$what' id $id\n"
 3700: 			    if $T2H_DEBUG & $DEBUG_BIB;
 3701: 			$what = &t2h_anchor($id, '', $what);
 3702: 		    }
 3703: 		} elsif ($in_glossary && $T2H_USE_GLOSSARY) {
 3704: 		    $id = 'GLOSS' . ++$gloss_num;
 3705: 		    $entry = $what;
 3706: 		    $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
 3707: 		    $gloss2href{$entry} = "$docu_doc#$id";
 3708: 		    print "# found glossary for '$entry' id $id\n"
 3709: 			if $T2H_DEBUG & $DEBUG_GLOSS;
 3710: 		    $what = &t2h_anchor($id, '', $what);
 3711: 		}
 3712: 		elsif ($in_table && ($table_type eq 'f' || $table_type eq 'v'))
 3713: 		{
 3714: 		  EnterIndexEntry($table_type, $what, $docu_doc, $section, \@lines);
 3715: 		}
 3716: 		&html_pop_if('P');
 3717: 		if ($html_element eq 'DL' || $html_element eq 'DD') {
 3718: 		    if ($things_map{$in_table} && !$what) {
 3719: 			# special case to allow @table @bullet for instance
 3720: 			push(@lines, &debug("<DT>$things_map{$in_table}\n", __LINE__));
 3721: 		    } else {
 3722: 			push(@lines, &debug("<DT>\@$in_table\{$what\}\n", __LINE__));
 3723: 		    }
 3724: 		    push(@lines, "<DD>");
 3725: 		    &html_push('DD') unless $html_element eq 'DD';
 3726: 		    if ($table_type) { # add also an index
 3727: 			unshift(@input_spool, "\@${table_type}index $what\n");
 3728: 		    }
 3729: 		} elsif ($html_element eq 'TABLE') {
 3730: 		    push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
 3731: 		    &html_push('TR');
 3732: 		} elsif ($html_element eq 'TR') {
 3733: 		    push(@lines, &debug("</TR>\n", __LINE__));
 3734: 		    push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
 3735: 		} else {
 3736: 		    push(@lines, &debug("<LI>$what\n", __LINE__));
 3737: 		    &html_push('LI') unless $html_element eq 'LI';
 3738: 		}
 3739: 		push(@lines, &html_debug('', __LINE__));
 3740: 		if ($deferred_ref) {
 3741: 		    push(@lines, &debug("$deferred_ref\n", __LINE__));
 3742: 		    $deferred_ref = '';
 3743: 		}
 3744: 		next;
 3745: 	    } elsif (/^\@tab\s+(.*)$/) {
 3746: 		push(@lines, "<TD>$1</TD>\n");
 3747: 		next;
 3748: 	    }
 3749: 	}
 3750:     }
 3751:     # paragraph separator
 3752:     if ($_ eq "\n" && ! $in_pre) {
 3753: 	next if $#lines >= 0 && $lines[$#lines] eq "\n";
 3754: 	if ($html_element eq 'P') {
 3755: 	    push (@lines, &debug("</P><P>\n", __LINE__));
 3756: 	}
 3757: # 	else
 3758: # 	{
 3759: # 	  push(@lines, "<P></P>\n");
 3760: # 	  $_ = &debug("<P></P>\n", __LINE__);
 3761: # 	}
 3762:         elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE' || $html_element eq 'DD' || $html_element eq 'LI') 
 3763: 	{
 3764: 	  &html_push('P');
 3765: 	  push(@lines, &debug("<P>\n", __LINE__));
 3766: 	}
 3767:       }
 3768:     # otherwise
 3769:     push(@lines, $_) unless $in_titlepage;
 3770:     push(@lines, &debug("</center>\n", __LINE__))  if ($tag eq 'center');
 3771: }
 3772: 
 3773: # finish TOC
 3774: $level = 0;
 3775: while ($level < $curlevel) {
 3776:     $curlevel--;
 3777:     push(@toc_lines, "</UL>\n");
 3778: }
 3779: 
 3780: print "# end of pass 1\n" if $T2H_VERBOSE;
 3781: 
 3782: SetDocumentLanguage('en') unless ($T2H_LANG);
 3783: #+++############################################################################
 3784: #                                                                              #
 3785: # Stuff related to Index generation                                            #
 3786: #                                                                              #
 3787: #---############################################################################
 3788: 
 3789: sub EnterIndexEntry
 3790: {
 3791:   my $prefix = shift;
 3792:   my $key = shift;
 3793:   my $docu_doc = shift;
 3794:   my $section = shift;
 3795:   my $lines = shift;
 3796:   local $_;
 3797: 
 3798:   warn "$ERROR Undefined index command: $_", next
 3799:     unless (exists ($index_properties->{$prefix}));
 3800:   $key =~ s/\s+$//;
 3801:   $_ = $key;
 3802:   &protect_texi;
 3803:   $key = $_;
 3804:   $_ = &protect_html($_);
 3805:   my $html_key = substitute_style($_);
 3806:   my $id;
 3807:   $key = remove_style($key);
 3808:   $key = remove_things($key);
 3809:   $_ = $key;
 3810:   &unprotect_texi;
 3811:   $key = $_;
 3812:   while (exists $index->{$prefix}->{$key}) {$key .= ' '};
 3813:   if ($lines->[$#lines] =~ /^<!--docid::(.+)::-->$/)
 3814:   {
 3815:     $id = $1;
 3816:   }
 3817:   else
 3818:   {
 3819:     $id = 'IDX' . ++$idx_num;
 3820:     push(@$lines, &t2h_anchor($id, '', $T2H_INVISIBLE_MARK, !$in_pre));
 3821:   }
 3822:   $index->{$prefix}->{$key}->{html_key} = $html_key;
 3823:   $index->{$prefix}->{$key}->{section} = $section;
 3824:   $index->{$prefix}->{$key}->{href} = "$docu_doc#$id";
 3825:   print "# found ${prefix}index  for '$key' with id $id\n"
 3826:     if $T2H_DEBUG & $DEBUG_INDEX;
 3827: }
 3828: 
 3829: sub IndexName2Prefix
 3830: {
 3831:   my $name = shift;
 3832:   my $prefix;
 3833: 
 3834:   for $prefix (keys %$index_properties)
 3835:   {
 3836:     return $prefix if ($index_properties->{$prefix}->{name} eq $name);
 3837:   }
 3838:   return undef;
 3839: }
 3840: 
 3841: sub GetIndexEntries
 3842: {
 3843:   my $normal = shift;
 3844:   my $code = shift;
 3845:   my ($entries, $prefix, $key) = ({});
 3846:   
 3847:   for $prefix (keys %$normal)
 3848:   {
 3849:     for $key (keys %{$index->{$prefix}})
 3850:     {
 3851:       $entries->{$key} = {%{$index->{$prefix}->{$key}}};
 3852:     }
 3853:   }
 3854: 
 3855:   if (defined($code))
 3856:   {
 3857:     for $prefix (keys %$code)
 3858:     {
 3859:       unless (exists $normal->{$keys})
 3860:       {
 3861: 	for $key (keys %{$index->{$prefix}})
 3862: 	{
 3863: 	  $entries->{$key} = {%{$index->{$prefix}->{$key}}};
 3864: 	  $entries->{$key}->{html_key} = "<CODE>$entries->{$key}->{html_key}</CODE>";
 3865: 	}
 3866:       }
 3867:     }
 3868:   }
 3869:   return $entries;
 3870: }
 3871: 
 3872: sub byAlpha
 3873: {
 3874:   if ($a =~ /^[A-Za-z]/)
 3875:   {
 3876:     if ($b =~ /^[A-Za-z]/)
 3877:     {
 3878:       return lc($a) cmp lc($b);
 3879:     }
 3880:     else
 3881:     {
 3882:       return 1;
 3883:     }
 3884:   }
 3885:   elsif ($b =~ /^[A-Za-z]/)
 3886:   {
 3887:     return -1;
 3888:   }
 3889:   else
 3890:   {
 3891:     return lc($a) cmp lc($b);
 3892:   } 
 3893: }
 3894: 
 3895: sub GetIndexPages
 3896: {
 3897:   my $entries = shift;
 3898:   my (@Letters, $key);
 3899:   my ($EntriesByLetter, $Pages, $page) = ({}, [], {});
 3900:   my @keys = sort byAlpha keys %$entries;
 3901: 
 3902:   for $key (@keys)
 3903:   {
 3904:     push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key};
 3905:   }
 3906:   @Letters = sort byAlpha keys %$EntriesByLetter;
 3907:   
 3908:   $T2H_SPLIT_INDEX = 0 unless ($T2H_SPLIT);
 3909: 
 3910:   unless ($T2H_SPLIT_INDEX)
 3911:   {
 3912:     $page->{First} = $Letters[0];
 3913:     $page->{Last} = $Letters[$#Letters];
 3914:     $page->{Letters} = \@Letters;
 3915:     $page->{EntriesByLetter} = $EntriesByLetter;
 3916:     push @$Pages, $page;
 3917:     return $Pages;
 3918:   }
 3919: 
 3920:   if ($T2H_SPLIT_INDEX =~ /^\d+$/)
 3921:   {
 3922:     my $i = 0;
 3923:     my ($prev_letter, $letter);
 3924:     $page->{First} = $Letters[0];
 3925:     for $letter (@Letters)
 3926:     {
 3927:       if ($i > $T2H_SPLIT_INDEX)
 3928:       {
 3929: 	$page->{Last} = $prev_letter;
 3930: 	push @$Pages, {%$page};
 3931: 	$page->{Letters} = [];
 3932: 	$page->{EntriesByLetter} = {};
 3933: 	$page->{First} = $letter;
 3934: 	$i=0;
 3935:       }
 3936:       push @{$page->{Letters}}, $letter;
 3937:       $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}];
 3938:       $i += scalar(@{$EntriesByLetter->{$letter}});
 3939:       $prev_letter = $letter;
 3940:     }
 3941:     $page->{Last} = $Letters[$#Letters];
 3942:     push @$Pages, {%$page};
 3943:   }
 3944:   return $Pages;
 3945: }
 3946: 
 3947: sub GetIndexSummary
 3948: {
 3949:   my $first_page = shift;
 3950:   my $Pages = shift;
 3951:   my $name = shift;
 3952:   my ($page, $letter, $summary, $i, $l1, $l2, $l);
 3953: 
 3954:   $i = 0;
 3955:   $summary = '<table><tr><th valign=top>Jump to: &nbsp; </th><td>';
 3956:   
 3957:   for $page ($first_page, @$Pages)
 3958:   {
 3959:     for $letter (@{$page->{Letters}})
 3960:     {
 3961:       $l = t2h_anchor('', "$page->{href}#${name}_$letter", "<b>$letter</b>", 
 3962: 		      0, 'style="text-decoration:none"') . "\n &nbsp; \n";
 3963:       
 3964:       if ($letter =~ /^[A-Za-z]/)
 3965:       {
 3966: 	$l2 .= $l;
 3967:       }
 3968:       else
 3969:       {
 3970: 	$l1 .= $l;
 3971:       }
 3972:     }
 3973:   }
 3974:   $summary .= $l1 . "<BR>\n" if ($l1);
 3975:   $summary .= $l2 . '</td></tr></table><br>';
 3976:   return $summary;
 3977: }
 3978: 
 3979: sub PrintIndexPage
 3980: {
 3981:   my $lines = shift;
 3982:   my $summary = shift;
 3983:   my $page = shift;
 3984:   my $name = shift;
 3985: 
 3986:   push @$lines, $summary;
 3987: 
 3988:   push @$lines , <<EOT;
 3989: <P></P>
 3990: <TABLE border=0>
 3991: <TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
 3992: <TR><TD COLSPAN=3> <HR></TD></TR>
 3993: EOT
 3994: 
 3995:   for $letter (@{$page->{Letters}})
 3996:   {
 3997:     push @$lines, "<TR><TH><A NAME=\"${name}_$letter\"></A>$letter</TH><TD></TD><TD></TD></TR>\n";
 3998:     for $entry (@{$page->{EntriesByLetter}->{$letter}})
 3999:     {
 4000:       push @$lines, 
 4001:       "<TR><TD></TD><TD valign=top>" . 
 4002: 	t2h_anchor('', $entry->{href}, $entry->{html_key}) .
 4003: 	  "</TD><TD valign=top>" . 
 4004: 	    t2h_anchor('', sec_href($entry->{section}), clean_name($entry->{section})) .
 4005: 	      "</TD></TR>\n";
 4006:     }
 4007:     push @$lines, "<TR><TD COLSPAN=3> <HR></TD></TR>\n";
 4008:   }
 4009:   push @$lines, "</TABLE><P></P>";
 4010:   push @$lines, $summary;
 4011: }
 4012: 
 4013: sub PrintIndex
 4014: {
 4015:   my $lines = shift;
 4016:   my $name = shift;
 4017:   my $section = shift;
 4018:   $section = 'Top' unless $section;
 4019:   my $prefix = IndexName2Prefix($name);
 4020: 
 4021:   warn ("$ERROR printindex: bad index name: $name"), return 
 4022:     unless $prefix;
 4023: 
 4024:   if ($index_properties->{$prefix}->{code})
 4025:   {
 4026:     $index_properties->{$prefix}->{from_code}->{$prefix} = 1;
 4027:   }
 4028:   else
 4029:   {
 4030:     $index_properties->{$prefix}->{from}->{$prefix}= 1;
 4031:   }
 4032: 
 4033:   my $Entries = GetIndexEntries($index_properties->{$prefix}->{from}, 
 4034: 				$index_properties->{$prefix}->{from_code});
 4035:   return unless %$Entries;
 4036: 
 4037:   if ($T2H_IDX_SUMMARY)
 4038:   {
 4039:     my $key;
 4040:     open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx")
 4041:       || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n";
 4042:     print "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE;
 4043: 
 4044:     for $key (sort keys %$Entries)
 4045:     {
 4046:       print FHIDX "$key\t$Entries->{$key}->{href}\n";
 4047:     }
 4048:   }
 4049: 
 4050:   my $Pages = GetIndexPages($Entries);
 4051:   my $page;
 4052:   my $first_page = shift @$Pages;
 4053:   my $sec_name = $section;
 4054:   # remove section number
 4055:   $sec_name =~ s/.*? // if $sec_name =~ /^([A-Z]|\d+)\./;
 4056: 
 4057:   ($first_page->{href} = sec_href($section)) =~ s/\#.*$//;
 4058:   # Update tree structure of document
 4059:   if (@$Pages)
 4060:   {
 4061:     my $sec;
 4062:     my @after;
 4063: 
 4064:     while (@sections && $sections[$#sections] ne $section)
 4065:     {
 4066:       unshift @after, pop @sections;
 4067:     }
 4068: 
 4069:     for $page (@$Pages)
 4070:     {
 4071:       my $node = ($page->{First} ne $page->{Last} ? 
 4072: 		  "$sec_name: $page->{First} -- $page->{Last}" :
 4073: 		  "$sec_name: $page->{First}");
 4074:       push @sections, $node;
 4075:       $node2sec{$node} = $node;
 4076:       $sec2node{$node} = $node;
 4077:       $node2up{$node} = $section;
 4078:       $page->{href} = next_doc();
 4079:       $page->{name} = $node;
 4080:       $node2href{$node} = $page->{href};
 4081:       if ($prev_node)
 4082:       {
 4083: 	$node2next{$prev_node} = $node;
 4084: 	$node2prev{$node} = $prev_node;
 4085:       }
 4086:       $prev_node = $node;
 4087:     }
 4088:     push @sections, @after;
 4089:   }
 4090: 
 4091:   my $summary = GetIndexSummary($first_page, $Pages, $name);
 4092:   PrintIndexPage($lines, $summary, $first_page, $name);
 4093:   for $page (@$Pages)
 4094:   {
 4095:     push @$lines, ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
 4096:     push @$lines, "<H2 ALIGN=\"Left\">$page->{name}</H2>\n";
 4097:     PrintIndexPage($lines, $summary, $page, $name);
 4098:   }
 4099: }
 4100: 
 4101: 
 4102: #+++############################################################################
 4103: #                                                                              #
 4104: # Pass 2/3: handle style, menu, index, cross-reference                         #
 4105: #                                                                              #
 4106: #---############################################################################
 4107: 
 4108: @lines2 = ();				# whole document (2nd pass)
 4109: @lines3 = ();				# whole document (3rd pass)
 4110: $in_menu = 0;				# am I inside a menu
 4111: 
 4112: while (@lines) {
 4113:     $_ = shift(@lines);
 4114:     #
 4115:     # special case (protected sections)
 4116:     #
 4117:     if (/^$PROTECTTAG/o) {
 4118: 	push(@lines2, $_);
 4119: 	next;
 4120:     }
 4121:     #
 4122:     # menu
 4123:     #
 4124:     if (/^\@menu\b/)
 4125:     {
 4126:       $in_menu = 1;
 4127:       $in_menu_listing = 1;
 4128:       push(@lines2, &debug("<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> \n", __LINE__));
 4129:       next;
 4130:     }
 4131:     if (/^\@end\s+menu\b/)
 4132:     {
 4133:       if ($in_menu_listing)
 4134:       {
 4135: 	push(@lines2, &debug("</TABLE></BLOCKQUOTE>\n", __LINE__));
 4136:       }
 4137:       else
 4138:       {
 4139: 	push(@lines2, &debug("</BLOCKQUOTE>\n", __LINE__));
 4140:       }
 4141:       $in_menu = 0;
 4142:       $in_menu_listing = 0;
 4143:       next;
 4144:     }
 4145:     if ($in_menu) 
 4146:     {
 4147:       my ($node, $name, $descr);
 4148:       if (/^\*\s+($NODERE)::/o)
 4149:       {
 4150: 	$node = $1;
 4151: 	$descr = $';
 4152:       }
 4153:       elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/)
 4154:       {
 4155: 	$name = $1;
 4156: 	$node = $2;
 4157: 	$descr = $';
 4158:       }
 4159:       elsif (/^\*/) 
 4160:       {
 4161: 	warn "$ERROR Bad menu line: $_";
 4162:       }
 4163:       else
 4164:       {
 4165: 	if ($in_menu_listing)
 4166: 	{
 4167: 	  $in_menu_listing = 0;
 4168: 	  push(@lines2, &debug("</TABLE>\n", __LINE__));
 4169: 	}
 4170: 	# should be like verbatim -- preseve spaces, etc
 4171: 	s/ /\&nbsp;/g;
 4172: 	$_ .= "<br>\n";
 4173: 	push(@lines2, $_);
 4174:       }
 4175:       if ($node)
 4176:       {
 4177: 	if (! $in_menu_listing)
 4178: 	{
 4179: 	  $in_menu_listing = 1;
 4180: 	  push(@lines2, &debug("<TABLE BORDER=0 CELLSPACING=0>\n", __LINE__));
 4181: 	}
 4182: 	# look for continuation
 4183: 	while ($lines[0] =~ /^\s+\w+/)
 4184: 	{
 4185: 	  $descr .= shift(@lines);
 4186: 	}
 4187: 	&menu_entry($node, $name, $descr);
 4188:       } 
 4189:       next;
 4190:     }
 4191:     #
 4192:     # printindex
 4193:     #
 4194:     PrintIndex(\@lines2, $2, $1), next
 4195:       if (/^<!--::(.*)::-->\@printindex\s+(\w+)/);
 4196:     #
 4197:     # simple style substitutions
 4198:     #
 4199:     $_ = &substitute_style($_);
 4200:     #
 4201:     # xref
 4202:     #
 4203:     while (/\@(x|px|info|)ref{([^{}]+)(}?)/) {
 4204: 	# note: Texinfo may accept other characters
 4205: 	($type, $nodes, $full) = ($1, $2, $3);
 4206: 	($before, $after) = ($`, $');
 4207: 	if (! $full && $after) {
 4208: 	    warn "$ERROR Bad xref (no ending } on line): $_";
 4209: 	    $_ = "$before$;0${type}ref\{$nodes$after";
 4210: 	    next; # while xref
 4211: 	}
 4212: 	if ($type eq 'x') {
 4213: 	    $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} ";
 4214: 	} elsif ($type eq 'px') {
 4215: 	    $type = "$T2H_WORDS->{$T2H_LANG}->{'see'} ";
 4216: 	} elsif ($type eq 'info') {
 4217: 	    $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} Info";
 4218: 	} else {
 4219: 	    $type = '';
 4220: 	}
 4221: 	unless ($full) {
 4222: 	    $next = shift(@lines);
 4223: 	    $next = &substitute_style($next);
 4224: 	    chop($nodes); # remove final newline
 4225: 	    if ($next =~ /\}/) { # split on 2 lines
 4226: 		$nodes .= " $`";
 4227: 		$after = $';
 4228: 	    } else {
 4229: 		$nodes .= " $next";
 4230: 		$next = shift(@lines);
 4231: 		$next = &substitute_style($next);
 4232: 		chop($nodes);
 4233: 		if ($next =~ /\}/) { # split on 3 lines
 4234: 		    $nodes .= " $`";
 4235: 		    $after = $';
 4236: 		} else {
 4237: 		    warn "$ERROR Bad xref (no ending }): $_";
 4238: 		    $_ = "$before$;0xref\{$nodes$after";
 4239: 		    unshift(@lines, $next);
 4240: 		    next; # while xref
 4241: 		}
 4242: 	    }
 4243: 	}
 4244: 	$nodes =~ s/\s+/ /g; # remove useless spaces
 4245: 	@args = split(/\s*,\s*/, $nodes);
 4246: 	$node = $args[0]; # the node is always the first arg
 4247: 	$node = &normalise_node($node);
 4248: 	$sec = $args[2] || $args[1] || $node2sec{$node};
 4249: 	$href = $node2href{$node};
 4250: 	if (@args == 5) { # reference to another manual
 4251: 	    $sec = $args[2] || $node;
 4252: 	    $man = $args[4] || $args[3];
 4253: 	    $_ = "${before}${type}$T2H_WORDS->{$T2H_LANG}->{'section'} `$sec' in \@cite{$man}$after";
 4254: 	} elsif ($type =~ /Info/) { # inforef
 4255: 	    warn "$ERROR Wrong number of arguments: $_" unless @args == 3;
 4256: 	    ($nn, $_, $in) = @args;
 4257: 	    $_ = "${before}${type} file `$in', node `$nn'$after";
 4258: 	} elsif ($sec && $href && ! $T2H_SHORT_REF) {
 4259: 	    $_  = "${before}${type}";
 4260: 	    $_ .= "$T2H_WORDS->{$T2H_LANG}->{'section'} " if ${type};
 4261: 	    $_ .= &t2h_anchor('', $href, $sec) . $after;
 4262: 	} 
 4263: 	elsif ($href)
 4264: 	{
 4265: 	  $_ = "${before}${type} " . 
 4266: 	    &t2h_anchor('', $href, $args[2] || $args[1] || $node) . 
 4267: 	      $after;
 4268: 	}
 4269: 	else {
 4270: 	    warn "$ERROR Undefined node ($node): $_";
 4271: 	    $_ = "$before$;0xref{$nodes}$after";
 4272: 	}
 4273:     }
 4274: 
 4275:     # replace images
 4276:     s[\@image\s*{(.+?)}]
 4277:     {
 4278:      my @args = split (/\s*,\s*/, $1);
 4279:      my $base = $args[0];
 4280:      my $image = 
 4281:        LocateIncludeFile("$base.png") || 
 4282:        LocateIncludeFile("$base.jpg") ||
 4283:        LocateIncludeFile("$base.gif");
 4284:      warn "$ERROR no image file for $base: $_" unless ($image && -e $image);
 4285:      "<IMG SRC=\"$image\" ALT=\"$base\">";
 4286:      ($T2H_CENTER_IMAGE ?
 4287:       "<CENTER><IMG SRC=\"$image\" ALT=\"$base\"></CENTER>" :
 4288:       "<IMG SRC=\"$image\" ALT=\"$base\">");
 4289:     }eg;
 4290: 
 4291:     #
 4292:     # try to guess bibliography references or glossary terms
 4293:     #
 4294:     unless (/^<H\d><A NAME=\"SEC\d/) {
 4295: 	if ($use_bibliography) {
 4296: 	    $done = '';
 4297: 	    while (/$BIBRE/o) {
 4298: 		($pre, $what, $post) = ($`, $&, $');
 4299: 		$href = $bib2href{$what};
 4300: 		if (defined($href) && $post !~ /^[^<]*<\/A>/) {
 4301: 		    $done .= $pre . &t2h_anchor('', $href, $what);
 4302: 		} else {
 4303: 		    $done .= "$pre$what";
 4304: 		}
 4305: 		$_ = $post;
 4306: 	    }
 4307: 	    $_ = $done . $_;
 4308: 	}
 4309: 	if ($T2H_USE_GLOSSARY) {
 4310: 	    $done = '';
 4311: 	    while (/\b\w+\b/) {
 4312: 		($pre, $what, $post) = ($`, $&, $');
 4313: 		$entry = $what;
 4314: 		$entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
 4315: 		$href = $gloss2href{$entry};
 4316: 		if (defined($href) && $post !~ /^[^<]*<\/A>/) {
 4317: 		    $done .= $pre . &t2h_anchor('', $href, $what);
 4318: 		} else {
 4319: 		    $done .= "$pre$what";
 4320: 		}
 4321: 		$_ = $post;
 4322: 	    }
 4323: 	    $_ = $done . $_;
 4324: 	}
 4325:     }
 4326:     # otherwise
 4327:     push(@lines2, $_);
 4328: }
 4329: print "# end of pass 2\n" if $T2H_VERBOSE;
 4330: 
 4331: #
 4332: # split style substitutions
 4333: #
 4334: while (@lines2) {
 4335:     $_ = shift(@lines2);
 4336:     #
 4337:     # special case (protected sections)
 4338:     #
 4339:     if (/^$PROTECTTAG/o) {
 4340: 	push(@lines3, $_);
 4341: 	next;
 4342:     }
 4343:     #
 4344:     # split style substitutions
 4345:     #
 4346:     $old = '';
 4347:     while ($old ne $_) {
 4348:         $old = $_;
 4349: 	if (/\@(\w+)\{/) {
 4350: 	    ($before, $style, $after) = ($`, $1, $');
 4351: 	    if (defined($style_map{$style})) {
 4352: 		$_ = $after;
 4353: 		$text = '';
 4354: 		$after = '';
 4355: 		$failed = 1;
 4356: 		while (@lines2) {
 4357: 		    if (/\}/) {
 4358: 			$text .= $`;
 4359: 			$after = $';
 4360: 			$failed = 0;
 4361: 			last;
 4362: 		    } else {
 4363: 			$text .= $_;
 4364: 			$_ = shift(@lines2);
 4365: 		    }
 4366: 		}
 4367: 		if ($failed) {
 4368: 		    die "* Bad syntax (\@$style) after: $before\n";
 4369: 		} else {
 4370: 		    $text = &apply_style($style, $text);
 4371: 		    $_ = "$before$text$after";
 4372: 		}
 4373: 	    }
 4374: 	}
 4375:     }
 4376:     # otherwise
 4377:     push(@lines3, $_);
 4378: }
 4379: print "# end of pass 3\n" if $T2H_VERBOSE;
 4380: 	
 4381: #+++############################################################################
 4382: #                                                                              #
 4383: # Pass 4: foot notes, final cleanup                                            #
 4384: #                                                                              #
 4385: #---############################################################################
 4386: 
 4387: @foot_lines = ();			# footnotes
 4388: @doc_lines = ();			# final document
 4389: $end_of_para = 0;			# true if last line is <P>
 4390: 	
 4391: while (@lines3) {
 4392:     $_ = shift(@lines3);
 4393:     #
 4394:     # special case (protected sections)
 4395:     #
 4396:     if (/^$PROTECTTAG/o) {
 4397: 	push(@doc_lines, $_);
 4398: 	$end_of_para = 0;
 4399: 	next;
 4400:     }
 4401:     #
 4402:     # footnotes
 4403:     #
 4404:     while (/\@footnote([^\{\s]+)\{/) {
 4405: 	($before, $d, $after) = ($`, $1, $');
 4406: 	$_ = $after;
 4407: 	$text = '';
 4408: 	$after = '';
 4409: 	$failed = 1;
 4410: 	while (@lines3) {
 4411: 	    if (/\}/) {
 4412: 		$text .= $`;
 4413: 		$after = $';
 4414: 		$failed = 0;
 4415: 		last;
 4416: 	    } else {
 4417: 		$text .= $_;
 4418: 		$_ = shift(@lines3);
 4419: 	    }
 4420: 	}
 4421: 	if ($failed) {
 4422: 	    die "* Bad syntax (\@footnote) after: $before\n";
 4423: 	} else {
 4424: 	    $foot_num++;
 4425: 	    $docid  = "DOCF$foot_num";
 4426: 	    $footid = "FOOT$foot_num";
 4427: 	    $foot = "($foot_num)";
 4428: 	    push(@foot_lines, "<H3>" . &t2h_anchor($footid, "$d#$docid", $foot) . "</H3>\n");
 4429: 	    $text = "<P>$text" unless $text =~ /^\s*<P>/;
 4430: 	    push(@foot_lines, "$text\n");
 4431: 	    $_ = $before . &t2h_anchor($docid, "$docu_foot#$footid", $foot) . $after;
 4432: 	}
 4433:     }
 4434:     #
 4435:     # remove unnecessary <P>
 4436:     #
 4437:     if (/^\s*<P>\s*$/) {
 4438: 	next if $end_of_para++;
 4439:     } else {
 4440: 	$end_of_para = 0;
 4441:     }
 4442:     # otherwise
 4443:     push(@doc_lines, $_);
 4444: }
 4445: 	
 4446: print "# end of pass 4\n" if $T2H_VERBOSE;
 4447: 
 4448: #+++############################################################################
 4449: #                                                                              #
 4450: # Pass 5: print things                                                         #
 4451: #                                                                              #
 4452: #---############################################################################
 4453: 
 4454: $T2H_L2H = &l2h_FinishToLatex if ($T2H_L2H);
 4455: $T2H_L2H = &l2h_ToHtml        if ($T2H_L2H);
 4456: $T2H_L2H = &l2h_InitFromHtml  if ($T2H_L2H);
 4457: 
 4458: # fix node2up, node2prev, node2next, if desired
 4459: if ($has_top_command)
 4460: {
 4461:   for $section (keys %sec2number)
 4462:   {
 4463:     $node = $sec2node{$section};
 4464:     $node2up{$node} = Sec2UpNode($section) unless $node2up{$node};
 4465:     $node2prev{$node} = Sec2PrevNode($section) unless $node2prev{$node};
 4466:     $node2next{$node} = Sec2NextNode($section) unless $node2next{$node};
 4467:   }
 4468: }
 4469: 
 4470: # prepare %T2H_THISDOC
 4471: $T2H_THISDOC{fulltitle} = $value{'_title'} || $value{'_settitle'} || "Untitled Document";
 4472: $T2H_THISDOC{title} = $value{'_settitle'} || $T2H_THISDOC{fulltitle};
 4473: $T2H_THISDOC{author} = $value{'_author'};
 4474: $T2H_THISDOC{subtitle} = $value{'_subtitle'};
 4475: $T2H_THISDOC{shorttitle} = $value{'_shorttitle'};
 4476: for $key (keys %T2H_THISDOC)
 4477: {
 4478:   $_ = &substitute_style($T2H_THISDOC{$key});
 4479:   &unprotect_texi;
 4480:   s/\s*$//;
 4481:   $T2H_THISDOC{$key} = $_;
 4482: }
 4483: 
 4484: # if no sections, then simply print document as is
 4485: unless (@sections)
 4486: {
 4487:   print "# Writing content into $docu_top_file \n" if $T2H_VERBOSE;
 4488:   open(FILE, "> $docu_top_file") 
 4489:     || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
 4490: 
 4491:   &$T2H_print_page_head(\*FILE);
 4492:   $T2H_THIS_SECTION = \@doc_lines;
 4493:   t2h_print_lines(\*FILE);
 4494:   &$T2H_print_foot_navigation(\*FILE);
 4495:   &$T2H_print_page_foot(\*FILE);
 4496:   close(FILE);
 4497:   goto Finish;
 4498: }
 4499: 
 4500: # initialize $T2H_HREF, $T2H_NAME
 4501: %T2H_HREF = 
 4502:   (
 4503:    'First' ,   sec_href($sections[0]),
 4504:    'Last',     sec_href($sections[$#sections]),
 4505:    'About',     $docu_about. '#SEC_About',
 4506:   );
 4507: 
 4508: # prepare TOC, OVERVIEW, TOP
 4509: $T2H_TOC = \@toc_lines;
 4510: $T2H_OVERVIEW = \@stoc_lines;
 4511: if ($has_top)
 4512: {
 4513:   while (1)
 4514:   {
 4515:     $_ = shift @doc_lines;
 4516:     last if /$TOPEND/;
 4517:     push @$T2H_TOP, $_;
 4518:   }
 4519:   $T2H_HREF{'Top'} = $docu_top . '#SEC_Top';
 4520: }
 4521: else
 4522: {
 4523:   $T2H_HREF{'Top'} = $T2H_HREF{First};
 4524: }
 4525: 
 4526: $node2href{Top} = $T2H_HREF{Top};
 4527: $T2H_HREF{Contents} = $docu_toc.'#SEC_Contents' if @toc_lines;
 4528: $T2H_HREF{Overview} = $docu_stoc.'#SEC_OVERVIEW' if @stoc_lines;
 4529: 
 4530: # settle on index
 4531: if ($T2H_INDEX_CHAPTER)
 4532: {
 4533:   $T2H_HREF{Index} = $node2href{normalise_node($T2H_INDEX_CHAPTER)};
 4534:   warn "$ERROR T2H_INDEX_CHAPTER '$T2H_INDEX_CHAPTER' not found\n"
 4535:     unless $T2H_HREF{Index};
 4536: }
 4537: if (! $T2H_HREF{Index} && $first_index_chapter)
 4538: {
 4539:   $T2H_INDEX_CHAPTER = $first_index_chapter;
 4540:   $T2H_HREF{Index} = $node2href{$T2H_INDEX_CHAPTER};
 4541: }
 4542: 
 4543: print "# Using '" . clean_name($T2H_INDEX_CHAPTER) . "' as index page\n"
 4544:   if ($T2H_VERBOSE && $T2H_HREF{Index});
 4545: 
 4546: %T2H_NAME =
 4547:   (
 4548:    'First',   clean_name($sec2node{$sections[0]}),
 4549:    'Last',    clean_name($sec2node{$sections[$#sections]}),
 4550:    'About',    $T2H_WORDS->{$T2H_LANG}->{'About_Title'},
 4551:    'Contents', $T2H_WORDS->{$T2H_LANG}->{'ToC_Title'},
 4552:    'Overview', $T2H_WORDS->{$T2H_LANG}->{'Overview_Title'},
 4553:    'Index' ,   clean_name($T2H_INDEX_CHAPTER),
 4554:    'Top',      clean_name($T2H_TOP_HEADING || $T2H_THISDOC{'title'} || $T2H_THISDOC{'shorttitle'}),
 4555:   );
 4556: 
 4557: #############################################################################
 4558: # print frame and frame toc file
 4559: #
 4560: if ( $T2H_FRAMES )
 4561: {
 4562:   open(FILE, "> $docu_frame_file") 
 4563:     || die "$ERROR: Can't open $docu_frame_file for writing: $!\n";
 4564:   print "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
 4565:   &$T2H_print_frame(\*FILE);
 4566:   close(FILE);
 4567: 
 4568:   open(FILE, "> $docu_toc_frame_file") 
 4569:     || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n";
 4570:   print "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
 4571:    &$T2H_print_toc_frame(\*FILE);
 4572:   close(FILE);
 4573: }
 4574: 
 4575: 
 4576: #############################################################################
 4577: # print Top
 4578: #
 4579: open(FILE, "> $docu_top_file") 
 4580:   || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
 4581: &$T2H_print_page_head(\*FILE) unless ($T2H_SPLIT);
 4582: 
 4583: if ($has_top)
 4584: {
 4585:   print "# Creating Top in $docu_top_file ...\n" if $T2H_VERBOSE;
 4586:   $T2H_THIS_SECTION = $T2H_TOP;
 4587:   $T2H_HREF{This} = $T2H_HREF{Top};
 4588:   $T2H_NAME{This} = $T2H_NAME{Top};
 4589:   &$T2H_print_Top(\*FILE);
 4590: }
 4591:   
 4592: close(FILE) if $T2H_SPLIT;
 4593: 
 4594: #############################################################################
 4595: # Print sections
 4596: #
 4597: $T2H_NODE{Forward} = $sec2node{$sections[0]};
 4598: $T2H_NAME{Forward} = &clean_name($sec2node{$sections[0]});
 4599: $T2H_HREF{Forward} = sec_href($sections[0]);
 4600: $T2H_NODE{This} = 'Top';
 4601: $T2H_NAME{This} = $T2H_NAME{Top};
 4602: $T2H_HREF{This} = $T2H_HREF{Top};
 4603: if ($T2H_SPLIT)
 4604: {
 4605:   print "# writing " . scalar(@sections) . 
 4606:     " sections in $docu_rdir$docu_name"."_[1..$doc_num]"
 4607: 	  if $T2H_VERBOSE;
 4608:   $previous = ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
 4609:   undef $FH;
 4610:   $doc_num = 0;
 4611: }
 4612: else
 4613: {
 4614:   print "# writing " . scalar(@sections) . " sections in $docu_top_file ..." 
 4615:     if $T2H_VERBOSE;
 4616:   $FH = \*FILE;
 4617:   $previous = '';
 4618: }
 4619: 
 4620: $counter = 0;
 4621: # loop through sections
 4622: while ($section = shift(@sections)) 
 4623: {
 4624:   if ($T2H_SPLIT && ($T2H_SPLIT eq 'section' || $previous eq $CHAPTEREND))
 4625:   { 
 4626:     if ($FH)
 4627:     {
 4628:       #close previous page
 4629:       &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
 4630:       &$T2H_print_page_foot($FH);
 4631:       close($FH);
 4632:       undef $FH;
 4633:     }
 4634:   }
 4635:   $T2H_NAME{Back} = $T2H_NAME{This};
 4636:   $T2H_HREF{Back} = $T2H_HREF{This};
 4637:   $T2H_NODE{Back} = $T2H_NODE{This};
 4638:   $T2H_NAME{This} = $T2H_NAME{Forward};
 4639:   $T2H_HREF{This} = $T2H_HREF{Forward};
 4640:   $T2H_NODE{This} = $T2H_NODE{Forward};
 4641:   if ($sections[0])
 4642:   {
 4643:     $T2H_NODE{Forward} = $sec2node{$sections[0]};
 4644:     $T2H_NAME{Forward} = &clean_name($T2H_NODE{Forward});
 4645:     $T2H_HREF{Forward} = sec_href($sections[0]);
 4646:   }
 4647:   else
 4648:   {
 4649:     undef $T2H_HREF{Forward}, $T2H_NODE{Forward}, $T2H_NAME{Forward};
 4650:   }
 4651: 
 4652:   $node = $node2up{$T2H_NODE{This}};
 4653:   $T2H_HREF{Up} = $node2href{$node};
 4654:   if ($T2H_HREF{Up} eq $T2H_HREF{This} || ! $T2H_HREF{Up})
 4655:   {
 4656:     $T2H_NAME{Up} = $T2H_NAME{Top};
 4657:     $T2H_HREF{Up} = $T2H_HREF{Top};
 4658:     $T2H_NODE{Up} = 'Up';
 4659:   }
 4660:   else
 4661:   {
 4662:     $T2H_NAME{Up} = &clean_name($node);
 4663:     $T2H_NODE{Up} = $node;
 4664:   }
 4665: 
 4666:   $node = $T2H_NODE{This};
 4667:   $node = $node2prev{$node};
 4668:   $T2H_NAME{Prev} = &clean_name($node);
 4669:   $T2H_HREF{Prev} = $node2href{$node};
 4670:   $T2H_NODE{Prev} = $node;
 4671: 
 4672:   $node = $T2H_NODE{This};
 4673:   if ($node2up{$node} && $node2up{$node} ne 'Top'&&
 4674:       ($node2prev{$node} eq $T2H_NODE{Back} || ! $node2prev{$node}))
 4675:   {
 4676:     $node = $node2up{$node};
 4677:     while ($node && $node ne $node2up{$node} && ! $node2prev{$node})
 4678:     {
 4679:       $node = $node2up{$node};
 4680:     }
 4681:     $node = $node2prev{$node} 
 4682:       unless $node2up{$node} eq 'Top' || ! $node2up{$node};
 4683:   }
 4684:   else
 4685:   {
 4686:     $node = $node2prev{$node};
 4687:   }
 4688:   $T2H_NAME{FastBack} = &clean_name($node);
 4689:   $T2H_HREF{FastBack} = $node2href{$node};
 4690:   $T2H_NODE{FastBack} = $node;
 4691:   
 4692:   $node = $T2H_NODE{This};
 4693:   $node = $node2next{$node};
 4694:   $T2H_NAME{Next} = &clean_name($node);
 4695:   $T2H_HREF{Next} = $node2href{$node};
 4696:   $T2H_NODE{Next} = $node;
 4697: 
 4698:   $node = $T2H_NODE{This};
 4699:   if ($node2up{$node} && $node2up{$node} ne 'Top'&& 
 4700:       ($node2next{$node} eq $T2H_NODE{Forward} || ! $node2next{$node}))
 4701:   {
 4702:     $node = $node2up{$node};
 4703:     while ($node && $node ne $node2up{$node} && ! $node2next{$node})
 4704:     {
 4705:       $node = $node2up{$node};
 4706:     }
 4707:   }
 4708:   $node = $node2next{$node};
 4709:   $T2H_NAME{FastForward} = &clean_name($node);
 4710:   $T2H_HREF{FastForward} = $node2href{$node};
 4711:   $T2H_NODE{FastForward} = $node;
 4712: 
 4713:   if (! defined($FH))
 4714:   {
 4715:     my $file = $T2H_HREF{This};
 4716:     $file =~ s/\#.*$//;
 4717:     open(FILE, "> $docu_rdir$file") || 
 4718:       die "$ERROR: Can't open $docu_rdir$file for writing: $!\n";
 4719:     $FH = \*FILE;
 4720:     &$T2H_print_page_head($FH);
 4721:     t2h_print_label($FH);
 4722:     &$T2H_print_chapter_header($FH) if $T2H_SPLIT eq 'chapter';
 4723:   }
 4724:   else
 4725:   {
 4726:     t2h_print_label($FH);
 4727:   }
 4728: 
 4729:   $T2H_THIS_SECTION = [];
 4730:   while (@doc_lines) {
 4731:     $_ = shift(@doc_lines);
 4732:     last if ($_ eq $SECTIONEND || $_ eq $CHAPTEREND);
 4733:     push(@$T2H_THIS_SECTION, $_);
 4734:   }
 4735:   $previous = $_;
 4736:   &$T2H_print_section($FH);
 4737: 
 4738:   if ($T2H_VERBOSE)
 4739:   {
 4740:     $counter++;
 4741:     print "." if $counter =~ /00$/;
 4742:   }
 4743: }
 4744: if ($T2H_SPLIT)
 4745: {
 4746:   &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
 4747:   &$T2H_print_page_foot($FH);
 4748:   close($FH);
 4749: }
 4750: print "\n" if $T2H_VERBOSE;
 4751: 
 4752: #############################################################################
 4753: # Print ToC, Overview, Footnotes
 4754: #
 4755: undef $T2H_HREF{Prev};
 4756: undef $T2H_HREF{Next};
 4757: undef $T2H_HREF{Back};
 4758: undef $T2H_HREF{Forward};
 4759: undef $T2H_HREF{Up};
 4760: 
 4761: if (@foot_lines)
 4762: {
 4763:   print "# writing Footnotes in $docu_foot_file...\n" if $T2H_VERBOSE;
 4764:   open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n"
 4765:       if $T2H_SPLIT;
 4766:   $T2H_HREF{This} = $docu_foot;
 4767:   $T2H_NAME{This} = $T2H_WORDS->{$T2H_LANG}->{'Footnotes_Title'};
 4768:   $T2H_THIS_SECTION = \@foot_lines;
 4769:   &$T2H_print_Footnotes(\*FILE);
 4770:   close(FILE) if $T2H_SPLIT;
 4771: }
 4772: 
 4773: if (@toc_lines)
 4774: {
 4775:   print "# writing Toc in $docu_toc_file...\n" if $T2H_VERBOSE;
 4776:   open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n"
 4777:       if $T2H_SPLIT;
 4778:   $T2H_HREF{This} = $T2H_HREF{Contents};
 4779:   $T2H_NAME{This} = $T2H_NAME{Contents};
 4780:   $T2H_THIS_SECTION = \@toc_lines;
 4781:   &$T2H_print_Toc(\*FILE);
 4782:   close(FILE) if $T2H_SPLIT;
 4783: }
 4784: 
 4785: if (@stoc_lines)
 4786: {
 4787:   print "# writing Overview in $docu_stoc_file...\n" if $T2H_VERBOSE;
 4788:   open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n"
 4789:       if $T2H_SPLIT;
 4790:   
 4791:   $T2H_HREF{This} = $T2H_HREF{Overview};
 4792:   $T2H_NAME{This} = $T2H_NAME{Overview};
 4793:   $T2H_THIS_SECTION = \@stoc_lines;
 4794:   unshift @$T2H_THIS_SECTION, "<BLOCKQUOTE>\n";
 4795:   push @$T2H_THIS_SECTION, "\n</BLOCKQUOTE>\n";
 4796:   &$T2H_print_Overview(\*FILE);
 4797:   close(FILE) if $T2H_SPLIT;
 4798: }
 4799: 
 4800: if ($about_body = &$T2H_about_body())
 4801: {
 4802:   print "# writing About in $docu_about_file...\n" if $T2H_VERBOSE;
 4803:   open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n"
 4804:       if $T2H_SPLIT;
 4805:   
 4806:   $T2H_HREF{This} = $T2H_HREF{About};
 4807:   $T2H_NAME{This} = $T2H_NAME{About};
 4808:   $T2H_THIS_SECTION = [$about_body];
 4809:   &$T2H_print_About(\*FILE);
 4810:   close(FILE) if $T2H_SPLIT;
 4811: }
 4812: 
 4813: unless ($T2H_SPLIT)
 4814: {
 4815:   &$T2H_print_page_foot(\*FILE);
 4816:   close (FILE);
 4817: }
 4818:   
 4819: Finish:
 4820: &l2h_FinishFromHtml if ($T2H_L2H);
 4821: &l2h_Finish if($T2H_L2H);
 4822: print "# that's all folks\n" if $T2H_VERBOSE;
 4823: 
 4824: exit(0);
 4825: 
 4826: #+++############################################################################
 4827: #                                                                              #
 4828: # Low level functions                                                          #
 4829: #                                                                              #
 4830: #---############################################################################
 4831: 
 4832: sub LocateIncludeFile
 4833: {
 4834:   my $file = shift;
 4835:   my $dir;
 4836: 
 4837:   return $file if (-e $file && -r $file);
 4838:   foreach $dir (@T2H_INCLUDE_DIRS)
 4839:   {
 4840:     return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file");
 4841:   }
 4842:   return undef;
 4843: }
 4844: 
 4845: sub clean_name 
 4846: {
 4847:   local ($_);
 4848:   $_ = &remove_style($_[0]);
 4849:   &unprotect_texi;
 4850:   return $_;
 4851: }
 4852: 
 4853: sub update_sec_num {
 4854:     local($name, $level) = @_;
 4855:     my $ret;
 4856: 
 4857:     $level--; # here we start at 0
 4858:     if ($name =~ /^appendix/ || defined(@appendix_sec_num)) {
 4859: 	# appendix style
 4860: 	if (defined(@appendix_sec_num)) {
 4861: 	    &incr_sec_num($level, @appendix_sec_num);
 4862: 	} else {
 4863: 	    @appendix_sec_num = ('A', 0, 0, 0);
 4864: 	}
 4865: 	$ret = join('.', @appendix_sec_num[0..$level]);
 4866:     } else {
 4867: 	# normal style
 4868: 	if (defined(@normal_sec_num)) 
 4869: 	{
 4870: 	  &incr_sec_num($level, @normal_sec_num);
 4871: 	} 
 4872: 	else 
 4873: 	{
 4874: 	  @normal_sec_num = (1, 0, 0, 0);
 4875: 	}
 4876: 	$ret = join('.', @normal_sec_num[0..$level]);
 4877:     }
 4878:     
 4879:     $ret .= "." if $level == 0;
 4880:     return $ret;
 4881: }
 4882: 
 4883: sub incr_sec_num {
 4884:     local($level, $l);
 4885:     $level = shift(@_);
 4886:     $_[$level]++;
 4887:     foreach $l ($level+1 .. 3) {
 4888: 	$_[$l] = 0;
 4889:     }
 4890: }
 4891: 
 4892: sub Sec2UpNode
 4893: {
 4894:   my $sec = shift;
 4895:   my $num = $sec2number{$sec};
 4896: 
 4897:   return '' unless $num;
 4898:   return 'Top' unless $num =~ /\.\d+/;
 4899:   $num =~ s/\.[^\.]*$//;
 4900:   $num = $num . '.' unless $num =~ /\./;
 4901:   return $sec2node{$number2sec{$num}};
 4902: }
 4903: 
 4904: sub Sec2PrevNode
 4905: {
 4906:   my $sec = shift;
 4907:   my $num = $sec2number{$sec};
 4908:   my ($i, $post);
 4909:   
 4910:   if ($num =~ /(\w+)(\.$|$)/)
 4911:   {
 4912:     $num = $`;
 4913:     $i = $1;
 4914:     $post = $2;
 4915:     if ($i eq 'A')
 4916:     {
 4917:       $i = $normal_sec_num[0];
 4918:     }
 4919:     elsif ($i ne '1')
 4920:     {
 4921:       # unfortunately, -- operator is not magical
 4922:       $i = chr(ord($i) + 1);
 4923:     }
 4924:     else
 4925:     {
 4926:       return '';
 4927:     }
 4928:     return $sec2node{$number2sec{$num . $i . $post}}
 4929:   }
 4930:   return '';
 4931: }
 4932: 
 4933: sub Sec2NextNode
 4934: {
 4935:   my $sec = shift;
 4936:   my $num = $sec2number{$sec};
 4937:   my $i;
 4938: 
 4939:   if ($num =~ /(\w+)(\.$|$)/)
 4940:   {
 4941:     $num = $`;
 4942:     $i = $1;
 4943:     $post = $2;
 4944:     if ($post eq '.' && $i eq $normal_sec_num[0])
 4945:     {
 4946:       $i = 'A';
 4947:     }
 4948:     else
 4949:     {
 4950:       $i++;
 4951:     }
 4952:     return $sec2node{$number2sec{$num . $i . $post}}
 4953:   }
 4954:   return '';
 4955: }
 4956: 
 4957: sub check {
 4958:     local($_, %seen, %context, $before, $match, $after);
 4959: 
 4960:     while (<>) {
 4961: 	if (/\@(\*|\.|\:|\@|\{|\})/) {
 4962: 	    $seen{$&}++;
 4963: 	    $context{$&} .= "> $_" if $T2H_VERBOSE;
 4964: 	    $_ = "$`XX$'";
 4965: 	    redo;
 4966: 	}
 4967: 	if (/\@(\w+)/) {
 4968: 	    ($before, $match, $after) = ($`, $&, $');
 4969: 	    if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address
 4970: 		$seen{'e-mail address'}++;
 4971: 		$context{'e-mail address'} .= "> $_" if $T2H_VERBOSE;
 4972: 	    } else {
 4973: 		$seen{$match}++;
 4974: 		$context{$match} .= "> $_" if $T2H_VERBOSE;
 4975: 	    }
 4976: 	    $match =~ s/^\@/X/;
 4977: 	    $_ = "$before$match$after";
 4978: 	    redo;
 4979: 	}
 4980:     }
 4981:     
 4982:     foreach (sort(keys(%seen))) {
 4983: 	if ($T2H_VERBOSE) {
 4984: 	    print "$_\n";
 4985: 	    print $context{$_};
 4986: 	} else {
 4987: 	    print "$_ ($seen{$_})\n";
 4988: 	}
 4989:     }
 4990: }
 4991: 
 4992: sub open {
 4993:     local($name) = @_;
 4994: 
 4995:     ++$fh_name;
 4996:     if (open($fh_name, $name)) {
 4997: 	unshift(@fhs, $fh_name);
 4998:     } else {
 4999: 	warn "$ERROR Can't read file $name: $!\n";
 5000:     }
 5001: }
 5002: 
 5003: sub init_input {
 5004:     @fhs = ();			# hold the file handles to read
 5005:     @input_spool = ();		# spooled lines to read
 5006:     $fh_name = 'FH000';
 5007:     &open($docu);
 5008: }
 5009: 
 5010: sub next_line {
 5011:     local($fh, $line);
 5012: 
 5013:     if (@input_spool) {
 5014: 	$line = shift(@input_spool);
 5015: 	return($line);
 5016:     }
 5017:     while (@fhs) {
 5018: 	$fh = $fhs[0];
 5019: 	$line = <$fh>;
 5020: 	return($line) if $line;
 5021: 	close($fh);
 5022: 	shift(@fhs);
 5023:     }
 5024:     return(undef);
 5025: }
 5026: 
 5027: # used in pass 1, use &next_line
 5028: sub skip_until {
 5029:     local($tag) = @_;
 5030:     local($_);
 5031: 
 5032:     while ($_ = &next_line) {
 5033: 	return if /^\@end\s+$tag\s*$/;
 5034:     }
 5035:     die "* Failed to find '$tag' after: " . $lines[$#lines];
 5036: }
 5037: 
 5038: # used in pass 1 for l2h use &next_line
 5039: sub string_until {
 5040:     local($tag) = @_;
 5041:     local($_, $string);
 5042: 
 5043:     while ($_ = &next_line) {
 5044: 	return $string if /^\@end\s+$tag\s*$/;
 5045: #	$_ =~ s/hbox/mbox/g;
 5046: 	$string = $string.$_;
 5047:     }
 5048:     die "* Failed to find '$tag' after: " . $lines[$#lines];
 5049: }
 5050: 
 5051: #
 5052: # HTML stacking to have a better HTML output
 5053: #
 5054: 
 5055: sub html_reset {
 5056:     @html_stack = ('html');
 5057:     $html_element = 'body';
 5058: }
 5059: 
 5060: sub html_push {
 5061:     local($what) = @_;
 5062:     push(@html_stack, $html_element);
 5063:     $html_element = $what;
 5064: }
 5065: 
 5066: sub html_push_if {
 5067:     local($what) = @_;
 5068:     push(@html_stack, $html_element)
 5069: 	if ($html_element && $html_element ne 'P');
 5070:     $html_element = $what;
 5071: }
 5072: 
 5073: sub html_pop {
 5074:     $html_element = pop(@html_stack);
 5075: }
 5076: 
 5077: sub html_pop_if {
 5078:     local($elt);
 5079: 
 5080:     if (@_) {
 5081: 	foreach $elt (@_) {
 5082: 	    if ($elt eq $html_element) {
 5083: 		$html_element = pop(@html_stack) if @html_stack;
 5084: 		last;
 5085: 	    }
 5086: 	}
 5087:     } else {
 5088: 	$html_element = pop(@html_stack) if @html_stack;
 5089:     }
 5090: }
 5091: 
 5092: sub html_debug {
 5093:     local($what, $line) = @_;
 5094:     if ($T2H_DEBUG & $DEBUG_HTML)
 5095:     {
 5096:      $what = "\n" unless $what;
 5097:      return("<!-- $line @html_stack, $html_element -->$what")
 5098:     }	
 5099:     return($what);
 5100: }
 5101: 
 5102: # to debug the output...
 5103: sub debug {
 5104:     local($what, $line) = @_;
 5105:     return("<!-- $line -->$what")
 5106: 	if $T2H_DEBUG & $DEBUG_HTML;
 5107:     return($what);
 5108: }
 5109: 
 5110: sub SimpleTexi2Html
 5111: {
 5112:   local $_ = $_[0];
 5113:   &protect_texi;
 5114:   &protect_html;
 5115:   $_ = substitute_style($_);
 5116:   $_[0]  = $_;
 5117: }
 5118: 
 5119: sub normalise_node {
 5120:   local $_ = $_[0];
 5121:   s/\s+/ /g;
 5122:   s/ $//;
 5123:   s/^ //;
 5124:   &protect_texi;
 5125:   &protect_html;
 5126:   $_ = substitute_style($_);
 5127:   $_[0]  = $_;
 5128: }
 5129: 
 5130: sub menu_entry 
 5131: {
 5132:   my ($node, $name, $descr) = @_;
 5133:   my ($href, $entry);
 5134:   
 5135:   &normalise_node($node);
 5136:   $href = $node2href{$node};
 5137:   if ($href) 
 5138:   {
 5139:     $descr =~ s/^\s+//;
 5140:     $descr =~ s/\s*$//;
 5141:     $descr = SimpleTexi2Html($descr);
 5142:     if ($T2H_NUMBER_SECTIONS && !$T2H_NODE_NAME_IN_MENU && $node2sec{$node})
 5143:     {
 5144:       $entry = $node2sec{$node};
 5145:       $name = '';
 5146:     }
 5147:     else
 5148:     {
 5149:       &normalise_node($name);
 5150:       $entry = ($name && ($name ne $node || ! $T2H_AVOID_MENU_REDUNDANCY) 
 5151: 		? "$name : $node" : $node);
 5152:     }
 5153: 
 5154:     if ($T2H_AVOID_MENU_REDUNDANCY && $descr)
 5155:     {
 5156:       my $clean_entry = $entry;
 5157:       $clean_entry =~ s/^.*? // if ($clean_entry =~ /^([A-Z]|\d+)\.[\d\.]* /);
 5158:       $clean_entry =~ s/[^\w]//g;
 5159:       my $clean_descr = $descr;
 5160:       $clean_descr =~ s/[^\w]//g;
 5161:       $descr = '' if ($clean_entry eq $clean_descr)
 5162:     }
 5163:     push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' . 
 5164: 			&t2h_anchor('', $href, $entry) . 
 5165: 			'</TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">' . 
 5166: 			$descr . 
 5167: 			"</TD></TR>\n", __LINE__));
 5168:   }
 5169:   elsif ($node =~ /^\(.*\)\w+/)
 5170:   {
 5171:     push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' . 
 5172: 			$entry . 
 5173: 			'</TD><TD ALIGN="left" VALIGN="TOP">' . $descr . 
 5174: 			"</TD></TR>\n", __LINE__))
 5175:   }
 5176:   else
 5177:   {
 5178:     warn "$ERROR Undefined node of menu_entry ($node): $_";
 5179:   }
 5180: }
 5181: 
 5182: sub do_ctrl { "^$_[0]" }
 5183: 
 5184: sub do_email {
 5185:     local($addr, $text) = split(/,\s*/, $_[0]);
 5186: 
 5187:     $text = $addr unless $text;
 5188:     &t2h_anchor('', "mailto:$addr", $text);
 5189: }
 5190: 
 5191: sub do_sc 
 5192: { 
 5193:   # l2h does this much better
 5194:   return &l2h_ToLatex("{\\sc ".&unprotect_html($_[0])."}") if ($T2H_L2H);
 5195:   return "\U$_[0]\E";
 5196: }
 5197: 
 5198: sub do_math
 5199: {
 5200:   return &l2h_ToLatex("\$".&unprotect_html($_[0])."\$") if ($T2H_L2H);
 5201:   return "<EM>".$text."</EM>";
 5202: }
 5203: 
 5204: sub do_uref {
 5205:     local($url, $text, $only_text) = split(/,\s*/, $_[0]);
 5206: 
 5207:     $text = $only_text if $only_text;
 5208:     $text = $url unless $text;
 5209:     &t2h_anchor('', $url, $text);
 5210: }
 5211: 
 5212: sub do_url { &t2h_anchor('', $_[0], $_[0]) }
 5213: 
 5214: sub do_acronym
 5215: {
 5216:   return '<FONT SIZE="-1">' . $_[0] . '</FONT>';
 5217: }
 5218: 
 5219: sub do_accent
 5220: {
 5221:   return "&$_[0]acute;" if $_[1] eq 'H';
 5222:   return "$_[0]." if $_[1] eq 'dotaccent';
 5223:   return "$_[0]*" if $_[1] eq 'ringaccent';
 5224:   return "$_[0]".'[' if $_[1] eq 'tieaccent';
 5225:   return "$_[0]".'(' if $_[1] eq 'u';
 5226:   return "$_[0]_" if $_[1] eq 'ubaraccent';
 5227:   return ".$_[0]" if $_[1] eq 'udotaccent';
 5228:   return "$_[0]&lt;" if $_[1] eq 'v';
 5229:   return "&$_[0]cedil;" if $_[1] eq ',';
 5230:   return "$_[0]" if $_[1] eq 'dotless';
 5231:   return undef;
 5232: }
 5233: 
 5234: sub apply_style {
 5235:     local($texi_style, $text) = @_;
 5236:     local($style);
 5237: 
 5238:     $style = $style_map{$texi_style};
 5239:     if (defined($style)) { # known style
 5240: 	if ($style =~ /^\"/) { # add quotes
 5241: 	    $style = $';
 5242: 	    $text = "\`$text\'";
 5243: 	}
 5244: 	if ($style =~ /^\&/) { # custom
 5245: 	    $style = $';
 5246: 	    $text = &$style($text, $texi_style);
 5247: 	} elsif ($style) { # good style
 5248: 	    $text = "<$style>$text</$style>";
 5249: 	} else { # no style
 5250: 	}
 5251:     } else { # unknown style
 5252: 	$text = undef;
 5253:     }
 5254:     return($text);
 5255: }
 5256: 
 5257: # remove Texinfo styles
 5258: sub remove_style {
 5259:     local($_) = @_;
 5260:     1 while(s/\@\w+{([^\{\}]+)}/$1/g);
 5261:     return($_);
 5262: }
 5263: 
 5264: sub remove_things
 5265: {
 5266:   local ($_) = @_;
 5267:   s|\@(\w+)\{\}|$1|g;
 5268:   return $_;
 5269: }
 5270: 
 5271: sub substitute_style {
 5272:     local($_) = @_;
 5273:     local($changed, $done, $style, $text);
 5274: 
 5275:     &simple_substitutions;
 5276:     $changed = 1;
 5277:     while ($changed) {
 5278: 	$changed = 0;
 5279: 	$done = '';
 5280: 	while (/\@(\w+){([^\{\}]+)}/ || /\@(,){([^\{\}]+)}/) {
 5281: 	    $text = &apply_style($1, $2);
 5282: 	    if ($text) {
 5283: 		$_ = "$`$text$'";
 5284: 		$changed = 1;
 5285: 	    } else {
 5286: 		$done .= "$`\@$1";
 5287: 		$_ = "{$2}$'";
 5288: 	    }
 5289: 	}
 5290:         $_ = $done . $_;
 5291:     }
 5292:     return($_);
 5293: }
 5294: 
 5295: sub t2h_anchor {
 5296:     local($name, $href, $text, $newline, $extra_attribs) = @_;
 5297:     local($result);
 5298: 
 5299:     $result = "<A";
 5300:     $result .= " NAME=\"$name\"" if $name;
 5301:     if ($href)
 5302:     {
 5303:       $href =~ s|^$T2H_HREF_DIR_INSTEAD_FILE|./| 
 5304: 	if ($T2H_HREF_DIR_INSTEAD_FILE);
 5305:       $result .= ($href =~ /\"/ ? " HREF='$href'"  : " HREF=\"$href\"");
 5306:     }
 5307:     $result .= " $extra_attribs" if $extra_attribs;
 5308:     $result .= ">$text</A>";
 5309:     $result .= "\n" if $newline;
 5310:     return($result);
 5311: }
 5312: 
 5313: sub pretty_date {
 5314:     local(@MoY, $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
 5315: 
 5316:     @MoY = ('January', 'February', 'March', 'April', 'May', 'June',
 5317: 	    'July', 'August', 'September', 'October', 'November', 'December');
 5318:     ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
 5319:     $year += ($year < 70) ? 2000 : 1900;
 5320:     # obachman: Let's do it as the Americans do
 5321:     return("$MoY[$mon], $mday  $year");
 5322: }
 5323: 
 5324: sub doc_href {
 5325:     local($num) = @_;
 5326: 
 5327:     return("${docu_name}_$num.$docu_ext");
 5328: }
 5329: 
 5330: sub sec_href
 5331: {
 5332:   return $node2href{$sec2node{$_[0]}};
 5333: }
 5334: 
 5335: sub next_doc {
 5336:     $docu_doc = &doc_href(++$doc_num);
 5337: }
 5338: 
 5339: sub t2h_print_lines {
 5340:     my ($fh, $lines) = @_;
 5341:     local($_);
 5342:     $lines = $T2H_THIS_SECTION unless $lines;
 5343:     my $cnt = 0;
 5344:     for (@$lines) 
 5345:     {
 5346: 	$_ = l2h_FromHtml($_) if ($T2H_L2H);
 5347: 	if (/^$PROTECTTAG/o) {
 5348: 	    $_ = $tag2pro{$_};
 5349: 	} else {
 5350: 	    &unprotect_texi;
 5351: 	}
 5352: 	print $fh $_;
 5353: 	$cnt += split(/\W*\s+\W*/);
 5354:     }
 5355:     return $cnt;
 5356: }
 5357: 
 5358: sub protect_texi {
 5359:     # protect @ { } ` '
 5360:     s/\@\@/$;0/go;
 5361:     s/\@\{/$;1/go;
 5362:     s/\@\}/$;2/go;
 5363:     s/\@\`/$;3/go;
 5364:     s/\@\'/$;4/go;
 5365: }
 5366: 
 5367: sub protect_html {
 5368:     local($what) = @_;
 5369:     # protect & < >
 5370:     $what =~ s/\&/\&\#38;/g;
 5371:     $what =~ s/\</\&\#60;/g;
 5372:     $what =~ s/\>/\&\#62;/g;
 5373:     # restore anything in quotes
 5374:     # this fixes my problem where I had:
 5375:     # < IMG SRC="leftarrow.gif" ALT="<--" >  but what if I wanted &#60; in my ALT text ??
 5376:     # maybe byte stuffing or some other technique should be used.
 5377:     $what =~ s/\"([^\&]+)\&\#60;(.*)\"/"$1<$2"/g;
 5378:     $what =~ s/\"([^\&]+)\&\#62;(.*)\"/"$1>$2"/g;
 5379:     $what =~ s/\"([^\&]+)\&\#38;(.*)\"/"$1&$2"/g;
 5380:     # but recognize some HTML things
 5381:     $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g;	      # </A>
 5382:     $what =~ s/\&\#60;A ([^\&]+)\&\#62;/<A $1>/g;     # <A [^&]+>
 5383:     $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;/<IMG $1>/g; # <IMG [^&]+>
 5384:     return($what);
 5385: }
 5386: 
 5387: sub unprotect_texi {
 5388:     s/$;0/\@/go;
 5389:     s/$;1/\{/go;
 5390:     s/$;2/\}/go;
 5391:     s/$;3/\`/go;
 5392:     s/$;4/\'/go;
 5393: }
 5394: 
 5395: sub Unprotect_texi 
 5396: {
 5397:   local $_ = shift;
 5398:   &unprotect_texi;
 5399:   return($_);
 5400: }
 5401: 
 5402: sub unprotect_html {
 5403:     local($what) = @_;
 5404:     $what =~ s/\&\#38;/\&/g;
 5405:     $what =~ s/\&\#60;/\</g;
 5406:     $what =~ s/\&\#62;/\>/g;
 5407:     return($what);
 5408: }
 5409: 
 5410: sub t2h_print_label
 5411: {
 5412:     my $fh = shift;
 5413:     my $href = shift || $T2H_HREF{This};
 5414:     $href =~ s/.*#(.*)$/$1/;
 5415:     print $fh qq{<A NAME="$href"></A>\n};
 5416: }
 5417: 
 5418: ##############################################################################
 5419: 
 5420: 	# These next few lines are legal in both Perl and nroff.
 5421: 
 5422: .00 ;			# finish .ig
 5423:  
 5424: 'di			\" finish diversion--previous line must be blank
 5425: .nr nl 0-1		\" fake up transition to first page again
 5426: .nr % 0			\" start at page 1
 5427: '; __END__ ############# From here on it's a standard manual page ############
 5428: .so /usr/local/man/man1/texi2html.1

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>