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.2 2004-10-14 00:10:34 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.2 2004-10-14 00:10:34 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.2 2004-10-14 00:10:34 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_EXAMPLE_INDENT_CELL<td class=example><pre>"},
2321 q{'</pre></td></tr></table>'}
2325 q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smallexample><pre><FONT SIZE=$T2H_SMALL_FONT_SIZE>"},
2326 q{'</FONT></pre></td></tr></table>'}
2330 q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=display><pre " . 'style="font-family: serif">'},
2331 q{'</pre></td></tr></table>'}
2335 q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smalldisplay><pre " . 'style="font-family: serif"><FONT SIZE=$T2H_SMALL_FONT_SIZE>'},
2336 q{'</FONT></pre></td></tr></table>'}
2340 $complex_format_map->{lisp} = $complex_format_map->{example};
2341 $complex_format_map->{smalllisp} = $complex_format_map->{smallexample};
2342 $complex_format_map->{format} = $complex_format_map->{display};
2343 $complex_format_map->{smallformat} = $complex_format_map->{smalldisplay};
2346 # texinfo definition shortcuts to real ones
2368 'defun', 'deffn Function',
2369 'defmac', 'deffn Macro',
2370 'defspec', 'deffn {Special Form}',
2371 'defvar', 'defvr Variable',
2372 'defopt', 'defvr {User Option}',
2373 'deftypefun', 'deftypefn Function',
2374 'deftypevar', 'deftypevr Variable',
2375 'defivar', 'defcv {Instance Variable}',
2376 'deftypeivar', 'defcv {Instance Variable}', # NEW: FIXME
2377 'defmethod', 'defop Method',
2378 'deftypemethod', 'defop Method', # NEW:FIXME
2380 'defunx', 'deffnx Function',
2381 'defmacx', 'deffnx Macro',
2382 'defspecx', 'deffnx {Special Form}',
2383 'defvarx', 'defvrx Variable',
2384 'defoptx', 'defvrx {User Option}',
2385 'deftypefunx', 'deftypefnx Function',
2386 'deftypevarx', 'deftypevrx Variable',
2387 'defivarx', 'defcvx {Instance Variable}',
2388 'defmethodx', 'defopx Method',
2409 'summarycontents', 1,
2415 # unsupported commands (formatting)
2423 'setchapternewpage', 1,
2433 'paragraphindent', 1,
2434 # unsupported formats
2441 #+++############################################################################
2443 # Argument parsing, initialisation #
2445 #---############################################################################
2448 # flush stdout and stderr after every write
2456 %value = (); # hold texinfo variables, see also -D
2457 $use_bibliography = 1;
2461 # called on -init-file
2464 my $init_file = shift;
2465 # second argument is value of options
2469 print "# reading initialization file from $init_file\n"
2471 require($init_file);
2475 print "$ERROR Error: can't read init file $int_file\n";
2482 sub SetDocumentLanguage
2485 if (! exists($T2H_WORDS->{$lang}))
2487 warn "$ERROR: Language specs for '$lang' do not exists. Reverting to '" .
2488 ($T2H_LANG ? $T2H_LANG : "en") . "'\n";
2492 print "# using '$lang' as document language\n" if ($T2H_VERBOSE);
2498 ## obsolete cmd line options
2500 $T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} =
2503 linkage => sub {$T2H_SECTION_NAVIGATION = 0;},
2504 verbose => 'obsolete, use -nosec_nav',
2507 $T2H_OBSOLETE_OPTIONS -> {use_acc} =
2510 linkage => \$use_acc,
2511 verbose => 'obsolete',
2514 $T2H_OBSOLETE_OPTIONS -> {expandinfo} =
2517 linkage => sub {$T2H_EXPAND = 'info';},
2518 verbose => 'obsolete, use "-expand info" instead',
2521 $T2H_OBSOLETE_OPTIONS -> {expandtex} =
2524 linkage => sub {$T2H_EXPAND = 'tex';},
2525 verbose => 'obsolete, use "-expand tex" instead',
2528 $T2H_OBSOLETE_OPTIONS -> {monolithic} =
2531 linkage => sub {$T2H_SPLIT = '';},
2532 verbose => 'obsolete, use "-split no" instead',
2535 $T2H_OBSOLETE_OPTIONS -> {split_node} =
2538 linkage => sub{$T2H_SPLIT = 'section';},
2539 verbose => 'obsolete, use "-split section" instead',
2542 $T2H_OBSOLETE_OPTIONS -> {split_chapter} =
2545 linkage => sub{$T2H_SPLIT = 'chapter';},
2546 verbose => 'obsolete, use "-split chapter" instead',
2549 $T2H_OBSOLETE_OPTIONS -> {no_verbose} =
2552 linkage => sub {$T2H_VERBOSE = 0;},
2553 verbose => 'obsolete, use -noverbose instead',
2556 $T2H_OBSOLETE_OPTIONS -> {output_file} =
2559 linkage => sub {$T2H_OUT = $_[1]; $T2H_SPLIT = '';},
2560 verbose => 'obsolete, use -out_file instead',
2564 $T2H_OBSOLETE_OPTIONS -> {section_navigation} =
2567 linkage => \$T2H_SECTION_NAVIGATION,
2568 verbose => 'obsolete, use -sec_nav instead',
2572 $T2H_OBSOLETE_OPTIONS -> {verbose} =
2575 linkage => \$T2H_VERBOSE,
2576 verbose => 'obsolete, use -Verbose instead',
2580 # read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc
2581 my $home = $ENV{HOME};
2582 defined($home) or $home = '';
2583 foreach $i ('/etc/texi2htmlrc', "$home/.texi2htmlrc")
2587 print "# reading initialization file from $i\n"
2594 #+++############################################################################
2596 # parse command-line options
2598 #---############################################################################
2599 $T2H_USAGE_TEXT = <<EOT;
2600 Usage: texi2html [OPTIONS] TEXINFO-FILE
2601 Translates Texinfo source documentation to HTML.
2603 $T2H_FAILURE_TEXT = <<EOT;
2604 Try 'texi2html -help' for usage instructions.
2606 $options = new Getopt::MySimple;
2608 # some older version of GetOpt::Long don't have
2609 # Getopt::Long::Configure("pass_through")
2610 eval {Getopt::Long::Configure("pass_through");};
2611 $Configure_failed = $@ && <<EOT;
2612 **WARNING: Parsing of obsolete command-line options could have failed.
2613 Consider to use only documented command-line options (run
2614 'texi2html -help 2' for a complete list) or upgrade to perl
2615 version 5.005 or higher.
2618 if (! $options->getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
2620 print $Configure_failed if $Configure_failed;
2621 die $T2H_FAILURE_TEXT;
2626 eval {Getopt::Long::Configure("no_pass_through");};
2627 if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
2629 print $Configure_failed if $Configure_failed;
2630 die $T2H_FAILURE_TEXT;
2636 die "Need file to check\n$T2H_FAILURE_TEXT" unless @ARGV > 0;
2641 #+++############################################################################
2643 # evaluation of cmd line options
2645 #---############################################################################
2647 if ($T2H_EXPAND eq 'info')
2649 $to_skip{'ifinfo'} = 1;
2650 $to_skip{'end ifinfo'} = 1;
2652 elsif ($T2H_EXPAND eq 'tex')
2654 $to_skip{'iftex'} = 1;
2655 $to_skip{'end iftex'} = 1;
2659 $T2H_INVISIBLE_MARK = '<IMG SRC="invisible.xbm">' if $T2H_INVISIBLE_MARK eq 'xbm';
2662 # file name buisness
2664 die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1;
2665 $docu = shift(@ARGV);
2666 if ($docu =~ /.*\//)
2668 chop($docu_dir = $&);
2676 unshift(@T2H_INCLUDE_DIRS, $docu_dir);
2677 $docu_name =~ s/\.te?x(i|info)?$//; # basename of the document
2678 $docu_name = $T2H_PREFIX if ($T2H_PREFIX);
2681 if ($T2H_SUBDIR && ! $T2H_OUT)
2683 $T2H_SUBDIR =~ s|/*$||;
2684 unless (-d "$T2H_SUBDIR" && -w "$T2H_SUBDIR")
2686 if ( mkdir($T2H_SUBDIR, oct(755)))
2688 print "# created directory $T2H_SUBDIR\n" if ($T2H_VERBOSE);
2692 warn "$ERROR can't create directory $T2H_SUBDIR. Put results into current directory\n";
2698 if ($T2H_SUBDIR && ! $T2H_OUT)
2700 $docu_rdir = "$T2H_SUBDIR/";
2701 print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
2705 if ($T2H_OUT && $T2H_OUT =~ m|(.*)/|)
2708 print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
2712 print "# putting result files into current directory \n" if ($T2H_VERBOSE);
2726 if ($T2H_TOP_FILE =~ /\..*$/)
2728 $T2H_TOP_FILE = $`.".$docu_ext";
2732 if (! $T2H_OUT && ($T2H_SPLIT =~ /section/i || $T2H_SPLIT =~ /node/i))
2734 $T2H_SPLIT = 'section';
2736 elsif (! $T2H_OUT && $T2H_SPLIT =~ /chapter/i)
2738 $T2H_SPLIT = 'chapter'
2745 $docu_doc = "$docu_name.$docu_ext"; # document's contents
2746 $docu_doc_file = "$docu_rdir$docu_doc";
2749 $docu_toc = $T2H_TOC_FILE || "${docu_name}_toc.$docu_ext"; # document's table of contents
2750 $docu_stoc = "${docu_name}_ovr.$docu_ext"; # document's short toc
2751 $docu_foot = "${docu_name}_fot.$docu_ext"; # document's footnotes
2752 $docu_about = "${docu_name}_abt.$docu_ext"; # about this document
2753 $docu_top = $T2H_TOP_FILE || $docu_doc;
2759 $docu_doc = $T2H_OUT;
2760 $docu_doc =~ s|.*/||;
2762 $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc;
2765 $docu_toc_file = "$docu_rdir$docu_toc";
2766 $docu_stoc_file = "$docu_rdir$docu_stoc";
2767 $docu_foot_file = "$docu_rdir$docu_foot";
2768 $docu_about_file = "$docu_rdir$docu_about";
2769 $docu_top_file = "$docu_rdir$docu_top";
2771 $docu_frame_file = "$docu_rdir${docu_name}_frame.$docu_ext";
2772 $docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext";
2777 $value{'html'} = 1; # predefine html (the output format)
2778 $value{'texi2html'} = $THISVERSION; # predefine texi2html (the translator)
2779 # _foo: internal to track @foo
2780 foreach ('_author', '_title', '_subtitle',
2781 '_settitle', '_setfilename', '_shorttitle')
2783 $value{$_} = ''; # prevent -w warnings
2785 %node2sec = (); # node to section name
2786 %sec2node = (); # section to node name
2787 %sec2seccount = (); # section to section count
2788 %seccount2sec = (); # section count to section
2789 %sec2number = (); # section to number
2790 # $number =~ ^[\dA-Z]+\.(\d+(\.\d+)*)?$
2791 %number2sec = (); # number to section
2792 %idx2node = (); # index keys to node
2793 %node2href = (); # node to HREF
2794 %node2next = (); # node to next
2795 %node2prev = (); # node to prev
2796 %node2up = (); # node to up
2797 %bib2href = (); # bibliography reference to HREF
2798 %gloss2href = (); # glossary term to HREF
2799 @sections = (); # list of sections
2800 %tag2pro = (); # protected sections
2814 # can I use ISO8859 characters? (HTML+)
2818 $things_map{'bullet'} = "•";
2819 $things_map{'copyright'} = "©";
2820 $things_map{'dots'} = "…";
2821 $things_map{'equiv'} = "≡";
2822 $things_map{'expansion'} = "→";
2823 $things_map{'point'} = "∗";
2824 $things_map{'result'} = "⇒";
2828 # read texi2html extensions (if any)
2830 $extensions = 'texi2html.ext'; # extensions in working directory
2833 print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
2834 require($extensions);
2836 ($progdir = $0) =~ s/[^\/]+$//;
2837 if ($progdir && ($progdir ne './'))
2839 $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory
2842 print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
2843 require($extensions);
2848 print "# reading from $docu\n" if $T2H_VERBOSE;
2850 #########################################################################
2854 # latex2html conversions consist of three stages:
2855 # 1) ToLatex: Put "latex" code into a latex file
2856 # 2) ToHtml: Use latex2html to generate corresponding html code and images
2857 # 3) FromHtml: Extract generated code and images from latex2html run
2860 ##########################
2864 # defaults for files and names
2869 return 0 unless ($root);
2870 $l2h_name = "${root}_l2h";
2871 $l2h_latex_file = "$docu_rdir${l2h_name}.tex";
2872 $l2h_cache_file = "${docu_rdir}l2h_cache.pm";
2873 $T2H_L2H_L2H = "latex2html" unless ($T2H_L2H_L2H);
2874 # destination dir -- generated images are put there, should be the same
2875 # as dir of enclosing html document --
2876 $l2h_html_file = "$docu_rdir${l2h_name}.html";
2877 $l2h_prefix = "${l2h_name}_";
2882 ##########################
2884 # First stage: Generation of Latex file
2885 # Initialize with: l2h_InitToLatex
2886 # Add content with: l2h_ToLatex($text) --> HTML placeholder comment
2887 # Finish with: l2h_FinishToLatex
2890 $l2h_latex_preample = <<EOT;
2891 % This document was automatically generated by the l2h extenstion of texi2html
2893 \\documentclass{article}
2898 $l2h_latex_closing = <<EOT;
2902 # return used latex 1, if l2h could be initalized properly, 0 otherwise
2906 unless ($T2H_L2H_SKIP)
2908 unless (open(L2H_LATEX, ">$l2h_latex_file"))
2910 warn "$ERROR Error l2h: Can't open latex file '$latex_file' for writing\n";
2913 print "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE);
2914 print L2H_LATEX $l2h_latex_preample;
2916 # open database for caching
2918 $l2h_latex_count = 0;
2919 $l2h_to_latex_count = 0;
2920 $l2h_cached_count = 0;
2924 # print text (1st arg) into latex file (if not already there), return
2925 # HTML commentary which can be later on replaced by the latex2html
2931 $l2h_to_latex_count++;
2932 $text =~ s/(\s*)$//;
2933 # try whether we can cache it
2934 my $cached_text = l2h_FromCache($text);
2937 $l2h_cached_count++;
2938 return $cached_text;
2940 # try whether we have text already on things to do
2941 unless ($count = $l2h_to_latex{$text})
2943 $count = $l2h_latex_count;
2945 $l2h_to_latex{$text} = $count;
2946 $l2h_to_latex[$count] = $text;
2947 unless ($T2H_L2H_SKIP)
2949 print L2H_LATEX "\\begin{rawhtml}\n";
2950 print L2H_LATEX "<!-- l2h_begin ${l2h_name} ${count} -->\n";
2951 print L2H_LATEX "\\end{rawhtml}\n";
2953 print L2H_LATEX "$text\n";
2955 print L2H_LATEX "\\begin{rawhtml}\n";
2956 print L2H_LATEX "<!-- l2h_end ${l2h_name} ${count} -->\n";
2957 print L2H_LATEX "\\end{rawhtml}\n";
2960 return "<!-- l2h_replace ${l2h_name} ${count} -->";
2963 # print closing into latex file and close it
2964 sub l2h_FinishToLatex
2967 $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count;
2968 unless ($T2H_L2H_SKIP)
2970 print L2H_LATEX $l2h_latex_closing;
2973 print "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE);
2974 unless ($l2h_latex_count)
2982 ###################################
2983 # Second stage: Use latex2html to generate corresponding html code and images
2985 # l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]):
2986 # Call latex2html on $l2h_latex_file
2987 # Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir
2988 # Return 1, on success
2993 local($call, $ext, $root, $dotbug);
2996 print "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE);
2999 # Check for dot in directory where dvips will work
3002 if ($T2H_L2H_TMP =~ /\./)
3004 warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n";
3010 if (&getcwd =~ /\./)
3012 warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n";
3016 # fix it, if necessary and hope that it works
3017 $T2H_L2H_TMP = "/tmp" if ($dotbug);
3019 $call = $T2H_L2H_L2H;
3020 # use init file, if specified
3021 $call = $call . " -init_file " . $init_file if ($init_file && -f $init_file);
3023 $call .= ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir");
3024 # use l2h_tmp, if specified
3025 $call = $call . " -tmp $T2H_L2H_TMP" if ($T2H_L2H_TMP);
3026 # options we want to be sure of
3027 $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link";
3028 $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file";
3030 print "# l2h: executing '$call'\n" if ($T2H_VERBOSE);
3033 warn "l2h ***Error: '${call}' did not succeed\n";
3038 print "# l2h: latex2html finished successfully\n" if ($T2H_VERBOSE);
3043 # this is directly pasted over from latex2html
3048 die "'pwd' failed (out of memory?)\n"
3055 ##########################
3056 # Third stage: Extract generated contents from latex2html run
3057 # Initialize with: l2h_InitFromHtml
3058 # open $l2h_html_file for reading
3059 # reads in contents into array indexed by numbers
3060 # return 1, on success -- 0, otherwise
3061 # Extract Html code with: l2h_FromHtml($text)
3062 # replaces in $text all previosuly inserted comments by generated html code
3063 # returns (possibly changed) $text
3064 # Finish with: l2h_FinishFromHtml
3065 # closes $l2h_html_dir/$l2h_name.".$docu_ext"
3067 sub l2h_InitFromHtml
3069 local($h_line, $h_content, $count, %l2h_img);
3071 if (! open(L2H_HTML, "<${l2h_html_file}"))
3073 print "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n";
3076 print "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE);
3078 $l2h_html_count = 0;
3079 while ($h_line = <L2H_HTML>)
3081 if ($h_line =~ /^<!-- l2h_begin $l2h_name ([0-9]+) -->/)
3085 while ($h_line = <L2H_HTML>)
3087 if ($h_line =~ /^<!-- l2h_end $l2h_name $count -->/)
3092 $h_content = l2h_ToCache($count, $h_content);
3093 $l2h_from_html[$count] = $h_content;
3097 $h_content = $h_content.$h_line;
3101 print "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n"
3108 print "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n"
3118 my($done, $to_do, $count);
3120 while ($to_do =~ /([^\000]*)<!-- l2h_replace $l2h_name ([0-9]+) -->([^\000]*)/)
3125 $done = "<!-- l2h_end $l2h_name $count -->".$done
3126 if ($T2H_DEBUG & $DEBUG_L2H);
3128 $done = &l2h_ExtractFromHtml($count) . $done;
3130 $done = "<!-- l2h_begin $l2h_name $count -->".$done
3131 if ($T2H_DEBUG & $DEBUG_L2H);
3133 return $to_do.$done;
3137 sub l2h_ExtractFromHtml
3140 return $l2h_from_html[$count] if ($l2h_from_html[$count]);
3141 if ($count >= 0 && $count < $l2h_latex_count)
3143 # now we are in trouble
3146 $l2h_extract_error++;
3147 print "$ERROR l2h: can't extract content $count from html\n"
3149 # try simple (ordinary) substition (without l2h)
3152 $_ = $l2h_to_latex{$count};
3153 $_ = &substitute_style($_);
3155 $_ = "<!-- l2h: ". __LINE__ . " use texi2html -->" . $_
3156 if ($T2H_DEBUG & $DEBUG_L2H);
3162 # now we have been incorrectly called
3164 print "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n";
3165 return "<!-- l2h: ". __LINE__ . " out of range count $count -->"
3166 if ($T2H_DEBUG & $DEBUG_L2H);
3167 return "<!-- l2h: out of range count $count -->";
3171 sub l2h_FinishFromHtml
3175 if ($l2h_extract_error + $l2h_range_error)
3177 print "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n";
3181 print "# l2h: finished from html (no errors)\n";
3191 print "# l2h: removing temporary files generated by l2h extension\n"
3193 while (<"$docu_rdir$l2h_name"*>)
3198 print "# l2h: Finished\n" if $T2H_VERBOSE;
3202 ##############################
3203 # stuff for l2h caching
3206 # I tried doing this with a dbm data base, but it did not store all
3207 # keys/values. Hence, I did as latex2html does it
3210 if (-r "$l2h_cache_file")
3212 my $rdo = do "$l2h_cache_file";
3213 warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n")
3220 return unless $l2h_latex_count;
3222 open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n";
3223 while (($key, $value) = each %l2h_cache)
3227 $key =~ s|\\\\/|\\/|g;
3228 # weird, a \ at the end of the key results in an error
3229 # maybe this also broke the dbm database stuff
3230 $key =~ s|\\$|\\\\|;
3231 $value =~ s/\|/\\\|/go;
3232 $value =~ s/\\\\\|/\\\|/go;
3233 $value =~ s|\\\\|\\\\\\\\|g;
3234 print FH "\n\$l2h_cache_key = q/$key/;\n";
3235 print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n";
3241 # return cached html, if it exists for text, and if all pictures
3242 # are there, as well
3246 my $cached = $l2h_cache{$text};
3249 while ($cached =~ m/SRC="(.*?)"/g)
3251 unless (-e "$docu_rdir$1")
3261 # insert generated html into cache, move away images,
3262 # return transformed html
3267 my $content = shift;
3268 my @images = ($content =~ /SRC="(.*?)"/g);
3273 $dest = $l2h_img{$src};
3277 if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext)
3283 warn "$ERROR: L2h image $src has invalid extension\n";
3286 while (-e "$docu_rdir${docu_name}_$maximage.$ext")
3290 $dest = "${docu_name}_$maximage.$ext";
3291 system("cp -f $docu_rdir$src $docu_rdir$dest");
3292 $l2h_img{$src} = $dest;
3293 unlink "$docu_rdir$src" unless ($DEBUG & $DEBUG_L2H);
3295 $content =~ s/$src/$dest/g;
3297 $l2h_cache{$l2h_to_latex[$count]} = $content;
3302 #+++############################################################################
3304 # Pass 1: read source, handle command, variable, simple substitution #
3306 #---############################################################################
3311 @lines = (); # whole document
3312 @toc_lines = (); # table of contents
3313 @stoc_lines = (); # table of contents
3314 $curlevel = 0; # current level in TOC
3315 $node = ''; # current node name
3316 $node_next = ''; # current node next name
3317 $node_prev = ''; # current node prev name
3318 $node_up = ''; # current node up name
3319 $in_table = 0; # am I inside a table
3320 $table_type = ''; # type of table ('', 'f', 'v', 'multi')
3321 @tables = (); # nested table support
3322 $in_bibliography = 0; # am I inside a bibliography
3323 $in_glossary = 0; # am I inside a glossary
3324 $in_top = 0; # am I inside the top node
3325 $has_top = 0; # did I see a top node?
3326 $has_top_command = 0; # did I see @top for automatic pointers?
3327 $in_pre = 0; # am I inside a preformatted section
3328 $in_list = 0; # am I inside a list
3329 $in_html = 0; # am I inside an HTML section
3330 $first_line = 1; # is it the first line
3331 $dont_html = 0; # don't protect HTML on this line
3332 $deferred_ref = ''; # deferred reference for indexes
3333 @html_stack = (); # HTML elements stack
3334 $html_element = ''; # current HTML element
3336 %macros = (); # macros
3337 $toc_indent = # used for identation in TOC's
3338 ($T2H_NUMBER_SECTIONS ? 'BLOCKQUOTE' : 'UL');
3341 $T2H_L2H = &l2h_Init($docu_name) if ($T2H_L2H);
3342 $T2H_L2H = &l2h_InitToLatex if ($T2H_L2H);
3344 # build code for simple substitutions
3345 # the maps used (%simple_map and %things_map) MUST be aware of this
3346 # watch out for regexps, / and escaped characters!
3348 foreach (keys(%simple_map))
3350 ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars
3351 $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n";
3353 foreach (keys(%things_map))
3355 $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n";
3359 # accentuated characters
3360 foreach (keys(%accent_map))
3364 $subst_code .= "s/$;3";
3368 $subst_code .= "s/$;4";
3372 $subst_code .= "s/\\\@\\$_";
3374 $subst_code .= "([a-z])/&\${1}$accent_map{$_};/gi;\n";
3377 eval("sub simple_substitutions { $subst_code }");
3380 INPUT_LINE: while ($_ = &next_line)
3383 # remove \input on the first lines only
3390 # non-@ substitutions cf. texinfmt.el
3392 # parse texinfo tags
3396 if (/^\s*\@end\s+(\w+)\b/)
3400 elsif (/^\s*\@(\w+)\b/)
3405 # handle @html / @end html
3409 if ($end_tag eq 'html')
3415 $tag2pro{$in_html} .= $_;
3419 elsif ($tag eq 'html')
3421 $in_html = $PROTECTTAG . ++$html_num;
3422 push(@lines, $in_html);
3427 # try to remove inlined comments
3428 # syntax from tex-mode.el comment-start-skip
3430 s/((^|[^\@])(\@\@)*)\@(c( |\{)|comment ).*$/$1/;
3432 # Sometimes I use @c right at the end of a line ( to suppress the line feed )
3433 # s/((^|[^\@])(\@\@)*)\@c(omment)?$/$1/;
3434 # s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/;
3435 # s/(.*)\@c{.*?}(.*)/$1$2/;
3436 # s/(.*)\@comment{.*?}(.*)/$1$2/;
3438 # s/^(.*)\@comment /$1/;
3440 #############################################################
3441 # value substitution before macro expansion, so that
3442 # it works in macro arguments
3443 s/\@value{($VARRE)}/$value{$1}/eg;
3445 #############################################################
3446 # macro substitution
3449 if (exists($macros->{$1}))
3456 #####################################################
3457 # Support for multi-line macro invocations and nested
3458 # '{' and '}' within macro invocations added by
3459 # Eric Sunshine <sunshine@sunshineco.com> 2000/09/10.
3460 #####################################################
3461 if ($after =~ /^\s*\{/) # Macro arguments delimited by '{' and '}'?
3463 my ($protect, $start, $end, $depth, $c) = (0, 0, 0, 0, 0);
3464 foreach $c (unpack('C*', $after))
3467 { # Character protected by '\' or '@'; pass through unmolested.
3470 elsif ($c == ord('\\') || $c == ord('@'))
3471 { # '\' and '@' remove special meaning of next character.
3474 elsif ($c == ord('{')) # Allow '{' and '}' to nest.
3478 elsif ($c == ord('}'))
3481 last if $depth == 0;
3483 $start++ if !$depth; # Position of opening brace.
3484 $end++; # Position of closing brace.
3487 # '{' & '}' did not completely unnest; append next line; try again.
3490 my $paste = &next_line;
3491 die "$ERROR Missing closing brace '}' for invocation of macro " .
3492 "\"\@$name\" on line:\n", substr($_,0,70), "...\n" unless $paste;
3494 unshift @input_spool, $_ . $paste;
3498 # Extract macro arguments from within '{' and '}'.
3499 $len = $end - $start - 1;
3500 $args = ($len > 0) ? substr($after, $start + 1, $len) : '';
3501 $after = substr($after, $end + 1);
3503 ############ End Sunshine Modifications #############
3504 elsif (@{$macros->{$name}->{Args}} == 1) # Macro arg extends to EOL.
3511 $args =~ s|\\\\|\\|g;
3514 if (@{$macros->{$name}->{Args}} > 1)
3516 $args =~ s/(^|[^\\]),/$1$;/g ;
3518 @args = split(/$;\s*/, $args) if (@{$macros->{$name}->{Args}} > 1);
3525 my $macrobody = $macros->{$name}->{Body};
3526 for ($i=0; $i<=$#args; $i++)
3528 $macrobody =~ s|\\$macros->{$name}->{Args}->[$i]\\|$args[$i]|g;
3530 $macrobody =~ s|\\\\|\\|g;
3531 $_ = $before . $macrobody . $after;
3532 unshift @input_spool, map {$_ = $_."\n"} split(/\n/, $_);
3537 # try to skip the line
3541 $in_titlepage = 0 if $end_tag eq 'titlepage';
3542 next if $to_skip{"end $end_tag"};
3546 $in_titlepage = 1 if $tag eq 'titlepage';
3547 next if $to_skip{$tag};
3548 last if $tag eq 'bye';
3552 # parsing the top node
3553 if ($tag eq 'node' ||
3554 ($sec2level{$tag} && $tag !~ /unnumbered/ && $tag !~ /heading/))
3558 push(@lines, $TOPEND);
3565 s/([\w ])---([\w ])/$1--$2/g;
3573 &skip_until($tag), next if $tag eq 'ignore';
3574 &skip_until($tag), next if $tag eq 'ifnothtml';
3575 if ($tag eq 'ifinfo')
3577 &skip_until($tag), next unless $T2H_EXPAND eq 'info';
3579 if ($tag eq 'iftex')
3581 &skip_until($tag), next unless $T2H_EXPAND eq 'tex';
3585 # add to latex2html file
3586 if ($T2H_EXPAND eq 'tex' && $T2H_L2H && ! $in_pre)
3588 # add space to the end -- tex(i2dvi) does this, as well
3589 push(@lines, &l2h_ToLatex(&string_until($tag) . " "));
3597 if ($tag eq 'titlepage')
3601 # handle special tables
3602 if ($tag =~ /^(|f|v|multi)table$/)
3608 # APA: Fixed regexp to ONLY match the top node, not any
3609 # node starting with the word top.
3610 if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*(,.*)?$/i))
3614 $has_top_command = 1 if $tag eq 'top';
3615 @lines = (); # ignore all lines before top (title page garbage)
3618 elsif ($tag eq 'node')
3623 push(@lines, $TOPEND);
3625 warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o;
3626 # request of "Richard Y. Kim" <ryk@ap.com>
3628 $_ = &protect_html($_); # if node contains '&' for instance
3629 ($node, $node_next, $node_prev, $node_up) = split(/,/);
3632 &normalise_node($node);
3636 warn "$ERROR Node is undefined: $_ (eg. \@node NODE-NAME, NEXT, PREVIOUS, UP)";
3640 &normalise_node($node_next);
3644 &normalise_node($node_prev);
3648 &normalise_node($node_up);
3651 push @lines, &html_debug("<A NAME='".protect_html($node)."'></A>\n", __LINE__) :
3652 push @lines, &html_debug("<A NAME=\"".protect_html($node)."\"></A>\n", __LINE__);
3655 elsif ($tag eq 'include')
3657 if (/^\@include\s+($FILERE)\s*$/o)
3659 $file = LocateIncludeFile($1);
3660 if ($file && -e $file)
3663 print "# including $file\n" if $T2H_VERBOSE;
3667 warn "$ERROR Can't find $1, skipping";
3672 warn "$ERROR Bad include line: $_";
3676 elsif ($tag eq 'ifclear')
3678 if (/^\@ifclear\s+($VARRE)\s*$/o)
3680 next unless defined($value{$1});
3685 warn "$ERROR Bad ifclear line: $_";
3689 elsif ($tag eq 'ifset')
3691 if (/^\@ifset\s+($VARRE)\s*$/o)
3693 next if defined($value{$1});
3698 warn "$ERROR Bad ifset line: $_";
3702 elsif ($tag eq 'menu')
3704 unless ($T2H_SHOW_MENU)
3709 &html_push_if($tag);
3710 push(@lines, &html_debug('', __LINE__));
3712 elsif ($format_map{$tag})
3714 $in_pre = 1 if $format_map{$tag} eq 'PRE';
3715 &html_push_if($format_map{$tag});
3716 push(@lines, &html_debug('', __LINE__));
3717 $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ;
3718 # push(@lines, &debug("<BLOCKQUOTE>\n", __LINE__))
3719 # if $tag =~ /example/i;
3720 # Eric Sunshine <sunshine@sunshineco.com>: <PRE>blah</PRE> looks
3721 # better than <PRE>\nblah</PRE> on OmniWeb2 NextStep browser.
3722 push(@lines, &debug("<$format_map{$tag}>" .
3723 ($in_pre ? '' : "\n"), __LINE__));
3726 elsif (exists $complex_format_map->{$tag})
3728 my $start = eval $complex_format_map->{$tag}->[0];
3729 # APA: <table> implicitly ends paragraph, so let's do it
3730 # explicitly to keep our HTML stack in sync.
3731 if ($start =~ /\A\s*<table>/i)
3733 if ($html_element eq 'P')
3735 push (@lines2, &debug("</P>\n", __LINE__));
3741 print "$ERROR: eval of complex_format_map->{$tag}->[0] $complex_format_map->{$tag}->[0]: $@";
3744 $in_pre = 1 if $start =~ /<pre/;
3745 push(@lines, html_debug($start. ($in_pre ? '' : "\n"), __LINE__));
3748 elsif ($tag eq 'table')
3750 # anorland@hem2.passagen.se
3751 # if (/^\s*\@(|f|v|multi)table\s+\@(\w+)/) {
3752 if (/^\s*\@(|f|v|multi)table\s+\@(\w+)|(\{[^\}]*\})/)
3755 unshift(@tables, join($;, $table_type, $in_table));
3756 if ($table_type eq "multi")
3758 # APA: <table> implicitly ends paragraph, so let's
3759 # do it explicitly to keep our HTML stack in sync.
3760 if ($html_element eq 'P')
3762 push (@lines, &debug("</P>\n", __LINE__));
3765 # don't use borders -- gets confused by empty cells
3766 push(@lines, &debug("<TABLE>\n", __LINE__));
3767 &html_push_if('TABLE');
3771 # APA: <dl> implicitly ends paragraph, so let's
3772 # do it explicitly to keep our HTML stack in sync.
3773 if ($html_element eq 'P')
3775 push (@lines, &debug("</P>\n", __LINE__));
3778 push(@lines, &debug("<DL COMPACT>\n", __LINE__));
3779 &html_push_if('DL');
3781 push(@lines, &html_debug('', __LINE__));
3785 warn "$ERROR Bad table line: $_";
3789 elsif ($tag eq 'synindex' || $tag eq 'syncodeindex')
3791 if (/^\@$tag\s+(\w+)\s+(\w+)\s*$/)
3795 my $prefix_from = IndexName2Prefix($from);
3796 my $prefix_to = IndexName2Prefix($to);
3798 warn("$ERROR unknown from index name $from ind syn*index line: $_"), next
3799 unless $prefix_from;
3800 warn("$ERROR unknown to index name $to ind syn*index line: $_"), next
3803 if ($tag eq 'syncodeindex')
3805 $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1;
3809 $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1;
3814 warn "$ERROR Bad syn*index line: $_";
3818 elsif ($tag eq 'defindex' || $tag eq 'defcodeindex')
3820 if (/^\@$tag\s+(\w+)\s*$/)
3823 $index_properties->{$name}->{name} = $name;
3824 $index_properties->{$name}->{code} = 1 if $tag eq 'defcodeindex';
3828 warn "$ERROR Bad defindex line: $_";
3832 elsif (/^\@printindex/)
3834 # APA: HTML generated for @printindex contains <table>
3835 # which implicitly ends paragraph, so let's do it
3836 # explicitly to keep our HTML stack in sync.
3837 if ($html_element eq 'P')
3839 push(@lines, &debug("</P>\n", __LINE__));
3842 push (@lines, "<!--::${section}::-->$_");
3845 elsif ($tag eq 'sp')
3847 push(@lines, &debug("<P></P>\n", __LINE__));
3850 elsif ($tag eq 'center')
3852 push(@lines, &debug("<center>\n", __LINE__));
3855 elsif ($tag eq 'setref')
3858 &protect_html; # if setref contains '&' for instance
3859 if (/^\@$tag\s*{($NODERE)}\s*$/)
3862 $setref =~ s/\s+/ /go; # normalize
3864 $node2sec{$setref} = $name;
3865 $sec2node{$name} = $setref;
3866 $node2href{$setref} = "$docu_doc#$docid";
3870 warn "$ERROR Bad setref line: $_";
3874 elsif ($tag eq 'lowersections')
3877 while (($sec, $level) = each %sec2level)
3879 $sec2level{$sec} = $level + 1;
3883 elsif ($tag eq 'raisesections')
3886 while (($sec, $level) = each %sec2level)
3888 $sec2level{$sec} = $level - 1;
3892 elsif ($tag eq 'macro' || $tag eq 'rmacro')
3894 if (/^\@$tag\s*(\w+)\s*(.*)/)
3898 @args = split(/\s*,\s*/ , $1)
3899 if ($2 =~ /^\s*{(.*)}\s*/);
3901 $macros->{$name}->{Args} = \@args;
3902 $macros->{$name}->{Body} = '';
3903 while (($_ = &next_line) && $_ !~ /\@end $tag/)
3905 $macros->{$name}->{Body} .= $_;
3907 die "ERROR: No closing '\@end $tag' found for macro definition of '$name'\n"
3908 unless (/\@end $tag/);
3909 chomp $macros->{$name}->{Body};
3913 warn "$ERROR: Bad macro defintion $_"
3917 elsif ($tag eq 'unmacro')
3919 delete $macros->{$1} if (/^\@unmacro\s*(\w+)/);
3922 elsif ($tag eq 'documentlanguage')
3924 SetDocumentLanguage($1) if (!$T2H_LANG && /documentlanguage\s*(\w+)/);
3926 elsif (defined($def_map{$tag}))
3931 $tag = $def_map{$tag};
3936 elsif (defined($user_sub{$tag}))
3939 $sub = $user_sub{$tag};
3940 print "# user $tag = $sub, arg: $_" if $T2H_DEBUG & $DEBUG_USER;
3948 warn "$ERROR Bad user sub for $tag: $sub\n";
3952 if (defined($def_map{$tag}))
3957 # extra definition line
3965 while (/\{([^\{\}]*)\}/)
3967 # this is a {} construct
3968 ($before, $contents, $after) = ($`, $1, $');
3970 $contents =~ s/\s+/$;9/g;
3971 # restore $_ protecting {}
3972 $_ = "$before$;7$contents$;8$after";
3974 @args = split(/\s+/, &protect_html($_));
3977 s/$;9/ /g; # unprotect spaces
3981 $type = shift(@args);
3982 $type =~ s/^\{(.*)\}$/$1/;
3983 print "# def ($tag): {$type} ", join(', ', @args), "\n"
3984 if $T2H_DEBUG & $DEBUG_DEF;
3985 $type .= ':' if (!$T2H_DEF_TABLE); # it's nicer like this
3986 $name = shift(@args);
3987 $name =~ s/^\{(.*)\}$/$1/;
3990 $_ = &debug("<DT>", __LINE__) if (!$T2H_DEF_TABLE);
3991 $_ = &debug("", __LINE__) if ($T2H_DEF_TABLE);
3992 #$_ = &debug("<TR TEST1>\n", __LINE__) if ($T2H_DEF_TABLE);
3996 # APA: <dl> implicitly ends paragraph, so let's
3997 # do it explicitly to keep our HTML stack in sync.
3998 if ($html_element eq 'P')
4000 $_ = &debug("</P>\n", __LINE__);
4007 $_ .= &debug("<DL>\n<DT>", __LINE__) if (!$T2H_DEF_TABLE);
4008 $_ .= &debug("<TABLE WIDTH=\"100%\">\n", __LINE__) if ($T2H_DEF_TABLE);
4010 if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp')
4014 $_ .= "<TR>\n<TD ALIGN=\"LEFT\"><B>$name</B>\n";
4015 $_ .= " <I>@args</I>" if @args;
4017 $_ .= "<TD ALIGN=\"RIGHT\">";
4018 $_ .= "$type</TD>\n</TR>\n";
4022 $_ .= "<U>$type</U> <B>$name</B>";
4023 $_ .= " <I>@args</I>" if @args;
4026 elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr'
4027 || $tag eq 'deftypeop' || $tag eq 'defcv'
4031 $name = shift(@args);
4032 $name =~ s/^\{(.*)\}$/$1/;
4035 $_ .= "<TR>\n<TD ALIGN=\"LEFT\"><B>$name</B>";
4036 $_ .= " <I>@args</I>" if @args;
4038 $_ .= "<TD ALIGN=\"RIGHT\">";
4039 $_ .= "$type of $ftype</TD>\n</TR>\n";
4043 $_ .= "<U>$type</U> $ftype <B>$name</B>";
4044 $_ .= " <I>@args</I>" if @args;
4049 warn "$ERROR Unknown definition type: $tag\n";
4050 $_ .= "<U>$type</U> <B>$name</B>";
4051 $_ .= " <I>@args</I>" if @args;
4053 $_ .= &debug("\n<DD>", __LINE__) if (!$T2H_DEF_TABLE);
4054 ########$_ .= &debug("\n</TABLE TEST3>\n<TABLE WIDTH=\"95%\">\n", __LINE__) if ($T2H_DEF_TABLE);
4055 $name = &unprotect_html($name);
4056 if ($tag eq 'deffn' || $tag eq 'deftypefn')
4058 EnterIndexEntry('f', $name, $docu_doc, $section, \@lines);
4059 # unshift(@input_spool, "\@findex $name\n");
4061 elsif ($tag eq 'defop')
4063 EnterIndexEntry('f', "$name on $ftype", $docu_doc, $section, \@lines);
4064 # unshift(@input_spool, "\@findex $name on $ftype\n");
4066 elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv')
4068 EnterIndexEntry('v', $name, $docu_doc, $section, \@lines);
4069 # unshift(@input_spool, "\@vindex $name\n");
4073 EnterIndexEntry('t', $name, $docu_doc, $section, \@lines);
4074 # unshift(@input_spool, "\@tindex $name\n");
4081 if ($format_map{$end_tag})
4083 $in_pre = 0 if $format_map{$end_tag} eq 'PRE';
4084 $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ;
4088 push(@lines, &debug("</$format_map{$end_tag}>\n", __LINE__));
4089 push(@lines, &html_debug('', __LINE__));
4091 elsif (exists $complex_format_map->{$end_tag})
4093 my $end = eval $complex_format_map->{$end_tag}->[1];
4096 print "$ERROR: eval of complex_format_map->{$end_tag}->[1] $complex_format_map->{$end_tag}->[0]: $@";
4099 $in_pre = 0 if $end =~ m|</pre>|;
4100 push(@lines, html_debug($end, __LINE__));
4102 elsif ($end_tag =~ /^(|f|v|multi)table$/)
4106 warn "$ERROR \@end $end_tag without \@*table\n";
4110 ($table_type, $in_table) = split($;, shift(@tables));
4111 unless ($1 eq $table_type)
4113 warn "$ERROR \@end $end_tag without matching \@$end_tag\n";
4116 if ($table_type eq "multi")
4118 push(@lines, "</TR></TABLE>\n");
4123 # APA: </dl> implicitly ends paragraph, so let's
4124 # do it explicitly to keep our HTML stack in sync.
4125 if ($html_element eq 'P')
4127 push(@lines, &debug("</P>\n", __LINE__));
4130 push(@lines, "</DL>\n");
4136 ($table_type, $in_table) = split($;, $tables[0]);
4143 elsif (defined($def_map{$end_tag}))
4145 # APA: </dl> and </table> implicitly ends paragraph,
4146 # so let's do it explicitly to keep our HTML stack in
4148 if ($html_element eq 'P')
4150 push(@lines, &debug("</P>\n", __LINE__));
4153 push(@lines, &debug("</DL>\n", __LINE__)) if (!$T2H_DEF_TABLE);
4154 push(@lines, &debug("</TABLE>\n", __LINE__)) if ($T2H_DEF_TABLE);
4156 elsif ($end_tag eq 'menu')
4159 push(@lines, $_); # must keep it for pass 2
4163 #############################################################
4165 while (/\@anchor\s*\{(.*?)\}/)
4169 $anchor = &normalise_node($anchor);
4170 push @lines, &html_debug("<A NAME=\"".protect_html($anchor)."\"></A>\n");
4171 $node2href{$anchor} = "$docu_doc#$anchor";
4172 next INPUT_LINE if $_ =~ /^\s*$/;
4174 #############################################################
4175 # index entry generation, after value substitutions
4176 if (/^\@(\w+?)index\s+/)
4178 EnterIndexEntry($1, $', $docu_doc, $section, \@lines);
4182 # protect texi and HTML things
4184 $_ = &protect_html($_) unless $dont_html;
4186 # substitution (unsupported things)
4188 s/\@noindent\s+//go;
4190 # other substitutions
4191 &simple_substitutions;
4192 s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4
4194 # analyze the tag again
4198 if (defined($sec2level{$tag}) && $sec2level{$tag} > 0)
4200 if (/^\@$tag\s+(.+)$/)
4203 $name = &normalise_node($name);
4204 $level = $sec2level{$tag};
4206 $first_index_chapter = $name
4207 if ($level == 1 && !$first_index_chapter &&
4209 if ($in_top && /heading/)
4211 $T2H_HAS_TOP_HEADING = 1;
4212 $_ = &debug("<H$level>$name</H$level>\n", __LINE__);
4213 &html_push_if('body');
4214 print "# top heading, section $name, level $level\n"
4215 if $T2H_DEBUG & $DEBUG_TOC;
4219 unless (/^\@\w*heading/)
4221 unless (/^\@unnumbered/)
4223 my $number = &update_sec_num($tag, $level);
4224 $name = $number . ' ' . $name if $T2H_NUMBER_SECTIONS;
4225 $sec2number{$name} = $number;
4226 $number2sec{$number} = $name;
4228 if (defined($toplevel))
4230 push @lines, ($level==$toplevel ? $CHAPTEREND : $SECTIONEND);
4234 # first time we see a "section"
4235 unless ($level == 1)
4237 warn "$WARN The first section found is not of level 1: $_";
4241 push(@sections, $name);
4242 next_doc() if (defined $T2H_SPLIT
4244 ($T2H_SPLIT eq 'section'
4246 $T2H_SPLIT && $level == $toplevel));
4249 $docid = "SEC$sec_num";
4250 $tocid = (/^\@\w*heading/ ? undef : "TOC$sec_num");
4251 # check biblio and glossary
4252 $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i);
4253 $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i);
4257 warn "$ERROR Duplicate node found: $node\n"
4258 if ($node2sec{$node});
4262 $name .= ' ' while ($node2sec{$name});
4265 $name .= ' ' while ($sec2node{$name});
4267 $node2sec{$node} = $name;
4268 $sec2node{$name} = $node;
4269 $sec2seccount{$name} = $sec_num;
4270 $seccount2sec{$sec_num} = $name;
4271 $node2href{$node} = "$docu_doc#$docid";
4272 $node2next{$node} = $node_next;
4273 $node2prev{$node} = $node_prev;
4274 $node2up{$node} = $node_up;
4275 print "# node $node, section $name, level $level\n"
4276 if $T2H_DEBUG & $DEBUG_TOC;
4285 while ($level > $curlevel)
4288 push(@toc_lines, "<$toc_indent>\n");
4290 while ($level < $curlevel)
4293 push(@toc_lines, "</$toc_indent>\n");
4295 $_ = &t2h_anchor($tocid, "$docu_doc#$docid", $name, 1);
4296 $_ = &substitute_style($_);
4297 push(@stoc_lines, "$_<BR>\n") if ($level == 1);
4298 if ($T2H_NUMBER_SECTIONS)
4300 push(@toc_lines, $_ . "<BR>\n")
4304 push(@toc_lines, "<LI>" . $_ ."</LI>");
4309 push(@lines, &html_debug("<A NAME=\"".protect_html($docid)."\"></A>\n",
4313 push(@lines, &html_debug('', __LINE__));
4315 $_ = "<H$level> $name </H$level>\n<!--docid::${docid}::-->\n";
4316 $_ = &debug($_, __LINE__);
4317 push(@lines, &html_debug('', __LINE__));
4320 foreach $line (split(/\n+/, $_))
4322 push(@lines, "$line\n");
4328 warn "$ERROR Bad section line: $_";
4334 $value{$1} = Unprotect_texi($2), next if /^\@set\s+($VARRE)\s+(.*)$/o;
4335 delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o;
4337 $value{'_shorttitle'} = Unprotect_texi($1), next if /^\@shorttitle\s+(.*)$/;
4338 $value{'_setfilename'} = Unprotect_texi($1), next if /^\@setfilename\s+(.*)$/;
4339 $value{'_settitle'} = Unprotect_texi($1), next if /^\@settitle\s+(.*)$/;
4340 $value{'_author'} .= Unprotect_texi($1)."\n", next if /^\@author\s+(.*)$/;
4341 $value{'_subtitle'} .= Unprotect_texi($1)."\n", next if /^\@subtitle\s+(.*)$/;
4342 $value{'_title'} .= Unprotect_texi($1)."\n", next if /^\@title\s+(.*)$/;
4345 if (/^\s*\@itemx?\s+/)
4349 if ($in_bibliography && $use_bibliography)
4351 if ($what =~ /^$BIBRE$/o)
4353 $id = 'BIB' . ++$bib_num;
4354 $bib2href{$what} = "$docu_doc#$id";
4355 print "# found bibliography for '$what' id $id\n"
4356 if $T2H_DEBUG & $DEBUG_BIB;
4357 $what = &t2h_anchor($id, '', $what);
4360 elsif ($in_glossary && $T2H_USE_GLOSSARY)
4362 $id = 'GLOSS' . ++$gloss_num;
4364 $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
4365 $gloss2href{$entry} = "$docu_doc#$id";
4366 print "# found glossary for '$entry' id $id\n"
4367 if $T2H_DEBUG & $DEBUG_GLOSS;
4368 $what = &t2h_anchor($id, '', $what);
4370 elsif ($in_table && ($table_type eq 'f' || $table_type eq 'v'))
4372 # APA: Insert <dt> before index anchor, if
4373 # necessary to produce valid HTML. Close open
4375 if ($html_element ne 'DT')
4377 # APA: End paragraph, if any.
4378 if ($html_element eq 'P')
4380 push(@lines, &debug("</P>\n", __LINE__));
4383 push(@lines, &debug("<DT>", __LINE__));
4386 EnterIndexEntry($table_type, $what, $docu_doc, $section, \@lines);
4388 # APA: End paragraph, if any.
4389 if ($html_element eq 'P')
4391 push(@lines, &debug("</P>\n", __LINE__));
4394 if ($html_element =~ m|^D[DLT]$|)
4396 unless ($html_element eq 'DT')
4398 push(@lines, &debug("<DT>", __LINE__));
4400 if ($things_map{$in_table} && !$what)
4402 # special case to allow @table @bullet for instance
4403 push(@lines, &debug("$things_map{$in_table}\n", __LINE__));
4407 push(@lines, &debug("\@$in_table\{$what\}\n", __LINE__));
4409 push(@lines, "<DD>");
4410 &html_push('DD') unless $html_element eq 'DD';
4412 { # add also an index
4413 unshift(@input_spool, "\@${table_type}index $what\n");
4416 elsif ($html_element eq 'TABLE')
4418 push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
4421 elsif ($html_element eq 'TR')
4423 push(@lines, &debug("</TR>\n", __LINE__));
4424 push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
4428 push(@lines, &debug("<LI>$what\n", __LINE__));
4429 &html_push('LI') unless $html_element eq 'LI';
4431 push(@lines, &html_debug('', __LINE__));
4434 push(@lines, &debug("$deferred_ref\n", __LINE__));
4439 elsif (/^\@tab\s+(.*)$/)
4441 push(@lines, "<TD>$1</TD>\n");
4446 # paragraph separator
4447 if ($_ eq "\n" && ! $in_pre)
4449 next if $#lines >= 0 && $lines[$#lines] eq "\n";
4450 if ($html_element eq 'P')
4452 push (@lines, &debug("</P>\n<P>\n", __LINE__));
4456 # push(@lines, "<P></P>\n");
4457 # $_ = &debug("<P></P>\n", __LINE__);
4459 elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE' || $html_element eq 'DD' || $html_element eq 'LI')
4462 push(@lines, &debug("<P>\n", __LINE__));
4466 push(@lines, $_) unless $in_titlepage;
4467 push(@lines, &debug("</center>\n", __LINE__)) if ($tag eq 'center');
4471 while ($level < $curlevel)
4474 push(@toc_lines, "</$toc_indent>\n");
4476 print "# end of pass 1\n" if $T2H_VERBOSE;
4479 #+++############################################################################
4481 # Stuff related to Index generation #
4483 #---############################################################################
4489 my $docu_doc = shift;
4490 my $section = shift;
4494 warn "$ERROR Undefined index command: $_", next
4495 unless (exists ($index_properties->{$prefix}));
4500 $_ = &protect_html($_);
4501 my $html_key = substitute_style($_);
4503 $key = remove_style($key);
4504 $key = remove_things($key);
4508 while (exists $index->{$prefix}->{$key})
4513 if ($lines->[$#lines] =~ /^<!--docid::(.+)::-->$/)
4519 $id = 'IDX' . ++$idx_num;
4520 push(@$lines, &t2h_anchor($id, '', $T2H_INVISIBLE_MARK, !$in_pre));
4522 $index->{$prefix}->{$key}->{html_key} = $html_key;
4523 $index->{$prefix}->{$key}->{section} = $section;
4524 $index->{$prefix}->{$key}->{href} = "$docu_doc#$id";
4525 print "# found ${prefix}index for '$key' with id $id\n"
4526 if $T2H_DEBUG & $DEBUG_INDEX;
4529 sub IndexName2Prefix
4534 for $prefix (keys %$index_properties)
4536 return $prefix if ($index_properties->{$prefix}->{name} eq $name);
4545 my ($entries, $prefix, $key) = ({});
4546 for $prefix (keys %$normal)
4548 for $key (keys %{$index->{$prefix}})
4550 $entries->{$key} = {%{$index->{$prefix}->{$key}}};
4556 for $prefix (keys %$code)
4558 unless (exists $normal->{$prefix})
4560 for $key (keys %{$index->{$prefix}})
4562 $entries->{$key} = {%{$index->{$prefix}->{$key}}};
4563 $entries->{$key}->{html_key} = "<CODE>$entries->{$key}->{html_key}</CODE>";
4573 if ($a =~ /^[A-Za-z]/)
4575 if ($b =~ /^[A-Za-z]/)
4577 return lc($a) cmp lc($b);
4584 elsif ($b =~ /^[A-Za-z]/)
4590 return lc($a) cmp lc($b);
4596 my $entries = shift;
4597 my (@Letters, $key);
4598 my ($EntriesByLetter, $Pages, $page) = ({}, [], {});
4599 my @keys = sort byAlpha keys %$entries;
4603 push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key};
4605 @Letters = sort byAlpha keys %$EntriesByLetter;
4606 $T2H_SPLIT_INDEX = 0 unless $T2H_SPLIT;
4608 unless ($T2H_SPLIT_INDEX)
4610 $page->{First} = $Letters[0];
4611 $page->{Last} = $Letters[$#Letters];
4612 $page->{Letters} = \@Letters;
4613 $page->{EntriesByLetter} = $EntriesByLetter;
4614 push @$Pages, $page;
4618 if ($T2H_SPLIT_INDEX =~ /^\d+$/)
4621 my ($prev_letter, $letter);
4622 for $letter (@Letters)
4624 if ($i > $T2H_SPLIT_INDEX)
4626 $page->{Last} = $prev_letter;
4627 push @$Pages, $page;
4633 $page->{Letters} = [];
4634 $page->{EntriesByLetter} = {};
4635 $page->{First} = $letter;
4637 push @{$page->{Letters}}, $letter;
4638 $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}];
4639 $i += scalar(@{$EntriesByLetter->{$letter}});
4640 $prev_letter = $letter;
4642 $page->{Last} = $Letters[$#Letters];
4643 push @$Pages, $page;
4650 my $first_page = shift;
4653 my ($page, $letter, $summary, $i, $l1, $l2, $l);
4656 $summary = '<table><tr><th valign=top>Jump to: </th><td>';
4657 for $page ($first_page, @$Pages)
4659 for $letter (@{$page->{Letters}})
4661 $l = t2h_anchor('', "$page->{href}#${name}_$letter", "<b>$letter</b>",
4662 0, 'style="text-decoration:none"') . "\n \n";
4663 if ($letter =~ /^[A-Za-z]/)
4673 $summary .= $l1 . "<BR>\n" if ($l1);
4674 $summary .= $l2 . '</td></tr></table>';
4681 my $summary = shift;
4685 push @$lines, $summary;
4687 push @$lines , <<EOT;
4690 <TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
4691 <TR><TD COLSPAN=3> <HR></TD></TR>
4694 for $letter (@{$page->{Letters}})
4696 push @$lines, "<TR><TH><A NAME=\"".protect_html("${name}_$letter")."\"></A>".protect_html($letter)."</TH><TD></TD><TD></TD></TR>\n";
4697 for $entry (@{$page->{EntriesByLetter}->{$letter}})
4700 "<TR><TD></TD><TD valign=top>" .
4701 t2h_anchor('', $entry->{href}, $entry->{html_key}) .
4702 "</TD><TD valign=top>" .
4703 t2h_anchor('', sec_href($entry->{section}), clean_name($entry->{section})) .
4706 push @$lines, "<TR><TD COLSPAN=3> <HR></TD></TR>\n";
4708 push @$lines, "</TABLE><P></P>";
4709 push @$lines, $summary;
4716 my $section = shift;
4717 $section = 'Top' unless $section;
4718 my $prefix = IndexName2Prefix($name);
4720 warn ("$ERROR printindex: bad index name: $name"), return
4723 if ($index_properties->{$prefix}->{code})
4725 $index_properties->{$prefix}->{from_code}->{$prefix} = 1;
4729 $index_properties->{$prefix}->{from}->{$prefix}= 1;
4732 my $Entries = GetIndexEntries($index_properties->{$prefix}->{from},
4733 $index_properties->{$prefix}->{from_code});
4734 return unless %$Entries;
4736 if ($T2H_IDX_SUMMARY)
4739 open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx")
4740 || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n";
4741 print "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE;
4743 for $key (sort keys %$Entries)
4745 print FHIDX "$key\t$Entries->{$key}->{href}\n";
4749 my $Pages = GetIndexPages($Entries);
4751 my $first_page = shift @$Pages;
4752 my $sec_name = $section;
4754 # remove section number
4755 $sec_name =~ s/.*? // if $sec_name =~ /^([A-Z]|\d+)\./;
4757 ($first_page->{href} = sec_href($section)) =~ s/\#.*$//;
4758 $node2prev{$section} = Sec2PrevNode($node2sec{$section});
4759 $prev_node = $section;
4760 # Update tree structure of document
4766 while (@sections && $sections[$#sections] ne $section)
4768 unshift @after, pop @sections;
4773 my $node = ($page->{First} ne $page->{Last} ?
4774 "$sec_name: $page->{First} -- $page->{Last}" :
4775 "$sec_name: $page->{First}");
4776 push @sections, $node;
4777 $node2sec{$node} = $node;
4778 $sec2node{$node} = $node;
4779 $node2up{$node} = $section;
4780 $page->{href} = next_doc();
4781 $page->{name} = $node;
4782 $node2href{$node} = $page->{href};
4785 $node2next{$prev_node} = $node;
4786 $node2prev{$node} = $prev_node;
4790 # Full circle - Next on last index page goes to Top
4791 $node2next{$prev_node} = "Top";
4792 push @sections, @after;
4795 my $summary = GetIndexSummary($first_page, $Pages, $name);
4796 PrintIndexPage($lines, $summary, $first_page, $name);
4799 push @$lines, ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
4800 push @$lines, "<H2 ALIGN=\"Left\">$page->{name}</H2>\n";
4801 PrintIndexPage($lines, $summary, $page, $name);
4806 #+++############################################################################
4808 # Pass 2/3: handle style, menu, index, cross-reference #
4810 #---############################################################################
4815 @lines2 = (); # whole document (2nd pass)
4816 @lines3 = (); # whole document (3rd pass)
4817 my $in_menu = 0; # am I inside a menu
4818 my $in_menu_listing;
4824 # special case (protected sections)
4826 if (/^$PROTECTTAG/o)
4837 $in_menu_listing = 1;
4838 # APA: <table> implicitly ends paragraph, so let's do it
4839 # explicitly to keep our HTML stack in sync.
4840 if ($html_element eq 'P')
4842 push (@lines2, &debug("</P>\n", __LINE__));
4845 push(@lines2, &debug("<TABLE BORDER=\"0\" CELLSPACING=\"0\">\n", __LINE__));
4848 if (/^\@end\s+menu\b/)
4850 if ($in_menu_listing)
4852 push(@lines2, &debug("</TABLE>\n", __LINE__));
4855 $in_menu_listing = 0;
4860 my ($node, $name, $descr);
4861 if (/^\*\s+($NODERE)::/o)
4866 elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/)
4874 warn "$ERROR Bad menu line: $_";
4878 if ($in_menu_listing)
4880 # APA: Handle menu comment lines. These don't end the menu!
4881 # $in_menu_listing = 0;
4882 push(@lines2,&debug('<TR><TH COLSPAN="3" ALIGN="left" VALIGN="TOP">' . $_ . '</TH></TR>
4888 if (! $in_menu_listing)
4890 $in_menu_listing = 1;
4891 push(@lines2, &debug("<TABLE BORDER=0 CELLSPACING=0>\n", __LINE__));
4893 # look for continuation
4894 while ($lines[0] =~ /^\s+\w+/)
4896 $descr .= shift(@lines);
4898 &menu_entry($node, $name, $descr);
4905 PrintIndex(\@lines2, $2, $1), next
4906 if (/^<!--::(.*)::-->\@printindex\s+(\w+)/);
4908 # simple style substitutions
4910 $_ = &substitute_style($_);
4914 while (/\@(x|px|info|)ref{([^{}]+)(}?)/)
4916 # note: Texinfo may accept other characters
4917 ($type, $nodes, $full) = ($1, $2, $3);
4918 ($before, $after) = ($`, $');
4919 if (! $full && $after)
4921 warn "$ERROR Bad xref (no ending } on line): $_";
4922 $_ = "$before$;0${type}ref\{$nodes$after";
4927 $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} ";
4929 elsif ($type eq 'px')
4931 $type = "$T2H_WORDS->{$T2H_LANG}->{'see'} ";
4933 elsif ($type eq 'info')
4935 $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} Info";
4943 $next = shift(@lines);
4944 $next = &substitute_style($next);
4945 chop($nodes); # remove final newline
4947 { # split on 2 lines
4954 $next = shift(@lines);
4955 $next = &substitute_style($next);
4958 { # split on 3 lines
4964 warn "$ERROR Bad xref (no ending }): $_";
4965 $_ = "$before$;0xref\{$nodes$after";
4966 unshift(@lines, $next);
4971 $nodes =~ s/\s+/ /go; # remove useless spaces
4972 @args = split(/\s*,\s*/, $nodes);
4973 $node = $args[0]; # the node is always the first arg
4974 $node = &normalise_node($node);
4975 $sec = $args[2] || $args[1] || $node2sec{$node};
4976 $href = $node2href{$node};
4978 { # reference to another manual
4979 $sec = $args[2] || $node;
4980 $man = $args[4] || $args[3];
4981 $_ = "${before}${type}$T2H_WORDS->{$T2H_LANG}->{'section'} `$sec' in \@cite{$man}$after";
4983 elsif ($type =~ /Info/)
4985 warn "$ERROR Wrong number of arguments: $_" unless @args == 3;
4986 ($nn, $_, $in) = @args;
4987 $_ = "${before}${type} file `$in', node `$nn'$after";
4989 elsif ($sec && $href && ! $T2H_SHORT_REF)
4991 $_ = "${before}${type}";
4992 $_ .= "$T2H_WORDS->{$T2H_LANG}->{'section'} " if $type;
4993 $_ .= &t2h_anchor('', $href, $sec) . $after;
4997 $_ = "${before}${type} " .
4998 &t2h_anchor('', $href, $args[2] || $args[1] || $node) .
5003 warn "$ERROR Undefined node ($node): $_";
5004 $_ = "$before$;0xref{$nodes}$after";
5009 s[\@image\s*{(.+?)}]
5011 my @args = split (/\s*,\s*/, $1);
5012 my $base = $args[0];
5014 LocateIncludeFile("$base.png") ||
5015 LocateIncludeFile("$base.jpg") ||
5016 LocateIncludeFile("$base.gif");
5017 warn "$ERROR no image file for $base: $_" unless ($image && -e $image);
5018 ($T2H_CENTER_IMAGE ?
5019 "<CENTER><IMG SRC=\"$image\" ALT=\"$base\"></CENTER>" :
5020 "<IMG SRC=\"$image\" ALT=\"$base\">");
5024 # try to guess bibliography references or glossary terms
5026 unless (/^<H\d><A NAME=\"SEC\d/)
5028 if ($use_bibliography)
5033 ($pre, $what, $post) = ($`, $&, $');
5034 $href = $bib2href{$what};
5035 if (defined($href) && $post !~ /^[^<]*<\/A>/)
5037 $done .= $pre . &t2h_anchor('', $href, $what);
5041 $done .= "$pre$what";
5047 if ($T2H_USE_GLOSSARY)
5052 ($pre, $what, $post) = ($`, $&, $');
5054 $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
5055 $href = $gloss2href{$entry};
5056 if (defined($href) && $post !~ /^[^<]*<\/A>/)
5058 $done .= $pre . &t2h_anchor('', $href, $what);
5062 $done .= "$pre$what";
5072 print "# end of pass 2\n" if $T2H_VERBOSE;
5078 # split style substitutions
5083 $_ = shift(@lines2);
5085 # special case (protected sections)
5087 if (/^$PROTECTTAG/o)
5093 # split style substitutions
5101 ($before, $style, $after) = ($`, $1, $');
5102 if (defined($style_map{$style}))
5120 $_ = shift(@lines2);
5125 die "* Bad syntax (\@$style) after: $before\n";
5129 $text = &apply_style($style, $text);
5130 $_ = "$before$text$after";
5138 print "# end of pass 3\n" if $T2H_VERBOSE;
5141 #+++############################################################################
5143 # Pass 4: foot notes, final cleanup #
5145 #---############################################################################
5150 @foot_lines = (); # footnotes
5151 @doc_lines = (); # final document
5152 $end_of_para = 0; # true if last line is <P>
5154 # APA: There aint no paragraph before the first one!
5155 # This fixes a HTML validation error.
5156 $lines3[0] =~ s|^</P>\n|\n|;
5159 $_ = shift(@lines3);
5161 # special case (protected sections)
5163 if (/^$PROTECTTAG/o)
5165 push(@doc_lines, $_);
5172 while (/\@footnote([^\{\s]+)\{/)
5174 ($before, $d, $after) = ($`, $1, $');
5191 $_ = shift(@lines3);
5196 die "* Bad syntax (\@footnote) after: $before\n";
5201 $docid = "DOCF$foot_num";
5202 $footid = "FOOT$foot_num";
5203 $foot = "($foot_num)";
5204 push(@foot_lines, "<H3>" . &t2h_anchor($footid, "$d#$docid", $foot) . "</H3>\n");
5205 $text = "<P>$text" unless $text =~ /^\s*<P>/;
5206 push(@foot_lines, "$text\n");
5207 $_ = $before . &t2h_anchor($docid, "$docu_foot#$footid", $foot) . $after;
5211 # remove unnecessary <P>
5215 next if $end_of_para++;
5222 push(@doc_lines, $_);
5225 print "# end of pass 4\n" if $T2H_VERBOSE;
5228 #+++############################################################################
5230 # Pass 5: print things #
5232 #---############################################################################
5235 $T2H_L2H = &l2h_FinishToLatex if ($T2H_L2H);
5236 $T2H_L2H = &l2h_ToHtml if ($T2H_L2H);
5237 $T2H_L2H = &l2h_InitFromHtml if ($T2H_L2H);
5241 # fix node2up, node2prev, node2next, if desired
5242 if ($has_top_command)
5244 for $section (keys %sec2number)
5246 $node2href{$sec2node{$section}} =~ /SEC(\d+)$/;
5247 $node = $sec2node{$section};
5248 $node2up{$node} = Sec2UpNode($section) unless $node2up{$node};
5249 $node2prev{$node} = Sec2PrevNode($section) unless $node2prev{$node};
5250 $node2next{$node} = Sec2NextNode($section) unless $node2next{$node};
5254 # prepare %T2H_THISDOC
5255 $T2H_THISDOC{fulltitle} = $value{'_title'} || $value{'_settitle'} || "Untitled Document";
5256 $T2H_THISDOC{title} = $value{'_settitle'} || $T2H_THISDOC{fulltitle};
5257 $T2H_THISDOC{author} = $value{'_author'};
5258 $T2H_THISDOC{subtitle} = $value{'_subtitle'};
5259 $T2H_THISDOC{shorttitle} = $value{'_shorttitle'};
5260 for $key (keys %T2H_THISDOC)
5262 $_ = &substitute_style($T2H_THISDOC{$key});
5265 $T2H_THISDOC{$key} = $_;
5268 # if no sections, then simply print document as is
5271 print "# Writing content into $docu_top_file \n" if $T2H_VERBOSE;
5272 open(FILE, "> $docu_top_file")
5273 || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
5275 &$T2H_print_page_head(\*FILE);
5276 $T2H_THIS_SECTION = \@doc_lines;
5277 t2h_print_lines(\*FILE);
5278 &$T2H_print_foot_navigation(\*FILE);
5279 &$T2H_print_page_foot(\*FILE);
5284 # initialize $T2H_HREF, $T2H_NAME
5287 'First' , sec_href($sections[0]),
5288 'Last', sec_href($sections[$#sections]),
5289 'About', $docu_about. '#SEC_About',
5292 # prepare TOC, OVERVIEW, TOP
5293 $T2H_TOC = \@toc_lines;
5294 $T2H_OVERVIEW = \@stoc_lines;
5299 $_ = shift @doc_lines;
5303 $T2H_HREF{'Top'} = $docu_top . '#SEC_Top';
5307 $T2H_HREF{'Top'} = $T2H_HREF{First};
5310 $node2href{Top} = $T2H_HREF{Top};
5311 $T2H_HREF{Contents} = $docu_toc.'#SEC_Contents' if @toc_lines;
5312 $T2H_HREF{Overview} = $docu_stoc.'#SEC_OVERVIEW' if @stoc_lines;
5315 if ($T2H_INDEX_CHAPTER)
5317 $T2H_HREF{Index} = $node2href{normalise_node($T2H_INDEX_CHAPTER)};
5318 warn "$ERROR T2H_INDEX_CHAPTER '$T2H_INDEX_CHAPTER' not found\n"
5319 unless $T2H_HREF{Index};
5321 if (! $T2H_HREF{Index} && $first_index_chapter)
5323 $T2H_INDEX_CHAPTER = $first_index_chapter;
5324 $T2H_HREF{Index} = $node2href{$T2H_INDEX_CHAPTER};
5327 print "# Using '" . clean_name($T2H_INDEX_CHAPTER) . "' as index page\n"
5328 if ($T2H_VERBOSE && $T2H_HREF{Index});
5332 'First', clean_name($sec2node{$sections[0]}),
5333 'Last', clean_name($sec2node{$sections[$#sections]}),
5334 'About', $T2H_WORDS->{$T2H_LANG}->{'About_Title'},
5335 'Contents', $T2H_WORDS->{$T2H_LANG}->{'ToC_Title'},
5336 'Overview', $T2H_WORDS->{$T2H_LANG}->{'Overview_Title'},
5337 'Index' , clean_name($T2H_INDEX_CHAPTER),
5338 'Top', clean_name($T2H_TOP_HEADING || $T2H_THISDOC{'title'} || $T2H_THISDOC{'shorttitle'}),
5341 #############################################################################
5342 # print frame and frame toc file
5346 open(FILE, "> $docu_frame_file")
5347 || die "$ERROR: Can't open $docu_frame_file for writing: $!\n";
5348 print "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
5349 &$T2H_print_frame(\*FILE);
5352 open(FILE, "> $docu_toc_frame_file")
5353 || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n";
5354 print "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
5355 &$T2H_print_toc_frame(\*FILE);
5360 #############################################################################
5361 # Monolithic beginning.
5365 open(FILE, "> $docu_doc_file")
5366 || die "$ERROR: Can't open $docu_doc_file for writing: $!\n";
5367 &$T2H_print_page_head(\*FILE);
5371 #############################################################################
5378 open(FILE, "> $docu_top_file")
5379 || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
5382 print "# Creating Top in $docu_top_file ...\n" if $T2H_VERBOSE;
5383 $T2H_THIS_SECTION = $T2H_TOP;
5384 $T2H_HREF{This} = $T2H_HREF{Top};
5385 $T2H_NAME{This} = $T2H_NAME{Top};
5386 &$T2H_print_Top(\*FILE);
5391 || die "$ERROR: Error occurred when closing $docu_top_file: $!\n";
5396 #############################################################################
5399 $T2H_NODE{Forward} = $sec2node{$sections[0]};
5400 $T2H_NAME{Forward} = &clean_name($sec2node{$sections[0]});
5401 $T2H_HREF{Forward} = sec_href($sections[0]);
5402 $T2H_NODE{This} = 'Top';
5403 $T2H_NAME{This} = $T2H_NAME{Top};
5404 $T2H_HREF{This} = $T2H_HREF{Top};
5407 print "# writing " . scalar(@sections) .
5408 " sections into $docu_rdir$docu_name"."_[1..$doc_num].$docu_ext"
5410 $previous = ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
5416 print "# writing " . scalar(@sections) . " sections in $docu_top_file ..."
5423 # loop through sections
5424 while ($section = shift(@sections))
5426 if ($T2H_SPLIT && ($T2H_SPLIT eq 'section' || $previous eq $CHAPTEREND))
5430 #close previous page
5431 &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
5432 &$T2H_print_page_foot($FH);
5437 $T2H_NAME{Back} = $T2H_NAME{This};
5438 $T2H_HREF{Back} = $T2H_HREF{This};
5439 $T2H_NODE{Back} = $T2H_NODE{This};
5440 $T2H_NAME{This} = $T2H_NAME{Forward};
5441 $T2H_HREF{This} = $T2H_HREF{Forward};
5442 $T2H_NODE{This} = $T2H_NODE{Forward};
5445 $T2H_NODE{Forward} = $sec2node{$sections[0]};
5446 $T2H_NAME{Forward} = &clean_name($T2H_NODE{Forward});
5447 $T2H_HREF{Forward} = sec_href($sections[0]);
5451 delete $T2H_HREF{Forward};
5452 delete $T2H_NODE{Forward};
5453 delete $T2H_NAME{Forward};
5456 $node = $node2up{$T2H_NODE{This}};
5457 $T2H_HREF{Up} = $node2href{$node};
5458 if ($T2H_HREF{Up} eq $T2H_HREF{This} || ! $T2H_HREF{Up})
5460 $T2H_NAME{Up} = $T2H_NAME{Top};
5461 $T2H_HREF{Up} = $T2H_HREF{Top};
5462 $T2H_NODE{Up} = 'Up';
5466 $T2H_NAME{Up} = &clean_name($node);
5467 $T2H_NODE{Up} = $node;
5470 $node = $node2prev{$T2H_NODE{This}};
5471 $T2H_NAME{Prev} = &clean_name($node);
5472 $T2H_HREF{Prev} = $node2href{$node};
5473 $T2H_NODE{Prev} = $node;
5475 $node = Node2FastBack($T2H_NODE{This});
5476 $T2H_NAME{FastBack} = &clean_name($node);
5477 $T2H_HREF{FastBack} = $node2href{$node};
5478 $T2H_NODE{FastBack} = $node;
5480 $node = $node2next{$T2H_NODE{This}};
5481 $T2H_NAME{Next} = &clean_name($node);
5482 $T2H_HREF{Next} = $node2href{$node};
5483 $T2H_NODE{Next} = $node;
5485 $node = Node2FastForward($T2H_NODE{This});
5486 $T2H_NAME{FastForward} = &clean_name($node);
5487 $T2H_HREF{FastForward} = $node2href{$node};
5488 $T2H_NODE{FastForward} = $node;
5492 my $file = $T2H_HREF{This};
5494 open(FILE, "> $docu_rdir$file") ||
5495 die "$ERROR: Can't open $docu_rdir$file for writing: $!\n";
5497 &$T2H_print_page_head($FH);
5498 t2h_print_label($FH);
5499 &$T2H_print_chapter_header($FH) if $T2H_SPLIT eq 'chapter';
5503 t2h_print_label($FH);
5506 $T2H_THIS_SECTION = [];
5509 $_ = shift(@doc_lines);
5510 last if ($_ eq $SECTIONEND || $_ eq $CHAPTEREND);
5511 push(@$T2H_THIS_SECTION, $_);
5514 &$T2H_print_section($FH);
5519 print "." if $counter =~ /00$/;
5524 &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
5525 &$T2H_print_page_foot($FH);
5528 print "\n" if $T2H_VERBOSE;
5530 #############################################################################
5531 # Print ToC, Overview, Footnotes
5533 delete $T2H_HREF{Prev};
5534 delete $T2H_HREF{Next};
5535 delete $T2H_HREF{Back};
5536 delete $T2H_HREF{Forward};
5537 delete $T2H_HREF{Up};
5541 print "# writing Footnotes in $docu_foot_file...\n" if $T2H_VERBOSE;
5542 open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n"
5544 $T2H_HREF{This} = $docu_foot;
5545 $T2H_NAME{This} = $T2H_WORDS->{$T2H_LANG}->{'Footnotes_Title'};
5546 $T2H_THIS_SECTION = \@foot_lines;
5547 &$T2H_print_Footnotes(\*FILE);
5548 close(FILE) if $T2H_SPLIT;
5553 print "# writing Toc in $docu_toc_file...\n" if $T2H_VERBOSE;
5554 open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n"
5556 $T2H_HREF{This} = $T2H_HREF{Contents};
5557 $T2H_NAME{This} = $T2H_NAME{Contents};
5558 $T2H_THIS_SECTION = \@toc_lines;
5559 &$T2H_print_Toc(\*FILE);
5560 close(FILE) if $T2H_SPLIT;
5565 print "# writing Overview in $docu_stoc_file...\n" if $T2H_VERBOSE;
5566 open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n"
5568 $T2H_HREF{This} = $T2H_HREF{Overview};
5569 $T2H_NAME{This} = $T2H_NAME{Overview};
5570 $T2H_THIS_SECTION = \@stoc_lines;
5571 unshift @$T2H_THIS_SECTION, "<BLOCKQUOTE>\n";
5572 push @$T2H_THIS_SECTION, "\n</BLOCKQUOTE>\n";
5573 &$T2H_print_Overview(\*FILE);
5574 close(FILE) if $T2H_SPLIT;
5577 if ($about_body = &$T2H_about_body())
5579 print "# writing About in $docu_about_file...\n" if $T2H_VERBOSE;
5580 open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n"
5583 $T2H_HREF{This} = $T2H_HREF{About};
5584 $T2H_NAME{This} = $T2H_NAME{About};
5585 $T2H_THIS_SECTION = [$about_body];
5586 &$T2H_print_About(\*FILE);
5587 close(FILE) if $T2H_SPLIT;
5592 &$T2H_print_page_foot(\*FILE);
5597 &l2h_FinishFromHtml if ($T2H_L2H);
5598 &l2h_Finish if($T2H_L2H);
5599 print "# that's all folks\n" if $T2H_VERBOSE;
5604 #+++############################################################################
5606 # Low level functions #
5608 #---############################################################################
5610 sub LocateIncludeFile
5615 # APA: Don't implicitely search ., to conform with the docs!
5616 # return $file if (-e $file && -r $file);
5617 foreach $dir (@T2H_INCLUDE_DIRS)
5619 return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file");
5627 $_ = &remove_style($_[0]);
5634 my($name, $level) = @_;
5637 $level--; # here we start at 0
5638 if ($name =~ /^appendix/ || defined(@appendix_sec_num))
5641 if (defined(@appendix_sec_num))
5643 &incr_sec_num($level, @appendix_sec_num);
5647 @appendix_sec_num = ('A', 0, 0, 0);
5649 $ret = join('.', @appendix_sec_num[0..$level]);
5654 if (defined(@normal_sec_num))
5656 &incr_sec_num($level, @normal_sec_num);
5660 @normal_sec_num = (1, 0, 0, 0);
5662 $ret = join('.', @normal_sec_num[0..$level]);
5664 $ret .= "." if $level == 0;
5673 foreach $l ($level+1 .. 3)
5682 my $num = $sec2number{$sec};
5684 return '' unless $num;
5685 return 'Top' unless $num =~ /\.\d+/;
5686 $num =~ s/\.[^\.]*$//;
5687 $num = $num . '.' unless $num =~ /\./;
5688 return $sec2node{$number2sec{$num}};
5691 # Return previous node or "Top"
5695 my $sec_num = $sec2seccount{$sec} - 1;
5696 return "Top" if !$sec_num || $sec_num < 1;
5697 return $sec2node{$seccount2sec{$sec_num}};
5700 # Return next node or "Top"
5704 my $sec_num = $sec2seccount{$sec} + 1;
5705 return "Top" unless exists $seccount2sec{$sec_num};
5706 return $sec2node{$seccount2sec{$sec_num}};
5710 # sub Node2FastBack NODE
5716 # The beginning of this chapter, or if already there, the beginning of the
5722 my $num = $sec2number{$node2sec{$node}};
5725 # Index Pages have no section number and 1. should go back to Top
5726 return $node2prev{$node} if !$num or $num eq "1.";
5728 # Get the current chapter
5729 $num =~ /^([A-Z\d]+)\./;
5732 # If the first section of this chapter, decrement chapter
5733 $n = $n eq 'A' ? $normal_sec_num[0] : $n =~ /^\d+$/ ? --$n : chr(ord($n)-1)
5734 if $n . '.' eq $num;
5736 # Return node name for section number "$n."
5737 return $sec2node{$number2sec{$n . '.'}} || $node2prev{$node};
5741 # sub Node2FastForward NODE
5747 # The beginning of the next chapter.
5749 sub Node2FastForward
5752 my $num = $sec2number{$node2sec{$node}};
5756 return $node2next{$node} if !$num;
5758 # Get current chapter
5759 $num =~ /^([A-Z\d]+)\./;
5763 $n = $n eq $normal_sec_num[0] ? 'A' : ++$n;
5766 return $sec2node{$number2sec{$n . '.'}} || $node2next{$node};
5771 local($_, %seen, %context, $before, $match, $after);
5775 if (/\@(\*|\.|\:|\@|\{|\})/)
5778 $context{$&} .= "> $_" if $T2H_VERBOSE;
5784 ($before, $match, $after) = ($`, $&, $');
5785 if ($before =~ /\b[-\w]+$/ && $after =~ /^[-\w.]*\b/)
5787 $seen{'e-mail address'}++;
5788 $context{'e-mail address'} .= "> $_" if $T2H_VERBOSE;
5793 $context{$match} .= "> $_" if $T2H_VERBOSE;
5796 $_ = "$before$match$after";
5801 foreach (sort(keys(%seen)))
5810 print "$_ ($seen{$_})\n";
5821 if (open($fh_name, $name))
5823 unshift(@fhs, $fh_name);
5827 warn "$ERROR Can't read file $name: $!\n";
5834 @fhs = (); # hold the file handles to read
5835 @input_spool = (); # spooled lines to read
5846 $line = shift(@input_spool);
5853 return($line) if $line;
5860 # used in pass 1, use &next_line
5866 while ($_ = &next_line)
5868 return if /^\@end\s+$tag\s*$/;
5870 die "* Failed to find '$tag' after: " . $lines[$#lines];
5873 # used in pass 1 for l2h use &next_line
5879 while ($_ = &next_line)
5881 return $string if /^\@end\s+$tag\s*$/;
5882 # $_ =~ s/hbox/mbox/g;
5883 $string = $string.$_;
5885 die "* Failed to find '$tag' after: " . $lines[$#lines];
5889 # HTML stacking to have a better HTML output
5894 @html_stack = ('html');
5895 $html_element = 'body';
5901 push(@html_stack, $html_element);
5902 $html_element = $what;
5908 push(@html_stack, $html_element)
5909 if ($html_element && $html_element ne 'P');
5910 $html_element = $what;
5915 $html_element = pop(@html_stack);
5926 if ($elt eq $html_element)
5928 $html_element = pop(@html_stack) if @html_stack;
5935 $html_element = pop(@html_stack) if @html_stack;
5941 my($what, $line) = @_;
5942 if ($T2H_DEBUG & $DEBUG_HTML)
5944 $what = "\n" unless $what;
5945 return("<!-- $line @html_stack, $html_element -->$what")
5950 # to debug the output...
5953 my($what, $line) = @_;
5954 return("<!-- $line -->$what")
5955 if $T2H_DEBUG & $DEBUG_HTML;
5964 $_ = substitute_style($_);
5976 $_ = substitute_style($_);
5982 my ($node, $name, $descr) = @_;
5985 &normalise_node($node);
5986 $href = $node2href{$node};
5991 $descr = SimpleTexi2Html($descr);
5992 if ($T2H_NUMBER_SECTIONS && !$T2H_NODE_NAME_IN_MENU && $node2sec{$node})
5994 $entry = $node2sec{$node};
5999 &normalise_node($name);
6000 $entry = ($name && ($name ne $node || ! $T2H_AVOID_MENU_REDUNDANCY)
6001 ? "$name : $node" : $node);
6004 if ($T2H_AVOID_MENU_REDUNDANCY && $descr)
6006 my $clean_entry = $entry;
6007 $clean_entry =~ s/^.*? // if ($clean_entry =~ /^([A-Z]|\d+)\.[\d\.]* /);
6008 $clean_entry =~ s/[^\w]//g;
6009 my $clean_descr = $descr;
6010 $clean_descr =~ s/[^\w]//g;
6011 $descr = '' if ($clean_entry eq $clean_descr)
6013 push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' .
6014 &t2h_anchor('', $href, $entry) .
6015 '</TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">' .
6017 "</TD></TR>\n", __LINE__));
6019 elsif ($node =~ /^\(.*\)\w+/)
6021 push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' .
6023 '</TD><TD ALIGN="left" VALIGN="TOP">' . $descr .
6024 "</TD></TR>\n", __LINE__))
6028 warn "$ERROR Undefined node of menu_entry ($node): $_";
6032 sub do_ctrl { "^$_[0]" }
6036 my($addr, $text) = split(/,\s*/, $_[0]);
6038 $text = $addr unless $text;
6039 &t2h_anchor('', "mailto:$addr", $text);
6044 # l2h does this much better
6045 return &l2h_ToLatex("{\\sc ".&unprotect_html($_[0])."}") if ($T2H_L2H);
6052 # This sub doesn't seem to be used.
6053 # What are $_[0] and $text?
6055 return &l2h_ToLatex("\$".&unprotect_html($_[0])."\$") if ($T2H_L2H);
6056 return "<EM>".$text."</EM>";
6061 my($url, $text, $only_text) = split(/,\s*/, $_[0]);
6062 # APA: Don't markup obviously bad links.
6063 # e.g. texinfo.texi 4.0 has this, which would lead to a broken
6065 # @section @code{@@uref@{@var{url}[, @var{text}][, @var{replacement}]@}}
6066 return if $url =~ /[<>]/;
6067 $text = $only_text if $only_text;
6068 $text = $url unless $text;
6069 &t2h_anchor('', $url, $text);
6072 sub do_url { &t2h_anchor('', $_[0], $_[0]) }
6076 return '<FONT SIZE="-1">' . $_[0] . '</FONT>';
6081 return "&$_[0]acute;" if $_[1] eq 'H';
6082 return "$_[0]." if $_[1] eq 'dotaccent';
6083 return "$_[0]*" if $_[1] eq 'ringaccent';
6084 return "$_[0]".'[' if $_[1] eq 'tieaccent';
6085 return "$_[0]".'(' if $_[1] eq 'u';
6086 return "$_[0]_" if $_[1] eq 'ubaraccent';
6087 return ".$_[0]" if $_[1] eq 'udotaccent';
6088 return "$_[0]<" if $_[1] eq 'v';
6089 return "&$_[0]cedil;" if $_[1] eq ',';
6090 return "$_[0]" if $_[1] eq 'dotless';
6096 my($texi_style, $text) = @_;
6099 $style = $style_map{$texi_style};
6100 if (defined($style))
6103 if ($style =~ /^\"/)
6108 if ($style =~ /^\&/)
6112 $text = &$style($text, $texi_style);
6117 $text = "<$style>$text</$style>";
6122 $text = "\`$text\'" if $do_quotes;
6131 # remove Texinfo styles
6135 1 while(s/\@\w+{([^\{\}]+)}/$1/g);
6146 sub substitute_style
6149 my($changed, $done, $style, $text);
6151 &simple_substitutions;
6157 while (/\@(\w+){([^\{\}]+)}/ || /\@(,){([^\{\}]+)}/)
6159 $text = &apply_style($1, $2);
6178 my($name, $href, $text, $newline, $extra_attribs) = @_;
6182 $result .= " NAME=\"".protect_html($name)."\"" if $name;
6185 $href =~ s|^$T2H_HREF_DIR_INSTEAD_FILE|./|
6186 if ($T2H_HREF_DIR_INSTEAD_FILE);
6187 $result .= " HREF=\"".protect_html($href)."\"";
6189 $result .= " $extra_attribs" if $extra_attribs;
6190 $result .= ">$text</A>";
6191 $result .= "\n" if $newline;
6199 return("${docu_name}_$num.$docu_ext");
6204 return $node2href{$sec2node{$_[0]}};
6210 if ("$docu_rdir${docu_name}_$doc_num.$docu_ext" eq "$docu_top_file") {
6211 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";
6214 $docu_doc = &doc_href($doc_num);
6219 my ($fh, $lines) = @_;
6221 $lines = $T2H_THIS_SECTION unless $lines;
6226 $_ = l2h_FromHtml($_) if ($T2H_L2H);
6227 if (/^$PROTECTTAG/o)
6236 @cnt = split(/\W*\s+\W*/);
6237 $cnt += scalar(@cnt);
6255 # protect &, ", <, and >.
6256 # APA: Keep it simple. This is what perl's CGI::espaceHTML does.
6257 # We may consider using that instead.
6258 # If raw HTML is used outside @ifhtml or @html it's an error
6260 $what =~ s/\&/\&/go;
6261 $what =~ s/\"/\"/go;
6262 $what =~ s/\</\</go;
6263 $what =~ s/\>/\>/go;
6287 # Character entity references (eg. <)
6289 # Numeric character references (eg. <)
6290 $what =~ s/\&/\&/go;
6291 $what =~ s/\"/\"/go;
6292 $what =~ s/\</\</go;
6293 $what =~ s/\>/\>/go;
6300 my $href = shift || $T2H_HREF{This};
6301 $href =~ s/.*#(.*)$/$1/;
6302 print $fh qq{<A NAME="$href"></A>\n};
6307 SetDocumentLanguage('en') unless ($T2H_LANG);
6308 # APA: There's got to be a better way:
6309 $things_map{'today'} = &pretty_date;
6311 $T2H_TODAY = &pretty_date; # like "20 September 1993"
6312 # the eval prevents this from breaking on system which do not have
6313 # a proper getpwuid implemented
6314 eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i
6315 # APA: Provide Windows NT workaround until getpwuid gets
6316 # implemented there.
6317 $T2H_USER = $ENV{'USERNAME'} unless defined $T2H_USER;
6327 ##############################################################################
6329 # These next few lines are legal in both Perl and nroff.
6333 'di \" finish diversion--previous line must be blank
6334 .nr nl 0-1 \" fake up transition to first page again
6335 .nr % 0 \" start at page 1
6336 '; __END__ ############# From here on it's a standard manual page ############
6337 .so /usr/share/man/man1/texi2html.1