# -*-perl-*- #+############################################################################## # # roff.init: convert to roff # # So much out of date that it may be considered unuseful. # # Copyright (C) 2003-2008 Patrice Dumas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA # #-############################################################################## main::load_init_file('', 'noheaders.init'); $SPLIT = 'none'; @EXPAND = ('info'); $USE_ISO = 0; #$SHOW_MENU = 0; $SMALL_RULE = ''; $DEFAULT_RULE = ''; $MIDDLE_RULE = ''; $BIG_RULE = ''; $NODE_FILE_EXTENSION = 'roff'; $EXTENSION = 'roff'; $MENU_SYMBOL = '*'; $AVOID_MENU_REDUNDANCY = 0; $print_Top = \&T2H_ROFF_print_Top; $print_misc = \&T2H_ROFF_print_misc; $print_page_head = \&T2H_ROFF_print_page_head; $print_page_foot = \&T2H_ROFF_print_page_foot; $toc_body = \&T2H_ROFF_toc_body; $titlepage = \&T2H_ROFF_titlepage; sub T2H_ROFF_print_page_head { my $fh = shift; print $fh <* 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 = ( '"', ':', '~', '~', '^', '^', '`', '`', ',', ',', "'", "'", '=', '', ); # # texinfo "simple things" (@foo) to HTML ones # %simple_map = ( # "*", "\n.br\n", ' ', '\ ', "\t", "\\\t", "\n", "\\\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; # # texinfo "things" (@foo{}) to HTML ones # %things_map = ( 'TeX' => 'TeX', 'LaTeX' => 'LaTeX', 'bullet' => '\(bu', 'copyright' => '\(co', 'registeredsymbol' => '\(rg', 'dots' => '\&...', 'enddots' => '\&...', 'equiv' => '\(==', # i18n 'error' => 'error->', 'expansion' => '\(->', 'minus' => '\-', 'point' => '*', 'print' => '-|', 'result' => '\(rh', # set in code using the language # 'today', &pretty_date, 'aa' => '\(oa', 'AA' => '\(oA', 'ae' => '\(ae', 'oe' => '\(oe', 'AE' => '\(AE', 'OE' => '\(OE', 'o' => '\(/o', 'O' => '\(/O', 'ss' => '\(ss', 'l' => '\(/l', 'L' => '\(/L', 'exclamdown' => '\(r!', 'questiondown' => '\(r?', 'pounds' => '\(Po', 'ordm' => '\(Om', 'ordf' => '\(Of', 'euro' => '\(eu', ); # This map is used in preformatted environments %pre_map = %things_map; #%style_map = ( # 'acronym', '', # 'asis', '', # 'b', ['\fB', '\fR'], # 'cite', ['\fI', '\fR'], # 'code', ['\fR\&\f(CW', '\fR'], # 'command', ['\fR\&\f(CW', '\fR'], # 'ctrl', ['\fR\&\f(CW', '\fR'], # 'dfn', ['\fI', '\fR'], # 'dmn', '', # 'email', ['\fB', '\fR'], # 'emph', ['\fI', '\fR'], # 'env', ['\fR\&\f(CW', '\fR'], # 'file', ['\fR\&\f(CW', '\fR', '"'], # 'i', ['\fI', '\fR'], # 'kbd', ['\fR\&\f(CW', '\fR'], # 'key', ['\fR\&\f(CW', '\fR'], # 'math', ['\fR\&\f(CW', '\fR'], # 'option', ['\fR\&\f(CW', '\fR', '"'], # 'r', ['\fR', ''], # 'samp', ['\fR\&\f(CW', '\fR', '"'], # 'sc', '&roff_sc', # 'strong', ['\fB', '\fR'], # 't', ['\fR\&\f(CW', '\fR'], # 'uref', '&default_uref', # 'url', '&default_url', # 'var', ['\fI', '\fR'], # 'verb', ['\fR\&\f(CW', '\fR'], # 'titlefont', ["\n.sz +10\n.ce\n", "\n.sz -10\n"], # 'w', '', # 'H', '&roff_accent', # 'dotaccent', '&roff_accent', # 'ringaccent', '&roff_accent', # 'tieaccent', '&roff_accent', # 'u', '&roff_accent', # 'ubaraccent', '&roff_accent', # 'udotaccent', '&roff_accent', # 'v', '&roff_accent', # ',', '&roff_accent', # 'dotless', '' # ); my @bold_commands = ('strong', 'b', 'email'); my @italic_commands = ('cite', 'dfn', 'emph', 'i', 'var', 'slanted'); my @fixed_command = ('code', 'command', 'ctrl', 'env', 'file', 'kbd', 'key', 'math', 'option', 'samp', 't', 'verb'); foreach my $accent_command ('tieaccent', 'dotless', keys(%unicode_accents), keys(%accent_map)) { #$style_map{$accent_command} = { 'function' => \&t2h_roff_accent }; $style_map{$accent_command} = '&roff_accent'; } #foreach my $accent (keys(%accent_map)) #{ # $style_map{$accent} = '&roff_accent'; #} foreach my $command (keys(%style_map)) { delete $style_map{$command}->{'attribute'} if (exists($style_map{$command}->{'attribute'})); if (grep {$_ eq $command} @bold_commands) { delete $style_map{$command}->{'function'} if (exists($style_map{$command}->{'function'})); $style_map{$command}->{'begin'} = '\fB'; $style_map{$command}->{'end'} = '\fR'; next; } elsif (grep {$_ eq $command} @italic_commands) { delete $style_map{$command}->{'function'} if (exists($style_map{$command}->{'function'})); $style_map{$command}->{'begin'} = '\fI'; $style_map{$command}->{'end'} = '\fR'; next; } elsif (grep {$_ eq $command} @fixed_commands) { delete $style_map{$command}->{'function'} if (exists($style_map{$command}->{'function'})); $style_map{$command}->{'begin'} = '\fR\&\f(CW'; $style_map{$command}->{'end'} = '\fR'; next; } } delete $style_map{'titlefont'}->{'function'} if (exists($style_map{'titlefont'}->{'function'})); $style_map{'titlefont'}->{'begin'} = "\n.sz +10\n.ce\n"; $style_map{'titlefont'}->{'end'} = "\n.sz -10\n"; delete $style_map{'r'}->{'function'} if (exists($style_map{'r'}->{'function'})); $style_map{'r'}->{'begin'} = '\r'; #$style_map{'r'}->{'end'} = ''; $style_map{'sc'} = '&roff_sc'; $style_map{'indicateurl'}->{'begin'} = '<'; $style_map{'indicateurl'}->{'end'} = '>'; foreach my $command (keys(%style_map)) { if (ref($style_map{$command}) ne 'HASH') { $style_map_pre{$command} = $style_map{$command}; next; } $style_map_pre{$command} = {}; foreach my $key (keys(%{$style_map{$command}})) { $style_map_pre{$command}->{$key} = $style_map{$command}->{$key}; } } %special_accents = ( 'ringaccent' => 'aA', "'" => 'aeiouyAEIOUY', ',' => 'cC', '^' => 'aeiouAEIOU', '`' => 'aeiouAEIOU', '~' => 'nNaoAO', '"' => 'aeiouyAEIOUY', 'v' => 'sSzZ', ); sub roff_accent($$) { my $text = shift; my $accent = shift; return $text if ($accent eq 'dotless'); return "\\($accent_map{$accent}${text}" if (defined($accent_map{$accent}) and defined($special_accents{$accent}) and ($text =~ /^[$special_accents{$accent}]$/)); return "\\(o${text}" if (($accent eq 'ringaccent') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/)); return "\\(v${text}" if (($accent eq 'v') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/)); #FIXME maybe we should protect the symbols such that they look like strings and # not ponctuation marks ? Like it is done in texi2roff ? return $text . '\\&.' if ($accent eq 'dotaccent'); return '\\&.' . $text if ($accent eq 'udotaccent'); return ascii_accents($text, $accent); } sub roff_sc($$) { return "\n.sz -6\n" . uc($_[0]) . "\n.sz +6\n" ; } sub roff_ctrl($$) { return "\\*^$_[0]"; } $format = \&T2H_ROFF_format; sub T2H_ROFF_format($$$) { my $tag = shift; my $element = shift; my $text = shift; return '' if (!defined($element) or ($text !~ /\S/)); return $element->[0] . $text . $element->[1]; } %format_map = ( 'quotation' => [ ".(q\n", ".)q\n" ], 'smallquotation' => [ ".(q\n", ".)q\n" ], # lists 'itemize' => [ ".(l L F\n.ba +5\n", ".ba -5\n.)l\n" ], 'enumerate' => [ ".(l L F\n.ba +5\n", ".ba -5\n.)l\n" ], 'multitable' => [ ".(l M\n.nh\n", ".hy\n.)l\n" ], 'table' => [ ".(l L F\n.ba +5\n", ".ba -5\n.)l\n" ], 'vtable' => [ ".(l L F\n.ba +5\n", ".ba -5\n.)l\n" ], 'ftable' => [ ".(l L F\n.ba +5\n", ".ba -5\n.)l\n" ], ); %special_list_commands = ( 'table' => {}, 'vtable' => {}, 'ftable' => {}, 'itemize' => {} ); $complex_format_map = ( 'example' => { 'begin' => "", 'end' => "", 'begin_region' => ".(l I\n\\&\\fR\\f(CW", 'end_region' => "\\&\\fR\n.)l\n" }, 'smallexample' => { 'begin' => "", 'end' => "", 'begin_region' => ".(l I\n.size -2\n\\&\\fR\\f(CW", 'end_region' => "\\&\\fR\n.size +2\n.)l\n" }, 'display' => { 'begin' => "", 'end' => "", 'begin_region' => ".(l I\n\\&\\fR\\f(CW", 'end_region' => "\\&\\fR\n.)l\n" }, 'smalldisplay' => { 'begin' => "", 'end' => "", 'begin_region' => ".(l I\n.size -2\n\\&\\fR\\f(CW", 'end_region' => "\\&\\fR\n.size +2\n.)l\n" }, 'menu-comment' => { 'begin' => "", 'end' => "", 'begin_region' => "", 'end_region' => "\n" }, 'menu-preformatted' => { 'begin' => "", 'end' => "", 'begin_region' => "", 'end_region' => "\n" } ); # 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'}; sub protect_spaces($) { my $text = shift; my $result = ''; while($text) { if ($text =~ s/^([^\\]*)\\//o) { my $leading = $1; if (defined($leading)) { $leading =~ s/([\t ])/\\$1/go; $result .= $leading . '\\'; } if (($text =~ s/^(\s)//o) or ($text =~ s/^(.)//o)) { $result .= $1; } } else { $text =~ s/([\t ])/\\$1/go; $result .= $text; $text = ''; } } return $result; } # formatting functions $anchor = \&t2h_roff_anchor; $def_item = \&t2h_roff_def_item; $def = \&t2h_roff_def; $menu = \&t2h_roff_menu; $menu_link = \&t2h_roff_menu_link; $menu_comment = \&t2h_roff_menu_comment; $menu_description = \&t2h_roff_menu_description; $simple_menu_link = \&t2h_roff_simple_menu_link; $table_item = \&t2h_roff_table_item; $table_line = \&t2h_roff_table_line; $row = \&t2h_roff_row; $cell = \&t2h_roff_cell; $list_item = \&t2h_roff_list_item; $comment = \&t2h_roff_comment; $def_line = \&t2h_roff_def_line; $raw = \&t2h_roff_raw; $heading = \&t2h_roff_heading; $paragraph = \&t2h_roff_paragraph; $preformatted = \&t2h_roff_preformatted; $foot_line_and_ref = \&t2h_roff_foot_line_and_ref; $foot_section = \&t2h_roff_foot_section; $image = \&t2h_roff_image; $index_entry_label = \&t2h_roff_index_entry_label; $index_summary = \&t2h_roff_index_summary; $print_index = \&t2h_roff_print_index; $protect_text = \&t2h_roff_protect_text; $cartouche = \&t2h_roff_cartouche; $sp = \&t2h_roff_sp; $normal_text = \&t2h_roff_normal_text; $empty_line = \&t2h_roff_empty_line; $unknown = \&t2h_roff_unknown; $float = \&t2h_roff_float; $listoffloats = \&t2h_roff_listoffloats; $listoffloats_entry = \&t2h_roff_listoffloats_entry; # This function is used to protect characters which are special in html # in inline text: &, ", <, and >. # # argument: # text to be protected sub t2h_roff_protect_text($) { my $text = shift; $text =~ s/\\/\\e/g; # $text =~ s/$;---$;/\\(em/g; # $text =~ s/$;--$;/-/g; # $text =~ s/$;-$;/\\-/g; $text =~ s/^\./\\&./; $text =~ s/([\s])\./$1\\&./g; return $text; } sub t2h_roff_normal_text($$$$$$$;$) { my $text = shift; my $in_raw_text = shift; my $in_preformatted = shift; my $in_code =shift; my $in_math = shift; my $in_simple = shift; my $style_stack = shift; my $state = shift; $text = &$protect_text($text) unless($in_raw_text); if (! $in_code and !$in_preformatted and !$in_raw_text) { $text =~ s/---/\\(em/g; $text =~ s/--/\\(en/g; $text =~ s/-/\\-/g; $text =~ s/``/\\(lq/g; $text =~ s/''/\\(rq/g; } #$text =~ s/---/\\(em/g; #$text =~ s/(--?-?)/$;$1$;/go; return $text; } sub t2h_roff_unknown($$$) { my $macro = shift; my $line = shift; my $pass = shift; if ($macro eq '*' and $pass == 2) { $line = '' if ($line =~ /^\s*$/); return ($line, 1, "\n.br\n", undef); } return ($line, 0, undef, undef); } # This function produces an anchor # # arguments: # $name : anchor name # $href : anchor href # text : text displayed # extra_attribs : added to anchor attributes list sub t2h_roff_anchor($;$$$) { my $name = shift; my $href = shift; my $text = shift; my $attributes = shift; $href = '' if (!defined($href) or ($href !~ /\S/)); $text = '' if (!defined($text)); return $text if ($text ne ''); return "[$href]" if ($href ne ''); return ''; } # This function is used to format the text associated with a @deff/@end deff # # argument: # text sub t2h_roff_def_item($) { my $text = shift; if ($text =~ /\S/) { { #return ".ba +5\n.(l L F\n" . $text . ".)l\n.ba -5\n"; return ".(l L F\n.ba +5\n" . $text . ".ba -5\n.)l\n"; } } return ''; } # format the container for the @deffn line and text # # argument # text of the whole @def, line and associated text. sub t2h_roff_def($) { my $text = shift; return $text; } # a whole menu # # argument: # the whole menu text (entries and menu comments) # # argument: # whole menu text. sub t2h_roff_menu($) { my $text = shift; chomp $text; return ".(l M\n\\&\\s8" . gdt('Menu:') . "\n" . $text . "\\&\\s0\n.)l\n"; } # a simple menu entry ref in case we aren't in a standard menu context sub t2h_roff_simple_menu_link($$$$$$$) { my $entry = shift; my $preformatted = shift; # We assume this is true. my $href = shift; my $node = shift; my $title = shift; my $ending = shift; my $has_title = shift; $title = '' unless ($has_title); $title .= ':' if ($title ne ''); return "$MENU_SYMBOL$title$node$ending"; } # 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_roff_menu_link($$$$$$) { my $entry = shift; my $state = shift; my $href = shift; my $node = shift; my $title = shift; my $ending = shift; my $has_title = shift; $title = '' unless ($has_title); $title .= ':' if ($title ne ''); return "$MENU_SYMBOL$title$node$ending"; } # 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_roff_menu_description($$) { my $text = shift; my $state = shift; return $text; } # 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_roff_menu_comment($) { my $text = shift; return $text; } # text after @item in table, vtable and ftable sub t2h_roff_table_item($$$$$) { my $text = shift; my $index_label = shift; my $format = shift; my $command = shift; # my $formatted_command = shift; my $style_stack = shift; # my $text_formatted = shift; # my $text_formatted_leading_spaces = shift; # my $text_formatted_trailing_spaces = shift; my $item_cmd = shift; # if (defined($text_formatted)) # { # $text = $text_formatted_leading_spaces . $text_formatted .$text_formatted_trailing_spaces; # } # $formatted_command = '' if (!defined($formatted_command) or # exists($special_list_commands{$format}->{$command})); $text = '.ip ' . $formatted_command . protect_spaces($text) . "\n"; $text .= $index_label if (defined($index_label)); return $text; } # format text on the line following @item (in table, vtable and ftable) sub t2h_roff_table_line($) { my $text = shift; return $text; } # row in multitable sub t2h_roff_row($) { my $text = shift; if ($text =~ /\S/) { return $text ."\n" ; } return ''; } # cell in multitable sub t2h_roff_cell($) { my $text = shift; chomp $text; return protect_spaces($text) . "\\\t"; } # format an item in a list # # argument: # text of the item sub t2h_roff_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 $text . "\n"; } return ''; } # an comment sub t2h_roff_comment($) { my $text = shift; my $result = ''; while ($text) { $text =~ s/$;---$;/--/g; $text =~ s/$;--$;/-/g; $text =~ s/$;-$;/-/g; $text =~ s/^(.*)//; $result .= ".\\\"$1"; $result .= "\n" if ($text =~ s/^\n//); } return $result; } # a paragraph sub t2h_roff_paragraph($$$$$$$$$$) { my $text = shift; my $align = shift; my $indent = 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; return '' if ($text =~ /^\s*$/); if (defined($paragraph_number) and defined($$paragraph_number)) { $$paragraph_number++; $paragraph_command_formatted = undef if ($$paragraph_number > 1); } # $paragraph_command_formatted = '' if (!defined($paragraph_command_formatted) or # exists($special_list_commands{$format}->{$paragraph_command})); #return $text if (defined($format) and $format eq 'multitable'); return $text if (defined($format) and (($format eq 'multitable') or ($format eq 'quotation') or ($format eq 'smallquotation'))); my $open = ".pp\n"; if (defined($format) and (($format eq 'itemize') or ($format eq 'enumerate')) and defined($paragraph_number) and defined($$paragraph_number) and ($$paragraph_number == 1)) { $open = ".lp\n"; } my $close = ''; if ($align) { if ($align eq 'flushleft') { $open .= ".ad l\n"; $close .= ".ad b\n"; } elsif ($align eq 'flushright') { $open .= ".ad r\n"; $close .= ".ad b\n"; } elsif ($align eq 'center') { $open .= ".ce\n"; } } if (defined($format) and ($format eq 'enumerate') and defined($paragraph_number) and defined($$paragraph_number) and ($$paragraph_number == 1) and defined($number) and ($number ne '')) { $open .= "$number."; } chomp ($text); #return $open. $paragraph_command_formatted . $text . "\n" . $close; return $open. $text . "\n" . $close; } # a preformatted region sub t2h_roff_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; $leading_command_formatted = '' if (!defined($leading_command_formatted) or exists($special_list_commands{$format}->{$leading_command})); if (defined($format) and $format eq 'multitable') { my $chomped = chomp($text); my $result = '\&\fR\f(CW' . $text . '\&\fR'; $result .= "\n" if ($chomped); return $result; } return '' if ($text eq ''); if (defined($preformatted_number) and defined($$preformatted_number)) { $$preformatted_number++; $leading_command_formatted = undef if ($$preformatted_number > 1); } $leading_command_formatted = '' if (!defined($leading_command_formatted)); chomp $text; my $open = ''; if (defined($format) and ($format eq 'enumerate') and defined($paragraph_number) and defined($$paragraph_number) and ($$paragraph_number == 1) and defined($number) and ($number ne '')) { $open = "$number. "; } return $complex_format_map{$class}->{'begin_region'} . $leading_command_formatted . $open . $text . $complex_format_map{$class}->{'end_region'}; } # This function formats a heading for an element # # argument: # an element. It is a hash reference for a node or a sectioning 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 sectioning element name, raisesections and lowersections # taken into account sub t2h_roff_heading($$$$$;$$) { my $element = shift; my $command = shift; my $texi_line = shift; my $line = shift; my $in_preformatted = shift; my $one_section = shift; my $element_heading = shift; my $name = $element->{'text'}; if (!$element->{'node'}) { $name = $element->{'name'}; } return '' if ($element->{'name'} !~ /\S/); my $class = $element->{'tag_level'}; $class = 'unnumbered' if ($class eq 'top'); $level = $element->{'level'}; $level = 3 if (!defined($level)); $level = 1 if ($level == 0); my $heading = ''; $heading = ".bp\n" if ($level == 1); $heading .= '.if !\n(_- \{\\' . "\n.nr _- 1\n.nr \$1 0 1\n" . '.af $1 A\}' . "\n" if ($class =~ /^appendix/); $name = protect_spaces($name); my $toc_entry = '\&'; if ($class =~ /^unnumbered/ or ($class eq 'node')) { $heading .= ".uh $name\n"; $toc_entry .= ' '; } elsif (($class =~ /section$/) or ($class eq 'chapter') or ($class =~ /^appendix/)) { $heading .= ".sh $level $name\n"; my $number = 1; while ($number < $level) { $toc_entry .= "\\n(\$$number."; $number++; } $toc_entry .= "\\n(\$$number "; } $toc_entry .= $name; return $heading . "\n" if ($class eq 'node'); return $heading . ".(x\n" . $toc_entry . "\n.)x\n\\&\\fR\n"; } sub T2H_ROFF_toc_body($$$) { my $elements_list = shift; my $do_contents = shift; my $do_scontents = shift; if ($do_contents or $do_scontents) { my $lines = ".pp\n.nr % 0 1\n.af % i\n.bp \\n%+1\n.ce\n\\&\\fB" . gdt('Table of Contents') . "\\fR\n.sp 2\n.xp\n"; if (!$do_contents) { push @{$Texi2HTML::OVERVIEW}, $lines; } else { push @{$Texi2HTML::TOC_LINES}, $lines; } } } # formatting of raw regions # ih L2H is true another mechanism is used for tex sub t2h_roff_raw($$) { my $style = shift; my $text = shift; my $expanded = 1 if (grep {$style eq $_} @EXPAND); if ($style eq 'verbatim' or $style eq 'verbatiminclude' or ($expanded and ($style eq 'tex' or $style eq 'html'))) { chomp ($text); return ".(l M\n\\fR\\&\\f(CW" . &$protect_text($text) . "\\fR\n.)l\n" ; } elsif ($expanded) { main::msg_debug ("(bug) unknown style $style"); return &$protect_text($text); } return ''; } # 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_roff_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; my $text = ''; my $line; while (@$lines) { $line = shift @$lines; $text .= $line; } chomp $text; return ([], "\n.(f\n" . $text . "\n.)f\n" ); } # 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_roff_foot_section($) { my $lines = shift; @$lines = (); } # format an image # # arguments: # image file name # image basename # a boolean true if we are in a preformatted format sub t2h_roff_image($$$$) { my $file = shift; my $base = shift; my $preformatted = shift; my $file_name = shift; return "[$base src=$file_name]" if ($base ne $file_name); return "[$base]"; } # format a target in the main document for an index entry. # # arguments: # target identifier # boolean true if in preformatted format sub t2h_roff_index_entry_label($$$$$$$$$) { my $identifier = shift; my $preformatted = shift; my $entry = shift; my $index_name = shift; my $index_command = shift; my $texi_entry = shift; my $formatted_entry = shift; my $in_region_not_in_output = shift; my $index_entry_ref = shift; return ".(x $index_name\n" . protect_spaces($entry) . "\n.)x\n"; } # process definition commands line @deffn for example sub t2h_roff_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 = '\fI' . protect_spaces($arguments) . '\fR'; } my $type_name = ' '; $type_name = " $type" if ($type ne ''); $type_name .= '\fB' . protect_spaces($name) . '\fR' if ($name ne ''); $type_name .= $arguments . "\n"; return '\fI' . protect_spaces($category) . ':\fR' . $type_name . $index_label; } # a cartouche sub t2h_roff_cartouche($$) { my $text = shift; return $text; } sub t2h_roff_sp($$) { my $number = shift; my $preformatted = shift; return "\n.sp $number\n"; } # format a whole index # # argument: # index text # index name sub t2h_roff_print_index($$) { my $text = shift; my $name = shift; return ".xp $name\n"; } # 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_roff_index_summary($$) { my $alpha = shift; my $nonalpha = shift; my $join = ''; my $nonalpha_text = ''; my $alpha_text = ''; return ''; } # FIXME the following construct leads to something wrong ? # something @c a comment # # other thing sub t2h_roff_empty_line($) { my $text = shift; return ''; } sub t2h_roff_listoffloats_entry($$$$) { my $style_texi = shift; my $float = shift; my $float_style = shift; my $caption = shift; my $href = shift; chomp ($caption); return '.ip ' . protect_spaces($float_style) . "\n" . $caption . "\n"; } sub t2h_roff_listoffloats($$$) { my $style_texi = shift; my $style = shift; my $float_entries = shift; my $result = ".(l L F\n.ba +5\n"; foreach my $float_entry (@$float_entries) { $result .= $float_entry; } return $result . ".ba -5\n.)l\n"; } sub t2h_roff_float($$$$$) { my $text = shift; my $float = shift; my $caption = shift; my $shortcaption = shift; 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; } chomp ($caption_text); return ".(b L F\n" . $text . $caption_text . "\n.b)\n"; } 1;