# -*-perl-*- ###################################################################### # File: texi2html.init # # Default values for command-line arguments and for various customizable # procedures are set in this file. # # A copy of this file is pasted into the beginning of texi2html by # running './configure'. # # Copy this file, rename it and make changes to it, if you like. # Afterwards, load the file with command-line # option -init-file # # $Id: texi2html.init,v 1.81 2005/02/01 21:20:28 pertusus Exp $ ###################################################################### # The following variables can also be set by command-line options # # # The default values are set in this file, texi2html.init and the content # of this file is included at the beginning of the texi2html script file. # Those values may be overrided by values set in $sysconfdir/texi2htmlrc # and then by values set in $HOME/texi2htmlrc. # # command line switches may override these values, and values set in files # specified by -init-file are also taken into account. # values set in these files overwrite values set by the command-line # options appearing before -init-file and might still be overwritten by # command-line arguments following the -init-file option. # -debug # The integer value specifies what kind of debugging output is generated. $DEBUG = 0; # -doctype # The value is the 'SystemLiteral' which identifies the canonical DTD # for the document. # Definition: The SystemLiteral is called the entity's system # identifier. It is a URI, which may be used to retrieve the entity. # See http://www.xml.com/axml/target.html#NT-ExternalID $DOCTYPE = ''; # -frameset-doctype # When frames are used, this SystemLiteral identifies the DTD used for # the file containing the frame description. $FRAMESET_DOCTYPE = ''; # -test # If this value is true, some variables which should be dynamically generated # (the date, the user running texi2html, the version of texi2html) are set to # fix and given values. This is usefull in case the resulting manual is # compared with a reference. For example this is used in the tests of test.sh. $TEST = 0; # -dump-texi # This value is usefull for debugging purposes. The result of the first pass is # put in .passtexi, the result of the second pass is put in # .passfirst. $DUMP_TEXI = 0; # -expand # the @EXPAND array contains the expanded section names. @EXPAND = ('html'); # -invisible # This seems obsolete and is not used anywhere. # This was a workaround for a known bug of many WWW browsers, including # netscape. This was used to create invisible destination in anchors. $INVISIBLE_MARK = ''; # $INVISIBLE_MARK = ' '; # -iso # if this value is true, ISO8859 characters are used for special symbols # (like copyright, etc). $USE_ISO = 1; # -I # add a directory to the list of directories where @include files are # searched for (besides the directory of the file). additional '-I' # args are appended to this list. # (APA: Don't implicitely search ., to conform with the docs!) # my @INCLUDE_DIRS = ("."); @INCLUDE_DIRS = (); # -P # prepend a directory to the list of directories where @include files are # searched for before the directory of the file. additional '-P' # args are prepended to this list. @PREPEND_DIRS = (); # -top-file # This file name is used for the top-level file. # The extension is set appropriately, if necessary. # If empty, .html is used. # Typically, you would set this to "index.html". $TOP_FILE = ''; # -toc-file # This file name is used for the table of contents. The # extension is set appropriately, if necessary. # If empty, _toc.html is used. $TOC_FILE = ''; # -frames # if the value is true, HTML 4.0 "frames" are used. # A file describing the frame layout is generated, together with a file # with the short table of contents. $FRAMES = 0; # -menu | -nomenu # if the value is true the Texinfo menus are shown. $SHOW_MENU = 1; # -number | -nonumber # if this is set the sections are numbered, and section names and numbers # are used in references and menus (instead of node names). $NUMBER_SECTIONS = 1; # -use-nodes # if this is set the nodes are used as sectionning elements. # Otherwise the nodes are incorporated in sections. $USE_NODES = 0; # -node-files # if this is set one file per node is generated, which can be a target for # cross manual references. $NODE_FILES = 0; # -split section|chapter|node|none # if $SPLIT is set to 'section' (resp. 'chapter') one html file per section # (resp. chapter) is generated. If $SPLIT is set to 'node' one html file per # node or sectionning element is generated. In all these cases separate pages # for Top, Table of content (Toc), Overview and About are generated. # Otherwise a monolithic html file that contains the whole document is # created. #$SPLIT = 'section'; $SPLIT = ''; # -sec-nav|-nosec-nav # if this is set then navigation panels are printed at the beginning of each # section. # If the document is split at nodes then navigation panels are # printed at the end if there were more than $WORDS_IN_PAGE words on page. # # If the document is split at sections this is ignored. # # This is most useful if you do not want to have section navigation # with -split chapter. There will be chapter navigation panel at the # beginning and at the end of chapters anyway. $SECTION_NAVIGATION = 1; # -separated-footnotes # if this is set footnotes are on a separated page. Otherwise they are at # the end of each file (if the document is split). $SEPARATED_FOOTNOTES = 1; # -toc-links # if this is set, links from headings to toc entries are created. $TOC_LINKS = 0; # -subdir # If this is set, then put result files into the specified directory. # If not set, then result files are put into the current directory. #$SUBDIR = 'html'; $SUBDIR = ''; # -short-extn # If this is set, then all HTML files will have extension ".htm" instead of # ".html". This is helpful when shipping the document to DOS-based systems. $SHORTEXTN = 0; # -prefix # This set the output file prefix, prepended to all .html, .gif and .pl files. # By default, this is the basename of the document. $PREFIX = ''; # -o filename # If this is set a monolithic document is outputted into $filename. $OUT = ''; # -no-validate # suppress node cross-reference validation $NOVALIDATE = 0; # -short-ref # if this is set cross-references are given without section numbers. $SHORT_REF = ''; # -idx-sum # if value is set, then for each @printindex # _.idx is created which contains lines of the form # key ref sorted alphabetically (case matters). $IDX_SUMMARY = 0; # -def-table # If this is set a table construction for @def.... instead of definition # lists. # (New Option: 27.07.2000 Karl Heinz Marbaise) $DEF_TABLE = 0; # -verbose # if this is set chatter about what we are doing. $VERBOSE = ''; # -lang # FIXME this has changed # For page titles use $Texi2HTML::I18n::WORDS->{$T2H_LANG}->{...} as title. # To add a new language, supply list of titles (see $Texi2HTML::I18n::WORDS). # and use ISO 639 language codes (see e.g. perl module Locale-Codes-1.02 # for definitions). # Default's to 'en' if not set or no @documentlanguage is specified. $LANG = 'en'; # -ignore-preamble-text # If this is set the text before @node and sectionning commands is ignored. $IGNORE_PREAMBLE_TEXT = 0; # -html-xref-prefix # base directory for external manuals. #$EXTERNAL_DIR = '../'; $EXTERNAL_DIR = undef; # -l2h # if this is set, latex2html is used for generation of math content. $L2H = ''; # -css-include # All the specified css files are used. More precisely the @import sections # are added to the beginning of the CSS_LINES the remaining is added at # the end of the CSS_LINES (after the css rules generated by texi2html). # cf texinfo manual for more info. # - means STDIN @CSS_FILES = (); ###################### # The following options are only relevant if $L2H is set # # -l2h-l2h # name/location of latex2html program $L2H_L2H = "latex2html"; # -l2h-skip # If this is set the actual call to latex2html is skipped. The previously # generated content is reused, instead. $L2H_SKIP = ''; # -l2h-tmp # If this is set l2h uses the specified directory for temporary files. The path # leading to this directory may not contain a dot (i.e., a "."); # otherwise, l2h will fail. $L2H_TMP = ''; # -l2h-file # If set, l2h uses the file as latex2html init file $L2H_FILE = 'l2h.init'; # -l2h-clean # if this is set the intermediate files generated by texi2html in relation with # latex2html are cleaned (they all have the prefix _l2h_). $L2H_CLEAN = 1; ############################################################################## # # The following can only be set in the init file # ############################################################################## # If true do table of contents even if there is no @content $DO_CONTENTS = 0; # If true do short table of contents even if there is no @shortcontent $DO_SCONTENTS = 0; # if set, then use node names in menu entries, instead of section names $NODE_NAME_IN_MENU = 0; # new style for crossrefs $NEW_CROSSREF_STYLE = 1; # if set and menu entry equals menu description, then do not print # menu description. # Likewise, if node name equals entry name, do not print entry name. $AVOID_MENU_REDUNDANCY = 1; # if set, center @image by default # otherwise, do not center by default $CENTER_IMAGE = 1; # used as identation for block enclosing command @example, etc # If not empty, must be enclosed in $EXAMPLE_INDENT_CELL = ' '; # same as above, only for @small $SMALL_EXAMPLE_INDENT_CELL = ' '; # font size for @small $SMALL_FONT_SIZE = '-1'; # horizontal rules $SMALL_RULE = '
'; $DEFAULT_RULE = '
'; $MIDDLE_RULE = '
'; $BIG_RULE = '
'; # if non-empty, and no @..heading appeared in Top node, then # use this as header for top node/section, otherwise use value of # @settitle or @shorttitle (in that order) $TOP_HEADING = ''; # if set, use this chapter for 'Index' button, else # use first chapter with @printindex $INDEX_CHAPTER = ''; # if set and $SPLIT is set, then split index pages at the next letter # after they have more than that many entries $SPLIT_INDEX = 100; # symbol put at the beginning of nodes entry in menu (and optionnaly of # unnumbered in menus, see next variable) $MENU_SYMBOL = '•'; #$MENU_SYMBOL = '*'; $OPEN_QUOTE_SYMBOL = "\`"; $CLOSE_QUOTE_SYMBOL = "'"; # if true put a $MENU_SYMBOL before unnumbered in menus $UNNUMBERED_SYMBOL_IN_MENU = 0; # extension for nodes files when NODE_FILES is true $NODE_FILE_EXTENSION = "html"; # extension $EXTENSION = "html"; # file name used for Top node when NODE_FILES is true $TOP_NODE_FILE = "index"; # this controls the pre style for menus $MENU_PRE_STYLE = 'font-family: serif'; # This controls the ul style for toc $TOC_LIST_STYLE = 'list-style: none'; $TOC_LIST_ATTRIBUTE = ' class="toc"'; # These lines are inserted before and after the shortcontents $BEFORE_OVERVIEW = "
\n"; $AFTER_OVERVIEW = "
\n"; # These lines are inserted before and after the contents $BEFORE_TOC_LINES = "
\n"; $AFTER_TOC_LINES = "
\n"; # if set (e.g., to index.html) replace hrefs to this file # (i.e., to index.html) by ./ $HREF_DIR_INSTEAD_FILE = ''; # text inserted after $AFTER_BODY_OPEN = ''; # text inserted before , this will be automatically inside

