4 #+##############################################################################
6 # texi2html: Program to transform Texinfo documents to HTML
8 # Copyright (C) 1999, 2000 Free Software Foundation, Inc.
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 2 of the License, or
13 # (at your option) any later version.
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.
20 # You should have received a copy of the GNU General Public License
21 # along with this program; if not, write to the Free Software
22 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #-##############################################################################
26 # This requires perl version 5 or higher
29 # Perl pragma to restrict unsafe constructs
33 # larry.jones@sdrc.com (Larry Jones)
34 # this pragma is not present in perl5.004_02:
36 # Perl pragma to control optional warnings
109 $T2H_OBSOLETE_OPTIONS
128 $WORDS_IN_NAVIGATION_PANEL_TITLES
336 #++##############################################################################
338 # NOTE FOR DEBUGGING THIS SCRIPT:
339 # You can run 'perl texi2html.pl' directly, provided you have
340 # the environment variable T2H_HOME set to the directory containing
341 # the texi2html.init file
343 #--##############################################################################
346 # $Id: texi2html,v 1.1 2004-09-26 21:06:17 blp Exp $
349 $T2H_HOMEPAGE = "http://texi2html.cvshome.org";
352 $T2H_AUTHORS = <<EOT;
353 Written by: Lionel Cons <Lionel.Cons\@cern.ch> (original author)
354 Karl Berry <karl\@freefriends.org>
355 Olaf Bachmann <obachman\@mathematik.uni-kl.de>
357 Maintained by: Many creative people <dev\@texi2html.cvshome.org>
358 Send bugs and suggestions to <users\@texi2html.cvshome.org>
361 # Version: set in configure.in
362 $THISVERSION = '1.66';
363 $THISPROG = "texi2html $THISVERSION"; # program name and version
365 # The man page for this program is included at the end of this file and can be
366 # viewed using the command 'nroff -man texi2html'.
368 #+++############################################################################
371 # Pasted content of File $(srcdir)/texi2html.init: Default initializations #
373 #---############################################################################
375 # leave this within comments, and keep the require statement
376 # This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
381 ######################################################################
382 # File: texi2html.init
384 # Sets default values for command-line arguments and for various customizable
387 # A copy of this file is pasted into the beginning of texi2html by
390 # Copy this file and make changes to it, if you like.
391 # Afterwards, either, load it with command-line option -init_file <your_init_file>
393 # $Id: texi2html,v 1.1 2004-09-26 21:06:17 blp Exp $
395 ######################################################################
396 # stuff which can also be set by command-line options
399 # Note: values set here, overwrite values set by the command-line
400 # options before -init_file and might still be overwritten by
401 # command-line arguments following the -init_file option
404 # T2H_OPTIONS is a hash whose keys are the (long) names of valid
405 # command-line options and whose values are a hash with the following keys:
406 # type ==> one of !|=i|:i|=s|:s (see GetOpt::Long for more info)
407 # linkage ==> ref to scalar, array, or subroutine (see GetOpt::Long for more info)
408 # verbose ==> short description of option (displayed by -h)
409 # noHelp ==> if 1 -> for "not so important options": only print description on -h 1
410 # 2 -> for obsolete options: only print description on -h 2
414 $T2H_OPTIONS -> {debug} =
417 linkage => \$T2H_DEBUG,
418 verbose => 'output HTML with debuging information',
421 # APA: Add SystemLiteral to identify the canonical DTD.
422 # [Definition:] The SystemLiteral is called the entity's system
423 # identifier. It is a URI, which may be used to retrieve the entity.
424 # See http://www.xml.com/axml/target.html#NT-ExternalID
425 my $T2H_DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
426 "http://www.w3.org/TR/html40/loose.dtd">';
427 $T2H_OPTIONS -> {doctype} =
430 linkage => \$T2H_DOCTYPE,
431 verbose => 'document type which is output in header of HTML files',
436 $T2H_OPTIONS -> {check} =
439 linkage => \$T2H_CHECK,
440 verbose => 'if set, only check files and output all things that may be Texinfo commands',
445 # if set to "tex" (or, "info") expand @iftex and @tex (or, @ifinfo) sections
446 # else, neither expand @iftex, @tex, nor @ifinfo sections
447 my $T2H_EXPAND = "info";
448 $T2H_OPTIONS -> {expand} =
451 linkage => \$T2H_EXPAND,
452 verbose => 'Expand info|tex|none section of texinfo source',
456 # If set, uses section named `Footnotes' for glossary.
457 my $T2H_USE_GLOSSARY = 0;
458 $T2H_OPTIONS -> {glossary} =
461 linkage => \$T2H_USE_GLOSSARY,
462 verbose => "if set, uses section named `Footnotes' for glossary",
468 # $T2H_INVISIBLE_MARK is the text used to create invisible destination
469 # anchors for index links (you can for instance use the invisible.xbm
470 # file shipped with this program). This is a workaround for a known
471 # bug of many WWW browsers, including netscape.
472 # For me, it works fine without it -- on the contrary: if there, it
473 # inserts space between headers and start of text (obachman 3/99)
474 my $T2H_INVISIBLE_MARK = '';
475 # $T2H_INVISIBLE_MARK = ' ';
476 $T2H_OPTIONS -> {invisible} =
479 linkage => \$T2H_INVISIBLE_MARK,
480 verbose => 'use text in invisble anchot',
485 # if set, ISO8859 characters are used for special symbols (like copyright, etc)
487 $T2H_OPTIONS -> {iso} =
490 linkage => \$T2H_USE_ISO,
491 verbose => 'if set, ISO8859 characters are used for special symbols (like copyright, etc)',
496 # list directories where @include files are searched for (besides the
497 # directory of the doc file) additional '-I' args add to this list
498 # APA: Don't implicitely search ., to conform with the docs!
499 # my @T2H_INCLUDE_DIRS = (".");
500 my @T2H_INCLUDE_DIRS = ();
501 $T2H_OPTIONS -> {I} =
504 linkage => \@T2H_INCLUDE_DIRS,
505 verbose => 'append $s to the @include search path',
509 # uses file of this name for top-level file
510 # extension is manipulated appropriately, if necessary.
511 # If empty, <basename of document>.html is used.
512 # Typically, you would set this to "index.html".
513 my $T2H_TOP_FILE = '';
514 $T2H_OPTIONS -> {top_file} =
517 linkage => \$T2H_TOP_FILE,
518 verbose => 'use $s as top file, instead of <docname>.html',
523 # uses file of this name for table of contents. File
524 # extension is manipulated appropriately, if necessary.
525 # If empty, <basename of document>_toc.html is used.
526 my $T2H_TOC_FILE = '';
527 $T2H_OPTIONS -> {toc_file} =
530 linkage => \$T2H_TOC_FILE,
531 verbose => 'use $s as ToC file, instead of <docname>_toc.html',
535 # if set, output two additional files which use HTML 4.0 "frames".
537 $T2H_OPTIONS -> {frames} =
540 linkage => \$T2H_FRAMES,
541 verbose => 'output files which use HTML 4.0 frames (experimental)',
547 # if set, show the Texinfo menus
548 my $T2H_SHOW_MENU = 1;
549 $T2H_OPTIONS -> {menu} =
552 linkage => \$T2H_SHOW_MENU,
553 verbose => 'ouput Texinfo menus',
556 # -number | -nonumber
557 # if set, number sections and show section names and numbers in references
559 my $T2H_NUMBER_SECTIONS = 1;
560 $T2H_OPTIONS -> {number} =
563 linkage => \$T2H_NUMBER_SECTIONS,
564 verbose => 'use numbered sections'
567 # if set, and T2H_NUMBER_SECTIONS is set, then use node names in menu
568 # entries, instead of section names
569 my $T2H_NODE_NAME_IN_MENU = 0;
571 # if set and menu entry equals menu descr, then do not print menu descr.
572 # Likewise, if node name equals entry name, do not print entry name.
573 my $T2H_AVOID_MENU_REDUNDANCY = 1;
575 # -split section|chapter|none
576 # if set to 'section' (resp. 'chapter') create one html file per (sub)section
577 # (resp. chapter) and separate pages for Top, ToC, Overview, Index,
579 # Otherwise, create a monolithic html file that contains the whole document.
580 #$T2H_SPLIT = 'section';
582 $T2H_OPTIONS -> {split} =
585 linkage => \$T2H_SPLIT,
586 verbose => 'split document on section|chapter else no splitting',
589 # -section_navigation|-no-section_navigation
590 # if set, then navigation panels are printed at the beginning of each section
591 # and, possibly at the end (depending on whether or not there were more than
592 # $T2H_WORDS_IN_PAGE words on page
593 # This is most useful if you do not want to have section navigation
595 my $T2H_SECTION_NAVIGATION = 1;
596 $T2H_OPTIONS -> {sec_nav} =
599 linkage => \$T2H_SECTION_NAVIGATION,
600 verbose => 'output navigation panels for each section',
604 # If set, then put result files into the specified directory.
605 # If not set, then result files are put into the current directory.
606 #$T2H_SUBDIR = 'html';
608 $T2H_OPTIONS -> {subdir} =
611 linkage => \$T2H_SUBDIR,
612 verbose => 'put HTML files in directory $s, instead of $cwd',
616 # If this is set, then all HTML files will have extension ".htm" instead of
617 # ".html". This is helpful when shipping the document to DOS-based systems.
618 my $T2H_SHORTEXTN = 0;
619 $T2H_OPTIONS -> {short_ext} =
622 linkage => \$T2H_SHORTEXTN,
623 verbose => 'use "htm" extension for output HTML files',
628 # Set the output file prefix, prepended to all .html, .gif and .pl files.
629 # By default, this is the basename of the document
631 $T2H_OPTIONS -> {prefix} =
634 linkage => \$T2H_PREFIX,
635 verbose => 'use as prefix for output files, instead of <docname>',
639 # If set, generate monolithic document output html into $filename
641 $T2H_OPTIONS -> {out_file} =
644 linkage => sub {$T2H_OUT = $_[1]; $T2H_SPLIT = '';},
645 verbose => 'if set, all HTML output goes into file $s',
649 #if set cross-references are given without section numbers
650 my $T2H_SHORT_REF = '';
651 $T2H_OPTIONS -> {short_ref} =
654 linkage => \$T2H_SHORT_REF,
655 verbose => 'if set, references are without section numbers',
659 # if value is set, then for each @prinindex $what
660 # $docu_name_$what.idx is created which contains lines of the form
661 # $key\t$ref sorted alphabetically (case matters)
662 my $T2H_IDX_SUMMARY = 0;
663 $T2H_OPTIONS -> {idx_sum} =
666 linkage => \$T2H_IDX_SUMMARY,
667 verbose => 'if set, also output index summary',
672 # Use a table construction for @def .... stuff instead
673 # New Option: 27.07.2000 Karl Heinz Marbaise
674 my $T2H_DEF_TABLE = 0;
675 $T2H_OPTIONS -> {def_table} =
678 linkage => \$T2H_DEF_TABLE,
679 verbose => 'if set, \@def.. are converted using tables.',
684 # if set, chatter about what we are doing
685 my $T2H_VERBOSE = '';
686 $T2H_OPTIONS -> {Verbose} =
689 linkage => \$T2H_VERBOSE,
690 verbose => 'print progress info to stdout',
694 # For page titles use $T2H_WORDS->{$T2H_LANG}->{...} as title.
695 # To add a new language, supply list of titles (see $T2H_WORDS below).
696 # and use ISO 639 language codes (see e.g. perl module Locale-Codes-1.02
698 # Default's to 'en' if not set or no @documentlanguage is specified
700 $T2H_OPTIONS -> {lang} =
703 linkage => sub {SetDocumentLanguage($_[1])},
704 verbose => 'use $s as document language (ISO 639 encoding)',
708 # if set, uses latex2html for generation of math content
710 $T2H_OPTIONS -> {l2h} =
713 linkage => \$T2H_L2H,
714 verbose => 'if set, uses latex2html for @math and @tex',
717 ######################
718 # The following options are only relevant if $T2H_L2H is set
721 # name/location of latex2html program
722 my $T2H_L2H_L2H = "latex2html";
723 $T2H_OPTIONS -> {l2h_l2h} =
726 linkage => \$T2H_L2H_L2H,
727 verbose => 'program to use for latex2html translation',
732 # If set, skips actual call to latex2html: tries to reuse previously generated
734 my $T2H_L2H_SKIP = '';
735 $T2H_OPTIONS -> {l2h_skip} =
738 linkage => \$T2H_L2H_SKIP,
739 verbose => 'if set, tries to reuse previously latex2html output',
744 # If set, l2h uses the specified directory for temporary files. The path
745 # leading to this directory may not contain a dot (i.e., a ".");
746 # otherwise, l2h will fail.
747 my $T2H_L2H_TMP = '';
748 $T2H_OPTIONS -> {l2h_tmp} =
751 linkage => \$T2H_L2H_TMP,
752 verbose => 'if set, uses $s as temporary latex2html directory',
756 # if set, cleans intermediate files (they all have the prefix $doc_l2h_)
758 my $T2H_L2H_CLEAN = 1;
759 $T2H_OPTIONS -> {l2h_clean} =
762 linkage => \$T2H_L2H_CLEAN,
763 verbose => 'if set, do not keep intermediate latex2html files for later reuse',
767 $T2H_OPTIONS -> {D} =
770 linkage => sub {$main::value{$_[1]} = 1;},
771 verbose => 'equivalent to Texinfo "@set $s 1"',
775 $T2H_OPTIONS -> {init_file} =
778 linkage => \&LoadInitFile,
779 verbose => 'load init file $s'
783 ##############################################################################
785 # The following can only be set in the init file
787 ##############################################################################
789 # if set, center @image by default
790 # otherwise, do not center by default
791 my $T2H_CENTER_IMAGE = 1;
793 # used as identation for block enclosing command @example, etc
794 # If not empty, must be enclosed in <td></td>
795 my $T2H_EXAMPLE_INDENT_CELL = '<td> </td>';
796 # same as above, only for @small
797 my $T2H_SMALL_EXAMPLE_INDENT_CELL = '<td> </td>';
798 # font size for @small
799 my $T2H_SMALL_FONT_SIZE = '-1';
801 # if non-empty, and no @..heading appeared in Top node, then
802 # use this as header for top node/section, otherwise use value of
803 # @settitle or @shorttitle (in that order)
804 my $T2H_TOP_HEADING = '';
806 # if set, use this chapter for 'Index' button, else
807 # use first chapter whose name matches 'index' (case insensitive)
808 my $T2H_INDEX_CHAPTER = '';
810 # if set and $T2H_SPLIT is set, then split index pages at the next letter
811 # after they have more than that many entries
812 my $T2H_SPLIT_INDEX = 100;
814 # if set (e.g., to index.html) replace hrefs to this file
815 # (i.e., to index.html) by ./
816 my $T2H_HREF_DIR_INSTEAD_FILE = '';
818 ########################################################################
819 # Language dependencies:
820 # To add a new language extend T2H_WORDS hash and create $T2H_<...>_WORDS hash
821 # To redefine one word, simply do:
822 # $T2H_WORDS->{<language>}->{<word>} = 'whatever' in your personal init file.
827 'ToC_Title' => 'Table of Contents',
828 'Overview_Title' => 'Short Table of Contents',
829 'Index_Title' => 'Index',
830 'About_Title' => 'About this document',
831 'Footnotes_Title' => 'Footnotes',
834 'section' => 'section',
835 # If necessary, we could extend this as follows:
837 # 'Top_Button' => 'Top',
838 # 'ToC_Button' => 'Contents',
839 # 'Overview_Button' => 'Overview',
840 # 'Index_button' => 'Index',
841 # 'Back_Button' => 'Back',
842 # 'FastBack_Button' => 'FastBack',
843 # 'Prev_Button' => 'Prev',
844 # 'Up_Button' => 'Up',
845 # 'Next_Button' => 'Next',
846 # 'Forward_Button' =>'Forward',
847 # 'FastWorward_Button' => 'FastForward',
848 # 'First_Button' => 'First',
849 # 'Last_Button' => 'Last',
850 # 'About_Button' => 'About'
855 'ToC_Title' => 'Inhaltsverzeichniss',
856 'Overview_Title' => 'Kurzes Inhaltsverzeichniss',
857 'Index_Title' => 'Index',
858 'About_Title' => 'Über dieses Dokument',
859 'Footnotes_Title' => 'Fußnoten',
862 'section' => 'Abschnitt',
867 'ToC_Title' => 'Inhoudsopgave',
868 'Overview_Title' => 'Korte inhoudsopgave',
869 'Index_Title' => 'Index', #Not sure ;-)
870 'About_Title' => 'No translation available!', #No translation available!
871 'Footnotes_Title' => 'No translation available!', #No translation available!
874 'section' => 'sectie',
879 'ToC_Title' => 'índice General',
880 'Overview_Title' => 'Resumen del Contenido',
881 'Index_Title' => 'Index', #Not sure ;-)
882 'About_Title' => 'No translation available!', #No translation available!
883 'Footnotes_Title' => 'Fußnoten',
884 'See' => 'Véase',
885 'see' => 'véase',
886 'section' => 'sección',
891 'ToC_Title' => 'Innholdsfortegnelse',
892 'Overview_Title' => 'Kort innholdsfortegnelse',
893 'Index_Title' => 'Indeks', #Not sure ;-)
894 'About_Title' => 'No translation available!', #No translation available!
895 'Footnotes_Title' => 'No translation available!',
898 'section' => 'avsnitt',
903 'ToC_Title' => 'Sumário',
904 'Overview_Title' => 'Breve Sumário',
905 'Index_Title' => 'Índice', #Not sure ;-)
906 'About_Title' => 'No translation available!', #No translation available!
907 'Footnotes_Title' => 'No translation available!',
910 'section' => 'Seção',
915 'ToC_Title' => 'Table des mati&egrav;res',
916 'Overview_Title' => 'Résumée du contenu',
917 'Index_Title' => 'Index',
918 'About_Title' => 'A propos de ce document',
919 'Footnotes_Title' => 'Notes de bas de page',
922 'section' => 'section',
927 'en' => $T2H_WORDS_EN,
928 'de' => $T2H_WORDS_DE,
929 'nl' => $T2H_WORDS_NL,
930 'es' => $T2H_WORDS_ES,
931 'no' => $T2H_WORDS_NO,
932 'pt' => $T2H_WORDS_PT,
933 'fr' => $T2H_WORDS_FR
938 'January', 'February', 'March', 'April', 'May',
939 'June', 'July', 'August', 'September', 'October',
940 'November', 'December'
945 'Januar', 'Februar', 'März', 'April', 'Mai',
946 'Juni', 'Juli', 'August', 'September', 'Oktober',
947 'November', 'Dezember'
952 'Januari', 'Februari', 'Maart', 'April', 'Mei',
953 'Juni', 'Juli', 'Augustus', 'September', 'Oktober',
954 'November', 'December'
959 'enero', 'febrero', 'marzo', 'abril', 'mayo',
960 'junio', 'julio', 'agosto', 'septiembre', 'octubre',
961 'noviembre', 'diciembre'
967 'januar', 'februar', 'mars', 'april', 'mai',
968 'juni', 'juli', 'august', 'september', 'oktober',
969 'november', 'desember'
974 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio',
975 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro',
976 'Novembro', 'Dezembro'
981 'Janvier', 'Février', 'Mars', 'Avril', 'Mai',
982 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre',
983 'Novembre', 'Décembre'
990 'en' => \@MONTH_NAMES_EN,
991 'de' => \@MONTH_NAMES_DE,
992 'es' => \@MONTH_NAMES_ES,
993 'nl' => \@MONTH_NAMES_NL,
994 'no' => \@MONTH_NAMES_NO,
995 'pt' => \@MONTH_NAMES_PT,
996 'fr' => \@MONTH_NAMES_FR
999 ########################################################################
1000 # Control of Page layout:
1001 # You can make changes of the Page layout at two levels:
1002 # 1.) For small changes, it is often enough to change the value of
1003 # some global string/hash/array variables
1004 # 2.) For larger changes, reimplement one of the T2H_DEFAULT_<fnc>* routines,
1005 # give them another name, and assign them to the respective
1006 # $T2H_<fnc> variable.
1008 # As a general interface, the hashes T2H_HREF, T2H_NAME, T2H_NODE hold
1009 # href, html-name, node-name of
1010 # This -- current section (resp. html page)
1011 # Top -- top page ($T2H_TOP_FILE)
1012 # Contents -- Table of contents
1013 # Overview -- Short table of contents
1014 # Index -- Index page
1015 # About -- page which explain "navigation buttons"
1016 # First -- first node
1019 # Whether or not the following hash values are set, depends on the context
1020 # (all values are w.r.t. 'This' section)
1021 # Next -- next node of texinfo
1022 # Prev -- previous node of texinfo
1023 # Up -- up node of texinfo
1024 # Forward -- next node in reading order
1025 # Back -- previous node in reading order
1026 # FastForward -- if leave node, up and next, else next node
1027 # FastBackward-- if leave node, up and prev, else prev node
1029 # Furthermore, the following global variabels are set:
1030 # $T2H_THISDOC{title} -- title as set by @setttile
1031 # $T2H_THISDOC{fulltitle} -- full title as set by @title...
1032 # $T2H_THISDOC{subtitle} -- subtitle as set by @subtitle
1033 # $T2H_THISDOC{author} -- author as set by @author
1035 # and pointer to arrays of lines which need to be printed by t2h_print_lines
1036 # $T2H_OVERVIEW -- lines of short table of contents
1037 # $T2H_TOC -- lines of table of contents
1038 # $T2H_TOP -- lines of Top texinfo node
1039 # $T2H_THIS_SECTION -- lines of 'This' section
1042 # There are the following subs which control the layout:
1044 my $T2H_print_section = \&T2H_DEFAULT_print_section;
1045 my $T2H_print_Top_header = \&T2H_DEFAULT_print_Top_header;
1046 my $T2H_print_Top_footer = \&T2H_DEFAULT_print_Top_footer;
1047 my $T2H_print_Top = \&T2H_DEFAULT_print_Top;
1048 my $T2H_print_Toc = \&T2H_DEFAULT_print_Toc;
1049 my $T2H_print_Overview = \&T2H_DEFAULT_print_Overview;
1050 my $T2H_print_Footnotes = \&T2H_DEFAULT_print_Footnotes;
1051 my $T2H_print_About = \&T2H_DEFAULT_print_About;
1052 my $T2H_print_misc_header = \&T2H_DEFAULT_print_misc_header;
1053 my $T2H_print_misc_footer = \&T2H_DEFAULT_print_misc_footer;
1054 my $T2H_print_misc = \&T2H_DEFAULT_print_misc;
1055 my $T2H_print_chapter_header = \&T2H_DEFAULT_print_chapter_header;
1056 my $T2H_print_chapter_footer = \&T2H_DEFAULT_print_chapter_footer;
1057 my $T2H_print_page_head = \&T2H_DEFAULT_print_page_head;
1058 my $T2H_print_page_foot = \&T2H_DEFAULT_print_page_foot;
1059 my $T2H_print_head_navigation = \&T2H_DEFAULT_print_head_navigation;
1060 my $T2H_print_foot_navigation = \&T2H_DEFAULT_print_foot_navigation;
1061 my $T2H_button_icon_img = \&T2H_DEFAULT_button_icon_img;
1062 my $T2H_print_navigation = \&T2H_DEFAULT_print_navigation;
1063 my $T2H_about_body = \&T2H_DEFAULT_about_body;
1064 my $T2H_print_frame = \&T2H_DEFAULT_print_frame;
1065 my $T2H_print_toc_frame = \&T2H_DEFAULT_print_toc_frame;
1067 ########################################################################
1068 # Layout for html for every sections
1070 sub T2H_DEFAULT_print_section
1073 local $T2H_BUTTONS = \@T2H_SECTION_BUTTONS;
1074 &$T2H_print_head_navigation($fh) if $T2H_SECTION_NAVIGATION;
1075 my $nw = t2h_print_lines($fh);
1076 if (defined $T2H_SPLIT
1077 and ($T2H_SPLIT eq 'section' && $T2H_SECTION_NAVIGATION))
1079 &$T2H_print_foot_navigation($fh, $nw);
1083 print $fh '<HR SIZE="6">' . "\n";
1087 ###################################################################
1088 # Layout of top-page I recommend that you use @ifnothtml, @ifhtml,
1089 # @html within the Top texinfo node to specify content of top-level
1092 # If you enclose everything in @ifnothtml, then title, subtitle,
1093 # author and overview is printed
1094 # T2H_HREF of Next, Prev, Up, Forward, Back are not defined
1095 # if $T2H_SPLIT then Top page is in its own html file
1096 sub T2H_DEFAULT_print_Top_header
1098 &$T2H_print_page_head(@_) if $T2H_SPLIT;
1099 t2h_print_label(@_); # this needs to be called, otherwise no label set
1100 &$T2H_print_head_navigation(@_);
1102 sub T2H_DEFAULT_print_Top_footer
1104 &$T2H_print_foot_navigation(@_);
1105 &$T2H_print_page_foot(@_) if $T2H_SPLIT;
1107 sub T2H_DEFAULT_print_Top
1111 # for redefining navigation buttons use:
1112 # local $T2H_BUTTONS = [...];
1113 # as it is, 'Top', 'Contents', 'Index', 'About' are printed
1114 local $T2H_BUTTONS = \@T2H_MISC_BUTTONS;
1115 &$T2H_print_Top_header($fh);
1116 if ($T2H_THIS_SECTION)
1118 # if top-level node has content, then print it with extra header
1119 print $fh "<H1>$T2H_NAME{Top}</H1>\n"
1120 unless ($T2H_HAS_TOP_HEADING);
1121 t2h_print_lines($fh, $T2H_THIS_SECTION)
1125 # top-level node is fully enclosed in @ifnothtml
1126 # print fulltitle, subtitle, author, Overview
1129 join("</H1>\n<H1>", split(/\n/, $T2H_THISDOC{fulltitle})) .
1131 print $fh "<H2>$T2H_THISDOC{subtitle}</H2>\n" if $T2H_THISDOC{subtitle};
1132 print $fh "$T2H_THISDOC{author}\n" if $T2H_THISDOC{author};
1137 <H2> Overview: </H2>
1140 t2h_print_lines($fh, $T2H_OVERVIEW);
1141 print $fh "</BLOCKQUOTE>\n";
1143 &$T2H_print_Top_footer($fh);
1146 ###################################################################
1147 # Layout of Toc, Overview, and Footnotes pages
1148 # By default, we use "normal" layout
1149 # T2H_HREF of Next, Prev, Up, Forward, Back, etc are not defined
1150 # use: local $T2H_BUTTONS = [...] to redefine navigation buttons
1151 sub T2H_DEFAULT_print_Toc
1153 return &$T2H_print_misc(@_);
1155 sub T2H_DEFAULT_print_Overview
1157 return &$T2H_print_misc(@_);
1159 sub T2H_DEFAULT_print_Footnotes
1161 return &$T2H_print_misc(@_);
1163 sub T2H_DEFAULT_print_About
1165 return &$T2H_print_misc(@_);
1168 sub T2H_DEFAULT_print_misc_header
1170 &$T2H_print_page_head(@_) if $T2H_SPLIT;
1171 # this needs to be called, otherwise, no labels are set
1172 t2h_print_label(@_);
1173 &$T2H_print_head_navigation(@_);
1175 sub T2H_DEFAULT_print_misc_footer
1177 &$T2H_print_foot_navigation(@_);
1178 &$T2H_print_page_foot(@_) if $T2H_SPLIT;
1180 sub T2H_DEFAULT_print_misc
1183 local $T2H_BUTTONS = \@T2H_MISC_BUTTONS;
1184 &$T2H_print_misc_header($fh);
1185 print $fh "<H1>$T2H_NAME{This}</H1>\n";
1186 t2h_print_lines($fh);
1187 &$T2H_print_misc_footer($fh);
1190 ###################################################################
1191 # chapter_header and chapter_footer are only called if
1192 # T2H_SPLIT eq 'chapter'
1193 # chapter_header: after print_page_head, before print_section
1194 # chapter_footer: after print_section of last section, before print_page_foot
1196 # If you want to get rid of navigation stuff after each section,
1197 # redefine print_section such that it does not call print_navigation,
1198 # and put print_navigation into print_chapter_header
1199 @T2H_CHAPTER_BUTTONS =
1201 'FastBack', 'FastForward', ' ',
1203 'Top', 'Contents', 'Index', 'About',
1206 sub T2H_DEFAULT_print_chapter_header
1208 # nothing to do there, by default
1209 if (! $T2H_SECTION_NAVIGATION)
1212 local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS;
1213 &$T2H_print_navigation($fh);
1214 print $fh "\n<HR SIZE=2>\n";
1218 sub T2H_DEFAULT_print_chapter_footer
1220 local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS;
1221 &$T2H_print_navigation(@_);
1223 ###################################################################
1226 my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
1228 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
1229 $year += ($year < 70) ? 2000 : 1900;
1230 # obachman: Let's do it as the Americans do
1231 return($MONTH_NAMES->{$T2H_LANG}[$mon] . ", " . $mday . " " . $year);
1235 ###################################################################
1236 # Layout of standard header and footer
1239 # This init routine is called at the beginning of pass5 before first
1240 # output is generated.
1243 # Set the default body text, inserted between <BODY ... >
1244 $T2H_BODYTEXT = 'LANG="' . $T2H_LANG . '" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"';
1245 # text inserted after <BODY ...>
1246 $T2H_AFTER_BODY_OPEN = '';
1247 #text inserted before </BODY>
1248 $T2H_PRE_BODY_CLOSE = '';
1249 # this is used in footer
1250 $T2H_ADDRESS = "<I>$T2H_USER</I> " if $T2H_USER;
1251 $T2H_ADDRESS .= "on <I>$T2H_TODAY</I>";
1252 # this is added inside <HEAD></HEAD> after <TITLE> and some META NAME stuff
1253 # can be used for <style> <script>, <meta> tags
1254 $T2H_EXTRA_HEAD = '';
1257 sub T2H_DEFAULT_print_page_head
1260 my $longtitle = "$T2H_THISDOC{title}";
1261 $longtitle .= ": $T2H_NAME{This}" if exists $T2H_NAME{This};
1265 <!-- Created on $T2H_TODAY by $THISPROG -->
1270 <TITLE>$longtitle</TITLE>
1272 <META NAME="description" CONTENT="$longtitle">
1273 <META NAME="keywords" CONTENT="$longtitle">
1274 <META NAME="resource-type" CONTENT="document">
1275 <META NAME="distribution" CONTENT="global">
1276 <META NAME="Generator" CONTENT="$THISPROG">
1280 <BODY $T2H_BODYTEXT>
1281 $T2H_AFTER_BODY_OPEN
1285 sub T2H_DEFAULT_print_page_foot
1291 This document was generated
1293 using <A HREF="$T2H_HOMEPAGE"><I>texi2html</I></A>
1301 ###################################################################
1302 # Layout of navigation panel
1304 # if this is set, then a vertical navigation panel is used
1305 my $T2H_VERTICAL_HEAD_NAVIGATION = 0;
1306 sub T2H_DEFAULT_print_head_navigation
1309 if ($T2H_VERTICAL_HEAD_NAVIGATION)
1312 <TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
1317 &$T2H_print_navigation($fh, $T2H_VERTICAL_HEAD_NAVIGATION);
1318 if ($T2H_VERTICAL_HEAD_NAVIGATION)
1325 elsif (defined $T2H_SPLIT
1326 and ($T2H_SPLIT eq 'section'))
1328 print $fh "<HR SIZE=1>\n";
1332 # Specifies the minimum page length required before a navigation panel
1333 # is placed at the bottom of a page (the default is that of latex2html)
1334 # T2H_THIS_WORDS_IN_PAGE holds number of words of current page
1335 my $T2H_WORDS_IN_PAGE = 300;
1336 sub T2H_DEFAULT_print_foot_navigation
1340 if ($T2H_VERTICAL_HEAD_NAVIGATION)
1348 print $fh "<HR SIZE=1>\n";
1349 &$T2H_print_navigation($fh) if (defined $nwords
1350 and $nwords >= $T2H_WORDS_IN_PAGE)
1353 ######################################################################
1356 # specify in this array which "buttons" should appear in which order
1357 # in the navigation panel for sections; use ' ' for empty buttons (space)
1358 @T2H_SECTION_BUTTONS =
1360 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward',
1362 'Top', 'Contents', 'Index', 'About',
1365 # buttons for misc stuff
1366 @T2H_MISC_BUTTONS = ('Top', 'Contents', 'Index', 'About');
1368 # insert here name of icon images for buttons
1369 # Icons are used, if $T2H_ICONS and resp. value are set
1389 # insert here name of icon images for these, if button is inactive
1390 %T2H_PASSIVE_ICONS =
1408 # how to create IMG tag
1409 sub T2H_DEFAULT_button_icon_img
1414 return qq{<IMG SRC="$icon" BORDER="0" ALT="$button: $name" ALIGN="MIDDLE">};
1417 # Names of text as alternative for icons
1418 %T2H_NAVIGATION_TEXT =
1421 'Contents', 'Contents',
1422 'Overview', 'Overview',
1426 'FastBack', ' << ',
1430 'Forward', ' > ',
1431 'FastForward', ' >> ',
1437 sub T2H_DEFAULT_print_navigation
1440 my $vertical = shift;
1442 print $fh "<TABLE CELLPADDING=$spacing CELLSPACING=$spacing BORDER=0>\n";
1444 print $fh "<TR>" unless $vertical;
1445 for $button (@$T2H_BUTTONS)
1447 print $fh qq{<TR VALIGN="TOP" ALIGN="LEFT">\n} if $vertical;
1448 print $fh qq{<TD VALIGN="MIDDLE" ALIGN="LEFT">};
1450 if (ref($button) eq 'CODE')
1452 &$button($fh, $vertical);
1454 elsif ($button eq ' ')
1455 { # handle space button
1457 $T2H_ICONS && $T2H_ACTIVE_ICONS{' '} ?
1458 &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{' '}) :
1459 $T2H_NAVIGATION_TEXT{' '};
1462 elsif ($T2H_HREF{$button})
1463 { # button is active
1465 $T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? # use icon ?
1466 t2h_anchor('', $T2H_HREF{$button}, # yes
1467 &$T2H_button_icon_img($button,
1468 $T2H_ACTIVE_ICONS{$button},
1469 $T2H_NAME{$button}))
1472 t2h_anchor('', $T2H_HREF{$button}, $T2H_NAVIGATION_TEXT{$button}) .
1476 { # button is passive
1478 $T2H_ICONS && $T2H_PASSIVE_ICONS{$button} ?
1479 &$T2H_button_icon_img($button,
1480 $T2H_PASSIVE_ICONS{$button},
1481 $T2H_NAME{$button}) :
1483 "[" . $T2H_NAVIGATION_TEXT{$button} . "]";
1485 print $fh "</TD>\n";
1486 print $fh "</TR>\n" if $vertical;
1488 print $fh "</TR>" unless $vertical;
1489 print $fh "</TABLE>\n";
1492 ######################################################################
1493 # Frames: this is from "Richard Y. Kim" <ryk@coho.net>
1494 # Should be improved to be more conforming to other _print* functions
1496 sub T2H_DEFAULT_print_frame
1501 <HEAD><TITLE>$T2H_THISDOC{title}</TITLE></HEAD>
1502 <FRAMESET cols="140,*">
1503 <FRAME name=toc src="$docu_toc_frame_file">
1504 <FRAME name=main src="$docu_doc">
1510 sub T2H_DEFAULT_print_toc_frame
1513 &$T2H_print_page_head($fh);
1517 print $fh map {s/HREF=/target=\"main\" HREF=/; $_;} @stoc_lines;
1518 print $fh "</BODY></HTML>\n";
1521 ######################################################################
1525 # T2H_PRE_ABOUT might be a function
1526 my $T2H_PRE_ABOUT = <<EOT;
1527 This document was generated
1529 using <A HREF=\"$T2H_HOMEPAGE\"><I>texi2html</I></A>
1532 my $T2H_AFTER_ABOUT = '';
1534 sub T2H_DEFAULT_about_body
1537 if (ref($T2H_PRE_ABOUT) eq 'CODE')
1539 $about = &$T2H_PRE_ABOUT();
1543 $about = $T2H_PRE_ABOUT;
1546 The buttons in the navigation panels have the following meaning:
1548 <table border = "1">
1553 <TH> From 1.2.3 go to</TH>
1557 for $button (@T2H_SECTION_BUTTONS)
1559 next if $button eq ' ' || ref($button) eq 'CODE';
1565 ($T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ?
1566 &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{$button}) :
1567 " [" . $T2H_NAVIGATION_TEXT{$button} . "] ");
1574 $T2H_BUTTONS_GOTO{$button}
1577 $T2H_BUTTONS_EXAMPLE{$button}
1586 where the <STRONG> Example </STRONG> assumes that the current position
1587 is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of
1588 the following structure:</P>
1592 <LI>1.1 Subsection One-One
1596 <LI>1.2 Subsection One-Two
1598 <LI>1.2.1 Subsubsection One-Two-One</LI>
1599 <LI>1.2.2 Subsubsection One-Two-Two</LI>
1600 <LI>1.2.3 Subsubsection One-Two-Three
1601 <STRONG><== Current Position </STRONG></LI>
1602 <LI>1.2.4 Subsubsection One-Two-Four</LI>
1605 <LI>1.3 Subsection One-Three
1610 <LI>1.4 Subsection One-Four</LI>
1622 'Top', 'cover (top) of document',
1623 'Contents', 'table of contents',
1624 'Overview', 'short table of contents',
1625 'Index', 'concept index',
1626 'Back', 'previous section in reading order',
1627 'FastBack', 'beginning of this chapter or previous chapter',
1628 'Prev', 'previous section same level',
1630 'Next', 'next section same level',
1631 'Forward', 'next section in reading order',
1632 'FastForward', 'next chapter',
1633 'About' , 'this page',
1634 'First', 'first section in reading order',
1635 'Last', 'last section in reading order',
1638 %T2H_BUTTONS_EXAMPLE =
1641 'Contents', ' ',
1642 'Overview', ' ',
1643 'Index', ' ',
1651 'About', ' ',
1657 ######################################################################
1658 # from here on, its l2h init stuff
1661 ## initialization for latex2html as for Singular manual generation
1665 # Options controlling Titles, File-Names, Tracing and Sectioning
1673 $DESTDIR = ''; # should be overwritten by cmd-line argument
1675 $NO_SUBDIR = 0; # should be overwritten by cmd-line argument
1677 $PREFIX = ''; # should be overwritten by cmd-line argument
1679 $AUTO_PREFIX = 0; # this is needed, so that prefix settings are used
1685 $MAX_LINK_DEPTH = 0;
1687 $TMP = ''; # should be overwritten by cmd-line argument
1694 # Options controlling Extensions and Special Features
1696 $HTML_VERSION = "3.2";
1698 $TEXDEFS = 1; # we absolutely need that
1700 $EXTERNAL_FILE = '';
1702 $SCALABLE_FONTS = 1;
1704 $NO_SIMPLE_MATH = 1;
1717 # Switches controlling Image Generation
1723 $EXTERNAL_IMAGES = 0;
1735 $ANTI_ALIAS_TEXT = 1;
1738 #Switches controlling Navigation Panels
1742 $INFO = 0; # 0 = do not make a "About this document..." section
1745 #Switches for Linking to other documents
1747 # currently -- we don't care
1749 $MAX_SPLIT_DEPTH = 0; # Stop making separate files at this depth
1751 $MAX_LINK_DEPTH = 0; # Stop showing child nodes at this depth
1753 $NOLATEX = 0; # 1 = do not pass unknown environments to Latex
1755 $EXTERNAL_IMAGES = 0; # 1 = leave the images outside the document
1757 $ASCII_MODE = 0; # 1 = do not use any icons or internal images
1759 # 1 = use links to external postscript images rather than inlined bitmap
1762 $SHOW_SECTION_NUMBERS = 0;
1764 ### Other global variables ###############################################
1767 # This is the line width measured in pixels and it is used to right justify
1768 # equations and equation arrays;
1771 # Used in conjunction with AUTO_NAVIGATION
1772 $WORDS_IN_PAGE = 300;
1774 # Affects ONLY the way accents are processed
1775 $default_language = 'english';
1777 # The value of this variable determines how many words to use in each
1778 # title that is added to the navigation panel (see below)
1780 $WORDS_IN_NAVIGATION_PANEL_TITLES = 0;
1782 # This number will determine the size of the equations, special characters,
1783 # and anything which will be converted into an inlined image
1784 # *except* "image generating environments" such as "figure", "table"
1786 # Effective values are those greater than 0.
1787 # Sensible values are between 0.1 - 4.
1788 $MATH_SCALE_FACTOR = 1.5;
1790 # This number will determine the size of
1791 # image generating environments such as "figure", "table" or "minipage".
1792 # Effective values are those greater than 0.
1793 # Sensible values are between 0.1 - 4.
1794 $FIGURE_SCALE_FACTOR = 1.6;
1797 # If both of the following two variables are set then the "Up" button
1798 # of the navigation panel in the first node/page of a converted document
1799 # will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set
1800 # to some text which describes this external link.
1801 $EXTERNAL_UP_LINK = "";
1802 $EXTERNAL_UP_TITLE = "";
1804 # If this is set then the resulting HTML will look marginally better if viewed
1808 # Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0"
1809 # Paper sizes has no effect other than in the time it takes to create inlined
1810 # images and in whether large images can be created at all ie
1811 # - larger paper sizes *MAY* help with large image problems
1812 # - smaller paper sizes are quicker to handle
1815 # Replace "english" with another language in order to tell LaTeX2HTML that you
1816 # want some generated section titles (eg "Table of Contents" or "References")
1817 # to appear in a different language. Currently only "english" and "french"
1818 # is supported but it is very easy to add your own. See the example in the
1819 # file "latex2html.config"
1820 $TITLES_LANGUAGE = "english";
1822 1; # This must be the last non-comment line
1824 # End File texi2html.init
1825 ######################################################################
1828 require "$ENV{T2H_HOME}/texi2html.init"
1829 if ($0 =~ /\.pl$/ &&
1830 -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init");
1832 #+++############################################################################
1835 # Pasted content of File $(srcdir)/MySimple.pm: Command-line processing #
1837 #---############################################################################
1839 # leave this within comments, and keep the require statement
1840 # This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
1844 package Getopt::MySimple;
1850 # POD-style (incomplete) documentation is in file MySimple.pod
1856 # Ron Savage rpsavage@ozemail.com.au.
1857 # 1.00 19-Aug-97 Initial version.
1858 # 1.10 13-Oct-97 Add arrays of switches (eg '=s@').
1859 # 1.20 3-Dec-97 Add 'Help' on a per-switch basis.
1860 # 1.30 11-Dec-97 Change 'Help' to 'verbose'. Make all hash keys lowercase.
1861 # 1.40 10-Nov-98 Change width of help report. Restructure tests.
1862 # 1-Jul-00 Modifications for Texi2html
1864 # --------------------------------------------------------------------------
1865 # Locally modified by obachman (Display type instead of env, order by cmp)
1866 # $Id: texi2html,v 1.1 2004-09-26 21:06:17 blp Exp $
1871 use vars qw(@EXPORT @EXPORT_OK @ISA);
1872 use vars qw($fieldWidth $opt $VERSION);
1877 @ISA = qw(Exporter);
1879 @EXPORT_OK = qw($opt); # An alias for $self -> {'opt'}.
1881 # --------------------------------------------------------------------------
1886 # --------------------------------------------------------------------------
1892 return uc($a) cmp (uc($b));
1895 # --------------------------------------------------------------------------
1901 print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n";
1903 for (sort byOrder keys(%{$self -> {'opt'} }) )
1905 print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n";
1910 } # End of dumpOptions.
1912 # --------------------------------------------------------------------------
1919 push(@_, 0) if ($#_ == 2); # Default for $ignoreCase is 0.
1920 push(@_, 1) if ($#_ == 3); # Default for $helpThenExit is 1.
1922 my($self, $default, $helpText, $versionText,
1923 $helpThenExit, $versionThenExit, $ignoreCase) = @_;
1925 $helpThenExit = 1 unless (defined($helpThenExit));
1926 $versionThenExit = 1 unless (defined($versionThenExit));
1927 $ignoreCase = 0 unless (defined($ignoreCase));
1929 $self -> {'default'} = $default;
1930 $self -> {'helpText'} = $helpText;
1931 $self -> {'versionText'} = $versionText;
1932 $Getopt::Long::ignorecase = $ignoreCase;
1934 unless (defined($self -> {'default'}{'help'}))
1936 $self -> {'default'}{'help'} =
1940 linkage => sub {$self->helpOptions($_[1]); exit (0) if $helpThenExit;},
1941 verbose => "print help and exit"
1945 unless (defined($self -> {'default'}{'version'}))
1947 $self -> {'default'}{'version'} =
1951 linkage => sub {print $self->{'versionText'}; exit (0) if $versionThenExit;},
1952 verbose => "print version and exit"
1956 for (keys(%{$self -> {'default'} }) )
1958 my $type = ${$self -> {'default'} }{$_}{'type'};
1959 push(@{$self -> {'type'} }, "$_$type");
1960 $self->{'opt'}->{$_} = ${$self -> {'default'} }{$_}{'linkage'}
1961 if ${$self -> {'default'} }{$_}{'linkage'};
1964 my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} });
1966 return $result unless $result;
1968 for (keys(%{$self -> {'default'} }) )
1970 if (! defined(${$self -> {'opt'} }{$_})) #{
1972 ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'};
1977 } # End of getOptions.
1979 # --------------------------------------------------------------------------
1984 my($noHelp) = shift;
1985 $noHelp = 0 unless $noHelp;
1986 my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth)
1987 = (10, 5, 9, 78, 4, 11);
1989 print "$self->{'helpText'}" if ($self -> {'helpText'});
1991 print ' Option', ' ' x ($optwidth - length('Option') -1 ),
1992 'Type', ' ' x ($typewidth - length('Type') + 1),
1993 'Default', ' ' x ($defaultwidth - length('Default') ),
1996 for (sort byOrder keys(%{$self -> {'default'} }) )
1998 my($line, $help, $option, $val);
2000 next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp;
2001 #$line = " -$_" . ' ' x ($optwidth - (2 + length) ) .
2002 # "${$self->{'default'} }{$_}{'type'} ".
2003 # ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) ));
2004 $line = " -$_" . "${$self->{'default'} }{$_}{'type'}".
2005 ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) ));
2007 $val = ${$self->{'default'} }{$_}{'linkage'};
2010 if (ref($val) eq 'SCALAR')
2021 $val = ${$self->{'default'} }{$_}{'default'};
2024 $line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line));
2026 if (defined(${$self -> {'default'} }{$_}{'verbose'}) &&
2027 ${$self -> {'default'} }{$_}{'verbose'} ne '')
2029 $help = "${$self->{'default'} }{$_}{'verbose'}";
2035 if ((length("$line") + length($help)) < $maxlinewidth)
2037 print $line , $help, "\n";
2041 print $line, "\n", ' ' x $valind, $help, "\n";
2043 for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}}))
2045 print ' ' x ($valind + 2);
2046 print $val, ' ', ' ' x ($valwidth - length($val) - 2);
2047 print ${$self->{'default'}}{$option}{'values'}{$val}, "\n";
2052 Note: 'Options' may be abbreviated. 'Type' specifications mean:
2053 <none>| ! no argument: variable is set to 1 on -foo (or, to 0 on -nofoo)
2054 =s | :s mandatory (or, optional) string argument
2055 =i | :i mandatory (or, optional) integer argument
2057 } # End of helpOptions.
2059 #-------------------------------------------------------------------
2065 $self -> {'default'} = {};
2066 $self -> {'helpText'} = '';
2067 $self -> {'opt'} = {};
2068 $opt = $self -> {'opt'}; # An alias for $self -> {'opt'}.
2069 $self -> {'type'} = ();
2071 return bless $self, $class;
2075 # --------------------------------------------------------------------------
2081 require "$ENV{T2H_HOME}/MySimple.pm"
2082 if ($0 =~ /\.pl$/ &&
2083 -e "$ENV{T2H_HOME}/MySimple.pm" && -r "$ENV{T2H_HOME}/MySimple.pm");
2087 #+++############################################################################
2091 #---############################################################################
2103 $BIBRE = '\[[\w\/-]+\]'; # RE for a bibliography reference
2104 $FILERE = '[\/\w.+-]+'; # RE for a file name
2105 $VARRE = '[^\s\{\}]+'; # RE for a variable name
2106 $NODERE = '[^,:]+'; # RE for a node name
2107 $NODESRE = '[^:]+'; # RE for a list of node names
2109 $ERROR = "***"; # prefix for errors
2110 $WARN = "**"; # prefix for warnings
2113 $PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections
2115 $CHAPTEREND = "<!-- End chapter -->\n"; # to know where a chpater ends
2116 $SECTIONEND = "<!-- End section -->\n"; # to know where section ends
2117 $TOPEND = "<!-- End top -->\n"; # to know where top ends
2122 # pre-defined indices
2126 'c' => { name => 'cp'},
2127 'f' => { name => 'fn', code => 1},
2128 'v' => { name => 'vr', code => 1},
2129 'k' => { name => 'ky', code => 1},
2130 'p' => { name => 'pg', code => 1},
2131 't' => { name => 'tp', code => 1}
2135 %predefined_index = (
2157 # texinfo section names to level
2170 'appendixsection', 2,
2172 'unnumberedsubsec', 3,
2174 'appendixsubsec', 3,
2176 'unnumberedsubsubsec', 4,
2178 'appendixsubsubsec', 4,
2182 # accent map, TeX command to ISO name
2193 # texinfo "simple things" (@foo) to HTML ones
2197 "*", "<BR>", # HTML+
2200 "-", "­", # soft hyphen
2203 'tab', '<\/TD><TD>',
2213 # texinfo "things" (@foo{}) to HTML ones
2217 'br', '<P>', # paragraph break
2219 #'copyright', '(C)',
2220 'copyright', '©',
2221 'dots', '<small>...<\/small>',
2222 'enddots', '<small>....<\/small>',
2224 'error', 'error-->',
2230 # APA: &pretty_date requires $MONTH_NAMES and $T2H_LANG
2231 # to be initialized. The latter gets initialized by
2232 # &SetDocumentLanguage in &main.
2233 # We set following hash entry in &main afterwards.
2234 # 'today', &pretty_date,
2246 'exclamdown', '¡',
2247 'questiondown', '¿',
2252 # texinfo styles (@foo{bar}) to HTML ones
2255 'acronym', '&do_acronym',
2261 'ctrl', '&do_ctrl', # special case
2262 'dfn', 'EM', # DFN tag is illegal in the standard
2263 'dmn', '', # useless
2264 'email', '&do_email', # insert a clickable email address
2267 'file', '"TT', # will put quotes, cf. &apply_style
2272 'option', '"SAMP', # will put quotes, cf. &apply_style
2273 'r', '', # unsupported
2274 'samp', '"SAMP', # will put quotes, cf. &apply_style
2275 'sc', '&do_sc', # special case
2278 'titlefont', '', # useless
2279 'uref', '&do_uref', # insert a clickable URL
2280 'url', '&do_url', # insert a clickable URL
2282 'w', '', # unsupported
2284 'dotaccent', '&do_accent',
2285 'ringaccent','&do_accent',
2286 'tieaccent', '&do_accent',
2288 'ubaraccent','&do_accent',
2289 'udotaccent','&do_accent',
2292 'dotless', '&do_accent'
2296 # texinfo format (@foo/@end foo) to HTML ones
2299 'quotation', 'BLOCKQUOTE',
2305 'flushright', 'PRE',
2309 # an eval of these $complex_format_map->{what}->[0] yields beginning
2310 # an eval of these $complex_format_map->{what}->[1] yieleds end
2311 $complex_format_map =
2315 q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=example><pre>"},
2316 q{'</pre></td></tr></table>'}
2320 q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smallexample><pre><FONT SIZE=$T2H_SMALL_FONT_SIZE>"},
2321 q{'</FONT></pre></td></tr></table>'}
2325 q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=display><pre " . 'style="font-family: serif">'},
2326 q{'</pre></td></tr></table>'}
2330 q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smalldisplay><pre " . 'style="font-family: serif"><FONT SIZE=$T2H_SMALL_FONT_SIZE>'},
2331 q{'</FONT></pre></td></tr></table>'}
2335 $complex_format_map->{lisp} = $complex_format_map->{example};
2336 $complex_format_map->{smalllisp} = $complex_format_map->{smallexample};
2337 $complex_format_map->{format} = $complex_format_map->{display};
2338 $complex_format_map->{smallformat} = $complex_format_map->{smalldisplay};
2341 # texinfo definition shortcuts to real ones
2363 'defun', 'deffn Function',
2364 'defmac', 'deffn Macro',
2365 'defspec', 'deffn {Special Form}',
2366 'defvar', 'defvr Variable',
2367 'defopt', 'defvr {User Option}',
2368 'deftypefun', 'deftypefn Function',
2369 'deftypevar', 'deftypevr Variable',
2370 'defivar', 'defcv {Instance Variable}',
2371 'deftypeivar', 'defcv {Instance Variable}', # NEW: FIXME
2372 'defmethod', 'defop Method',
2373 'deftypemethod', 'defop Method', # NEW:FIXME
2375 'defunx', 'deffnx Function',
2376 'defmacx', 'deffnx Macro',
2377 'defspecx', 'deffnx {Special Form}',
2378 'defvarx', 'defvrx Variable',
2379 'defoptx', 'defvrx {User Option}',
2380 'deftypefunx', 'deftypefnx Function',
2381 'deftypevarx', 'deftypevrx Variable',
2382 'defivarx', 'defcvx {Instance Variable}',
2383 'defmethodx', 'defopx Method',
2404 'summarycontents', 1,
2410 # unsupported commands (formatting)
2418 'setchapternewpage', 1,
2428 'paragraphindent', 1,
2429 # unsupported formats
2436 #+++############################################################################
2438 # Argument parsing, initialisation #
2440 #---############################################################################
2443 # flush stdout and stderr after every write
2451 %value = (); # hold texinfo variables, see also -D
2452 $use_bibliography = 1;
2456 # called on -init-file
2459 my $init_file = shift;
2460 # second argument is value of options
2464 print "# reading initialization file from $init_file\n"
2466 require($init_file);
2470 print "$ERROR Error: can't read init file $int_file\n";
2477 sub SetDocumentLanguage
2480 if (! exists($T2H_WORDS->{$lang}))
2482 warn "$ERROR: Language specs for '$lang' do not exists. Reverting to '" .
2483 ($T2H_LANG ? $T2H_LANG : "en") . "'\n";
2487 print "# using '$lang' as document language\n" if ($T2H_VERBOSE);
2493 ## obsolete cmd line options
2495 $T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} =
2498 linkage => sub {$T2H_SECTION_NAVIGATION = 0;},
2499 verbose => 'obsolete, use -nosec_nav',
2502 $T2H_OBSOLETE_OPTIONS -> {use_acc} =
2505 linkage => \$use_acc,
2506 verbose => 'obsolete',
2509 $T2H_OBSOLETE_OPTIONS -> {expandinfo} =
2512 linkage => sub {$T2H_EXPAND = 'info';},
2513 verbose => 'obsolete, use "-expand info" instead',
2516 $T2H_OBSOLETE_OPTIONS -> {expandtex} =
2519 linkage => sub {$T2H_EXPAND = 'tex';},
2520 verbose => 'obsolete, use "-expand tex" instead',
2523 $T2H_OBSOLETE_OPTIONS -> {monolithic} =
2526 linkage => sub {$T2H_SPLIT = '';},
2527 verbose => 'obsolete, use "-split no" instead',
2530 $T2H_OBSOLETE_OPTIONS -> {split_node} =
2533 linkage => sub{$T2H_SPLIT = 'section';},
2534 verbose => 'obsolete, use "-split section" instead',
2537 $T2H_OBSOLETE_OPTIONS -> {split_chapter} =
2540 linkage => sub{$T2H_SPLIT = 'chapter';},
2541 verbose => 'obsolete, use "-split chapter" instead',
2544 $T2H_OBSOLETE_OPTIONS -> {no_verbose} =
2547 linkage => sub {$T2H_VERBOSE = 0;},
2548 verbose => 'obsolete, use -noverbose instead',
2551 $T2H_OBSOLETE_OPTIONS -> {output_file} =
2554 linkage => sub {$T2H_OUT = $_[1]; $T2H_SPLIT = '';},
2555 verbose => 'obsolete, use -out_file instead',
2559 $T2H_OBSOLETE_OPTIONS -> {section_navigation} =
2562 linkage => \$T2H_SECTION_NAVIGATION,
2563 verbose => 'obsolete, use -sec_nav instead',
2567 $T2H_OBSOLETE_OPTIONS -> {verbose} =
2570 linkage => \$T2H_VERBOSE,
2571 verbose => 'obsolete, use -Verbose instead',
2575 # read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc
2576 my $home = $ENV{HOME};
2577 defined($home) or $home = '';
2578 foreach $i ('/etc/texi2htmlrc', "$home/.texi2htmlrc")
2582 print "# reading initialization file from $i\n"
2589 #+++############################################################################
2591 # parse command-line options
2593 #---############################################################################
2594 $T2H_USAGE_TEXT = <<EOT;
2595 Usage: texi2html [OPTIONS] TEXINFO-FILE
2596 Translates Texinfo source documentation to HTML.
2598 $T2H_FAILURE_TEXT = <<EOT;
2599 Try 'texi2html -help' for usage instructions.
2601 $options = new Getopt::MySimple;
2603 # some older version of GetOpt::Long don't have
2604 # Getopt::Long::Configure("pass_through")
2605 eval {Getopt::Long::Configure("pass_through");};
2606 $Configure_failed = $@ && <<EOT;
2607 **WARNING: Parsing of obsolete command-line options could have failed.
2608 Consider to use only documented command-line options (run
2609 'texi2html -help 2' for a complete list) or upgrade to perl
2610 version 5.005 or higher.
2613 if (! $options->getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
2615 print $Configure_failed if $Configure_failed;
2616 die $T2H_FAILURE_TEXT;
2621 eval {Getopt::Long::Configure("no_pass_through");};
2622 if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
2624 print $Configure_failed if $Configure_failed;
2625 die $T2H_FAILURE_TEXT;
2631 die "Need file to check\n$T2H_FAILURE_TEXT" unless @ARGV > 0;
2636 #+++############################################################################
2638 # evaluation of cmd line options
2640 #---############################################################################
2642 if ($T2H_EXPAND eq 'info')
2644 $to_skip{'ifinfo'} = 1;
2645 $to_skip{'end ifinfo'} = 1;
2647 elsif ($T2H_EXPAND eq 'tex')
2649 $to_skip{'iftex'} = 1;
2650 $to_skip{'end iftex'} = 1;
2654 $T2H_INVISIBLE_MARK = '<IMG SRC="invisible.xbm">' if $T2H_INVISIBLE_MARK eq 'xbm';
2657 # file name buisness
2659 die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1;
2660 $docu = shift(@ARGV);
2661 if ($docu =~ /.*\//)
2663 chop($docu_dir = $&);
2671 unshift(@T2H_INCLUDE_DIRS, $docu_dir);
2672 $docu_name =~ s/\.te?x(i|info)?$//; # basename of the document
2673 $docu_name = $T2H_PREFIX if ($T2H_PREFIX);
2676 if ($T2H_SUBDIR && ! $T2H_OUT)
2678 $T2H_SUBDIR =~ s|/*$||;
2679 unless (-d "$T2H_SUBDIR" && -w "$T2H_SUBDIR")
2681 if ( mkdir($T2H_SUBDIR, oct(755)))
2683 print "# created directory $T2H_SUBDIR\n" if ($T2H_VERBOSE);
2687 warn "$ERROR can't create directory $T2H_SUBDIR. Put results into current directory\n";
2693 if ($T2H_SUBDIR && ! $T2H_OUT)
2695 $docu_rdir = "$T2H_SUBDIR/";
2696 print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
2700 if ($T2H_OUT && $T2H_OUT =~ m|(.*)/|)
2703 print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
2707 print "# putting result files into current directory \n" if ($T2H_VERBOSE);
2721 if ($T2H_TOP_FILE =~ /\..*$/)
2723 $T2H_TOP_FILE = $`.".$docu_ext";
2727 if (! $T2H_OUT && ($T2H_SPLIT =~ /section/i || $T2H_SPLIT =~ /node/i))
2729 $T2H_SPLIT = 'section';
2731 elsif (! $T2H_OUT && $T2H_SPLIT =~ /chapter/i)
2733 $T2H_SPLIT = 'chapter'
2740 $docu_doc = "$docu_name.$docu_ext"; # document's contents
2741 $docu_doc_file = "$docu_rdir$docu_doc";
2744 $docu_toc = $T2H_TOC_FILE || "${docu_name}_toc.$docu_ext"; # document's table of contents
2745 $docu_stoc = "${docu_name}_ovr.$docu_ext"; # document's short toc
2746 $docu_foot = "${docu_name}_fot.$docu_ext"; # document's footnotes
2747 $docu_about = "${docu_name}_abt.$docu_ext"; # about this document
2748 $docu_top = $T2H_TOP_FILE || $docu_doc;
2754 $docu_doc = $T2H_OUT;
2755 $docu_doc =~ s|.*/||;
2757 $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc;
2760 $docu_toc_file = "$docu_rdir$docu_toc";
2761 $docu_stoc_file = "$docu_rdir$docu_stoc";
2762 $docu_foot_file = "$docu_rdir$docu_foot";
2763 $docu_about_file = "$docu_rdir$docu_about";
2764 $docu_top_file = "$docu_rdir$docu_top";
2766 $docu_frame_file = "$docu_rdir${docu_name}_frame.$docu_ext";
2767 $docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext";
2772 $value{'html'} = 1; # predefine html (the output format)
2773 $value{'texi2html'} = $THISVERSION; # predefine texi2html (the translator)
2774 # _foo: internal to track @foo
2775 foreach ('_author', '_title', '_subtitle',
2776 '_settitle', '_setfilename', '_shorttitle')
2778 $value{$_} = ''; # prevent -w warnings
2780 %node2sec = (); # node to section name
2781 %sec2node = (); # section to node name
2782 %sec2seccount = (); # section to section count
2783 %seccount2sec = (); # section count to section
2784 %sec2number = (); # section to number
2785 # $number =~ ^[\dA-Z]+\.(\d+(\.\d+)*)?$
2786 %number2sec = (); # number to section
2787 %idx2node = (); # index keys to node
2788 %node2href = (); # node to HREF
2789 %node2next = (); # node to next
2790 %node2prev = (); # node to prev
2791 %node2up = (); # node to up
2792 %bib2href = (); # bibliography reference to HREF
2793 %gloss2href = (); # glossary term to HREF
2794 @sections = (); # list of sections
2795 %tag2pro = (); # protected sections
2809 # can I use ISO8859 characters? (HTML+)
2813 $things_map{'bullet'} = "•";
2814 $things_map{'copyright'} = "©";
2815 $things_map{'dots'} = "…";
2816 $things_map{'equiv'} = "≡";
2817 $things_map{'expansion'} = "→";
2818 $things_map{'point'} = "∗";
2819 $things_map{'result'} = "⇒";
2823 # read texi2html extensions (if any)
2825 $extensions = 'texi2html.ext'; # extensions in working directory
2828 print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
2829 require($extensions);
2831 ($progdir = $0) =~ s/[^\/]+$//;
2832 if ($progdir && ($progdir ne './'))
2834 $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory
2837 print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
2838 require($extensions);
2843 print "# reading from $docu\n" if $T2H_VERBOSE;
2845 #########################################################################
2849 # latex2html conversions consist of three stages:
2850 # 1) ToLatex: Put "latex" code into a latex file
2851 # 2) ToHtml: Use latex2html to generate corresponding html code and images
2852 # 3) FromHtml: Extract generated code and images from latex2html run
2855 ##########################
2859 # defaults for files and names
2864 return 0 unless ($root);
2865 $l2h_name = "${root}_l2h";
2866 $l2h_latex_file = "$docu_rdir${l2h_name}.tex";
2867 $l2h_cache_file = "${docu_rdir}l2h_cache.pm";
2868 $T2H_L2H_L2H = "latex2html" unless ($T2H_L2H_L2H);
2869 # destination dir -- generated images are put there, should be the same
2870 # as dir of enclosing html document --
2871 $l2h_html_file = "$docu_rdir${l2h_name}.html";
2872 $l2h_prefix = "${l2h_name}_";
2877 ##########################
2879 # First stage: Generation of Latex file
2880 # Initialize with: l2h_InitToLatex
2881 # Add content with: l2h_ToLatex($text) --> HTML placeholder comment
2882 # Finish with: l2h_FinishToLatex
2885 $l2h_latex_preample = <<EOT;
2886 % This document was automatically generated by the l2h extenstion of texi2html
2888 \\documentclass{article}
2893 $l2h_latex_closing = <<EOT;
2897 # return used latex 1, if l2h could be initalized properly, 0 otherwise
2901 unless ($T2H_L2H_SKIP)
2903 unless (open(L2H_LATEX, ">$l2h_latex_file"))
2905 warn "$ERROR Error l2h: Can't open latex file '$latex_file' for writing\n";
2908 print "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE);
2909 print L2H_LATEX $l2h_latex_preample;
2911 # open database for caching
2913 $l2h_latex_count = 0;
2914 $l2h_to_latex_count = 0;
2915 $l2h_cached_count = 0;
2919 # print text (1st arg) into latex file (if not already there), return
2920 # HTML commentary which can be later on replaced by the latex2html
2926 $l2h_to_latex_count++;
2927 $text =~ s/(\s*)$//;
2928 # try whether we can cache it
2929 my $cached_text = l2h_FromCache($text);
2932 $l2h_cached_count++;
2933 return $cached_text;
2935 # try whether we have text already on things to do
2936 unless ($count = $l2h_to_latex{$text})
2938 $count = $l2h_latex_count;
2940 $l2h_to_latex{$text} = $count;
2941 $l2h_to_latex[$count] = $text;
2942 unless ($T2H_L2H_SKIP)
2944 print L2H_LATEX "\\begin{rawhtml}\n";
2945 print L2H_LATEX "<!-- l2h_begin ${l2h_name} ${count} -->\n";
2946 print L2H_LATEX "\\end{rawhtml}\n";
2948 print L2H_LATEX "$text\n";
2950 print L2H_LATEX "\\begin{rawhtml}\n";
2951 print L2H_LATEX "<!-- l2h_end ${l2h_name} ${count} -->\n";
2952 print L2H_LATEX "\\end{rawhtml}\n";
2955 return "<!-- l2h_replace ${l2h_name} ${count} -->";
2958 # print closing into latex file and close it
2959 sub l2h_FinishToLatex
2962 $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count;
2963 unless ($T2H_L2H_SKIP)
2965 print L2H_LATEX $l2h_latex_closing;
2968 print "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE);
2969 unless ($l2h_latex_count)
2977 ###################################
2978 # Second stage: Use latex2html to generate corresponding html code and images
2980 # l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]):
2981 # Call latex2html on $l2h_latex_file
2982 # Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir
2983 # Return 1, on success
2988 local($call, $ext, $root, $dotbug);
2991 print "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE);
2994 # Check for dot in directory where dvips will work
2997 if ($T2H_L2H_TMP =~ /\./)
2999 warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n";
3005 if (&getcwd =~ /\./)
3007 warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n";
3011 # fix it, if necessary and hope that it works
3012 $T2H_L2H_TMP = "/tmp" if ($dotbug);
3014 $call = $T2H_L2H_L2H;
3015 # use init file, if specified
3016 $call = $call . " -init_file " . $init_file if ($init_file && -f $init_file);
3018 $call .= ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir");
3019 # use l2h_tmp, if specified
3020 $call = $call . " -tmp $T2H_L2H_TMP" if ($T2H_L2H_TMP);
3021 # options we want to be sure of
3022 $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link";
3023 $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file";
3025 print "# l2h: executing '$call'\n" if ($T2H_VERBOSE);
3028 warn "l2h ***Error: '${call}' did not succeed\n";
3033 print "# l2h: latex2html finished successfully\n" if ($T2H_VERBOSE);
3038 # this is directly pasted over from latex2html
3043 die "'pwd' failed (out of memory?)\n"
3050 ##########################
3051 # Third stage: Extract generated contents from latex2html run
3052 # Initialize with: l2h_InitFromHtml
3053 # open $l2h_html_file for reading
3054 # reads in contents into array indexed by numbers
3055 # return 1, on success -- 0, otherwise
3056 # Extract Html code with: l2h_FromHtml($text)
3057 # replaces in $text all previosuly inserted comments by generated html code
3058 # returns (possibly changed) $text
3059 # Finish with: l2h_FinishFromHtml
3060 # closes $l2h_html_dir/$l2h_name.".$docu_ext"
3062 sub l2h_InitFromHtml
3064 local($h_line, $h_content, $count, %l2h_img);
3066 if (! open(L2H_HTML, "<${l2h_html_file}"))
3068 print "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n";
3071 print "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE);
3073 $l2h_html_count = 0;
3074 while ($h_line = <L2H_HTML>)
3076 if ($h_line =~ /^<!-- l2h_begin $l2h_name ([0-9]+) -->/)
3080 while ($h_line = <L2H_HTML>)
3082 if ($h_line =~ /^<!-- l2h_end $l2h_name $count -->/)
3087 $h_content = l2h_ToCache($count, $h_content);
3088 $l2h_from_html[$count] = $h_content;
3092 $h_content = $h_content.$h_line;
3096 print "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n"
3103 print "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n"
3113 my($done, $to_do, $count);
3115 while ($to_do =~ /([^\000]*)<!-- l2h_replace $l2h_name ([0-9]+) -->([^\000]*)/)
3120 $done = "<!-- l2h_end $l2h_name $count -->".$done
3121 if ($T2H_DEBUG & $DEBUG_L2H);
3123 $done = &l2h_ExtractFromHtml($count) . $done;
3125 $done = "<!-- l2h_begin $l2h_name $count -->".$done
3126 if ($T2H_DEBUG & $DEBUG_L2H);
3128 return $to_do.$done;
3132 sub l2h_ExtractFromHtml
3135 return $l2h_from_html[$count] if ($l2h_from_html[$count]);
3136 if ($count >= 0 && $count < $l2h_latex_count)
3138 # now we are in trouble
3141 $l2h_extract_error++;
3142 print "$ERROR l2h: can't extract content $count from html\n"
3144 # try simple (ordinary) substition (without l2h)
3147 $_ = $l2h_to_latex{$count};
3148 $_ = &substitute_style($_);
3150 $_ = "<!-- l2h: ". __LINE__ . " use texi2html -->" . $_
3151 if ($T2H_DEBUG & $DEBUG_L2H);
3157 # now we have been incorrectly called
3159 print "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n";
3160 return "<!-- l2h: ". __LINE__ . " out of range count $count -->"
3161 if ($T2H_DEBUG & $DEBUG_L2H);
3162 return "<!-- l2h: out of range count $count -->";
3166 sub l2h_FinishFromHtml
3170 if ($l2h_extract_error + $l2h_range_error)
3172 print "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n";
3176 print "# l2h: finished from html (no errors)\n";
3186 print "# l2h: removing temporary files generated by l2h extension\n"
3188 while (<"$docu_rdir$l2h_name"*>)
3193 print "# l2h: Finished\n" if $T2H_VERBOSE;
3197 ##############################
3198 # stuff for l2h caching
3201 # I tried doing this with a dbm data base, but it did not store all
3202 # keys/values. Hence, I did as latex2html does it
3205 if (-r "$l2h_cache_file")
3207 my $rdo = do "$l2h_cache_file";
3208 warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n")
3215 return unless $l2h_latex_count;
3217 open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n";
3218 while (($key, $value) = each %l2h_cache)
3222 $key =~ s|\\\\/|\\/|g;
3223 # weird, a \ at the end of the key results in an error
3224 # maybe this also broke the dbm database stuff
3225 $key =~ s|\\$|\\\\|;
3226 $value =~ s/\|/\\\|/go;
3227 $value =~ s/\\\\\|/\\\|/go;
3228 $value =~ s|\\\\|\\\\\\\\|g;
3229 print FH "\n\$l2h_cache_key = q/$key/;\n";
3230 print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n";
3236 # return cached html, if it exists for text, and if all pictures
3237 # are there, as well
3241 my $cached = $l2h_cache{$text};
3244 while ($cached =~ m/SRC="(.*?)"/g)
3246 unless (-e "$docu_rdir$1")
3256 # insert generated html into cache, move away images,
3257 # return transformed html
3262 my $content = shift;
3263 my @images = ($content =~ /SRC="(.*?)"/g);
3268 $dest = $l2h_img{$src};
3272 if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext)
3278 warn "$ERROR: L2h image $src has invalid extension\n";
3281 while (-e "$docu_rdir${docu_name}_$maximage.$ext")
3285 $dest = "${docu_name}_$maximage.$ext";
3286 system("cp -f $docu_rdir$src $docu_rdir$dest");
3287 $l2h_img{$src} = $dest;
3288 unlink "$docu_rdir$src" unless ($DEBUG & $DEBUG_L2H);
3290 $content =~ s/$src/$dest/g;
3292 $l2h_cache{$l2h_to_latex[$count]} = $content;
3297 #+++############################################################################
3299 # Pass 1: read source, handle command, variable, simple substitution #
3301 #---############################################################################
3306 @lines = (); # whole document
3307 @toc_lines = (); # table of contents
3308 @stoc_lines = (); # table of contents
3309 $curlevel = 0; # current level in TOC
3310 $node = ''; # current node name
3311 $node_next = ''; # current node next name
3312 $node_prev = ''; # current node prev name
3313 $node_up = ''; # current node up name
3314 $in_table = 0; # am I inside a table
3315 $table_type = ''; # type of table ('', 'f', 'v', 'multi')
3316 @tables = (); # nested table support
3317 $in_bibliography = 0; # am I inside a bibliography
3318 $in_glossary = 0; # am I inside a glossary
3319 $in_top = 0; # am I inside the top node
3320 $has_top = 0; # did I see a top node?
3321 $has_top_command = 0; # did I see @top for automatic pointers?
3322 $in_pre = 0; # am I inside a preformatted section
3323 $in_list = 0; # am I inside a list
3324 $in_html = 0; # am I inside an HTML section
3325 $first_line = 1; # is it the first line
3326 $dont_html = 0; # don't protect HTML on this line
3327 $deferred_ref = ''; # deferred reference for indexes
3328 @html_stack = (); # HTML elements stack
3329 $html_element = ''; # current HTML element
3331 %macros = (); # macros
3332 $toc_indent = # used for identation in TOC's
3333 ($T2H_NUMBER_SECTIONS ? 'BLOCKQUOTE' : 'UL');
3336 $T2H_L2H = &l2h_Init($docu_name) if ($T2H_L2H);
3337 $T2H_L2H = &l2h_InitToLatex if ($T2H_L2H);
3339 # build code for simple substitutions
3340 # the maps used (%simple_map and %things_map) MUST be aware of this
3341 # watch out for regexps, / and escaped characters!
3343 foreach (keys(%simple_map))
3345 ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars
3346 $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n";
3348 foreach (keys(%things_map))
3350 $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n";
3354 # accentuated characters
3355 foreach (keys(%accent_map))
3359 $subst_code .= "s/$;3";
3363 $subst_code .= "s/$;4";
3367 $subst_code .= "s/\\\@\\$_";
3369 $subst_code .= "([a-z])/&\${1}$accent_map{$_};/gi;\n";
3372 eval("sub simple_substitutions { $subst_code }");
3375 INPUT_LINE: while ($_ = &next_line)
3378 # remove \input on the first lines only
3385 # non-@ substitutions cf. texinfmt.el
3387 # parse texinfo tags
3391 if (/^\s*\@end\s+(\w+)\b/)
3395 elsif (/^\s*\@(\w+)\b/)
3400 # handle @html / @end html
3404 if ($end_tag eq 'html')
3410 $tag2pro{$in_html} .= $_;
3414 elsif ($tag eq 'html')
3416 $in_html = $PROTECTTAG . ++$html_num;
3417 push(@lines, $in_html);
3422 # try to remove inlined comments
3423 # syntax from tex-mode.el comment-start-skip
3425 s/((^|[^\@])(\@\@)*)\@(c( |\{)|comment ).*$/$1/;
3427 # Sometimes I use @c right at the end of a line ( to suppress the line feed )
3428 # s/((^|[^\@])(\@\@)*)\@c(omment)?$/$1/;
3429 # s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/;
3430 # s/(.*)\@c{.*?}(.*)/$1$2/;
3431 # s/(.*)\@comment{.*?}(.*)/$1$2/;
3433 # s/^(.*)\@comment /$1/;
3435 #############################################################
3436 # value substitution before macro expansion, so that
3437 # it works in macro arguments
3438 s/\@value{($VARRE)}/$value{$1}/eg;
3440 #############################################################
3441 # macro substitution
3444 if (exists($macros->{$1}))
3451 #####################################################
3452 # Support for multi-line macro invocations and nested
3453 # '{' and '}' within macro invocations added by
3454 # Eric Sunshine <sunshine@sunshineco.com> 2000/09/10.
3455 #####################################################
3456 if ($after =~ /^\s*\{/) # Macro arguments delimited by '{' and '}'?
3458 my ($protect, $start, $end, $depth, $c) = (0, 0, 0, 0, 0);
3459 foreach $c (unpack('C*', $after))
3462 { # Character protected by '\' or '@'; pass through unmolested.
3465 elsif ($c == ord('\\') || $c == ord('@'))
3466 { # '\' and '@' remove special meaning of next character.
3469 elsif ($c == ord('{')) # Allow '{' and '}' to nest.
3473 elsif ($c == ord('}'))
3476 last if $depth == 0;
3478 $start++ if !$depth; # Position of opening brace.
3479 $end++; # Position of closing brace.
3482 # '{' & '}' did not completely unnest; append next line; try again.
3485 my $paste = &next_line;
3486 die "$ERROR Missing closing brace '}' for invocation of macro " .
3487 "\"\@$name\" on line:\n", substr($_,0,70), "...\n" unless $paste;
3489 unshift @input_spool, $_ . $paste;
3493 # Extract macro arguments from within '{' and '}'.
3494 $len = $end - $start - 1;
3495 $args = ($len > 0) ? substr($after, $start + 1, $len) : '';
3496 $after = substr($after, $end + 1);
3498 ############ End Sunshine Modifications #############
3499 elsif (@{$macros->{$name}->{Args}} == 1) # Macro arg extends to EOL.
3506 $args =~ s|\\\\|\\|g;
3509 if (@{$macros->{$name}->{Args}} > 1)
3511 $args =~ s/(^|[^\\]),/$1$;/g ;
3513 @args = split(/$;\s*/, $args) if (@{$macros->{$name}->{Args}} > 1);
3520 my $macrobody = $macros->{$name}->{Body};
3521 for ($i=0; $i<=$#args; $i++)
3523 $macrobody =~ s|\\$macros->{$name}->{Args}->[$i]\\|$args[$i]|g;
3525 $macrobody =~ s|\\\\|\\|g;
3526 $_ = $before . $macrobody . $after;
3527 unshift @input_spool, map {$_ = $_."\n"} split(/\n/, $_);
3532 # try to skip the line
3536 $in_titlepage = 0 if $end_tag eq 'titlepage';
3537 next if $to_skip{"end $end_tag"};
3541 $in_titlepage = 1 if $tag eq 'titlepage';
3542 next if $to_skip{$tag};
3543 last if $tag eq 'bye';
3547 # parsing the top node
3548 if ($tag eq 'node' ||
3549 ($sec2level{$tag} && $tag !~ /unnumbered/ && $tag !~ /heading/))
3553 push(@lines, $TOPEND);
3560 s/([\w ])---([\w ])/$1--$2/g;
3568 &skip_until($tag), next if $tag eq 'ignore';
3569 &skip_until($tag), next if $tag eq 'ifnothtml';
3570 if ($tag eq 'ifinfo')
3572 &skip_until($tag), next unless $T2H_EXPAND eq 'info';
3574 if ($tag eq 'iftex')
3576 &skip_until($tag), next unless $T2H_EXPAND eq 'tex';
3580 # add to latex2html file
3581 if ($T2H_EXPAND eq 'tex' && $T2H_L2H && ! $in_pre)
3583 # add space to the end -- tex(i2dvi) does this, as well
3584 push(@lines, &l2h_ToLatex(&string_until($tag) . " "));
3592 if ($tag eq 'titlepage')
3596 # handle special tables
3597 if ($tag =~ /^(|f|v|multi)table$/)
3603 # APA: Fixed regexp to ONLY match the top node, not any
3604 # node starting with the word top.
3605 if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*(,.*)?$/i))
3609 $has_top_command = 1 if $tag eq 'top';
3610 @lines = (); # ignore all lines before top (title page garbage)
3613 elsif ($tag eq 'node')
3618 push(@lines, $TOPEND);
3620 warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o;
3621 # request of "Richard Y. Kim" <ryk@ap.com>
3623 $_ = &protect_html($_); # if node contains '&' for instance
3624 ($node, $node_next, $node_prev, $node_up) = split(/,/);
3627 &normalise_node($node);
3631 warn "$ERROR Node is undefined: $_ (eg. \@node NODE-NAME, NEXT, PREVIOUS, UP)";
3635 &normalise_node($node_next);
3639 &normalise_node($node_prev);
3643 &normalise_node($node_up);
3646 push @lines, &html_debug("<A NAME='".protect_html($node)."'></A>\n", __LINE__) :
3647 push @lines, &html_debug("<A NAME=\"".protect_html($node)."\"></A>\n", __LINE__);
3650 elsif ($tag eq 'include')
3652 if (/^\@include\s+($FILERE)\s*$/o)
3654 $file = LocateIncludeFile($1);
3655 if ($file && -e $file)
3658 print "# including $file\n" if $T2H_VERBOSE;
3662 warn "$ERROR Can't find $1, skipping";
3667 warn "$ERROR Bad include line: $_";
3671 elsif ($tag eq 'ifclear')
3673 if (/^\@ifclear\s+($VARRE)\s*$/o)
3675 next unless defined($value{$1});
3680 warn "$ERROR Bad ifclear line: $_";
3684 elsif ($tag eq 'ifset')
3686 if (/^\@ifset\s+($VARRE)\s*$/o)
3688 next if defined($value{$1});
3693 warn "$ERROR Bad ifset line: $_";
3697 elsif ($tag eq 'menu')
3699 unless ($T2H_SHOW_MENU)
3704 &html_push_if($tag);
3705 push(@lines, &html_debug('', __LINE__));
3707 elsif ($format_map{$tag})
3709 $in_pre = 1 if $format_map{$tag} eq 'PRE';
3710 &html_push_if($format_map{$tag});
3711 push(@lines, &html_debug('', __LINE__));
3712 $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ;
3713 # push(@lines, &debug("<BLOCKQUOTE>\n", __LINE__))
3714 # if $tag =~ /example/i;
3715 # Eric Sunshine <sunshine@sunshineco.com>: <PRE>blah</PRE> looks
3716 # better than <PRE>\nblah</PRE> on OmniWeb2 NextStep browser.
3717 push(@lines, &debug("<$format_map{$tag}>" .
3718 ($in_pre ? '' : "\n"), __LINE__));
3721 elsif (exists $complex_format_map->{$tag})
3723 my $start = eval $complex_format_map->{$tag}->[0];
3724 # APA: <table> implicitly ends paragraph, so let's do it
3725 # explicitly to keep our HTML stack in sync.
3726 if ($start =~ /\A\s*<table>/i)
3728 if ($html_element eq 'P')
3730 push (@lines2, &debug("</P>\n", __LINE__));
3736 print "$ERROR: eval of complex_format_map->{$tag}->[0] $complex_format_map->{$tag}->[0]: $@";
3739 $in_pre = 1 if $start =~ /<pre/;
3740 push(@lines, html_debug($start. ($in_pre ? '' : "\n"), __LINE__));
3743 elsif ($tag eq 'table')
3745 # anorland@hem2.passagen.se
3746 # if (/^\s*\@(|f|v|multi)table\s+\@(\w+)/) {
3747 if (/^\s*\@(|f|v|multi)table\s+\@(\w+)|(\{[^\}]*\})/)
3750 unshift(@tables, join($;, $table_type, $in_table));
3751 if ($table_type eq "multi")
3753 # APA: <table> implicitly ends paragraph, so let's
3754 # do it explicitly to keep our HTML stack in sync.
3755 if ($html_element eq 'P')
3757 push (@lines, &debug("</P>\n", __LINE__));
3760 # don't use borders -- gets confused by empty cells
3761 push(@lines, &debug("<TABLE>\n", __LINE__));
3762 &html_push_if('TABLE');
3766 # APA: <dl> implicitly ends paragraph, so let's
3767 # do it explicitly to keep our HTML stack in sync.
3768 if ($html_element eq 'P')
3770 push (@lines, &debug("</P>\n", __LINE__));
3773 push(@lines, &debug("<DL COMPACT>\n", __LINE__));
3774 &html_push_if('DL');
3776 push(@lines, &html_debug('', __LINE__));
3780 warn "$ERROR Bad table line: $_";
3784 elsif ($tag eq 'synindex' || $tag eq 'syncodeindex')
3786 if (/^\@$tag\s+(\w+)\s+(\w+)\s*$/)
3790 my $prefix_from = IndexName2Prefix($from);
3791 my $prefix_to = IndexName2Prefix($to);
3793 warn("$ERROR unknown from index name $from ind syn*index line: $_"), next
3794 unless $prefix_from;
3795 warn("$ERROR unknown to index name $to ind syn*index line: $_"), next
3798 if ($tag eq 'syncodeindex')
3800 $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1;
3804 $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1;
3809 warn "$ERROR Bad syn*index line: $_";
3813 elsif ($tag eq 'defindex' || $tag eq 'defcodeindex')
3815 if (/^\@$tag\s+(\w+)\s*$/)
3818 $index_properties->{$name}->{name} = $name;
3819 $index_properties->{$name}->{code} = 1 if $tag eq 'defcodeindex';
3823 warn "$ERROR Bad defindex line: $_";
3827 elsif (/^\@printindex/)
3829 # APA: HTML generated for @printindex contains <table>
3830 # which implicitly ends paragraph, so let's do it
3831 # explicitly to keep our HTML stack in sync.
3832 if ($html_element eq 'P')
3834 push(@lines, &debug("</P>\n", __LINE__));
3837 push (@lines, "<!--::${section}::-->$_");
3840 elsif ($tag eq 'sp')
3842 push(@lines, &debug("<P></P>\n", __LINE__));
3845 elsif ($tag eq 'center')
3847 push(@lines, &debug("<center>\n", __LINE__));
3850 elsif ($tag eq 'setref')
3853 &protect_html; # if setref contains '&' for instance
3854 if (/^\@$tag\s*{($NODERE)}\s*$/)
3857 $setref =~ s/\s+/ /go; # normalize
3859 $node2sec{$setref} = $name;
3860 $sec2node{$name} = $setref;
3861 $node2href{$setref} = "$docu_doc#$docid";
3865 warn "$ERROR Bad setref line: $_";
3869 elsif ($tag eq 'lowersections')
3872 while (($sec, $level) = each %sec2level)
3874 $sec2level{$sec} = $level + 1;
3878 elsif ($tag eq 'raisesections')
3881 while (($sec, $level) = each %sec2level)
3883 $sec2level{$sec} = $level - 1;
3887 elsif ($tag eq 'macro' || $tag eq 'rmacro')
3889 if (/^\@$tag\s*(\w+)\s*(.*)/)
3893 @args = split(/\s*,\s*/ , $1)
3894 if ($2 =~ /^\s*{(.*)}\s*/);
3896 $macros->{$name}->{Args} = \@args;
3897 $macros->{$name}->{Body} = '';
3898 while (($_ = &next_line) && $_ !~ /\@end $tag/)
3900 $macros->{$name}->{Body} .= $_;
3902 die "ERROR: No closing '\@end $tag' found for macro definition of '$name'\n"
3903 unless (/\@end $tag/);
3904 chomp $macros->{$name}->{Body};
3908 warn "$ERROR: Bad macro defintion $_"
3912 elsif ($tag eq 'unmacro')
3914 delete $macros->{$1} if (/^\@unmacro\s*(\w+)/);
3917 elsif ($tag eq 'documentlanguage')
3919 SetDocumentLanguage($1) if (!$T2H_LANG && /documentlanguage\s*(\w+)/);
3921 elsif (defined($def_map{$tag}))
3926 $tag = $def_map{$tag};
3931 elsif (defined($user_sub{$tag}))
3934 $sub = $user_sub{$tag};
3935 print "# user $tag = $sub, arg: $_" if $T2H_DEBUG & $DEBUG_USER;
3943 warn "$ERROR Bad user sub for $tag: $sub\n";
3947 if (defined($def_map{$tag}))
3952 # extra definition line
3960 while (/\{([^\{\}]*)\}/)
3962 # this is a {} construct
3963 ($before, $contents, $after) = ($`, $1, $');
3965 $contents =~ s/\s+/$;9/g;
3966 # restore $_ protecting {}
3967 $_ = "$before$;7$contents$;8$after";
3969 @args = split(/\s+/, &protect_html($_));
3972 s/$;9/ /g; # unprotect spaces
3976 $type = shift(@args);
3977 $type =~ s/^\{(.*)\}$/$1/;
3978 print "# def ($tag): {$type} ", join(', ', @args), "\n"
3979 if $T2H_DEBUG & $DEBUG_DEF;
3980 $type .= ':' if (!$T2H_DEF_TABLE); # it's nicer like this
3981 $name = shift(@args);
3982 $name =~ s/^\{(.*)\}$/$1/;
3985 $_ = &debug("<DT>", __LINE__) if (!$T2H_DEF_TABLE);
3986 $_ = &debug("", __LINE__) if ($T2H_DEF_TABLE);
3987 #$_ = &debug("<TR TEST1>\n", __LINE__) if ($T2H_DEF_TABLE);
3991 # APA: <dl> implicitly ends paragraph, so let's
3992 # do it explicitly to keep our HTML stack in sync.
3993 if ($html_element eq 'P')
3995 $_ = &debug("</P>\n", __LINE__);
4002 $_ .= &debug("<DL>\n<DT>", __LINE__) if (!$T2H_DEF_TABLE);
4003 $_ .= &debug("<TABLE WIDTH=\"100%\">\n", __LINE__) if ($T2H_DEF_TABLE);
4005 if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp')
4009 $_ .= "<TR>\n<TD ALIGN=\"LEFT\"><B>$name</B>\n";
4010 $_ .= " <I>@args</I>" if @args;
4012 $_ .= "<TD ALIGN=\"RIGHT\">";
4013 $_ .= "$type</TD>\n</TR>\n";
4017 $_ .= "<U>$type</U> <B>$name</B>";
4018 $_ .= " <I>@args</I>" if @args;
4021 elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr'
4022 || $tag eq 'deftypeop' || $tag eq 'defcv'
4026 $name = shift(@args);
4027 $name =~ s/^\{(.*)\}$/$1/;
4030 $_ .= "<TR>\n<TD ALIGN=\"LEFT\"><B>$name</B>";
4031 $_ .= " <I>@args</I>" if @args;
4033 $_ .= "<TD ALIGN=\"RIGHT\">";
4034 $_ .= "$type of $ftype</TD>\n</TR>\n";
4038 $_ .= "<U>$type</U> $ftype <B>$name</B>";
4039 $_ .= " <I>@args</I>" if @args;
4044 warn "$ERROR Unknown definition type: $tag\n";
4045 $_ .= "<U>$type</U> <B>$name</B>";
4046 $_ .= " <I>@args</I>" if @args;
4048 $_ .= &debug("\n<DD>", __LINE__) if (!$T2H_DEF_TABLE);
4049 ########$_ .= &debug("\n</TABLE TEST3>\n<TABLE WIDTH=\"95%\">\n", __LINE__) if ($T2H_DEF_TABLE);
4050 $name = &unprotect_html($name);
4051 if ($tag eq 'deffn' || $tag eq 'deftypefn')
4053 EnterIndexEntry('f', $name, $docu_doc, $section, \@lines);
4054 # unshift(@input_spool, "\@findex $name\n");
4056 elsif ($tag eq 'defop')
4058 EnterIndexEntry('f', "$name on $ftype", $docu_doc, $section, \@lines);
4059 # unshift(@input_spool, "\@findex $name on $ftype\n");
4061 elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv')
4063 EnterIndexEntry('v', $name, $docu_doc, $section, \@lines);
4064 # unshift(@input_spool, "\@vindex $name\n");
4068 EnterIndexEntry('t', $name, $docu_doc, $section, \@lines);
4069 # unshift(@input_spool, "\@tindex $name\n");
4076 if ($format_map{$end_tag})
4078 $in_pre = 0 if $format_map{$end_tag} eq 'PRE';
4079 $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ;
4083 push(@lines, &debug("</$format_map{$end_tag}>\n", __LINE__));
4084 push(@lines, &html_debug('', __LINE__));
4086 elsif (exists $complex_format_map->{$end_tag})
4088 my $end = eval $complex_format_map->{$end_tag}->[1];
4091 print "$ERROR: eval of complex_format_map->{$end_tag}->[1] $complex_format_map->{$end_tag}->[0]: $@";
4094 $in_pre = 0 if $end =~ m|</pre>|;
4095 push(@lines, html_debug($end, __LINE__));
4097 elsif ($end_tag =~ /^(|f|v|multi)table$/)
4101 warn "$ERROR \@end $end_tag without \@*table\n";
4105 ($table_type, $in_table) = split($;, shift(@tables));
4106 unless ($1 eq $table_type)
4108 warn "$ERROR \@end $end_tag without matching \@$end_tag\n";
4111 if ($table_type eq "multi")
4113 push(@lines, "</TR></TABLE>\n");
4118 # APA: </dl> implicitly ends paragraph, so let's
4119 # do it explicitly to keep our HTML stack in sync.
4120 if ($html_element eq 'P')
4122 push(@lines, &debug("</P>\n", __LINE__));
4125 push(@lines, "</DL>\n");
4131 ($table_type, $in_table) = split($;, $tables[0]);
4138 elsif (defined($def_map{$end_tag}))
4140 # APA: </dl> and </table> implicitly ends paragraph,
4141 # so let's do it explicitly to keep our HTML stack in
4143 if ($html_element eq 'P')
4145 push(@lines, &debug("</P>\n", __LINE__));
4148 push(@lines, &debug("</DL>\n", __LINE__)) if (!$T2H_DEF_TABLE);
4149 push(@lines, &debug("</TABLE>\n", __LINE__)) if ($T2H_DEF_TABLE);
4151 elsif ($end_tag eq 'menu')
4154 push(@lines, $_); # must keep it for pass 2
4158 #############################################################
4160 while (/\@anchor\s*\{(.*?)\}/)
4164 $anchor = &normalise_node($anchor);
4165 push @lines, &html_debug("<A NAME=\"".protect_html($anchor)."\"></A>\n");
4166 $node2href{$anchor} = "$docu_doc#$anchor";
4167 next INPUT_LINE if $_ =~ /^\s*$/;
4169 #############################################################
4170 # index entry generation, after value substitutions
4171 if (/^\@(\w+?)index\s+/)
4173 EnterIndexEntry($1, $', $docu_doc, $section, \@lines);
4177 # protect texi and HTML things
4179 $_ = &protect_html($_) unless $dont_html;
4181 # substitution (unsupported things)
4183 s/\@noindent\s+//go;
4185 # other substitutions
4186 &simple_substitutions;
4187 s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4
4189 # analyze the tag again
4193 if (defined($sec2level{$tag}) && $sec2level{$tag} > 0)
4195 if (/^\@$tag\s+(.+)$/)
4198 $name = &normalise_node($name);
4199 $level = $sec2level{$tag};
4201 $first_index_chapter = $name
4202 if ($level == 1 && !$first_index_chapter &&
4204 if ($in_top && /heading/)
4206 $T2H_HAS_TOP_HEADING = 1;
4207 $_ = &debug("<H$level>$name</H$level>\n", __LINE__);
4208 &html_push_if('body');
4209 print "# top heading, section $name, level $level\n"
4210 if $T2H_DEBUG & $DEBUG_TOC;
4214 unless (/^\@\w*heading/)
4216 unless (/^\@unnumbered/)
4218 my $number = &update_sec_num($tag, $level);
4219 $name = $number . ' ' . $name if $T2H_NUMBER_SECTIONS;
4220 $sec2number{$name} = $number;
4221 $number2sec{$number} = $name;
4223 if (defined($toplevel))
4225 push @lines, ($level==$toplevel ? $CHAPTEREND : $SECTIONEND);
4229 # first time we see a "section"
4230 unless ($level == 1)
4232 warn "$WARN The first section found is not of level 1: $_";
4236 push(@sections, $name);
4237 next_doc() if (defined $T2H_SPLIT
4239 ($T2H_SPLIT eq 'section'
4241 $T2H_SPLIT && $level == $toplevel));
4244 $docid = "SEC$sec_num";
4245 $tocid = (/^\@\w*heading/ ? undef : "TOC$sec_num");
4246 # check biblio and glossary
4247 $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i);
4248 $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i);
4252 warn "$ERROR Duplicate node found: $node\n"
4253 if ($node2sec{$node});
4257 $name .= ' ' while ($node2sec{$name});
4260 $name .= ' ' while ($sec2node{$name});
4262 $node2sec{$node} = $name;
4263 $sec2node{$name} = $node;
4264 $sec2seccount{$name} = $sec_num;
4265 $seccount2sec{$sec_num} = $name;
4266 $node2href{$node} = "$docu_doc#$docid";
4267 $node2next{$node} = $node_next;
4268 $node2prev{$node} = $node_prev;
4269 $node2up{$node} = $node_up;
4270 print "# node $node, section $name, level $level\n"
4271 if $T2H_DEBUG & $DEBUG_TOC;
4280 while ($level > $curlevel)
4283 push(@toc_lines, "<$toc_indent>\n");
4285 while ($level < $curlevel)
4288 push(@toc_lines, "</$toc_indent>\n");
4290 $_ = &t2h_anchor($tocid, "$docu_doc#$docid", $name, 1);
4291 $_ = &substitute_style($_);
4292 push(@stoc_lines, "$_<BR>\n") if ($level == 1);
4293 if ($T2H_NUMBER_SECTIONS)
4295 push(@toc_lines, $_ . "<BR>\n")
4299 push(@toc_lines, "<LI>" . $_ ."</LI>");
4304 push(@lines, &html_debug("<A NAME=\"".protect_html($docid)."\"></A>\n",
4308 push(@lines, &html_debug('', __LINE__));
4310 $_ = "<H$level> $name </H$level>\n<!--docid::${docid}::-->\n";
4311 $_ = &debug($_, __LINE__);
4312 push(@lines, &html_debug('', __LINE__));
4315 foreach $line (split(/\n+/, $_))
4317 push(@lines, "$line\n");
4323 warn "$ERROR Bad section line: $_";
4329 $value{$1} = Unprotect_texi($2), next if /^\@set\s+($VARRE)\s+(.*)$/o;
4330 delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o;
4332 $value{'_shorttitle'} = Unprotect_texi($1), next if /^\@shorttitle\s+(.*)$/;
4333 $value{'_setfilename'} = Unprotect_texi($1), next if /^\@setfilename\s+(.*)$/;
4334 $value{'_settitle'} = Unprotect_texi($1), next if /^\@settitle\s+(.*)$/;
4335 $value{'_author'} .= Unprotect_texi($1)."\n", next if /^\@author\s+(.*)$/;
4336 $value{'_subtitle'} .= Unprotect_texi($1)."\n", next if /^\@subtitle\s+(.*)$/;
4337 $value{'_title'} .= Unprotect_texi($1)."\n", next if /^\@title\s+(.*)$/;
4340 if (/^\s*\@itemx?\s+/)
4344 if ($in_bibliography && $use_bibliography)
4346 if ($what =~ /^$BIBRE$/o)
4348 $id = 'BIB' . ++$bib_num;
4349 $bib2href{$what} = "$docu_doc#$id";
4350 print "# found bibliography for '$what' id $id\n"
4351 if $T2H_DEBUG & $DEBUG_BIB;
4352 $what = &t2h_anchor($id, '', $what);
4355 elsif ($in_glossary && $T2H_USE_GLOSSARY)
4357 $id = 'GLOSS' . ++$gloss_num;
4359 $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
4360 $gloss2href{$entry} = "$docu_doc#$id";
4361 print "# found glossary for '$entry' id $id\n"
4362 if $T2H_DEBUG & $DEBUG_GLOSS;
4363 $what = &t2h_anchor($id, '', $what);
4365 elsif ($in_table && ($table_type eq 'f' || $table_type eq 'v'))
4367 # APA: Insert <dt> before index anchor, if
4368 # necessary to produce valid HTML. Close open
4370 if ($html_element ne 'DT')
4372 # APA: End paragraph, if any.
4373 if ($html_element eq 'P')
4375 push(@lines, &debug("</P>\n", __LINE__));
4378 push(@lines, &debug("<DT>", __LINE__));
4381 EnterIndexEntry($table_type, $what, $docu_doc, $section, \@lines);
4383 # APA: End paragraph, if any.
4384 if ($html_element eq 'P')
4386 push(@lines, &debug("</P>\n", __LINE__));
4389 if ($html_element =~ m|^D[DLT]$|)
4391 unless ($html_element eq 'DT')
4393 push(@lines, &debug("<DT>", __LINE__));
4395 if ($things_map{$in_table} && !$what)
4397 # special case to allow @table @bullet for instance
4398 push(@lines, &debug("$things_map{$in_table}\n", __LINE__));
4402 push(@lines, &debug("\@$in_table\{$what\}\n", __LINE__));
4404 push(@lines, "<DD>");
4405 &html_push('DD') unless $html_element eq 'DD';
4407 { # add also an index
4408 unshift(@input_spool, "\@${table_type}index $what\n");
4411 elsif ($html_element eq 'TABLE')
4413 push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
4416 elsif ($html_element eq 'TR')
4418 push(@lines, &debug("</TR>\n", __LINE__));
4419 push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
4423 push(@lines, &debug("<LI>$what\n", __LINE__));
4424 &html_push('LI') unless $html_element eq 'LI';
4426 push(@lines, &html_debug('', __LINE__));
4429 push(@lines, &debug("$deferred_ref\n", __LINE__));
4434 elsif (/^\@tab\s+(.*)$/)
4436 push(@lines, "<TD>$1</TD>\n");
4441 # paragraph separator
4442 if ($_ eq "\n" && ! $in_pre)
4444 next if $#lines >= 0 && $lines[$#lines] eq "\n";
4445 if ($html_element eq 'P')
4447 push (@lines, &debug("</P>\n<P>\n", __LINE__));
4451 # push(@lines, "<P></P>\n");
4452 # $_ = &debug("<P></P>\n", __LINE__);
4454 elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE' || $html_element eq 'DD' || $html_element eq 'LI')
4457 push(@lines, &debug("<P>\n", __LINE__));
4461 push(@lines, $_) unless $in_titlepage;
4462 push(@lines, &debug("</center>\n", __LINE__)) if ($tag eq 'center');
4466 while ($level < $curlevel)
4469 push(@toc_lines, "</$toc_indent>\n");
4471 print "# end of pass 1\n" if $T2H_VERBOSE;
4474 #+++############################################################################
4476 # Stuff related to Index generation #
4478 #---############################################################################
4484 my $docu_doc = shift;
4485 my $section = shift;
4489 warn "$ERROR Undefined index command: $_", next
4490 unless (exists ($index_properties->{$prefix}));
4495 $_ = &protect_html($_);
4496 my $html_key = substitute_style($_);
4498 $key = remove_style($key);
4499 $key = remove_things($key);
4503 while (exists $index->{$prefix}->{$key})
4508 if ($lines->[$#lines] =~ /^<!--docid::(.+)::-->$/)
4514 $id = 'IDX' . ++$idx_num;
4515 push(@$lines, &t2h_anchor($id, '', $T2H_INVISIBLE_MARK, !$in_pre));
4517 $index->{$prefix}->{$key}->{html_key} = $html_key;
4518 $index->{$prefix}->{$key}->{section} = $section;
4519 $index->{$prefix}->{$key}->{href} = "$docu_doc#$id";
4520 print "# found ${prefix}index for '$key' with id $id\n"
4521 if $T2H_DEBUG & $DEBUG_INDEX;
4524 sub IndexName2Prefix
4529 for $prefix (keys %$index_properties)
4531 return $prefix if ($index_properties->{$prefix}->{name} eq $name);
4540 my ($entries, $prefix, $key) = ({});
4541 for $prefix (keys %$normal)
4543 for $key (keys %{$index->{$prefix}})
4545 $entries->{$key} = {%{$index->{$prefix}->{$key}}};
4551 for $prefix (keys %$code)
4553 unless (exists $normal->{$prefix})
4555 for $key (keys %{$index->{$prefix}})
4557 $entries->{$key} = {%{$index->{$prefix}->{$key}}};
4558 $entries->{$key}->{html_key} = "<CODE>$entries->{$key}->{html_key}</CODE>";
4568 if ($a =~ /^[A-Za-z]/)
4570 if ($b =~ /^[A-Za-z]/)
4572 return lc($a) cmp lc($b);
4579 elsif ($b =~ /^[A-Za-z]/)
4585 return lc($a) cmp lc($b);
4591 my $entries = shift;
4592 my (@Letters, $key);
4593 my ($EntriesByLetter, $Pages, $page) = ({}, [], {});
4594 my @keys = sort byAlpha keys %$entries;
4598 push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key};
4600 @Letters = sort byAlpha keys %$EntriesByLetter;
4601 $T2H_SPLIT_INDEX = 0 unless $T2H_SPLIT;
4603 unless ($T2H_SPLIT_INDEX)
4605 $page->{First} = $Letters[0];
4606 $page->{Last} = $Letters[$#Letters];
4607 $page->{Letters} = \@Letters;
4608 $page->{EntriesByLetter} = $EntriesByLetter;
4609 push @$Pages, $page;
4613 if ($T2H_SPLIT_INDEX =~ /^\d+$/)
4616 my ($prev_letter, $letter);
4617 for $letter (@Letters)
4619 if ($i > $T2H_SPLIT_INDEX)
4621 $page->{Last} = $prev_letter;
4622 push @$Pages, $page;
4628 $page->{Letters} = [];
4629 $page->{EntriesByLetter} = {};
4630 $page->{First} = $letter;
4632 push @{$page->{Letters}}, $letter;
4633 $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}];
4634 $i += scalar(@{$EntriesByLetter->{$letter}});
4635 $prev_letter = $letter;
4637 $page->{Last} = $Letters[$#Letters];
4638 push @$Pages, $page;
4645 my $first_page = shift;
4648 my ($page, $letter, $summary, $i, $l1, $l2, $l);
4651 $summary = '<table><tr><th valign=top>Jump to: </th><td>';
4652 for $page ($first_page, @$Pages)
4654 for $letter (@{$page->{Letters}})
4656 $l = t2h_anchor('', "$page->{href}#${name}_$letter", "<b>$letter</b>",
4657 0, 'style="text-decoration:none"') . "\n \n";
4658 if ($letter =~ /^[A-Za-z]/)
4668 $summary .= $l1 . "<BR>\n" if ($l1);
4669 $summary .= $l2 . '</td></tr></table>';
4676 my $summary = shift;
4680 push @$lines, $summary;
4682 push @$lines , <<EOT;
4685 <TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
4686 <TR><TD COLSPAN=3> <HR></TD></TR>
4689 for $letter (@{$page->{Letters}})
4691 push @$lines, "<TR><TH><A NAME=\"".protect_html("${name}_$letter")."\"></A>".protect_html($letter)."</TH><TD></TD><TD></TD></TR>\n";
4692 for $entry (@{$page->{EntriesByLetter}->{$letter}})
4695 "<TR><TD></TD><TD valign=top>" .
4696 t2h_anchor('', $entry->{href}, $entry->{html_key}) .
4697 "</TD><TD valign=top>" .
4698 t2h_anchor('', sec_href($entry->{section}), clean_name($entry->{section})) .
4701 push @$lines, "<TR><TD COLSPAN=3> <HR></TD></TR>\n";
4703 push @$lines, "</TABLE><P></P>";
4704 push @$lines, $summary;
4711 my $section = shift;
4712 $section = 'Top' unless $section;
4713 my $prefix = IndexName2Prefix($name);
4715 warn ("$ERROR printindex: bad index name: $name"), return
4718 if ($index_properties->{$prefix}->{code})
4720 $index_properties->{$prefix}->{from_code}->{$prefix} = 1;
4724 $index_properties->{$prefix}->{from}->{$prefix}= 1;
4727 my $Entries = GetIndexEntries($index_properties->{$prefix}->{from},
4728 $index_properties->{$prefix}->{from_code});
4729 return unless %$Entries;
4731 if ($T2H_IDX_SUMMARY)
4734 open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx")
4735 || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n";
4736 print "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE;
4738 for $key (sort keys %$Entries)
4740 print FHIDX "$key\t$Entries->{$key}->{href}\n";
4744 my $Pages = GetIndexPages($Entries);
4746 my $first_page = shift @$Pages;
4747 my $sec_name = $section;
4749 # remove section number
4750 $sec_name =~ s/.*? // if $sec_name =~ /^([A-Z]|\d+)\./;
4752 ($first_page->{href} = sec_href($section)) =~ s/\#.*$//;
4753 $node2prev{$section} = Sec2PrevNode($node2sec{$section});
4754 $prev_node = $section;
4755 # Update tree structure of document
4761 while (@sections && $sections[$#sections] ne $section)
4763 unshift @after, pop @sections;
4768 my $node = ($page->{First} ne $page->{Last} ?
4769 "$sec_name: $page->{First} -- $page->{Last}" :
4770 "$sec_name: $page->{First}");
4771 push @sections, $node;
4772 $node2sec{$node} = $node;
4773 $sec2node{$node} = $node;
4774 $node2up{$node} = $section;
4775 $page->{href} = next_doc();
4776 $page->{name} = $node;
4777 $node2href{$node} = $page->{href};
4780 $node2next{$prev_node} = $node;
4781 $node2prev{$node} = $prev_node;
4785 # Full circle - Next on last index page goes to Top
4786 $node2next{$prev_node} = "Top";
4787 push @sections, @after;
4790 my $summary = GetIndexSummary($first_page, $Pages, $name);
4791 PrintIndexPage($lines, $summary, $first_page, $name);
4794 push @$lines, ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
4795 push @$lines, "<H2 ALIGN=\"Left\">$page->{name}</H2>\n";
4796 PrintIndexPage($lines, $summary, $page, $name);
4801 #+++############################################################################
4803 # Pass 2/3: handle style, menu, index, cross-reference #
4805 #---############################################################################
4810 @lines2 = (); # whole document (2nd pass)
4811 @lines3 = (); # whole document (3rd pass)
4812 my $in_menu = 0; # am I inside a menu
4813 my $in_menu_listing;
4819 # special case (protected sections)
4821 if (/^$PROTECTTAG/o)
4832 $in_menu_listing = 1;
4833 # APA: <table> implicitly ends paragraph, so let's do it
4834 # explicitly to keep our HTML stack in sync.
4835 if ($html_element eq 'P')
4837 push (@lines2, &debug("</P>\n", __LINE__));
4840 push(@lines2, &debug("<TABLE BORDER=\"0\" CELLSPACING=\"0\">\n", __LINE__));
4843 if (/^\@end\s+menu\b/)
4845 if ($in_menu_listing)
4847 push(@lines2, &debug("</TABLE>\n", __LINE__));
4850 $in_menu_listing = 0;
4855 my ($node, $name, $descr);
4856 if (/^\*\s+($NODERE)::/o)
4861 elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/)
4869 warn "$ERROR Bad menu line: $_";
4873 if ($in_menu_listing)
4875 # APA: Handle menu comment lines. These don't end the menu!
4876 # $in_menu_listing = 0;
4877 push(@lines2,&debug('<TR><TH COLSPAN="3" ALIGN="left" VALIGN="TOP">' . $_ . '</TH></TR>
4883 if (! $in_menu_listing)
4885 $in_menu_listing = 1;
4886 push(@lines2, &debug("<TABLE BORDER=0 CELLSPACING=0>\n", __LINE__));
4888 # look for continuation
4889 while ($lines[0] =~ /^\s+\w+/)
4891 $descr .= shift(@lines);
4893 &menu_entry($node, $name, $descr);
4900 PrintIndex(\@lines2, $2, $1), next
4901 if (/^<!--::(.*)::-->\@printindex\s+(\w+)/);
4903 # simple style substitutions
4905 $_ = &substitute_style($_);
4909 while (/\@(x|px|info|)ref{([^{}]+)(}?)/)
4911 # note: Texinfo may accept other characters
4912 ($type, $nodes, $full) = ($1, $2, $3);
4913 ($before, $after) = ($`, $');
4914 if (! $full && $after)
4916 warn "$ERROR Bad xref (no ending } on line): $_";
4917 $_ = "$before$;0${type}ref\{$nodes$after";
4922 $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} ";
4924 elsif ($type eq 'px')
4926 $type = "$T2H_WORDS->{$T2H_LANG}->{'see'} ";
4928 elsif ($type eq 'info')
4930 $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} Info";
4938 $next = shift(@lines);
4939 $next = &substitute_style($next);
4940 chop($nodes); # remove final newline
4942 { # split on 2 lines
4949 $next = shift(@lines);
4950 $next = &substitute_style($next);
4953 { # split on 3 lines
4959 warn "$ERROR Bad xref (no ending }): $_";
4960 $_ = "$before$;0xref\{$nodes$after";
4961 unshift(@lines, $next);
4966 $nodes =~ s/\s+/ /go; # remove useless spaces
4967 @args = split(/\s*,\s*/, $nodes);
4968 $node = $args[0]; # the node is always the first arg
4969 $node = &normalise_node($node);
4970 $sec = $args[2] || $args[1] || $node2sec{$node};
4971 $href = $node2href{$node};
4973 { # reference to another manual
4974 $sec = $args[2] || $node;
4975 $man = $args[4] || $args[3];
4976 $_ = "${before}${type}$T2H_WORDS->{$T2H_LANG}->{'section'} `$sec' in \@cite{$man}$after";
4978 elsif ($type =~ /Info/)
4980 warn "$ERROR Wrong number of arguments: $_" unless @args == 3;
4981 ($nn, $_, $in) = @args;
4982 $_ = "${before}${type} file `$in', node `$nn'$after";
4984 elsif ($sec && $href && ! $T2H_SHORT_REF)
4986 $_ = "${before}${type}";
4987 $_ .= "$T2H_WORDS->{$T2H_LANG}->{'section'} " if $type;
4988 $_ .= &t2h_anchor('', $href, $sec) . $after;
4992 $_ = "${before}${type} " .
4993 &t2h_anchor('', $href, $args[2] || $args[1] || $node) .
4998 warn "$ERROR Undefined node ($node): $_";
4999 $_ = "$before$;0xref{$nodes}$after";
5004 s[\@image\s*{(.+?)}]
5006 my @args = split (/\s*,\s*/, $1);
5007 my $base = $args[0];
5009 LocateIncludeFile("$base.png") ||
5010 LocateIncludeFile("$base.jpg") ||
5011 LocateIncludeFile("$base.gif");
5012 warn "$ERROR no image file for $base: $_" unless ($image && -e $image);
5013 ($T2H_CENTER_IMAGE ?
5014 "<CENTER><IMG SRC=\"$image\" ALT=\"$base\"></CENTER>" :
5015 "<IMG SRC=\"$image\" ALT=\"$base\">");
5019 # try to guess bibliography references or glossary terms
5021 unless (/^<H\d><A NAME=\"SEC\d/)
5023 if ($use_bibliography)
5028 ($pre, $what, $post) = ($`, $&, $');
5029 $href = $bib2href{$what};
5030 if (defined($href) && $post !~ /^[^<]*<\/A>/)
5032 $done .= $pre . &t2h_anchor('', $href, $what);
5036 $done .= "$pre$what";
5042 if ($T2H_USE_GLOSSARY)
5047 ($pre, $what, $post) = ($`, $&, $');
5049 $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
5050 $href = $gloss2href{$entry};
5051 if (defined($href) && $post !~ /^[^<]*<\/A>/)
5053 $done .= $pre . &t2h_anchor('', $href, $what);
5057 $done .= "$pre$what";
5067 print "# end of pass 2\n" if $T2H_VERBOSE;
5073 # split style substitutions
5078 $_ = shift(@lines2);
5080 # special case (protected sections)
5082 if (/^$PROTECTTAG/o)
5088 # split style substitutions
5096 ($before, $style, $after) = ($`, $1, $');
5097 if (defined($style_map{$style}))
5115 $_ = shift(@lines2);
5120 die "* Bad syntax (\@$style) after: $before\n";
5124 $text = &apply_style($style, $text);
5125 $_ = "$before$text$after";
5133 print "# end of pass 3\n" if $T2H_VERBOSE;
5136 #+++############################################################################
5138 # Pass 4: foot notes, final cleanup #
5140 #---############################################################################
5145 @foot_lines = (); # footnotes
5146 @doc_lines = (); # final document
5147 $end_of_para = 0; # true if last line is <P>
5149 # APA: There aint no paragraph before the first one!
5150 # This fixes a HTML validation error.
5151 $lines3[0] =~ s|^</P>\n|\n|;
5154 $_ = shift(@lines3);
5156 # special case (protected sections)
5158 if (/^$PROTECTTAG/o)
5160 push(@doc_lines, $_);
5167 while (/\@footnote([^\{\s]+)\{/)
5169 ($before, $d, $after) = ($`, $1, $');
5186 $_ = shift(@lines3);
5191 die "* Bad syntax (\@footnote) after: $before\n";
5196 $docid = "DOCF$foot_num";
5197 $footid = "FOOT$foot_num";
5198 $foot = "($foot_num)";
5199 push(@foot_lines, "<H3>" . &t2h_anchor($footid, "$d#$docid", $foot) . "</H3>\n");
5200 $text = "<P>$text" unless $text =~ /^\s*<P>/;
5201 push(@foot_lines, "$text\n");
5202 $_ = $before . &t2h_anchor($docid, "$docu_foot#$footid", $foot) . $after;
5206 # remove unnecessary <P>
5210 next if $end_of_para++;
5217 push(@doc_lines, $_);
5220 print "# end of pass 4\n" if $T2H_VERBOSE;
5223 #+++############################################################################
5225 # Pass 5: print things #
5227 #---############################################################################
5230 $T2H_L2H = &l2h_FinishToLatex if ($T2H_L2H);
5231 $T2H_L2H = &l2h_ToHtml if ($T2H_L2H);
5232 $T2H_L2H = &l2h_InitFromHtml if ($T2H_L2H);
5236 # fix node2up, node2prev, node2next, if desired
5237 if ($has_top_command)
5239 for $section (keys %sec2number)
5241 $node2href{$sec2node{$section}} =~ /SEC(\d+)$/;
5242 $node = $sec2node{$section};
5243 $node2up{$node} = Sec2UpNode($section) unless $node2up{$node};
5244 $node2prev{$node} = Sec2PrevNode($section) unless $node2prev{$node};
5245 $node2next{$node} = Sec2NextNode($section) unless $node2next{$node};
5249 # prepare %T2H_THISDOC
5250 $T2H_THISDOC{fulltitle} = $value{'_title'} || $value{'_settitle'} || "Untitled Document";
5251 $T2H_THISDOC{title} = $value{'_settitle'} || $T2H_THISDOC{fulltitle};
5252 $T2H_THISDOC{author} = $value{'_author'};
5253 $T2H_THISDOC{subtitle} = $value{'_subtitle'};
5254 $T2H_THISDOC{shorttitle} = $value{'_shorttitle'};
5255 for $key (keys %T2H_THISDOC)
5257 $_ = &substitute_style($T2H_THISDOC{$key});
5260 $T2H_THISDOC{$key} = $_;
5263 # if no sections, then simply print document as is
5266 print "# Writing content into $docu_top_file \n" if $T2H_VERBOSE;
5267 open(FILE, "> $docu_top_file")
5268 || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
5270 &$T2H_print_page_head(\*FILE);
5271 $T2H_THIS_SECTION = \@doc_lines;
5272 t2h_print_lines(\*FILE);
5273 &$T2H_print_foot_navigation(\*FILE);
5274 &$T2H_print_page_foot(\*FILE);
5279 # initialize $T2H_HREF, $T2H_NAME
5282 'First' , sec_href($sections[0]),
5283 'Last', sec_href($sections[$#sections]),
5284 'About', $docu_about. '#SEC_About',
5287 # prepare TOC, OVERVIEW, TOP
5288 $T2H_TOC = \@toc_lines;
5289 $T2H_OVERVIEW = \@stoc_lines;
5294 $_ = shift @doc_lines;
5298 $T2H_HREF{'Top'} = $docu_top . '#SEC_Top';
5302 $T2H_HREF{'Top'} = $T2H_HREF{First};
5305 $node2href{Top} = $T2H_HREF{Top};
5306 $T2H_HREF{Contents} = $docu_toc.'#SEC_Contents' if @toc_lines;
5307 $T2H_HREF{Overview} = $docu_stoc.'#SEC_OVERVIEW' if @stoc_lines;
5310 if ($T2H_INDEX_CHAPTER)
5312 $T2H_HREF{Index} = $node2href{normalise_node($T2H_INDEX_CHAPTER)};
5313 warn "$ERROR T2H_INDEX_CHAPTER '$T2H_INDEX_CHAPTER' not found\n"
5314 unless $T2H_HREF{Index};
5316 if (! $T2H_HREF{Index} && $first_index_chapter)
5318 $T2H_INDEX_CHAPTER = $first_index_chapter;
5319 $T2H_HREF{Index} = $node2href{$T2H_INDEX_CHAPTER};
5322 print "# Using '" . clean_name($T2H_INDEX_CHAPTER) . "' as index page\n"
5323 if ($T2H_VERBOSE && $T2H_HREF{Index});
5327 'First', clean_name($sec2node{$sections[0]}),
5328 'Last', clean_name($sec2node{$sections[$#sections]}),
5329 'About', $T2H_WORDS->{$T2H_LANG}->{'About_Title'},
5330 'Contents', $T2H_WORDS->{$T2H_LANG}->{'ToC_Title'},
5331 'Overview', $T2H_WORDS->{$T2H_LANG}->{'Overview_Title'},
5332 'Index' , clean_name($T2H_INDEX_CHAPTER),
5333 'Top', clean_name($T2H_TOP_HEADING || $T2H_THISDOC{'title'} || $T2H_THISDOC{'shorttitle'}),
5336 #############################################################################
5337 # print frame and frame toc file
5341 open(FILE, "> $docu_frame_file")
5342 || die "$ERROR: Can't open $docu_frame_file for writing: $!\n";
5343 print "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
5344 &$T2H_print_frame(\*FILE);
5347 open(FILE, "> $docu_toc_frame_file")
5348 || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n";
5349 print "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
5350 &$T2H_print_toc_frame(\*FILE);
5355 #############################################################################
5356 # Monolithic beginning.
5360 open(FILE, "> $docu_doc_file")
5361 || die "$ERROR: Can't open $docu_doc_file for writing: $!\n";
5362 &$T2H_print_page_head(\*FILE);
5366 #############################################################################
5373 open(FILE, "> $docu_top_file")
5374 || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
5377 print "# Creating Top in $docu_top_file ...\n" if $T2H_VERBOSE;
5378 $T2H_THIS_SECTION = $T2H_TOP;
5379 $T2H_HREF{This} = $T2H_HREF{Top};
5380 $T2H_NAME{This} = $T2H_NAME{Top};
5381 &$T2H_print_Top(\*FILE);
5386 || die "$ERROR: Error occurred when closing $docu_top_file: $!\n";
5391 #############################################################################
5394 $T2H_NODE{Forward} = $sec2node{$sections[0]};
5395 $T2H_NAME{Forward} = &clean_name($sec2node{$sections[0]});
5396 $T2H_HREF{Forward} = sec_href($sections[0]);
5397 $T2H_NODE{This} = 'Top';
5398 $T2H_NAME{This} = $T2H_NAME{Top};
5399 $T2H_HREF{This} = $T2H_HREF{Top};
5402 print "# writing " . scalar(@sections) .
5403 " sections into $docu_rdir$docu_name"."_[1..$doc_num].$docu_ext"
5405 $previous = ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
5411 print "# writing " . scalar(@sections) . " sections in $docu_top_file ..."
5418 # loop through sections
5419 while ($section = shift(@sections))
5421 if ($T2H_SPLIT && ($T2H_SPLIT eq 'section' || $previous eq $CHAPTEREND))
5425 #close previous page
5426 &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
5427 &$T2H_print_page_foot($FH);
5432 $T2H_NAME{Back} = $T2H_NAME{This};
5433 $T2H_HREF{Back} = $T2H_HREF{This};
5434 $T2H_NODE{Back} = $T2H_NODE{This};
5435 $T2H_NAME{This} = $T2H_NAME{Forward};
5436 $T2H_HREF{This} = $T2H_HREF{Forward};
5437 $T2H_NODE{This} = $T2H_NODE{Forward};
5440 $T2H_NODE{Forward} = $sec2node{$sections[0]};
5441 $T2H_NAME{Forward} = &clean_name($T2H_NODE{Forward});
5442 $T2H_HREF{Forward} = sec_href($sections[0]);
5446 delete $T2H_HREF{Forward};
5447 delete $T2H_NODE{Forward};
5448 delete $T2H_NAME{Forward};
5451 $node = $node2up{$T2H_NODE{This}};
5452 $T2H_HREF{Up} = $node2href{$node};
5453 if ($T2H_HREF{Up} eq $T2H_HREF{This} || ! $T2H_HREF{Up})
5455 $T2H_NAME{Up} = $T2H_NAME{Top};
5456 $T2H_HREF{Up} = $T2H_HREF{Top};
5457 $T2H_NODE{Up} = 'Up';
5461 $T2H_NAME{Up} = &clean_name($node);
5462 $T2H_NODE{Up} = $node;
5465 $node = $node2prev{$T2H_NODE{This}};
5466 $T2H_NAME{Prev} = &clean_name($node);
5467 $T2H_HREF{Prev} = $node2href{$node};
5468 $T2H_NODE{Prev} = $node;
5470 $node = Node2FastBack($T2H_NODE{This});
5471 $T2H_NAME{FastBack} = &clean_name($node);
5472 $T2H_HREF{FastBack} = $node2href{$node};
5473 $T2H_NODE{FastBack} = $node;
5475 $node = $node2next{$T2H_NODE{This}};
5476 $T2H_NAME{Next} = &clean_name($node);
5477 $T2H_HREF{Next} = $node2href{$node};
5478 $T2H_NODE{Next} = $node;
5480 $node = Node2FastForward($T2H_NODE{This});
5481 $T2H_NAME{FastForward} = &clean_name($node);
5482 $T2H_HREF{FastForward} = $node2href{$node};
5483 $T2H_NODE{FastForward} = $node;
5487 my $file = $T2H_HREF{This};
5489 open(FILE, "> $docu_rdir$file") ||
5490 die "$ERROR: Can't open $docu_rdir$file for writing: $!\n";
5492 &$T2H_print_page_head($FH);
5493 t2h_print_label($FH);
5494 &$T2H_print_chapter_header($FH) if $T2H_SPLIT eq 'chapter';
5498 t2h_print_label($FH);
5501 $T2H_THIS_SECTION = [];
5504 $_ = shift(@doc_lines);
5505 last if ($_ eq $SECTIONEND || $_ eq $CHAPTEREND);
5506 push(@$T2H_THIS_SECTION, $_);
5509 &$T2H_print_section($FH);
5514 print "." if $counter =~ /00$/;
5519 &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
5520 &$T2H_print_page_foot($FH);
5523 print "\n" if $T2H_VERBOSE;
5525 #############################################################################
5526 # Print ToC, Overview, Footnotes
5528 delete $T2H_HREF{Prev};
5529 delete $T2H_HREF{Next};
5530 delete $T2H_HREF{Back};
5531 delete $T2H_HREF{Forward};
5532 delete $T2H_HREF{Up};
5536 print "# writing Footnotes in $docu_foot_file...\n" if $T2H_VERBOSE;
5537 open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n"
5539 $T2H_HREF{This} = $docu_foot;
5540 $T2H_NAME{This} = $T2H_WORDS->{$T2H_LANG}->{'Footnotes_Title'};
5541 $T2H_THIS_SECTION = \@foot_lines;
5542 &$T2H_print_Footnotes(\*FILE);
5543 close(FILE) if $T2H_SPLIT;
5548 print "# writing Toc in $docu_toc_file...\n" if $T2H_VERBOSE;
5549 open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n"
5551 $T2H_HREF{This} = $T2H_HREF{Contents};
5552 $T2H_NAME{This} = $T2H_NAME{Contents};
5553 $T2H_THIS_SECTION = \@toc_lines;
5554 &$T2H_print_Toc(\*FILE);
5555 close(FILE) if $T2H_SPLIT;
5560 print "# writing Overview in $docu_stoc_file...\n" if $T2H_VERBOSE;
5561 open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n"
5563 $T2H_HREF{This} = $T2H_HREF{Overview};
5564 $T2H_NAME{This} = $T2H_NAME{Overview};
5565 $T2H_THIS_SECTION = \@stoc_lines;
5566 unshift @$T2H_THIS_SECTION, "<BLOCKQUOTE>\n";
5567 push @$T2H_THIS_SECTION, "\n</BLOCKQUOTE>\n";
5568 &$T2H_print_Overview(\*FILE);
5569 close(FILE) if $T2H_SPLIT;
5572 if ($about_body = &$T2H_about_body())
5574 print "# writing About in $docu_about_file...\n" if $T2H_VERBOSE;
5575 open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n"
5578 $T2H_HREF{This} = $T2H_HREF{About};
5579 $T2H_NAME{This} = $T2H_NAME{About};
5580 $T2H_THIS_SECTION = [$about_body];
5581 &$T2H_print_About(\*FILE);
5582 close(FILE) if $T2H_SPLIT;
5587 &$T2H_print_page_foot(\*FILE);
5592 &l2h_FinishFromHtml if ($T2H_L2H);
5593 &l2h_Finish if($T2H_L2H);
5594 print "# that's all folks\n" if $T2H_VERBOSE;
5599 #+++############################################################################
5601 # Low level functions #
5603 #---############################################################################
5605 sub LocateIncludeFile
5610 # APA: Don't implicitely search ., to conform with the docs!
5611 # return $file if (-e $file && -r $file);
5612 foreach $dir (@T2H_INCLUDE_DIRS)
5614 return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file");
5622 $_ = &remove_style($_[0]);
5629 my($name, $level) = @_;
5632 $level--; # here we start at 0
5633 if ($name =~ /^appendix/ || defined(@appendix_sec_num))
5636 if (defined(@appendix_sec_num))
5638 &incr_sec_num($level, @appendix_sec_num);
5642 @appendix_sec_num = ('A', 0, 0, 0);
5644 $ret = join('.', @appendix_sec_num[0..$level]);
5649 if (defined(@normal_sec_num))
5651 &incr_sec_num($level, @normal_sec_num);
5655 @normal_sec_num = (1, 0, 0, 0);
5657 $ret = join('.', @normal_sec_num[0..$level]);
5659 $ret .= "." if $level == 0;
5668 foreach $l ($level+1 .. 3)
5677 my $num = $sec2number{$sec};
5679 return '' unless $num;
5680 return 'Top' unless $num =~ /\.\d+/;
5681 $num =~ s/\.[^\.]*$//;
5682 $num = $num . '.' unless $num =~ /\./;
5683 return $sec2node{$number2sec{$num}};
5686 # Return previous node or "Top"
5690 my $sec_num = $sec2seccount{$sec} - 1;
5691 return "Top" if !$sec_num || $sec_num < 1;
5692 return $sec2node{$seccount2sec{$sec_num}};
5695 # Return next node or "Top"
5699 my $sec_num = $sec2seccount{$sec} + 1;
5700 return "Top" unless exists $seccount2sec{$sec_num};
5701 return $sec2node{$seccount2sec{$sec_num}};
5705 # sub Node2FastBack NODE
5711 # The beginning of this chapter, or if already there, the beginning of the
5717 my $num = $sec2number{$node2sec{$node}};
5720 # Index Pages have no section number and 1. should go back to Top
5721 return $node2prev{$node} if !$num or $num eq "1.";
5723 # Get the current chapter
5724 $num =~ /^([A-Z\d]+)\./;
5727 # If the first section of this chapter, decrement chapter
5728 $n = $n eq 'A' ? $normal_sec_num[0] : $n =~ /^\d+$/ ? --$n : chr(ord($n)-1)
5729 if $n . '.' eq $num;
5731 # Return node name for section number "$n."
5732 return $sec2node{$number2sec{$n . '.'}} || $node2prev{$node};
5736 # sub Node2FastForward NODE
5742 # The beginning of the next chapter.
5744 sub Node2FastForward
5747 my $num = $sec2number{$node2sec{$node}};
5751 return $node2next{$node} if !$num;
5753 # Get current chapter
5754 $num =~ /^([A-Z\d]+)\./;
5758 $n = $n eq $normal_sec_num[0] ? 'A' : ++$n;
5761 return $sec2node{$number2sec{$n . '.'}} || $node2next{$node};
5766 local($_, %seen, %context, $before, $match, $after);
5770 if (/\@(\*|\.|\:|\@|\{|\})/)
5773 $context{$&} .= "> $_" if $T2H_VERBOSE;
5779 ($before, $match, $after) = ($`, $&, $');
5780 if ($before =~ /\b[-\w]+$/ && $after =~ /^[-\w.]*\b/)
5782 $seen{'e-mail address'}++;
5783 $context{'e-mail address'} .= "> $_" if $T2H_VERBOSE;
5788 $context{$match} .= "> $_" if $T2H_VERBOSE;
5791 $_ = "$before$match$after";
5796 foreach (sort(keys(%seen)))
5805 print "$_ ($seen{$_})\n";
5816 if (open($fh_name, $name))
5818 unshift(@fhs, $fh_name);
5822 warn "$ERROR Can't read file $name: $!\n";
5829 @fhs = (); # hold the file handles to read
5830 @input_spool = (); # spooled lines to read
5841 $line = shift(@input_spool);
5848 return($line) if $line;
5855 # used in pass 1, use &next_line
5861 while ($_ = &next_line)
5863 return if /^\@end\s+$tag\s*$/;
5865 die "* Failed to find '$tag' after: " . $lines[$#lines];
5868 # used in pass 1 for l2h use &next_line
5874 while ($_ = &next_line)
5876 return $string if /^\@end\s+$tag\s*$/;
5877 # $_ =~ s/hbox/mbox/g;
5878 $string = $string.$_;
5880 die "* Failed to find '$tag' after: " . $lines[$#lines];
5884 # HTML stacking to have a better HTML output
5889 @html_stack = ('html');
5890 $html_element = 'body';
5896 push(@html_stack, $html_element);
5897 $html_element = $what;
5903 push(@html_stack, $html_element)
5904 if ($html_element && $html_element ne 'P');
5905 $html_element = $what;
5910 $html_element = pop(@html_stack);
5921 if ($elt eq $html_element)
5923 $html_element = pop(@html_stack) if @html_stack;
5930 $html_element = pop(@html_stack) if @html_stack;
5936 my($what, $line) = @_;
5937 if ($T2H_DEBUG & $DEBUG_HTML)
5939 $what = "\n" unless $what;
5940 return("<!-- $line @html_stack, $html_element -->$what")
5945 # to debug the output...
5948 my($what, $line) = @_;
5949 return("<!-- $line -->$what")
5950 if $T2H_DEBUG & $DEBUG_HTML;
5959 $_ = substitute_style($_);
5971 $_ = substitute_style($_);
5977 my ($node, $name, $descr) = @_;
5980 &normalise_node($node);
5981 $href = $node2href{$node};
5986 $descr = SimpleTexi2Html($descr);
5987 if ($T2H_NUMBER_SECTIONS && !$T2H_NODE_NAME_IN_MENU && $node2sec{$node})
5989 $entry = $node2sec{$node};
5994 &normalise_node($name);
5995 $entry = ($name && ($name ne $node || ! $T2H_AVOID_MENU_REDUNDANCY)
5996 ? "$name : $node" : $node);
5999 if ($T2H_AVOID_MENU_REDUNDANCY && $descr)
6001 my $clean_entry = $entry;
6002 $clean_entry =~ s/^.*? // if ($clean_entry =~ /^([A-Z]|\d+)\.[\d\.]* /);
6003 $clean_entry =~ s/[^\w]//g;
6004 my $clean_descr = $descr;
6005 $clean_descr =~ s/[^\w]//g;
6006 $descr = '' if ($clean_entry eq $clean_descr)
6008 push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' .
6009 &t2h_anchor('', $href, $entry) .
6010 '</TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">' .
6012 "</TD></TR>\n", __LINE__));
6014 elsif ($node =~ /^\(.*\)\w+/)
6016 push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' .
6018 '</TD><TD ALIGN="left" VALIGN="TOP">' . $descr .
6019 "</TD></TR>\n", __LINE__))
6023 warn "$ERROR Undefined node of menu_entry ($node): $_";
6027 sub do_ctrl { "^$_[0]" }
6031 my($addr, $text) = split(/,\s*/, $_[0]);
6033 $text = $addr unless $text;
6034 &t2h_anchor('', "mailto:$addr", $text);
6039 # l2h does this much better
6040 return &l2h_ToLatex("{\\sc ".&unprotect_html($_[0])."}") if ($T2H_L2H);
6047 # This sub doesn't seem to be used.
6048 # What are $_[0] and $text?
6050 return &l2h_ToLatex("\$".&unprotect_html($_[0])."\$") if ($T2H_L2H);
6051 return "<EM>".$text."</EM>";
6056 my($url, $text, $only_text) = split(/,\s*/, $_[0]);
6057 # APA: Don't markup obviously bad links.
6058 # e.g. texinfo.texi 4.0 has this, which would lead to a broken
6060 # @section @code{@@uref@{@var{url}[, @var{text}][, @var{replacement}]@}}
6061 return if $url =~ /[<>]/;
6062 $text = $only_text if $only_text;
6063 $text = $url unless $text;
6064 &t2h_anchor('', $url, $text);
6067 sub do_url { &t2h_anchor('', $_[0], $_[0]) }
6071 return '<FONT SIZE="-1">' . $_[0] . '</FONT>';
6076 return "&$_[0]acute;" if $_[1] eq 'H';
6077 return "$_[0]." if $_[1] eq 'dotaccent';
6078 return "$_[0]*" if $_[1] eq 'ringaccent';
6079 return "$_[0]".'[' if $_[1] eq 'tieaccent';
6080 return "$_[0]".'(' if $_[1] eq 'u';
6081 return "$_[0]_" if $_[1] eq 'ubaraccent';
6082 return ".$_[0]" if $_[1] eq 'udotaccent';
6083 return "$_[0]<" if $_[1] eq 'v';
6084 return "&$_[0]cedil;" if $_[1] eq ',';
6085 return "$_[0]" if $_[1] eq 'dotless';
6091 my($texi_style, $text) = @_;
6094 $style = $style_map{$texi_style};
6095 if (defined($style))
6098 if ($style =~ /^\"/)
6103 if ($style =~ /^\&/)
6107 $text = &$style($text, $texi_style);
6112 $text = "<$style>$text</$style>";
6117 $text = "\`$text\'" if $do_quotes;
6126 # remove Texinfo styles
6130 1 while(s/\@\w+{([^\{\}]+)}/$1/g);
6141 sub substitute_style
6144 my($changed, $done, $style, $text);
6146 &simple_substitutions;
6152 while (/\@(\w+){([^\{\}]+)}/ || /\@(,){([^\{\}]+)}/)
6154 $text = &apply_style($1, $2);
6173 my($name, $href, $text, $newline, $extra_attribs) = @_;
6177 $result .= " NAME=\"".protect_html($name)."\"" if $name;
6180 $href =~ s|^$T2H_HREF_DIR_INSTEAD_FILE|./|
6181 if ($T2H_HREF_DIR_INSTEAD_FILE);
6182 $result .= " HREF=\"".protect_html($href)."\"";
6184 $result .= " $extra_attribs" if $extra_attribs;
6185 $result .= ">$text</A>";
6186 $result .= "\n" if $newline;
6194 return("${docu_name}_$num.$docu_ext");
6199 return $node2href{$sec2node{$_[0]}};
6205 if ("$docu_rdir${docu_name}_$doc_num.$docu_ext" eq "$docu_top_file") {
6206 warn "$WARN Section $docu_rdir${docu_name}_$doc_num.$docu_ext would overwrite Top, continuing at $docu_rdir${docu_name}_".($doc_num+1).".$docu_ext";
6209 $docu_doc = &doc_href($doc_num);
6214 my ($fh, $lines) = @_;
6216 $lines = $T2H_THIS_SECTION unless $lines;
6221 $_ = l2h_FromHtml($_) if ($T2H_L2H);
6222 if (/^$PROTECTTAG/o)
6231 @cnt = split(/\W*\s+\W*/);
6232 $cnt += scalar(@cnt);
6250 # protect &, ", <, and >.
6251 # APA: Keep it simple. This is what perl's CGI::espaceHTML does.
6252 # We may consider using that instead.
6253 # If raw HTML is used outside @ifhtml or @html it's an error
6255 $what =~ s/\&/\&/go;
6256 $what =~ s/\"/\"/go;
6257 $what =~ s/\</\</go;
6258 $what =~ s/\>/\>/go;
6282 # Character entity references (eg. <)
6284 # Numeric character references (eg. <)
6285 $what =~ s/\&/\&/go;
6286 $what =~ s/\"/\"/go;
6287 $what =~ s/\</\</go;
6288 $what =~ s/\>/\>/go;
6295 my $href = shift || $T2H_HREF{This};
6296 $href =~ s/.*#(.*)$/$1/;
6297 print $fh qq{<A NAME="$href"></A>\n};
6302 SetDocumentLanguage('en') unless ($T2H_LANG);
6303 # APA: There's got to be a better way:
6304 $things_map{'today'} = &pretty_date;
6306 $T2H_TODAY = &pretty_date; # like "20 September 1993"
6307 # the eval prevents this from breaking on system which do not have
6308 # a proper getpwuid implemented
6309 eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i
6310 # APA: Provide Windows NT workaround until getpwuid gets
6311 # implemented there.
6312 $T2H_USER = $ENV{'USERNAME'} unless defined $T2H_USER;
6322 ##############################################################################
6324 # These next few lines are legal in both Perl and nroff.
6328 'di \" finish diversion--previous line must be blank
6329 .nr nl 0-1 \" fake up transition to first page again
6330 .nr % 0 \" start at page 1
6331 '; __END__ ############# From here on it's a standard manual page ############
6332 .so /usr/share/man/man1/texi2html.1