Annotation of embedaddon/readline/doc/texi2html, revision 1.1

1.1     ! misho       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.pl,v 1.55 2000/07/27 14:39:41 obachman 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.init,v 1.34 2000/07/27 14:09:02 obachman 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: MySimple.pm,v 1.1 2000/07/03 08:44:13 obachman 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>