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