$PRE_BODY_CLOSE = ''; # this is added inside after and some <meta name> # stuff, it can be used for eg. <style>, <script>, <meta> etc. tags. $EXTRA_HEAD = ''; # Specifies the minimum page length required before a navigation panel # is placed at the bottom of a page # FIXME this is not true: # THIS_WORDS_IN_PAGE holds number of words of current page $WORDS_IN_PAGE = 300; # if this is set a vertical navigation panel is used. $VERTICAL_HEAD_NAVIGATION = 0; # html version for latex2html $L2H_HTML_VERSION = "4.0"; # specify in this array which "buttons" should appear in which order # in the navigation panel for sections; use ' ' for empty buttons (space) @SECTION_BUTTONS = ( 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward', ' ', ' ', ' ', ' ', 'Top', 'Contents', 'Index', 'About', ); # buttons for misc stuff @MISC_BUTTONS = ('Top', 'Contents', 'Index', 'About'); # buttons for chapter file footers # (and headers but only if SECTION_NAVIGATION is false) @CHAPTER_BUTTONS = ( 'FastBack', 'FastForward', ' ', ' ', ' ', ' ', ' ', 'Top', 'Contents', 'Index', 'About', ); # buttons for section file footers @SECTION_FOOTER_BUTTONS = ( 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward' ); @NODE_FOOTER_BUTTONS = ( 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward', ' ', ' ', ' ', ' ', 'Top', 'Contents', 'Index', 'About', # 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward' ); $ICONS = 0; # insert here name of icon images for buttons # Icons are used, if $ICONS and resp. value are set %ACTIVE_ICONS = ( 'Top', '', 'Contents', '', 'Overview', '', 'Index', '', 'This', '', 'Back', '', 'FastBack', '', 'Prev', '', 'Up', '', 'Next', '', 'NodeUp', '', 'NodeNext', '', 'NodePrev', '', 'Following', '', 'Forward', '', 'FastForward', '', 'About' , '', 'First', '', 'Last', '', ' ', '' ); # insert here name of icon images for these, if button is inactive %PASSIVE_ICONS = ( 'Top', '', 'Contents', '', 'Overview', '', 'Index', '', 'This', '', 'Back', '', 'FastBack', '', 'Prev', '', 'Up', '', 'Next', '', 'NodeUp', '', 'NodeNext', '', 'NodePrev', '', 'Following', '', 'Forward', '', 'FastForward', '', 'About', '', 'First', '', 'Last', '', ); $init_out = \&t2h_default_init_out; $finish_out = \&t2h_default_finish_out; # We have to do this dynamically because of internationalization and because # in body $LANG could be used. sub t2h_default_init_out() { # Names of text as alternative for icons %NAVIGATION_TEXT = ( 'Top', &$I('Top'), 'Contents', &$I('Contents'), 'Overview', &$I('Overview'), 'Index', &$I('Index'), ' ', '   ', 'This', &$I('current'), 'Back', ' < ', 'FastBack', ' << ', 'Prev', &$I('Prev'), 'Up', &$I(' Up '), 'Next', &$I('Next'), 'NodeUp', &$I('node up'), 'NodeNext', &$I('next node'), 'NodePrev', &$I('previous node'), 'Following', &$I('following node'), 'Forward', ' > ', 'FastForward', ' >> ', 'About', ' ? ', 'First', ' |< ', 'Last', ' >| ' ); %BUTTONS_GOTO = ( 'Top', &$I('cover (top) of document'), 'Contents', &$I('table of contents'), 'Overview', &$I('short table of contents'), 'Index', &$I('index'), 'This', &$I('current section'), 'Back', &$I('previous section in reading order'), 'FastBack', &$I('beginning of this chapter or previous chapter'), 'Prev', &$I('previous section on same level'), 'Up', &$I('up section'), 'Next', &$I('next section on same level'), 'NodeUp', &$I('up node'), 'NodeNext', &$I('next node'), 'NodePrev', &$I('previous node'), 'Following', &$I('node following in node reading order'), 'Forward', &$I('next section in reading order'), 'FastForward', &$I('next chapter'), 'About' , &$I('about (help)'), 'First', &$I('first section in reading order'), 'Last', &$I('last section in reading order'), ); # Set the default body text, inserted between <body ... > $BODYTEXT = 'lang="' . $LANG . '" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"' unless (defined($BODYTEXT)); if (!defined($EXTERNAL_CROSSREF_SPLIT)) { if ($SPLIT) { $EXTERNAL_CROSSREF_SPLIT = 1; } else { $EXTERNAL_CROSSREF_SPLIT = 0; } } $ENCODING = $DOCUMENT_ENCODING if (!defined($ENCODING)); my $to_encoding; if (defined($ENCODING)) { $to_encoding = main::set_encoding ($ENCODING); if (defined($to_encoding) and defined($perl_charset_to_html{$to_encoding})) {# FIXME is this really right ? $ENCODING = $perl_charset_to_html{$to_encoding}; } elsif (defined($to_encoding)) {# FIXME is this really right ? $ENCODING = $to_encoding; } } else { #$ENCODING = 'iso-8859-1'; $ENCODING = 'us-ascii'; } # FIXME default might be utf8 ? $DOCUMENT_ENCODING = 'us-ascii' if (!defined($DOCUMENT_ENCODING)); return $to_encoding; }; sub t2h_default_finish_out() { } ####################################################################### # # Values guessed if not set here, set in init_out # ####################################################################### $BODYTEXT = undef; # Formatted document encoding. If undef set to @documentencoding. If undef and # there is no @documentencoding, set in init_out $ENCODING = undef; # if undef set to @documentdescription. If there is no @documentdescription, # set in page_head $DOCUMENT_DESCRIPTION = undef; # if undef set 1 if SPLIT, to 0 otherwise $EXTERNAL_CROSSREF_SPLIT = undef; ######################################################################## # Control of Page layout: # You can make changes of the Page layout at two levels: # 1.) For small changes, it is often enough to change the value of # some global string/hash/array variables # 2.) For larger changes, reimplement one of the T2H_DEFAULT_<fnc>* routines, # give them another name, and assign them to the respective # $<fnc> variable. # As a general interface, the hashes Texi2HTML::HREF, Texi2HTML::NAME, Texi2HTML::NODE, Texi2HTML::NO_TEXI, hold # href, html-name, node-name, name after removal of texi commands of # This -- current section (resp. html page) # Top -- top page FIXME: ($T2H_TOP_FILE) # Contents -- Table of contents # Overview -- Short table of contents # Index -- Index page # About -- page which explain "navigation buttons" # First -- first node # Last -- last node # # Whether or not the following hash values are set, depends on the context # (all values are w.r.t. 'This' section) # Next -- next node of texinfo # Prev -- previous node of texinfo # NodeUp -- up node of texinfo # Following -- following node in node reading order, taking menu into account # Forward -- next node in reading order # Back -- previous node in reading order # Up -- parent given by sectionning commands # FastForward -- if leave node, up and next, else next node # FastBackward-- if leave node, up and prev, else prev node # # Furthermore, the following global variabels are set: # $Texi2HTML::THISDOC{title} -- title as set by @setttile # $Texi2HTML::THISDOC{title_no_texi} -- title without texi (without html elements) # $Texi2HTML::THISDOC{title_texi} -- title with texinfo @-commands # $Texi2HTML::THISDOC{fulltitle} -- full title as set by @title... # $Texi2HTML::THISDOC{subtitle} -- subtitle as set by @subtitle # $Texi2HTML::THISDOC{author} -- author as set by @author # $Texi2HTML::THISDOC{copying} -- text of @copying and @end copying in comment # # $Texi2HTML::THISDOC{program} -- name and version of texi2html # $Texi2HTML::THISDOC{program_homepage} -- homepage for texi2html # $Texi2HTML::THISDOC{program_authors} -- authors of texi2html # $Texi2HTML::THISDOC{today} -- date formatted with pretty_date # $Texi2HTML::THISDOC{toc_file} -- table of contents file # $Texi2HTML::THISDOC{file_base_name} -- base name of the texinfo manual file # $Texi2HTML::THISDOC{destination_directory} # -- directory for the resulting files # $Texi2HTML::THISDOC{user} -- user running the script # other $Texi2HTML::THISDOC keys corresponds with texinfo commands, the value # being the command arg, for the following commands: # kbdinputstyle, paragraphindent, setchapternewpage, headings, footnotestyle, # exampleindent, firstparagraphindent, everyheading, everyfooting, # evenheading, evenfooting, oddheading, oddfooting # # and pointer to arrays of lines which need to be printed by main::print_lines # $Texi2HTML::THIS_SECTION -- lines of 'This' section # $Texi2HTML::THIS_HEADER -- lines preceding navigation panel of 'This' section # $Texi2HTML::OVERVIEW -- lines of short table of contents # $Texi2HTML::TOC_LINES -- lines of table of contents # $Texi2HTML::TITLEPAGE -- lines of title page # # $Texi2HTML::THIS_ELEMENT holds the element reference. ## FIXME: $T2H_TOP -- lines of Top texinfo node # # There are the following subs which control the layout: # $print_section = \&T2H_DEFAULT_print_section; $end_section = \&T2H_DEFAULT_end_section; $one_section = \&T2H_DEFAULT_one_section; $print_Top_header = \&T2H_DEFAULT_print_Top_header; $print_Top_footer = \&T2H_DEFAULT_print_Top_footer; $print_Top = \&T2H_DEFAULT_print_Top; $print_Toc = \&T2H_DEFAULT_print_Toc; $print_Overview = \&T2H_DEFAULT_print_Overview; $print_Footnotes = \&T2H_DEFAULT_print_Footnotes; $print_About = \&T2H_DEFAULT_print_About; $print_misc_header = \&T2H_DEFAULT_print_misc_header; $print_misc_footer = \&T2H_DEFAULT_print_misc_footer; $print_misc = \&T2H_DEFAULT_print_misc; $print_section_footer = \&T2H_DEFAULT_print_section_footer; $print_chapter_header = \&T2H_DEFAULT_print_chapter_header; $print_section_header = \&T2H_DEFAULT_print_section_header; $print_chapter_footer = \&T2H_DEFAULT_print_chapter_footer; $print_page_head = \&T2H_DEFAULT_print_page_head; $print_page_foot = \&T2H_DEFAULT_print_page_foot; $print_head_navigation = \&T2H_DEFAULT_print_head_navigation; $print_foot_navigation = \&T2H_DEFAULT_print_foot_navigation; $button_icon_img = \&T2H_DEFAULT_button_icon_img; $print_navigation = \&T2H_DEFAULT_print_navigation; $about_body = \&T2H_DEFAULT_about_body; $print_frame = \&T2H_DEFAULT_print_frame; $print_toc_frame = \&T2H_DEFAULT_print_toc_frame; #$toc_body = \&T2H_DEFAULT_toc_body; $titlepage = \&T2H_DEFAULT_titlepage; $css_lines = \&T2H_DEFAULT_css_lines; $print_redirection_page = \&T2H_DEFAULT_print_redirection_page; $node_file_name = \&T2H_DEFAULT_node_file_name; ######################################################################## # Layout for html for every sections # sub T2H_DEFAULT_print_section { my $fh = shift; my $first_in_page = shift; my $previous_is_top = shift; my $buttons = \@SECTION_BUTTONS; if ($first_in_page and $SECTION_NAVIGATION) { &$print_head_navigation($fh, $buttons); } else { # got to do this here, as it isn't done in print_head_navigation main::print_lines($fh, $Texi2HTML::THIS_HEADER); &$print_navigation($fh, $buttons) if ($SECTION_NAVIGATION); } my $nw = main::print_lines($fh); if (defined $SPLIT and (($SPLIT eq 'node') && $SECTION_NAVIGATION)) { &$print_foot_navigation($fh); print $fh "$SMALL_RULE\n"; &$print_navigation($fh, \@NODE_FOOTER_BUTTONS) if (!defined($WORDS_IN_PAGE) or (defined ($nw) and $nw >= $WORDS_IN_PAGE)); } } sub T2H_DEFAULT_one_section($) { my $fh = shift; main::print_lines($fh, $Texi2HTML::THIS_HEADER); main::print_lines($fh); print $fh "$SMALL_RULE\n"; &$print_foot_navigation($fh); &$print_page_foot($fh); } ################################################################### # Layout of top-page I recommend that you use @ifnothtml, @ifhtml, # @html within the Top texinfo node to specify content of top-level # page. # # If you enclose everything in @ifnothtml, then title, subtitle, # author and overview is printed # Texi2HTML::HREF of Next, Prev, Up, Forward, Back are not defined # if $T2H_SPLIT then Top page is in its own html file sub T2H_DEFAULT_print_Top_header($$) { my $fh = shift; my $do_page_head = shift; &$print_page_head($fh) if ($do_page_head); } sub T2H_DEFAULT_print_Top_footer($$) { my $fh = shift; my $end_page = shift; my $buttons = \@MISC_BUTTONS; &$print_foot_navigation($fh); print $fh "$SMALL_RULE\n"; if ($end_page) { &$print_navigation($fh, $buttons); &$print_page_foot($fh); } } sub T2H_DEFAULT_print_Top { my $fh = shift; my $has_top_heading = shift; # for redefining navigation buttons use: # my $buttons = [...]; # as it is, 'Top', 'Contents', 'Index', 'About' are printed my $buttons = \@MISC_BUTTONS; &$print_head_navigation($fh, $buttons); my $nw; if ($Texi2HTML::THIS_SECTION) { # if top-level node has content, then print it with extra header #print $fh "<h1>$Texi2HTML::NAME{Top}</h1>\n" print $fh "<h1 class=\"settitle\">$Texi2HTML::NAME{Top}</h1>\n" unless ($has_top_heading); $nw = main::print_lines($fh, $Texi2HTML::THIS_SECTION); } else { # top-level node is fully enclosed in @ifnothtml # print fulltitle, subtitle, author, Overview print $fh $Texi2HTML::TITLEPAGE; if (@{$Texi2HTML::OVERVIEW}) { print $fh '<h2> ' . &$I('Overview:') . "</h2>\n" . "<blockquote>\n"; my $nw = main::print_lines($fh, $Texi2HTML::OVERVIEW); print $fh "</blockquote>\n"; } } } ################################################################### # Layout of Toc, Overview, and Footnotes pages # By default, we use "normal" layout # Texi2HTML::HREF of Next, Prev, Up, Forward, Back, etc are not defined # use: my $buttons = [...] to redefine navigation buttons sub T2H_DEFAULT_print_Toc { return &$print_misc(@_); } sub T2H_DEFAULT_print_Overview { return &$print_misc(@_); } sub T2H_DEFAULT_print_Footnotes { return &$print_misc(@_); } sub T2H_DEFAULT_print_About { return &$print_misc(@_); } sub T2H_DEFAULT_print_misc_header { my $fh = shift; my $buttons = shift; &$print_page_head($fh) if $SPLIT; &$print_head_navigation($fh, $buttons); } sub T2H_DEFAULT_print_misc_footer { my $fh = shift; my $buttons = shift; my $nwords = shift; &$print_foot_navigation($fh, $buttons); print $fh "$SMALL_RULE\n"; if ($SPLIT) { &$print_navigation($fh, $buttons);# if ($SPLIT ne 'node'); &$print_page_foot($fh); } } sub T2H_DEFAULT_print_misc { my $fh = shift; my $buttons = \@MISC_BUTTONS; &$print_misc_header($fh, $buttons); print $fh "<h1>$Texi2HTML::NAME{This}</h1>\n"; main::print_lines($fh); &$print_misc_footer($fh, $buttons); } ################################################################## # section_footer is only called if SPLIT eq 'section' # section_footer: after print_section of last section, before print_page_foot # sub T2H_DEFAULT_print_section_footer { my $fh = shift; my $buttons = \@SECTION_FOOTER_BUTTONS; &$end_section ($fh, 1); &$print_navigation($fh, $buttons); } ################################################################### # chapter_header and chapter_footer are only called if # SPLIT eq 'chapter' # chapter_header: after print_page_head, before print_section # chapter_footer: after print_section of last section, before print_page_foot # # If you want to get rid of navigation stuff after each section, # redefine print_section such that it does not call print_navigation, # and put print_navigation into print_chapter_header sub T2H_DEFAULT_print_chapter_header { # nothing to do there, by default, the navigation panel # is the section navigation panel if (! $SECTION_NAVIGATION) { # in this case print_navigation is called here. my $fh = shift; my $buttons = \@CHAPTER_BUTTONS; &$print_head_navigation($fh, $buttons); #do that instead ? #&$print_head_navigation($fh, $buttons); # FIXME VERTICAL_HEAD_NAVIGATION ? print $fh "\n$MIDDLE_RULE\n"; } } sub T2H_DEFAULT_print_chapter_footer { my $fh = shift; my $buttons = \@CHAPTER_BUTTONS; &$print_foot_navigation($fh); print $fh "$BIG_RULE\n"; &$print_navigation($fh, $buttons); } sub T2H_DEFAULT_print_section_header { # nothing to do there, by default if (! $SECTION_NAVIGATION) { # in this case print_navigation is called here. my $fh = shift; my $buttons = \@SECTION_BUTTONS; &$print_head_navigation($fh, $buttons); } } ################################################################### # Layout of standard header and footer # sub T2H_DEFAULT_print_page_head($) { my $fh = shift; my $longtitle = "$Texi2HTML::THISDOC{'title_unformatted'}"; $longtitle .= ": $Texi2HTML::UNFORMATTED{'This'}" if exists $Texi2HTML::UNFORMATTED{'This'}; #my $longtitle = "$Texi2HTML::THISDOC{'title_no_texi'}"; #$longtitle .= ": $Texi2HTML::NO_TEXI{'This'}" if exists $Texi2HTML::NO_TEXI{'This'}; my $description = $DOCUMENT_DESCRIPTION; $description = $longtitle if (!defined($description)); $description = "<meta name=\"description\" content=\"$description\">" if ($description ne ''); $description = $Texi2HTML::THISDOC{'documentdescription'} if (defined($Texi2HTML::THISDOC{'documentdescription'})); my $encoding = ''; $encoding = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=$ENCODING\">" if (defined($ENCODING) and ($ENCODING ne '')); print $fh <<EOT; $DOCTYPE <html> $Texi2HTML::THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} --> <!-- $Texi2HTML::THISDOC{program_authors} --> <head> <title>$longtitle $description $encoding $CSS_LINES $EXTRA_HEAD $AFTER_BODY_OPEN EOT } sub program_string() { my $user = $Texi2HTML::THISDOC{'user'}; my $date = $Texi2HTML::THISDOC{'today'}; $user = '' if (!defined($user)); $date = '' if (!defined($date)); if (($user ne '') and ($date ne '')) { return &$I('This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.', { 'user' => $user, 'date' => $date, 'program_homepage' => $Texi2HTML::THISDOC{'program_homepage'}, 'program' => $Texi2HTML::THISDOC{'program'} }); } elsif ($user ne '') { return &$I('This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.', { 'user' => $user, 'program_homepage' => $Texi2HTML::THISDOC{'program_homepage'}, 'program' => $Texi2HTML::THISDOC{'program'} }); } elsif ($date ne '') { return &$I('This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.', { 'date' => $date, 'program_homepage' => $Texi2HTML::THISDOC{'program_homepage'}, 'program' => $Texi2HTML::THISDOC{'program'} }); } return &$I('This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.', { 'program_homepage' => $Texi2HTML::THISDOC{'program_homepage'}, 'program' => $Texi2HTML::THISDOC{'program'} }); } sub T2H_DEFAULT_end_section($$) { my $fh = shift; my $end_foot_navigation = shift; &$print_foot_navigation($fh) if ($end_foot_navigation); print $fh "$BIG_RULE\n"; } sub T2H_DEFAULT_print_page_foot($) { my $fh = shift; my $program_string = program_string(); print $fh < $program_string
$PRE_BODY_CLOSE

EOT } ################################################################### # Layout of navigation panel sub T2H_DEFAULT_print_head_navigation($$) { my $fh = shift; my $buttons = shift; if ($VERTICAL_HEAD_NAVIGATION) { print $fh < EOT } main::print_lines($fh, $Texi2HTML::THIS_HEADER); &$print_navigation($fh, $buttons, $VERTICAL_HEAD_NAVIGATION); if ($VERTICAL_HEAD_NAVIGATION) { print $fh < EOT } elsif (defined $SPLIT and ($SPLIT eq 'node')) { print $fh "$SMALL_RULE\n"; } } sub T2H_DEFAULT_print_foot_navigation { my $fh = shift; if ($VERTICAL_HEAD_NAVIGATION) { print $fh < EOT } } ###################################################################### # navigation panel # # how to create IMG tag sub T2H_DEFAULT_button_icon_img { my $button = shift; my $icon = shift; my $name = shift; return '' if (!defined($icon)); if (defined($name) && $name) { $name = ": $name"; } else { $name = ''; } $button = "" if (!defined ($button)); return qq{$button$name}; } sub T2H_DEFAULT_print_navigation { my $fh = shift; my $buttons = shift; my $vertical = shift; my $spacing = 1; print $fh '\n"; print $fh "" unless $vertical; for my $button (@$buttons) { print $fh qq{\n} if $vertical; print $fh qq{\n"; print $fh "\n" if $vertical; } print $fh "" unless $vertical; print $fh "
}; if (ref($button) eq 'CODE') { &$button($fh, $vertical); } elsif (ref($button) eq 'SCALAR') { print $fh "$$button" if defined($$button); } elsif (ref($button) eq 'ARRAY') { my $text = $button->[1]; my $button_href = $button->[0]; if (defined($button_href) and !ref($button_href) and defined($text) and (ref($text) eq 'SCALAR') and defined($$text)) { # use given text if ($Texi2HTML::HREF{$button_href}) { print $fh "" . &$anchor('', $Texi2HTML::HREF{$button_href}, $$text ) ; } else { print $fh $$text; } } } elsif ($button eq ' ') { # handle space button print $fh $ICONS && $ACTIVE_ICONS{' '} ? &$button_icon_img($button, $ACTIVE_ICONS{' '}) : $NAVIGATION_TEXT{' '}; #next; } elsif ($Texi2HTML::HREF{$button}) { # button is active my $btitle = $BUTTONS_GOTO{$button} ? 'title="' . ucfirst($BUTTONS_GOTO{$button}) . '"' : ''; if ($ICONS && $ACTIVE_ICONS{$button}) { # use icon print $fh '' . &$anchor('', $Texi2HTML::HREF{$button}, &$button_icon_img($button, $ACTIVE_ICONS{$button}, #$Texi2HTML::NAME{$button}), $Texi2HTML::NO_TEXI{$button}), $btitle ); } else { # use text print $fh '[' . &$anchor('', $Texi2HTML::HREF{$button}, $NAVIGATION_TEXT{$button}, $btitle ) . ']'; } } else { # button is passive print $fh $ICONS && $PASSIVE_ICONS{$button} ? &$button_icon_img($button, $PASSIVE_ICONS{$button}, #$Texi2HTML::NAME{$button}) : $Texi2HTML::NO_TEXI{$button}) : "[" . $NAVIGATION_TEXT{$button} . "]"; } print $fh "
\n"; } ###################################################################### # Frames: this is from "Richard Y. Kim" # Should be improved to be more conforming to other _print* functions # FIXME pass toc_file and main_file as args or in $Texi2HTML::THISDOC ? sub T2H_DEFAULT_print_frame { my $fh = shift; my $toc_file = shift; my $main_file = shift; print $fh < $Texi2HTML::THISDOC{title} EOT } sub T2H_DEFAULT_print_toc_frame { my $fh = shift; my $stoc_lines = shift; &$print_page_head($fh); print $fh <Content EOT print $fh map {s/\bhref=/target="main" href=/; $_;} @$stoc_lines; print $fh "\n"; } # This subroutine is intended to fill @Texi2HTML::TOC_LINES and # @Texi2HTML::OVERVIEW with the table of contents and short table of # contents. # # arguments: # ref on an array containing all the elements # each element is a reference on a hash. The following keys might be of # use: # 'top': true if this is the top element # 'index_page': true if the element is an index page added because of index # splitting # 'toc_level': level of the element in the table of content. Highest level # is 1 for the @top element and for chapters, appendix and so on, # 2 for section, unnumberedsec and so on... # 'tocid': label used for reference linking to the element in table of # contents # 'file': the file containing the element, usefull to do href to that file # in case the document is split. # 'text': text of the element, with section number # 'name': text of the element, without section number # Relevant configuration variables are: # $NUMBER_SECTIONS # $TOC_LIST_ATTRIBUTE: usefull in case a list is used # $FRAMES: @Texi2HTML::OVERVIEW is used in one of the frames. # $BEFORE_OVERVIEW # $AFTER_OVERVIEW # $BEFORE_TOC_LINES # $AFTER_TOC_LINES # $DO_CONTENTS # $DO_SCONTENTS sub T2H_DEFAULT_toc_body($) { } sub T2H_DEFAULT_css_lines ($$) { my $import_lines = shift; my $rule_lines = shift; return if (defined($CSS_LINES) or (!@$rule_lines and !@$import_lines and (! keys(%css_map)))); $CSS_LINES = "\n"; } ###################################################################### # About page # # PRE_ABOUT can be a function reference or a scalar. # Note that if it is a scalar, T2H_InitGlobals has not been called, # and all global variables like $ADDRESS are not available. $PRE_ABOUT = sub { return ' ' . program_string() . "\n"; }; # If customizing $AFTER_ABOUT, be sure to put the content inside

. $AFTER_ABOUT = ''; %BUTTONS_EXAMPLE = ( 'Top', '   ', 'Contents', '   ', 'Overview', '   ', 'Index', '   ', 'This', '1.2.3', 'Back', '1.2.2', 'FastBack', '1', 'Prev', '1.2.2', 'Up', '1.2', 'Next', '1.2.4', 'NodeUp', '1.2', 'NodeNext', '1.2.4', 'NodePrev', '1.2.2', 'Following', '1.2.4', 'Forward', '1.2.4', 'FastForward', '2', 'About', '   ', 'First', '1.', 'Last', '1.2.4', ); sub T2H_DEFAULT_about_body { my $about = "

\n"; if (ref($PRE_ABOUT) eq 'CODE') { $about .= &$PRE_ABOUT(); } else { $about .= $PRE_ABOUT; } $about .= <

EOT $about .= &$I(' The buttons in the navigation panels have the following meaning:') . "\n"; $about .= < EOT $about .= ' \n" . ' \n" . ' \n" . ' \n" . " \n"; for my $button (@SECTION_BUTTONS) { next if $button eq ' ' || ref($button) eq 'CODE' || ref($button) eq 'SCALAR' || ref($button) eq 'ARRAY'; $about .= " \n \n"; $about .= <$button EOT } $about .= <

EOT $about .= &$I(' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:') . "\n"; # where the Example assumes that the current position # is at Subsubsection One-Two-Three of a document of # the following structure: $about .= <

    EOT $about .= '
  • 1. ' . &$I('Section One') . "\n" . "
      \n" . '
    • 1.1 ' . &$I('Subsection One-One') . "\n"; $about .= <
    • ...
  • EOT $about .= '
  • 1.2 ' . &$I('Subsection One-Two') . "\n" . "
      \n" . '
    • 1.2.1 ' . &$I('Subsubsection One-Two-One') . "
    • \n" . '
    • 1.2.2 ' . &$I('Subsubsection One-Two-Two') . "
    • \n" . '
    • 1.2.3 ' . &$I('Subsubsection One-Two-Three') . "    \n" . ' <== ' . &$I('Current Position') . "
    • \n" . '
    • 1.2.4 ' . &$I('Subsubsection One-Two-Four') . "
    • \n" . "
    \n" . "
  • \n" . '
  • 1.3 ' . &$I('Subsection One-Three') . "\n"; $about .= <
  • ...
EOT $about .= '
  • 1.4 ' . &$I('Subsection One-Four') . "
  • \n"; $about .= < $AFTER_ABOUT EOT return $about; } sub T2H_DEFAULT_titlepage() { my $result = ''; if (@{$Texi2HTML::THISDOC{'titles'}} or @{$Texi2HTML::THISDOC{'subtitles'}} or @{$Texi2HTML::THISDOC{'authors'}}) { $result = "
    \n"; foreach my $title (@{$Texi2HTML::THISDOC{'titles'}}) { $result .= '

    ' . $title . "

    \n"; } foreach my $subtitle (@{$Texi2HTML::THISDOC{'subtitles'}}) { $result .= '

    ' . $subtitle . "

    \n"; } foreach my $author (@{$Texi2HTML::THISDOC{'authors'}}) { $result .= ' ' . $author . "
    \n"; } $result .= "
    \n$DEFAULT_RULE\n"; } $Texi2HTML::TITLEPAGE = $result . $Texi2HTML::TITLEPAGE; } # i18n sub T2H_DEFAULT_print_redirection_page($) { my $fh = shift; my $longtitle = "$Texi2HTML::THISDOC{'title_no_texi'}"; $longtitle .= ": $Texi2HTML::NO_TEXI{'This'}" if exists $Texi2HTML::NO_TEXI{'This'}; my $description = $longtitle; $description = $Texi2HTML::THISDOC{'documentdescription'} if (defined($Texi2HTML::THISDOC{'documentdescription'})); my $href = &$anchor('', $Texi2HTML::HREF{'This'}, $Texi2HTML::NAME{'This'}); print $fh < $longtitle $EXTRA_HEAD $AFTER_BODY_OPEN

    The node you are looking for is at $href.

    EOT } sub T2H_DEFAULT_node_file_name($) { my $node = shift; return (undef, undef) if ($node->{'external_node'} or $node->{'index_page'}); my $file; my $node_file; if ($NEW_CROSSREF_STYLE) { if (defined($node->{'file'})) { $file = $node->{'file'}; $node_file = $node->{'node_file'}; } else { $node_file = $node->{'cross_manual_target'} . ".$NODE_FILE_EXTENSION"; $file = $node_file if (($SPLIT eq 'node') and ($USE_NODES or $node->{'with_section'})); } } else { return (undef, undef) if (defined($node->{'file'})); my $name = main::remove_texi($node->{'texi'}); $name =~ s/[^\w\.\-]/-/g; $name = "${name}.$NODE_FILE_EXTENSION"; $file = $name if (($SPLIT eq 'node') and ($USE_NODES or $node->{'with_section'})); $node_file = $name; } return ($file, $node_file); } ######################################################################## # Control of formatting: # 1.) For some changes, it is often enough to change the value of # some global map. It might necessitate building a little # function along with the change in hash, if the change is the use # of another function (in style_map). # 2.) For other changes, reimplement one of the t2h_default_* routines, # give them another name, and assign them to the respective # $ variable (below). # # This hash should have keys corresponding with the nonletter command accent # whose following character is considered to be the argument # This hash associates an accent macro to the ISO name for the accent if any. # The customary use of this map is to find the ISO name appearing in html # entity (like é) associated with a texinfo accent macro. # # The keys of the hash are # ": umlaut # ~: tilda accent # ^: circumflex accent # `: grave accent # ': acute accent # =: macron accent %accent_map = ( '"', 'uml', '~', 'tilde', '^', 'circ', '`', 'grave', "'", 'acute', '=', '', ); # # texinfo "simple things" (@foo) to HTML ones # %simple_map = ( "*", "
    ", # HTML+ ' ', ' ', "\t", ' ', "\n", ' ', # "­" or "­" could also be possible for @-, but it seems # that some browser will consider this as an always visible hyphen mark # which is not what we want (see http://www.cs.tut.fi/~jkorpela/shy.html) '-', '', # hyphenation hint '|', '', # used in formatting commands @evenfooting and friends '/', '', # spacing commands ':', '', '!', '!', '?', '?', '.', '.', '@', '@', '}', '}', '{', '{', ); # this map is used in preformatted text %simple_map_pre = %simple_map; $simple_map_pre{'*'} = "\n"; # # texinfo "things" (@foo{}) to HTML ones # %things_map = ( 'TeX' => 'TeX', 'LaTeX' => 'LaTeX', # pertusus: unknown by makeinfo, not in texinfo manual (@* is the right thing) # 'br', '
    ', # paragraph break 'bullet' => '*', # #'copyright' => '(C)', 'copyright' => '©', 'registeredsymbol' => '®', 'dots' => '...', 'enddots' => '....', 'equiv' => '==', # i18n 'error' => 'error-->', 'expansion' => '==>', 'minus' => '-', 'point' => '-!-', 'print' => '-|', 'result' => '=>', # set in code using the language # 'today', &pretty_date, 'today' => '', 'aa' => 'å', 'AA' => 'Å', 'ae' => 'æ', 'oe' => 'œ', #pertusus: also œ. œ not in html 3.2 'AE' => 'Æ', 'OE' => 'Œ', #pertusus: also Œ. Œ not in html 3.2 'o' => 'ø', 'O' => 'Ø', 'ss' => 'ß', 'l' => '/l', 'L' => '/L', 'exclamdown' => '¡', 'questiondown' => '¿', 'pounds' => '£', 'ordf' => 'ª', 'ordm' => 'º', 'comma' => ',', 'euro' => '€', ); # This map is used in preformatted environments %pre_map = %things_map; $pre_map{'dots'} = '...'; $pre_map{'enddots'} = '....'; #$pre_map{'br'} = "\n"; # ascii representation of @-commands %ascii_simple_map = ( "*", "\n", # HTML+ ' ', ' ', "\t", "\t", "\n", "\n", '-', '', # hyphenation hint '|', '', # used in formatting commands @evenfooting and friends '/', '', ':', '', '!', '!', '?', '?', '.', '.', '@', '@', '}', '}', '{', '{', ); %ascii_things_map = ( 'TeX' => 'TeX', 'LaTeX' => 'LaTeX', 'bullet' => '*', 'copyright' => '(C)', 'registeredsymbol' => '(R)', 'dots' => '...', 'enddots' => '....', 'equiv' => '==', # i18n 'error' => 'error-->', 'expansion' => '==>', 'minus' => '-', 'point' => '-!-', 'print' => '-|', 'result' => '=>', 'today' => '', 'aa' => 'aa', 'AA' => 'AA', 'ae' => 'ae', 'oe' => 'oe', 'AE' => 'AE', 'OE' => 'OE', 'o' => '/o', 'O' => '/O', 'ss' => 'ss', 'l' => '/l', 'L' => '/L', 'exclamdown' => '?', 'questiondown' => '!', 'pounds' => '#', 'ordf' => 'a', 'ordm' => 'o', 'comma' => ',', 'euro' => 'Euro', ); # # This map is used when texi elements are removed and replaced # by simple text # %simple_map_texi = ( "*", "", " ", " ", "\t", " ", "-", "-", # soft hyphen "\n", "\n", "|", "", # spacing commands ":", "", "!", "!", "?", "?", ".", ".", "-", "", '@', '@', '}', '}', '{', '{', ); # text replacing macros when texi commands are removed and plain text is # produced %texi_map = ( 'TeX', 'TeX', 'LaTeX', 'LaTeX', 'bullet', '*', 'copyright', 'C', 'registeredsymbol', 'R', 'dots', '...', 'enddots', '....', 'equiv', '==', 'error', 'error-->', 'expansion', '==>', 'minus', '-', 'point', '-!-', 'print', '-|', 'result', '=>', 'today' => '', 'aa', 'aa', 'AA', 'AA', 'ae', 'ae', 'oe', 'oe', 'AE', 'AE', 'OE', 'OE', 'o', 'o', 'O', 'O', 'ss', 'ss', 'l', 'l', 'L', 'L', 'exclamdown', '! upside-down', #'exclamdown', '¡', 'questiondown', '? upside-down', #'questiondown', '¿', 'pounds', 'pound sterling', #'pounds', '£' 'ordf' => 'a', 'ordm' => 'o', 'comma' => ',', 'euro' => 'Euro', ); # taken from #Latin extended additionnal #http://www.alanwood.net/unicode/latin_extended_additional.html #C1 Controls and Latin-1 Supplement #http://www.alanwood.net/unicode/latin_1_supplement.html #Latin Extended-A #http://www.alanwood.net/unicode/latin_extended_a.html #Latin Extended-B #http://www.alanwood.net/unicode/latin_extended_b.html #dotless i: 0131 %unicode_map = ( 'bullet' => '2022', 'copyright' => '00A9', 'registeredsymbol' => '00AE', 'dots' => '2026', 'enddots' => '', 'equiv' => '2261', 'error' => '', 'expansion' => '2192', 'minus' => '2212', # in mathematical operators # 'minus' => '002D', # in latin1 'point' => '2217', 'print' => '', 'result' => '21D2', 'today' => '', 'aa' => '00E5', 'AA' => '00C5', 'ae' => '00E6', 'oe' => '0153', 'AE' => '00C6', 'OE' => '0152', 'o' => '00F8', 'O' => '00D8', 'ss' => '00DF', 'l' => '0142', 'L' => '0141', 'exclamdown' => '00A1', 'questiondown' => '00BF', 'pounds' => '00A3', 'ordf' => '00AA', 'ordm' => '00BA', 'comma' => '002C', 'euro' => '20AC', ); %ascii_character_map = ( ' ' => '0020', '!' => '0021', '"' => '0022', '#' => '0023', '$' => '0024', '%' => '0025', '&' => '0026', "'" => '0027', '(' => '0028', ')' => '0029', '*' => '002A', '+' => '002B', ',' => '002C', '-' => '002D', '.' => '002E', '/' => '002F', ':' => '003A', ';' => '003B', '<' => '003C', '=' => '003D', '>' => '003E', '?' => '003F', '@' => '0040', '[' => '005B', '\\' => '005C', ']' => '005D', '^' => '005E', '_' => '005F', '`' => '0060', '{' => '007B', '|' => '007C', '}' => '007D', '~' => '007E', ); %perl_charset_to_html = ( 'utf8' => 'utf-8', 'ascii' => 'us-ascii', ); # symbols used for the commands if $USE-ISO is true. %iso_symbols = ( 'equiv' => '≡', 'dots' => '…', 'bullet' => '•', 'result' => '⇒', 'expansion' => '→', 'point' => '∗', ); # When the value begins with & the function with that name is used to do the # html. The first argument is the text enclosed within {}, the second is the # style name (which is also the key of the hash) # # Otherwithe the value is the html element used to enclose the text, and if # there is a " the resulting text is also enclosed within `' my %old_style_map = ( 'acronym', '', 'asis', '', 'b', 'b', 'cite', 'cite', 'code', 'code', 'command', 'code', 'ctrl', '&default_ctrl', 'dfn', 'em', 'dmn', '', 'email', '&default_email', 'emph', 'em', 'env', 'code', 'file', '"tt', 'i', 'i', 'kbd', 'kbd', 'key', 'kbd', 'math', 'em', 'option', '"samp', 'r', '', 'samp', '"samp', 'sc', '&default_sc', 'strong', 'strong', 't', 'tt', 'uref', '&default_uref', 'url', '&default_url', 'var', 'var', 'verb', 'tt', 'titlefont', '&default_titlefont', 'w', '', ); # default is {'args' => ['normal'], 'attribute' => ''}, %style_map = ( 'asis', {}, 'b', {'attribute' => 'b'}, 'cite', {'attribute' => 'cite'}, 'code', {'args' => ['code'], 'attribute' => 'code'}, 'command', {'args' => ['code'], 'attribute' => 'code'}, 'ctrl', {'function' => \&t2h_default_ctrl}, 'dfn', {'attribute' => 'em'}, 'dmn', {}, 'email', {'args' => ['code', 'normal'], 'function' => \&t2h_default_email}, #'email', {'args' => ['normal', 'normal'], # 'function' => \&t2h_default_email}, 'emph', {'attribute' => 'em'}, 'env', {'args' => ['code'], 'attribute' => 'code'}, 'file', {'args' => ['code'], 'attribute' => 'tt', 'quote' => '"'}, 'i', {'attribute' => 'i'}, 'slanted', {'attribute' => 'i'}, 'sansserif', {'attribute' => 'span class="sansserif"'}, 'kbd', {'args' => ['code'], 'attribute' => 'kbd'}, 'key', {'attribute' => 'kbd'}, 'math', {'attribute' => 'em'}, 'option', {'args' => ['code'], 'attribute' => 'samp', 'quote' => '"'}, 'r', {}, 'samp', {'args' => ['code'], 'attribute' => 'samp', 'quote' => '"'}, 'sc', {'function' => \&t2h_default_sc}, 'strong', {'attribute' => 'strong'}, 't', {'attribute' => 'tt'}, 'uref', {'function' => \&t2h_default_uref, 'args' => ['code', 'normal', 'normal']}, #'uref', {'function' => \&t2h_default_uref, # 'args' => ['normal', 'normal', 'normal']}, 'url', {'function' => \&t2h_default_uref, 'args' => ['code', 'normal', 'normal']}, 'indicateurl', {'args' => ['code'], 'begin' => '<', 'end' => '>'}, 'var', {'attribute' => 'var'}, 'verb', {'args' => ['code'], 'attribute' => 'tt'}, 'titlefont', {'function' => \&t2h_default_titlefont}, 'w', {}, ); %unicode_diacritical = ( 'H' => '030B', 'ringaccent' => '030A', "'" => '0301', 'v' => '030C', ',' => '0327', '^' => '0302', 'dotaccent' => '0307', '`' => '0300', '=' => '0304', '~' => '0303', '"' => '0308', 'udotaccent' => '0323', 'ubaraccent' => '0332', 'u' => '0306' ); %unicode_accents = ( 'dotaccent' => { # dot above 'A' => '0226', #C moz-1.2 'a' => '0227', #c moz-1.2 'B' => '1E02', 'b' => '1E03', 'C' => '010A', 'c' => '010B', 'D' => '1E0A', 'd' => '1E0B', 'E' => '0116', 'e' => '0117', 'F' => '1E1E', 'f' => '1E1F', 'G' => '0120', 'g' => '0121', 'H' => '1E22', 'h' => '1E23', 'i' => '0069', 'I' => '0130', 'N' => '1E44', 'n' => '1E45', 'O' => '022E', #Y moz-1.2 'o' => '022F', #v moz-1.2 'P' => '1E56', 'p' => '1E57', 'R' => '1E58', 'r' => '1E59', 'S' => '1E60', 's' => '1E61', 'T' => '1E6A', 't' => '1E6B', 'W' => '1E86', 'w' => '1E87', 'X' => '1E8A', 'x' => '1E8B', 'Y' => '1E8E', 'y' => '1E8F', 'Z' => '017B', 'z' => '017C', }, 'udotaccent' => { # dot below 'B' => '1E04', 'b' => '1E05', 'D' => '1E0C', 'd' => '1E0D', 'E' => '1EB8', 'e' => '1EB9', 'H' => '1E24', 'h' => '1E25', 'I' => '1ECA', 'i' => '1ECB', 'K' => '1E32', 'k' => '1E33', 'L' => '1E36', 'l' => '1E37', 'M' => '1E42', 'm' => '1E43', 'N' => '1E46', 'n' => '1E47', 'O' => '1ECC', 'o' => '1ECD', 'R' => '1E5A', 'r' => '1E5B', 'S' => '1E62', 's' => '1E63', 'T' => '1E6C', 't' => '1E6D', 'U' => '1EE4', 'u' => '1EE5', 'V' => '1E7E', 'v' => '1E7F', 'W' => '1E88', 'w' => '1E89', 'Y' => '1EF4', 'y' => '1EF5', 'Z' => '1E92', 'z' => '1E93', }, 'ubaraccent' => { # line below 'B' => '1E06', 'b' => '1E07', 'D' => '1E0E', 'd' => '1E0F', 'h' => '1E96', 'K' => '1E34', 'k' => '1E35', 'L' => '1E3A', 'l' => '1E3B', 'N' => '1E48', 'n' => '1E49', 'R' => '1E5E', 'r' => '1E5F', 'T' => '1E6E', 't' => '1E6F', 'Z' => '1E94', 'z' => '1E95', }, ',' => { # cedilla 'C' => '00C7', 'c' => '00E7', 'D' => '1E10', 'd' => '1E11', 'E' => '0228', #C moz-1.2 'e' => '0229', #c moz-1.2 'G' => '0122', 'g' => '0123', 'H' => '1E28', 'h' => '1E29', 'K' => '0136', 'k' => '0137', 'L' => '013B', 'l' => '013C', 'N' => '0145', 'n' => '0146', 'R' => '0156', 'r' => '0157', 'S' => '015E', 's' => '015F', 'T' => '0162', 't' => '0163', }, '=' => { # macron 'A' => '0100', 'a' => '0101', 'E' => '0112', 'e' => '0113', 'I' => '012A', 'i' => '012B', 'G' => '1E20', 'g' => '1E21', 'O' => '014C', 'o' => '014D', 'U' => '016A', 'u' => '016B', 'Y' => '0232', #? moz-1.2 'y' => '0233', #? moz-1.2 }, '"' => { # diaeresis 'A' => '00C4', 'a' => '00E4', 'E' => '00CB', 'e' => '00EB', 'H' => '1E26', 'h' => '1E27', 'I' => '00CF', 'i' => '00EF', 'O' => '00D6', 'o' => '00F6', 't' => '1E97', 'U' => '00DC', 'u' => '00FC', 'W' => '1E84', 'w' => '1E85', 'X' => '1E8C', 'x' => '1E8D', 'y' => '00FF', 'Y' => '0178', }, 'u' => { # breve 'A' => '0101', 'a' => '0102', 'E' => '0114', 'e' => '0115', 'G' => '011E', 'g' => '011F', 'I' => '012C', 'i' => '012D', 'O' => '014E', 'o' => '014F', 'U' => '016C', 'u' => '016D', }, "'" => { # acute 'A' => '00C1', 'a' => '00E1', 'C' => '0106', 'c' => '0107', 'E' => '00C9', 'e' => '00E9', 'G' => '01F4', 'g' => '01F5', 'I' => '00CD', 'i' => '00ED', 'K' => '1E30', 'k' => '1E31', 'L' => '0139', 'l' => '013A', 'M' => '1E3E', 'm' => '1E3F', 'N' => '0143', 'n' => '0144', 'O' => '00D3', 'o' => '00F3', 'P' => '1E54', 'p' => '1E55', 'R' => '0154', 'r' => '0155', 'S' => '015A', 's' => '015B', 'U' => '00DA', 'u' => '00FA', 'W' => '1E82', 'w' => '1E83', 'Y' => '00DD', 'y' => '00FD', 'Z' => '0179', 'z' => '018A', }, '~' => { # tilde 'A' => '00C3', 'a' => '00E3', 'E' => '1EBC', 'e' => '1EBD', 'I' => '0128', 'i' => '0129', 'N' => '00D1', 'n' => '00F1', 'O' => '00D5', 'o' => '00F5', 'U' => '0168', 'u' => '0169', 'V' => '1E7C', 'v' => '1E7D', 'Y' => '1EF8', 'y' => '1EF9', }, '`' => { # grave 'A' => '00C0', 'a' => '00E0', 'E' => '00C8', 'e' => '00E8', 'I' => '00CC', 'i' => '00EC', 'N' => '01F8', 'n' => '01F9', 'O' => '00D2', 'o' => '00F2', 'U' => '00D9', 'u' => '00F9', 'W' => '1E80', 'w' => '1E81', 'Y' => '1EF2', 'y' => '1EF3', }, '^' => { # circumflex 'A' => '00C2', 'a' => '00E2', 'C' => '0108', 'c' => '0109', 'E' => '00CA', 'e' => '00EA', 'G' => '011C', 'g' => '011D', 'H' => '0124', 'h' => '0125', 'I' => '00CE', 'i' => '00EE', 'J' => '0134', 'j' => '0135', 'O' => '00D4', 'o' => '00F4', 'S' => '015C', 's' => '015D', 'U' => '00DB', 'u' => '00FB', 'W' => '0174', 'w' => '0175', 'Y' => '0176', 'y' => '0177', 'Z' => '1E90', 'z' => '1E91', }, 'ringaccent' => { # ring 'A' => '00C5', 'a' => '00E5', 'U' => '016E', 'u' => '016F', 'w' => '1E98', 'y' => '1E99', }, 'v' => { # caron 'A' => '01CD', 'a' => '01CE', 'C' => '010C', 'c' => '010D', 'D' => '010E', 'd' => '010F', 'E' => '011A', 'e' => '011B', 'G' => '01E6', 'g' => '01E7', 'H' => '021E', #K with moz-1.2 'h' => '021F', #k with moz-1.2 'I' => '01CF', 'i' => '01D0', 'K' => '01E8', 'k' => '01E9', 'L' => '013D', #L' with moz-1.2 'l' => '013E', #l' with moz-1.2 'N' => '0147', 'n' => '0148', 'O' => '01D1', 'o' => '01D2', 'R' => '0158', 'r' => '0159', 'S' => '0160', 's' => '0161', 'T' => '0164', 't' => '0165', 'U' => '01D3', 'u' => '01D4', 'Z' => '017D', 'z' => '017E', }, 'H' => { # double acute 'O' => '0150', 'o' => '0151', 'U' => '0170', 'u' => '0171', }, ); %special_accents = ( 'ringaccent' => 'aA', "'" => 'aeiouyAEIOUY', ',' => 'cC', '^' => 'aeiouAEIOU', '`' => 'aeiouAEIOU', '~' => 'nNaoAO', '"' => 'aeiouyAEIOU', ); #foreach my $accent_command ('tieaccent', 'dotless', keys(%unicode_accents), keys(%accent_map)) foreach my $accent_command ('tieaccent', 'dotless', keys(%unicode_accents)) { $style_map{$accent_command} = { 'function' => \&t2h_default_accent }; $old_style_map{$accent_command} = '&default_accent'; $style_map_texi{$accent_command} = { 'function' => \&t2h_default_ascii_accent }; } sub default_accent($$) { my $text = shift; my $accent = shift; return "&${text}$accent_map{$accent};" if (defined($accent_map{$accent}) and defined($special_accents{$accent}) and ($text =~ /^[$special_accents{$accent}]$/)); return '&' . $text . 'ring;' if (($accent eq 'ringaccent') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/)); return $text . '<' if ($accent eq 'v'); return "&${text}cedil;" if (($accent eq ',') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/)); return ascii_accents($text, $accent); } sub t2h_default_accent($$) { my $accent = shift; my $args = shift; my $text = $args->[0]; return "&${text}$accent_map{$accent};" if (defined($accent_map{$accent}) and defined($special_accents{$accent}) and ($text =~ /^[$special_accents{$accent}]$/)); return '&' . $text . 'ring;' if (($accent eq 'ringaccent') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/)); return $text . '<' if ($accent eq 'v'); return "&${text}cedil;" if (($accent eq ',') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/)); return ascii_accents($text, $accent); } sub ascii_accents($$) { my $text = shift; my $accent = shift; return $text if ($accent eq 'dotless'); return $text . $accent if (defined($accent_map{$accent})); return $text . "''" if ($accent eq 'H'); return $text . '.' if ($accent eq 'dotaccent'); return $text . '*' if ($accent eq 'ringaccent'); return $text . '[' if ($accent eq 'tieaccent'); return $text . '(' if ($accent eq 'u'); return $text . '_' if ($accent eq 'ubaraccent'); return '.' . $text if ($accent eq 'udotaccent'); return $text . '<' if ($accent eq 'v'); return $text . ',' if ($accent eq ','); } sub default_sc($$) { return '' . uc($_[0]) . ''; } sub t2h_default_sc($$$) { shift; my $args = shift; return '' . uc($args->[0]) . ''; } sub default_ctrl($$) { return "^$_[0]"; } sub t2h_default_ctrl($$$) { shift; my $args = shift; return "^$args->[0]"; } sub default_sc_pre($$) { return uc($_[0]); } sub t2h_default_sc_pre($$$) { shift; my $args = shift; return uc($args->[0]); } sub default_titlefont($$) { return "

    $_[0]

    " if ($_[0] =~ /\S/); return ''; } sub t2h_default_titlefont($$$) { shift; my $args = shift; return "

    $args->[0]

    " if ($args->[0] =~ /\S/); return ''; } # According to the texinfo manual this shouldn't lead to a link # but rather be formatted like text. If we did like makeinfo do # it would be #sub url($$) #{ # return '<' . $_[0] . '>'; #} sub t2h_default_url ($$) { shift; my $args = shift; my $url = shift @$args; #$url =~ s/\s*$//; #$url =~ s/^\s*//; $url = main::normalise_space($url); return '' unless ($url =~ /\S/); return &$anchor('', $url, $url); } sub default_url ($$) { my $url = shift; my $command = shift; $url =~ s/\s*$//; $url =~ s/^\s*//; return '' unless ($url =~ /\S/); return &$anchor('', $url, $url); } sub default_uref($$) { my $arg = shift; my $command = shift; my ($url, $text, $replacement); ($url, $text, $replacement) = split /,\s*/, $arg; $url =~ s/\s*$//; $url =~ s/^\s*//; $text = $replacement if (defined($replacement)); $text = $url unless ($text); return $text if ($url eq ''); return &$anchor('', $url, $text); } sub t2h_default_uref($$) { shift; my $args = shift; my $url = shift @$args; my $text = shift @$args; my $replacement = shift @$args; #$url =~ s/\s*$//; #$url =~ s/^\s*//; $url = main::normalise_space($url); $replacement = '' if (!defined($replacement)); $replacement = main::normalise_space($replacement); $text = '' if (!defined($text)); $text = main::normalise_space($text); $text = $replacement if ($replacement ne ''); $text = $url unless ($text ne ''); return $text if ($url eq ''); return &$anchor('', $url, $text); } sub default_email($$) { my $arg = shift; my $command = shift; my ($mail, $text); ($mail, $text) = split /,\s*/, $arg; $mail =~ s/\s*$//; $mail =~ s/^\s*//; $text = $mail unless ($text); return $text if ($mail eq ''); return &$anchor('', "mailto:$mail", $text); } sub t2h_default_email($$) { my $command = shift; my $args = shift; my $mail = shift @$args; my $text = shift @$args; $mail = main::normalise_space($mail); #$mail =~ s/\s*$//; #$mail =~ s/^\s*//; $text = $mail unless (defined($text) and ($text ne '')); $text = main::normalise_space($text); return $text if ($mail eq ''); return &$anchor('', "mailto:$mail", $text); } sub t2h_default_ascii_accent($$$$) { my $accent = shift; my $args = shift; my $text = $args->[0]; return ascii_accents($text, $accent); } sub t2h_default_no_texi_email { my $command = shift; my $args = shift; my $mail = shift @$args; my $text = shift @$args; $mail = main::normalise_space($mail); #$mail =~ s/\s*$//; #$mail =~ s/^\s*//; return $text if (defined($text) and ($text ne '')); return $mail; } sub t2h_default_no_texi_image($$$$) { my $command = shift; my $args = shift; my $text = $args->[0]; $text = main::normalise_space($text); my @args = split (/\s*,\s*/, $text); return $args[0]; } sub t2h_default_no_texi_acronym_like($$) { my $command = shift; my $args = shift; my $acronym_texi = $args->[0]; return (main::remove_texi($acronym_texi)); } sub t2h_remove_command($$$$) { return ''; } # This is used for style in preformatted sections my %old_style_map_pre = %old_style_map; $old_style_map_pre{'sc'} = '&default_sc_pre'; $old_style_map_pre{'titlefont'} = ''; foreach my $command (keys(%style_map)) { $style_map_pre{$command} = {}; $style_map_texi{$command} = {} if (!exists($style_map_texi{$command})); $style_map_texi{$command}->{'args'} = $style_map{$command}->{'args'} if (exists($style_map{$command}->{'args'})); #print STDERR "COMMAND $command"; foreach my $key (keys(%{$style_map{$command}})) { $style_map_pre{$command}->{$key} = $style_map{$command}->{$key}; } } $style_map_pre{'sc'}->{'function'} = \&t2h_default_sc_pre; $style_map_pre{'titlefont'} = {}; $style_map_texi{'sc'}->{'function'} = \&t2h_default_sc_pre; $style_map_texi{'email'}->{'function'} = \&t2h_default_no_texi_email; ####### special styles. You shouldn't need to change them my %special_style = ( #'xref' => ['keep','normal','normal','keep','normal'], 'xref' => { 'args' => ['keep','keep','keep','keep','keep'], 'function' => \&main::do_xref }, 'ref' => { 'args' => ['keep','keep','keep','keep','keep'], 'function' => \&main::do_xref }, 'pxref' => { 'args' => ['keep','keep','keep','keep','keep'], 'function' => \&main::do_xref }, 'inforef' => { 'args' => ['keep','keep','keep'], 'function' => \&main::do_xref }, 'image' => { 'args' => ['keep'], 'function' => \&main::do_image }, 'anchor' => { 'args' => ['keep'], 'function' => \&main::do_anchor_label }, 'footnote' => { 'args' => ['keep'], 'function' => \&main::do_footnote }, 'shortcaption' => { 'args' => ['keep'], 'function' => \&main::do_caption_shortcaption }, 'caption' => { 'args' => ['keep'], 'function' => \&main::do_caption_shortcaption }, 'acronym', {'args' => ['keep','keep'], 'function' => \&main::do_acronym_like}, 'abbr', {'args' => ['keep','keep'], 'function' => \&main::do_acronym_like}, ); # FIXME the unless defined(.... are now unusefull because the user can # overwrite. # @image is replaced by the first arg in strings $style_map_texi{'image'} = { 'args' => ['keep'], 'function' => \&t2h_default_no_texi_image } unless (defined($style_map_texi{'image'})); $style_map_texi{'acronym'} = { 'args' => ['keep','keep'], 'function' => \&t2h_default_no_texi_acronym_like }; $style_map_texi{'abbr'} = { 'args' => ['keep','keep'], 'function' => \&t2h_default_no_texi_acronym_like }; foreach my $special (keys(%special_style)) { $style_map{$special} = $special_style{$special} unless (defined($style_map{$special})); $style_map_pre{$special} = $special_style{$special} unless (defined($style_map_pre{$special})); $style_map_texi{$special} = { 'args' => ['keep'], 'function' => \&t2h_remove_command } unless (defined($style_map_texi{$special})); } ####### end special styles. #foreach my $command (keys(%style_map)) #{ # print STDERR "STYLE_MAP_TEXI $command($style_map_texi{$command}) "; # print STDERR "ARGS $style_map_texi{$command}->{'args'} " if (defined($style_map_texi{$command}->{'args'})); # print STDERR "FUN $style_map_texi{$command}->{'function'} " if (defined($style_map_texi{$command}->{'function'})); # print STDERR "\n"; #} # uncomment to use the old interface #%style_map = %old_style_map; #%style_map_pre = %old_style_map_pre; #FIXME USE_ISO ? %unformatted_text_simple_map_texi = %simple_map_pre; %unformatted_text_texi_map = %pre_map; %unformatted_text_style_map_texi = (); foreach my $command (keys(%style_map_texi)) { #$unformatted_text_style_map_texi{$command} = {}; foreach my $key (keys (%{$style_map_texi{$command}})) { #print STDERR "$command, $key, $style_map_texi{$command}->{$key}\n"; $unformatted_text_style_map_texi{$command}->{$key} = $style_map_texi{$command}->{$key}; } $unformatted_text_style_map_texi{$command} = {} if (!defined($unformatted_text_style_map_texi{$command})); } foreach my $accent_command ('tieaccent', 'dotless', keys(%unicode_accents)) { # $unformatted_text_style_map_texi{$accent_command}->{'args'} = ['normal']; $unformatted_text_style_map_texi{$accent_command}->{'function'} = \&t2h_default_accent; } %format_map = ( # 'quotation' => 'blockquote', # lists # 'itemize' => 'ul', 'enumerate' => 'ol', 'multitable' => 'table', 'table' => 'dl compact="compact"', 'vtable' => 'dl compact="compact"', 'ftable' => 'dl compact="compact"', 'group' => '', ); %special_list_commands = ( 'table' => {}, 'vtable' => {}, 'ftable' => {}, 'itemize' => { 'bullet' => '' } ); # # texinfo format to align attribute of paragraphs # %paragraph_style = ( 'center' => 'center', 'flushleft' => 'left', 'flushright' => 'right', ); # an eval of these $complex_format_map->{what}->{'begin'} yields beginning # an eval of these $complex_format_map->{what}->{'end'} yields end # $EXAMPLE_INDENT_CELL and SMALL_EXAMPLE_INDENT_CELL can be usefull here # FIXME add \n at the end ? $complex_format_map = { 'example' => { 'begin' => q{"
    ' . &$I('Button') . " ' . &$I('Name') . " ' . &$I('Go to') . " ' . &$I('From 1.2.3 go to') . "
    "; $about .= ($ICONS && $ACTIVE_ICONS{$button} ? &$button_icon_img($button, $ACTIVE_ICONS{$button}) : ' [' . $NAVIGATION_TEXT{$button} . '] '); $about .= "$BUTTONS_GOTO{$button} $BUTTONS_EXAMPLE{$button}
    $EXAMPLE_INDENT_CELL
    "}, 'end' => q{'
    '}, }, 'smallexample' => { 'begin' => q{"$SMALL_EXAMPLE_INDENT_CELL
    "}, 'end' => q{'
    '}, }, 'display' => { 'begin' => q{"$EXAMPLE_INDENT_CELL
    "}, 'end' => q{'
    '}, }, 'smalldisplay' => { 'begin' => q{"$SMALL_EXAMPLE_INDENT_CELL
    "}, 'end' => q{'
    '}, } }; # format shouldn't narrow the margins $complex_format_map->{'lisp'} = $complex_format_map->{'example'}; $complex_format_map->{'smalllisp'} = $complex_format_map->{'smallexample'}; $complex_format_map->{'format'} = $complex_format_map->{'display'}; $complex_format_map->{'smallformat'} = $complex_format_map->{'smalldisplay'}; %def_map = ( # basic commands 'deffn', [ 'f', 'category', 'name', 'arg' ], 'defvr', [ 'v', 'category', 'name' ], 'deftypefn', [ 'f', 'category', 'type', 'name', 'arg' ], 'deftypeop', [ 'f', 'category', 'class' , 'type', 'name', 'arg' ], 'deftypevr', [ 'v', 'category', 'type', 'name' ], 'defcv', [ 'v', 'category', 'class' , 'name' ], 'deftypecv', [ 'v', 'category', 'class' , 'type', 'name' ], 'defop', [ 'f', 'category', 'class' , 'name', 'arg' ], 'deftp', [ 't', 'category', 'name', 'arg' ], # basic x commands # shortcuts # i18n 'defun', 'deffn Function', 'defmac', 'deffn Macro', 'defspec', 'deffn {Special Form}', 'defvar', 'defvr Variable', 'defopt', 'defvr {User Option}', 'deftypefun', 'deftypefn {Function}', 'deftypevar', 'deftypevr Variable', 'defivar', 'defcv {Instance Variable}', 'deftypeivar', 'deftypecv {Instance Variable}', 'defmethod', 'defop Method', 'deftypemethod', 'deftypeop Method', ); foreach my $key (keys(%def_map)) { $def_map{$key . 'x'} = $def_map{$key}; } # # miscalleneous commands # # Depending on the value, the command arg or spaces following the command # are handled differently: # # the value is a reference on a hash. # the hash keys are # 'arg' if the value is 'line' then the remaining of the line is the arg # if it is a number it is the number of args (separated by spaces) # 'skip' if the value is 'line' then the remaining of the line is skipped # if the value is 'space' space but no newline is skipped # if the value is 'whitespace' space is skipped # if the value is 'linewhitespace' space is skipped if there are # only spaces remaining on the line # if the value is 'linespace' space but no newline is skipped if # there are only spaces remaining on the line # 'texi' if true it is some texinfo code and @value and @macros are expanded # 'keep' if true the args and the macro are kept, otherwise the macro # args and skipped stuffs are removed %misc_command = ( # not needed for formatting 'raisesections' => {'skip' => 'line'}, # no arg 'lowersections' => {'skip' => 'line'}, # no arg 'contents' => {}, # no arg 'shortcontents' => {}, # no arg 'summarycontents'=> {}, # no arg 'detailmenu' => {'skip' => 'whitespace'}, # no arg 'end detailmenu' => {'skip' => 'space'}, # no arg #'end detailmenu', 1, # no arg 'bye' => {'skip' => 'line'}, # no arg # comments 'comment' => {'arg' => 'line'}, 'c' => {'arg' => 'line'}, #'c'=> {'arg' => 'line', 'keep' => 1}, # in preamble 'novalidate' => {}, # no arg 'dircategory'=> {'skip' => 'line'}, # line. Position with regard # with direntry is significant 'pagesizes' => {'skip' => 'line', 'arg' => 2}, # can have 2 args 'finalout' => {}, # no arg 'paragraphindent' => {'skip' => 'line', 'arg' => 1}, # arg none asis # or a number and forbids anything else on the line 'firstparagraphindent' => {'skip' => 'line', 'arg' => 1}, # none insert 'exampleindent' => {'skip' => 'line', 'arg' => 1}, # asis or a number 'footnotestyle'=> {'skip' => 'line', 'arg' => 1}, # end and separate # and nothing else on the line 'afourpaper' => {'skip' => 'line'}, # no arg 'afourlatex' => {'skip' => 'line'}, # no arg 'afourwide' => {'skip' => 'line'}, # no arg 'headings'=> {'skip' => 'line', 'arg' => 1}, #off on single double singleafter doubleafter # interacts with setchapternewpage 'setchapternewpage' => {'skip' => 'line', 'arg' => 1}, # off on odd 'everyheading' => {'arg' => 'line'}, 'everyfooting' => {'arg' => 'line'}, 'evenheading' => {'arg' => 'line'}, 'evenfooting' => {'arg' => 'line'}, 'oddheading' => {'arg' => 'line'}, 'oddfooting' => {'arg' => 'line'}, 'smallbook' => {'skip' => 'line'}, # no arg 'setfilename' => {'arg' => 'line'}, 'shorttitle' => {'arg' => 'line', 'texi' => 1}, 'shorttitlepage' => {'arg' => 'line', 'texi' => 1}, 'settitle' => {'arg' => 'line', 'texi' => 1}, 'author' => {'arg' => 'line', 'texi' => 1}, 'subtitle' => {'arg' => 'line', 'texi' => 1}, 'title' => {'arg' => 'line', 'texi' => 1}, 'syncodeindex' => {'skip' => 'linespace', 'arg' => 2}, # args are index identifiers 'synindex' => {'skip' => 'linespace', 'arg' => 2}, 'defindex' => {'skip' => 'line', 'arg' => 1}, # one identifier arg 'defcodeindex' => {'skip' => 'line', 'arg' => 1}, # one identifier arg 'documentlanguage' => {'skip' => 'whitespace', 'arg' => 1}, # language code arg 'kbdinputstyle' => {'skip' => 'whitespace', 'arg' => 1}, # code #example distinct 'sp' => {'skip' => 'whitespace', 'arg' => 1}, # no arg # at the end of line or a numerical arg # formatting 'page' => {}, # no arg (pagebreak) 'refill' => {}, # no arg (obsolete, to be ignored) 'noindent' => {'skip' => 'space'}, # no arg 'need' => {'skip' => 'line', 'arg' => 1}, # one numerical/real arg 'exdent' => {'skip' => 'space'}, # not valid for info (should be in @iftex) 'vskip' => {'arg' => 'line'}, # arg line in TeX 'cropmarks' => {}, # no arg # miscalleneous 'verbatiminclude'=> {'skip' => 'line'}, 'noindent' => {'skip' => 'space'}, 'documentencoding' => {'arg' => 1}, # ??? 'filbreak' => {}, ); my %misc_command_old = ( # not needed for formatting 'raisesections', 'line', # no arg 'lowersections', 'line', # no arg 'contents', 1, # no arg 'shortcontents', 1, # no arg 'summarycontents', 1, # no arg 'detailmenu', 'whitespace', # no arg 'end detailmenu', 'space', # no arg #'end detailmenu', 1, # no arg 'novalidate', 1, # no arg 'bye', 'line', # no arg # comments 'comment', 'line', 'c', 'line', # in preamble 'dircategory', 'line', # line. Position with regard with direntry is # significant 'pagesizes', 'line arg2', # can have 2 args 'finalout', 1, # no arg 'paragraphindent', 'line arg1', # in fact accepts only none asis # or a number and forbids anything else on the line 'firstparagraphindent', 'line arg1', # in fact accepts only none insert 'exampleindent', 'line arg1', # in fact accepts only asis or a number 'footnotestyle', 'line arg1', # in fact accepts only end and separate # and nothing else on the line 'afourpaper', 'line', # no arg 'afourlatex', 'line', # no arg 'afourwide', 'line', # no arg 'headings', 'line', # one arg, possibilities are #off on single double singleafter doubleafter # interacts with setchapternewpage 'setchapternewpage', 'line', # no arg 'everyheading', 'line', 'everyfooting', 'line', 'evenheading', 'line', 'evenfooting', 'line', 'oddheading', 'line', 'oddfooting', 'line', 'smallbook', 'line', # no arg 'setfilename', 'line', 'shorttitle', 'linetexi', 'shorttitlepage', 'linetexi', 'settitle', 'linetexi', 'author', 'linetexi', 'subtitle', 'linetexi', 'title','linetexi', 'syncodeindex','linespace arg2', # args are 'synindex','linespace arg2', 'defindex', 'line arg1', # one identifier arg 'defcodeindex', 'line arg1', # one identifier arg 'documentlanguage', 'whitespace arg1', # one language code arg 'kbdinputstyle', 'whitespace arg1', # one arg within #code example distnct 'sp', 'whitespace arg1', # no arg at the en of line or a numerical arg # formatting 'page', 1, # no arg (pagebreak) 'refill', 1, # no arg (obsolete, to be ignored)) 'noindent', 'space', # no arg 'need', 'line arg1', # one numerical/real arg 'exdent', 'space', # not valid for info (should be in @iftex) 'vskip', 'line', # arg line in TeX 'cropmarks', 1, # no arg # miscalleneous 'verbatiminclude', 'line', 'documentencoding', 'arg1', # ??? 'filbreak', 1, ); %format_in_paragraph = ( 'group' => 1, 'html' => 1, ); # map mapping css specification to style %css_map = ( 'ul.toc' => "$TOC_LIST_STYLE", 'pre.menu-comment' => "$MENU_PRE_STYLE", 'pre.menu-preformatted' => "$MENU_PRE_STYLE", 'a.summary-letter' => 'text-decoration: none', 'pre.display' => 'font-family: serif', 'pre.smalldisplay' => 'font-family: serif; font-size: smaller', 'pre.smallexample' => 'font-size: smaller', 'span.sansserif' => 'font-family:sans-serif; font-weight:normal;' ); $css_map{'pre.format'} = $css_map{'pre.display'}; $css_map{'pre.smallformat'} = $css_map{'pre.smalldisplay'}; $css_map{'pre.smalllisp'} = $css_map{'pre.smallexample'}; # formatting functions $anchor = \&t2h_default_anchor; $def_item = \&t2h_default_def_item; $def = \&t2h_default_def; $menu = \&t2h_default_menu; $menu_link = \&t2h_default_menu_link; $menu_comment = \&t2h_default_menu_comment; $menu_description = \&t2h_default_menu_description; $simple_menu_link = \&t2h_default_simple_menu_link; $external_ref = \&t2h_default_external_ref; $external_href = \&t2h_default_external_href; $internal_ref = \&t2h_default_internal_ref; $table_item = \&t2h_default_table_item; $table_line = \&t2h_default_table_line; $table_list = \&t2h_default_table_list; $row = \&t2h_default_row; $cell = \&t2h_default_cell; $list_item = \&t2h_default_list_item; $comment = \&t2h_default_comment; $def_line = \&t2h_default_def_line; $def_line_no_texi = \&t2h_default_def_line_no_texi; $raw = \&t2h_default_raw; $heading = \&t2h_default_heading; $paragraph = \&t2h_default_paragraph; $preformatted = \&t2h_default_preformatted; $foot_line_and_ref = \&t2h_default_foot_line_and_ref; $foot_section = \&t2h_default_foot_section; $image = \&t2h_default_image; $address = \&t2h_default_address; $index_entry_label = \&t2h_default_index_entry_label; $index_summary = \&t2h_default_index_summary; $summary_letter = \&t2h_default_summary_letter; $index_entry = \&t2h_default_index_entry; $index_letter = \&t2h_default_index_letter; $print_index = \&t2h_default_print_index; $protect_text = \&t2h_default_protect_text; $complex_format = \&t2h_default_complex_format; $cartouche = \&t2h_default_cartouche; $sp = \&t2h_default_sp; $definition_category = \&t2h_default_definition_category; $copying_comment = \&t2h_default_copying_comment; $index_summary_file_entry = \&t2h_default_index_summary_file_entry; $index_summary_file_end = \&t2h_default_index_summary_file_end; $index_summary_file_begin = \&t2h_default_index_summary_file_begin; $empty_line = \&t2h_default_empty_line; $unknown = \&t2h_default_unknown; $unknown_style = \&t2h_default_unknown_style; $caption_shortcaption = \&t2h_caption_shortcaption; $float = \&t2h_default_float; $listoffloats = \&t2h_default_listoffloats; $listoffloats_entry = \&t2h_default_listoffloats_entry; $listoffloats_caption = \&t2h_default_listoffloats_caption; $listoffloats_float_style = \&t2h_default_listoffloats_float_style; $listoffloats_style = \&t2h_default_listoffloats_style; $acronym_like = \&t2h_default_acronym_like; $quotation = \&t2h_default_quotation; $quotation_prepend_text = \&t2h_default_quotation_prepend_text; $paragraph_style_command = \&t2h_default_paragraph_style_command; # This function is called whenever a complex format is processed # # arguments: # name of the format # text appearing inside the format # # an eval of $complex_format->{format name}->{'begin'} should lead to the # beginning of the complex format, an eval of # $complex_format->{format name}->{'end'} should lead to the end of the # complex format. sub t2h_default_complex_format($$) { my $name = shift; my $text = shift; return '' if ($text eq ''); my $beginning = eval "$complex_format_map->{$name}->{'begin'}"; if ($@ ne '') { print STDERR "$ERROR Evaluation of $complex_format_map->{$name}->{'begin'}: $@"; $beginning = ''; } my $end = eval "$complex_format_map->{$name}->{'end'}"; if ($@ ne '') { print STDERR "$ERROR Evaluation of $complex_format_map->{$name}->{'end'}: $@"; $end = ''; } return $beginning . $text . $end; } sub t2h_default_empty_line($) { my $text = shift; return $text; } sub t2h_default_unknown($$) { my $macro = shift; my $line = shift; my ($result_line, $result, $result_text, $message); return ($line, 0, undef, undef); } sub t2h_default_unknown_style($$) { my $command = shift; my $text = shift; my ($result, $result_text, $message); return (0, undef, undef); } sub t2h_caption_shortcaption($) { my $float = shift; my $caption_lines; my $shortcaption_lines; my $style = $float->{'style_texi'}; if (defined($float->{'nr'})) { my $nr = $float->{'nr'}; if ($style ne '') { $style = &$I('%{style} %{number}', { 'style' => $style, 'number' => $nr}); } else { $style = $nr; } } if (defined($float->{'caption_texi'})) { @$caption_lines = @{$float->{'caption_texi'}}; if (defined($style)) { $caption_lines->[0] = '@strong{' . &$I('%{style}: %{caption_first_line}', { 'style' => $style, 'caption_first_line' => $caption_lines->[0] }); } else { $caption_lines->[0] = '@strong{' . $caption_lines->[0]; } push @$caption_lines, "}\n"; } elsif (defined($style)) { $caption_lines->[0] = '@strong{' . $style . '}' . "\n"; } if (defined($float->{'shortcaption_texi'})) { @$shortcaption_lines = @{$float->{'shortcaption_texi'}}; if (defined($style)) { $shortcaption_lines->[0] = '@strong{' . &$I('%{style}: %{shortcaption_first_line}', { 'style' => $style, 'shortcaption_first_line' => $shortcaption_lines->[0] }); } else { $shortcaption_lines->[0] = '@strong{' . $shortcaption_lines->[0]; } push @$shortcaption_lines, "}\n"; } elsif (defined($style)) { $shortcaption_lines->[0] = '@strong{' . $style . '}' . "\n"; } return ($caption_lines, $shortcaption_lines); } sub t2h_default_float($$$$$) { my $text = shift; my $float = shift; my $caption = shift; my $shortcaption = shift; my $label = ''; if (exists($float->{'id'})) { $label = &$anchor($float->{'id'}); } my $caption_text = ''; if (defined($float->{'caption_texi'})) { $caption_text = $caption; } elsif (defined($float->{'shortcaption_texi'})) { $caption_text = $shortcaption; } elsif (defined($caption)) { $caption_text = $caption; } return '

    ' . "$label\n" . $text . '
    ' . $caption_text; } sub t2h_default_listoffloats_style($) { my $style_texi = shift; return ($style_texi); } sub t2h_default_listoffloats_float_style($$) { my $style_texi = shift; my $float = shift; my $style = $float->{'style_texi'}; if (defined($float->{'nr'})) { my $nr = $float->{'nr'}; if ($style ne '') { $style = &$I('%{style} %{number}', { 'style' => $style, 'number' => $nr}); } else { $style = $nr; } } return $style; } sub t2h_default_listoffloats_caption($) { my $float = shift; if (defined($float->{'shortcaption_texi'})) { return [ @{$float->{'shortcaption_texi'}} ]; } elsif (defined($float->{'caption_texi'})) { return [ @{$float->{'caption_texi'}} ]; } return [ ]; } sub t2h_default_listoffloats_entry($$$$) { my $style_texi = shift; my $float = shift; my $float_style = shift; my $caption = shift; my $href = shift; return '
    ' . &$anchor('', $href, $float_style) . '
    ' . $caption . '
    ' . "\n"; } sub t2h_default_listoffloats($$$) { my $style_texi = shift; my $style = shift; my $float_entries = shift; my $result = "
    \n" ; foreach my $float_entry (@$float_entries) { $result .= $float_entry; } return $result . "
    \n"; } # This function is used to protect characters which are special in html # in inline text: &, ", <, and >. # # argument: # text to be protected sub t2h_default_protect_text($) { my $text = shift; $text =~ s/&/&/g; $text =~ s//>/g; $text =~ s/\"/"/g; return $text; } # This function produces an anchor # # arguments: # $name : anchor name # $href : anchor href # text : text displayed # extra_attribs : added to anchor attributes list sub t2h_default_anchor($;$$$) { my $name = shift; my $href = shift; my $text = shift; my $attributes = shift; #print STDERR "!$name!$href!$text!$attributes!\n"; if (!defined($attributes) or ($attributes !~ /\S/)) { $attributes = ''; } else { $attributes = ' ' . $attributes; } $name = '' if (!defined($name) or ($name !~ /\S/)); $href = '' if (!defined($href) or ($href !~ /\S/)); $text = '' if (!defined($text)); return $text if (($name eq '') and ($href eq '')); $name = "name=\"$name\"" if ($name ne ''); $href = "href=\"$href\"" if ($href ne ''); $href = ' ' . $href if (($name ne '') and ($href ne '')); #print STDERR "!!!$name!$href!$text!$attributes!\n"; return "$text"; } # This function is used to format the text associated with a @deff/@end deff # # argument: # text # # $DEF_TABLE should be used to distinguish between @def formatted as table # and as definition lists. sub t2h_default_def_item($) { my $text = shift; if ($text =~ /\S/) { if (! $DEF_TABLE) { return '
    ' . $text . '
    '; } else { return '' . $text . ''; } } return ''; } sub t2h_default_definition_category($$$) { my $name = shift; my $class = shift; my $style = shift; # print STDERR "definition_category $name, class $class, style $style\n"; return undef if (!defined($name) or $name =~ /^\s*$/); return ($name) if (!defined($class) or $class =~ /^\s*$/); if ($style eq 'f') { return &$I('%{name} on %{class}', { 'name' => $name, 'class' => $class }); } elsif ($style eq 'v') { return &$I('%{name} of %{class}', { 'name' => $name, 'class' => $class }); } else { return $name; } } # format the container for the @deffn line and text # # argument # text of the whole @def, line and associated text. # # $DEF_TABLE should be used. sub t2h_default_def($) { my $text = shift; if ($text =~ /\S/) { if (! $DEF_TABLE) { return "
    \n" . $text . "
    \n"; } else { return "\n" . $text . "
    \n"; } } return ''; } # a whole menu # # argument: # the whole menu text (entries and menu comments) # # argument: # whole menu text. sub t2h_default_menu($) { my $text = shift; if ($text =~ /\S/) { return "\n" . $text . "
    \n"; } } # a simple menu entry ref in case we aren't in a standard menu context sub t2h_default_simple_menu_link($$$$$$) { my $entry = shift; my $preformatted = shift; my $href = shift; my $node = shift; my $name = shift; my $ending = shift; $ending = '' if (!defined($ending)); if (($entry eq '') or $NODE_NAME_IN_MENU or $preformatted) { $name .= ':' if ($name ne ''); $entry = "$MENU_SYMBOL$name$node"; } $entry = &$anchor('', $href, $entry) if ($href); $entry .= $ending if ($preformatted); return $entry . ' '; } # formats a menu entry link pointing to a node or section # # arguments: # the entry text # the state, a hash reference holding informations about the context, with a # usefull entry, 'preformatted', true if we are in a preformatted format # (a format keeping space between words). In that case a function # of the main program, main::do_preformatted($text, $state) might # be used to format the text with the current format style. # href is optionnal. It is the reference to the section or the node anchor # which should be used to make the link (typically it is the argument # of a href= attribute in a element). sub t2h_default_menu_link($$$$$$) { my $entry = shift; my $state = shift; my $href = shift; my $node = shift; my $name = shift; my $ending = shift; if (($entry eq '') or $NODE_NAME_IN_MENU or $state->{'preformatted'}) { $name .= ':' if ($name ne ''); $entry = "$MENU_SYMBOL$name$node"; } $entry = &$anchor ('', $href, $entry) if (defined($href)); if ($state->{'preformatted'}) { return '' . main::do_preformatted($entry . $ending, $state); } return "$entry  "; } # formats a menu entry description, ie the text appearing after the node # specification in a menu entry an spanning until there is another # menu entry, an empty line or some text at the very beginning of the line # (we consider that text at the beginning of the line begins a menu comment) # # arguments: # the description text # the state. See menu_entry. sub t2h_default_menu_description($$) { my $text = shift; my $state = shift; if ($state->{'preformatted'}) { return main::do_preformatted($text, $state) . ''; } return "$text\n"; } # a menu comment (between menu lines) # formats the container of a menu comment. A menu comment is any text # appearing between menu lines, either separated by an empty line from # the preceding menu entry, or a text beginning at the first character # of the line (text not at the very beginning of the line is considered to # be the continuation of a menu entry description text). # # The text itself is considered to be in a preformatted environment # with name 'menu-commment' and with style $MENU_PRE_STYLE. # # argument # text contained in the menu comment. sub t2h_default_menu_comment($) { my $text = shift; if ($text =~ /\S/) { return "$text"; } return ''; } # Construct a href to an external source of information. # node is the node with texinfo @-commands # node_id is the node transformed such that it is unique and can be used to # make an html cross ref as explained in the texinfo manual # file is the file in '(file)node' sub t2h_default_external_href($$$) { my $node = shift; my $node_id = shift; my $node_xhtml_id = shift; my $file = shift; $file = '' if (!defined($file)); my $target_split = $EXTERNAL_CROSSREF_SPLIT; if ($file ne '') { if ($NEW_CROSSREF_STYLE) { $file =~ s/\.[^\.]*$//; $file =~ s/^.*\///; my $href; if (exists($Texi2HTML::THISDOC{'htmlxref'}->{$file})) { $target_split = $Texi2HTML::THISDOC{'htmlxref'}->{$file}->{'split'}; $href = $Texi2HTML::THISDOC{'htmlxref'}->{$file}->{'href'}; } if ($target_split) { if (defined($href)) { $file = "$href"; } elsif (defined($EXTERNAL_DIR)) { $file = "$EXTERNAL_DIR/$file"; } elsif ($SPLIT) { $file = "../$file"; } $file .= "/"; } else {# target not split if (defined($href)) { $file = "$href"; } else { if (defined($EXTERNAL_DIR)) { $file = "$EXTERNAL_DIR/$file"; } elsif ($SPLIT) { $file = "../$file"; } $file .= "." . $NODE_FILE_EXTENSION; } } } else { $file .= "/"; if (defined($EXTERNAL_DIR)) { $file = $EXTERNAL_DIR . $file; } else { $file = '../' . $file; } } } else { # here we necessarily have a ref to a node in the document, but the # node is invalid if ($NEW_CROSSREF_STYLE) { if (!$SPLIT) { $file = $TOP_FILE; } } } if ($node eq '') { if ($NEW_CROSSREF_STYLE) { if ($SPLIT) { return $file . $TOP_NODE_FILE . '.' . $NODE_FILE_EXTENSION . '#Top'; # or ? #return $file . '#Top'; } else { return $file . '#Top'; } } else { return $file; } } my $target; if ($NEW_CROSSREF_STYLE) { $node = $node_id; $target = $node_xhtml_id; } else { $node = main::remove_texi($node); $node =~ s/[^\w\.\-]/-/g; } my $file_basename = $node; $file_basename = $TOP_NODE_FILE if ($node =~ /^top$/i); if ($NEW_CROSSREF_STYLE) { if ($SPLIT) { return $file . $file_basename . ".$NODE_FILE_EXTENSION" . '#' . $target; } else { return $file . '#' . $target; } } else { return $file . $file_basename . ".$NODE_FILE_EXTENSION"; } } # format a reference external to the generated manual. This produces a full # reference with introductive words and the reference itself. # # arguments: # type of the reference: xref (reference at the beginning of a sentence), # pxref (reference in a parenthesis), # section in the book. This might be undef. # book name. # node and file name formatted according to the convention used in info # '(file)node' and no node means the Top node. # href linking to the html page containing the referenced node. A typical # use for this href is a href attribute in an element # an optionnal cross reference name sub t2h_default_external_ref($$$$$$) { my $type = shift; my $section = shift; my $book = shift; my $file_node = shift; my $href = shift; my $cross_ref = shift; $file_node = "$cross_ref: $file_node" if (($file_node ne '') and ($cross_ref ne '')); $file_node = &$anchor('', $href, $file_node) if ($file_node ne ''); # Yes, this is ugly, but this helps internationalization if ($type eq 'pxref') { if (($book ne '') and ($file_node ne '')) { return &$I('see %{node_file_href} section `%{section}\' in @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book, 'section' => $section }) if ($section ne ''); return &$I('see %{node_file_href} @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book }); } elsif ($book ne '') { return &$I('see section `%{section}\' in @cite{%{book}}', { 'book' => $book, 'section' => $section }) if ($section ne ''); return &$I('see @cite{%{book}}', { 'book' => $book }); } elsif ($file_node ne '') { return &$I('see %{node_file_href}', { 'node_file_href' => $file_node }); } } if ($type eq 'xref') { if (($book ne '') and ($file_node ne '')) { return &$I('See %{node_file_href} section `%{section}\' in @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book, 'section' => $section }) if ($section ne ''); return &$I('See %{node_file_href} @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book }); } elsif ($book ne '') { return &$I('See section `%{section}\' in @cite{%{book}}', { 'book' => $book, 'section' => $section }) if ($section ne ''); return &$I('See @cite{%{book}}', { 'book' => $book }); } elsif ($file_node ne '') { return &$I('See %{node_file_href}', { 'node_file_href' => $file_node }); } } if ($type eq 'ref') { if (($book ne '') and ($file_node ne '')) { return &$I('%{node_file_href} section `%{section}\' in @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book, 'section' => $section }) if ($section ne ''); return &$I('%{node_file_href} @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book }); } elsif ($book ne '') { return &$I('section `%{section}\' in @cite{%{book}}', { 'book' => $book, 'section' => $section }) if ($section ne ''); return &$I('@cite{%{book}}', { 'book' => $book }); } elsif ($file_node ne '') { return &$I('%{node_file_href}', { 'node_file_href' => $file_node }); } } return ''; } # format a reference to a node or a section in the generated manual. This # produces a full reference with introductive words and the reference itself. # # arguments: # type of the reference: xref (reference at the beginning of a sentence), # pxref (reference in a parenthesis), # href linking to the html page containing the node or the section. A typical # use for this href is a href attribute in an element # short name for this reference # name for this reference # boolean true if the reference is a reference to a section # # $SHORT_REF should be used. sub t2h_default_internal_ref($$$$$) { my $type = shift; my $href = shift; my $short_name = shift; my $name = shift; my $is_section = shift; if (! $SHORT_REF) { $name = &$anchor('', $href, $name); if ($type eq 'pxref') { return &$I('see section %{reference_name}', { 'reference_name' => $name }) if ($is_section); return &$I('see %{reference_name}', { 'reference_name' => $name }); } elsif ($type eq 'xref') { return &$I('See section %{reference_name}', { 'reference_name' => $name }) if ($is_section); return &$I('See %{reference_name}', { 'reference_name' => $name }); } elsif ($type eq 'ref') { return &$I('%{reference_name}', { 'reference_name' => $name }); } } else { $name = &$anchor('', $href, $short_name); if ($type eq 'pxref') { return &$I('see %{reference_name}', { 'reference_name' => $name }); } elsif ($type eq 'xref') { return &$I('See %{reference_name}', { 'reference_name' => $name }); } elsif ($type eq 'ref') { return &$I('%{reference_name}', { 'reference_name' => $name }); } } return ''; } # text after @item in table, vtable and ftable sub t2h_default_table_item($$$$$) { my $text = shift; my $index_label = shift; my $format = shift; my $command = shift; my $formatted_command = shift; $formatted_command = '' if (!defined($formatted_command) or exists($special_list_commands{$format}->{$command})); $text .= "\n" . $index_label if (defined($index_label)); return '
    ' . $formatted_command . $text . '
    ' . "\n"; } # format text on the line following @item (in table, vtable and ftable) sub t2h_default_table_line($) { my $text = shift; if ($text =~ /\S/) { return '
    ' . $text . '
    ' . "\n"; } return ''; } # row in multitable sub t2h_default_row($$) { my $text = shift; my $macro = shift; if ($text =~ /\S/) { if ($macro eq 'headitem') { return '' . $text . '' . "\n"; } return '' . $text . '' . "\n"; } return ''; } # cell in multitable sub t2h_default_cell($$) { my $text = shift; my $row_macro = shift; if ($row_macro eq 'headitem') { return '' . $text . ''; } return '' . $text . ''; } # format an item in a list # # argument: # text of the item # format of the list (itemize or enumerate) # command passed as argument to the format # formatted_command leading command formatted, if it is a thing command sub t2h_default_list_item($$$$$$$) { my $text = shift; my $format = shift; my $command = shift; my $formatted_command = shift; my $item_nr = shift; my $enumerate_style = shift; my $number = shift; $formatted_command = '' if (!defined($formatted_command) or exists($special_list_commands{$format}->{$command})); if ($text =~ /\S/) { return '
  • ' . $formatted_command . $text . '
  • '; } return ''; } sub t2h_default_table_list($$$$$$) { my $format = shift; my $text = shift; my $command = shift; my $formatted_command = shift; my $item_nr = shift; my $enumerate_style = shift; my $number = shift; $formatted_command = '' if (!defined($formatted_command) or exists($special_list_commands{$format}->{$command})); if ($format eq 'itemize') { return "
      \n" . $text . "
    \n" if ($command eq 'bullet'); return "\n" . $text . "\n"; } } # an html comment sub t2h_default_comment($) { my $text = shift; while ($text =~ /-->/) # --> ends an html comment ! { $text =~ s/-->/->/go; } return '' . "\n"; } # a paragraph # arguments: # $text of the paragraph # $align for the alignement # The following is usefull if the paragraph is in an itemize. # $paragraph_command is the leading formatting command (like @minus) # $paragraph_command_formatted is the leading formatting command formatted # $paragraph_number is a reference on the number of paragraphs appearing # in the format. The value should be increased if a paragraph is done # $format is the format name (@itemize) sub t2h_default_paragraph($$$$$$$$$) { my $text = shift; my $align = shift; my $paragraph_command = shift; my $paragraph_command_formatted = shift; my $paragraph_number = shift; my $format = shift; my $item_nr = shift; my $enumerate_style = shift; my $number = shift; #print STDERR "format: $format\n" if (defined($format)); $paragraph_command_formatted = '' if (!defined($paragraph_command_formatted) or exists($special_list_commands{$format}->{$paragraph_command})); #my $in_term = shift; return '' if ($text =~ /^\s*$/); if (defined($paragraph_number) and defined($$paragraph_number)) { $$paragraph_number++; #return $text . "\n" if (($format eq 'itemize' or $format eq 'enumerate') and return $text if (($format eq 'itemize' or $format eq 'enumerate') and ($$paragraph_number == 1)); } my $open = '

    '; if ($align) { $open = "

    "; } return $open. "$text

    "; } # a preformatted region # arguments: # $text of the preformatted region # $pre_style css style # $class identifier for the preformatted region (example, menu-comment) # The following is usefull if the preformatted is in an itemize. # $leading_command is the leading formatting command (like @minus) # $leading_command_formatted is the leading formatting command formatted # $preformatted_number is a reference on the number of preformatteds appearing # in the format. The value should be increased if a preformatted is done sub t2h_default_preformatted($$$$$$$$$$) { my $text = shift; my $pre_style = shift; my $class = shift; my $leading_command = shift; my $leading_command_formatted = shift; my $preformatted_number = shift; my $format = shift; my $item_nr = shift; my $enumerate_style = shift; my $number = shift; return '' if ($text eq ''); $leading_command_formatted = '' if (!defined($leading_command_formatted) or exists($special_list_commands{$format}->{$leading_command})); if (defined($preformatted_number) and defined($$preformatted_number)) { $$preformatted_number++; } return "
    $text
    "; } # This function formats a heading for an element # # argument: # an element. It is a hash reference for a node or a sectionning command. # The interesting keys are: # 'text': the heading text # 'name': the heading text without section number # 'node': true if it is a node # 'level': level of the element. 0 for @top, 1 for chapter, heading, # appendix..., 2 for section and so on... # 'tag_level': the sectionning element name, raisesections and lowersections # taken into account # # relevant configuration variable: # $NUMBER_SECTIONS sub t2h_default_heading($) { my $element = shift; my $level = 3; if (!$element->{'node'}) { $level = $element->{'level'}; } $level = 1 if ($level == 0); my $text = $element->{'text'}; if (!$element->{'node'} and (!$NUMBER_SECTIONS)) { $text = $element->{'name'}; } return '' if ($text !~ /\S/); my $class = $element->{'tag_level'}; $class = 'unnumbered' if ($class eq 'top'); if (defined($element->{'tocid'}) and $TOC_LINKS) { $text = &$anchor ('', "$Texi2HTML::THISDOC{'toc_file'}#$element->{'tocid'}", $text); } return " $text \n"; } # formatting of raw regions # ih L2H is true another mechanism is used for tex sub t2h_default_raw($$) { my $style = shift; my $text = shift; if ($style eq 'verbatim' or $style eq 'tex') { return "
    " . &$protect_text($text) . '
    '; } elsif ($style eq 'html') { return $text; } else { warn "$WARN (bug) unknown style $style\n"; return &$protect_text($text); } } # This function formats a footnote reference and the footnote text associated # with a given footnote. # The footnote reference is the text appearing in the main document pointing # to the footnote text. # # arguments: # absolute number of the footnote (in the document) # relative number of the footnote (in the page) # identifier for the footnote # identifier for the footnote reference in the main document # main document file # footnote text file # array with the footnote text lines # the state. See menu entry. # # returns: # reference on an array containing the footnote text lines which should # have been updated # the text for the reference pointing on the footnote text sub t2h_default_foot_line_and_ref($$$$$$$) { my $number_in_doc = shift; my $number_in_page = shift; my $footnote_id = shift; my $place_id = shift; my $document_file = shift; my $footnote_file = shift; my $lines = shift; my $state = shift; unshift (@$lines, '

    ' . &$anchor($footnote_id, $document_file . "#$place_id", "($number_in_doc)") . "

    \n"); return ($lines, &$anchor($place_id, $footnote_file . "#$footnote_id", "($number_in_doc)")); } # formats a group of footnotes. # # argument: # array reference on the footnotes texts lines # # returns an array reference on the group of footnotes lines sub t2h_default_foot_section($) { my $lines = shift; unshift (@$lines, "
    \n" ,"$DEFAULT_RULE\n", "

    " . &$I('Footnotes') . "

    \n"); push (@$lines, "
    \n"); return $lines; } # format an image # # arguments: # image file name with path # image basename or alt text # a boolean true if we are in a preformatted format # image file name without path sub t2h_default_image($$$$) { my $file = shift; my $base = shift; my $preformatted = shift; my $file_name = shift; return "[ $base ]" if ($preformatted); return "\"$base\""; } # address put in footer describing when was generated and who did the manual sub t2h_default_address($$) { my $user = shift; my $date = shift; $user = '' if (!defined($user)); $date = '' if (!defined($date)); if (($user ne '') and ($date ne '')) { return &$I('by @emph{%{user}} on @emph{%{date}}', { 'user' => $user, 'date' => $date }); } elsif ($user ne '') { return &$I('by @emph{%{user}}', { 'user' => $user }); } elsif ($date ne '') { return &$I('on @emph{%{date}}', { 'date' => $date }); } return ''; } # format a target in the main document for an index entry. # # arguments: # target identifier # boolean true if in preformatted format sub t2h_default_index_entry_label($$) { my $identifier = shift; my $preformatted = shift; return '' if (!defined($identifier) or ($identifier !~ /\S/)); my $label = &$anchor($identifier); return $label . "\n" if (!$preformatted); return $label; } # process definition commands line @deffn for example sub t2h_default_def_line($$$$$) { my $category = shift; my $name = shift; my $type = shift; my $arguments = shift; my $index_label = shift; $index_label = '' if (!defined($index_label)); $name = '' if (!defined($name) or ($name =~ /^\s*$/)); $type = '' if (!defined($type) or $type =~ /^\s*$/); if (!defined($arguments) or $arguments =~ /^\s*$/) { $arguments = ''; } else { $arguments = '' . $arguments . ''; } my $type_name = ''; $type_name = " $type" if ($type ne ''); $type_name .= ' ' . $name . '' if ($name ne ''); $type_name .= $arguments . "\n"; if (! $DEF_TABLE) { return '
    '. '' . $category . ':' . $type_name . $index_label . "
    \n"; } else { return "\n" . $type_name . "\n" . $category . $index_label . "\n" . "\n"; } } # process definition commands line @deffn for example while removing texi # commands sub t2h_default_def_line_no_texi($$$$$) { my $category = shift; my $name = shift; my $type = shift; my $arguments = shift; $name = '' if (!defined($name) or ($name =~ /^\s*$/)); $type = '' if (!defined($type) or $type =~ /^\s*$/); if (!defined($arguments) or $arguments =~ /^\s*$/) { $arguments = ''; } my $type_name = ''; $type_name = " $type" if ($type ne ''); $type_name .= ' ' . $name if ($name ne ''); $type_name .= $arguments; if (! $DEF_TABLE) { return $category . ':' . $type_name . "\n"; } else { return $type_name . " " . $category . "\n"; } } # a cartouche sub t2h_default_cartouche($$) { my $text = shift; if ($text =~ /\S/) { return "
    \n" . $text . "
    \n"; } return ''; } # key: # origin_href: # entry: # texi entry: # element_href: # element_text: sub t2h_default_index_summary_file_entry ($$$$$$$$) { my $index_name = shift; my $key = shift; my $origin_href = shift; my $entry = shift; my $texi_entry = shift; my $element_href = shift; my $element_text = shift; my $is_printed = shift; print IDXFILE "key: $key\n origin_href: $origin_href\n entry: $entry\n" . " texi_entry: $texi_entry\n" . " element_href: $element_href\n element_text: $element_text\n"; } sub t2h_default_index_summary_file_begin($$) { my $name = shift; my $is_printed = shift; open(IDXFILE, ">$Texi2HTML::THISDOC{'destination_directory'}$Texi2HTML::THISDOC{'file_base_name'}" . "_$name.idx") || die "Can't open >$Texi2HTML::THISDOC{'destination_directory'}$Texi2HTML::THISDOC{'file_base_name'}" . "_$name.idx for writing: $!\n"; } sub t2h_default_index_summary_file_end($$) { my $name = shift; my $is_printed = shift; close (IDXFILE); } sub t2h_default_sp($$) { my $number = shift; my $preformatted = shift; return "
    \n" x $number if (!$preformatted); return "\n" x $number; } sub t2h_default_acronym_like($$$$$$) { my $command = shift; my $acronym_texi = shift; my $acronym_text = shift; my $with_explanation = shift; my $explanation_lines = shift; my $explanation_text = shift; my $explanation_unformatted = shift; my $attribute = $command; my $opening = "<$attribute>"; if (defined($explanation_unformatted)) { $opening = "<$attribute title=\"$explanation_unformatted\">"; } if ($with_explanation) { return &$I('%{acronym_like} (%{explanation})', {'acronym_like' => $opening . $acronym_text . "", 'explanation' => $explanation_text}) } else { return $opening . $acronym_text . ""; } } sub t2h_default_quotation_prepend_text($$) { my $style = shift; my $text = shift; return &$I('@b{%{quotation_arg}:} ', {'quotation_arg' => $text}, {'keep_texi' => 1}) if (defined($text)); return undef; } sub t2h_default_quotation($$$$) { my $text = shift; my $argument_text = shift; my $argument_style_texi = shift; my $argument_style_id = shift; # if (defined($argument_text)) # { # return '
    ' . &$I('%{style}:%{quotation}', # {'style' => $argument_text, 'quotation' => $text}) . '
    ' ; # } return '
    ' . $text . "
    \n"; } # format the text within a paragraph style format, # # argument: # format name # text within the format sub t2h_default_paragraph_style_command($$) { my $format = shift; my $text = shift; return $text; } # format a whole index # # argument: # index text # index name sub t2h_default_print_index($$) { my $text = shift; my $name = shift; return "\n" . "\n" . "\n" . $text . "
    " . &$I('Index Entry') . " " . &$I('Section') . "
    $DEFAULT_RULE
    \n"; } # format a letter entry in an index page. The letter entry contains # the index entries for the words beginning with that letter. It is # a target for links pointing from the summary of the index. # # arguments: # the letter # identifier for the letter entry. This should be used to make the target # identifier # text of the index entries sub t2h_default_index_letter($$$) { my $letter = shift; my $id = shift; my $text = shift; return '' . &$anchor($id,'',&$protect_text($letter)) . "\n" . $text . " $DEFAULT_RULE\n"; } # format an index entry (in a letter entry). # # arguments: # href to the main text, linking to the place where the index entry appears # entry text # href to the main text, linking to the section or node where the index # entry appears # section or node heading sub t2h_default_index_entry($$$$) { my $text_href = shift; my $entry = shift; my $element_href = shift; my $element_text = shift; return '' . &$anchor('', $text_href, $entry) . '' . &$anchor('', $element_href, $element_text) . "\n"; } sub t2h_default_copying_comment($) { my $copying_lines = shift; my $text = &$comment(main::remove_texi(@$copying_lines)); return $text; } # format a letter appearing in a summary for an index. The letter links to # the place where the index elements beginning with this letter are (called # a letter entry). # # arguments: # letter # file where the target letter entry is # identifier for the target letter entry sub t2h_default_summary_letter($$$) { my $letter = shift; my $file = shift; my $identifier = shift; return &$anchor('', $file . '#' . $identifier, '' . &$protect_text($letter) . '', 'class="summary-letter"'); } # format an index summary. This is a list of letters linking to the letter # entries. # # arguments: # array reference containing the formatted alphabetical letters # array reference containing the formatted non lphabetical letters sub t2h_default_index_summary($$) { my $alpha = shift; my $nonalpha = shift; my $join = ''; my $nonalpha_text = ''; my $alpha_text = ''; $join = "   \n
    \n" if (@$nonalpha and @$alpha); if (@$nonalpha) { $nonalpha_text = join("\n   \n", @$nonalpha) . "\n"; } if (@$alpha) { $alpha_text = join("\n   \n", @$alpha) . "\n   \n"; } return "
    " . &$I('Jump to') .":   " . $nonalpha_text . $join . $alpha_text . "
    \n"; } 1;