texi2html-1.76/0000777000076400007640000000000010200552516007140 5texi2html-1.76/examples/0000777000076400007640000000000010200552515010755 5texi2html-1.76/examples/makeinfo.init0000644000076400007640000000647410164547034013373 # -*-perl-*- $TOP_FILE = 'index.html'; $SHOW_MENU = 1; $USE_NODES = 1; $SPLIT = 'node'; $SECTION_NAVIGATION = 1; $SHORT_REF = 1; $NODE_NAME_IN_MENU = 1; $AVOID_MENU_REDUNDANCY = 0; $SPLIT_INDEX = 0; $MENU_SYMBOL = '*'; $WORDS_IN_PAGE = 200; $SEPARATED_FOOTNOTES = 0; @SECTION_BUTTONS = ( \"node: ", \$Texi2HTML::NODE{This}, [ 'NodeNext', \$Texi2HTML::NODE{Next} ] , \",", [ 'NodePrev', \$Texi2HTML::NODE{Prev} ], \",", [ 'NodeUp', \$Texi2HTML::NODE{NodeUp} ], 'Following' ); my $default_init_out = $init_out; $init_out = \&makeinfo_like_init_out; sub makeinfo_like_init_out() { my $encoding = &$default_init_out(); $NAVIGATION_TEXT{'Following'} = ' > '; return $encoding; } @MISC_BUTTONS = @SECTION_BUTTONS; $foot_line_and_ref = \&makeinfo_like_foot_line_and_ref; $foot_lines = \&makeinfo_like_foot_lines; $index_summary = \&makeinfo_like_index_summary; $summary_letter = \&makeinfo_like_summary_letter; $index_entry = \&makeinfo_like_index_entry; $index_letter = \&makeinfo_like_index_letter; $print_index = \&makeinfo_like_print_index; $listoffloats = \&makeinfo_like_listoffloats; $listoffloats_entry = \&makeinfo_like_listoffloats_entry; sub makeinfo_like_foot_line_and_ref($$$$$$$$) { my $foot_num = shift; my $relative_num = shift; my $footid = shift; my $docid = shift; my $from_file = shift; my $footnote_file = shift; my $lines = shift; my $state = shift; my $foot_anchor = "" . &$anchor($docid, "$footnote_file#$footid", $relative_num) . ""; $foot_anchor = &$anchor($docid, "$footnote_file#$footid", "($relative_num)") if ($state->{'preformatted'}); unshift @$lines, "
  • "; push @$lines, "
  • \n"; return ($lines, $foot_anchor); } sub makeinfo_like_foot_lines($) { my $lines = shift; unshift @$lines, "
    \n

    $Texi2HTML::I18n::WORDS->{'Footnotes_Title'}

    \n
      \n"; push @$lines, "
    "; return $lines; } sub makeinfo_like_index_summary { return ''; } sub makeinfo_like_summary_letter { return ''; } sub makeinfo_like_index_entry($$$$) { my $text_href = shift; my $entry = shift; my $element_href = shift; my $element_text = shift; return '
  • ' . $entry . ': ' . &$anchor('', $element_href, $element_text) . "
  • \n"; } sub makeinfo_like_index_letter($$$) { my $letter = shift; my $id = shift; my $text = shift; return $text; } sub makeinfo_like_print_index($$) { my $text = shift; my $name = shift; return "\n"; } sub makeinfo_like_listoffloats_entry($$$$) { my $style_texi = shift; my $float = shift; my $float_style = shift; my $caption = shift; my $href = shift; if ($caption ne '') { return '
  • ' . &$I('%{href}: %{caption}', { 'href' => &$anchor('', $href, $float_style), 'caption' => $caption }) . "
  • \n"; } else { return '
  • ' . &$anchor('', $href, $float_style) . "
  • \n"; } } sub makeinfo_like_listoffloats($$$) { my $style_texi = shift; my $style = shift; my $float_entries = shift; my $result = "\n"; } texi2html-1.76/examples/xhtml.init0000644000076400007640000001200710026770343012721 # -*-perl-*- # APA: Add SystemLiteral to identify the canonical DTD. # [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 = ''; # -iso # if set, ISO8859 characters are used for special symbols (like copyright, etc) $USE_ISO = 1; # horizontal rules $SMALL_RULE = '
    '; $DEFAULT_RULE = '
    '; $MIDDLE_RULE = '
    '; $BIG_RULE = '
    '; # this is added inside after and some <meta name> # stuff, it can be used for eg. <style>, <script>, <meta> etc. tags. $EXTRA_HEAD = ''; $print_page_head = \&T2H_XHTML_print_page_head; $print_page_foot = \&T2H_XHTML_print_page_foot; $print_frame = \&T2H_XHTML_print_frame; $button_icon_img = \&T2H_XHTML_button_icon_img; #FIXME update once it is more stabilized in texi2html.init sub T2H_XHTML_print_page_head { my $fh = shift; my $longtitle = "$Texi2HTML::THISDOC{'title_no_texi'}"; $longtitle .= ": $Texi2HTML::NO_TEXI{'This'}" if exists $T2H_NO_TEXI{'This'}; print $fh <<EOT; <?xml version="1.0" encoding="iso-8859-1"?> $T2H_DOCTYPE <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="$T2H_LANG" lang="$T2H_LANG"> $T2H_THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} --> <!-- $Texi2HTML::THISDOC{program_authors} --> <head> <title>$longtitle $EXTRA_HEAD $AFTER_BODY_OPEN EOT } # instead of sub T2H_XHTML_print_page_foot { my $fh = shift; print $fh < This document was generated $ADDRESS using $Texi2HTML::THISDOC{program}.
    $PRE_BODY_CLOSE

    EOT } sub T2H_XHTML_print_frame { my $fh = shift; my $toc_file = shift; my $main_file = shift; print $fh < $Texi2HTML::THISDOC{title} EOT } # / in sub T2H_XHTML_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}; } $simple_map{'*'} = '
    '; # formatting functions $def_line = \&t2h_xhtml_def_line; $index_summary = \&t2h_xhtml_index_summary; $image = \&t2h_xhtml_image; # need / in sub t2h_xhtml_image($$$) { my $file = shift; my $base = shift; my $preformatted = shift; return "[ $base ]" if ($preformatted); return "\"$base\"/"; } # process definition commands line @deffn for example # replaced by sub t2h_xhtml_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"; } } # There is a br which needs / sub t2h_xhtml_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"; } #I18n return "
    Jump to:   " . $nonalpha_text . $join . $alpha_text . '
    '; } texi2html-1.76/examples/html32.init0000644000076400007640000001117510164547034012705 # -*-perl-*- # APA: Add SystemLiteral to identify the canonical DTD. # [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 = $DOCTYPE; $BODYTEXT = 'bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"'; # this controls the pre style for menus $MENU_PRE_STYLE = ''; $TOC_LIST_STYLE =''; $USE_ISO = 0; $MENU_SYMBOL = '*'; # This lines are inserted before and after the shortcontents $BEFORE_OVERVIEW = ""; $AFTER_OVERVIEW = ''; # This lines are inserted before and after the contents $BEFORE_TOC_LINES = ""; $AFTER_TOC_LINES = ''; # html version for latex2html $L2H_HTML_VERSION = "3.2"; # no css $CSS_LINES = ""; %css_map = (); $things_map{'oe'} = 'œ'; $things_map{'OE'} = 'Œ'; $things_map{'dots'} = '...'; $things_map{'enddots'} = '....'; $things_map{'euro'} = 'Euro'; $style_map{'sansserif'} = {}; # formatting functions $summary_letter = \&t2h_html32_summary_letter; $protect_text = \&t2h_html32_protect_text; $heading = \&t2h_html32_heading; $preformatted = \&t2h_html32_preformatted; $raw = \&t2h_html32_raw; $menu = \&t2h_html32_menu; $foot_section = \&t2h_html32_foot_section; $cartouche = \&t2h_html32_cartouche; $listoffloats = \&t2h_html32_listoffloats; $float = \&t2h_html32_float; # " is not in html 3.2 sub t2h_html32_protect_text($) { my $text = shift; $text =~ s/&/&/g; $text =~ s//>/g; #$text =~ s/\"/"/g; return $text; } # a preformatted section sub t2h_html32_preformatted($$$) { my $text = shift; my $pre_style = shift; my $class = shift; return '' if ($text eq ''); return "
    $text
    "; } # a heading for an element sub t2h_html32_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/); 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_html32_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); } } # a whole menu sub t2h_html32_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_html32_foot_section($) { my $lines = shift; unshift (@$lines, "
    \n", "

    Footnotes

    \n"); return $lines; } # a cartouche sub t2h_html32_cartouche($) { my $text = shift; if ($text =~ /\S/) { return "
    \n" . $text . "
    \n"; } return ''; } # no style sub t2h_html32_summary_letter($$$) { my $letter = shift; my $file = shift; my $identifier = shift; return &$anchor('', $file . '#' . $identifier, '' . &$protect_text($letter) . ''); } sub t2h_html32_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_html32_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"; } texi2html-1.76/examples/book.init0000644000076400007640000001264310044431343012517 # This is based on the scriptbasic style $DO_CONTENTS = 1; @SECTION_BUTTONS = ( 'Back', 'Forward', ' ', 'Contents', 'Index', 'About' ); @CHAPTER_BUTTONS = ( 'Back', 'Forward', ' ', 'Contents', 'Index', 'About' ); @MISC_BUTTONS = ('Contents', 'Index', 'About'); @SECTION_FOOTER_BUTTONS = ('Contents', 'Index', 'About'); @NODE_FOOTER_BUTTONS = ('Back', 'Forward'); $WORDS_IN_PAGE = undef; $SHOW_MENU = 0; $BIG_RULE = '
    '; sub print_sub_toc($$); sub print_sub_toc($$) { my $parent_element = shift; my $element = shift; my $result = &$anchor('', main::href($element, $parent_element->{'file'}), $element->{'text'}) . "
    \n"; #print STDERR "SUB_TOC $element->{'text'}\n"; #sleep 1; if (exists($element->{'child'})) { #print STDERR "SUB_TOC child $element->{'child'}->{'text'}\n"; $result .= "
      \n". print_sub_toc($parent_element, $element->{'child'}) ."
    \n"; } if (exists($element->{'next'})) { #print STDERR "SUB_TOC next($element->{'text'}) $element->{'next'}->{'text'}\n"; $result .= print_sub_toc($parent_element, $element->{'next'}); } return $result; } sub print_up_toc($$) { my $fh = shift; my $element = shift; my $current_element = $element; my @elements; while (defined($current_element->{'up'}) and ($current_element->{'up'} ne $current_element)) { unshift (@elements, $current_element->{'up'}); $current_element = $current_element->{'up'}; } #print $fh "
      " . &$anchor('', $Texi2HTML::HREF{Contents}, '[' . $Texi2HTML::NAME{Contents} . ']') . "
      \n"; foreach my $elem (@elements) { print $fh "
        " . &$anchor('', main::href($elem, $element->{'file'}), $elem->{'text'}) . "
        \n"; } foreach my $elem (@elements) { print $fh "
      \n"; } print $fh "
    \n"; } $print_section = \&book_print_section; $print_Top = \&book_print_Top; $print_Toc = \&book_print_Toc; $element_file_name = \&book_element_file_name; sub book_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_up_toc($fh, $Texi2HTML::THIS_ELEMENT) if ($SPLIT eq 'node'); print_up_toc($fh, $Texi2HTML::THIS_ELEMENT); &$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 book_print_Top($$) { my $fh = shift; my $has_top_heading = shift; my $buttons = \@MISC_BUTTONS; &$print_head_navigation($fh, $buttons); print $fh $Texi2HTML::TITLEPAGE; print $fh "

    $Texi2HTML::NAME{Top}

    \n" unless ($has_top_heading); main::print_lines($fh, $Texi2HTML::THIS_SECTION); print $fh '

    ' . $Texi2HTML::NAME{'Contents'} . "

    \n" ; main::print_lines($fh, $Texi2HTML::TOC_LINES); } sub book_print_Toc { my $fh = shift; &$print_page_head($fh) if $SPLIT; #print $fh $Texi2HTML::TITLEPAGE; print $fh '

    ' . $Texi2HTML::NAME{'Contents'} . "

    \n" ; main::print_lines($fh); &$print_misc_footer($fh, \@MISC_BUTTONS); } my $unumbered_nr = -1; my $previous_nr; my $previous_file_name; sub book_element_file_name($$$) { my $element = shift; my $is_top = shift; my $prefix = shift; if (defined($previous_nr) and ($element->{'doc_nr'} == $previous_nr)) { return $previous_file_name; } if ($is_top) { $previous_file_name = "${prefix}_top.html"; } elsif (defined($element->{'number'}) and ($element->{'number'} ne '')) { my $number = $element->{'number'}; $number .= '.' unless ($number =~ /\.$/); $previous_file_name = "${prefix}_$number" . 'html'; } else { $unumbered_nr++; $previous_file_name = "${prefix}_U." . $unumbered_nr . '.html'; } $previous_nr = $element->{'doc_nr'}; return $previous_file_name; } $heading = \&book_heading; sub book_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); } $text = " $text \n"; #if (defined($SPLIT) and ($SPLIT eq 'node') if (exists($element->{'child'}) and ($element->{'tag_level'} !~ /heading/)) { $text .= "
      \n"; $text .= "" . print_sub_toc($element, $element->{'child'}); $text .= "
    \n"; } return $text; } 1; texi2html-1.76/examples/noheaders.init0000644000076400007640000000741310010751563013536 # -*-perl-*- $SPLIT = 'none'; $print_section = \&T2H_NOHEAD_print_section; $end_section = \&T2H_NOHEAD_end_section; $one_section = \&T2H_NOHEAD_one_section; #$print_Top_header = \&T2H_NOHEAD_print_Top_header; $print_Top_footer = \&T2H_NOHEAD_print_Top_footer; $print_Top = \&T2H_NOHEAD_print_Top; $print_misc_header = \&T2H_NOHEAD_print_misc_header; $print_misc_footer = \&T2H_NOHEAD_print_misc_footer; $print_misc = \&T2H_NOHEAD_print_misc; $print_head_navigation = \&T2H_NOHEAD_print_head_navigation; $about_body = \&T2H_NOHEAD_about_body; #$toc_body = \&T2H_NOHEAD_toc_body; ######################################################################## # Layout for html for every sections # sub T2H_NOHEAD_print_section { my $fh = shift; my $first_in_page = shift; my $previous_is_top = shift; if ($first_in_page) { &$print_head_navigation($fh); } else { # got to do this here, as it isn't done in print_head_navigation main::print_lines($fh, $Texi2HTML::THIS_HEADER); } my $nw = main::print_lines($fh); } sub T2H_NOHEAD_one_section($) { my $fh = shift; main::print_lines($fh); print $fh "$SMALL_RULE\n"; &$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_NOHEAD_print_Top_footer($$) { my $fh = shift; print $fh "$SMALL_RULE\n"; } sub T2H_NOHEAD_print_Top { my $fh = shift; my $has_top_heading = shift; &$print_head_navigation($fh,[]); if ($Texi2HTML::THIS_SECTION) { # if top-level node has content, then print it with extra header #print $fh "

    $Texi2HTML::NAME{Top}

    \n" print $fh "

    $Texi2HTML::NAME{Top}

    \n" unless ($has_top_heading); 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 '

    ' . &$I('Overview:') . "

    \n" . "
    \n"; my $nw = main::print_lines($fh, $Texi2HTML::OVERVIEW); print $fh "
    \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_NOHEAD_print_misc_header { my $fh = shift; &$print_page_head($fh) if $SPLIT; &$print_head_navigation($fh); } sub T2H_NOHEAD_print_misc_footer { my $fh = shift; print $fh "$SMALL_RULE\n"; if ($SPLIT) { &$print_navigation($fh, $buttons); &$print_page_foot($fh); } } sub T2H_NOHEAD_print_misc { my $fh = shift; &$print_misc_header($fh); print $fh "

    $Texi2HTML::NAME{This}

    \n"; main::print_lines($fh); &$print_misc_footer($fh); } sub T2H_NOHEAD_end_section($) { my $fh = shift; print $fh "$MIDDLE_RULE\n"; } ################################################################### # Layout of navigation panel sub T2H_NOHEAD_print_head_navigation { my $fh = shift; main::print_lines($fh, $Texi2HTML::THIS_HEADER); } sub T2H_NOHEAD_about_body { } texi2html-1.76/examples/inlinestyle.init0000644000076400007640000000163410164547034014132 $TOC_LIST_ATTRIBUTE = $TOC_LIST_ATTRIBUTE . " style=\"$TOC_LIST_STYLE\""; # we empty CSS_LINES as all styles are inlined $CSS_LINES = ""; $style_map{'sansserif'} = { 'attribute' => "span style=\"$css_map{'sansserif'}\""}; # formatting functions $preformatted = \&t2h_inlinestyle_preformatted; $summary_letter = \&t2h_inline_summary_letter; sub t2h_inlinestyle_preformatted($$$) { my $text = shift; my $pre_style = shift; my $class = shift; return '' if ($text eq ''); my $open = '$text"; } sub t2h_inline_summary_letter($$$) { my $letter = shift; my $file = shift; my $identifier = shift; return &$anchor('', $file . '#' . $identifier, '' . &$protect_html($letter) . '', 'class="summary-letter" style="text-decoration: none"'); } 1; texi2html-1.76/examples/utf8.init0000644000076400007640000000112510010751563012446 # -*-perl-*- $USE_ISO = 0; $ENCODING = 'utf-8'; # if the encoding isn't utf-8, we should convert to utf-8 characters. use Encode; use Unicode::Normalize; foreach my $key (keys(%unicode_accents)) { $style_map{$key}->{'function'} = \&t2h_utf8_accent; $style_map_texi{$key}->{'function'} = \&t2h_utf8_accent; } foreach my $key (%things_map) { if (exists($unicode_map{$key}) and ($unicode_map{$key} ne '')) { $things_map{$key} = chr(hex($unicode_map{$key})); $texi_map{$key} = chr(hex($unicode_map{$key})); } } $normal_text = \&t2h_utf8_normal_text; 1; texi2html-1.76/examples/chm.init0000644000076400007640000002735410177773331012356 # -*-perl-*- main::load_init_file('', 'noheaders.init'); $SHOW_MENU = 0; $SPLIT = 'node'; $DO_CONTENT = 1; $SPLIT_INDEX = undef; $IDX_SUMMARY = 1; $SMALL_RULE = ''; $DEFAULT_RULE = ''; $MIDDLE_RULE = ''; $BIG_RULE = ''; $DOCUMENT_DESCRIPTION = ''; $SEPARATED_FOOTNOTES = 0; $index_summary_file_entry = \&chm_index_summary_file_entry; $index_summary_file_begin = \&chm_index_summary_file_begin; $index_summary_file_end = \&chm_index_summary_file_end; $print_page_foot = \&chm_print_page_foot; my $default_toc_body = $toc_body; $toc_body = \&chm_toc_body; $finish_out = \&chm_finish_out; my $default_init_out = $init_out; $init_out = \&chm_init_out; my %chm_languages = ( 'en' => '0x409 English (United States)', 'sq' => '0x041c Albanian', # 'ar' => '0x1401 Arabic (ALGERIA)', # 'es' => '0x2c0a Spanish (ARGENTINA)', # 'en' => '0x0c09 English (AUSTRALIA)', # 'de' => '0x0c07 German (AUSTRIA)', # 'ar' => '0x3c01 Arabic (BAHRAIN)', 'be' => '0x0423 Byelorussian', # 'fr' => '0x080c French (BELGIUM)', # 'en' => '0x2809 English (BELIZE)', # 'es' => '0x400a Spanish (BOLIVIA)', # 'pt' => '0x0416 Portuguese (BRAZIL)', # 'ms' => '0x083e Malay (BRUNEI DARUSSALAM)', 'bg' => '0x0402 Bulgarian', # 'fr' => '0x0c0c French (CANADA)', # 'es' => '0x340a Spanish (CHILE)', 'zh' => '0x0804 Chinese (CHINA)', # 'es' => '0x240a Spanish (COLOMBIA)', # 'es' => '0x140a Spanish (COSTA RICA)', 'hr' => '0x041a Croatian', 'cs' => '0x0405 Czech', 'da' => '0x0406 Danish', # 'es' => '0x1c0a Spanish (DOMINICAN REPUBLIC)', # 'es' => '0x300a Spanish (ECUADOR)', # 'ar' => '0x0c01 Arabic (EGYPT)', # 'es' => '0x440a Spanish (EL SALVADOR)', 'et' => '0x0425 Estonian', 'fo' => '0x0438 Faeroese', 'fi' => '0x040b Finnish', 'fr' => '0x040c French (FRANCE)', 'de' => '0x0407 German (GERMANY)', 'el' => '0x0408 Greek', # 'es' => '0x100a Spanish (GUATEMALA)', # 'es' => '0x480a Spanish (HONDURAS)', # 'zh' => '0x0c04 Chinese (HONG KONG)', 'hu' => '0x040e Hungarian', 'is' => '0x040f Icelandic', 'hi' => '0x0439 Hindi', 'in' => '0x04', 'fa' => '0x0429 Farsi', # 'ar' => '0x0801 Arabic (IRAQ)', # 'en' => '0x1809 English (IRELAND)', 'iw' => '0x04', 'it' => '0x0410 Italian', # 'en' => '0x2009 English (JAMAICA)', 'ja' => '0x0411 Japanese', # 'ar' => '0x2c01 Arabic (JORDAN)', 'sw' => '0x0441 Swahili', 'ko' => '0x0412 Korean', # 'ar' => '0x3401 Arabic (KUWAIT)', 'al' => '0x0426 Latvian (Lettish)', # 'ar' => '0x3001 Arabic (LEBANON)', # 'ar' => '0x1001 Arabic (LIBYAN ARAB JAMAHIRIYA)', # 'de' => '0x1407 German (LIECHTENSTEIN)', 'lt' => '0x0427 Lithuanian', # 'de' => '0x1007 German (LUXEMBOURG)', # 'zh' => '0x1404 Chinese (MACAU)', 'mk' => '0x042f Macedonian', # 'ms' => '0x043e Malay (MALAYSIA)', # 'es' => '0x080a Spanish (MEXICO)', # 'fr' => '0x180c French (MONACO)', # 'ar' => '0x1801 Arabic (MOROCCO)', 'nl' => '0x0413 Dutch', # 'en' => '0x1409 English (NEW ZEALAND)', # 'es' => '0x4c0a Spanish (NICARAGUA)', 'no' => '0x0414 Norwegian', # 'ar' => '0x2001 Arabic (OMAN)', 'ur' => '0x0420 Urdu', # 'es' => '0x180a Spanish (PANAMA)', # 'es' => '0x3c0a Spanish (PARAGUAY)', # 'es' => '0x280a Spanish (PERU)', # 'en' => '0x3409 English (PHILIPPINES)', 'pl' => '0x0415 Polish', 'pt' => '0x0816 Portuguese (PORTUGAL)', # 'es' => '0x500a Spanish (PUERTO RICO)', # 'ar' => '0x4001 Arabic (QATAR)', 'ro' => '0x0418 Romanian', 'ru' => '0x0419 Russian', 'ar' => '0x0401 Arabic (SAUDI ARABIA)', # 'zh' => '0x1004 Chinese (SINGAPORE)', 'sk' => '0x041b Slovak', 'sl' => '0x0424 Slovenian', 'af' => '0x0436 Afrikaans', 'ca' => '0x0403 Catalan', 'sv' => '0x041d Swedish', # 'de' => '0x0807 German (SWITZERLAND)', # 'ar' => '0x2801 Arabic (SYRIAN ARAB REPUBLIC)', # 'zh' => '0x0404 Chinese (TAIWAN, PROVINCE OF CHINA)', 'th' => '0x041e Thai', # 'en' => '0x2c09 English (TRINIDAD AND TOBAGO)', # 'ar' => '0x1c01 Arabic (TUNISIA)', 'tr' => '0x041f Turkish', 'uk' => '0x0422 Ukrainian', # 'ar' => '0x3801 Arabic (UNITED ARAB EMIRATES)', # 'en' => '0x0809 English (UNITED KINGDOM)', # 'en' => '0x0409 English (UNITED STATES)', # 'es' => '0x380a Spanish (URUGUAY)', # 'es' => '0x200a Spanish (VENEZUELA)', 'vi' => '0x242a Vietnamese', # 'ar' => '0x2401 Arabic (YEMEN)', # 'en' => '0x3009 English (ZIMBABWE)', #'' => '', ); my %hhk_global_property = ( 'ImageType' => 'Folder', ); my %hhc_global_property = ( 'ImageType' => 'Folder', ); # We prepare a environment for conversion of texi to unicode (maybe this # could be in utf8.init ?) my %chm_texi_map = %texi_map; my %chm_simple_map_texi = %simple_map_texi; my %chm_style_map_texi = (); foreach my $command (keys(%style_map_texi)) { $chm_style_map_texi{$command} = {}; foreach my $key (keys (%{$style_map_texi{$command}})) { #print STDERR "$command, $key, $style_map_texi{$command}->{$key}\n"; $chm_style_map_texi{$command}->{$key} = $style_map_texi{$command}->{$key}; } } foreach my $key (keys(%unicode_accents)) { $chm_style_map_texi{$key}->{'function'} = \&t2h_utf8_accent; } foreach my $key (%things_map) { if (exists($unicode_map{$key}) and ($unicode_map{$key} ne '')) { $chm_texi_map{$key} = chr(hex($unicode_map{$key})); } } $chm_simple_map_texi{"\n"} = ' '; my $hhp_lines = ''; sub chm_init_out() { my $encoding = &$default_init_out(); $TOC_FILE = $Texi2HTML::THISDOC{'file_base_name'}.'.hhc'; my $hhk_file = "$Texi2HTML::THISDOC{'destination_directory'}$Texi2HTML::THISDOC{'file_base_name'}" . ".hhk"; open(IDXFILE, ">:encoding(utf8)", $hhk_file) || die "Can't open $file_name for writing: $!\n"; print "# writing HTML Help index in $hhk_file...\n" if $VERBOSE; print IDXFILE "\n\n"; print IDXFILE "\n\n"; print IDXFILE "\n\n\n"; print IDXFILE "\n"; foreach my $property (keys(%hhk_global_property)) { print IDXFILE "\n"; } print IDXFILE "\n"; my $hhp_file = "$Texi2HTML::THISDOC{'destination_directory'}$Texi2HTML::THISDOC{'file_base_name'}.hhp"; print "# writing HTML Help project in $hhp_file...\n" if $VERBOSE; open (HHPFILE, ">:encoding(utf8)", $hhp_file) or die "Can't open $hhp_file for writing: $!\n"; my $language = $chm_languages{'en'}; if (exists ($chm_languages{$LANG})) { $language = $chm_languages{$LANG}; } my $title = to_utf8($Texi2HTML::THISDOC{'title_texi'}); print HHPFILE < $PRE_BODY_CLOSE

    EOT } # Convert texi to string with utf8 sub to_utf8($) { my $text = shift; $main::simple_map_texi_ref = \%chm_simple_map_texi; $main::style_map_texi_ref = \%chm_style_map_texi; $main::texi_map_ref = \%chm_texi_map; my $normal_text_kept = $normal_text; $Texi2HTML::Config::normal_text = \&t2h_utf8_normal_text; $text = main::remove_texi($text); $normal_text = $normal_text_kept; $main::simple_map_texi_ref = \%simple_map_texi; $style_map_texi_ref = \%style_map_texi; $main::texi_map_ref = \%texi_map; return $text; } my @hhc_lines; my %chm_files; sub chm_toc_body($) { my $elements_ref = shift; &$default_toc_body($elements_ref); my $level = 0; foreach my $element (@$elements_ref) { while ($level != $element->{'toc_level'}) { if ($level < $element->{'toc_level'}) { push (@hhc_lines, "
      \n"); $level++; } elsif ($level > $element->{'toc_level'}) { push (@hhc_lines, "
    \n"); $level--; } } my $text = ''; if ($NUMBER_SECTIONS) { $text .= $element->{'number'} . " "; } $text .= to_utf8($element->{'texi'}); $text =~ s/^\s*//; push (@hhc_lines, "
  • \n\n{'file'}#$element->{'id'}\">\n
  • \n"); if (!$chm_files{$element->{'file'}}) { $hhp_lines .= "$element->{'file'}\n"; $chm_files{$element->{'file'}} = 1; } } while ($level > 0) { push (@hhc_lines, "\n"); $level--; } } # key: # origin_href: # entry: # texi entry: # element_href: # element_text: sub chm_index_summary_file_entry ($$$$$$$$) { my $name = shift; my $key = shift; my $origin_href = shift; my $entry = shift; my $text = ''; #$entry = &$protect_text($key); my $texi_entry = shift; my $element_href = shift; my $element_text = shift; my $is_printed = shift; $entry = to_utf8($texi_entry); print IDXFILE "
  • \n\n\n
  • \n"; } sub chm_index_summary_file_begin($$) { my $name = shift; my $is_printed = shift; } # file is not closed here but in finish_out. sub chm_index_summary_file_end($$) { my $name = shift; my $is_printed = shift; } sub chm_finish_out() { print IDXFILE "\n\n"; close (IDXFILE); my $hhc_file = "$Texi2HTML::THISDOC{'destination_directory'}$Texi2HTML::THISDOC{'file_base_name'}.hhc"; open (HHCFILE, ">:encoding(utf8)", $hhc_file) or die "Can't open $hhc_file for writing: $!\n"; print HHCFILE "\n\n"; print HHCFILE "\n\n"; print HHCFILE "\n\n\n"; print HHCFILE "\n"; foreach my $property (keys(%hhc_global_property)) { print HHCFILE "\n"; } print HHCFILE "\n"; main::print_lines(\*HHCFILE, \@hhc_lines); print HHCFILE "\n\n"; print HHPFILE $hhp_lines; close (HHPFILE); } 1; texi2html-1.76/examples/roff.init0000644000076400007640000010065410164547034012531 # -*-perl-*- 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}]$/)); return "\\(,${text}" if (($accent eq ',') 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 ? # otherwise we should use # return ascii_accents($text, $accent); 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 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" ], # 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' => {} ); # 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 $complex_format_map = { 'example' => { 'begin' => q{""}, 'end' => q{""}, 'begin_region' => ".(l I\n\\&\\fR\\f(CW", 'end_region' => "\\&\\fR\n.)l\n" }, 'smallexample' => { 'begin' => q{""}, 'end' => q{""}, 'begin_region' => ".(l I\n.size -2\n\\&\\fR\\f(CW", 'end_region' => "\\&\\fR\n.size +2\n.)l\n" }, 'display' => { 'begin' => q{""}, 'end' => q{""}, 'begin_region' => ".(l I\n\\&\\fR\\f(CW", 'end_region' => "\\&\\fR\n.)l\n" }, 'smalldisplay' => { 'begin' => q{""}, 'end' => q{""}, 'begin_region' => ".(l I\n.size -2\n\\&\\fR\\f(CW", 'end_region' => "\\&\\fR\n.size +2\n.)l\n" }, 'menu-comment' => { 'begin' => q{""}, 'end' => q{""}, 'begin_region' => "", 'end_region' => "\n" }, 'menu-preformatted' => { 'begin' => q{""}, 'end' => q{""}, '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; #$text =~ s/---/\\(em/g; $text =~ s/(--?-?)/$;$1$;/go; return $text; } sub t2h_roff_unknown($$) { my $macro = shift; my $line = shift; if ($macro eq '*') { $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" . &$I('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 $text = shift; my $href = shift; my $node = shift; my $name = shift; my $ending = shift; $name .= ':' if ($name ne ''); return "$MENU_SYMBOL$name$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 $text = shift; my $state = shift; my $href = shift; my $node = shift; my $name = shift; my $ending = shift; $name .= ':' if ($name ne ''); return "$MENU_SYMBOL$name$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; $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 $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'))); 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; } # 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 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_roff_heading($) { my $element = 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" . &$I('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; if ($style eq 'verbatim' or $style eq 'tex' or $style eq 'html') { chomp ($text); return ".(l M\n\\fR\\&\\f(CW" . &$protect_text($text) . "\\fR\n.)l\n" ; } 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_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 $label = shift; my $index_name = shift; return ".(x $index_name\n" . protect_spaces($label) . "\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; texi2html-1.76/i18n/0000777000076400007640000000000010200552514007715 5texi2html-1.76/i18n/en0000644000076400007640000001347710200537754010203 $LANGUAGES->{'en'} = { ' The buttons in the navigation panels have the following meaning:' => '', ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '', ' Up ' => '', '%{acronym_like} (%{explanation})' => '', '%{month}, %{day} %{year}' => '', '%{name} of %{class}' => '', '%{name} on %{class}' => '', '%{node_file_href}' => '', '%{node_file_href} @cite{%{book}}' => '', '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '', '%{reference_name}' => '', '%{style} %{number}' => '', '%{style}: %{caption_first_line}' => '', '%{style}: %{shortcaption_first_line}' => '', '@b{%{quotation_arg}:} ' => '', '@cite{%{book}}' => '', 'About This Document' => '', 'April' => '', 'August' => '', 'Button' => '', 'Contents' => '', 'Current Position' => '', 'December' => '', 'February' => '', 'Footnotes' => '', 'From 1.2.3 go to' => '', 'Go to' => '', 'Index' => '', 'Index Entry' => '', 'January' => '', 'July' => '', 'Jump to' => '', 'June' => '', 'March' => '', 'May' => '', 'Menu:' => '', 'Name' => '', 'Next' => '', 'November' => '', 'October' => '', 'Overview' => '', 'Overview:' => '', 'Prev' => '', 'Section' => '', 'Section One' => '', 'See %{node_file_href}' => '', 'See %{node_file_href} @cite{%{book}}' => '', 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'See %{reference_name}' => '', 'See @cite{%{book}}' => '', 'See section %{reference_name}' => '', 'See section `%{section}\' in @cite{%{book}}' => '', 'September' => '', 'Short Table of Contents' => '', 'Subsection One-Four' => '', 'Subsection One-One' => '', 'Subsection One-Three' => '', 'Subsection One-Two' => '', 'Subsubsection One-Two-Four' => '', 'Subsubsection One-Two-One' => '', 'Subsubsection One-Two-Three' => '', 'Subsubsection One-Two-Two' => '', 'T2H_today' => '%s, %d %d', 'Table of Contents' => '', 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '', 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'Top' => '', 'Untitled Document' => '', 'about (help)' => '', 'beginning of this chapter or previous chapter' => '', 'by @emph{%{user}}' => '', 'by @emph{%{user}} on @emph{%{date}}' => '', 'cover (top) of document' => '', 'current' => '', 'current section' => '', 'first section in reading order' => '', 'following node' => '', 'index' => '', 'last section in reading order' => '', 'next chapter' => '', 'next node' => '', 'next section in reading order' => '', 'next section on same level' => '', 'node following in node reading order' => '', 'node up' => '', 'on @emph{%{date}}' => '', 'previous node' => '', 'previous section in reading order' => '', 'previous section on same level' => '', 'section `%{section}\' in @cite{%{book}}' => '', 'see %{node_file_href}' => '', 'see %{node_file_href} @cite{%{book}}' => '', 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'see %{reference_name}' => '', 'see @cite{%{book}}' => '', 'see section %{reference_name}' => '', 'see section `%{section}\' in @cite{%{book}}' => '', 'short table of contents' => '', 'table of contents' => '', 'unknown' => '', 'up node' => '', 'up section' => '' }; $T2H_OBSOLETE_STRINGS->{'en'} = {}; texi2html-1.76/i18n/de0000644000076400007640000001422710200537754010163 $LANGUAGES->{'de'} = { ' The buttons in the navigation panels have the following meaning:' => '', ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '', ' Up ' => '', '%{acronym_like} (%{explanation})' => '', '%{month}, %{day} %{year}' => '', '%{name} of %{class}' => '', '%{name} on %{class}' => '', '%{node_file_href}' => '', '%{node_file_href} @cite{%{book}}' => '', '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '', '%{reference_name}' => '', '%{style} %{number}' => '', '%{style}: %{caption_first_line}' => '', '%{style}: %{shortcaption_first_line}' => '', '@b{%{quotation_arg}:} ' => '', '@cite{%{book}}' => '', 'About This Document' => '@"Uber dieses Dokument', 'April' => 'April', 'August' => 'August', 'Button' => '', 'Contents' => '', 'Current Position' => '', 'December' => 'Dezember', 'February' => 'Februar', 'Footnotes' => 'Fu@ss{}noten', 'From 1.2.3 go to' => '', 'Go to' => '', 'Index' => 'Index', 'Index Entry' => '', 'January' => 'Januar', 'July' => 'Juli', 'Jump to' => '', 'June' => 'Juni', 'March' => 'M@"arz', 'May' => 'Mai', 'Menu:' => '', 'Name' => '', 'Next' => '', 'November' => 'November', 'October' => 'Oktober', 'Overview' => '', 'Overview:' => '', 'Prev' => '', 'Section' => '', 'Section One' => '', 'See %{node_file_href}' => '', 'See %{node_file_href} @cite{%{book}}' => '', 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'See %{reference_name}' => '', 'See @cite{%{book}}' => '', 'See section %{reference_name}' => '', 'See section `%{section}\' in @cite{%{book}}' => '', 'September' => 'September', 'Short Table of Contents' => 'Kurzes Inhaltsverzeichniss', 'Subsection One-Four' => '', 'Subsection One-One' => '', 'Subsection One-Three' => '', 'Subsection One-Two' => '', 'Subsubsection One-Two-Four' => '', 'Subsubsection One-Two-One' => '', 'Subsubsection One-Two-Three' => '', 'Subsubsection One-Two-Two' => '', 'T2H_today' => '', 'Table of Contents' => 'Inhaltsverzeichniss', 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '', 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'Top' => '', 'Untitled Document' => '', 'about (help)' => '', 'beginning of this chapter or previous chapter' => '', 'by @emph{%{user}}' => '', 'by @emph{%{user}} on @emph{%{date}}' => '', 'cover (top) of document' => '', 'current' => '', 'current section' => '', 'first section in reading order' => '', 'following node' => '', 'index' => '', 'last section in reading order' => '', 'next chapter' => '', 'next node' => '', 'next section in reading order' => '', 'next section on same level' => '', 'node following in node reading order' => '', 'node up' => '', 'on @emph{%{date}}' => '', 'previous node' => '', 'previous section in reading order' => '', 'previous section on same level' => '', 'section `%{section}\' in @cite{%{book}}' => '', 'see %{node_file_href}' => '', 'see %{node_file_href} @cite{%{book}}' => '', 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'see %{reference_name}' => '', 'see @cite{%{book}}' => '', 'see section %{reference_name}' => '', 'see section `%{section}\' in @cite{%{book}}' => '', 'short table of contents' => '', 'table of contents' => '', 'unknown' => '', 'up node' => '', 'up section' => '' }; $T2H_OBSOLETE_STRINGS->{'de'} = { 'See' => 'Siehe', 'section' => 'Abschnitt', 'see' => 'siehe' }; texi2html-1.76/i18n/es0000644000076400007640000001420410200537754010175 $LANGUAGES->{'es'} = { ' The buttons in the navigation panels have the following meaning:' => '', ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '', ' Up ' => '', '%{acronym_like} (%{explanation})' => '', '%{month}, %{day} %{year}' => '', '%{name} of %{class}' => '', '%{name} on %{class}' => '', '%{node_file_href}' => '', '%{node_file_href} @cite{%{book}}' => '', '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '', '%{reference_name}' => '', '%{style} %{number}' => '', '%{style}: %{caption_first_line}' => '', '%{style}: %{shortcaption_first_line}' => '', '@b{%{quotation_arg}:} ' => '', '@cite{%{book}}' => '', 'About This Document' => '', 'April' => 'abril', 'August' => 'agosto', 'Button' => '', 'Contents' => '', 'Current Position' => '', 'December' => 'diciembre', 'February' => 'febrero', 'Footnotes' => '', 'From 1.2.3 go to' => '', 'Go to' => '', 'Index' => 'Index', 'Index Entry' => '', 'January' => 'enero', 'July' => 'julio', 'Jump to' => '', 'June' => 'junio', 'March' => 'marzo', 'May' => 'mayo', 'Menu:' => '', 'Name' => '', 'Next' => '', 'November' => 'noviembre', 'October' => 'octubre', 'Overview' => '', 'Overview:' => '', 'Prev' => '', 'Section' => '', 'Section One' => '', 'See %{node_file_href}' => '', 'See %{node_file_href} @cite{%{book}}' => '', 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'See %{reference_name}' => '', 'See @cite{%{book}}' => '', 'See section %{reference_name}' => '', 'See section `%{section}\' in @cite{%{book}}' => '', 'September' => 'septiembre', 'Short Table of Contents' => 'Resumen del Contenido', 'Subsection One-Four' => '', 'Subsection One-One' => '', 'Subsection One-Three' => '', 'Subsection One-Two' => '', 'Subsubsection One-Two-Four' => '', 'Subsubsection One-Two-One' => '', 'Subsubsection One-Two-Three' => '', 'Subsubsection One-Two-Two' => '', 'T2H_today' => '', 'Table of Contents' => '@\'{@dotless{I}}ndice General', 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '', 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'Top' => '', 'Untitled Document' => '', 'about (help)' => '', 'beginning of this chapter or previous chapter' => '', 'by @emph{%{user}}' => '', 'by @emph{%{user}} on @emph{%{date}}' => '', 'cover (top) of document' => '', 'current' => '', 'current section' => '', 'first section in reading order' => '', 'following node' => '', 'index' => '', 'last section in reading order' => '', 'next chapter' => '', 'next node' => '', 'next section in reading order' => '', 'next section on same level' => '', 'node following in node reading order' => '', 'node up' => '', 'on @emph{%{date}}' => '', 'previous node' => '', 'previous section in reading order' => '', 'previous section on same level' => '', 'section `%{section}\' in @cite{%{book}}' => '', 'see %{node_file_href}' => '', 'see %{node_file_href} @cite{%{book}}' => '', 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'see %{reference_name}' => '', 'see @cite{%{book}}' => '', 'see section %{reference_name}' => '', 'see section `%{section}\' in @cite{%{book}}' => '', 'short table of contents' => '', 'table of contents' => '', 'unknown' => '', 'up node' => '', 'up section' => '' }; $T2H_OBSOLETE_STRINGS->{'es'} = { 'See' => 'V@\'ease', 'section' => 'secci@\'on', 'see' => 'v@\'ase' }; texi2html-1.76/i18n/fr0000644000076400007640000003102010200537754010170 $LANGUAGES->{'fr'} = { ' The buttons in the navigation panels have the following meaning:' => ' Les boutons de navigation ont la signification suivante :', ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => ' Dans cet exemple on est @`a @strong{ Sous section un-deux-trois } dans un document dont la structure est :', ' Up ' => 'Plus haut', '%{acronym_like} (%{explanation})' => '', '%{month}, %{day} %{year}' => 'le %{day} %{month} %{year}', '%{name} of %{class}' => '%{name} de %{class}', '%{name} on %{class}' => '%{name} de %{class}', '%{node_file_href}' => '', '%{node_file_href} @cite{%{book}}' => '', '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '%{node_file_href} section `%{section}\' dans @cite{%{book}}', '%{reference_name}' => '', '%{style} %{number}' => '', '%{style}: %{caption_first_line}' => '', '%{style}: %{shortcaption_first_line}' => '', '@b{%{quotation_arg}:} ' => '', '@cite{%{book}}' => '', 'About This Document' => 'A propos de ce document', 'April' => 'Avril', 'August' => 'Ao@^ut', 'Button' => 'Bouton', 'Contents' => 'Table des mati@`eres', 'Current Position' => 'Position', 'December' => 'D@\'ecembre', 'February' => 'F@\'evrier', 'Footnotes' => 'Notes de bas de page', 'From 1.2.3 go to' => 'Depuis 1.2.3 aller @`a', 'Go to' => 'Aller @`a', 'Index' => 'Index', 'Index Entry' => 'Entr@\'ee d\'index', 'January' => 'Janvier', 'July' => 'Juillet', 'Jump to' => 'Aller @`a', 'June' => 'Juin', 'March' => 'Mars', 'May' => 'Mai', 'Menu:' => 'Menu@ :', 'Name' => 'Nom', 'Next' => 'Suivant', 'November' => 'Novembre', 'October' => 'Octobre', 'Overview' => 'Vue d\'ensemble', 'Overview:' => 'Vue d\'ensemble@ :', 'Prev' => 'Pr@\'ec@\'edent', 'Section' => '', 'Section One' => 'Section un', 'See %{node_file_href}' => 'Voir %{node_file_href}', 'See %{node_file_href} @cite{%{book}}' => 'Voir %{node_file_href} @cite{%{book}}', 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => 'Voir %{node_file_href} section `%{section}\' dans @cite{%{book}}', 'See %{reference_name}' => 'Voir %{reference_name}', 'See @cite{%{book}}' => 'Voir @cite{%{book}}', 'See section %{reference_name}' => 'Voir la section %{reference_name}', 'See section `%{section}\' in @cite{%{book}}' => 'Voir la section `%{section}\' dans @cite{%{book}}', 'September' => 'Septembre', 'Short Table of Contents' => 'R@\'esum@\'e du contenu', 'Subsection One-Four' => 'Sous section un-quatre', 'Subsection One-One' => 'Sous section un-un', 'Subsection One-Three' => 'Sous section un-trois', 'Subsection One-Two' => 'Sous section un-deux', 'Subsubsection One-Two-Four' => 'Sous sous section un-deux-quatre', 'Subsubsection One-Two-One' => 'Sous sous section un-deux-un', 'Subsubsection One-Two-Three' => 'Sous sous section un-deux-trois', 'Subsubsection One-Two-Two' => 'Sous sous section un-deux-deux', 'T2H_today' => 'le %2$d %1$s %3$d', 'Table of Contents' => 'Table des mati@`eres', 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} @emph{%{date}} en utilisant @uref{%{program_homepage}, @emph{%{program}}}.', 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} en utilisant @uref{%{program_homepage}, @emph{%{program}}}.', 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '', 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e en utilisant @uref{%{program_homepage}, @emph{%{program}}}.', 'Top' => '', 'Untitled Document' => 'Document sans titre', 'about (help)' => '@`a propos (page d\'aide)', 'beginning of this chapter or previous chapter' => 'd@\'ebut de ce chapitre ou chapitre pr@\'ec@\'edent', 'by @emph{%{user}}' => 'par @emph{%{user}}', 'by @emph{%{user}} on @emph{%{date}}' => 'par @emph{%{user}} @emph{%{date}}', 'cover (top) of document' => 'couverture (top) du document', 'current' => 'courante', 'current section' => 'section actuelle', 'first section in reading order' => 'premi@`e section dans l\'ordre de lecture', 'following node' => 'node suivant', 'index' => 'index', 'last section in reading order' => 'derni@`ere section dans l\'ordre de lecture', 'next chapter' => 'chapitre suivant', 'next node' => 'node suivant', 'next section in reading order' => 'section suivante dans l\'ordre de lecture', 'next section on same level' => 'section suivante au m@^eme niveau', 'node following in node reading order' => 'node suivant dans l\'ordre des nodes', 'node up' => 'node au dessus', 'on @emph{%{date}}' => '@emph{%{date}}', 'previous node' => 'node pr@\'ec@\'edent', 'previous section in reading order' => 'section pr@\'ec@\'edente dans l\'ordre de lecture', 'previous section on same level' => 'section pr@\'ec@\'edente au m@^eme niveau', 'section `%{section}\' in @cite{%{book}}' => 'section `%{section}\' dans @cite{%{book}}', 'see %{node_file_href}' => 'voir %{node_file_href}', 'see %{node_file_href} @cite{%{book}}' => 'voir %{node_file_href} @cite{%{book}}', 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => 'voir %{node_file_href} section `%{section}\' dans @cite{%{book}}', 'see %{reference_name}' => 'voir %{reference_name}', 'see @cite{%{book}}' => 'voir @cite{%{book}}', 'see section %{reference_name}' => 'voir la section %{reference_name}', 'see section `%{section}\' in @cite{%{book}}' => 'voir la section `%{section}\' dans @cite{{book}}', 'short table of contents' => 'table des mati@`eres r@\'esum@\'ee', 'table of contents' => 'table des mati@`eres', 'unknown' => 'inconnu', 'up node' => 'node au dessus', 'up section' => 'section sup@\'erieure' }; $T2H_OBSOLETE_STRINGS->{'fr'} = { ' This document was generated %{who_and_when_generated} using %{program_homepage_href}.' => ' Ce document a été généré %{who_and_when_generated} en utilisant %{program_homepage_href}.', ' where the Example assumes that the current position is at Subsubsection One-Two-Three of a document of the following structure:' => ' Dans cet exemple on est à Sous section un-deux-trois dans un document dont la structure est :', '%{node_file_href} section `%{section}\' in %{book}' => '%{node_file_href} section `%{section}\' dans %{book}', 'See' => 'Voir', 'See %{node_file_href} %{book}' => 'Voir %{node_file_href} %{book}', 'See %{node_file_href} section `%{section}\' in %{book}' => 'Voir %{node_file_href} section `%{section}\' dans %{book}', 'See %{book}' => 'Voir %{book}', 'See section `%{section}\' in %{book}' => 'Voir la section `%{section}\' dans %{book}', 'This document was generated by %{user} on %{date} using %{program_homepage_href}.' => 'Ce document a été généré par %{user} %{date} en utilisant %{program_homepage_href}.', 'This document was generated by %{user} using %{program_homepage_href}.' => 'Ce document a été généré par %{user} en utilisant %{program_homepage_href}.', 'This document was generated by @emph{%{user}} on @emph{%{date}} using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} @emph{%{date}} en utilisant %{program_homepage_href}.', 'This document was generated by @emph{%{user}} using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} en utilisant %{program_homepage_href}.', 'This document was generated on %{date} using %{program_homepage_href}.' => 'Ce document a été généré %{date} en utilisant %{program_homepage_href}.', 'This document was generated on @emph{%{date}} using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e @emph{%{date}} en utilisant %{program_homepage_href}.', 'This document was generated on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e @emph{%{date}} en utilisant @uref{%{program_homepage}, @emph{%{program}}}.', 'This document was generated using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e en utilisant %{program_homepage_href}.', 'about (this page)' => 'a propos (cette page)', 'by %{user}' => 'par %{user}', 'by %{user} on %{date}' => 'par %{user} %{date}', 'concept index' => 'index', 'on %{date}' => '%{date}', 'section' => 'section', 'section `%{section}\' in %{book}' => 'section `%{section}\' dans %{book}', 'see' => 'voir', 'see %{node_file_href} %{book}' => 'voir %{node_file_href} %{book}', 'see %{node_file_href} section `%{section}\' in %{book}' => 'voir %{node_file_href} section `%{section}\' dans %{book}', 'see %{book}' => 'voir %{book}', 'see section `%{section}\' in %{book}' => 'voir la section `%{section}\' dans %{book}' }; texi2html-1.76/i18n/nl0000644000076400007640000001422610200537754010203 $LANGUAGES->{'nl'} = { ' The buttons in the navigation panels have the following meaning:' => '', ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '', ' Up ' => '', '%{acronym_like} (%{explanation})' => '', '%{month}, %{day} %{year}' => '', '%{name} of %{class}' => '', '%{name} on %{class}' => '', '%{node_file_href}' => '', '%{node_file_href} @cite{%{book}}' => '', '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '', '%{reference_name}' => '', '%{style} %{number}' => '', '%{style}: %{caption_first_line}' => '', '%{style}: %{shortcaption_first_line}' => '', '@b{%{quotation_arg}:} ' => '', '@cite{%{book}}' => '', 'About This Document' => 'No translation available!', 'April' => 'April', 'August' => 'Augustus', 'Button' => '', 'Contents' => '', 'Current Position' => '', 'December' => 'December', 'February' => 'Februari', 'Footnotes' => 'No translation available!', 'From 1.2.3 go to' => '', 'Go to' => '', 'Index' => 'Index', 'Index Entry' => '', 'January' => 'Januari', 'July' => 'Juli', 'Jump to' => '', 'June' => 'Juni', 'March' => 'Maart', 'May' => 'Mei', 'Menu:' => '', 'Name' => '', 'Next' => '', 'November' => 'November', 'October' => 'Oktober', 'Overview' => '', 'Overview:' => '', 'Prev' => '', 'Section' => '', 'Section One' => '', 'See %{node_file_href}' => '', 'See %{node_file_href} @cite{%{book}}' => '', 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'See %{reference_name}' => '', 'See @cite{%{book}}' => '', 'See section %{reference_name}' => '', 'See section `%{section}\' in @cite{%{book}}' => '', 'September' => 'September', 'Short Table of Contents' => 'Korte inhoudsopgave', 'Subsection One-Four' => '', 'Subsection One-One' => '', 'Subsection One-Three' => '', 'Subsection One-Two' => '', 'Subsubsection One-Two-Four' => '', 'Subsubsection One-Two-One' => '', 'Subsubsection One-Two-Three' => '', 'Subsubsection One-Two-Two' => '', 'T2H_today' => '', 'Table of Contents' => 'Inhoudsopgave', 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '', 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'Top' => '', 'Untitled Document' => '', 'about (help)' => '', 'beginning of this chapter or previous chapter' => '', 'by @emph{%{user}}' => '', 'by @emph{%{user}} on @emph{%{date}}' => '', 'cover (top) of document' => '', 'current' => '', 'current section' => '', 'first section in reading order' => '', 'following node' => '', 'index' => '', 'last section in reading order' => '', 'next chapter' => '', 'next node' => '', 'next section in reading order' => '', 'next section on same level' => '', 'node following in node reading order' => '', 'node up' => '', 'on @emph{%{date}}' => '', 'previous node' => '', 'previous section in reading order' => '', 'previous section on same level' => '', 'section `%{section}\' in @cite{%{book}}' => '', 'see %{node_file_href}' => '', 'see %{node_file_href} @cite{%{book}}' => '', 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'see %{reference_name}' => '', 'see @cite{%{book}}' => '', 'see section %{reference_name}' => '', 'see section `%{section}\' in @cite{%{book}}' => '', 'short table of contents' => '', 'table of contents' => '', 'unknown' => '', 'up node' => '', 'up section' => '' }; $T2H_OBSOLETE_STRINGS->{'nl'} = { 'See' => 'Zie', 'section' => 'sectie', 'see' => 'zie' }; texi2html-1.76/i18n/no0000644000076400007640000001423410200537754010205 $LANGUAGES->{'no'} = { ' The buttons in the navigation panels have the following meaning:' => '', ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '', ' Up ' => '', '%{acronym_like} (%{explanation})' => '', '%{month}, %{day} %{year}' => '', '%{name} of %{class}' => '', '%{name} on %{class}' => '', '%{node_file_href}' => '', '%{node_file_href} @cite{%{book}}' => '', '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '', '%{reference_name}' => '', '%{style} %{number}' => '', '%{style}: %{caption_first_line}' => '', '%{style}: %{shortcaption_first_line}' => '', '@b{%{quotation_arg}:} ' => '', '@cite{%{book}}' => '', 'About This Document' => 'No translation available!', 'April' => 'april', 'August' => 'august', 'Button' => '', 'Contents' => '', 'Current Position' => '', 'December' => 'desember', 'February' => 'februar', 'Footnotes' => 'No translation available!', 'From 1.2.3 go to' => '', 'Go to' => '', 'Index' => 'Indeks', 'Index Entry' => '', 'January' => 'januar', 'July' => 'juli', 'Jump to' => '', 'June' => 'juni', 'March' => 'mars', 'May' => 'mai', 'Menu:' => '', 'Name' => '', 'Next' => '', 'November' => 'november', 'October' => 'oktober', 'Overview' => '', 'Overview:' => '', 'Prev' => '', 'Section' => '', 'Section One' => '', 'See %{node_file_href}' => '', 'See %{node_file_href} @cite{%{book}}' => '', 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'See %{reference_name}' => '', 'See @cite{%{book}}' => '', 'See section %{reference_name}' => '', 'See section `%{section}\' in @cite{%{book}}' => '', 'September' => 'september', 'Short Table of Contents' => 'Kort innholdsfortegnelse', 'Subsection One-Four' => '', 'Subsection One-One' => '', 'Subsection One-Three' => '', 'Subsection One-Two' => '', 'Subsubsection One-Two-Four' => '', 'Subsubsection One-Two-One' => '', 'Subsubsection One-Two-Three' => '', 'Subsubsection One-Two-Two' => '', 'T2H_today' => '', 'Table of Contents' => 'Innholdsfortegnelse', 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '', 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'Top' => '', 'Untitled Document' => '', 'about (help)' => '', 'beginning of this chapter or previous chapter' => '', 'by @emph{%{user}}' => '', 'by @emph{%{user}} on @emph{%{date}}' => '', 'cover (top) of document' => '', 'current' => '', 'current section' => '', 'first section in reading order' => '', 'following node' => '', 'index' => '', 'last section in reading order' => '', 'next chapter' => '', 'next node' => '', 'next section in reading order' => '', 'next section on same level' => '', 'node following in node reading order' => '', 'node up' => '', 'on @emph{%{date}}' => '', 'previous node' => '', 'previous section in reading order' => '', 'previous section on same level' => '', 'section `%{section}\' in @cite{%{book}}' => '', 'see %{node_file_href}' => '', 'see %{node_file_href} @cite{%{book}}' => '', 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'see %{reference_name}' => '', 'see @cite{%{book}}' => '', 'see section %{reference_name}' => '', 'see section `%{section}\' in @cite{%{book}}' => '', 'short table of contents' => '', 'table of contents' => '', 'unknown' => '', 'up node' => '', 'up section' => '' }; $T2H_OBSOLETE_STRINGS->{'no'} = { 'See' => 'Se', 'section' => 'avsnitt', 'see' => 'se' }; texi2html-1.76/i18n/pt0000644000076400007640000001415610200537754010217 $LANGUAGES->{'pt'} = { ' The buttons in the navigation panels have the following meaning:' => '', ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '', ' Up ' => '', '%{acronym_like} (%{explanation})' => '', '%{month}, %{day} %{year}' => '', '%{name} of %{class}' => '', '%{name} on %{class}' => '', '%{node_file_href}' => '', '%{node_file_href} @cite{%{book}}' => '', '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '', '%{reference_name}' => '', '%{style} %{number}' => '', '%{style}: %{caption_first_line}' => '', '%{style}: %{shortcaption_first_line}' => '', '@b{%{quotation_arg}:} ' => '', '@cite{%{book}}' => '', 'About This Document' => '', 'April' => 'Abril', 'August' => 'Agosto', 'Button' => '', 'Contents' => '', 'Current Position' => '', 'December' => 'Dezembro', 'February' => 'Fevereiro', 'Footnotes' => '', 'From 1.2.3 go to' => '', 'Go to' => '', 'Index' => '@\'Indice', 'Index Entry' => '', 'January' => 'Janeiro', 'July' => 'Julho', 'Jump to' => '', 'June' => 'Junho', 'March' => 'Mar@,{c}o', 'May' => 'Maio', 'Menu:' => '', 'Name' => '', 'Next' => '', 'November' => 'Novembro', 'October' => 'Outubro', 'Overview' => '', 'Overview:' => '', 'Prev' => '', 'Section' => '', 'Section One' => '', 'See %{node_file_href}' => '', 'See %{node_file_href} @cite{%{book}}' => '', 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'See %{reference_name}' => '', 'See @cite{%{book}}' => '', 'See section %{reference_name}' => '', 'See section `%{section}\' in @cite{%{book}}' => '', 'September' => 'Setembro', 'Short Table of Contents' => 'Breve Sum@\'ario', 'Subsection One-Four' => '', 'Subsection One-One' => '', 'Subsection One-Three' => '', 'Subsection One-Two' => '', 'Subsubsection One-Two-Four' => '', 'Subsubsection One-Two-One' => '', 'Subsubsection One-Two-Three' => '', 'Subsubsection One-Two-Two' => '', 'T2H_today' => '', 'Table of Contents' => 'Sum@\'ario', 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '', 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '', 'Top' => '', 'Untitled Document' => '', 'about (help)' => '', 'beginning of this chapter or previous chapter' => '', 'by @emph{%{user}}' => '', 'by @emph{%{user}} on @emph{%{date}}' => '', 'cover (top) of document' => '', 'current' => '', 'current section' => '', 'first section in reading order' => '', 'following node' => '', 'index' => '', 'last section in reading order' => '', 'next chapter' => '', 'next node' => '', 'next section in reading order' => '', 'next section on same level' => '', 'node following in node reading order' => '', 'node up' => '', 'on @emph{%{date}}' => '', 'previous node' => '', 'previous section in reading order' => '', 'previous section on same level' => '', 'section `%{section}\' in @cite{%{book}}' => '', 'see %{node_file_href}' => '', 'see %{node_file_href} @cite{%{book}}' => '', 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '', 'see %{reference_name}' => '', 'see @cite{%{book}}' => '', 'see section %{reference_name}' => '', 'see section `%{section}\' in @cite{%{book}}' => '', 'short table of contents' => '', 'table of contents' => '', 'unknown' => '', 'up node' => '', 'up section' => '' }; $T2H_OBSOLETE_STRINGS->{'pt'} = { 'See' => 'Veja', 'section' => 'Se@,{c}@~ao', 'see' => 'veja' }; texi2html-1.76/images/0000777000076400007640000000000010200552515010404 5texi2html-1.76/images/a_begin.gif0000755000076400007640000000162307727135266012424 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,xHА С*\ШАa€ #J|(БтBŠ-bЬ8тB"†dИ1!Ш†'IzT˜’eK…%Мљ2aЬ–4k И92ЇNž&}:\д%ЭЁ gU™tЄQЄК„:%UŽWБ^$Њ&зЎ;KЖЌйГ;texi2html-1.76/images/a_begin_na.gif0000755000076400007640000000161507727135266013103 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,rHА С*\ША! #J|(БтBŠ-bЬ8тEA2м˜Щ&=*<™ђ#K•%7šly&JŒ3iЎДй2ЇЮ’<)њ|9gNžAU™д%вЂMkBuј”ЁРˆU9†ДЉugз­CУŠ;texi2html-1.76/images/a_document.gif0000755000076400007640000000163707727135266013163 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,„HА С*\ШАa€ #J|(БтBŠ hмШ‘уEˆ-†TˆQ“=ž$ в$Ъ”]ВTИвbM%Ov|Љѓ#M™@Ю YSчЦ 9о™0щN•>™VМщfLЊ-—FФњгъеЈA%rЭшеуP‘[Ђu8 €лЗpуЪ ;texi2html-1.76/images/a_document_na.gif0000755000076400007640000000163607727135266013640 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,ƒHА С*\ША! #J|(БтBŠ hмШ‘уEˆФ€фУŽK‚TЉ№$ЪLЎЄ(R Ь–1=ъœЩѓЁMˆo†ФшR#Ы8‰(TeЧœF›в$ (ЯЄ/Ѓ^EZ3цVЇY;UЄдАПVэŠЉE‹Eб† ;texi2html-1.76/images/a_empty.gif0000755000076400007640000000155707727135266012504 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,THА С*\ШАa€ #J|(БтBŠ-bЬ8"ЧŽA†tшqфХ’&nL)`eJ—&aŽ”’цG›qfдЉхKŸ1JДЈбЃ;texi2html-1.76/images/a_end.gif0000755000076400007640000000162607727135266012111 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,{HА С*\ШАa€ #J|(БтBŠ-bЬ8тB€dИ1ЁШ†'IzT(r$K— K h 3хХ•&iОtˆs&Э‘6cіќ fB™?wЊdЈSщMІA}ђ„ŠвЈЄ!­Ъфј”kФ­^Џі +6€йГhгЊ ;texi2html-1.76/images/a_end_na.gif0000755000076400007640000000162307727135266012564 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,xHА С*\ША! #J|(БтBŠ-bЬ8тХˆ8єЈ0ЄУ Q)ђЂЪ—,]’L9s%Ы–6kТМ™ђЅЮ›CъќЩR`N†;zŠ”ЈбžC‘*•йДщЯЈ k&|ZR+ЧЎ_;†)ЈйГ7;texi2html-1.76/images/a_help.gif0000755000076400007640000000161407727135266012270 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,qHА С*\ШАa€ #J|(БтBŠhд8"У DФИ0$H‡žLИхGŽ*a^L)qхL‹6oжl9’fIž=wŠЌHђхаŽ“§y4hF™Nš”jU†KЏ*| ЋзЏ`У;texi2html-1.76/images/a_help_na.gif0000755000076400007640000000162007727135266012743 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,uHА С*\ШАa€ #J|(БтBŠhд8"У dєx1фF‡$‚И1ЅŒ [zlљбЅ„/i^ДYRЃРšWк„љQцШ‰>yОTЊѓЈDœNr Ъд'UЄD>§йбЂзЌ^kšK6@@;texi2html-1.76/images/a_index.gif0000755000076400007640000000164307727135266012451 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,ˆHА С*\ШАa€ #J|(БтBŠ DРБЃЦ„pйQdХjє˜2ЄФ•ЂмxbF˜#qŽiгdУ• [і|щГЈKš)…одi’ЅЬž)Fexє'Щ’<ЅZ84gЮЋ;ИœZдса,•ZДXuэХтЪKЗn€€;texi2html-1.76/images/a_index_na.gif0000755000076400007640000000165707727135266013134 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,”HА С*\ША! #J|(БтBŠ DРБЃЦŒ3jєрЁA M јауЧ’!ЦL)РeHŒ%7B,ˆRdЩŽ0]вЄЙs`KЃ7gЮ‰БщR‡5“іJВЅGЉ ‹ ЄШцТЇVіЬu%СБ?ŽЌI­JЄfz§Ъа%ЧЁуž›w"[Л€;texi2html-1.76/images/a_leftdouble.gif0000755000076400007640000000162407727135266013466 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,yHА С*\ШАa€ #J|(БтBŠ-bЬ8bD/zd$I“ 7*,‰2!K‘'K.dйR%M”7aКЬ)рfЭ‘>wвд)TfбŸ1[UЈRhLЂ3[ю„:3$г‘bЭJ•kЪ­^< @ЖЌйГh;texi2html-1.76/images/a_leftdouble_na.gif0000755000076400007640000000162407727135266014144 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,yHА С*\ША! #J|(БтBŠ-bЬ8bD/zd`cТ’#MžDy‘хЩ‘+]()г$M—77ъЬ 1ЇЮ”•JГЊе˜;texi2html-1.76/images/a_page.gif0000755000076400007640000000163107727135266012253 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,~HА С*\ШАa€ #J|(БтBŠ hмШq"ФŒCˆˆQ€F†'O2,ЉRЁЪ– YŽ\(rхG“3]†ДЉГ"L2}цŒyѓ'ЭЁ@‹"=ЪЄаІ8Ÿ^T*UaP‰?eŠм9UчжŽ]-Z,)–ф€hгЊ]Ы6@@;texi2html-1.76/images/a_page_na.gif0000755000076400007640000000162707727135266012736 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,|HА С*\ША! #J|(БтBŠ hмШq"ФŒCˆˆ1€Ц‚'5:ќhВdKˆ*/В3цМY“ча‰:’LЊ0(CЇ=]•йTjUЃW‘b)в&UЎ]7nMxарW‹†]2 ;texi2html-1.76/images/a_rightdouble.gif0000755000076400007640000000162607727135266013653 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,{HА С*\ШАa€ #J|(БтBŠ-bЬ8bBAvT@фТ’#?Ђ<Й’сЦ’-Р4Љ№хL’7/z”9SdOš6sўд‰fб˜‚вЬIT%MžOкlˆДцЮЈ2+nфшp'W—^ПZл5€йГhгЊ ;texi2html-1.76/images/a_rightdouble_na.gif0000755000076400007640000000163407727135266014330 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,HА С*\ША! #J|(БтBŠ-bЬ8bBAvT@фE“ 7–D`eH-]’”yцЪ’3i~ДySdO”*{Bќi“чJ1ЭљауMЄ$BM:uчЬЊ%ЋZн “ыЫ…]†ЪБтЦВ)ЧЂm)рЇлЗ;texi2html-1.76/images/a_right.gif0000755000076400007640000000161107727135266012452 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,nHА С*\ШАa€ #J|(БтBŠ-bЬ8bCl\dЦ‘ KšЌˆ2ЁЪ•[ x “ЁLš5оЄй1"ЯžUjєШPшPŸ9%RfH‘KŸъŒ*jU›hнЪЕЋз;texi2html-1.76/images/a_right_na.gif0000755000076400007640000000161007727135266013127 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,mHА С*\ША! #J|(БтBŠ-bЬ8ЂCŽ6^РQЄB(3šLˆ2eХ•![’ьQІK‡к„ЩSІРš9GЂќ Дца :‘В|ЈєbSІ*›ъ$MЋ8БтмЩЕ+€€;texi2html-1.76/images/a_searchdoc.gif0000755000076400007640000000170007727135266013267 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,ЅHА С*\ШАa€ #J|(ё CˆиШЃBŠмшQШ†5Š\щё$У”9ахТ”ˆ8ГfI аЙ3&M“?ƒн˜SЇЦЃ.eЊ$iдчТ•,™:э‰TЁЬЏTŸZŠuЋЪœbЛ’=›•*W$СJM WeТЁ[g2‹ЕfЮВMљrd(ѓЂФУ m"ОиДБуЧ;texi2html-1.76/images/a_searchdoc_na.gif0000755000076400007640000000165507727135266013756 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,’HА С*\ША! #J|(БтBŠhдштD‚/zŒјcI‘) м@!F’6XщёeТ4"ЬYsфMŒ,MіМ(“%ШЁ.c–TZiЮ A­YriUЁ7Љ*Щu#ЭЌ?™BЅ85ЋЮЃ:u‚хЉ6ЉZkm›T!A†wQZДxuЌ_–;texi2html-1.76/images/a_search.gif0000755000076400007640000000164407727135266012610 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,‰HА С*\ШАa€ #J|(БтBŠ-b\ ЃТŽBd2dТ’"‚ќш‘сЦ“ KЦt9ђЃ€•2M*|ГчЬ5=‚ єЇ€EЭйђhPІI›"ѕy“jBЄUužЬ дцJŽ\Џ>§Ъ’ьЫŒ)бNЌЉ–fлˆШKЗЎн;texi2html-1.76/images/a_search_na.gif0000755000076400007640000000164307727135266013265 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,ˆHА С*\ША! #J|(БтBŠ-bМ€ТŽnќ(уУ‘PІьq%Ъ— =Ц IRdI–'Y^l™pІЯŽ;?цЬydЭžCoе™’'Ю™KM:ѕ•щЦЄ”,кђ*з ЛN Ы‘lг…І=›БЂЪЖGс:ЌњГ.€€;texi2html-1.76/images/a_tableofcon.gif0000755000076400007640000000164407727135266013457 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,‰HА С*\ШАa€ #J|(БтBŠhм@!Ц@†ЌјQcH“#9vLXВЃH—=B< sхЪˆ+жD) %Э„.оєљr$P™@MН9t&ШЅ1YЮдIвЉR”;›&­ytЂUЎ)Ѓіќњг(ЮЉUђЬiбk[‹ШKЗЎн;texi2html-1.76/images/a_tableofcon_na.gif0000755000076400007640000000166007727135266014133 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,•HА С*\ША! #J|(БтBŠhм@!Ц@†<˜№ЃF!>фиБ$Ф'SŽdљвфЪ“#tЉ!Т›"sТь(rхР5cт4ЪShJ™L&Њ%Чš/u дZ•ыVЇ‡КdщqЊUŠw‚Ѕ:“cй’JбBT‹‘Ћ]–a›Z$)дbE xу ;texi2html-1.76/images/a_top.gif0000755000076400007640000000160407727135266012141 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,iHА С*\ШАa€ #J|(БтBŠ-bЬ8ЂB CŠЩpЃ€‘(”єШ1ЂЩ–Y6$YёхЧ5eойqfJ—:Sт\ЙP(ߘ0&uЈsЉЭЄOaFmљ0€еЋXГj ;texi2html-1.76/images/a_top_na.gif0000755000076400007640000000160507727135266012620 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,jHА С*\ШАa€ #J|(БтBŠ-bЬ8ЂТ CŠЩpЃ€‘(MšpАрE#ЎМ@#Ь’!+Ю<9ВЃУ”2oђLYГфMЂ"2lI№eLŸO zrjдO"н2 ;texi2html-1.76/images/a_up.gif0000755000076400007640000000157607727135266011773 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,cHА С*\ШАa€ #J|(БтBŠ-bЬ8"ЧŽAJ@ЃЧ†$IVмИ0eJ‘-]Оtx2ЁL™4cоtЩeH…> њ“hHЃ‘rTš‘ЉЩPЃJJ5@@;texi2html-1.76/images/a_up_na.gif0000755000076400007640000000157607727135266012451 GIF89aї{{{НННоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,cHА С*\ШАa€ #J|(БтBŠ-bЬ8"ЧŽAN  бЃУ(+nМˆВЅH–-]:4™0ІM’ WоМ™“І€ƒ/њ Ys(б•D‹&эЙThS…H“>мIug@;texi2html-1.76/images/bg.jpg0000644000076400007640000000501407727135266011436 џиџрJFIFHHџэКPhotoshop 3.08BIMщxHHк(џсџтљFG(ќHHи(d'`8BIMэHH8BIMѓ8BIM 8BIM' 8BIMѕH/fflff/ffЁ™š2Z5-8BIMјpџџџџџџџџџџџџџџџџџџџџџџшџџџџџџџџџџџџџџџџџџџџџџшџџџџџџџџџџџџџџџџџџџџџџшџџџџџџџџџџџџџџџџџџџџџџш8BIM8BIM8BIM@@8BIM І€€€ŠџиџрJFIFHHџў'File written by Adobe PhotoshopЈ 4.0џюAdobed€џл„            џР€"џнџФ?   3!1AQa"q2‘ЁБB#$RСb34r‚бC%’S№сёcs5ЂВƒ&D“TdEТЃt6вUтeђГ„УгuуѓF'”Є…Д•ФдфєЅЕХехѕVfv†–ІЖЦжці7GWgw‡—ЇЗЧзчї5!1AQaq"2‘ЁБB#СRб№3$bсr‚’CScs4ё%ЂВƒ&5ТвD“TЃdEU6teтђГ„УгuуѓF”Є…Д•ФдфєЅЕХехѕVfv†–ІЖЦжці'7GWgw‡—ЇЗЧџк ?яўЌЩCў6пќјѕЌОUI6$К?%гљЅц_Њ’_*ЄœЕњЉ%ђЊI)њЉ%ђЊI)њЉ%ђЊI)њЉ%ђЊI)њЉ%ђЊI)њЉ%ђЊI)џй8BIMџў'File written by Adobe PhotoshopЈ 4.0џюAdobedџл„         џР џн џФЂ  s!1AQa"q2‘ЁБB#СRбс3b№$r‚ё%C4S’ЂВcsТ5D'“ЃГ6TdtУвт&ƒ „”EFЄДVгU(ђуѓФдфєeu…•ЅЕХехѕfv†–ІЖЦжці7GWgw‡—ЇЗЧзчї8HXhxˆ˜ЈИШишј)9IYiy‰™ЉЙЩйщљ*:JZjzŠšЊКЪкъњm!1AQa"q‘2ЁБ№Сбс#BRbrё3$4C‚’S%ЂcВТsв5тDƒT“ &6E'dtU7ђЃГУ()гуѓ„”ЄДФдфєeu…•ЅЕХехѕFVfv†–ІЖЦжціGWgw‡—ЇЗЧзчї8HXhxˆ˜ЈИШишј9IYiy‰™ЉЙЩйщљ*:JZjzŠšЊКЪкъњџк ?4гМаQПџxЎ?уџФNUŸш—ѕKv/Ў?ж Ыђў?џу џˆŒч]ћкqWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUЌ иФ+АЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ_џа4гМаQПџxЎ?уџФNUŸш—ѕKv/Ў?ж Ыђў?џу џˆŒч]ћкqWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUЌ иФ+АЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ]ŠЛv*ьUиЋБWbЎХ_џйtexi2html-1.76/images/bg_left.gif0000644000076400007640000000024007727135266012431 GIF87aU@ѓРРРЖЖЖЛЛЛЫЫЫаааеее№№№ѕѕѕ§§§џџџ,U@UpШIЋН8ыЭЛџ`(ŽdižhЊЎlыОp,ЯtmпxЎя|яџР pH,ШЄrЩl:ŸаЈtJ­ZЏиЌvЫэzПрАxL.›ЯшДzЭnЛп№И|NЏляф;texi2html-1.76/images/bg_right.gif0000644000076400007640000000056607727135266012627 GIF87aвBѓРРРЖЖЖЛЛЛЫЫЫаааеее№№№ѕѕѕ§§§џџџ,вBўЩIЋН8ыЭЛџ`(ŽdižhЊЎlыОp,ЯtmпxЎя|яџР pH,ШЄrЩl:ŸаЈtJ­ZЏиЌvЫэzПрАxL.›ЯшДzЭnЛп№И|NЏляјМ~Яяћџ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ HА Сƒ*\ШАЁУ‡#JœHБЂХ‹3jмШБЃЧ, CŠIВЄЩ“(SЊ\ЩВЅЫ—0cЪœIГІЭ›8sъмЩГЇЯŸ@ƒ JTJ;texi2html-1.76/images/blue_dir.gif0000644000076400007640000000036407727135266012623 GIF87aуЦџ‡ЮыООО/OO€џџџp€џ,Љ0ЩIЋ•цъkr `(Žc'‘(j~i ЎnxЬGЧ‡  uѓДaHЮ >O Ї; €( €иА a* ат1yb" Џz€Іa•ДmwІФяВ№жUWdq}€^wcY{]€vx…K4h‰mŒp;[`gšeZPRwЁ„0 FNDЈ|/JIЗИВ”1!Л7О Ј&ЙЧШQШЫЬЗ;texi2html-1.76/images/blue_down.gif0000644000076400007640000000021507727135266013007 GIF87aТЦџ€џџџџ,ZHКмЎтЩ'"8ыНЋт ш]a‰І‰ІсšC,ЫцfsоYœ5ѓpnЏ\PјщŽУM%ЦZе lЙk†ŒX/ˆл%Б тsЉАеžŠ|NЏляxy;texi2html-1.76/images/blue_grab.gif0000644000076400007640000000025107727135266012753 GIF87aТЦџ€џџџџ,vHКмЎтЩ'"8ыНЋт ш]ac' УP­ъ— mUзшliДлџ‚,ХЛЙŒУ]ёШќaˆЈU EE>•РЊжu•ѕ˜лA@'c…ЋАhй|цvIЯщyL†?лiЕ§ОЅзArh1{|‚Ь№в[х\ ЌQcfq}3„f†uLˆxŠ|~TmHŠs‡mcegš4VXZ}Ё”l=P]ЉЋ0Ža6F=БЋv=НК`/$Љ&ЦЧШЧYЩЬЭЩ;texi2html-1.76/images/blue_top.gif0000644000076400007640000000024107727135266012641 GIF87aТЦџццњ‡Юы€џџџџ,nhКмЎфЩGЂ8ыНЋтYfо5 У”cP* ЏЪм[#Ў К‚­cwЗтxL~6ДуЄ u zЎЊЊXМдчЦЅCе.2;ЦШytИЕэ4qЪgbzaD‡ˆ‰Š‹Œ‡ ;texi2html-1.76/images/blue_up.gif0000644000076400007640000000021407727135266012463 GIF87aТЦџ€џџџџ,YHКмЎтЩ'"8ыНЋт ш]a‰І‰–AЙ†ƒkБC+Ю№пш5‰д }Х`ЗI—=ЭЯiЫМ2N tˆ™fЋ€kj;‰Ы'&кЊ^‡#•И|NЏляё;texi2html-1.76/images/blue_uup.gif0000644000076400007640000000024507727135266012654 GIF89aТЦџ€џџџџЦЦЦ!ўMade with GIMP,`HКмЎтЩ'"8ыНЋт ш]!”c ЈUУ)Кс`‡)лrGsЖрьУй{™м&Шф(3F&№Ф0Џ>"є*еTUYx(Жr›ЩŸљ|KkзlЏz,гн•М~Яяћџy ;texi2html-1.76/images/contents_motif.gif0000644000076400007640000000034107727135266014064 GIF89aAёПППчччooo[!љ,AВŒЉЫэЃœM€ГоМћr‚„ц‰†у•ЖЎЙ–яLgё6фCЭw–Юv/ЂЄ1b”(fS…\‚tЦnФfжь•ћХќИS)VH6›ЗФvвMw”ntѕ-OзEq'zWEЕЇЇХЧ’‡ИЈ†˜Д5–HHЉцGзј'Щ֘Wљјˆ)ЇХDѕЇGЧiз й +[ЛAk›‹›[ЛЫ3"%vZщДšв.ё{;texi2html-1.76/images/xy_next.gif0000644000076400007640000000016307727135266012531 GIF89aЁўўўХХХ!љ,DœЉЫэЃ„b>Q-!ыФuтhp€щ}ъzКхЪŽ/O7оF;лЃЬ`/ш›uI j*>9вiењD0ГмюГ;texi2html-1.76/images/xy_next_gr.gif0000644000076400007640000000015607727135266013223 GIF89aЁВВВўўўХХХ!љ,?”ЉЫэЃ„`>P-!ыФuи‰ЃСaц˜ЊžжКl‡Щ0]Їwою5§‰ƒД!Бw aN(crЩD͘㣾z-;texi2html-1.76/images/xy_nextsection.gif0000644000076400007640000000021107727135266014110 GIF89aЁўўўХХХ!љ,ZœЉЫэ—˜тд˜wLŒhœ5‚ож A‰‰i€‚. ФбlЈЕ§рМc5|КA…ŠЄБЦЬ№ŠСrЊ<^YдЈ Е:œоэЋl&‰!Ф5›b1ЩчєКR;texi2html-1.76/images/xy_nextsection_gr.gif0000644000076400007640000000020307727135266014601 GIF89aЁВВВўўўХХХ!љ,T”ЉЫэ˜рд˜fИbbЄqРіЁпinjФvлШ=1;їœ3;еSќ€4]БE<њ”8Ъkљj*У)•9{ЃЎš Ћ§rНЙLБ”жьЖћ );texi2html-1.76/images/xy_previous.gif0000644000076400007640000000016107727135266013425 GIF89aЁўўўХХХ!љ,BœЉЫэуђ ZйХ9нРuЦŠЧ”&š†лŠpœЭєњЎжљ~ѓ{С/XќeЙ%гЩt™—ЉBjЭjЗж;texi2html-1.76/images/xy_previous_gr.gif0000644000076400007640000000015607727135266014121 GIF89aЁВВВўўўХХХ!љ,?”ЉЫэуђZйХ9нРuЦŠЧ”&š†лŠpœЭє nЈœojзђЙpBг(ї[’JІrИ‚ЎŒдЊѕК(;texi2html-1.76/images/xy_previoussection.gif0000644000076400007640000000021007727135266015005 GIF89aЁўўўХХХ!љ,YœЉЫэЃœGTЉЩ;K 8ˆ_Œ•GBІк‘ Р%;{@Mš-Cлй| А‡k+PЗcЦ~Šх0щ0^Yш–њ”оИEЯuF!ЩГ5иuсhцєzЃ;texi2html-1.76/images/xy_previoussection_gr.gif0000644000076400007640000000020407727135266015500 GIF89aЁВВВўўўХХХ!љ,U”ЉЫэЃœT€ЉЩ;№ x•gи}PШŽЊУЖiљФВЏ$†тdНубr цFd….š2ˆќбзѓиKNЋЮiV* }­гІ7S†ЧГћ _;texi2html-1.76/images/xy_up.gif0000644000076400007640000000015307727135266012176 GIF89aЁўўўХХХ!љ,<œЉЫэЃœДк‹ЏљˆАurZЄЅ5Іj8ЕюkBђLл(ŽЏЭ ‡C˜bƒL*—Іѓ JЇTH;texi2html-1.76/images/xy_up_gr.gif0000644000076400007640000000014507727135266012667 GIF89aЁВВВўўўХХХ!љ,6”ЉЫэЃœДк‹/љ€АuпШiрvZфFR+лF/;3]/_РїОвс†ИŽёˆL*—Ь&Є;texi2html-1.76/README0000644000076400007640000001135110164550324007741 This is the README file for the GNU texi2html distribution. The primary distribution point is http://texi2html.cvshome.org/servlets/ProjectDownloadList For generic installation instructions on compiling and installing this Automake-based distribution, please read the file `INSTALL'. Installation notes specific to Texi2html: * Installation is fairly simple, no compilers are required. * You need to have perl version 5 or higher installed on your system to run 'texi2html'. * To generate Makefile.in etc., run `./autogen.sh' This distribution includes the following files, among others: README This file. NEWS Summary of new features by release. INTRODUCTION Brief introduction to texi2html and its usage. INSTALL Generic installation instructions. TODO Things which are yet to be done. Texi2html source files: texi2html Actual script to run. Generated by 'configure' from texi2html.pl, texi2html.init, MySimple.pm, T2h_i18n.pm, l2h.init and translations.pl. texi2html.pl Main source file of the converter. texi2html.init Default values of configurable parameters. `configure' inserts this file into texi2html.pl when it generates the actual `texi2html' script. MySimple.pm Perl module which handles the processing of command-line options. `configure' inserts this file into texi2html.pl when it generates the actual `texi2html' script. T2h_i18n.pm Code used to handle strings internationalization. translations.pl translations of strings generated by the script `manage_i18n.pl' from source files and files in the `i18n' directory. l2h.init default configuration file for `latex2html' used to convert maths and TeX. i18n/ Directory containing one file per language with translation of strings. Helper scripts manage_i18n.pl Helper script used to regenerate translations from the source files and the files in the `i18n/' directory. Documentation files: texi2html.texi Texinfo manual of texi2html. This manual is currently under construction. texi2html.1.in Template for generation of man pages of texi2html (`texi2html.1'). This man page is incomplete. Installation files: configure This file creates creates a Makefile which in turn creates an `info' or `makeinfo' executable, or a C sources distribution. configure.in This is a template for creating `configure' using Autoconf. Makefile.in This is a template for `configure' to use to make a Makefile. Created by Automake. Makefile.am This is a template for Automake to use to make a Makefile.in. WWW home page: http://texi2html.cvshome.org Mailing lists: - users@texi2html.cvshome.org for enhancement suggestions, authoring questions and general discussion. to subscribe to this mailinglist, visit http://texi2html.cvshome.org/servlets/ProjectMailingListList or send mail to users-subscribe@texi2html.cvshome.org . - dev@texi2html.cvshome.org for bug reports, patches, discussions about code. There are no corresponding newsgroups. For bug reports, please include enough information for the maintainers to reproduce the problem. Generally speaking, that means: - the version number of Texi2html and the program(s) involved (use --version). - the contents of any input files necessary to reproduce the bug (crucial!). - a description of the problem and any samples of the erroneous output. - anything else that you think would be helpful. Patches are most welcome; if possible, please make them against the source files (e.g., against texi2html.pl, or texi2html.init) with `diff -c' or `diff -u' and include ChangeLog entries. texi2html-1.76/configure.ac0000644000076400007640000000417110200532606011343 dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.53) AC_INIT([texi2html], [1.76], [users@texi2html.cvshome.org]) AM_INIT_AUTOMAKE([gnu 1.7 dist-bzip2]) dnl Disable Autoconf, Automake, and some other maintainer tools without the dnl --enable-maintainer-mode argument. AM_MAINTAINER_MODE dnl Misc variable settings PACKAGE_DATE=`"$srcdir"/mdate-sh "$srcdir"/configure.ac` AC_SUBST([PACKAGE_DATE]) INIT=$srcdir/texi2html.init AC_SUBST_FILE([INIT]) MYSIMPLE=$srcdir/MySimple.pm AC_SUBST_FILE([MYSIMPLE]) T2H_I18N=$srcdir/T2h_i18n.pm AC_SUBST_FILE([T2H_I18N]) T2H_L2H_FILE=$srcdir/l2h.init AC_SUBST_FILE([T2H_L2H_FILE]) T2H_TRANSLATIONS_FILE=$srcdir/translations.pl AC_SUBST_FILE([T2H_TRANSLATIONS_FILE]) AC_ARG_WITH([encode], AC_HELP_STRING([--with-encode], [use encode (default: detected)]), [if test $withval = 'no'; then USE_UNICODE=0 else USE_UNICODE=1 fi], [ if perl -e "use Encode; use Unicode::Normalize;" > /dev/null 2>&1; then USE_UNICODE=1 else USE_UNICODE=0 fi ]) AC_SUBST([USE_UNICODE]) dnl Checks for programs. AC_ARG_VAR([PERL], [The path to the `perl' executable.]) AC_PATH_PROG([PERL], [perl], [/usr/bin/env perl], [/opt/perl5/bin:"$PATH"]) AC_PROG_INSTALL dnl Checks for libraries. dnl Checks for header files. dnl Checks for typedefs, structures, and compiler characteristics. dnl Checks for library functions. # For teTeX and TeX Live. AC_CANONICAL_HOST AC_ARG_ENABLE(multiplatform, [ --enable-multiplatform put executables in bin/PLATFORM]) test "x$enable_multiplatform" = xyes \ && test "x$bindir" = 'x${exec_prefix}/bin' \ && bindir="$bindir/$host" AC_CONFIG_FILES([texi2html:texi2html.pl], [chmod +x texi2html]) AC_CONFIG_FILES([check_texinfo.pl], [chmod +x check_texinfo.pl]) dnl The bulk config files. AC_CONFIG_FILES([\ Makefile \ Tests/Makefile \ doc/Makefile \ texi2html.1 \ texi2html.spec \ ]) AC_OUTPUT texi2html-1.76/aclocal.m40000644000076400007640000006700610200537363010730 # generated automatically by aclocal 1.9.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # -*- Autoconf -*- # Copyright (C) 2002, 2003 Free Software Foundation, Inc. # Generated from amversion.in; do not edit by hand. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.9.3])]) # AM_AUX_DIR_EXPAND # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 6 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Do all the work for Automake. -*- Autoconf -*- # This macro actually does too much some checks are only needed if # your package does certain things. But this isn't really a big deal. # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 11 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.58])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # -*- Autoconf -*- # Copyright (C) 2003 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 1 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 AC_DEFUN([AM_MAINTAINER_MODE], [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode is disabled by default AC_ARG_ENABLE(maintainer-mode, [ --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer], USE_MAINTAINER_MODE=$enableval, USE_MAINTAINER_MODE=no) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST(MAINT)dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # Copyright (C) 2003, 2004 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 2 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # # Check to make sure that the build environment is sane. # # Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # AM_PROG_INSTALL_STRIP # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 1 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR texi2html-1.76/l2h.init0000644000076400007640000001010210010751536010422 ###################################################################### # from here on, its l2h init stuff # ## initialization for latex2html as for Singular manual generation ## obachman 3/99 # # Options controlling Titles, File-Names, Tracing and Sectioning # $TITLE = ''; $SHORTEXTN = 0; $LONG_TITLES = 0; $DESTDIR = ''; $NO_SUBDIR = 1; $PREFIX = ''; $AUTO_PREFIX = 0; $AUTO_LINK = 0; $SPLIT = 0; $MAX_LINK_DEPTH = 0; $TMP = ''; $DEBUG = 0; $VERBOSE = 1; # # Options controlling Extensions and Special Features # #$HTML_VERSION = "3.2"; # set by command line $TEXDEFS = 1; # we absolutely need that $EXTERNAL_FILE = ''; $SCALABLE_FONTS = 1; $NO_SIMPLE_MATH = 1; $LOCAL_ICONS = 1; $SHORT_INDEX = 0; $NO_FOOTNODE = 1; $ADDRESS = ''; $INFO = ''; # # Switches controlling Image Generation # $ASCII_MODE = 0; $NOLATEX = 0; $EXTERNAL_IMAGES = 0; $PS_IMAGES = 0; $NO_IMAGES = 0; $IMAGES_ONLY = 0; $REUSE = 2; $ANTI_ALIAS = 1; $ANTI_ALIAS_TEXT = 1; # #Switches controlling Navigation Panels # $NO_NAVIGATION = 1; $ADDRESS = ''; $INFO = 0; # 0 = do not make a "About this document..." section # #Switches for Linking to other documents # # currently -- we don't care $MAX_SPLIT_DEPTH = 0; # Stop making separate files at this depth $MAX_LINK_DEPTH = 0; # Stop showing child nodes at this depth $NOLATEX = 0; # 1 = do not pass unknown environments to Latex $EXTERNAL_IMAGES = 0; # 1 = leave the images outside the document $ASCII_MODE = 0; # 1 = do not use any icons or internal images # 1 = use links to external postscript images rather than inlined bitmap # images. $PS_IMAGES = 0; $SHOW_SECTION_NUMBERS = 0; ### Other global variables ############################################### $CHILDLINE = ""; # This is the line width measured in pixels and it is used to right justify # equations and equation arrays; $LINE_WIDTH = 500; # Used in conjunction with AUTO_NAVIGATION $WORDS_IN_PAGE = 300; # The value of this variable determines how many words to use in each # title that is added to the navigation panel (see below) # $WORDS_IN_NAVIGATION_PANEL_TITLES = 0; # This number will determine the size of the equations, special characters, # and anything which will be converted into an inlined image # *except* "image generating environments" such as "figure", "table" # or "minipage". # Effective values are those greater than 0. # Sensible values are between 0.1 - 4. $MATH_SCALE_FACTOR = 1.5; # This number will determine the size of # image generating environments such as "figure", "table" or "minipage". # Effective values are those greater than 0. # Sensible values are between 0.1 - 4. $FIGURE_SCALE_FACTOR = 1.6; # If both of the following two variables are set then the "Up" button # of the navigation panel in the first node/page of a converted document # will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set # to some text which describes this external link. $EXTERNAL_UP_LINK = ""; $EXTERNAL_UP_TITLE = ""; # If this is set then the resulting HTML will look marginally better if viewed # with Netscape. $NETSCAPE_HTML = 1; # Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0" # Paper sizes has no effect other than in the time it takes to create inlined # images and in whether large images can be created at all ie # - larger paper sizes *MAY* help with large image problems # - smaller paper sizes are quicker to handle $PAPERSIZE = "a4"; # Replace "english" with another language in order to tell LaTeX2HTML that you # want some generated section titles (eg "Table of Contents" or "References") # to appear in a different language. Currently only "english" and "french" # is supported but it is very easy to add your own. See the example in the # file "latex2html.config" $TITLES_LANGUAGE = "english"; 1; # This must be the last non-comment line # End File l2h.init ###################################################################### texi2html-1.76/Makefile.am0000644000076400007640000000543510177725143011132 ## Process this file with automake to produce Makefile.in SUBDIRS = . doc Tests imagesdir = $(pkgdatadir)/images i18ndir = $(pkgdatadir)/i18n # # This is to prevent texinfo.tex from being included # in the top-level distribution directory. TEXINFO_TEX = doc/texinfo.tex bin_SCRIPTS = texi2html texi2html_SOURCES = \ MySimple.pm \ T2h_i18n.pm \ texi2html.init \ texi2html.pl \ translations.pl noinst_SCRIPTS = manage_i18n.pl man_MANS = texi2html.1 EXTRA_DIST = \ INTRODUCTION \ MySimple.pod \ autogen.sh \ manage_i18n.pl \ missing-texi2html \ l2h.init \ texi2html.spec \ $(texi2html_SOURCES) dist_pkgdata_DATA = l2h.init \ examples/makeinfo.init \ examples/xhtml.init \ examples/html32.init \ examples/book.init \ examples/noheaders.init \ examples/inlinestyle.init \ examples/utf8.init \ examples/chm.init \ examples/roff.init dist_i18n_DATA = i18n/en \ i18n/de \ i18n/es \ i18n/fr \ i18n/nl \ i18n/no \ i18n/pt dist_images_DATA = images/a_begin.gif \ images/a_begin_na.gif \ images/a_document.gif \ images/a_document_na.gif \ images/a_empty.gif \ images/a_end.gif \ images/a_end_na.gif \ images/a_help.gif \ images/a_help_na.gif \ images/a_index.gif \ images/a_index_na.gif \ images/a_leftdouble.gif \ images/a_leftdouble_na.gif \ images/a_left.gif \ images/a_left_na.gif \ images/a_page.gif \ images/a_page_na.gif \ images/a_rightdouble.gif \ images/a_rightdouble_na.gif \ images/a_right.gif \ images/a_right_na.gif \ images/a_searchdoc.gif \ images/a_searchdoc_na.gif \ images/a_search.gif \ images/a_search_na.gif \ images/a_tableofcon.gif \ images/a_tableofcon_na.gif \ images/a_top.gif \ images/a_top_na.gif \ images/a_up.gif \ images/a_up_na.gif \ images/bg.jpg \ images/bg_left.gif \ images/bg_right.gif \ images/blue_dir.gif \ images/blue_down.gif \ images/blue_grab.gif \ images/blue_help.gif \ images/blue_next.gif \ images/blue_nnext.gif \ images/blue_pprev.gif \ images/blue_prev.gif \ images/blue_readme.gif \ images/blue_top.gif \ images/blue_up.gif \ images/blue_uup.gif \ images/contents_motif.gif \ images/COPYING \ images/index_motif.gif \ images/Mybg.gif \ images/next_motif.gif \ images/next_motif_gr.gif \ images/previous_motif.gif \ images/previous_motif_gr.gif \ images/spacer3.gif \ images/xy_contents.gif \ images/xy_foot.gif \ images/xy_next.gif \ images/xy_next_gr.gif \ images/xy_nextsection.gif \ images/xy_nextsection_gr.gif \ images/xy_previous.gif \ images/xy_previous_gr.gif \ images/xy_previoussection.gif \ images/xy_previoussection_gr.gif \ images/xy_up.gif \ images/xy_up_gr.gif texi2html: $(texi2html_SOURCES) translations.pl: texi2html.pl texi2html.init T2h_i18n.pm examples/roff.init \ examples/noheaders.init i18n/de i18n/nl i18n/es i18n/no i18n/pt i18n/fr $(PERL) $(srcdir)/manage_i18n.pl all texi2html-1.76/Makefile.in0000664000076400007640000006376610200537750011150 # Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) $(dist_i18n_DATA) \ $(dist_images_DATA) $(dist_pkgdata_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/check_texinfo.pl.in \ $(srcdir)/texi2html.1.in $(srcdir)/texi2html.pl \ $(srcdir)/texi2html.spec.in $(top_srcdir)/configure AUTHORS \ COPYING ChangeLog INSTALL NEWS TODO config.guess config.sub \ install-sh mdate-sh missing mkinstalldirs subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = texi2html check_texinfo.pl texi2html.1 \ texi2html.spec am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(i18ndir)" "$(DESTDIR)$(imagesdir)" \ "$(DESTDIR)$(pkgdatadir)" binSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(bin_SCRIPTS) $(noinst_SCRIPTS) SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; dist_i18nDATA_INSTALL = $(INSTALL_DATA) dist_imagesDATA_INSTALL = $(INSTALL_DATA) dist_pkgdataDATA_INSTALL = $(INSTALL_DATA) DATA = $(dist_i18n_DATA) $(dist_images_DATA) $(dist_pkgdata_DATA) ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_DATE = @PACKAGE_DATE@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_UNICODE = @USE_UNICODE@ VERSION = @VERSION@ ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = . doc Tests imagesdir = $(pkgdatadir)/images i18ndir = $(pkgdatadir)/i18n # # This is to prevent texinfo.tex from being included # in the top-level distribution directory. TEXINFO_TEX = doc/texinfo.tex bin_SCRIPTS = texi2html texi2html_SOURCES = \ MySimple.pm \ T2h_i18n.pm \ texi2html.init \ texi2html.pl \ translations.pl noinst_SCRIPTS = manage_i18n.pl man_MANS = texi2html.1 EXTRA_DIST = \ INTRODUCTION \ MySimple.pod \ autogen.sh \ manage_i18n.pl \ missing-texi2html \ l2h.init \ texi2html.spec \ $(texi2html_SOURCES) dist_pkgdata_DATA = l2h.init \ examples/makeinfo.init \ examples/xhtml.init \ examples/html32.init \ examples/book.init \ examples/noheaders.init \ examples/inlinestyle.init \ examples/utf8.init \ examples/chm.init \ examples/roff.init dist_i18n_DATA = i18n/en \ i18n/de \ i18n/es \ i18n/fr \ i18n/nl \ i18n/no \ i18n/pt dist_images_DATA = images/a_begin.gif \ images/a_begin_na.gif \ images/a_document.gif \ images/a_document_na.gif \ images/a_empty.gif \ images/a_end.gif \ images/a_end_na.gif \ images/a_help.gif \ images/a_help_na.gif \ images/a_index.gif \ images/a_index_na.gif \ images/a_leftdouble.gif \ images/a_leftdouble_na.gif \ images/a_left.gif \ images/a_left_na.gif \ images/a_page.gif \ images/a_page_na.gif \ images/a_rightdouble.gif \ images/a_rightdouble_na.gif \ images/a_right.gif \ images/a_right_na.gif \ images/a_searchdoc.gif \ images/a_searchdoc_na.gif \ images/a_search.gif \ images/a_search_na.gif \ images/a_tableofcon.gif \ images/a_tableofcon_na.gif \ images/a_top.gif \ images/a_top_na.gif \ images/a_up.gif \ images/a_up_na.gif \ images/bg.jpg \ images/bg_left.gif \ images/bg_right.gif \ images/blue_dir.gif \ images/blue_down.gif \ images/blue_grab.gif \ images/blue_help.gif \ images/blue_next.gif \ images/blue_nnext.gif \ images/blue_pprev.gif \ images/blue_prev.gif \ images/blue_readme.gif \ images/blue_top.gif \ images/blue_up.gif \ images/blue_uup.gif \ images/contents_motif.gif \ images/COPYING \ images/index_motif.gif \ images/Mybg.gif \ images/next_motif.gif \ images/next_motif_gr.gif \ images/previous_motif.gif \ images/previous_motif_gr.gif \ images/spacer3.gif \ images/xy_contents.gif \ images/xy_foot.gif \ images/xy_next.gif \ images/xy_next_gr.gif \ images/xy_nextsection.gif \ images/xy_nextsection_gr.gif \ images/xy_previous.gif \ images/xy_previous_gr.gif \ images/xy_previoussection.gif \ images/xy_previoussection_gr.gif \ images/xy_up.gif \ images/xy_up_gr.gif all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) texi2html: $(top_builddir)/config.status $(srcdir)/texi2html.pl cd $(top_builddir) && $(SHELL) ./config.status $@ check_texinfo.pl: $(top_builddir)/config.status $(srcdir)/check_texinfo.pl.in cd $(top_builddir) && $(SHELL) ./config.status $@ texi2html.1: $(top_builddir)/config.status $(srcdir)/texi2html.1.in cd $(top_builddir) && $(SHELL) ./config.status $@ texi2html.spec: $(top_builddir)/config.status $(srcdir)/texi2html.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" @list='$(bin_SCRIPTS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f $$d$$p; then \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ else :; fi; \ done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done uninstall-info-am: install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done install-dist_i18nDATA: $(dist_i18n_DATA) @$(NORMAL_INSTALL) test -z "$(i18ndir)" || $(mkdir_p) "$(DESTDIR)$(i18ndir)" @list='$(dist_i18n_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(dist_i18nDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(i18ndir)/$$f'"; \ $(dist_i18nDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(i18ndir)/$$f"; \ done uninstall-dist_i18nDATA: @$(NORMAL_UNINSTALL) @list='$(dist_i18n_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(i18ndir)/$$f'"; \ rm -f "$(DESTDIR)$(i18ndir)/$$f"; \ done install-dist_imagesDATA: $(dist_images_DATA) @$(NORMAL_INSTALL) test -z "$(imagesdir)" || $(mkdir_p) "$(DESTDIR)$(imagesdir)" @list='$(dist_images_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(dist_imagesDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(imagesdir)/$$f'"; \ $(dist_imagesDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(imagesdir)/$$f"; \ done uninstall-dist_imagesDATA: @$(NORMAL_UNINSTALL) @list='$(dist_images_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(imagesdir)/$$f'"; \ rm -f "$(DESTDIR)$(imagesdir)/$$f"; \ done install-dist_pkgdataDATA: $(dist_pkgdata_DATA) @$(NORMAL_INSTALL) test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)" @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(dist_pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \ $(dist_pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \ done uninstall-dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \ rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) $(mkdir_p) $(distdir)/. $(distdir)/examples $(distdir)/i18n $(distdir)/images @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(i18ndir)" "$(DESTDIR)$(imagesdir)" "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dist_i18nDATA install-dist_imagesDATA \ install-dist_pkgdataDATA install-man install-exec-am: install-binSCRIPTS install-info: install-info-recursive install-man: install-man1 installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-dist_i18nDATA \ uninstall-dist_imagesDATA uninstall-dist_pkgdataDATA \ uninstall-info-am uninstall-man uninstall-info: uninstall-info-recursive uninstall-man: uninstall-man1 .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-recursive ctags \ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \ dist-tarZ dist-zip distcheck distclean distclean-generic \ distclean-recursive distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-binSCRIPTS install-data \ install-data-am install-dist_i18nDATA install-dist_imagesDATA \ install-dist_pkgdataDATA install-exec install-exec-am \ install-info install-info-am install-man install-man1 \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-binSCRIPTS \ uninstall-dist_i18nDATA uninstall-dist_imagesDATA \ uninstall-dist_pkgdataDATA uninstall-info-am uninstall-man \ uninstall-man1 texi2html: $(texi2html_SOURCES) translations.pl: texi2html.pl texi2html.init T2h_i18n.pm examples/roff.init \ examples/noheaders.init i18n/de i18n/nl i18n/es i18n/no i18n/pt i18n/fr $(PERL) $(srcdir)/manage_i18n.pl all # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: texi2html-1.76/check_texinfo.pl.in0000755000076400007640000000414207673364524012657 #! @PERL@ #+############################################################################## # # check_texinfo.pl: Extract texinfo commands from files # # Copyright (C) 1999, 2000 Free Software Foundation, Inc. # # 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #-############################################################################## # This requires perl version 5 or higher require 5.0; use strict; use Getopt::Long; my $verbose; if (!GetOptions ("verbose" => \$verbose)) { die "usage: $0 [-v] file...\n"; } die "Need file to check\n" unless @ARGV > 0; my (%seen, %context); while (<>) { if (/\@(\*|\.|\:|\@|\{|\})/) { $seen{$&}++; $context{$&} .= "> $_" if $verbose; $_ = "$`XX$'"; redo; } if (/\@(\w+)/) { my ($before, $match, $after); ($before, $match, $after) = ($`, $&, $'); if ($before =~ /\b[-\w]+$/ && $after =~ /^[-\w.]*\b/) { # e-mail address $seen{'e-mail address'}++; $context{'e-mail address'} .= "> $_" if $verbose; } else { $seen{$match}++; $context{$match} .= "> $_" if $verbose; } $match =~ s/^\@/X/; $_ = "$before$match$after"; redo; } } foreach (sort(keys(%seen))) { if ($verbose) { print "$_\n"; print $context{$_}; } else { print "$_ ($seen{$_})\n"; } } texi2html-1.76/texi2html.1.in0000644000076400007640000001207207770413130011473 .TH TEXI2HTML 1 "@PACKAGE_DATE@" .AT 3 .SH NAME texi2html \- a Texinfo to HTML converter .SH SYNOPSIS .B texi2html [options] file .SH DESCRIPTION .I Texi2html converts the given Texinfo file to a set of HTML files. It tries to handle most of the Texinfo commands. It creates hypertext links for cross-references, footnotes... .PP .I Texi2html may furthermore use latex2html to generate HTML (code and/or images) for @math and @iftex tags (see the .B \-\-l2h option). .PP .I Texi2html creates several files depending on the contents of the Texinfo file and on the chosen options (see FILES). .PP The HTML files created by .I texi2html are closer to TeX than to Info. .SH OPTIONS Options may be abbreviated to th shortests unique prefix. The following is only an incomplete list of the available options: .TP 12 .B \-\-help [1|2] Print usage instructions and list the most important, all relevant, or all recognised (including obsolete) command-line options, and exit. .TP .B \-\-ifinfo \-\-iftex \-\-ifxml \-\-ifplaintext \-\-ifhtml Expand @ifinfo, @iftex and @tex, @ifxml and @xml, @ifplaintext, @ifhtml and @html regions, and don't expand @ifnot corresponding regions (default: ifhtml). .TP .B \-\-no\-ifinfo \-\-no\-iftex \-\-no\-ifxml \-\-no\-ifplaintext \-\-no\-html Don't expand @ifinfo, @iftex, @ifxml, @ifplaintext regions and expand @ifnot corresponding regions. .TP .B \-I \fIdir\fP Append \fIdir\fP to the directory list searched for included files. .TP .B \-P \fIdir\fP Prepend \fIdir\fP to the directory list searched for included files. .TP .B \-\-no\-menu Don't show the Texinfo menus; by default they are shown. .TP .B \-\-no\-number Don't number the sections. .TP .B \-\-split chapter|section|node Split the output into several HTML files (one per main chapter/section or node). .TP .B \-\-l2h Use latex2html for content of @math and @tex tags. Content must be such that both, latex and tex, can translate it correctly. I.e., no tex-only constructs must be used. .TP .B \-\-l2h\-l2h \fIprog\fP Use \fIprog\fP as latex2html program (default \fIlatex2html\fP). Program must be executable. .TP .B \-\-l2h\-init \fIfile\fP Use \fIfile\fP as latex2html init file. \fIfile\fP should be used to specify in which way latex2html handles mathematical expressions and formulas. Note that latex2html locates (and uses) init-files in the following order (provided they exist): (1) global init file (usually in latex2html source dir) (2) $HOME/.latex2html_init (3) ./.latex2html_init (4) init file given on command line. .TP .B \-\-l2h\-tmp \fIdir\fP Use \fIdir\fP as tmp dir for latex2html. This directory (resp. its path) must not contain a dot (i.e., a "."). .TP .B \-\-l2h\-clean remove all intermediate files generated by latex2html (prevents caching!) .TP .B \-\-l2h\-skip Do not really run latex2html. Use (kept) files of previous runs, instead. .TP .B \-\-Verbose Give a verbose output. .TP .B \-\-version Print version and exit. .PP .SH FILES Initialisation options are read first from @sysconfdir@/texi2html/Config (the exact location being changeable with the .RI --sysconfdir= dir option to the configure script), then from $HOME/.texi2html/Config, then any command-line options including \-\-init\-file options; with later settings overriding earlier ones. .P By default .I texi2html my creates the following files (foo being the name of the Texinfo file): .TP 16 .B foo_toc.html The table of contents (if @contents is present). .TP .B foo.html The document's contents or the Top element. .TP .B foo_fot.html The footnotes (if any). .TP .B foo_abt.html An help section. .TP .B foo_l2h_img* Images generated by latex2html (if any). .PP When used with the .B \-\-split option, it creates several files (one per chapter or node), named .B foo_n.html (n being the index of the chapter or node), and the .B foo.html file contains the Top element. .PP Otherwise it creates only one file: .B foo.html .SH VERSION This is \fItexi2html\fP version @PACKAGE_VERSION@, @PACKAGE_DATE@. .SH AUTHOR Texi2html was originally written by is Lionel Cons, CERN IT/DIS/OSE, Lionel.Cons@cern.ch. Over time, many other people around the net contributed to this program. Its current maintainer is Olaf Bachmann, obachman@mathematik.uni-kl.de. .SH AVAILABILITY The latest version of this program, as well as support in the form of mailing lists with archives, bug tracking, documentation, and other tools can be found at: http://texi2html.cvshome.org/ .SH COPYRIGHT Copyright \(co 1999, 2000, 2003 Free Software Foundation, Inc. There is NO warranty. You may redistribute this software under the terms of the GNU General Public License. For more information about these matters, see the file named COPYING. .SH "SEE ALSO" GNU Texinfo Documentation Format .br http://texinfo.org/ .br World Wide Web (WWW), HyperText Markup Language (HTML) .br http://www.w3.org .br LaTeX2HTML .br http://www-dsed.llnl.gov/files/programs/unix/latex2html .SH BUGS This man-page is not up-to-date and there exists no up-to-date documentation, yet. Until it exists, see the beginning of the texi2html.init file for remarks about command-line options and configurations. .ex texi2html-1.76/texi2html.pl0000755000076400007640000145463410200537364011361 #! @PERL@ 'di '; 'ig 00 '; #+############################################################################## # # texi2html: Program to transform Texinfo documents to HTML # # Copyright (C) 1999, 2000 Free Software Foundation, Inc. # # 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #-############################################################################## # This requires perl version 5 or higher #require 5.0; # for POSIX::setlocale and File::Spec require 5.00405; # Perl pragma to restrict unsafe constructs use strict; # used in case of tests, to revert to "C" locale. use POSIX qw(setlocale LC_ALL LC_CTYPE); # used to find a relative path back to the current working directory use File::Spec; # # According to # larry.jones@sdrc.com (Larry Jones) # this pragma is not present in perl5.004_02: # # Perl pragma to control optional warnings # use warnings; # Declarations. Empty lines separate the different classes of variables: #++############################################################################## # # NOTE FOR DEBUGGING THIS SCRIPT: # You can run 'perl texi2html.pl' directly, provided you have # the environment variable T2H_HOME set to the directory containing # the texi2html.init file # #--############################################################################## # CVS version: # $Id: texi2html.pl,v 1.126 2005/02/04 00:14:39 pertusus Exp $ # Homepage: my $T2H_HOMEPAGE = "http://texi2html.cvshome.org/"; # Authors (appears in comments): my $T2H_AUTHORS = < (original author) Karl Berry Olaf Bachmann and many others. Maintained by: Many creative people Send bugs and suggestions to EOT # Version: set in configure.in my $THISVERSION = '@PACKAGE_VERSION@'; my $THISPROG = "texi2html $THISVERSION"; # program name and version # set by configure, prefix for the sysconfdir and so on my $prefix = '@prefix@'; my $sysconfdir; my $pkgdatadir; my $datadir; # We need to eval as $prefix has to be expanded. However when we haven't # run configure @sysconfdir will be expanded as an array, thus we verify # whether configure was run or not if ('@sysconfdir@' ne '@' . 'sysconfdir@') { $sysconfdir = eval '"@sysconfdir@"'; } else { $sysconfdir = "/usr/local/etc"; } if ('@datadir@' ne '@' . 'datadir@') { $pkgdatadir = eval '"@datadir@/@PACKAGE@"'; $datadir = eval '"@datadir@"'; } else { $pkgdatadir = "/usr/local/share/texi2html"; $datadir = "/usr/local/share"; } # The man page for this program is included at the end of this file and can be # viewed using the command 'nroff -man texi2html'. #+++############################################################################ # # # Constants # # # #---############################################################################ my $DEBUG_MENU = 1; my $DEBUG_INDEX = 2; my $DEBUG_TEXI = 4; my $DEBUG_MACROS = 8; my $DEBUG_FORMATS = 16; my $DEBUG_ELEMENTS = 32; my $DEBUG_USER = 64; my $DEBUG_L2H = 128; my $ERROR = "***"; # prefix for errors my $WARN = "**"; # prefix for warnings my $VARRE = '[\w\-]+'; # RE for a variable name my $NODERE = '[^:]+'; # RE for node names my $MAX_LEVEL = 4; my $MIN_LEVEL = 1; my $i18n_dir = 'i18n'; # name of the directory containing the per language files my $conf_file_name = 'Config' ; my $texinfo_htmlxref = 'htmlxref.cnf'; # directories for texi2html init files my @texi2html_config_dirs = ('./'); push @texi2html_config_dirs, "$ENV{'HOME'}/.texi2html/" if (defined($ENV{'HOME'})); push @texi2html_config_dirs, "$sysconfdir/texi2html/" if (defined($sysconfdir)); push @texi2html_config_dirs, "$pkgdatadir" if (defined($pkgdatadir)); # directories for texinfo configuration files my @texinfo_config_dirs = ('./.texinfo/'); push @texinfo_config_dirs, "$ENV{'HOME'}/.texinfo/" if (defined($ENV{'HOME'})); push @texinfo_config_dirs, "$sysconfdir/texinfo/" if (defined($sysconfdir)); push @texinfo_config_dirs, "$datadir/texinfo/" if (defined($datadir)); #+++############################################################################ # # # Initialization # # Pasted content of File $(srcdir)/texi2html.init: Default initializations # # # #---############################################################################ # leave this within comments, and keep the require statement # This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init # exists. { package Texi2HTML::Config; sub load($) { my $file = shift; eval { require($file) ;}; if ($@ ne '') { print STDERR "error loading $file: $@\n"; return 0; } return 1; } # customization options variables use vars qw( $DEBUG $PREFIX $VERBOSE $SUBDIR $IDX_SUMMARY $SPLIT $SHORT_REF @EXPAND $EXPAND $TOP $DOCTYPE $FRAMESET_DOCTYPE $CHECK $TEST $DUMP_TEXI $MACRO_EXPAND $USE_GLOSSARY $INVISIBLE_MARK $USE_ISO $TOP_FILE $TOC_FILE $FRAMES $SHOW_MENU $NUMBER_SECTIONS $USE_NODES $USE_UNICODE $NODE_FILES $NODE_NAME_IN_MENU $AVOID_MENU_REDUNDANCY $SECTION_NAVIGATION $SHORTEXTN $EXTENSION $OUT $NOVALIDATE $DEF_TABLE $LANG $DO_CONTENTS $DO_SCONTENTS $SEPARATED_FOOTNOTES $TOC_LINKS $L2H $L2H_L2H $L2H_SKIP $L2H_TMP $L2H_CLEAN $L2H_FILE $L2H_HTML_VERSION $EXTERNAL_DIR @INCLUDE_DIRS @PREPEND_DIRS $IGNORE_PREAMBLE_TEXT @CSS_FILES ); # customization variables use vars qw( $ENCODING $DOCUMENT_ENCODING $MENU_PRE_STYLE $CENTER_IMAGE $EXAMPLE_INDENT_CELL $SMALL_EXAMPLE_INDENT_CELL $SMALL_FONT_SIZE $SMALL_RULE $DEFAULT_RULE $MIDDLE_RULE $BIG_RULE $TOP_HEADING $INDEX_CHAPTER $SPLIT_INDEX $HREF_DIR_INSTEAD_FILE $AFTER_BODY_OPEN $PRE_BODY_CLOSE $EXTRA_HEAD $VERTICAL_HEAD_NAVIGATION $WORDS_IN_PAGE $ICONS $UNNUMBERED_SYMBOL_IN_MENU $MENU_SYMBOL $OPEN_QUOTE_SYMBOL $CLOSE_QUOTE_SYMBOL $TOC_LIST_STYLE $TOC_LIST_ATTRIBUTE $TOP_NODE_FILE $NODE_FILE_EXTENSION $BEFORE_OVERVIEW $AFTER_OVERVIEW $BEFORE_TOC_LINES $AFTER_TOC_LINES $NEW_CROSSREF_STYLE %ACTIVE_ICONS %NAVIGATION_TEXT %PASSIVE_ICONS %BUTTONS_GOTO %BUTTONS_EXAMPLE @CHAPTER_BUTTONS @MISC_BUTTONS @SECTION_BUTTONS @SECTION_FOOTER_BUTTONS @NODE_FOOTER_BUTTONS ); # customization variables which may be guessed in the script #our $ADDRESS; use vars qw( $BODYTEXT $CSS_LINES $DOCUMENT_DESCRIPTION $EXTERNAL_CROSSREF_SPLIT ); # I18n use vars qw( $I $LANGUAGES ); # customizable subroutines references use vars qw( $print_section $one_section $end_section $print_Top_header $print_Top_footer $print_Top $print_Toc $print_Overview $print_Footnotes $print_About $print_misc_header $print_misc_footer $print_misc $print_section_header $print_section_footer $print_chapter_header $print_chapter_footer $print_page_head $print_page_foot $print_head_navigation $print_foot_navigation $button_icon_img $print_navigation $about_body $print_frame $print_toc_frame $toc_body $titlepage $css_lines $print_redirection_page $init_out $finish_out $node_file_name $element_file_name $protect_text $anchor $def_item $def $menu $menu_link $menu_description $menu_comment $simple_menu_link $ref_beginning $info_ref $book_ref $external_href $external_ref $internal_ref $table_item $table_line $row $cell $list_item $comment $def_line $def_line_no_texi $raw $heading $paragraph $preformatted $foot_line_and_ref $foot_section $address $image $index_entry_label $index_entry $index_letter $print_index $index_summary $summary_letter $complex_format $cartouche $sp $definition_category $table_list $copying_comment $index_summary_file_entry $index_summary_file_end $index_summary_file_begin $style $format $normal_text $empty_line $unknown $unknown_style $float $caption_shortcaption $listoffloats $listoffloats_entry $listoffloats_caption $listoffloats_float_style $listoffloats_style $acronym_like $quotation $quotation_prepend_text $paragraph_style_command $PRE_ABOUT $AFTER_ABOUT ); # hash which entries might be redefined by the user use vars qw( $complex_format_map %accent_map %def_map %format_map %simple_map %simple_map_pre %simple_map_texi %style_map %style_map_pre %style_map_texi %unformatted_text_simple_map_texi %unformatted_text_style_map_texi %unformatted_text_texi_map %paragraph_style %things_map %pre_map %texi_map %unicode_map %unicode_diacritical %ascii_character_map %ascii_simple_map %ascii_things_map %perl_charset_to_html %iso_symbols %misc_command %css_map %format_in_paragraph %special_list_commands %accent_letters %unicode_accents %special_accents ); $I = \&Texi2HTML::I18n::get_string; $toc_body = \&T2H_GPL_toc_body; $style = \&T2H_GPL_style; $format = \&T2H_GPL_format; $normal_text = \&t2h_gpl_normal_text; sub T2H_GPL_toc_body($) { my $elements_list = shift; # my $do_contents = shift; # my $do_scontents = shift; #return unless ($do_contents or $do_scontents or $FRAMES); return unless ($DO_CONTENTS or $DO_SCONTENTS or $FRAMES); my $current_level = 0; my $ul_style = $NUMBER_SECTIONS ? $TOC_LIST_ATTRIBUTE : ''; foreach my $element (@$elements_list) { next if ($element->{'top'} or $element->{'index_page'}); my $ind = ' ' x $current_level; my $level = $element->{'toc_level'}; print STDERR "Bug no toc_level for ($element) $element->{'texi'}\n" if (!defined ($level)); if ($level > $current_level) { while ($level > $current_level) { $current_level++; my $ln = "\n$ind\n"; $ind = ' ' x $current_level; push(@{$Texi2HTML::TOC_LINES}, $ln); } } elsif ($level < $current_level) { while ($level < $current_level) { $current_level--; $ind = ' ' x $current_level; my $line = "\n$ind"; $line .= "" if ($level == $current_level); push(@{$Texi2HTML::TOC_LINES}, "$line\n"); } } else { push(@{$Texi2HTML::TOC_LINES}, "\n"); } my $file = ''; $file = $element->{'file'} if ($SPLIT); my $text = $element->{'text'}; $text = $element->{'name'} unless ($NUMBER_SECTIONS); my $entry = "
  • " . &$anchor ($element->{'tocid'}, "$file#$element->{'id'}",$text); push (@{$Texi2HTML::TOC_LINES}, $ind . $entry); push(@{$Texi2HTML::OVERVIEW}, $entry. "
  • \n") if ($level == 1); } while (0 < $current_level) { $current_level--; my $ind = ' ' x $current_level; push(@{$Texi2HTML::TOC_LINES}, "\n$ind\n"); } #@{$Texi2HTML::TOC_LINES} = () unless ($do_contents); @{$Texi2HTML::TOC_LINES} = () unless ($DO_CONTENTS); if (@{$Texi2HTML::TOC_LINES}) { unshift @{$Texi2HTML::TOC_LINES}, $BEFORE_TOC_LINES; push @{$Texi2HTML::TOC_LINES}, $AFTER_TOC_LINES; } #@{$Texi2HTML::OVERVIEW} = () unless ($do_scontents or $FRAMES); @{$Texi2HTML::OVERVIEW} = () unless ($DO_SCONTENTS or $FRAMES); if (@{$Texi2HTML::OVERVIEW}) { unshift @{$Texi2HTML::OVERVIEW}, "\n"; push @{$Texi2HTML::OVERVIEW}, "\n"; unshift @{$Texi2HTML::OVERVIEW}, $BEFORE_OVERVIEW; push @{$Texi2HTML::OVERVIEW}, $AFTER_OVERVIEW; } } sub T2H_GPL_style($$$$$$$$$) { # known style my $style = shift; my $command = shift; my $text = shift; my $args = shift; my $no_close = shift; my $no_open = shift; my $line_nr = shift; my $state = shift; my $style_stack = shift; my $do_quotes = 0; my $use_attribute = 0; my $use_begin_end = 0; if (ref($style) eq 'HASH') { #print STDERR "GPL_STYLE $command\n"; #print STDERR " @$args\n"; $do_quotes = $style->{'quote'}; if ((@{$style->{'args'}} == 1) and defined($style->{'attribute'})) { $style = $style->{'attribute'}; $use_attribute = 1; $text = $args->[0]; } elsif (defined($style->{'function'})) { $text = &{$style->{'function'}}($command, $args, $style_stack, $state, $line_nr); } } else { if ($style =~ s/^\"//) { # add quotes $do_quotes = 1; } if ($style =~ s/^\&//) { # custom $style = 'Texi2HTML::Config::' . $style; eval "\$text = &$style(\$text, \$command, \$style_stack)"; } elsif ($style ne '') { $use_attribute = 1; } else { # no style } } if ($use_attribute) { # good style my $attribute_text = ''; if ($style =~ /^(\w+)(\s+.*)/) { $style = $1; $attribute_text = $2; } if ($do_quotes) { $text = $OPEN_QUOTE_SYMBOL . "$text" if (!$no_open); $text .= $CLOSE_QUOTE_SYMBOL if (!$no_close); } $text = "<${style}$attribute_text>$text" ; } if (ref($style) eq 'HASH') { if (defined($style->{'begin'}) and !$no_open) { $text = $style->{'begin'} . $text; } if (defined($style->{'end'}) and !$no_close) { $text = $text . $style->{'end'}; } } if ($do_quotes and !$use_attribute) { $text = $OPEN_QUOTE_SYMBOL . "$text" if (!$no_open); $text .= $CLOSE_QUOTE_SYMBOL if (!$no_close); } return $text; } sub T2H_GPL_format($$$) { my $tag = shift; my $element = shift; my $text = shift; return '' if (!defined($element) or ($text !~ /\S/)); return $text if ($element eq ''); my $attribute_text = ''; if ($element =~ /^(\w+)(\s+.*)/) { $element = $1; $attribute_text = $2; } return "<${element}$attribute_text>\n" . $text. "\n"; } sub t2h_gpl_normal_text($) { my $text = shift; $text =~ s/``/"/go; $text =~ s/''/"/go; $text =~ s/-(--?)/$1/go; return $text; } # @INIT@ require "$ENV{T2H_HOME}/texi2html.init" if ($0 =~ /\.pl$/ && -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init"); my $translation_file = 'translations.pl'; # file containing all the translations my $T2H_OBSOLETE_STRINGS; require "$ENV{T2H_HOME}/$translation_file" if ($0 =~ /\.pl$/ && -e "$ENV{T2H_HOME}/$translation_file" && -r "$ENV{T2H_HOME}/$translation_file"); # @T2H_TRANSLATIONS_FILE@ my $index_name = -1; my @index_to_hash = ('style_map', 'style_map_pre', 'style_map_texi'); foreach my $hash (\%style_map, \%style_map_pre, \%style_map_texi, \%unformatted_text_style_map_texi) { $index_name++; my $name = $index_to_hash[$index_name]; foreach my $style (keys(%{$hash})) { next unless (ref($hash->{$style}) eq 'HASH'); $hash->{$style}->{'args'} = ['normal'] if (!exists($hash->{$style}->{'args'})); die "Bug: args not defined for $style in $name" if (!defined($hash->{$style}->{'args'})); #print STDERR "DEFAULT($name, $hash) add normal as arg for $style ($hash->{$style}), $hash->{$style}->{'args'}\n"; } } sub t2h_utf8_accent($$) { my $accent = shift; my $args = shift; my $style_stack = shift; my $text = $args->[0]; if ($accent eq 'dotless') { # \x{0131}\x{0308} for @dotless{i} @" doesn't lead to NFC 00ef. if (($text eq 'i') and (!defined($style_stack->[-2]) or (!defined($unicode_accents{$style_stack->[-2]})) or ($style_stack->[-2] eq 'tieaccent'))) { return "\x{0131}"; } #return "\x{}" if ($text eq 'j'); # not found ! return $text; } return Unicode::Normalize::NFC($text . chr(hex($unicode_diacritical{$accent}))) if (defined($unicode_diacritical{$accent})); return ascii_accents($text, $accent); } sub t2h_utf8_normal_text($) { my $text = shift; $text =~ s/---/\x{2014}/g; $text =~ s/--/\x{2013}/g; $text =~ s/``/\x{201C}/g; $text =~ s/''/\x{201D}/g; return $text; } sub t2h_cross_manual_normal_text($) { my $text = shift; $text = main::normalise_space($text); my $result = ''; while ($text ne '') { if ($text =~ s/^([A-Za-z0-9]+)//o) { $result .= $1; } elsif ($text =~ s/^ //o) { $result .= '-'; } elsif ($text =~ s/^(.)//o) { if (exists($ascii_character_map{$1})) { $result .= '_' . lc($ascii_character_map{$1}); } elsif ($USE_UNICODE) { $result .= $1; } else { $result .= '_' . '00' . lc(sprintf("%02x",ord($1))); } } else { print STDERR "Bug: unknown character in node (likely in infinite loop)\n"; sleep 1; } } return $result; } sub t2h_nounicode_cross_manual_accent($$) { my $accent = shift; my $args = shift; my $text = $args->[0]; return '_' . lc($unicode_accents{$accent}->{$text}) if (defined($unicode_accents{$accent}->{$text})); return ($text . '_' . lc($unicode_diacritical{$accent})) if (defined($unicode_diacritical{$accent})); return ascii_accents($text, $accent); } $USE_UNICODE = '@USE_UNICODE@'; if ($USE_UNICODE eq '@USE_UNICODE@') { $USE_UNICODE = 1; eval { require Encode; require Unicode::Normalize; Encode->import('encode'); }; $USE_UNICODE = 0 if ($@); } } use vars qw( %value ); # This is deprecated #our %user_sub; # variables which might be redefined by the user but aren't likely to be # they seem to be in the main namespace use vars qw( $index_properties %predefined_index %valid_index %sec2level %code_style_map %region_lines ); # Some global variables are set in the script, and used in the subroutines # they are in the Texi2HTML namespace, thus prefixed with Texi2HTML::. # see texi2html.init for details. #+++############################################################################ # # # Initialization # # Pasted content of File $(srcdir)/MySimple.pm: Command-line processing # # # #---############################################################################ # leave this within comments, and keep the require statement # This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init # exists. # @MYSIMPLE@ require "$ENV{T2H_HOME}/MySimple.pm" if ($0 =~ /\.pl$/ && -e "$ENV{T2H_HOME}/MySimple.pm" && -r "$ENV{T2H_HOME}/MySimple.pm"); #+++############################################################################ # # # Initialization # # Pasted content of File $(srcdir)/T2h_i18n.pm: Internationalisation # # # #---############################################################################ # leave this within comments, and keep the require statement # This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/T2h_i18n.pm # exists. # @T2H_I18N@ require "$ENV{T2H_HOME}/T2h_i18n.pm" if ($0 =~ /\.pl$/ && -e "$ENV{T2H_HOME}/T2h_i18n.pm" && -r "$ENV{T2H_HOME}/T2h_i18n.pm"); { package Texi2HTML::LaTeX2HTML::Config; # latex2html variables # These variables are not used. They are here for information only, and # an example of config file for latex2html file is included. my $ADDRESS; my $ANTI_ALIAS; my $ANTI_ALIAS_TEXT; my $ASCII_MODE; my $AUTO_LINK; my $AUTO_PREFIX; my $CHILDLINE; my $DEBUG; my $DESTDIR; my $ERROR; my $EXTERNAL_FILE; my $EXTERNAL_IMAGES; my $EXTERNAL_UP_LINK; my $EXTERNAL_UP_TITLE; my $FIGURE_SCALE_FACTOR; my $HTML_VERSION; my $IMAGES_ONLY; my $INFO; my $LINE_WIDTH; my $LOCAL_ICONS; my $LONG_TITLES; my $MATH_SCALE_FACTOR; my $MAX_LINK_DEPTH; my $MAX_SPLIT_DEPTH; my $NETSCAPE_HTML; my $NOLATEX; my $NO_FOOTNODE; my $NO_IMAGES; my $NO_NAVIGATION; my $NO_SIMPLE_MATH; my $NO_SUBDIR; my $PAPERSIZE; my $PREFIX; my $PS_IMAGES; my $REUSE; my $SCALABLE_FONTS; my $SHORTEXTN; my $SHORT_INDEX; my $SHOW_SECTION_NUMBERS; my $SPLIT; my $TEXDEFS; my $TITLE; my $TITLES_LANGUAGE; my $TMP; my $VERBOSE; my $WORDS_IN_NAVIGATION_PANEL_TITLES; my $WORDS_IN_PAGE; # @T2H_L2H_INIT@ } package main; # # pre-defined indices # $index_properties = { 'c' => { name => 'cp'}, 'f' => { name => 'fn', code => 1}, 'v' => { name => 'vr', code => 1}, 'k' => { name => 'ky', code => 1}, 'p' => { name => 'pg', code => 1}, 't' => { name => 'tp', code => 1} }; %predefined_index = ( 'cp', 'c', 'fn', 'f', 'vr', 'v', 'ky', 'k', 'pg', 'p', 'tp', 't', ); # # valid indices # %valid_index = ( 'c', 1, 'f', 1, 'v', 1, 'k', 1, 'p', 1, 't', 1, ); # # commands with ---, -- '' and `` preserved # usefull with the old interface %code_style_map = ( 'code' => 1, 'command' => 1, 'env' => 1, 'file' => 1, 'kbd' => 1, 'option' => 1, 'samp' => 1, 'verb' => 1, ); my $simple_map_ref = \%Texi2HTML::Config::simple_map; my $simple_map_pre_ref = \%Texi2HTML::Config::simple_map_pre; my $simple_map_texi_ref = \%Texi2HTML::Config::simple_map_texi; my $style_map_ref = \%Texi2HTML::Config::style_map; my $style_map_pre_ref = \%Texi2HTML::Config::style_map_pre; my $style_map_texi_ref = \%Texi2HTML::Config::style_map_texi; my $things_map_ref = \%Texi2HTML::Config::things_map; my $pre_map_ref = \%Texi2HTML::Config::pre_map; my $texi_map_ref = \%Texi2HTML::Config::texi_map; # delete from hash if we are using te new interface foreach my $code (keys(%code_style_map)) { delete ($code_style_map{$code}) if (ref($style_map_ref->{$code}) eq 'HASH'); } # no paragraph in these commands my %no_paragraph_macro = ( 'xref' => 1, 'ref' => 1, 'pxref' => 1, 'inforef' => 1, 'anchor' => 1, ); #foreach my $command (keys(%Texi2HTML::Config::style_map)) #{ # next unless (ref($style_map_ref->{$command}) eq 'HASH'); # print STDERR "CMD: $command\n"; # die "Bug: no args for $command in style_map\n" unless defined($style_map_ref->{$command}->{'args'}); # die "Bug: no args for $command in style_map_pre\n" unless defined($style_map_pre_ref->{$command}->{'args'}); # die "Bug: non existence of args for $command in style_map_texi\n" unless (exists($style_map_texi_ref->{$command}->{'args'})); # die "Bug: no args for $command in style_map_texi\n" unless defined($style_map_texi_ref->{$command}->{'args'}); #} # # texinfo section names to level # %sec2level = ( 'top', 0, 'chapter', 1, 'unnumbered', 1, 'chapheading', 1, 'appendix', 1, 'section', 2, 'unnumberedsec', 2, 'heading', 2, 'appendixsec', 2, 'subsection', 3, 'unnumberedsubsec', 3, 'subheading', 3, 'appendixsubsec', 3, 'subsubsection', 4, 'unnumberedsubsubsec', 4, 'subsubheading', 4, 'appendixsubsubsec', 4, ); # the reverse mapping. There is an entry for each sectionning command. # The value is a ref on an array containing at each index the corresponding # sectionning command name. my %level2sec; { my $sections = [ ]; my $appendices = [ ]; my $unnumbered = [ ]; my $headings = [ ]; foreach my $command (keys (%sec2level)) { if ($command =~ /^appendix/) { $level2sec{$command} = $appendices; } elsif ($command =~ /^unnumbered/ or $command eq 'top') { $level2sec{$command} = $unnumbered; } elsif ($command =~ /section$/ or $command eq 'chapter') { $level2sec{$command} = $sections; } else { $level2sec{$command} = $headings; } $level2sec{$command}->[$sec2level{$command}] = $command; } } # this are synonyms $sec2level{'appendixsection'} = 2; # sec2level{'majorheading'} is also 1 and not 0 $sec2level{'majorheading'} = 1; $sec2level{'chapheading'} = 1; # FIXME this one could be centered... $sec2level{'centerchap'} = 1; # regions treated especially. The text for these regions is collected in the # corresponding array %region_lines = ( 'titlepage' => [ ], 'documentdescription' => [ ], 'copying' => [ ], ); # those macros aren't considered as beginning a paragraph my %no_line_macros = ( 'macro' => 1, 'unmacro' => 1, 'rmacro' => 1, 'set' => 1, 'clear' => 1, 'titlefont' => 1, 'include' => 1, 'copying' => 1, 'end copying' => 1, 'tab' => 1, 'item' => 1, 'itemx' => 1, '*' => 1, 'float' => 1, 'end float' => 1, 'caption' => 1, 'shortcaption' => 1, ); foreach my $key (keys(%Texi2HTML::Config::misc_command)) { $no_line_macros{$key} = 1; } # a hash associating a format @thing / @end thing with the type of the format # 'complex' 'simple' 'deff' 'list' 'menu' 'paragraph_style' my %format_type = (); foreach my $simple_format (keys(%Texi2HTML::Config::format_map)) { $format_type{$simple_format} = 'simple'; $no_line_macros{$simple_format} = 1; $no_line_macros{"end $simple_format"} = 1; } foreach my $paragraph_style (keys(%Texi2HTML::Config::paragraph_style)) { $format_type{$paragraph_style} = 'paragraph_style'; $no_line_macros{$paragraph_style} = 1; $no_line_macros{"end $paragraph_style"} = 1; } foreach my $complex_format (keys(%$Texi2HTML::Config::complex_format_map)) { $format_type{$complex_format} = 'complex'; $no_line_macros{$complex_format} = 1; $no_line_macros{"end $complex_format"} = 1; } foreach my $table (('table', 'ftable', 'vtable', 'multitable')) { $format_type{$table} = 'table'; $no_line_macros{$table} = 1; $no_line_macros{"end $table"} = 1; } foreach my $def_format (keys(%Texi2HTML::Config::def_map)) { $format_type{$def_format} = 'deff'; $no_line_macros{$def_format} = 1; $no_line_macros{"end $def_format"} = 1; } $format_type{'itemize'} = 'list'; $format_type{'enumerate'} = 'list'; $format_type{'menu'} = 'menu'; $format_type{'cartouche'} = 'cartouche'; $format_type{'float'} = 'float'; $format_type{'quotation'} = 'quotation'; $format_type{'group'} = 'group'; foreach my $macro (('itemize', 'enumerate', 'menu', 'cartouche', 'float', 'quotation')) { $no_line_macros{$macro} = 1; $no_line_macros{"end $macro"} = 1; } foreach my $macro (keys(%Texi2HTML::Config::format_in_paragraph)) { $no_line_macros{$macro} = 1; $no_line_macros{"end $macro"} = 1; } # fake format at the bottom of the stack $format_type{'noformat'} = ''; # fake formats are formats used internally within other formats # we associate them with a real format, for the error messages my %fake_format = ( 'line' => 'table', 'term' => 'table', 'item' => 'list or table', 'row' => 'multitable row', 'cell' => 'multitable cell', 'deff_item' => 'definition command', 'menu_comment' => 'menu', 'menu_description' => 'menu', 'menu_preformatted' => 'menu', ); foreach my $key (keys(%fake_format)) { $format_type{$key} = 'fake'; } # A hash associating style @-comand with the type, 'accent', real 'style', # 'simple' style, or 'special'. my %style_type = (); foreach my $style (keys(%Texi2HTML::Config::style_map)) { $style_type{$style} = 'style'; } foreach my $accent (keys(%Texi2HTML::Config::unicode_accents), 'tieaccent', 'dotless') { $style_type{$accent} = 'accent'; } foreach my $simple ('ctrl', 'w', 'url') { $style_type{$simple} = 'simple'; } foreach my $special ('footnote', 'ref', 'xref', 'pxref', 'inforef', 'anchor', 'image') { $style_type{$special} = 'special'; } # raw formats which are expanded especially my @raw_regions = ('html', 'verbatim', 'tex', 'xml', 'docbook'); # special raw formats which are expanded between first and second pass # and are replaced by specific commands. Currently used for tex. It takes # precedence over raw_regions. my @special_regions = (); # regions expanded or not depending on the value of this hash my %text_macros = ( 'iftex' => 0, 'ignore' => 0, 'menu' => 0, 'ifplaintext' => 0, 'ifinfo' => 0, 'ifxml' => 0, 'ifhtml' => 0, 'ifdocbook' => 0, 'html' => 0, 'tex' => 0, 'xml' => 0, 'titlepage' => 1, 'documentdescription' => 1, 'copying' => 1, 'ifnothtml' => 1, 'ifnottex' => 1, 'ifnotplaintext' => 1, 'ifnotinfo' => 1, 'ifnotxml' => 1, 'ifnotdocbook' => 1, 'direntry' => 0, 'verbatim' => 'raw', 'ifclear' => 'value', 'ifset' => 'value' ); foreach my $key (keys(%text_macros)) { unless ($text_macros{$key} eq 'raw') { $no_line_macros{$key} = 1; $no_line_macros{"end $key"} = 1; } } # The css formats are associated with complex format commands, and associated # with the 'pre_style' key foreach my $complex_format (keys(%$Texi2HTML::Config::complex_format_map)) { next if (defined($Texi2HTML::Config::complex_format_map->{$complex_format}->{'pre_style'})); $Texi2HTML::Config::complex_format_map->{$complex_format}->{'pre_style'} = ''; $Texi2HTML::Config::complex_format_map->{$complex_format}->{'pre_style'} = $Texi2HTML::Config::css_map{"pre.$complex_format"} if (exists($Texi2HTML::Config::css_map{"pre.$complex_format"})); } #+++############################################################################ # # # Argument parsing, initialisation # # # #---############################################################################ # # flush stdout and stderr after every write # select(STDERR); $| = 1; select(STDOUT); $| = 1; #FIXME my or our ? my $I = \&Texi2HTML::I18n::get_string; my $T2H_USER; # user running the script my $documentdescription; # text in @documentdescription # shorthand for Texi2HTML::Config::VERBOSE my $T2H_VERBOSE; sub echo_warn($;$); #print STDERR "" . &$I('test i18n: \' , \a \\ %% %{unknown}a %known % %{known} \\', { 'known' => 'a known string', 'no' => 'nope'}); exit 0; # file: file name to locate. It can be a file path. # all_files: if true collect all the files with that name, otherwise stop # at first match. # directories: a reference on a array containing a list of directories to # search the file in. default is \@texi2html_config_dirs. sub locate_init_file($;$$) { my $file = shift; my $all_files = shift; my $directories = shift; $directories = \@texi2html_config_dirs if !defined($directories); if ($file =~ /^\//) { return $file if (-e $file and -r $file); } else { my @files; foreach my $dir (@$directories) { next unless (-d "$dir"); if ($all_files) { push (@files, "$dir/$file") if (-e "$dir/$file" and -r "$dir/$file"); } else { return "$dir/$file" if (-e "$dir/$file" and -r "$dir/$file"); } } return @files if ($all_files); } return undef; } # called on -init-file sub load_init_file { # First argument is option shift; # second argument is value of options my $init_file = shift; my $file; if ($file = locate_init_file($init_file)) { print STDERR "# reading initialization file from $file\n" if ($T2H_VERBOSE); return (Texi2HTML::Config::load($file)); } else { print STDERR "$ERROR Error: can't read init file $init_file\n"; return 0; } } my $cmd_line_lang = 0; # 1 if lang was succesfully set by the command line # in that case @documentlanguage is ignored. my $lang_set = 0; # 1 if lang was set # # called on -lang sub set_document_language ($;$$) { my $lang = shift; my $from_command_line = shift; my $line_nr = shift; my @files = locate_init_file("$i18n_dir/$lang", 1); foreach my $file (@files) { Texi2HTML::Config::load($file); } if (Texi2HTML::I18n::set_language($lang)) { print STDERR "# using '$lang' as document language\n" if ($T2H_VERBOSE); $Texi2HTML::Config::LANG = $lang; $lang_set = 1; $cmd_line_lang = 1 if ($from_command_line); if (!$Texi2HTML::Config::TEST) { $Texi2HTML::THISDOC{'today'} = Texi2HTML::I18n::pretty_date($Texi2HTML::Config::LANG); # like "20 September 1993"; } else { $Texi2HTML::THISDOC{'today'} = 'a sunny day'; } $things_map_ref->{'today'} = $Texi2HTML::THISDOC{'today'}; $pre_map_ref->{'today'} = $Texi2HTML::THISDOC{'today'}; $texi_map_ref->{'today'} = $Texi2HTML::THISDOC{'today'}; } else { echo_error ("Language specs for '$lang' do not exists. Reverting to '$Texi2HTML::Config::LANG'", $line_nr); } } sub set_expansion($$) { my $region = shift; my $set = shift; $set = 1 if (!defined($set)); if ($set) { push (@Texi2HTML::Config::EXPAND, $region) unless (grep {$_ eq $region} @Texi2HTML::Config::EXPAND); } else { @Texi2HTML::Config::EXPAND = grep {$_ ne $region} @Texi2HTML::Config::EXPAND; } } sub set_encoding($) { my $encoding = shift; if ($Texi2HTML::Config::USE_UNICODE) { if (! Encode::resolve_alias($encoding)) { echo_warn("Encoding $Texi2HTML::Config::DOCUMENT_ENCODING unknown"); return undef; } print STDERR "# Using encoding " . Encode::resolve_alias($encoding) . "\n" if ($T2H_VERBOSE); return Encode::resolve_alias($encoding); } else { echo_warn("Nothing specific done for encodings (due to the perl version)"); return undef; } } my %cross_ref_texi_map = %Texi2HTML::Config::texi_map; my %cross_ref_simple_map_texi = %Texi2HTML::Config::simple_map_texi; my %cross_ref_style_map_texi = (); foreach my $command (keys(%Texi2HTML::Config::style_map_texi)) { $cross_ref_style_map_texi{$command} = {}; foreach my $key (keys (%{$Texi2HTML::Config::style_map_texi{$command}})) { #print STDERR "$command, $key, $style_map_texi{$command}->{$key}\n"; $cross_ref_style_map_texi{$command}->{$key} = $Texi2HTML::Config::style_map_texi{$command}->{$key}; } } $cross_ref_simple_map_texi{"\n"} = ' '; # This function is used to construct a link name from a node name as # described in the proposal I posted on texinfo-pretest. sub cross_manual_links($$) { my $nodes_hash = shift; my $cross_reference_hash = shift; $simple_map_texi_ref = \%cross_ref_simple_map_texi; $style_map_texi_ref = \%cross_ref_style_map_texi; $texi_map_ref = \%cross_ref_texi_map; my $normal_text_kept = $Texi2HTML::Config::normal_text; $Texi2HTML::Config::normal_text = \&Texi2HTML::Config::t2h_cross_manual_normal_text; foreach my $key (keys(%$nodes_hash)) { my $node = $nodes_hash->{$key}; next if ($node->{'index_page'}); if (!defined($node->{'texi'})) { # begin debug section foreach my $key (keys(%$node)) { #print STDERR "$key:$node->{$key}!!!\n"; } # end debug section } else { if ($Texi2HTML::Config::USE_UNICODE) { my $text = $node->{'texi'}; #print STDERR "CROSS_MANUAL $node->{'texi'}\n"; if (defined($Texi2HTML::Config::DOCUMENT_ENCODING) and Encode::resolve_alias($Texi2HTML::Config::DOCUMENT_ENCODING) and (Encode::resolve_alias($Texi2HTML::Config::DOCUMENT_ENCODING) ne 'utf8')) { $text = Encode::decode($Texi2HTML::Config::DOCUMENT_ENCODING, $text); } $node->{'cross_manual_target'} = unicode_to_protected(Unicode::Normalize::NFC(remove_texi($text))); } else { $node->{'cross_manual_target'} = remove_texi($node->{'texi'}); } #print STDERR "CROSS_MANUAL_TARGET $node->{'cross_manual_target'}\n"; unless ($node->{'external_node'}) { if (defined($cross_reference_hash->{$node->{'cross_manual_target'}})) { echo_error("Node equivalent with `$node->{'texi'}' allready used `$cross_reference_hash->{$node->{'cross_manual_target'}}'"); } else { $cross_reference_hash->{$node->{'cross_manual_target'}} = $node->{'texi'}; } } #print STDERR "$node->{'texi'}: $node->{'cross_manual_target'}\n"; } } $Texi2HTML::Config::normal_text = $normal_text_kept; $simple_map_texi_ref = \%Texi2HTML::Config::simple_map_texi; $style_map_texi_ref = \%Texi2HTML::Config::style_map_texi; $texi_map_ref = \%Texi2HTML::Config::texi_map; } sub unicode_to_protected($) { my $text = shift; my $result = ''; while ($text ne '') { if ($text =~ s/^([A-Za-z0-9_\-]+)//o) { $result .= $1; } elsif ($text =~ s/^(.)//o) { $result .= '_' . lc(sprintf("%04x",ord($1))); } else { print STDERR "Bug: unknown character in node (likely in infinite loop)\n"; sleep 1; } } return $result; } sub cross_manual_line($) { my $text = shift; #print STDERR "cross_manual_line $text\n"; $simple_map_texi_ref = \%cross_ref_simple_map_texi; $style_map_texi_ref = \%cross_ref_style_map_texi; $texi_map_ref = \%cross_ref_texi_map; my $normal_text_kept = $Texi2HTML::Config::normal_text; $Texi2HTML::Config::normal_text = \&Texi2HTML::Config::t2h_cross_manual_normal_text; my $cross_ref; if ($Texi2HTML::Config::USE_UNICODE) { $cross_ref = unicode_to_protected(Unicode::Normalize::NFC(remove_texi($text))); } else { $cross_ref = remove_texi($text); } $Texi2HTML::Config::normal_text = $normal_text_kept; $simple_map_texi_ref = \%Texi2HTML::Config::simple_map_texi; $style_map_texi_ref = \%Texi2HTML::Config::style_map_texi; $texi_map_ref = \%Texi2HTML::Config::texi_map; #print STDERR "cross_ref $cross_ref\n"; return $cross_ref; } # T2H_OPTIONS is a hash whose keys are the (long) names of valid # command-line options and whose values are a hash with the following keys: # type ==> one of !|=i|:i|=s|:s (see GetOpt::Long for more info) # linkage ==> ref to scalar, array, or subroutine (see GetOpt::Long for more info) # verbose ==> short description of option (displayed by -h) # noHelp ==> if 1 -> for "not so important options": only print description on -h 1 # 2 -> for obsolete options: only print description on -h 2 my $T2H_OPTIONS; $T2H_OPTIONS -> {'debug'} = { type => '=i', linkage => \$Texi2HTML::Config::DEBUG, verbose => 'output HTML with debuging information', }; $T2H_OPTIONS -> {'doctype'} = { type => '=s', linkage => \$Texi2HTML::Config::DOCTYPE, verbose => 'document type which is output in header of HTML files', noHelp => 1 }; $T2H_OPTIONS -> {'frameset-doctype'} = { type => '=s', linkage => \$Texi2HTML::Config::FRAMESET_DOCTYPE, verbose => 'document type for HTML frameset documents', noHelp => 1 }; $T2H_OPTIONS -> {'test'} = { type => '!', linkage => \$Texi2HTML::Config::TEST, verbose => 'use predefined information to avoid differences with reference files', noHelp => 1 }; $T2H_OPTIONS -> {'dump-texi'} = { type => '!', linkage => \$Texi2HTML::Config::DUMP_TEXI, verbose => 'dump the output of first pass into a file with extension passfirst and exit', noHelp => 1 }; $T2H_OPTIONS -> {'macro-expand'} = { type => '=s', linkage => \$Texi2HTML::Config::MACRO_EXPAND, verbose => 'output macro expanded source in ', }; $T2H_OPTIONS -> {'expand'} = { type => '=s', linkage => sub {set_expansion($_[1], 1);}, verbose => 'Expand info|tex|none section of texinfo source', noHelp => 1, }; $T2H_OPTIONS -> {'no-expand'} = { type => '=s', linkage => sub {set_expansion ($_[1], 0);}, verbose => 'Don\'t expand the given section of texinfo source', }; $T2H_OPTIONS -> {'noexpand'} = { type => '=s', linkage => $T2H_OPTIONS->{'no-expand'}->{'linkage'}, verbose => $T2H_OPTIONS->{'no-expand'}->{'verbose'}, noHelp => 1, }; $T2H_OPTIONS -> {'ifhtml'} = { type => '!', linkage => sub { set_expansion('html', $_[1]); }, verbose => "expand ifhtml and html sections", }; $T2H_OPTIONS -> {'ifinfo'} = { type => '!', linkage => sub { set_expansion('info', $_[1]); }, verbose => "expand ifinfo", }; $T2H_OPTIONS -> {'ifxml'} = { type => '!', linkage => sub { set_expansion('xml', $_[1]); }, verbose => "expand ifxml and xml sections", }; $T2H_OPTIONS -> {'ifdocbook'} = { type => '!', linkage => sub { set_expansion('docbook', $_[1]); }, verbose => "expand ifdocbook and docbook sections", }; $T2H_OPTIONS -> {'iftex'} = { type => '!', linkage => sub { set_expansion('tex', $_[1]); }, verbose => "expand iftex and tex sections", }; $T2H_OPTIONS -> {'ifplaintext'} = { type => '!', linkage => sub { set_expansion('plaintext', $_[1]); }, verbose => "expand ifplaintext sections", }; #$T2H_OPTIONS -> {'no-ifhtml'} = #{ # type => '!', # linkage => sub { set_expansion('html', (! $_[1])); }, # verbose => "don't expand ifhtml and html sections", # noHelp => 1, #}; #$T2H_OPTIONS -> {'no-ifinfo'} = #{ # type => '!', # linkage => sub { set_expansion('info', (! $_[1])); }, # verbose => "don't expand ifinfo", # noHelp => 1, #}; #$T2H_OPTIONS -> {'no-ifxml'} = #{ # type => '!', # linkage => sub { set_expansion('xml', (! $_[1])); }, # verbose => "don't expand ifxml and xml sections", # noHelp => 1, #}; #$T2H_OPTIONS -> {'no-iftex'} = #{ # type => '!', # linkage => sub { set_expansion('tex', (! $_[1])); }, # verbose => "don't expand iftex and tex sections", # noHelp => 1, #}; #$T2H_OPTIONS -> {'no-ifplaintext'} = #{ # type => '!', # linkage => sub { set_expansion('plaintext', (! $_[1])); }, # verbose => "don't expand ifplaintext sections", # noHelp => 1, #}; $T2H_OPTIONS -> {'invisible'} = { type => '=s', linkage => \$Texi2HTML::Config::INVISIBLE_MARK, verbose => 'use text in invisble anchor', noHelp => 1, }; $T2H_OPTIONS -> {'iso'} = { type => 'iso', linkage => \$Texi2HTML::Config::USE_ISO, verbose => 'if set, ISO8859 characters are used for special symbols (like copyright, etc)', noHelp => 1, }; $T2H_OPTIONS -> {'I'} = { type => '=s', linkage => \@Texi2HTML::Config::INCLUDE_DIRS, verbose => 'append $s to the @include search path', }; $T2H_OPTIONS -> {'P'} = { type => '=s', linkage => sub {unshift (@Texi2HTML::Config::PREPEND_DIRS, $_[1]);}, verbose => 'prepend $s to the @include search path', }; $T2H_OPTIONS -> {'top-file'} = { type => '=s', linkage => \$Texi2HTML::Config::TOP_FILE, verbose => 'use $s as top file, instead of .html', }; $T2H_OPTIONS -> {'toc-file'} = { type => '=s', linkage => \$Texi2HTML::Config::TOC_FILE, verbose => 'use $s as ToC file, instead of _toc.html', }; $T2H_OPTIONS -> {'frames'} = { type => '!', linkage => \$Texi2HTML::Config::FRAMES, verbose => 'output files which use HTML 4.0 frames (experimental)', noHelp => 1, }; $T2H_OPTIONS -> {'menu'} = { type => '!', linkage => \$Texi2HTML::Config::SHOW_MENU, verbose => 'output Texinfo menus', }; #$T2H_OPTIONS -> {'no-menu'} = #{ # type => '!', # linkage => sub { $Texi2HTML::Config::SHOW_MENU = (! $_[1]);}, # verbose => "don't output Texinfo menus", # noHelp => 1, #}; $T2H_OPTIONS -> {'number'} = { type => '!', linkage => \$Texi2HTML::Config::NUMBER_SECTIONS, verbose => 'use numbered sections', }; #$T2H_OPTIONS -> {'no-number'} = #{ # type => '!', # linkage => sub { $Texi2HTML::Config::NUMBER_SECTIONS = (! $_[1]);}, # verbose => 'sections not numbered', # noHelp => 1, #}; $T2H_OPTIONS -> {'use-nodes'} = { type => '!', linkage => \$Texi2HTML::Config::USE_NODES, verbose => 'use nodes for sectionning', }; $T2H_OPTIONS -> {'node-files'} = { type => '!', linkage => \$Texi2HTML::Config::NODE_FILES, verbose => 'produce one file per node for cross references' }; $T2H_OPTIONS -> {'separated-footnotes'} = { type => '!', linkage => \$Texi2HTML::Config::SEPARATED_FOOTNOTES, verbose => 'footnotes on a separated page', noHelp => 1, }; $T2H_OPTIONS -> {'toc-links'} = { type => '!', linkage => \$Texi2HTML::Config::TOC_LINKS, verbose => 'create links from headings to toc entries' }; $T2H_OPTIONS -> {'split'} = { type => '=s', linkage => \$Texi2HTML::Config::SPLIT, verbose => 'split document on section|chapter|node else no splitting', }; $T2H_OPTIONS -> {'sec-nav'} = { type => '!', linkage => \$Texi2HTML::Config::SECTION_NAVIGATION, verbose => 'output navigation panels for each section', }; $T2H_OPTIONS -> {'subdir'} = { type => '=s', linkage => \$Texi2HTML::Config::SUBDIR, verbose => 'put files in directory $s, not $cwd', noHelp => 1, }; $T2H_OPTIONS -> {'short-ext'} = { type => '!', linkage => \$Texi2HTML::Config::SHORTEXTN, verbose => 'use "htm" extension for output HTML files', }; $T2H_OPTIONS -> {'prefix'} = { type => '=s', linkage => \$Texi2HTML::Config::PREFIX, verbose => 'use as prefix for output files, instead of ', }; $T2H_OPTIONS -> {'output'} = { type => '=s', linkage => \$Texi2HTML::Config::OUT, verbose => 'output goes to $s (directory if split)', }; $T2H_OPTIONS -> {'no-validate'} = { type => '!', linkage => \$Texi2HTML::Config::NOVALIDATE, verbose => 'suppress node cross-reference validation', }; $T2H_OPTIONS -> {'short-ref'} = { type => '!', linkage => \$Texi2HTML::Config::SHORT_REF, verbose => 'if set, references are without section numbers', }; $T2H_OPTIONS -> {'idx-sum'} = { type => '!', linkage => \$Texi2HTML::Config::IDX_SUMMARY, verbose => 'if set, also output index summary', noHelp => 1, }; $T2H_OPTIONS -> {'def-table'} = { type => '!', linkage => \$Texi2HTML::Config::DEF_TABLE, verbose => 'if set, \@def.. are converted using tables.', noHelp => 1, }; $T2H_OPTIONS -> {'Verbose'} = { type => '!', linkage=> \$Texi2HTML::Config::VERBOSE, verbose => 'print progress info to stdout', }; $T2H_OPTIONS -> {'lang'} = { type => '=s', linkage => sub {set_document_language($_[1], 1)}, verbose => 'use $s as document language (ISO 639 encoding)', }; $T2H_OPTIONS -> {'ignore-preamble-text'} = { type => '!', linkage => \$Texi2HTML::Config::IGNORE_PREAMBLE_TEXT, verbose => 'if set, ignore the text before @node and sectionning commands', noHelp => 1, }; $T2H_OPTIONS -> {'html-xref-prefix'} = { type => '=s', linkage => \$Texi2HTML::Config::EXTERNAL_DIR, verbose => '$s is the base dir for external manual references', noHelp => 1, }; $T2H_OPTIONS -> {'l2h'} = { type => '!', linkage => \$Texi2HTML::Config::L2H, verbose => 'if set, uses latex2html for @math and @tex', }; $T2H_OPTIONS -> {'l2h-l2h'} = { type => '=s', linkage => \$Texi2HTML::Config::L2H_L2H, verbose => 'program to use for latex2html translation', noHelp => 1, }; $T2H_OPTIONS -> {'l2h-skip'} = { type => '!', linkage => \$Texi2HTML::Config::L2H_SKIP, verbose => 'if set, tries to reuse previously latex2html output', noHelp => 1, }; $T2H_OPTIONS -> {'l2h-tmp'} = { type => '=s', linkage => \$Texi2HTML::Config::L2H_TMP, verbose => 'if set, uses $s as temporary latex2html directory', noHelp => 1, }; $T2H_OPTIONS -> {'l2h-file'} = { type => '=s', linkage => \$Texi2HTML::Config::L2H_FILE, verbose => 'if set, uses $s as latex2html init file', noHelp => 1, }; $T2H_OPTIONS -> {'l2h-clean'} = { type => '!', linkage => \$Texi2HTML::Config::L2H_CLEAN, verbose => 'if set, do not keep intermediate latex2html files for later reuse', noHelp => 1, }; $T2H_OPTIONS -> {'D'} = { type => '=s', linkage => sub {$value{$_[1]} = 1;}, verbose => 'equivalent to Texinfo "@set $s 1"', noHelp => 1, }; $T2H_OPTIONS -> {'U'} = { type => '=s', linkage => sub {delete $value{$_[1]};}, verbose => 'equivalent to Texinfo "@clear $s"', noHelp => 1, }; $T2H_OPTIONS -> {'init-file'} = { type => '=s', linkage => \&load_init_file, verbose => 'load init file $s' }; $T2H_OPTIONS -> {'css-include'} = { type => '=s', linkage => \@Texi2HTML::Config::CSS_FILES, verbose => 'use css file $s' }; ## ## obsolete cmd line options ## my $T2H_OBSOLETE_OPTIONS; $T2H_OBSOLETE_OPTIONS -> {'out-file'} = { type => '=s', linkage => sub {$Texi2HTML::Config::OUT = $_[1]; $Texi2HTML::Config::SPLIT = '';}, verbose => 'if set, all HTML output goes into file $s, obsoleted by "-output" with different semantics', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {init_file} = { type => '=s', linkage => \&load_init_file, verbose => 'obsolete, use "-init-file" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {l2h_clean} = { type => '!', linkage => \$Texi2HTML::Config::L2H_CLEAN, verbose => 'obsolete, use "-l2h-clean" instead', noHelp => 2, }; $T2H_OBSOLETE_OPTIONS -> {l2h_l2h} = { type => '=s', linkage => \$Texi2HTML::Config::L2H_L2H, verbose => 'obsolete, use "-l2h-l2h" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {l2h_skip} = { type => '!', linkage => \$Texi2HTML::Config::L2H_SKIP, verbose => 'obsolete, use "-l2h-skip" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {l2h_tmp} = { type => '=s', linkage => \$Texi2HTML::Config::L2H_TMP, verbose => 'obsolete, use "-l2h-tmp" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {out_file} = { type => '=s', linkage => sub {$Texi2HTML::Config::OUT = $_[1]; $Texi2HTML::Config::SPLIT = '';}, verbose => 'obsolete, use "-out-file" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {short_ref} = { type => '!', linkage => \$Texi2HTML::Config::SHORT_REF, verbose => 'obsolete, use "-short-ref" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {idx_sum} = { type => '!', linkage => \$Texi2HTML::Config::IDX_SUMMARY, verbose => 'obsolete, use "-idx-sum" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {def_table} = { type => '!', linkage => \$Texi2HTML::Config::DEF_TABLE, verbose => 'obsolete, use "-def-table" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {short_ext} = { type => '!', linkage => \$Texi2HTML::Config::SHORTEXTN, verbose => 'obsolete, use "-short-ext" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {sec_nav} = { type => '!', linkage => \$Texi2HTML::Config::SECTION_NAVIGATION, verbose => 'obsolete, use "-sec-nav" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {top_file} = { type => '=s', linkage => \$Texi2HTML::Config::TOP_FILE, verbose => 'obsolete, use "-top-file" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {toc_file} = { type => '=s', linkage => \$Texi2HTML::Config::TOC_FILE, verbose => 'obsolete, use "-toc-file" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {glossary} = { type => '!', linkage => \$Texi2HTML::Config::USE_GLOSSARY, # verbose => "if set, uses section named `Footnotes' for glossary", verbose => "this does nothing", noHelp => 2, }; $T2H_OBSOLETE_OPTIONS -> {dump_texi} = { type => '!', linkage => \$Texi2HTML::Config::DUMP_TEXI, verbose => 'obsolete, use "-dump-texi" instead', noHelp => 1 }; $T2H_OBSOLETE_OPTIONS -> {frameset_doctype} = { type => '=s', linkage => \$Texi2HTML::Config::FRAMESET_DOCTYPE, verbose => 'obsolete, use "-frameset-doctype" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} = { type => '!', linkage => sub {$Texi2HTML::Config::SECTION_NAVIGATION = 0;}, verbose => 'obsolete, use -nosec_nav', noHelp => 2, }; my $use_acc; # not used $T2H_OBSOLETE_OPTIONS -> {use_acc} = { type => '!', linkage => \$use_acc, verbose => 'obsolete, set to true unconditionnaly', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {expandinfo} = { type => '!', linkage => sub {push @Texi2HTML::Config::EXPAND, 'info';}, verbose => 'obsolete, use "-expand info" instead', noHelp => 2, }; $T2H_OBSOLETE_OPTIONS -> {expandtex} = { type => '!', linkage => sub {push @Texi2HTML::Config::EXPAND, 'tex';}, verbose => 'obsolete, use "-expand tex" instead', noHelp => 2, }; $T2H_OBSOLETE_OPTIONS -> {monolithic} = { type => '!', linkage => sub {$Texi2HTML::Config::SPLIT = '';}, verbose => 'obsolete, use "-split no" instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {split_node} = { type => '!', linkage => sub{$Texi2HTML::Config::SPLIT = 'section';}, verbose => 'obsolete, use "-split section" instead', noHelp => 2, }; $T2H_OBSOLETE_OPTIONS -> {split_chapter} = { type => '!', linkage => sub{$Texi2HTML::Config::SPLIT = 'chapter';}, verbose => 'obsolete, use "-split chapter" instead', noHelp => 2, }; $T2H_OBSOLETE_OPTIONS -> {no_verbose} = { type => '!', linkage => sub {$Texi2HTML::Config::VERBOSE = 0;}, verbose => 'obsolete, use -noverbose instead', noHelp => 2, }; $T2H_OBSOLETE_OPTIONS -> {output_file} = { type => '=s', linkage => sub {$Texi2HTML::Config::OUT = $_[1]; $Texi2HTML::Config::SPLIT = '';}, verbose => 'obsolete, use -out_file instead', noHelp => 2 }; $T2H_OBSOLETE_OPTIONS -> {section_navigation} = { type => '!', linkage => \$Texi2HTML::Config::SECTION_NAVIGATION, verbose => 'obsolete, use -sec_nav instead', noHelp => 2, }; $T2H_OBSOLETE_OPTIONS -> {verbose} = { type => '!', linkage=> \$Texi2HTML::Config::VERBOSE, verbose => 'obsolete, use -Verbose instead', noHelp => 2 }; # read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc # obsolete. my @rc_files = (); push @rc_files, "$sysconfdir/texi2htmlrc" if defined($sysconfdir); push @rc_files, "$ENV{'HOME'}/.texi2htmlrc" if (defined($ENV{HOME})); foreach my $i (@rc_files) { if (-e $i and -r $i) { print STDERR "# reading initialization file from $i\n" if ($T2H_VERBOSE); print STDERR "Reading config from $i is obsolete, use texi2html/$conf_file_name instead\n"; Texi2HTML::Config::load($i); } } # read initialization files foreach my $file (locate_init_file($conf_file_name, 1)) { print STDERR "# reading initialization file from $file\n" if ($T2H_VERBOSE); Texi2HTML::Config::load($file); } # # %value hold texinfo variables, see also -D, -U, @set and @clear. # we predefine html (the output format) and texi2html (the translator) %value = ( 'html' => 1, 'texi2html' => $THISVERSION, ); #+++############################################################################ # # # parse command-line options # # #---############################################################################ my $T2H_USAGE_TEXT = < {'help'} = { type => ':i', default => '', linkage => sub {$options->helpOptions($_[1]); print "\nSend bugs and suggestions to \n"; exit (0);}, verbose => "print help and exit" }; # some older version of GetOpt::Long don't have # Getopt::Long::Configure("pass_through") eval {Getopt::Long::Configure("pass_through");}; my $Configure_failed = $@ && <getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n")) { print STDERR "$Configure_failed" if $Configure_failed; die $T2H_FAILURE_TEXT; } if (@ARGV > 1) { eval {Getopt::Long::Configure("no_pass_through");}; if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n")) { print STDERR "$Configure_failed" if $Configure_failed; die $T2H_FAILURE_TEXT; } } # $T2H_DEBUG and $T2H_VERBOSE are shorthands my $T2H_DEBUG = $Texi2HTML::Config::DEBUG; $T2H_VERBOSE = $Texi2HTML::Config::VERBOSE; #+++############################################################################ # # # evaluation of cmd line options # # #---############################################################################ # retro compatibility for $Texi2HTML::Config::EXPAND push (@Texi2HTML::Config::EXPAND, $Texi2HTML::Config::EXPAND) if ($Texi2HTML::Config::EXPAND); # correct %text_macros and @special_regions based on command line and init # variables $text_macros{'menu'} = 1 if ($Texi2HTML::Config::SHOW_MENU); push @special_regions, 'tex' if ($Texi2HTML::Config::L2H); foreach my $expanded (@Texi2HTML::Config::EXPAND) { $text_macros{"if$expanded"} = 1 if (exists($text_macros{"if$expanded"})); next unless (exists($text_macros{$expanded})); if (grep {$_ eq $expanded} @special_regions) { $text_macros{$expanded} = 'special'; } elsif (grep {$_ eq $expanded} @raw_regions) { $text_macros{$expanded} = 'raw'; } else { $text_macros{$expanded} = 1; } } # handle ifnot regions foreach my $region (keys (%text_macros)) { next if ($region =~ /^ifnot/); if ($text_macros{$region} and $region =~ /^if(\w+)$/) { $text_macros{"ifnot$1"} = 0; } } if ($T2H_VERBOSE) { print STDERR "# Expanded: "; foreach my $text_macro (keys(%text_macros)) { print STDERR "$text_macro " if ($text_macros{$text_macro}); } print STDERR "\n"; } # This is kept in that file although it is html formatting as it seems to # be rather obsolete $Texi2HTML::Config::INVISIBLE_MARK = '' if $Texi2HTML::Config::INVISIBLE_MARK eq 'xbm'; $T2H_DEBUG |= $DEBUG_TEXI if ($Texi2HTML::Config::DUMP_TEXI); # Construct hashes used for cross references generation # Do it now as the user may have changed $USE_UNICODE foreach my $key (keys(%Texi2HTML::Config::unicode_map)) { if ($Texi2HTML::Config::unicode_map{$key} ne '') { if ($Texi2HTML::Config::USE_UNICODE) { $cross_ref_texi_map{$key} = chr(hex($Texi2HTML::Config::unicode_map{$key})); } else { $cross_ref_texi_map{$key} = '_' . lc($Texi2HTML::Config::unicode_map{$key}); } } } foreach my $key (keys(%cross_ref_style_map_texi)) { if ($style_type{$key} eq 'accent' and (ref($cross_ref_style_map_texi{$key}) eq 'HASH')) { if ($Texi2HTML::Config::USE_UNICODE) { $cross_ref_style_map_texi{$key}->{'function'} = \&Texi2HTML::Config::t2h_utf8_accent; } else { $cross_ref_style_map_texi{$key}->{'function'} = \&Texi2HTML::Config::t2h_nounicode_cross_manual_accent; } } } # # file name buisness # # this is directly pasted over from latex2html sub getcwd { local($_) = `pwd`; die "'pwd' failed (out of memory?)\n" unless length; chop; $_; } my $docu_dir; # directory of the document my $docu_name; # basename of the document my $docu_rdir; # directory for the output #my $docu_ext = "html"; # extension my $docu_ext = $Texi2HTML::Config::EXTENSION; # extension my $docu_toc; # document's table of contents my $docu_stoc; # document's short toc my $docu_foot; # document's footnotes my $docu_about; # about this document my $docu_top; # document top my $docu_doc; # document (or document top of split) die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1; my $docu = shift(@ARGV); if ($docu =~ /(.*\/)/) { chop($docu_dir = $1); $docu_name = $docu; $docu_name =~ s/.*\///; } else { $docu_dir = '.'; $docu_name = $docu; } unshift(@Texi2HTML::Config::INCLUDE_DIRS, $docu_dir); unshift(@Texi2HTML::Config::INCLUDE_DIRS, @Texi2HTML::Config::PREPEND_DIRS); $docu_name =~ s/\.te?x(i|info)?$//; $docu_name = $Texi2HTML::Config::PREFIX if ($Texi2HTML::Config::PREFIX); # resulting files splitting if ($Texi2HTML::Config::SPLIT =~ /section/i) { $Texi2HTML::Config::SPLIT = 'section'; } elsif ($Texi2HTML::Config::SPLIT =~ /node/i) { $Texi2HTML::Config::SPLIT = 'node'; } elsif ($Texi2HTML::Config::SPLIT =~ /chapter/i) { $Texi2HTML::Config::SPLIT = 'chapter'; } else { $Texi2HTML::Config::SPLIT = ''; } # Something like backward compatibility if ($Texi2HTML::Config::SPLIT and $Texi2HTML::Config::SUBDIR) { $Texi2HTML::Config::OUT = $Texi2HTML::Config::SUBDIR; } # subdir die "output to STDOUT and split or frames incompatible\n" if (($Texi2HTML::Config::SPLIT or $Texi2HTML::Config::FRAMES) and ($Texi2HTML::Config::OUT eq '-')); if ($Texi2HTML::Config::SPLIT and ($Texi2HTML::Config::OUT eq '')) { $Texi2HTML::Config::OUT = $docu_name; } if ($Texi2HTML::Config::SPLIT and ($Texi2HTML::Config::OUT eq '.')) {# This is to avoid trouble with latex2html $Texi2HTML::Config::OUT = ''; } $docu_rdir = ''; if ($Texi2HTML::Config::SPLIT and ($Texi2HTML::Config::OUT ne '')) { $Texi2HTML::Config::OUT =~ s|/*$||; $docu_rdir = "$Texi2HTML::Config::OUT/"; unless (-d $Texi2HTML::Config::OUT) { if ( mkdir($Texi2HTML::Config::OUT, oct(755))) { print STDERR "# created directory $Texi2HTML::Config::OUT\n" if ($T2H_VERBOSE); } else { die "$ERROR can't create directory $Texi2HTML::Config::OUT\n"; } } print STDERR "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE); } elsif (! $Texi2HTML::Config::SPLIT and ($Texi2HTML::Config::OUT ne '')) { if ($Texi2HTML::Config::OUT =~ m|(.*)/|) {# there is a leading directories $docu_rdir = "$1/"; unless (-d $docu_rdir) { if ( mkdir($docu_rdir, oct(755))) { print STDERR "# created directory $docu_rdir\n" if ($T2H_VERBOSE); } else { die "$ERROR can't create directory $docu_rdir\n"; } } print STDERR "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE); } else { print STDERR "# putting result files into current directory \n" if ($T2H_VERBOSE); $docu_rdir = ''; } } # We don't use "./" as $docu_rdir when $docu_rdir is the current directory # because it is problematic for latex2html. To test writability with -w, # however we need a real directory. my $result_rdir = $docu_rdir; $result_rdir = "." if ($docu_rdir eq ''); unless (-w $result_rdir) { $docu_rdir = 'current directory' if ($docu_rdir eq ''); die "$ERROR $docu_rdir not writable\n"; } # relative path leading to the working directory from the document directory my $path_to_working_dir = $docu_rdir; if ($docu_rdir ne '') { my $cwd = getcwd; my $docu_path = $docu_rdir; $docu_path = $cwd . '/' . $docu_path unless ($docu_path =~ /^\//); my @result = (); foreach my $element (split /\//, File::Spec->canonpath($docu_path)) { if ($element eq '') { push @result, ''; } elsif ($element eq '..') { if (@result and ($result[-1] eq '')) { print STDERR "Too much .. in absolute file name\n"; } elsif (@result and ($result[-1] ne '..')) { pop @result; } else { push @result, $element; } } else { push @result, $element; } } $path_to_working_dir = File::Spec->abs2rel($cwd, join ('/', @result)); $path_to_working_dir =~ s|.*/||; $path_to_working_dir .= '/' unless($path_to_working_dir eq ''); } # extension if ($Texi2HTML::Config::SHORTEXTN) { $docu_ext = "htm"; } if ($Texi2HTML::Config::TOP_FILE =~ s/\..*$//) { $Texi2HTML::Config::TOP_FILE .= ".$docu_ext"; } $docu_doc = "$docu_name.$docu_ext"; # document's contents if ($Texi2HTML::Config::SPLIT) { # if Texi2HTML::Config::NODE_FILES is true and a node is called ${docu_name}_toc # ${docu_name}_ovr... there may be trouble with the old naming scheme in # very rare circumstances. This won't be fixed, the new scheme will be used # soon. $docu_toc = $Texi2HTML::Config::TOC_FILE || "${docu_name}_toc.$docu_ext"; $docu_stoc = "${docu_name}_ovr.$docu_ext"; $docu_foot = "${docu_name}_fot.$docu_ext"; $docu_about = "${docu_name}_abt.$docu_ext"; $docu_top = $Texi2HTML::Config::TOP_FILE || $docu_doc; } else { if ($Texi2HTML::Config::OUT) { $docu_doc = $Texi2HTML::Config::OUT; $docu_doc =~ s|.*/||; } $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc; } # For use in init files $Texi2HTML::Config::TOP_FILE = $docu_top; $Texi2HTML::Config::TOC_FILE = $docu_toc; my $docu_doc_file = "$docu_rdir$docu_doc"; my $docu_toc_file = "$docu_rdir$docu_toc"; my $docu_stoc_file = "$docu_rdir$docu_stoc"; my $docu_foot_file = "$docu_rdir$docu_foot"; my $docu_about_file = "$docu_rdir$docu_about"; my $docu_top_file = "$docu_rdir$docu_top"; my $docu_frame_file = "$docu_rdir${docu_name}_frame.$docu_ext"; my $docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext"; # # _foo: internal variables to track @foo # foreach my $key ('_author', '_title', '_subtitle', '_shorttitlepage', '_settitle', '_setfilename', '_shorttitle', '_titlefont') { $value{$key} = ''; # prevent -w warnings } my $index; # ref on a hash for the index entries my %indices = (); # hash of indices names containing #[ $Pages, $Entries ] (page indices and # raw index entries) my @index_labels = (); # array corresponding with @?index commands # constructed during pass_texi, used to # put labels in pass_text # # initial counters # my $foot_num = 0; my $relative_foot_num = 0; my $idx_num = 0; my $sec_num = 0; my $anchor_num = 0; # # can I use ISO8859 characters? (HTML+) # if ($Texi2HTML::Config::USE_ISO) { foreach my $thing (keys(%Texi2HTML::Config::iso_symbols)) { $things_map_ref->{$thing} = $Texi2HTML::Config::iso_symbols{$thing}; $pre_map_ref->{$thing} = $Texi2HTML::Config::iso_symbols{$thing}; } } # process a css file sub process_css_file ($$) { my $fh =shift; my $file = shift; my $in_rules = 0; my $in_comment = 0; my $in_import = 0; my $in_string = 0; my $rules = []; my $imports = []; while (<$fh>) { #print STDERR "Line: $_"; if ($in_rules) { push @$rules, $_; next; } my $text = ''; while (1) { #sleep 1; #print STDERR "${text}!in_comment $in_comment in_rules $in_rules in_import $in_import in_string $in_string: $_"; if ($in_comment) { if (s/^(.*?\*\/)//) { $text .= $1; $in_comment = 0; } else { push @$imports, $text . $_; last; } } elsif (!$in_string and s/^\///) { # what do '\' do here ? if (s/^\*//) { $text .= '/*'; $in_comment = 1; } else { push (@$imports, $text. "\n") if ($text ne ''); push (@$rules, '/' . $_); $in_rules = 1; last; } } elsif (!$in_string and $in_import and s/^([\"\'])//) { # strings outside of import start rules $text .= "$1"; $in_string = quotemeta("$1"); } elsif ($in_string and s/^(\\$in_string)//) { $text .= $1; } elsif ($in_string and s/^($in_string)//) { $text .= $1; $in_string = 0; } elsif ((! $in_string and !$in_import) and (s/^([\\]?\@import)$// or s/^([\\]?\@import\s+)//)) { $text .= $1; $in_import = 1; } elsif (!$in_string and $in_import and s/^\;//) { $text .= ';'; $in_import = 0; } elsif (($in_import or $in_string) and s/^(.)//) { $text .= $1; } elsif (!$in_import and s/^([^\s])//) { push (@$imports, $text. "\n") if ($text ne ''); push (@$rules, $1 . $_); $in_rules = 1; last; } elsif (s/^(\s)//) { $text .= $1; } elsif ($_ eq '') { push (@$imports, $text); last; } } } warn "$WARN string not closed in css file $file\n" if ($in_string); warn "$WARN comment not closed in css file $file\n" if ($in_comment); warn "$WARN \@import not finished in css file $file\n" if ($in_import and !$in_comment and !$in_string); return ($imports, $rules); } my @css_import_lines; my @css_rule_lines; # process css files foreach my $file (@Texi2HTML::Config::CSS_FILES) { my $css_file_fh; my $css_file; if ($file eq '-') { $css_file_fh = \*STDIN; $css_file = '-'; } else { $css_file = locate_init_file ($file); unless (defined($css_file)) { warn "css file $file not found\n"; next; } unless (open (CSSFILE, "$css_file")) { warn "Cannot open ${css_file}: $!"; next; } $css_file_fh = \*CSSFILE; } my ($import_lines, $rules_lines); ($import_lines, $rules_lines) = process_css_file ($css_file_fh, $css_file); push @css_import_lines, @$import_lines; push @css_rule_lines, @$rules_lines; } if ($T2H_DEBUG & $DEBUG_USER) { if (@css_import_lines) { print STDERR "# css import lines\n"; foreach my $line (@css_import_lines) { print STDERR "$line"; } } if (@css_rule_lines) { print STDERR "# css rule lines\n"; foreach my $line (@css_rule_lines) { print STDERR "$line"; } } } # # read texi2html extensions (if any) # FIXME isn't that obsolete ? (obsoleted by -init-file) my $extensions = 'texi2html.ext'; # extensions in working directory if (-f $extensions) { print STDERR "# reading extensions from $extensions\n" if $T2H_VERBOSE; require($extensions); } my $progdir; ($progdir = $0) =~ s/[^\/]+$//; if ($progdir && ($progdir ne './')) { $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory if (-f $extensions) { print STDERR "# reading extensions from $extensions\n" if $T2H_VERBOSE; require($extensions); } } # parse texinfo cnf file for external manual specifications. my @texinfo_htmlxref_files = locate_init_file ($texinfo_htmlxref, 1, \@texinfo_config_dirs); foreach my $file (@texinfo_htmlxref_files) { open (HTMLXREF, $file); while () { my $line = $_; s/[#]\s.*//; s/^\s*//; next if /^\s*$/; my @htmlxref = split /\s+/; my $manual = shift @htmlxref; next if (exists($Texi2HTML::THISDOC{'htmlxref'}->{$manual})); my $split_or_mono = shift @htmlxref; if (!defined($split_or_mono) or ($split_or_mono ne 'split' and $split_or_mono ne 'mono')) { echo_warn("Bad line in $file: $line"); next; } my $href = shift @htmlxref; if ($split_or_mono eq 'split') { $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'split'} = 1; $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'mono'} = 0; } else { $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'split'} = 0; $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'mono'} = 1; } if (defined($href)) { if ($Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'split'}) { $href =~ s/\/*$//; } $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'href'} = $href; } } close (HTMLXREF); } if ($T2H_DEBUG) { foreach my $manual (keys(%{$Texi2HTML::THISDOC{'htmlxref'}})) { my $href = 'NO'; $href = $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'href'} if defined($Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'href'}); print STDERR "$manual: split $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'split'}, href: $href\n"; } } print STDERR "# reading from $docu\n" if $T2H_VERBOSE; { package Texi2HTML::LaTeX2HTML; ######################################################################### # # latex2html stuff # # latex2html conversions consist of three stages: # 1) ToLatex: Put "latex" code into a latex file # 2) ToHtml: Use latex2html to generate corresponding html code and images # 3) FromHtml: Extract generated code and images from latex2html run # # init l2h defaults for files and names # variable which shouldn't be global FIXME use vars qw( %l2h_img ); my ($l2h_name, $l2h_latex_file, $l2h_cache_file, $l2h_html_file, $l2h_prefix); # holds the status of latex2html operations. If 0 it means that there was # an error my $status = 0; my $debug; my $docu_rdir; #if ($Texi2HTML::Config::L2H) sub init($$$) { my $docu_name = shift; $docu_rdir = shift; $debug = shift; $l2h_name = "${docu_name}_l2h"; $l2h_latex_file = "$docu_rdir${l2h_name}.tex"; $l2h_cache_file = "${docu_rdir}l2h_cache.pm"; # destination dir -- generated images are put there, should be the same # as dir of enclosing html document -- $l2h_html_file = "$docu_rdir${l2h_name}.html"; $l2h_prefix = "${l2h_name}_"; $status = init_to_latex(); } ########################## # # First stage: Generation of Latex file # Initialize with: l2h_InitToLatex # Add content with: l2h_ToLatex($text) --> HTML placeholder comment # Finish with: l2h_FinishToLatex # my $l2h_latex_preamble = <$l2h_latex_file")) { warn "$ERROR Error l2h: Can't open latex file '$l2h_latex_file' for writing\n"; return 0; } print STDERR "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE); print L2H_LATEX $l2h_latex_preamble; } # open database for caching #l2h_InitCache(); init_cache(); return 1; } # print text (1st arg) into latex file (if not already there), return # @tex_$number which can be later on replaced by the latex2html # generated text #sub l2h_ToLatex sub to_latex { my($text) = @_; my($count); $l2h_to_latex_count++; $text =~ s/(\s*)$//; # try whether we can cache it #my $cached_text = l2h_FromCache($text); my $cached_text = from_cache($text); if ($cached_text) { $l2h_cached_count++; return $cached_text; } # try whether we have text already on things to do unless ($count = $l2h_to_latex{$text}) { $count = $l2h_latex_count; $l2h_latex_count++; $l2h_to_latex{$text} = $count; $l2h_to_latex[$count] = $text; unless ($Texi2HTML::Config::L2H_SKIP) { print L2H_LATEX "\\begin{rawhtml}\n"; print L2H_LATEX "\n"; print L2H_LATEX "\\end{rawhtml}\n"; print L2H_LATEX "$text\n"; print L2H_LATEX "\\begin{rawhtml}\n"; print L2H_LATEX "\n"; print L2H_LATEX "\\end{rawhtml}\n"; } } return "\@tex_${count} "; } # print closing into latex file and close it #sub l2h_FinishToLatex sub finish_to_latex() { my ($reused); $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count; unless ($Texi2HTML::Config::L2H_SKIP) { print L2H_LATEX $l2h_latex_closing; close(L2H_LATEX); } print STDERR "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE); unless ($l2h_latex_count) { #l2h_Finish(); finish(); return 0; } return 1; } ################################### # Second stage: Use latex2html to generate corresponding html code and images # # l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]): # Call latex2html on $l2h_latex_file # Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir # Return 1, on success # 0, otherwise # #sub l2h_ToHtml sub to_html() { my ($call, $dotbug); if ($Texi2HTML::Config::L2H_SKIP) { print STDERR "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE); return 1; } # Check for dot in directory where dvips will work if ($Texi2HTML::Config::L2H_TMP) { if ($Texi2HTML::Config::L2H_TMP =~ /\./) { warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n"; $dotbug = 1; } } else { if (main::getcwd() =~ /\./) { warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n"; $dotbug = 1; } } # fix it, if necessary and hope that it works $Texi2HTML::Config::L2H_TMP = "/tmp" if ($dotbug); $call = $Texi2HTML::Config::L2H_L2H; # use init file, if specified my $init_file = main::locate_init_file($Texi2HTML::Config::L2H_FILE); $call = $call . " -init_file " . $init_file if ($init_file); # set output dir $call .= ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir"); # use l2h_tmp, if specified $call = $call . " -tmp $Texi2HTML::Config::L2H_TMP" if ($Texi2HTML::Config::L2H_TMP); # use a given html version if specified $call = $call . " -html_version $Texi2HTML::Config::L2H_HTML_VERSION" if ($Texi2HTML::Config::L2H_HTML_VERSION); # options we want to be sure of $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link"; $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file"; print STDERR "# l2h: executing '$call'\n" if ($Texi2HTML::Config::VERBOSE); if (system($call)) { warn "l2h ***Error: '${call}' did not succeed\n"; return 0; } else { print STDERR "# l2h: latex2html finished successfully\n" if ($Texi2HTML::Config::VERBOSE); return 1; } } ########################## # Third stage: Extract generated contents from latex2html run # Initialize with: l2h_InitFromHtml # open $l2h_html_file for reading # reads in contents into array indexed by numbers # return 1, on success -- 0, otherwise # Extract Html code with: l2h_FromHtml($text) # replaces in $text all previosuly inserted comments by generated html code # returns (possibly changed) $text # Finish with: l2h_FinishFromHtml # closes $l2h_html_dir/$l2h_name.".$docu_ext" my $l2h_extract_error = 0; my $l2h_range_error = 0; my @l2h_from_html; #sub l2h_InitFromHtml() sub init_from_html() { local(%l2h_img); my ($count, $h_line); if (! open(L2H_HTML, "<${l2h_html_file}")) { print STDERR "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n"; return 0; } print STDERR "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE); my $l2h_html_count = 0; while ($h_line = ) { if ($h_line =~ /^/) { $count = $1; my $h_content = ""; while ($h_line = ) { if ($h_line =~ /^/) { chomp $h_content; chomp $h_content; $l2h_html_count++; #$h_content = l2h_ToCache($count, $h_content); $h_content = to_cache($count, $h_content); $l2h_from_html[$count] = $h_content; $h_content = ''; last; } $h_content = $h_content.$h_line; } if ($h_content) { print STDERR "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n" if ($Texi2HTML::Config::VERBOSE); close(L2H_HTML); return 0; } } } print STDERR "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n" if ($Texi2HTML::Config::VERBOSE); close(L2H_HTML); return 1; } sub latex2html() { return unless($status); return unless ($status = finish_to_latex()); return unless ($status = to_html()); return unless ($status = init_from_html()); } # FIXME used ?? #sub l2h_FromHtml($) sub from_html($) { my($text) = @_; my($done, $to_do, $count); $to_do = $text; $done = ''; while ($to_do =~ /([^\000]*)([^\000]*)/) { $to_do = $1; $count = $2; $done = $3.$done; $done = "".$done #if ($T2H_DEBUG & $DEBUG_L2H); if ($debug); #$done = l2h_ExtractFromHtml($count) . $done; $done = extract_from_html($count) . $done; $done = "".$done #if ($T2H_DEBUG & $DEBUG_L2H); if ($debug); } return $to_do.$done; } sub do_tex($) { my $count = shift; my $result = ''; $result = "" #if ($T2H_DEBUG & $DEBUG_L2H); if ($debug); $result .= extract_from_html($count); $result .= "" #if ($T2H_DEBUG & $DEBUG_L2H); if ($debug); return $result; } #sub l2h_ExtractFromHtml($) sub extract_from_html($) { my $count = shift; return $l2h_from_html[$count] if ($l2h_from_html[$count]); if ($count >= 0 && $count < $l2h_latex_count) { # now we are in trouble my $line; $l2h_extract_error++; print STDERR "$ERROR l2h: can't extract content $count from html\n" if ($T2H_VERBOSE); # try simple (ordinary) substition (without l2h) #my $l_l2h = $Texi2HTML::Config::L2H; $Texi2HTML::Config::L2H = 0; my $l_l2h = $status; $status = 0; $line = $l2h_to_latex{$count}; $line = main::substitute_text({}, $line); $line = "" . $line #if ($T2H_DEBUG & $DEBUG_L2H); if ($debug); #$Texi2HTML::Config::L2H = $l_l2h; $status = $l_l2h; return $line; } else { # now we have been incorrectly called $l2h_range_error++; print STDERR "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n"; return "" #if ($T2H_DEBUG & $DEBUG_L2H); if ($debug); return ""; } } #sub l2h_FinishFromHtml() sub finish_from_html() { if ($Texi2HTML::Config::VERBOSE) { if ($l2h_extract_error + $l2h_range_error) { print STDERR "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n"; } else { print STDERR "# l2h: finished from html (no errors)\n"; } } } #sub l2h_Finish() sub finish() { return unless($status); finish_from_html(); #l2h_StoreCache(); store_cache(); if ($Texi2HTML::Config::L2H_CLEAN) { local ($_); print STDERR "# l2h: removing temporary files generated by l2h extension\n" if $Texi2HTML::Config::VERBOSE; while (<"$docu_rdir$l2h_name"*>) { unlink $_; } } print STDERR "# l2h: Finished\n" if $Texi2HTML::Config::VERBOSE; return 1; } ############################## # stuff for l2h caching # # I tried doing this with a dbm data base, but it did not store all # keys/values. Hence, I did as latex2html does it #sub l2h_InitCache sub init_cache { if (-r "$l2h_cache_file") { my $rdo = do "$l2h_cache_file"; warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n") unless ($rdo); } } #sub l2h_StoreCache sub store_cache { return unless $l2h_latex_count; my ($key, $value); open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n"; while (($key, $value) = each %l2h_cache) { # escape stuff $key =~ s|/|\\/|g; $key =~ s|\\\\/|\\/|g; # weird, a \ at the end of the key results in an error # maybe this also broke the dbm database stuff $key =~ s|\\$|\\\\|; $value =~ s/\|/\\\|/go; $value =~ s/\\\\\|/\\\|/go; $value =~ s|\\\\|\\\\\\\\|g; print FH "\n\$l2h_cache_key = q/$key/;\n"; print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n"; } print FH "1;"; close(FH); } # return cached html, if it exists for text, and if all pictures # are there, as well #sub l2h_FromCache sub from_cache { my $text = shift; my $cached = $l2h_cache{$text}; if ($cached) { while ($cached =~ m/SRC="(.*?)"/g) { unless (-e "$docu_rdir$1") { return undef; } } return $cached; } return undef; } # insert generated html into cache, move away images, # return transformed html my $maximage = 1; #sub l2h_ToCache($$) sub to_cache($$) { my $count = shift; my $content = shift; my @images = ($content =~ /SRC="(.*?)"/g); my ($src, $dest); for $src (@images) { $dest = $l2h_img{$src}; unless ($dest) { my $ext; if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext) { $ext = $1; } else { warn "$ERROR: L2h image $src has invalid extension\n"; next; } while (-e "$docu_rdir${docu_name}_$maximage.$ext") { $maximage++; } $dest = "${docu_name}_$maximage.$ext"; system("cp -f $docu_rdir$src $docu_rdir$dest"); $l2h_img{$src} = $dest; #unlink "$docu_rdir$src" unless ($T2H_DEBUG & $DEBUG_L2H); unlink "$docu_rdir$src" unless ($debug); } $content =~ s/$src/$dest/g; } $l2h_cache{$l2h_to_latex[$count]} = $content; return $content; } } #+++########################################################################### # # # Pass texi: read source, handle variable, ignored text, # # # #---########################################################################### my @fhs = (); # hold the file handles to read my $input_spool; # spooled lines to read my @lines = (); # whole document my @lines_numbers = (); # line number, originating file associated with # whole document my $macros; # macros. reference on a hash my %info_enclose; # macros defined with definfoenclose my $texi_line_number = { 'file_name' => '', 'line_nr' => 0, 'macro' => '' }; my @floats = (); # floats list my %floats = (); # floats by style sub initialise_state_texi($) { my $state = shift; $state->{'texi'} = 1; # for substitute_text and close_stack: # 1 if pass_texi/scan_texi is to be used } my @first_lines = (); sub pass_texi() { my $first_lines = 1; # is it the first lines my $state = {}; # holds the informations about the context # to pass it down to the functions initialise_state_texi($state); my @stack; my $text; INPUT_LINE: while (defined($_ = next_line($texi_line_number))) { # # remove the lines preceding \input or an @-command # if ($first_lines) { if (/^\\input/) { push @first_lines, $_; $first_lines = 0; next; } if (/^\s*\@/) { $first_lines = 0; } else { push @first_lines, $_; next; } } #print STDERR "line_nr $texi_line_number->{'line_nr'} :$_"; my $chomped_line = $_; if (scan_texi ($_, \$text, \@stack, $state, $texi_line_number) and chomp($chomped_line)) { #print STDERR "scan_texi line_nr $texi_line_number->{'line_nr'}\n"; push (@lines_numbers, { 'file_name' => $texi_line_number->{'file_name'}, 'line_nr' => $texi_line_number->{'line_nr'}, 'macro' => $texi_line_number->{'macro'} }); } #dump_stack (\$text, \@stack, $state); if ($state->{'bye'}) { #dump_stack(\$text, \@stack, $state); # close stack after bye close_stack_texi_structure(\$text, \@stack, $state, $texi_line_number); } next if (@stack); $_ = $text; $text = ''; next if !defined($_); push @lines, split_lines ($_); last if ($state->{'bye'}); } # close stack at the end of pass texi close_stack_texi_structure(\$text, \@stack, $state, $texi_line_number); push @lines, split_lines ($text); print STDERR "# end of pass texi\n" if $T2H_VERBOSE; } # return the line after preserving things according to misc_command map. sub preserve_command($$) { my $line = shift; my $macro = shift; my $text = ''; my $args = ''; my $skip_spec = ''; my $arg_spec = ''; $skip_spec = $Texi2HTML::Config::misc_command{$macro}->{'skip'} if (defined($Texi2HTML::Config::misc_command{$macro}->{'skip'})); $arg_spec = $Texi2HTML::Config::misc_command{$macro}->{'arg'} if (defined($Texi2HTML::Config::misc_command{$macro}->{'arg'})); if ($arg_spec eq 'line') { $text .= $line; $args .= $line; $line = ''; } elsif ($arg_spec) { my $arg_nr = $Texi2HTML::Config::misc_command{$macro}->{'arg'}; while ($arg_nr) { $line =~ s/(\s+\S*)//o; $text .= $1 if defined($1); $args .= $1 if defined($1); $arg_nr--; } } if ($macro eq 'bye') { $line = ''; $text = "\n"; } elsif ($skip_spec eq 'linespace') { if ($line =~ /^\s*$/o) { $line =~ s/([ \t]*)//o; $text .= $1; } } elsif ($skip_spec eq 'linewhitespace') { if ($line =~ /^\s*$/o) { $text .= $line; $line = ''; } } elsif ($skip_spec eq 'line') { $text .= $line; $line = ''; } elsif ($skip_spec eq 'whitespace') { $line =~ s/(\s*)//o; $text .= $1; } elsif ($skip_spec eq 'space') { $line =~ s/([ \t]*)//o; $text .= $1; } $line = '' if (!defined($line)); return ($line, "\@$macro" . $text, $args); } #+++########################################################################### # # # Pass structure: parse document structure # # # #---########################################################################### # This is a virtual element for things appearing before @node and # sectionning commands my $element_before_anything = { 'before_anything' => 1, 'place' => [], 'texi' => 'VIRTUAL ELEMENT BEFORE ANYTHING', }; sub initialise_state_structure($) { my $state = shift; $state->{'structure'} = 1; # for substitute_text and close_stack: # 1 if pass_structure/scan_structure is # to be used $state->{'menu'} = 0; # number of opened menus $state->{'detailmenu'} = 0; # number of opened detailed menus $state->{'level'} = 0; # current sectionning level $state->{'table_stack'} = [ "no table" ]; # a stack of opened tables/lists delete ($state->{'region_lines'}) unless (defined($state->{'region_lines'})); } my @doc_lines = (); # whole document my @doc_numbers = (); # whole document line numbers and file names my @nodes_list = (); # nodes in document reading order # each member is a reference on a hash my @sections_list = (); # sections in reading order # each member is a reference on a hash my @elements_list = (); # sectionning elements (nodes and sections) # in reading order. Each member is a reference # on a hash which also appears in %nodes, # @sections_list @nodes_list, @all_elements my @all_elements; # all the elements in document order my %nodes = (); # nodes hash. The key is the texi node name my %cross_reference_nodes = (); # normalized node names my %sections = (); # sections hash. The key is the section number # headings are there, although they are not elements my $element_top; # Top element my $node_top; # Top node my $node_first; # First node my $element_index; # element with first index my $element_chapter_index; # chapter with first index my $element_first; # first element my $element_last; # last element # This is a virtual element used to have the right hrefs for index entries # and anchors in footnotes my $footnote_element = { 'id' => 'SEC_Foot', 'file' => $docu_foot, 'footnote' => 1, 'element' => 1, 'place' => [], }; #my $do_contents; # do table of contents if true #my $do_scontents; # do short table of contents if true my $novalidate = $Texi2HTML::Config::NOVALIDATE; # @novalidate appeared sub pass_structure() { my $state = {}; # holds the informations about the context # to pass it down to the functions initialise_state_structure($state); $state->{'element'} = $element_before_anything; $state->{'place'} = $element_before_anything->{'place'}; my @stack; my $text; my $line_nr; while (@lines) { $_ = shift @lines; my $chomped_line = $_; if (!chomp($chomped_line) and @lines) { $lines[0] = $_ . $lines[0]; next; } $line_nr = shift (@lines_numbers); #print STDERR "PASS_STRUCTURE: $_"; if (!$state->{'raw'} and !$state->{'special'} and !$state->{'verb'}) { my $tag = ''; if (/^\s*\@(\w+)\b/) { $tag = $1; } # # analyze the tag # if ($tag and $tag eq 'node' or defined($sec2level{$tag}) or $tag eq 'printindex' or $tag eq 'float') { $_ = substitute_texi_line($_); #usefull if there is an anchor ??? if (@stack and $tag eq 'node' or defined($sec2level{$tag}) or $tag eq 'float') {# in pass structure node and float shouldn't appear in formats close_stack_texi_structure(\$text, \@stack, $state, $line_nr); if (exists($state->{'region_lines'})) { push @{$region_lines{$state->{'region_lines'}->{'format'}}}, split_lines ($text); } else { push @doc_lines, split_lines ($text); } $text = ''; } if ($tag eq 'node') { my $node_ref; my $auto_directions; $auto_directions = 1 unless (/,/o); my ($node, $node_next, $node_prev, $node_up) = split(/,/, $_); $node =~ s/^\@node\s+// if ($node); if ($node) { $node = normalise_space($node); if (exists($nodes{$node}) and defined($nodes{$node}) and $nodes{$node}->{'seen'}) { echo_error ("Duplicate node found: $node", $line_nr); next; } else { if (exists($nodes{$node}) and defined($nodes{$node})) { # node appeared in a menu $node_ref = $nodes{$node}; } else { my $first; $first = 1 if (!defined($node_ref)); $node_ref = {}; $node_first = $node_ref if ($first); $nodes{$node} = $node_ref; } $node_ref->{'node'} = 1; $node_ref->{'tag'} = 'node'; $node_ref->{'tag_level'} = 'node'; $node_ref->{'texi'} = $node; $node_ref->{'seen'} = 1; $node_ref->{'automatic_directions'} = $auto_directions; $node_ref->{'place'} = []; $node_ref->{'current_place'} = []; merge_element_before_anything($node_ref); $node_ref->{'index_names'} = []; $state->{'place'} = $node_ref->{'current_place'}; $state->{'element'} = $node_ref; $state->{'after_element'} = 1; $state->{'node_ref'} = $node_ref; # makeinfo treats differently case variants of # top in nodes and anchors and in refs commands and # refs from nodes. if ($node =~ /^top$/i) { if (!defined($node_top)) { $node_top = $node_ref; $node_top->{'texi'} = 'Top'; delete $nodes{$node}; $nodes{$node_top->{'texi'}} = $node_ref; } else { # All the refs are going to point to the first Top echo_warn ("Top node allready exists", $line_nr); #warn "$WARN Top node allready exists\n"; } } unless (@nodes_list) { $node_ref->{'first'} = 1; } push (@nodes_list, $node_ref); push @elements_list, $node_ref; } } else { echo_error ("Node is undefined: $_ (eg. \@node NODE-NAME, NEXT, PREVIOUS, UP)", $line_nr); next; } if ($node_next) { $node_ref->{'node_next'} = normalise_node($node_next); } if ($node_prev) { $node_ref->{'node_prev'} = normalise_node($node_prev); } if ($node_up) { $node_ref->{'node_up'} = normalise_node($node_up); } } elsif (defined($sec2level{$tag})) { if (/^\@$tag\s*(.*)$/) { my $name = normalise_space($1); $name = '' if (!defined($name)); my $level = $sec2level{$tag}; $state->{'after_element'} = 1; my ($docid, $num); if($tag ne 'top') { $sec_num++; $num = $sec_num; $docid = "SEC$sec_num"; } else { $num = 0; $docid = "SEC_Top"; } if ($tag !~ /heading/) { my $section_ref = { 'texi' => $name, 'level' => $level, 'tag' => $tag, 'sec_num' => $num, 'section' => 1, 'id' => $docid, 'seen' => 1, 'index_names' => [], 'current_place' => [], 'place' => [] }; if ($tag eq 'top') { $section_ref->{'top'} = 1; $section_ref->{'number'} = ''; $sections{0} = $section_ref; $element_top = $section_ref; } $sections{$num} = $section_ref; merge_element_before_anything($section_ref); if ($state->{'node_ref'} and !exists($state->{'node_ref'}->{'with_section'})) { my $node_ref = $state->{'node_ref'}; $section_ref->{'node_ref'} = $node_ref; $section_ref->{'titlefont'} = $node_ref->{'titlefont'}; $node_ref->{'with_section'} = $section_ref; $node_ref->{'top'} = 1 if ($tag eq 'top'); } if (! $name and $level) { echo_warn ("$tag without name", $line_nr); } push @sections_list, $section_ref; push @elements_list, $section_ref; $state->{'section_ref'} = $section_ref; $state->{'element'} = $section_ref; $state->{'place'} = $section_ref->{'current_place'}; my $node_ref = "NO NODE"; my $node_texi =''; if ($state->{'node_ref'}) { $node_ref = $state->{'node_ref'}; $node_texi = $state->{'node_ref'}->{'texi'}; } print STDERR "# pass_structure node($node_ref)$node_texi, tag \@$tag($level) ref $section_ref, num,id $num,$docid\n $name\n" if $T2H_DEBUG & $DEBUG_ELEMENTS; } else { my $section_ref = { 'texi' => $name, 'level' => $level, 'heading' => 1, 'tag' => $tag, 'tag_level' => $tag, 'sec_num' => $sec_num, 'id' => $docid, 'number' => '' }; $state->{'element'} = $section_ref; push @{$state->{'place'}}, $section_ref; $sections{$sec_num} = $section_ref; } } } elsif ($tag eq 'float') { my ($style_texi, $label_texi) = split(/,/, $_); $style_texi =~ s/^\@float\s*//; $style_texi = normalise_space($style_texi); $label_texi = undef if (defined($label_texi) and ($label_texi =~ /^\s*$/)); if (defined($label_texi)) { $label_texi = normalise_node($label_texi); if (exists($nodes{$label_texi}) and defined($nodes{$label_texi}) and $nodes{$label_texi}->{'seen'}) { echo_error ("Duplicate label found: $label_texi", $line_nr); while ($_ =~ /,/) { $_ =~ s/,.*$//; } } else { my $float = { }; if (exists($nodes{$label_texi}) and defined($nodes{$label_texi})) { # float appeared in a menu $float = $nodes{$label_texi}; } else { $nodes{$label_texi} = $float; } $float->{'float'} = 1; $float->{'tag'} = 'float'; $float->{'texi'} = $label_texi; $float->{'seen'} = 1; $float->{'id'} = $label_texi; #print STDERR "FLOAT: $float $float->{'texi'}, place $state->{'place'}\n"; push @{$state->{'place'}}, $float; $float->{'element'} = $state->{'element'}; $state->{'float'} = $float; $float->{'style_texi'} = $style_texi; push @floats, $float; } } } elsif (/^\@printindex\s+(\w+)/) { unless (@elements_list) { echo_warn ("Printindex before document beginning: \@printindex $1", $line_nr); next; } $state->{'after_element'} = 0; # $element_index is the first element with index $element_index = $elements_list[-1] unless (defined($element_index)); # associate the index to the element such that the page # number is right my $placed_elements = []; push @{$elements_list[-1]->{'index_names'}}, { 'name' => $1, 'place' => $placed_elements }; $state->{'place'} = $placed_elements; } if (exists($state->{'region_lines'})) { push @{$region_lines{$state->{'region_lines'}->{'format'}}}, $_; } else { push @doc_lines, $_; push @doc_numbers, $line_nr; } next; } } if (scan_structure ($_, \$text, \@stack, $state, $line_nr) and !(exists($state->{'region_lines'}))) { push (@doc_numbers, $line_nr); } next if (@stack); $_ = $text; $text = ''; next if (!defined($_)); if ($state->{'region_lines'}) { push @{$region_lines{$state->{'region_lines'}->{'format'}}}, split_lines ($_); } else { push @doc_lines, split_lines ($_); } } if (@stack) {# close stack at the end of pass structure close_stack_texi_structure(\$text, \@stack, $state, $line_nr); push @doc_lines, split_lines ($text) if ($text and (!exists($state->{'region_lines'}))); } echo_warn ("At end of document, $state->{'region_lines'}->{'number'} $state->{'region_lines'}->{'format'} not closed") if (exists($state->{'region_lines'})); print STDERR "# end of pass structure\n" if $T2H_VERBOSE; } # split line at end of line and put each resulting line in an array sub split_lines($) { my $line = shift; my @result = (); my $i = 0; while ($line) { $result[$i] = ''; $line =~ s/^(.*)//; $result[$i] .= $1; $result[$i] .= "\n" if ($line =~ s/^\n//); #print STDERR "$i: $result[$i]"; $i++; } return @result; } sub misc_command_structure($$$$) { my $line = shift; my $macro = shift; my $state = shift; my $line_nr = shift; my $text; my $args; if ($macro eq 'lowersections') { my ($sec, $level); while (($sec, $level) = each %sec2level) { $sec2level{$sec} = $level + 1; } $state->{'level'}--; } elsif ($macro eq 'raisesections') { my ($sec, $level); while (($sec, $level) = each %sec2level) { $sec2level{$sec} = $level - 1; } $state->{'level'}++; } elsif ($macro eq 'contents') { $Texi2HTML::Config::DO_CONTENTS = 1; } elsif ($macro eq 'detailmenu') { $state->{'detailmenu'}++; } elsif (($macro eq 'summarycontents') or ($macro eq 'shortcontents')) { $Texi2HTML::Config::DO_SCONTENTS = 1; } elsif ($macro eq 'novalidate') { $novalidate = 1; } elsif (grep {$_ eq $macro} ('settitle','setfilename','shortitle','shorttitlepage') and ($line =~ /^\s+(.*)$/)) { $value{"_$macro"} = substitute_texi_line($1); } elsif (grep {$_ eq $macro} ('author','subtitle','title') and ($line =~ /^\s+(.*)$/)) { $value{"_$macro"} .= substitute_texi_line($1)."\n"; push @{$Texi2HTML::THISDOC{"${macro}s"}}, substitute_texi_line($1); } elsif ($macro eq 'synindex' || $macro eq 'syncodeindex') { if ($line =~ /^\s+(\w+)\s+(\w+)/) { my $from = $1; my $to = $2; my $prefix_from = index_name2prefix($from); my $prefix_to = index_name2prefix($to); echo_error ("unknown from index name $from in \@$macro", $line_nr) unless $prefix_from; echo_error ("unknown to index name $to in \@$macro", $line_nr) unless $prefix_to; if ($prefix_from and $prefix_to) { if ($macro eq 'syncodeindex') { $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1; } else { $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1; } } } else { echo_error ("Bad $macro line: $line", $line_nr); } } elsif ($macro eq 'defindex' || $macro eq 'defcodeindex') { if ($line =~ /^\s+(\w+)\s*$/) { my $name = $1; $index_properties->{$name}->{'name'} = $name; $index_properties->{$name}->{'code'} = 1 if $macro eq 'defcodeindex'; } else {# FIXME makeinfo don't warn ? echo_error ("Bad $macro line: $line", $line_nr); } } elsif ($macro eq 'documentlanguage') { if ($line =~ /\s+(\w+)/) { my $lang = $1; set_document_language($lang, 0, $line_nr) if (!$cmd_line_lang && $lang); } } elsif ($macro eq 'kbdinputstyle') {# FIXME makeinfo ignores that with --html if ($line =~ /\s+([a-z]+)/) { if ($1 eq 'code') { $style_map_ref->{'kbd'} = $style_map_ref->{'code'}; $style_map_pre_ref->{'kbd'} = $style_map_pre_ref->{'code'}; $Texi2HTML::THISDOC{'kbdinputstyle'} = $1; } elsif ($1 eq 'example') { $style_map_pre_ref->{'kbd'} = $style_map_pre_ref->{'code'}; $Texi2HTML::THISDOC{'kbdinputstyle'} = $1; } elsif ($1 ne 'distinct') { echo_error ("Unknown argument for \@$macro: $1", $line_nr); } } else { echo_error ("Bad \@$macro", $line_nr); } } elsif ($macro eq 'paragraphindent') { if ($line =~ /\s+([0-9]+)/) { $Texi2HTML::THISDOC{'paragraphindent'} = $1; } elsif (($line =~ /\s+(none)[^\w\-]/) or ($line =~ /\s+(asis)[^\w\-]/)) { $Texi2HTML::THISDOC{'paragraphindent'} = $1; } else { echo_error ("Bad \@$macro", $line_nr); } } elsif ($macro eq 'firstparagraphindent') { if (($line =~ /\s+(none)[^\w\-]/) or ($line =~ /\s+(insert)[^\w\-]/)) { $Texi2HTML::THISDOC{'firstparagraphindent'} = $1; } else { echo_error ("Bad \@$macro", $line_nr); } } elsif ($macro eq 'exampleindent') { if ($line =~ /^\s+([0-9]+)/) { $Texi2HTML::THISDOC{'exampleindent'} = $1; } elsif ($line =~ /^\s+(asis)[^\w\-]/) { $Texi2HTML::THISDOC{'exampleindent'} = $1; } else { echo_error ("Bad \@$macro", $line_nr); } } elsif ($macro eq 'footnotestyle') { if (($line =~ /^\s+(end)[^\w\-]/) or ($line =~ /^\s+(separate)[^\w\-]/)) { $Texi2HTML::THISDOC{'footnotestyle'} = $1; } else { echo_error ("Bad \@$macro", $line_nr); } } elsif ($macro eq 'headings') { my $valid_arg = 0; foreach my $possible_arg (('off','on','single','double', 'singleafter','doubleafter')) { if ($line =~ /^\s+($possible_arg)[^\w\-]/) { $valid_arg = 1; $Texi2HTML::THISDOC{'headings'} = $possible_arg; last; } } unless ($valid_arg) { echo_error ("Bad \@$macro", $line_nr); } } elsif ($macro eq 'setchapternewpage') { if (($line =~ /^\s+(on)[^\w\-]/) or ($line =~ /^\s+(off)[^\w\-]/) or ($line =~ /^\s+(odd)[^\w\-]/)) { $Texi2HTML::THISDOC{'setchapternewpage'} = $1; } else { echo_error ("Bad \@$macro", $line_nr); } } elsif (grep {$macro eq $_} ('everyheading', 'everyfooting', 'evenheading', 'evenfooting', 'oddheading', 'oddfooting')) { my $arg = $line; $arg =~ s/^\s+//; $Texi2HTML::THISDOC{$macro} = $arg; } ($text, $line, $args) = preserve_command($line, $macro); return ($text, $line); } # return the line after removing things according to misc_command map. # if the skipped macro has an effect it is done here # this is used during pass_text sub misc_command_text($$$$$$) { my $line = shift; my $macro = shift; my $stack = shift; my $state = shift; my $text = shift; my $line_nr = shift; my ($skipped, $remaining, $args); my $keep = $Texi2HTML::Config::misc_command{$macro}->{'keep'}; if ($macro eq 'detailmenu') { $state->{'detailmenu'}++; } elsif ($macro eq 'sp') { my $sp_number; if ($line =~ /^\s+(\d+)\s/) { $sp_number = $1; } elsif ($line =~ /(\s*)$/) { $sp_number = ''; } else { echo_error ("\@$macro needs a numeric arg or no arg", $line_nr); } $sp_number = 1 if ($sp_number eq ''); add_prev($text, $stack, &$Texi2HTML::Config::sp($sp_number, $state->{'preformatted'})); } elsif($macro eq 'verbatiminclude' and !$keep) { if ($line =~ /\s+(.+)/) { my $arg = $1; my $file = locate_include_file($arg); if (defined($file)) { if (!open(VERBINCLUDE, $file)) { echo_warn ("Can't read file $file: $!",$line_nr); } else { my $verb_text = ''; while (my $line = ) { $verb_text .= $line; } add_prev($text, $stack, &$Texi2HTML::Config::raw('verbatim',$verb_text)); close VERBINCLUDE; } } else { echo_error ("Can't find $arg, skipping", $line_nr); } } else { echo_error ("Bad \@$macro line: $_", $line_nr); } } elsif ($macro eq 'need') { unless (($line =~ /\s+([0-9]+(\.[0-9]*)?)[^\w\-]/) or ($line =~ /\s+(\.[0-9]+)[^\w\-]/)) { echo_warn ("Bad \@$macro", $line_nr); } } ($remaining, $skipped, $args) = preserve_command($line, $macro); if ($keep) { $remaining = $args . $remaining; } return $remaining if ($remaining ne ''); return undef; } # merge the things appearing before the first @node or sectionning command # (held by element_before_anything) with the current element if not allready # done sub merge_element_before_anything($) { my $element = shift; if (exists($element_before_anything->{'place'})) { $element->{'current_place'} = $element_before_anything->{'place'}; $element->{'titlefont'} = $element_before_anything->{'titlefont'}; delete $element_before_anything->{'place'}; foreach my $placed_thing (@{$element->{'current_place'}}) { $placed_thing->{'element'} = $element if (exists($placed_thing->{'element'})); } } } # find menu_prev, menu_up... for a node in menu sub menu_entry_texi($$$) { my $node = shift; my $state = shift; my $line_nr = shift; my $node_menu_ref = {}; if (exists($nodes{$node})) { $node_menu_ref = $nodes{$node}; } else { $nodes{$node} = $node_menu_ref; $node_menu_ref->{'texi'} = $node; $node_menu_ref->{'external_node'} = 1 if ($node =~ /\(.+\)/); # or $novalidate); } #$node_menu_ref->{'menu_node'} = 1; if ($state->{'node_ref'}) { $node_menu_ref->{'menu_up'} = $state->{'node_ref'}; $node_menu_ref->{'menu_up_hash'}->{$state->{'node_ref'}->{'texi'}} = 1; } else { echo_warn ("menu entry without previous node: $node", $line_nr) unless ($node =~ /\(.+\)/); #warn "$WARN menu entry without previous node: $node\n" unless ($node =~ /\(.+\)/); } return if ($state->{'detailmenu'}); if ($state->{'prev_menu_node'}) { $node_menu_ref->{'menu_prev'} = $state->{'prev_menu_node'}; $state->{'prev_menu_node'}->{'menu_next'} = $node_menu_ref; } elsif ($state->{'node_ref'}) { $state->{'node_ref'}->{'menu_child'} = $node_menu_ref; } $state->{'prev_menu_node'} = $node_menu_ref; } my %files = (); # keys are files. This is used to avoid reusing an allready # used file name my %empty_indices = (); # value is true for an index name key if the index # is empty my %printed_indices = (); # value is true for an index name not empty and # printed # find next, prev, up, back, forward, fastback, fastforward # find element id and file # split index pages # associate placed items (items which have links to them) with the right # file and id # associate nodes with sections sub rearrange_elements() { @all_elements = @elements_list; print STDERR "# find sections levels and toplevel\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); my $toplevel = 4; # correct level if raisesections or lowersections overflowed # and find toplevel foreach my $element (values(%sections)) { my $level = $element->{'level'}; if ($level > $MAX_LEVEL) { $element->{'level'} = $MAX_LEVEL; } elsif ($level < $MIN_LEVEL and !$element->{'top'}) { $element->{'level'} = $MIN_LEVEL; } else { $element->{'level'} = $level; } $element->{'toc_level'} = $element->{'level'}; # This is for top $element->{'toc_level'} = $MIN_LEVEL if ($element->{'level'} < $MIN_LEVEL); # find the new tag corresponding with the level of the section $element->{'tag_level'} = $level2sec{$element->{'tag'}}->[$element->{'level'}] if ($element->{'tag'} !~ /heading/); $toplevel = $element->{'level'} if (($element->{'level'} < $toplevel) and ($element->{'level'} > 0 and ($element->{'tag'} !~ /heading/))); print STDERR "# section level $level: $element->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); } print STDERR "# find sections structure, construct section numbers (toplevel=$toplevel)\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); my $in_appendix = 0; # these arrays heve an element per sectionning level. my @previous_numbers = (); # holds the number of the previous sections # at the same and upper levels my @previous_sections = (); # holds the ref of the previous sections foreach my $section (@sections_list) { next if ($section->{'top'}); print STDERR "Bug level undef for ($section) $section->{'texi'}\n" if (!defined($section->{'level'})); $section->{'toplevel'} = 1 if ($section->{'level'} == $toplevel); # undef things under that section level for (my $level = $section->{'level'} + 1; $level < $MAX_LEVEL + 1 ; $level++) { $previous_numbers[$level] = undef; $previous_sections[$level] = undef; } my $number_set; # find number at the current level if ($section->{'tag'} =~ /appendix/ and !$in_appendix) { $previous_numbers[$toplevel] = 'A'; $in_appendix = 1; $number_set = 1 if ($section->{'level'} == $toplevel); } if (!defined($previous_numbers[$section->{'level'}]) and !$number_set) { if ($section->{'tag'} =~ /unnumbered/) { $previous_numbers[$section->{'level'}] = undef; } else { $previous_numbers[$section->{'level'}] = 1; } } elsif ($section->{'tag'} !~ /unnumbered/ and !$number_set) { $previous_numbers[$section->{'level'}]++; } # construct the section number $section->{'number'} = ''; unless ($section->{'tag'} =~ /unnumbered/) { my $level = $section->{'level'}; while ($level > $toplevel) { my $number = $previous_numbers[$level]; $number = 0 if (!defined($number)); if ($section->{'number'}) { $section->{'number'} = "$number.$section->{'number'}"; } else { $section->{'number'} = $number; } $level--; } my $toplevel_number = $previous_numbers[$toplevel]; $toplevel_number = 0 if (!defined($toplevel_number)); $section->{'number'} = "$toplevel_number.$section->{'number'}"; } # find the previous section if (defined($previous_sections[$section->{'level'}])) { my $prev_section = $previous_sections[$section->{'level'}]; $section->{'section_prev'} = $prev_section; $prev_section->{'next'} = $section; $prev_section->{'element_next'} = $section; } # find the up section if ($section->{'level'} == $toplevel) { $section->{'up'} = undef; } else { my $level = $section->{'level'} - 1; while (!defined($previous_sections[$level]) and ($level >= 0)) { $level--; } if ($level >= 0) { $section->{'up'} = $previous_sections[$level]; # 'child' is the first child $section->{'up'}->{'child'} = $section unless ($section->{'section_prev'}); } else { $section->{'up'} = undef; } } $previous_sections[$section->{'level'}] = $section; # element_up is used for reparenting in case an index page # splitted a section. This is used in order to preserve the up which # points to the up section. See below at index pages generation. $section->{'element_up'} = $section->{'up'}; my $up = "NO_UP"; $up = $section->{'up'} if (defined($section->{'up'})); print STDERR "# numbering section ($section->{'level'}): $section->{'number'}: (up: $up) $section->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); } my @node_directions = ('node_prev', 'node_next', 'node_up'); # handle nodes # the node_prev... are texinfo strings, find the associated node references print STDERR "# Resolve nodes directions\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); foreach my $node (@nodes_list) { foreach my $direction (@node_directions) { if ($node->{$direction} and !ref($node->{$direction})) { if ($nodes{$node->{$direction}} and $nodes{$node->{$direction}}->{'seen'}) { $node->{$direction} = $nodes{$node->{$direction}}; } elsif (($node->{$direction} =~ /^\(.*\)/) or $novalidate) { # ref to an external node if (exists($nodes{$node->{$direction}})) { $node->{$direction} = $nodes{$node->{$direction}}; } else { # FIXME if {'seen'} this is a node appearing in the # document and a node like `(file)node'. What to # do then ? my $node_ref = { 'texi' => $node->{$direction} }; $node_ref->{'external_node'} = 1 if ($node->{$direction} =~ /^\(.*\)/); #my $node_ref = { 'texi' => $node->{$direction}, # 'external_node' => 1 }; $nodes{$node->{$direction}} = $node_ref; $node->{$direction} = $node_ref; } } else { echo_warn ("$direction `$node->{$direction}' for `$node->{'texi'}' not found"); delete $node->{$direction}; } } } } # find section preceding and following top my $section_before_top; # section preceding the top node my $section_after_top; # section following the top node if ($node_top) { my $previous_is_top = 0; foreach my $element (@all_elements) { if ($element eq $node_top) { $previous_is_top = 1; next; } if ($previous_is_top) { if ($element->{'section'}) { $section_after_top = $element; last; } next; } $section_before_top = $element if ($element->{'section'}); } } print STDERR "# section before Top: $section_before_top->{'texi'}\n" if ($section_before_top and ($T2H_DEBUG & $DEBUG_ELEMENTS)); print STDERR "# section after Top: $section_after_top->{'texi'}\n" if ($section_after_top and ($T2H_DEBUG & $DEBUG_ELEMENTS)); print STDERR "# Build the elements list\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); if (!$Texi2HTML::Config::USE_NODES) { #the only sectionning elements are sections @elements_list = @sections_list; # if there is no section we use nodes... if (!@elements_list) { print STDERR "# no section\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); @elements_list = @all_elements; } elsif (!$element_top and $node_top and !$node_top->{'with_section'}) { # special case for the top node if it isn't associated with # a section. The top node element is inserted between the # $section_before_top and the $section_after_top $node_top->{'as_section'} = 1; $node_top->{'section_ref'} = $node_top; my @old_element_lists = @elements_list; @elements_list = (); while (@old_element_lists) { my $section = shift @old_element_lists; if ($section_before_top and ($section eq $section_before_top)) { push @elements_list, $section; push @elements_list, $node_top; last; } elsif ($section_after_top and ($section eq $section_after_top)) { push @elements_list, $node_top; push @elements_list, $section; last; } push @elements_list, $section; } push @elements_list, @old_element_lists; } foreach my $element (@elements_list) { print STDERR "# new section element $element->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); } } else { # elements are sections if possible, and node if no section associated my @elements = (); while (@elements_list) { my $element = shift @elements_list; if ($element->{'node'}) { if (!defined($element->{'with_section'})) { $element->{'toc_level'} = $MIN_LEVEL if (!defined($element->{'toc_level'})); print STDERR "# new node element ($element) $element->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); push @elements, $element; } } else { print STDERR "# new section element ($element) $element->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); push @elements, $element; } } @elements_list = @elements; } foreach my $element (@elements_list) { $element->{'element'} = 1; } # nodes are attached to the section preceding them if not allready # associated with a section print STDERR "# Find the section associated with each node\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); my $current_section = $sections_list[0]; $current_section = $node_top if ($node_top and $node_top->{'as_section'} and !$section_before_top); my $current; foreach my $element (@all_elements) { if ($element->{'node'} and !$element->{'as_section'}) { if ($element->{'with_section'}) { # the node is associated with a section $element->{'section_ref'} = $element->{'with_section'}; push @{$element->{'section_ref'}->{'nodes'}}, $element; } elsif (defined($current_section)) { $current_section = $section_after_top if ($current_section->{'node'} and $section_after_top); $element->{'in_top'} = 1 if ($current_section->{'top'}); $element->{'section_ref'} = $current_section; # nodes are considered sub elements for the purprose of # reparenting and their element_next and element_prev # are next and prev node associated with the same section $element->{'element_up'} = $current_section; $element->{'toc_level'} = $current_section->{'toc_level'}; if (defined($current)) { $current->{'element_next'} = $element; $element->{'element_prev'} = $current; } $current = $element; push @{$element->{'section_ref'}->{'nodes'}}, $element; } else { $element->{'toc_level'} = $MIN_LEVEL; } } else { $current = undef; $current_section = $element; if ($element->{'node'}) { # Top node $element->{'toc_level'} = $MIN_LEVEL; push @{$element->{'section_ref'}->{'nodes'}}, $element; } } } print STDERR "# Complete nodes next prev and up based on menus and sections\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); foreach my $node (@nodes_list) { if (!$node->{'first'} and !$node->{'top'} and !$node->{'menu_up'} and ($node->{'texi'} !~ /^top$/i) and $Texi2HTML::Config::SHOW_MENU) { warn "$WARN `$node->{'texi'}' doesn't appear in menus\n"; } # use values deduced from menus to complete missing up, next, prev # or from sectionning commands if automatic sectionning if ($node->{'node_up'}) { $node->{'up'} = $node->{'node_up'}; } elsif ($node->{'automatic_directions'} and $node->{'section_ref'} and defined($node->{'section_ref'}->{'up'})) { $node->{'up'} = get_node($node->{'section_ref'}->{'up'}); } elsif ($node->{'menu_up'}) { $node->{'up'} = $node->{'menu_up'}; } if ($node->{'up'} and !$node->{'up'}->{'external_node'}) { # We detect when the up node has no menu entry for that node, as # there may be infinite loops when finding following node (see below) unless (defined($node->{'menu_up_hash'}) and ($node->{'menu_up_hash'}->{$node->{'up'}->{'texi'}})) { print STDERR "$WARN `$node->{'up'}->{'texi'}' is up for `$node->{'texi'}', but has no menu entry for this node\n" if ($Texi2HTML::Config::SHOW_MENU); push @{$node->{'up_not_in_menu'}}, $node->{'up'}->{'texi'}; } } # Find next node if ($node->{'node_next'}) { $node->{'next'} = $node->{'node_next'}; } elsif ($node->{'texi'} eq 'Top') { # special case as said in the texinfo manual $node->{'next'} = $node->{'menu_child'} if ($node->{'menu_child'}); } elsif ($node->{'automatic_directions'}) { if (defined($node->{'section_ref'})) { my $next; my $section = $node->{'section_ref'}; if (defined($section->{'next'})) { $next = get_node($section->{'next'}) } else { while (defined($section->{'up'}) and !defined($section->{'next'})) { $section = $section->{'up'}; } if (defined($section->{'next'})) { $next = get_node($section->{'next'}); } } $node->{'next'} = $next; } } if (!defined($node->{'next'}) and $node->{'menu_next'}) { $node->{'next'} = $node->{'menu_next'}; } # Find prev node if ($node->{'node_prev'}) { $node->{'prev'} = $node->{'node_prev'}; } elsif ($node->{'automatic_directions'}) { if (defined($node->{'section_ref'})) { my $section = $node->{'section_ref'}; if (defined($section->{'section_prev'})) { $node->{'prev'} = get_node($section->{'section_prev'}); } elsif (defined($section->{'up'})) { $node->{'prev'} = get_node($section->{'up'}); } } } # next we try menus. makeinfo don't do that if (!defined($node->{'prev'}) and $node->{'menu_prev'}) { $node->{'prev'} = $node->{'menu_prev'}; } # the prev node is the parent node elsif (!defined($node->{'prev'}) and $node->{'menu_up'}) { $node->{'prev'} = $node->{'menu_up'}; } # the following node is the node following in node reading order # it is thus first the child, else the next, else the next following # the up if ($node->{'menu_child'}) { $node->{'following'} = $node->{'menu_child'}; } elsif ($node->{'automatic_directions'} and defined($node->{'section_ref'}) and defined($node->{'section_ref'}->{'child'})) { $node->{'following'} = get_node ($node->{'section_ref'}->{'child'}); } elsif (defined($node->{'next'})) { $node->{'following'} = $node->{'next'}; } else { my $up = $node->{'up'}; # in order to avoid infinite recursion in case the up node is the # node itself we use the up node as following when there isn't # a correct menu structure, here and also below. $node->{'following'} = $up if (defined($up) and grep {$_ eq $up->{'texi'}} @{$node->{'up_not_in_menu'}}); while ((!defined($node->{'following'})) and (defined($up))) { if (($node_top) and ($up eq $node_top)) { # if we are at Top, Top is following $node->{'following'} = $node_top; $up = undef; } if (defined($up->{'next'})) { $node->{'following'} = $up->{'next'}; } elsif (defined($up->{'up'})) { if (! grep { $_ eq $up->{'up'}->{'texi'} } @{$node->{'up_not_in_menu'}}) { $up = $up->{'up'}; } else { # in that case we can go into a infinite loop $node->{'following'} = $up->{'up'}; } } else { $up = undef; } } } } # find first and last elements before we split indices # FIXME Is it right for the last element ? Or should it be the last # with indices taken into account ? $element_first = $elements_list[0]; print STDERR "# element first: $element_first->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); print STDERR "# top node: $node_top->{'texi'}\n" if (defined($node_top) and ($T2H_DEBUG & $DEBUG_ELEMENTS)); # If there is no @top section no top node the first node is the top element $element_top = $node_top if (!defined($element_top) and defined($node_top)); $element_top = $element_first unless (defined($element_top)); $element_top->{'top'} = 1 if ($element_top->{'node'}); $element_last = $elements_list[-1]; print STDERR "# element top: $element_top->{'texi'}\n" if ($element_top and ($T2H_DEBUG & $DEBUG_ELEMENTS)); print STDERR "# find forward and back\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); my $prev; foreach my $element (@elements_list) { # complete the up for toplevel elements if ($element->{'toplevel'} and !defined($element->{'up'}) and $element ne $element_top) { $element->{'up'} = $element_top; } # The childs are element which should be reparented in cas a chapter # is split by an index push @{$element->{'element_up'}->{'childs'}}, $element if (defined($element->{'element_up'})); if ($prev) { $element->{'back'} = $prev; $prev->{'forward'} = $element; $prev = $element; } else { $prev = $element; } # If the element is not a node, then all the node directions are copied # if there is an associated node if (defined($element->{'node_ref'})) { $element->{'nodenext'} = $element->{'node_ref'}->{'next'}; $element->{'nodeprev'} = $element->{'node_ref'}->{'prev'}; $element->{'menu_next'} = $element->{'node_ref'}->{'menu_next'}; $element->{'menu_prev'} = $element->{'node_ref'}->{'menu_prev'}; $element->{'menu_child'} = $element->{'node_ref'}->{'menu_child'}; $element->{'menu_up'} = $element->{'node_ref'}->{'menu_up'}; $element->{'nodeup'} = $element->{'node_ref'}->{'up'}; $element->{'following'} = $element->{'node_ref'}->{'following'}; } elsif (! $element->{'node'}) { # the section has no node associated. Find the node directions using # sections if (defined($element->{'next'})) { $element->{'nodenext'} = get_node($element->{'next'}); } if (defined($element->{'section_prev'})) { $element->{'nodeprev'} = get_node($element->{'section_prev'}); } if (defined($element->{'up'})) { $element->{'nodeup'} = get_node($element->{'up'}); } if ($element->{'child'}) { $element->{'following'} = get_node($element->{'child'}); } elsif ($element->{'next'}) { $element->{'following'} = get_node($element->{'next'}); } elsif ($element->{'up'}) { my $up = $element; while ($up->{'up'} and !$element->{'following'}) { $up = $up->{'up'}; if ($up->{'next_section'}) { $element->{'following'} = get_node ($up->{'next_section'}); } } } } if ($element->{'node'}) { $element->{'nodeup'} = $element->{'up'}; $element->{'nodeprev'} = $element->{'prev'}; $element->{'nodenext'} = $element->{'next'}; } } my @new_elements = (); print STDERR "# preparing indices\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); while(@elements_list) { my $element = shift @elements_list; # @checked_elements are the elements included in the $element (including # itself) and are searched for indices my @checked_elements = (); if (!$element->{'node'} or $element->{'as_section'}) { if (!$Texi2HTML::Config::USE_NODES) { foreach my $node (@{$element->{'nodes'}}) { # we update the element index, first element with index # if it is a node $element_index = $element if ($element_index and ($node eq $element_index)); push @checked_elements, $node; # we push the section itself after the corresponding node if (defined($element->{'node_ref'}) and ($node eq $element->{'node_ref'})) { push @checked_elements, $element; } } if (!defined($element->{'node_ref'}) and !$element->{'node'}) { push @checked_elements, $element; } $element->{'nodes'} = []; # We reset the element nodes list # as the nodes may be associated below to another element if # the element is split accross several other elements/pages } else { if ($element->{'node_ref'}) { push @checked_elements, $element->{'node_ref'}; $element_index = $element if ($element_index and ($element->{'node_ref'} eq $element_index)); } push @checked_elements, $element; $element->{'nodes'} = []; } } else { push @checked_elements, $element; } my $checked_nodes = ''; foreach my $checked (@checked_elements) { $checked_nodes .= "$checked->{'texi'}, "; } print STDERR "# Elements checked for $element->{'texi'}: $checked_nodes\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); # current_element is the last element holding text my $current_element = { 'holder' => 1, 'texi' => 'HOLDER', 'place' => [], 'indices' => [] }; # back is sed to find back and forward my $back = $element->{'back'} if defined($element->{'back'}); # forward is sed to find forward of the last inserted element my $forward = $element->{'forward'}; my $element_next = $element->{'element_next'}; my $index_num = 0; my @waiting_elements = (); # elements (nodes) not used for sectionning # waiting to be associated with an element foreach my $checked_element(@checked_elements) { if ($checked_element->{'element'}) { # this is the element, we must add it push @new_elements, $checked_element; if ($current_element->{'holder'}) { # no previous element added push @{$checked_element->{'place'}}, @{$current_element->{'place'}}; foreach my $index(@{$current_element->{'indices'}}) { push @{$checked_element->{'indices'}}, [ { 'element' => $checked_element, 'page' => $index->[0]->{'page'}, 'name' => $index->[0]->{'name'} } ] ; } } else { if ($checked_element->{'toplevel'}) # there was an index_page added, this index_page is toplevel. # it begun a new chapter. The element next for this # index page (current_element) is the checked_element { $current_element->{'element_next'} = $checked_element; } $current_element->{'next'} = $checked_element; $current_element->{'following'} = $checked_element; $checked_element->{'prev'} = $current_element; } $current_element = $checked_element; $checked_element->{'back'} = $back; $back->{'forward'} = $checked_element if (defined($back)); $back = $checked_element; push @{$checked_element->{'nodes'}}, @waiting_elements; my $waiting_element; while (@waiting_elements) { $waiting_element = shift @waiting_elements; $waiting_element->{'section_ref'} = $checked_element; } } elsif ($current_element->{'holder'}) { push @waiting_elements, $checked_element; } else { push @{$current_element->{'nodes'}}, $checked_element; $checked_element->{'section_ref'} = $current_element; } push @{$current_element->{'place'}}, @{$checked_element->{'current_place'}}; foreach my $index (@{$checked_element->{'index_names'}}) { print STDERR "# Index in `$checked_element->{'texi'}': $index->{'name'}. Current is `$current_element->{'texi'}'\n" if ($T2H_DEBUG & $DEBUG_INDEX); my ($Pages, $Entries) = get_index($index->{'name'}); if (defined($Pages)) { my @pages = @$Pages; my $first_page = shift @pages; # begin debug section my $back_texi = 'NO_BACK'; $back_texi = $back->{'texi'} if (defined($back)); print STDERR "# New index first page (back `$back_texi', current `$current_element->{'texi'}')\n" if ($T2H_DEBUG & $DEBUG_INDEX); # end debug section push @{$current_element->{'indices'}}, [ {'element' => $current_element, 'page' => $first_page, 'name' => $index->{'name'} } ]; if (@pages) { if ($current_element->{'holder'}) { # the current element isn't a real element. # We add the real element # we are in a node of a section but the element # is splitted by the index, thus we must add # a new element which will contain the text # between the beginning of the element and the index push @new_elements, $checked_element; print STDERR "# Add element `$element->{'texi'}' before index page\n" if ($T2H_DEBUG & $DEBUG_INDEX); $checked_element->{'element'} = 1; $checked_element->{'level'} = $element->{'level'}; $checked_element->{'toc_level'} = $element->{'toc_level'}; $checked_element->{'toplevel'} = $element->{'toplevel'}; $checked_element->{'up'} = $element->{'up'}; $checked_element->{'element_added'} = 1; print STDERR "Bug: checked element wasn't seen" if (!$checked_element->{'seen'}); delete $checked_element->{'with_section'}; if ($checked_element->{'toplevel'}) { $element->{'element_prev'}->{'element_next'} = $checked_element if (exists($element->{'element_prev'})); } push @{$checked_element->{'place'}}, @{$current_element->{'place'}}; foreach my $index(@{$current_element->{'indices'}}) { push @{$checked_element->{'indices'}}, [ { 'element' => $checked_element, 'page' => $index->[0]->{'page'}, 'name' => $index->[0]->{'name'} } ] ; } push @{$checked_element->{'nodes'}}, @waiting_elements; my $waiting_element; while (@waiting_elements) { $waiting_element = shift @waiting_elements; $waiting_element->{'section_ref'} = $checked_element; } $checked_element->{'back'} = $back; $back->{'forward'} = $checked_element if (defined($back)); $current_element = $checked_element; $back = $checked_element; } my $index_page; while(@pages) { print STDERR "# New page (back `$back->{'texi'}', current `$current_element->{'texi'}')\n" if ($T2H_DEBUG & $DEBUG_INDEX); $index_num++; my $page = shift @pages; $index_page = { 'index_page' => 1, 'texi' => "$element->{'texi'} index $index->{'name'} page $index_num", 'level' => $element->{'level'}, 'tag' => $element->{'tag'}, 'tag_level' => $element->{'tag_level'}, 'toplevel' => $element->{'toplevel'}, 'up' => $element->{'up'}, 'element_up' => $element->{'element_up'}, 'element_next' => $element_next, 'element_ref' => $element, 'back' => $back, 'prev' => $back, 'next' => $current_element->{'next'}, 'following' => $current_element->{'following'}, 'nodeup' => $current_element->{'nodeup'}, 'nodenext' => $current_element->{'nodenext'}, 'nodeprev' => $back, 'place' => [], 'seen' => 1, 'page' => $page }; $index_page->{'node'} = 1 if ($element->{'node'}); while ($nodes{$index_page->{'texi'}}) { $nodes{$index_page->{'texi'}} .= ' '; } $nodes{$index_page->{'texi'}} = $index_page; push @{$current_element->{'indices'}->[-1]}, {'element' => $index_page, 'page' => $page, 'name' => $index->{'name'} }; push @new_elements, $index_page; $back->{'forward'} = $index_page; $back->{'next'} = $index_page; $back->{'nodenext'} = $index_page; $back->{'element_next'} = $index_page unless ($back->{'top'}); $back->{'following'} = $index_page; $back = $index_page; $index_page->{'toplevel'} = 1 if ($element->{'top'}); } $current_element = $index_page; } } else { print STDERR "# Empty index: $index->{'name'}\n" if ($T2H_DEBUG & $DEBUG_INDEX); $empty_indices{$index->{'name'}} = 1; } push @{$current_element->{'place'}}, @{$index->{'place'}}; } } if ($forward and ($current_element ne $element)) { $current_element->{'forward'} = $forward; $forward->{'back'} = $current_element; } next if ($current_element eq $element or !$current_element->{'toplevel'}); # reparent the elements below $element, following element # and following parent of element to the last index page print STDERR "# Reparent `$element->{'texi'}':\n" if ($T2H_DEBUG & $DEBUG_INDEX); my @reparented_elements = (); @reparented_elements = (@{$element->{'childs'}}) if (defined($element->{'childs'})); push @reparented_elements, $element->{'element_next'} if (defined($element->{'element_next'})); foreach my $reparented(@reparented_elements) { next if ($reparented->{'toplevel'}); $reparented->{'element_up'} = $current_element; print STDERR " reparented: $reparented->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_INDEX); } } @elements_list = @new_elements; print STDERR "# find fastback and fastforward\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); foreach my $element (@elements_list) { my $up = get_top($element); next unless (defined($up)); $element_chapter_index = $up if ($element_index and ($element_index eq $element)); #print STDERR "$element->{'texi'} (top: $element->{'top'}, toplevel: $element->{'toplevel'}, $element->{'element_up'}, $element->{'element_up'}->{'texi'}): up: $up, $up->{'texi'}\n"; # fastforward is the next element on same level than the upper parent # element $element->{'fastforward'} = $up->{'element_next'} if (exists ($up->{'element_next'})); # if the element isn't at the highest level, fastback is the # highest parent element if ($up and ($up ne $element)) { $element->{'fastback'} = $up; } elsif ($element->{'toplevel'}) { # the element is a top level element, we adjust the next # toplevel element fastback $element->{'fastforward'}->{'fastback'} = $element if ($element->{'fastforward'}); } } my $index_nr = 0; # convert directions in direction with first letter in all caps, to be # consistent with the convention used in the .init file. # find id for nodes and indices foreach my $element (@elements_list) { $element->{'this'} = $element; foreach my $direction (('Up', 'Forward', 'Back', 'Next', 'Prev', 'FastForward', 'FastBack', 'This', 'NodeUp', 'NodePrev', 'NodeNext', 'Following' )) { my $direction_no_caps = $direction; $direction_no_caps =~ tr/A-Z/a-z/; $element->{$direction} = $element->{$direction_no_caps}; } if ($element->{'index_page'}) { $element->{'id'} = "INDEX" . $index_nr; $index_nr++; } } my $node_nr = 1; foreach my $node (@nodes_list) { $node->{'id'} = 'NOD' . $node_nr; $node_nr++; # debug check print STDERR "Bug: level defined for node `$node->{'texi'}'\n" if (defined($node->{'level'}) and !$node->{'element_added'}); } # Find cross manual links as explained on the texinfo mailing list cross_manual_links(\%nodes, \%cross_reference_nodes); foreach my $float (@floats) { $float->{'id'} = cross_manual_line (normalise_node($float->{'texi'})); $float->{'style_id'} = cross_manual_line (normalise_space($float->{'style_texi'})); my $float_style = { }; if (exists($floats{$float->{'style_id'}})) { $float_style = $floats{$float->{'style_id'}}; } else { $floats{$float->{'style_id'}} = $float_style; } push @{$float_style->{'floats'}}, $float; $float->{'absolute_nr'} = scalar(@{$float_style->{'floats'}}); my $up = get_top($float->{'element'}); if (!defined($float_style->{'current_chapter'}) or ($up->{'texi'} ne $float_style->{'current_chapter'})) { $float_style->{'current_chapter'} = $up->{'texi'}; $float_style->{'nr_in_chapter'} = 1; } else { $float_style->{'nr_in_chapter'}++; } if ($up->{'number'} ne '') { $float->{'chapter_nr'} = $up->{'number'}; $float->{'nr'} = $float->{'chapter_nr'} . $float_style->{'nr_in_chapter'}; } else { $float->{'nr'} = $float->{'absolute_nr'}; } } if ($Texi2HTML::Config::NEW_CROSSREF_STYLE) { # FIXME allready done for floats? foreach my $key (keys(%nodes)) { my $node = $nodes{$key}; next if ($node->{'external_node'} or $node->{'index_page'}); $node->{'id'} = node_to_id($node->{'cross_manual_target'}); } } # Find node file names if ($Texi2HTML::Config::NODE_FILES) { my $top; if ($node_top) { $top = $node_top; } elsif ($element_top->{'node_ref'}) { $top = $element_top->{'node_ref'}; } else { $top = $node_first; } if ($top) { my $file = "$Texi2HTML::Config::TOP_NODE_FILE.$Texi2HTML::Config::NODE_FILE_EXTENSION"; $top->{'file'} = $file if ($Texi2HTML::Config::SPLIT eq 'node'); $top->{'node_file'} = $file; } foreach my $key (keys(%nodes)) { my $node = $nodes{$key}; my ($file, $node_file); ($file, $node_file) = &$Texi2HTML::Config::node_file_name ($node); $node->{'file'} = $file if (defined($file)); $node->{'node_file'} = $node_file if (defined($node_file)); # next if ($node->{'external_node'} or $node->{'index_page'}); # if (defined($Texi2HTML::Config::node_file_name)) # { # ($node->{'file'}, $node->{'node_file'}) = # &$Texi2HTML::Config::node_file_name ($node); # } # else # { # next if (defined($node->{'file'})); # my $name = remove_texi($node->{'texi'}); # $name =~ s/[^\w\.\-]/-/g; # my $file = "${name}.$Texi2HTML::Config::NODE_FILE_EXTENSION"; # $node->{'file'} = $file if (($Texi2HTML::Config::SPLIT eq 'node') and ($Texi2HTML::Config::USE_NODES or $node->{'with_section'})); # $node->{'node_file'} = $file; # } } } # find document nr and document file for sections and nodes. # Split according to Texi2HTML::Config::SPLIT. # find file and id for placed elements (anchors, index entries, headings) if ($Texi2HTML::Config::SPLIT) { my $cut_section = $toplevel; my $doc_nr = -1; if ($Texi2HTML::Config::SPLIT eq 'section') { $cut_section = 2 if ($toplevel <= 2); } my $top_doc_nr; my $prev_nr; foreach my $element (@elements_list) { print STDERR "# Splitting ($Texi2HTML::Config::SPLIT) $element->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); $doc_nr++ if ( ($Texi2HTML::Config::SPLIT eq 'node') or ( (!$element->{'node'} or $element->{'element_added'}) and ($element->{'level'} <= $cut_section) ) ); $doc_nr = 0 if ($doc_nr < 0); # happens if first elements are nodes $element->{'doc_nr'} = $doc_nr; if ($Texi2HTML::Config::NODE_FILES and ($Texi2HTML::Config::SPLIT eq 'node')) { my $node = get_node($element); if ($node and $node->{'file'}) { $element->{'file'} = $node->{'file'}; } unless ($element->{'file'}) { $element->{'file'} = "${docu_name}_$doc_nr.$docu_ext"; $element->{'doc_nr'} = $doc_nr; } } else { $element->{'file'} = "${docu_name}_$doc_nr.$docu_ext"; my $is_top = 0; if (defined($top_doc_nr)) { if ($doc_nr eq $top_doc_nr) { $element->{'file'} = "$docu_top"; if ($element->{'level'} # this is an element below @top. # It starts a new file. or ($element->{'node'} and ($element ne $node_top) and (!defined($element->{'section_ref'}) or $element->{'section_ref'} ne $element_top)) )# this is a node not associated with top { $doc_nr++; $element->{'doc_nr'} = $doc_nr; $element->{'file'} = "${docu_name}_$doc_nr.$docu_ext"; } } } elsif ($element eq $element_top or (defined($element->{'section_ref'}) and $element->{'section_ref'} eq $element_top) or (defined($element->{'node_ref'}) and !$element->{'node_ref'}->{'element_added'} and $element->{'node_ref'} eq $element_top)) { # the top element $is_top = 1; $element->{'file'} = "$docu_top"; # if there is a previous element, we force it to be in # another file than top $doc_nr++ if (defined($prev_nr) and $doc_nr == $prev_nr); $top_doc_nr = $doc_nr; $element->{'doc_nr'} = $doc_nr; } if (defined($Texi2HTML::Config::element_file_name)) { $element->{'file'} = &$Texi2HTML::Config::element_file_name ($element, $is_top, $docu_name); } } add_file($element->{'file'}); $prev_nr = $doc_nr; foreach my $place(@{$element->{'place'}}) { $place->{'file'} = $element->{'file'}; $place->{'id'} = $element->{'id'} unless defined($place->{'id'}); } if ($element->{'nodes'}) { foreach my $node (@{$element->{'nodes'}}) { $node->{'doc_nr'} = $element->{'doc_nr'}; $node->{'file'} = $element->{'file'}; } } elsif ($element->{'node_ref'} and !$element->{'node_ref'}->{'element_added'}) { $element->{'node_ref'}->{'doc_nr'} = $element->{'doc_nr'} ; $element->{'node_ref'}->{'file'} = $element->{'file'}; } } } else { add_file($docu_doc); foreach my $element(@elements_list) { #die "$ERROR monolithic file and a node have the same file name $docu_doc\n" if ($Texi2HTML::Config::NODE_FILES and $files{$docu_doc}); $element->{'file'} = "$docu_doc"; $element->{'doc_nr'} = 0; foreach my $place(@{$element->{'place'}}) { $place->{'file'} = "$element->{'file'}"; $place->{'id'} = $element->{'id'} unless defined($place->{'id'}); } } foreach my $node(@nodes_list) { $node->{'file'} = "$docu_doc"; $node->{'doc_nr'} = 0; } } # correct the id and file for the things placed in footnotes foreach my $place(@{$footnote_element->{'place'}}) { $place->{'file'} = $footnote_element->{'file'}; $place->{'id'} = $footnote_element->{'id'} unless defined($place->{'id'}); } foreach my $file (keys(%files)) { last unless ($T2H_DEBUG & $DEBUG_ELEMENTS); print STDERR "$file: $files{$file}->{'counter'}\n"; } foreach my $element ((@elements_list, $footnote_element)) { last unless ($T2H_DEBUG & $DEBUG_ELEMENTS); my $is_toplevel = 'not top'; $is_toplevel = 'top' if ($element->{'toplevel'}); print STDERR "$element "; if ($element->{'index_page'}) { print STDERR "index($element->{'id'}, $is_toplevel, doc_nr $element->{'doc_nr'}($element->{'file'})): $element->{'texi'}\n"; } elsif ($element->{'node'}) { my $added = ''; $added = 'added, ' if ($element->{'element_added'}); print STDERR "node($element->{'id'}, toc_level $element->{'toc_level'}, $is_toplevel, ${added}doc_nr $element->{'doc_nr'}($element->{'file'})) $element->{'texi'}:\n"; print STDERR " section_ref: $element->{'section_ref'}->{'texi'}\n" if (defined($element->{'section_ref'})); } elsif ($element->{'footnote'}) { print STDERR "footnotes($element->{'id'}, file $element->{'file'})\n"; } else { my $number = "UNNUMBERED"; $number = $element->{'number'} if ($element->{'number'}); print STDERR "$number ($element->{'id'}, $is_toplevel, level $element->{'level'}-$element->{'toc_level'}, doc_nr $element->{'doc_nr'}($element->{'file'})) $element->{'texi'}:\n"; print STDERR " node_ref: $element->{'node_ref'}->{'texi'}\n" if (defined($element->{'node_ref'})); } if (!$element->{'footnote'}) { if (!defined($files{$element->{'file'}})) { die "Bug: files{\$element->{'file'}} undef element $element->{'texi'}, file $element->{'file'}."; } print STDERR " file: $element->{'file'} $files{$element->{'file'}}, counter $files{$element->{'file'}}->{'counter'}\n"; } print STDERR " TOP($toplevel) " if ($element->{'top'}); print STDERR " u: $element->{'up'}->{'texi'}\n" if (defined($element->{'up'})); print STDERR " ch: $element->{'child'}->{'texi'}\n" if (defined($element->{'child'})); print STDERR " fb: $element->{'fastback'}->{'texi'}\n" if (defined($element->{'fastback'})); print STDERR " b: $element->{'back'}->{'texi'}\n" if (defined($element->{'back'})); print STDERR " p: $element->{'prev'}->{'texi'}\n" if (defined($element->{'prev'})); print STDERR " n: $element->{'next'}->{'texi'}\n" if (defined($element->{'next'})); print STDERR " n_u: $element->{'nodeup'}->{'texi'}\n" if (defined($element->{'nodeup'})); print STDERR " f: $element->{'forward'}->{'texi'}\n" if (defined($element->{'forward'})); print STDERR " follow: $element->{'following'}->{'texi'}\n" if (defined($element->{'following'})); print STDERR " m_p: $element->{'menu_prev'}->{'texi'}\n" if (defined($element->{'menu_prev'})); print STDERR " m_n: $element->{'menu_next'}->{'texi'}\n" if (defined($element->{'menu_next'})); print STDERR " m_u: $element->{'menu_up'}->{'texi'}\n" if (defined($element->{'menu_up'})); print STDERR " m_ch: $element->{'menu_child'}->{'texi'}\n" if (defined($element->{'menu_child'})); print STDERR " u_e: $element->{'element_up'}->{'texi'}\n" if (defined($element->{'element_up'})); print STDERR " n_e: $element->{'element_next'}->{'texi'}\n" if (defined($element->{'element_next'})); print STDERR " ff: $element->{'fastforward'}->{'texi'}\n" if (defined($element->{'fastforward'})); if (defined($element->{'menu_up_hash'})) { print STDERR " parent nodes:\n"; foreach my $menu_up (keys%{$element->{'menu_up_hash'}}) { print STDERR " $menu_up ($element->{'menu_up_hash'}->{$menu_up})\n"; } } if (defined($element->{'nodes'})) { print STDERR " nodes: $element->{'nodes'} (@{$element->{'nodes'}})\n"; foreach my $node (@{$element->{'nodes'}}) { my $beginning = " "; $beginning = " *" if ($node->{'with_section'}); my $file = $node->{'file'}; $file = "file undef" if (! defined($node->{'file'})); print STDERR "${beginning}$node->{'texi'} $file\n"; } } print STDERR " places: $element->{'place'}\n"; foreach my $place(@{$element->{'place'}}) { if (!$place->{'entry'} and !$place->{'float'} and !$place->{'texi'}) { print STDERR "BUG: unknown placed stuff ========\n"; foreach my $key (keys(%$place)) { print STDERR "$key: $place->{$key}\n"; } print STDERR "==================================\n"; } elsif ($place->{'entry'}) { print STDERR " index($place): $place->{'entry'}\n"; } elsif ($place->{'anchor'}) { print STDERR " anchor: $place->{'texi'}\n"; } elsif ($place->{'float'}) { if (defined($place->{'texi'})) { print STDERR " float($place): $place->{'texi'}\n"; } else { print STDERR " float($place): NO LABEL\n"; } } else { print STDERR " heading: $place->{'texi'}\n"; } } if ($element->{'indices'}) { print STDERR " indices: $element->{'indices'}\n"; foreach my $index(@{$element->{'indices'}}) { print STDERR " $index: "; foreach my $page (@$index) { print STDERR "'$page->{'element'}->{'texi'}'($page->{'name'}): $page->{'page'} "; } print STDERR "\n"; } } } } sub add_file($) { my $file = shift; if ($files{$file}) { $files{$file}->{'counter'}++; } else { $files{$file} = { #'type' => 'section', 'counter' => 1 }; } } # find parent element which is a top element, or a node within the top section sub get_top($) { my $element = shift; my $up = $element; while (!$up->{'toplevel'} and !$up->{'top'}) { $up = $up->{'element_up'}; if (!defined($up)) { # If there is no section, it is normal not to have toplevel element, # and it is also the case if there is a low level element before # a top level element print STDERR "$WARN no toplevel for $element->{'texi'} (could be normal)\n" if (@sections_list); return undef; } } return $up; } sub get_node($) { my $element = shift; return undef if (!defined($element)); return $element if ($element->{'node'}); return $element->{'node_ref'} if ($element->{'node_ref'} and !$element->{'node_ref'}->{'element_added'}); return $element; } # get the html names from the texi for all elements sub do_names() { # for nodes and anchors we haven't any state defined # This seems right, however, as we don't want @refs or @footnotes # or @anchors within nodes, section commands or anchors. foreach my $node (%nodes) { next if ($nodes{$node}->{'index_page'}); # some nodes are index pages. $nodes{$node}->{'text'} = substitute_line ($nodes{$node}->{'texi'}); $nodes{$node}->{'name'} = $nodes{$node}->{'text'}; $nodes{$node}->{'no_texi'} = &$Texi2HTML::Config::protect_text(remove_texi($nodes{$node}->{'texi'})); $nodes{$node}->{'unformatted'} = unformatted_text (undef, $nodes{$node}->{'texi'}); # FIXME : what to do if $nodes{$node}->{'external_node'} and # $nodes{$node}->{'seen'} } foreach my $number (keys(%sections)) { my $section = $sections{$number}; $section->{'name'} = substitute_line ($section->{'texi'}); $section->{'text'} = $section->{'number'} . " " . $section->{'name'}; $section->{'text'} =~ s/^\s*//; $section->{'no_texi'} = &$Texi2HTML::Config::protect_text($section->{'number'} . " " .remove_texi($section->{'texi'})); $section->{'no_texi'} =~ s/^\s*//; $section->{'unformatted'} = &$Texi2HTML::Config::protect_text($section->{'number'}) . " " .unformatted_text(undef,$section->{'texi'}); $section->{'unformatted'} =~ s/^\s*//; } my $tocnr = 1; foreach my $element (@elements_list) { if (!$element->{'top'} and !$element->{'index_page'}) { $element->{'tocid'} = 'TOC' . $tocnr; $tocnr++; } next if (defined($element->{'text'})); if ($element->{'index_page'}) { my $page = $element->{'page'}; my $sec_name = $element->{'element_ref'}->{'text'}; $element->{'text'} = ($page->{First} ne $page->{Last} ? "$sec_name: $page->{First} -- $page->{Last}" : "$sec_name: $page->{First}"); $sec_name = $element->{'element_ref'}->{'no_texi'}; $element->{'no_texi'} = &$Texi2HTML::Config::protect_text($page->{First} ne $page->{Last} ? "$sec_name: $page->{First} -- $page->{Last}" : "$sec_name: $page->{First}"); $sec_name = $element->{'element_ref'}->{'unformatted'}; $element->{'unformatted'} = $page->{First} ne $page->{Last} ? "$sec_name: " . &$Texi2HTML::Config::protect_text("$page->{First} -- $page->{Last}") : "$sec_name: " . &$Texi2HTML::Config::protect_text("$page->{First}"); } } } @{$Texi2HTML::TOC_LINES} = (); # table of contents @{$Texi2HTML::OVERVIEW} = (); # short table of contents #+++############################################################################ # # # Stuff related to Index generation # # # #---############################################################################ # FIXME what to do with index entries appearing in @copying # @documentdescription and @titlepage sub enter_index_entry($$$$$$) { my $prefix = shift; my $line_nr = shift; my $key = shift; my $place = shift; my $element = shift; my $use_section_id = shift; unless (exists ($index_properties->{$prefix})) { echo_error ("Undefined index command: ${prefix}index", $line_nr); #warn "$ERROR Undefined index command: ${prefix}index\n"; return 0; } if (!exists($element->{'tag'}) and !$element->{'footnote'}) { echo_warn ("Index entry before document: \@${prefix}index $key", $line_nr); } $key =~ s/\s+$//; $key =~ s/^\s*//; my $entry = $key; # The $key is mostly usefull for alphabetical sorting $key = remove_texi($key); return if ($key =~ /^\s*$/); while (exists $index->{$prefix}->{$key}) { $key .= ' '; } my $id = ''; unless ($use_section_id) { $id = 'IDX' . ++$idx_num; } $index->{$prefix}->{$key}->{'entry'} = $entry; $index->{$prefix}->{$key}->{'element'} = $element; $index->{$prefix}->{$key}->{'label'} = $id; $index->{$prefix}->{$key}->{'prefix'} = $prefix; push @$place, $index->{$prefix}->{$key}; print STDERR "# enter ${prefix}index '$key' with id $id ($index->{$prefix}->{$key})\n" if ($T2H_DEBUG & $DEBUG_INDEX); push @index_labels, $index->{$prefix}->{$key}; return $index->{$prefix}->{$key}; } # returns prefix of @?index command associated with 2 letters prefix name # for example returns 'c' for 'cp' sub index_name2prefix { my $name = shift; my $prefix; for $prefix (keys %$index_properties) { return $prefix if ($index_properties->{$prefix}->{'name'} eq $name); } return undef; } # get all the entries (for all the prefixes) in the $normal and $code # references, formatted with @code{code } if it is a $code entry. sub get_index_entries($$) { my $normal = shift; my $code = shift; my $entries = {}; foreach my $prefix (keys %$normal) { for my $key (keys %{$index->{$prefix}}) { $entries->{$key} = $index->{$prefix}->{$key}; } } if (defined($code)) { foreach my $prefix (keys %$code) { unless (exists $normal->{$prefix}) { foreach my $key (keys %{$index->{$prefix}}) { $entries->{$key} = $index->{$prefix}->{$key}; # use @code for code style index entry $entries->{$key}->{'entry'} = "\@code{$entries->{$key}->{entry}}"; } } } } return $entries; } # sort according to cmp if both $a and $b are alphabetical or non alphabetical, # otherwise the alphabetical is ranked first sub by_alpha { if ($a =~ /^[A-Za-z]/) { if ($b =~ /^[A-Za-z]/) { return lc($a) cmp lc($b); } else { return 1; } } elsif ($b =~ /^[A-Za-z]/) { return -1; } else { return lc($a) cmp lc($b); } } # returns an array of index entries pages splitted by letters # each page has the following members: # {First} first letter on that page # {Last} last letter on that page # {Letters} ref on an array with all the letters for that page # {EntriesByLetter} ref on a hash. Each key is a letter, with value # a ref on arrays of index entries begining with this letter sub get_index_pages($) { my $entries = shift; my (@Letters); my ($EntriesByLetter, $Pages, $page) = ({}, [], {}); my @keys = sort by_alpha keys %$entries; # each index entry is placed according to its first letter in # EntriesByLetter for my $key (@keys) { push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key}; } @Letters = sort by_alpha keys %$EntriesByLetter; $Texi2HTML::Config::SPLIT_INDEX = 0 unless $Texi2HTML::Config::SPLIT; if ($Texi2HTML::Config::SPLIT_INDEX and $Texi2HTML::Config::SPLIT_INDEX =~ /^\d+$/) { my $i = 0; my ($prev_letter); for my $letter (@Letters) { if ($i > $Texi2HTML::Config::SPLIT_INDEX) { $page->{Last} = $prev_letter; push @$Pages, $page; $i=0; } if ($i == 0) { $page = {}; $page->{Letters} = []; $page->{EntriesByLetter} = {}; $page->{First} = $letter; } push @{$page->{Letters}}, $letter; $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}]; $i += scalar(@{$EntriesByLetter->{$letter}}); $prev_letter = $letter; } $page->{Last} = $Letters[$#Letters]; push @$Pages, $page; } else { warn "$WARN Bad Texi2HTML::Config::SPLIT_INDEX: $Texi2HTML::Config::SPLIT_INDEX\n" if ($Texi2HTML::Config::SPLIT_INDEX); $page->{First} = $Letters[0]; $page->{Last} = $Letters[$#Letters]; $page->{Letters} = \@Letters; $page->{EntriesByLetter} = $EntriesByLetter; push @$Pages, $page; return $Pages; } return $Pages; } sub get_index($;$) { my $name = shift; my $line_nr = shift; return (@{$indices{$name}}) if ($indices{$name}); my $prefix = index_name2prefix($name); unless ($prefix) { echo_error ("Bad index name: $name", $line_nr); #warn "$ERROR Bad index name: $name\n"; return; } if ($index_properties->{$prefix}->{code}) { $index_properties->{$prefix}->{from_code}->{$prefix} = 1; } else { $index_properties->{$prefix}->{from}->{$prefix}= 1; } my $Entries = get_index_entries($index_properties->{$prefix}->{from}, $index_properties->{$prefix}->{from_code}); return unless %$Entries; my $Pages = get_index_pages($Entries); $indices{$name} = [ $Pages, $Entries ]; return ($Pages, $Entries); } my @foot_lines = (); # footnotes my $copying_comment = ''; # comment constructed from text between # @copying and @end copying with licence my $from_encoding; # texinfo file encoding my $to_encoding; # out file encoding my %acronyms_like = (); # acronyms or similar commands associated texts # the key are the commands, the values are # hash references associating shorthands to # texts. sub initialise_state($) { my $state = shift; $state->{'preformatted'} = 0 unless exists($state->{'preformatted'}); $state->{'code_style'} = 0 unless exists($state->{'code_style'}); $state->{'keep_texi'} = 0 unless exists($state->{'keep_texi'}); $state->{'keep_nr'} = 0 unless exists($state->{'keep_nr'}); $state->{'detailmenu'} = 0 unless exists($state->{'detailmenu'}); # number of opened detailed menus $state->{'format_stack'} = [ {'format' => "noformat"} ] unless exists($state->{'format_stack'}); $state->{'paragraph_style'} = [ '' ] unless exists($state->{'paragraph_style'}); $state->{'preformatted_stack'} = [ '' ] unless exists($state->{'preformatted_stack'}); $state->{'menu'} = 0 unless exists($state->{'menu'}); $state->{'style_stack'} = [] unless exists($state->{'style_stack'}); $state->{'quotation_stack'} = [] unless exists($state->{'quotation_stack'}); # if there is no $state->{'element'} the first element is used $state->{'element'} = $elements_list[0] unless (exists($state->{'element'}) and !$state->{'element'}->{'before_anything'}); } sub pass_text() { my %state; initialise_state (\%state); my @stack; my $text; my $doc_nr; my $in_doc = 0; my $element; my @text =(); my @section_lines = (); my @head_lines = (); my $one_section = 1 if (@elements_list == 1); if (@elements_list == 0) { warn "$WARN empty document\n"; exit (0); } # We set titlefont only if the titlefont appeared in the top element if (defined($element_top->{'titlefont'})) { $element_top->{'has_heading'} = 1; $value{'_titlefont'} = $element_top->{'titlefont'}; } # prepare %Texi2HTML::THISDOC # $Texi2HTML::THISDOC{'settitle_texi'} = $value{'_settitle'}; $Texi2HTML::THISDOC{'fulltitle_texi'} = ''; $Texi2HTML::THISDOC{'title_texi'} = ''; foreach my $possible_fulltitle (('_title', '_settitle', '_shorttitlepage', '_titlefont')) { if ($value{$possible_fulltitle} ne '') { $Texi2HTML::THISDOC{'fulltitle_texi'} = $value{$possible_fulltitle}; last; } } foreach my $possible_title_texi ($value{'_settitle'}, $Texi2HTML::THISDOC{'fulltitle_texi'}) { if ($possible_title_texi ne '') { $Texi2HTML::THISDOC{'title_texi'} = $possible_title_texi; last; } } # $Texi2HTML::THISDOC{'fulltitle_texi'} = $value{'_title'} || $value{'_settitle'} || $value{'_shorttitlepage'} || $value{'_titlefont'}; # $Texi2HTML::THISDOC{'title_texi'} = $value{'_title'} || $value{'_settitle'} || $value{'_shorttitlepage'} || $value{'_titlefont'}; foreach my $texi_cmd (('shorttitlepage', 'settitle', 'author', 'titlefont', 'subtitle', 'shorttitle')) { $Texi2HTML::THISDOC{$texi_cmd . '_texi'} = $value{'_' . $texi_cmd}; } foreach my $doc_thing (('shorttitlepage', 'settitle', 'author', 'titlefont', 'subtitle', 'shorttitle', 'fulltitle', 'title')) { my $thing_texi = $Texi2HTML::THISDOC{$doc_thing . '_texi'}; $Texi2HTML::THISDOC{$doc_thing} = substitute_line($thing_texi); $Texi2HTML::THISDOC{$doc_thing . '_no_texi'} = &$Texi2HTML::Config::protect_text(remove_texi($thing_texi)); $Texi2HTML::THISDOC{$doc_thing . '_unformatted'} = unformatted_text(undef, $thing_texi); } # $Texi2HTML::THISDOC{'shorttitlepage_texi'} = $value{'_shorttitlepage'}; # $Texi2HTML::THISDOC{'fulltitle'} = substitute_line($value{'_title'}) || substitute_line($value{'_settitle'}) || substitute_line($value{'_shorttitlepage'}) || substitute_line($value{'_titlefont'}); # $Texi2HTML::THISDOC{'title'} = substitute_line($value{'_settitle'}) || $Texi2HTML::THISDOC{'fulltitle'}; # $Texi2HTML::THISDOC{'shorttitle'} = substitute_line($value{'_shorttitle'}); # find Top name my $element_top_text = ''; my $top_no_texi = ''; my $top_unformatted = ''; my $top_name; if ($element_top and $element_top->{'text'} and (!$node_top or ($element_top ne $node_top))) { $element_top_text = $element_top->{'text'}; $top_no_texi = $element_top->{'no_texi'}; $top_unformatted = $element_top->{'unformatted'}; } foreach my $possible_top_name ($Texi2HTML::Config::TOP_HEADING, $element_top_text, $Texi2HTML::THISDOC{'title'}, $Texi2HTML::THISDOC{'shorttitle'}, &$I('Top')) { if (defined($possible_top_name) and $possible_top_name ne '') { $top_name = $possible_top_name; last; } } foreach my $possible_top_no_texi ($Texi2HTML::Config::TOP_HEADING, $top_no_texi, $Texi2HTML::THISDOC{'title_no_texi'}, $Texi2HTML::THISDOC{'shorttitle_no_texi'}, &$I('Top',{},{'remove_texi' => 1, 'no_protection' => 1})) { if (defined($possible_top_no_texi) and $possible_top_no_texi ne '') { $top_no_texi = $possible_top_no_texi; last; } } foreach my $possible_top_unformatted ($top_unformatted, $Texi2HTML::THISDOC{'title_unformatted'}, $Texi2HTML::THISDOC{'shorttitle_unformatted'}, &$I('Top',{}, {'unformatted' => 1})) { if (defined($possible_top_unformatted) and $possible_top_unformatted ne '') { $top_unformatted = $possible_top_unformatted; last; } } # my $top_name = $Texi2HTML::Config::TOP_HEADING || $element_top_text || $Texi2HTML::THISDOC{'title'} || $Texi2HTML::THISDOC{'shorttitle'} || &$I('Top'); if ($Texi2HTML::THISDOC{'fulltitle_texi'} eq '') { $Texi2HTML::THISDOC{'fulltitle_texi'} = &$I('Untitled Document',{}, {'keep_texi' => 1}); } $Texi2HTML::THISDOC{'title_texi'} = $Texi2HTML::THISDOC{'settitle_texi'}; $Texi2HTML::THISDOC{'title_texi'} = $Texi2HTML::THISDOC{'fulltitle_texi'} if ($Texi2HTML::THISDOC{'title_texi'} eq ''); foreach my $doc_thing (('fulltitle', 'title')) { my $thing_texi = $Texi2HTML::THISDOC{$doc_thing . '_texi'}; $Texi2HTML::THISDOC{$doc_thing} = substitute_line($thing_texi); $Texi2HTML::THISDOC{$doc_thing . '_no_texi'} = &$Texi2HTML::Config::protect_text(remove_texi($thing_texi)); $Texi2HTML::THISDOC{$doc_thing . '_unformatted'} = unformatted_text(undef, $thing_texi); } # $Texi2HTML::THISDOC{'fulltitle'} = $Texi2HTML::THISDOC{'fulltitle'} || &$I('Untitled Document') ; # $Texi2HTML::THISDOC{'title'} = $Texi2HTML::THISDOC{'settitle'} || $Texi2HTML::THISDOC{'fulltitle'}; # $Texi2HTML::THISDOC{'author'} = substitute_line($value{'_author'}); # $Texi2HTML::THISDOC{'titlefont'} = substitute_line($value{'_titlefont'}); # $Texi2HTML::THISDOC{'subtitle'} = substitute_line($value{'_subtitle'}); # $Texi2HTML::THISDOC{'title_unformatted'} = unformatted_text(undef, $Texi2HTML::THISDOC{'title_texi'}); # $Texi2HTML::THISDOC{'shorttitle_unformatted'} = unformatted_text(undef, $value{'_shorttitle'}); # $Texi2HTML::THISDOC{'title_no_texi'} = &$Texi2HTML::Config::protect_text(remove_texi($value{'_title'})) || &$Texi2HTML::Config::protect_text(remove_texi($value{'_settitle'})) || &$Texi2HTML::Config::protect_text(remove_texi($value{'_shorttitlepage'})) || &$Texi2HTML::Config::protect_text(remove_texi($value{'_titlefont'})); # $Texi2HTML::THISDOC{'shorttitle_no_texi'} = &$Texi2HTML::Config::protect_text(remove_texi($value{'_shorttitle'})); # my $top_no_texi = ''; # my $top_unformatted = ''; # if ($element_top and $element_top->{'no_texi'} and (!$node_top or ($element_top ne $node_top))) # { # $top_no_texi = $element_top->{'no_texi'}; # $top_unformatted = $element_top->{'unformatted'}; # } # $top_no_texi = $Texi2HTML::Config::TOP_HEADING || $top_no_texi || $Texi2HTML::THISDOC{'title_no_texi'} || $Texi2HTML::THISDOC{'shorttitle_no_texi'} || &$I('Top',{}, {'remove_texi' => 1, 'no_protection' => 1}); # $top_unformatted = $top_unformatted || $Texi2HTML::THISDOC{'title_unformatted'} || $Texi2HTML::THISDOC{'shorttitle_unformatted'} || &$I('Top',{}, {'unformatted' => 1}); # $Texi2HTML::THISDOC{'title_unformatted'} = $Texi2HTML::THISDOC{'title_unformatted'} || &$I('Untitled Document',{}, {'unformatted' => 1}); # $Texi2HTML::THISDOC{'title_no_texi'} = $Texi2HTML::THISDOC{'title_no_texi'} || &$I('Untitled Document',{}, {'remove_texi' => 1, 'no_protection' => 1}); for my $key (keys %Texi2HTML::THISDOC) { next if (ref($Texi2HTML::THISDOC{$key})); print STDERR "!!$key\n" if (!defined($Texi2HTML::THISDOC{$key})); $Texi2HTML::THISDOC{$key} =~ s/\s*$//; } $Texi2HTML::THISDOC{'program'} = $THISPROG; $Texi2HTML::THISDOC{'program_homepage'} = $T2H_HOMEPAGE; $Texi2HTML::THISDOC{'program_authors'} = $T2H_AUTHORS; $Texi2HTML::THISDOC{'user'} = $T2H_USER; # $Texi2HTML::THISDOC{'documentdescription'} = $documentdescription; $Texi2HTML::THISDOC{'copying'} = $copying_comment; $Texi2HTML::THISDOC{'toc_file'} = ''; $Texi2HTML::THISDOC{'toc_file'} = $docu_toc if ($Texi2HTML::Config::SPLIT); $Texi2HTML::THISDOC{'file_base_name'} = $docu_name; $Texi2HTML::THISDOC{'destination_directory'} = $docu_rdir; $Texi2HTML::THISDOC{'authors'} = [] if (!defined($Texi2HTML::THISDOC{'authors'})); $Texi2HTML::THISDOC{'subtitles'} = [] if (!defined($Texi2HTML::THISDOC{'subtitles'})); $Texi2HTML::THISDOC{'titles'} = [] if (!defined($Texi2HTML::THISDOC{'titles'})); foreach my $element (('authors', 'subtitles', 'titles')) { my $i; for ($i = 0; $i < $#{$Texi2HTML::THISDOC{$element}} + 1; $i++) { chomp ($Texi2HTML::THISDOC{$element}->[$i]); $Texi2HTML::THISDOC{$element}->[$i] = substitute_line($Texi2HTML::THISDOC{$element}->[$i]); #print STDERR "$element:$i: $Texi2HTML::THISDOC{$element}->[$i]\n"; } } # prepare TOC, OVERVIEW if ($Texi2HTML::Config::SPLIT) { $Texi2HTML::HREF{'Contents'} = $docu_toc.'#SEC_Contents' if @{$Texi2HTML::TOC_LINES}; $Texi2HTML::HREF{'Overview'} = $docu_stoc.'#SEC_Overview' if @{$Texi2HTML::OVERVIEW}; $Texi2HTML::HREF{'Footnotes'} = $docu_foot. '#SEC_Foot'; $Texi2HTML::HREF{'About'} = $docu_about . '#SEC_About' unless $one_section; } else { $Texi2HTML::HREF{'Contents'} = '#SEC_Contents' if @{$Texi2HTML::TOC_LINES}; $Texi2HTML::HREF{'Overview'} = '#SEC_Overview' if @{$Texi2HTML::OVERVIEW}; $Texi2HTML::HREF{'Footnotes'} = '#SEC_Foot'; $Texi2HTML::HREF{'About'} = '#SEC_About' unless $one_section; } %Texi2HTML::NAME = ( 'First', $element_first->{'text'}, 'Last', $element_last->{'text'}, 'About', &$I('About This Document'), 'Contents', &$I('Table of Contents'), 'Overview', &$I('Short Table of Contents'), 'Top', $top_name, 'Footnotes', &$I('Footnotes'), ); $Texi2HTML::NAME{'Index'} = $element_chapter_index->{'text'} if (defined($element_chapter_index)); $Texi2HTML::NAME{'Index'} = $Texi2HTML::Config::INDEX_CHAPTER if ($Texi2HTML::Config::INDEX_CHAPTER ne ''); %Texi2HTML::NO_TEXI = ( 'First', $element_first->{'no_texi'}, 'Last', $element_last->{'no_texi'}, #FIXME this is not really NO_TEXI as there may be some formatting expanded # in &$I, using substitute_line 'About', &$I('About This Document', {}, {'remove_texi' => 1, 'no_protection' => 1} ), 'Contents', &$I('Table of Contents', {}, {'remove_texi' => 1, 'no_protection' => 1} ), 'Overview', &$I('Short Table of Contents', {}, {'remove_texi' => 1, 'no_protection' => 1} ), 'Top', $top_no_texi, 'Footnotes', &$I('Footnotes', {}, {'remove_texi' => 1, 'no_protection' => 1} ), ); $Texi2HTML::NO_TEXI{'Index'} = $element_chapter_index->{'no_texi'} if (defined($element_chapter_index)); %Texi2HTML::UNFORMATTED = ( 'First', $element_first->{'unformatted'}, 'Last', $element_last->{'unformatted'}, #FIXME this is not really UNFORMATTED as there may be some formatting expanded # in &$I, using substitute_line 'About', &$I('About This Document', {}, {'unformatted' => 1}), 'Contents', &$I('Table of Contents',{}, {'unformatted' => 1}), 'Overview', &$I('Short Table of Contents', {}, {'unformatted' => 1}), 'Top', $top_unformatted, 'Footnotes', &$I('Footnotes', {},{'unformatted' => 1}), ); $Texi2HTML::UNFORMATTED{'Index'} = $element_chapter_index->{'unformatted'} if (defined($element_chapter_index)); $Texi2HTML::TITLEPAGE = ''; $Texi2HTML::TITLEPAGE = substitute_text({}, @{$region_lines{'titlepage'}}) if (@{$region_lines{'titlepage'}}); &$Texi2HTML::Config::titlepage(); $to_encoding = &$Texi2HTML::Config::init_out(); ############################################################################ # print frame and frame toc file # if ( $Texi2HTML::Config::FRAMES ) { #open(FILE, "> $docu_frame_file") # || die "$ERROR: Can't open $docu_frame_file for writing: $!\n"; my $FH = open_out($docu_frame_file); print STDERR "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE; &$Texi2HTML::Config::print_frame($FH, $docu_toc_frame_file, $docu_top_file); close_out($FH, $docu_frame_file); #open(FILE, "> $docu_toc_frame_file") # || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n"; $FH = open_out($docu_toc_frame_file); print STDERR "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE; #&$Texi2HTML::Config::print_toc_frame(\*FILE, $Texi2HTML::OVERVIEW); &$Texi2HTML::Config::print_toc_frame($FH, $Texi2HTML::OVERVIEW); #close(FILE); close_out($FH, $docu_toc_frame_file); } ############################################################################ # # my $FH; my $index_pages; my $index_pages_nr; my $index_nr = 0; my $line_nr; my $first_section = 0; # 1 if it is the first section of a page while (@doc_lines) { unless ($index_pages) { # not in a index split over sections $_ = shift @doc_lines; my $chomped_line = $_; if (!chomp($chomped_line) and @doc_lines) { # if the line has no end of line it is concatenated with the next $doc_lines[0] = $_ . $doc_lines[0]; next; } $line_nr = shift (@doc_numbers); #print STDERR "$line_nr->{'file_name'}($line_nr->{'macro'},$line_nr->{'line_nr'}) $_" if ($line_nr); } #print STDERR "PASS_TEXT: $_"; #dump_stack(\$text, \@stack, \%state); if (!$state{'raw'} and !$state{'verb'}) { my $tag = ''; $tag = $1 if (/^\@(\w+)/ and !$index_pages); if (($tag eq 'node') or defined($sec2level{$tag}) or $index_pages) { if (@stack or (defined($text) and $text ne '')) {# in pass text node and section shouldn't appear in formats #print STDERR "close_stack before \@$tag\n"; #print STDERR "text!$text%" if (! @stack); close_stack(\$text, \@stack, \%state, $line_nr); push @section_lines, $text; $text = ''; } $sec_num++ if ($sec2level{$tag}); my $new_element; my $current_element; if ($tag =~ /heading/) {# handle headings, they are not in element lists $current_element = $sections{$sec_num}; #print STDERR "HEADING $_"; if (! $element) { $new_element = shift @elements_list; $element->{'has_heading'} = 1 if ($new_element->{'top'}); } else { if ($element->{'top'}) { $element->{'has_heading'} = 1; } push (@section_lines, &$Texi2HTML::Config::anchor($current_element->{'id'}) . "\n"); push @section_lines, &$Texi2HTML::Config::heading($current_element); next; } } elsif (!$index_pages) {# handle node and structuring elements $current_element = shift (@all_elements); #begin debug section if ($current_element->{'node'}) { print STDERR 'NODE ' . "$current_element->{'texi'}($current_element->{'file'})" if ($T2H_DEBUG & $DEBUG_ELEMENTS); print STDERR "($current_element->{'section_ref'}->{'texi'})" if ($current_element->{'section_ref'} and ($T2H_DEBUG & $DEBUG_ELEMENTS)); } else { print STDERR 'SECTION ' . $current_element->{'texi'} if ($T2H_DEBUG & $DEBUG_ELEMENTS); } print STDERR ": $_" if ($T2H_DEBUG & $DEBUG_ELEMENTS); #end debug section # The element begins a new section if there is no previous # or it is an element and not the current one or the # associated section (in case of node) is not the current one if (!$element or ($current_element->{'element'} and ($current_element ne $element)) or ($current_element->{'section_ref'} and ($current_element->{'section_ref'} ne $element))) { $new_element = shift @elements_list; } # begin debugging section my $section_element = $new_element; $section_element = $element unless ($section_element); if (!$current_element->{'node'} and !$current_element->{'index_page'} and ($section_element ne $current_element)) { print STDERR "NODE: $element->{'texi'}\n" if ($element->{'node'}); warn "elements_list and all_elements not in sync (elements $section_element->{'texi'}, all $current_element->{'texi'}): $_"; } # end debugging section } else { # this is a new index section $new_element = $index_pages->[$index_pages_nr]->{'element'}; $current_element = $index_pages->[$index_pages_nr]->{'element'}; print STDERR "New index page '$new_element->{'texi'}' nr: $index_pages_nr\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); my $list_element = shift @elements_list; die "element in index_pages $new_element->{'texi'} and in list $list_element->{'texi'} differs\n" unless ($list_element eq $new_element); } if ($new_element) { $index_nr = 0; my $old = 'NO_OLD'; $old = $element->{'texi'} if (defined($element)); print STDERR "NEW: $new_element->{'texi'}, OLD: $old\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); # FIXME this should be done differently now that there could be elements # associated with the same file if ($element and ($new_element->{'doc_nr'} != $element->{'doc_nr'}) and @foot_lines and !$Texi2HTML::Config::SEPARATED_FOOTNOTES) { # note that this can only happen if $Texi2HTML::Config::SPLIT &$Texi2HTML::Config::foot_section (\@foot_lines); push @section_lines, @foot_lines; @foot_lines = (); $relative_foot_num = 0; } # print the element that just finished $Texi2HTML::THIS_SECTION = \@section_lines; $Texi2HTML::THIS_HEADER = \@head_lines; if ($element) { #$FH = finish_element($FH, $element, $new_element, $first_section); finish_element($FH, $element, $new_element, $first_section); $first_section = 0; @section_lines = (); @head_lines = (); } else { print STDERR "# Writing elements:" if ($T2H_VERBOSE); if ($Texi2HTML::Config::IGNORE_PREAMBLE_TEXT) { @section_lines = (); @head_lines = (); } # remove empty line at the beginning of @section_lines shift @section_lines while (@section_lines and ($section_lines[0] =~ /^\s*$/)); } # begin new element my $previous_file; $previous_file = $element->{'file'} if (defined($element)); $element = $new_element; $state{'element'} = $element; $Texi2HTML::THIS_ELEMENT = $element; #print STDERR "Doing hrefs for $element->{'texi'} First "; $Texi2HTML::HREF{'First'} = href($element_first, $element->{'file'}); #print STDERR "Last "; $Texi2HTML::HREF{'Last'} = href($element_last, $element->{'file'}); #print STDERR "Index "; $Texi2HTML::HREF{'Index'} = href($element_chapter_index, $element->{'file'}) if (defined($element_chapter_index)); #print STDERR "Top "; $Texi2HTML::HREF{'Top'} = href($element_top, $element->{'file'}); foreach my $direction (('Up', 'Forward', 'Back', 'Next', 'Prev', 'FastForward', 'FastBack', 'This', 'NodeUp', 'NodePrev', 'NodeNext', 'Following' )) { my $elem = $element->{$direction}; $Texi2HTML::NODE{$direction} = undef; $Texi2HTML::HREF{$direction} = undef; next unless (defined($elem)); #print STDERR "$direction "; if ($elem->{'node'} or $elem->{'external_node'} or $elem->{'index_page'} or !$elem->{'seen'}) { $Texi2HTML::NODE{$direction} = $elem->{'text'}; } elsif ($elem->{'node_ref'}) { $Texi2HTML::NODE{$direction} = $elem->{'node_ref'}->{'text'}; } if (!$elem->{'seen'}) { $Texi2HTML::HREF{$direction} = do_external_href($elem->{'texi'}); } else { $Texi2HTML::HREF{$direction} = href($elem, $element->{'file'}); } $Texi2HTML::NAME{$direction} = $elem->{'text'}; $Texi2HTML::NO_TEXI{$direction} = $elem->{'no_texi'}; $Texi2HTML::UNFORMATTED{$direction} = $elem->{'unformatted'}; #print STDERR "$direction ($element->{'texi'}): \n NO_TEXI: $Texi2HTML::NO_TEXI{$direction}\n NAME $Texi2HTML::NAME{$direction}\n NODE $Texi2HTML::NODE{$direction}\n HREF $Texi2HTML::HREF{$direction}\n\n"; } #print STDERR "\nDone hrefs for $element->{'texi'}\n"; $files{$element->{'file'}}->{'counter'}--; #if (! defined($FH)) if (!defined($previous_file) or ($element->{'file'} ne $previous_file)) { my $file = $element->{'file'}; print STDERR "\n" if ($T2H_VERBOSE and !$T2H_DEBUG); print STDERR "# Writing to $docu_rdir$file " if $T2H_VERBOSE; my $do_page_head = 0; if ($files{$file}->{'filehandle'}) { $FH = $files{$file}->{'filehandle'}; } else { $FH = open_out("$docu_rdir$file"); $files{$file}->{'filehandle'} = $FH; $do_page_head = 1; } if ($element->{'top'}) { &$Texi2HTML::Config::print_Top_header($FH, $do_page_head); } else { &$Texi2HTML::Config::print_page_head($FH) if ($do_page_head); &$Texi2HTML::Config::print_chapter_header($FH) if $Texi2HTML::Config::SPLIT eq 'chapter'; &$Texi2HTML::Config::print_section_header($FH) if $Texi2HTML::Config::SPLIT eq 'section'; } $first_section = 1; } print STDERR "." if ($T2H_VERBOSE); print STDERR "\n" if ($T2H_DEBUG); } my $label = &$Texi2HTML::Config::anchor($current_element->{'id'}) . "\n"; if (@section_lines) { push (@section_lines, $label); } else { push @head_lines, $label; } if ($index_pages) { push @section_lines, &$Texi2HTML::Config::heading($element); #print STDERR "Do index page $index_pages_nr\n"; my $page = do_index_page($index_pages, $index_pages_nr); push @section_lines, $page; if (defined ($index_pages->[$index_pages_nr + 1])) { $index_pages_nr++; } else { $index_pages = undef; } next; } push @section_lines, &$Texi2HTML::Config::heading($current_element) if ($current_element->{'element'} and !$current_element->{'top'}); next; } elsif ($tag eq 'printindex') { s/\s+(\w+)\s*//; my $name = $1; close_paragraph(\$text, \@stack, \%state); next if (!index_name2prefix($name) or $empty_indices{$name}); $printed_indices{$name} = 1; print STDERR "print index $name($index_nr) in `$element->{'texi'}', element->{'indices'}: $element->{'indices'},\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS or $T2H_DEBUG & $DEBUG_INDEX); print STDERR "element->{'indices'}->[index_nr]: $element->{'indices'}->[$index_nr] (@{$element->{'indices'}->[$index_nr]})\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS or $T2H_DEBUG & $DEBUG_INDEX); $index_pages = $element->{'indices'}->[$index_nr] if (@{$element->{'indices'}->[$index_nr]} > 1); $index_pages_nr = 0; add_prev(\$text, \@stack, do_index_page($element->{'indices'}->[$index_nr], 0)); $index_pages_nr++; $index_nr++; begin_paragraph (\@stack, \%state) if ($state{'preformatted'}); next if (@stack); push @section_lines, $text; $text = ''; next; } elsif ($tag eq 'contents') { next; } } scan_line($_, \$text, \@stack, \%state, $line_nr); #print STDERR "after scan_line: $_"; #dump_stack(\$text, \@stack, \%state); next if (@stack); if ($text ne '' ) { push @section_lines, $text; $text = ''; } } if (@stack) {# close stack at the end of pass text close_stack(\$text, \@stack, \%state, $line_nr); } if (defined($text)) { push @section_lines, $text; } print STDERR "\n" if ($T2H_VERBOSE); $Texi2HTML::THIS_SECTION = \@section_lines; # if no sections, then simply print document as is if ($one_section) { if (@foot_lines) { &$Texi2HTML::Config::foot_section (\@foot_lines); push @section_lines, @foot_lines; } $Texi2HTML::THIS_HEADER = \@head_lines; if ($element->{'top'}) { print STDERR "Bug: `$element->{'texi'}' level undef\n" if (!$element->{'node'} and !defined($element->{'level'})); $element->{'level'} = 1 if (!defined($element->{'level'})); $element->{'node'} = 0; # otherwise Texi2HTML::Config::heading may uses the node level $element->{'text'} = $Texi2HTML::NAME{'Top'}; print STDERR "[Top]" if ($T2H_VERBOSE); unless ($element->{'has_heading'}) { unshift @section_lines, &$Texi2HTML::Config::heading($element); } } print STDERR "# Write the section $element->{'texi'}\n" if ($T2H_VERBOSE); &$Texi2HTML::Config::one_section($FH); close_out($FH); return; } finish_element ($FH, $element, undef, $first_section); ############################################################################ # Print ToC, Overview, Footnotes # for my $direction (('Prev', 'Next', 'Back', 'Forward', 'Up', 'NodeUp', 'NodePrev', 'NodeNext', 'Following', 'This')) { delete $Texi2HTML::HREF{$direction}; # it is better to undef in case the references to these hash entries # are used, as if deleted, the # references are still refering to the old, undeleted element # (we could do both) $Texi2HTML::NAME{$direction} = undef; $Texi2HTML::NO_TEXI{$direction} = undef; $Texi2HTML::UNFORMATTED{$direction} = undef; $Texi2HTML::NODE{$direction} = undef; $Texi2HTML::THIS_ELEMENT = undef; } if (@foot_lines) { print STDERR "# writing Footnotes in $docu_foot_file\n" if $T2H_VERBOSE; #open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n" $FH = open_out ($docu_foot_file) if $Texi2HTML::Config::SPLIT; $Texi2HTML::HREF{'This'} = $Texi2HTML::HREF{'Footnotes'}; $Texi2HTML::HREF{'Footnotes'} = '#' . $footnote_element->{'id'}; $Texi2HTML::NAME{'This'} = $Texi2HTML::NAME{'Footnotes'}; $Texi2HTML::NO_TEXI{'This'} = $Texi2HTML::NO_TEXI{'Footnotes'}; $Texi2HTML::UNFORMATTED{'This'} = $Texi2HTML::UNFORMATTED{'Footnotes'}; $Texi2HTML::THIS_SECTION = \@foot_lines; $Texi2HTML::THIS_HEADER = [ &$Texi2HTML::Config::anchor($footnote_element->{'id'}) . "\n" ]; #&$Texi2HTML::Config::print_Footnotes(\*FILE); &$Texi2HTML::Config::print_Footnotes($FH); #close(FILE) if $Texi2HTML::Config::SPLIT; close_out($FH, $docu_foot_file) #|| die "$ERROR: Error occurred when closing $docu_foot_file: $!\n" if ($Texi2HTML::Config::SPLIT); $Texi2HTML::HREF{'Footnotes'} = $Texi2HTML::HREF{'This'}; } if (@{$Texi2HTML::TOC_LINES}) { print STDERR "# writing Toc in $docu_toc_file\n" if $T2H_VERBOSE; #open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n" $FH = open_out ($docu_toc_file) if $Texi2HTML::Config::SPLIT; $Texi2HTML::HREF{'This'} = $Texi2HTML::HREF{'Contents'}; $Texi2HTML::HREF{'Contents'} = "#SEC_Contents"; $Texi2HTML::NAME{'This'} = $Texi2HTML::NAME{'Contents'}; $Texi2HTML::NO_TEXI{'This'} = $Texi2HTML::NO_TEXI{'Contents'}; $Texi2HTML::UNFORMATTED{'This'} = $Texi2HTML::UNFORMATTED{'Contents'}; $Texi2HTML::THIS_SECTION = $Texi2HTML::TOC_LINES; $Texi2HTML::THIS_HEADER = [ &$Texi2HTML::Config::anchor("SEC_Contents") . "\n" ]; #&$Texi2HTML::Config::print_Toc(\*FILE); #close(FILE) if $Texi2HTML::Config::SPLIT; &$Texi2HTML::Config::print_Toc($FH); close_out($FH, $docu_toc_file) #|| die "$ERROR: Error occurred when closing $docu_toc_file: $!\n" if ($Texi2HTML::Config::SPLIT); $Texi2HTML::HREF{'Contents'} = $Texi2HTML::HREF{'This'}; } if (@{$Texi2HTML::OVERVIEW}) { print STDERR "# writing Overview in $docu_stoc_file\n" if $T2H_VERBOSE; #open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n" $FH = open_out ($docu_stoc_file) if $Texi2HTML::Config::SPLIT; $Texi2HTML::HREF{This} = $Texi2HTML::HREF{Overview}; $Texi2HTML::HREF{Overview} = "#SEC_Overview"; $Texi2HTML::NAME{This} = $Texi2HTML::NAME{Overview}; $Texi2HTML::NO_TEXI{This} = $Texi2HTML::NO_TEXI{Overview}; $Texi2HTML::UNFORMATTED{This} = $Texi2HTML::UNFORMATTED{Overview}; $Texi2HTML::THIS_SECTION = $Texi2HTML::OVERVIEW; $Texi2HTML::THIS_HEADER = [ &$Texi2HTML::Config::anchor("SEC_Overview") . "\n" ]; #&$Texi2HTML::Config::print_Overview(\*FILE); #close(FILE) if $Texi2HTML::Config::SPLIT; &$Texi2HTML::Config::print_Overview($FH); close_out($FH,$docu_stoc_file) #|| die "$ERROR: Error occurred when closing $docu_stoc_file: $!\n" if ($Texi2HTML::Config::SPLIT); $Texi2HTML::HREF{Overview} = $Texi2HTML::HREF{This}; } my $about_body; if ($about_body = &$Texi2HTML::Config::about_body()) { print STDERR "# writing About in $docu_about_file\n" if $T2H_VERBOSE; #open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n" $FH = open_out ($docu_about_file) if $Texi2HTML::Config::SPLIT; $Texi2HTML::HREF{This} = $Texi2HTML::HREF{About}; $Texi2HTML::HREF{About} = "#SEC_About"; $Texi2HTML::NAME{This} = $Texi2HTML::NAME{About}; $Texi2HTML::NO_TEXI{This} = $Texi2HTML::NO_TEXI{About}; $Texi2HTML::UNFORMATTED{This} = $Texi2HTML::UNFORMATTED{About}; $Texi2HTML::THIS_SECTION = [$about_body]; $Texi2HTML::THIS_HEADER = [ &$Texi2HTML::Config::anchor("SEC_About") . "\n" ]; #&$Texi2HTML::Config::print_About(\*FILE); #close(FILE) if $Texi2HTML::Config::SPLIT; &$Texi2HTML::Config::print_About($FH); close_out($FH, $docu_stoc_file) #|| die "$ERROR: Error occurred when closing $docu_stoc_file: $!\n" if ($Texi2HTML::Config::SPLIT); $Texi2HTML::HREF{About} = $Texi2HTML::HREF{This}; } unless ($Texi2HTML::Config::SPLIT) { &$Texi2HTML::Config::print_page_foot($FH); close_out ($FH); # || die "$ERROR: Error occurred when closing: $!\n"; } } # print section, close file and undef FH if needed. sub finish_element($$$$) { my $FH = shift; my $element = shift; my $new_element = shift; my $first_section = shift; #print STDERR "FINISH_ELEMENT($FH)($element->{'texi'})[$element->{'file'}] counter $files{$element->{'file'}}->{'counter'}\n"; if ($element->{'top'}) { my $top_file = $docu_top_file; #print STDERR "TOP $element->{'texi'}, @section_lines\n"; print STDERR "[Top]" if ($T2H_VERBOSE); $Texi2HTML::HREF{'Top'} = href($element_top, $element->{'file'}); &$Texi2HTML::Config::print_Top($FH, $element->{'has_heading'}); my $end_page = 0; if ($Texi2HTML::Config::SPLIT) { if (!$files{$element->{'file'}}->{'counter'}) { $end_page = 1; } } &$Texi2HTML::Config::print_Top_footer($FH, $end_page); close_out($FH, $top_file) if ($end_page); } else { print STDERR "# do element $element->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS); &$Texi2HTML::Config::print_section($FH, $first_section); if (defined($new_element) and ($new_element->{'file'} ne $element->{'file'})) { if (!$files{$element->{'file'}}->{'counter'}) { &$Texi2HTML::Config::print_chapter_footer($FH) if ($Texi2HTML::Config::SPLIT eq 'chapter'); &$Texi2HTML::Config::print_section_footer($FH) if ($Texi2HTML::Config::SPLIT eq 'section'); #print STDERR "Close file after $element->{'texi'}\n"; &$Texi2HTML::Config::print_page_foot($FH); close_out($FH); } else { print STDERR "counter $files{$element->{'file'}}->{'counter'} ne 0, file $element->{'file'}\n"; } undef $FH; } elsif (!defined($new_element)) { if ($Texi2HTML::Config::SPLIT) { # end of last splitted section &$Texi2HTML::Config::print_chapter_footer($FH) if ($Texi2HTML::Config::SPLIT eq 'chapter'); &$Texi2HTML::Config::print_section_footer($FH) if ($Texi2HTML::Config::SPLIT eq 'section'); &$Texi2HTML::Config::print_page_foot($FH); close_out($FH); } else { &$Texi2HTML::Config::end_section($FH, 1); } } elsif ($new_element->{'top'}) { &$Texi2HTML::Config::end_section($FH, 1); } else { &$Texi2HTML::Config::end_section($FH); } } return $FH; } # write to files with name the node name for cross manual references. sub do_node_files() { foreach my $key (keys(%nodes)) { my $node = $nodes{$key}; next unless ($node->{'node_file'}); my $redirection_file = $docu_doc; $redirection_file = $node->{'file'} if ($Texi2HTML::Config::SPLIT); if (!$redirection_file) { print STDERR "Bug: file for redirection for `$node->{'texi'}' don't exist\n" unless ($novalidate); next; } next if ($redirection_file eq $node->{'node_file'}); my $file = "${docu_rdir}$node->{'node_file'}"; $Texi2HTML::NODE{'This'} = $node->{'text'}; $Texi2HTML::NO_TEXI{'This'} = $node->{'no_texi'}; $Texi2HTML::UNFORMATTED{'This'} = $node->{'no_texi'}; $Texi2HTML::NAME{'This'} = $node->{'text'}; $Texi2HTML::HREF{'This'} = "$node->{'file'}#$node->{'id'}"; open (NODEFILE, "> $file") || die "$ERROR Can't open $file for writing: $!\n"; &$Texi2HTML::Config::print_redirection_page (\*NODEFILE); close NODEFILE || die "$ERROR: Can't close $file: $!\n"; } } #+++############################################################################ # # # Low level functions # # # #---############################################################################ sub locate_include_file($) { my $file = shift; # APA: Don't implicitely search ., to conform with the docs! # return $file if (-e $file && -r $file); foreach my $dir (@Texi2HTML::Config::INCLUDE_DIRS) { return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file"); } return undef; } sub open_file($$) { my $name = shift; my $line_number = shift; local *FH; #if ((defined($from_encoding) and open(*FH, ":encoding($from_encoding)", $name)) or open(*FH, $name)) #if ((defined($from_encoding) and open(*FH, "<:$from_encoding", $name)) or open(*FH, $name)) if (open(*FH, "<$name")) { if (defined($from_encoding)) { binmode(*FH, ":encoding($from_encoding)"); } my $file = { 'fh' => *FH, 'input_spool' => { 'spool' => [], 'macro' => '' }, 'name' => $name, 'line_nr' => 0 }; unshift(@fhs, $file); $input_spool = $file->{'input_spool'}; $line_number->{'file_name'} = $name; $line_number->{'line_nr'} = 1; } else { warn "$ERROR Can't read file $name: $!\n"; } } sub open_out($) { my $file = shift; if ($file eq '-') { binmode(STDOUT, ":encoding($to_encoding)") if (defined($to_encoding)); return \*STDOUT; } #unless ((defined($to_encoding) and open(FILE, ">:encoding($to_encoding)", $file)) or open(FILE, "> $file")) #my $open_style = 'bytes'; #$open_style = 'utf8' if (defined($to_encoding) and $to_encoding eq 'utf8'); #if (defined($to_encoding) and $to_encoding eq 'utf8') #{ # $open_style = 'utf8'; # print STDERR "$open_style\n"; #} #unless ((defined($to_encoding) and open(FILE, ">:$open_style", $file)) or open(FILE, "> $file")) unless (open(FILE, ">$file")) { die "$ERROR Can't open $file for writing: $!\n"; } if (defined($to_encoding)) { if ($to_encoding eq 'utf8') { binmode(FILE, ':utf8'); } else { binmode(FILE, ':bytes'); } binmode(FILE, ":encoding($to_encoding)"); } return \*FILE; } sub close_out($;$) { my $FH = shift; my $file = shift; $file = '' if (!defined($file)); return if ($Texi2HTML::Config::OUT eq ''); close ($FH) || die "$ERROR: Error occurred when closing $file: $!\n"; } sub next_line($) { my $line_number = shift; while (@fhs) { my $file = $fhs[0]; $line_number->{'file_name'} = $file->{'name'}; $input_spool = $file->{'input_spool'}; if (@{$input_spool->{'spool'}}) { $line_number->{'macro'} = $file->{'input_spool'}->{'macro'}; $line_number->{'line_nr'} = $file->{'line_nr'}; my $line = shift(@{$input_spool->{'spool'}}); print STDERR "# unspooling $line" if ($T2H_DEBUG & $DEBUG_MACROS); return($line); } else { $file->{'input_spool'}->{'macro'} = ''; $line_number->{'macro'} = ''; } my $fh = $file->{'fh'}; no strict "refs"; my $line = <$fh>; use strict "refs"; my $chomped_line = $line; $file->{'line_nr'}++ if (defined($line) and chomp($chomped_line)); $line_number->{'line_nr'} = $file->{'line_nr'}; return($line) if (defined($line)); no strict "refs"; close($fh); use strict "refs"; shift(@fhs); } return(undef); } # echo a warning sub echo_warn($;$) { my $text = shift; chomp ($text); my $line_number = shift; warn "$WARN $text " . format_line_number($line_number) . "\n"; } sub echo_error($;$) { my $text = shift; chomp ($text); my $line_number = shift; warn "$ERROR $text " . format_line_number($line_number) . "\n"; } sub format_line_number($) { my $line_number = shift; my $macro_text = ''; #$line_number = undef; return '' unless (defined($line_number)); $macro_text = " in $line_number->{'macro'}" if ($line_number->{'macro'} ne ''); my $file_text = '('; $file_text = "(in $line_number->{'file_name'} " if ($line_number->{'file_name'} ne $docu); return "${file_text}l. $line_number->{'line_nr'}" . $macro_text . ')'; } # to debug, dump the result of pass_texi and pass_structure in a file sub dump_texi($$;$$) { my $lines = shift; my $pass = shift; my $numbers = shift; my $file = shift; $file = "$docu_rdir$docu_name" . ".pass$pass" if (!defined($file)); unless (open(DMPTEXI, ">$file")) { warn "Can't open $file for writing: $!\n"; } print STDERR "# Dump texi\n" if ($T2H_VERBOSE); my $index = 0; foreach my $line (@$lines) { my $number_information = ''; my $chomped_line = $line; $number_information = "$numbers->[$index]->{'file_name'}($numbers->[$index]->{'macro'},$numbers->[$index]->{'line_nr'}) " if (defined($numbers)); print DMPTEXI "${number_information}$line"; $index++ if (chomp($chomped_line)); } close DMPTEXI; } # return next tag on the line sub next_tag($) { my $line = shift; if ($line =~ /^\s*\@(["'~\@\}\{,\.!\?\s\*\-\^`=:\|\/])/o or $line =~ /^\s*\@([a-zA-Z]\w*)([\s\{\}\@])/ or $line =~ /^\s*\@([a-zA-Z]\w*)$/) { return ($1); } return ''; } sub top_stack($) { my $stack = shift; return undef unless(@$stack); return $stack->[-1]; } # return the next element with balanced {} sub next_bracketed($$) { my $line = shift; my $line_nr = shift; my $opened_braces = 0; my $result = ''; my $spaces; if ($line =~ /^(\s*)$/) { return ('','',$1); } while ($line !~ /^\s*$/) { #print STDERR "next_bracketed($opened_braces): $result !!! $line"; if (!$opened_braces) { # beginning of item $line =~ s/^(\s*)//; $spaces = $1; #if ($line =~ s/^([^\{\}\s]+)//) if ($line =~ s/^([^\{\}]+?)(\s+)/$2/ or $line =~ s/^([^\{\}]+?)$//) { $result = $1; $result =~ s/\s*$//; return ($result, $line, $spaces); } elsif ($line =~ s/^([^\{\}]+?)([\{\}])/$2/) { $result = $1; } } elsif($line =~ s/^([^\{\}]+)//) { $result .= $1; } if ($line =~ s/^([\{\}])//) { my $brace = $1; $opened_braces++ if ($brace eq '{'); $opened_braces-- if ($brace eq '}'); if ($opened_braces < 0) { echo_error("too much '}' in specification", $line_nr); $opened_braces = 0; next; } $result .= $brace; return ($result, $line, $spaces) if ($opened_braces == 0); } } if ($opened_braces) { echo_error("'{' not closed in specification", $line_nr); return ($result . ( '}' x $opened_braces), '', $spaces); } print STDERR "BUG: at the end of next_bracketed\n"; return undef; } # do a href using file and id and taking care of ommitting file if it is # the same # element: structuring element to point to # file: current file sub href($$) { my $element = shift; my $file = shift; return '' unless defined($element); my $href = ''; print STDERR "Bug: $element->{'texi'}, id undef\n" if (!defined($element->{'id'})); print STDERR "Bug: $element->{'texi'}, file undef\n" if (!defined($element->{'file'})); #foreach my $key (keys(%{$element})) #{ # my $value = 'UNDEF'; $value = $element->{$key} if defined($element->{$key}); # print STDERR "$key: $value\n"; #}print STDERR "\n"; $href .= $element->{'file'} if (defined($element->{'file'}) and $file ne $element->{'file'}); $href .= "#$element->{'id'}" if (defined($element->{'id'})); return $href; } sub normalise_space($) { return undef unless (defined ($_[0])); my $text = shift; $text =~ s/\s+/ /go; $text =~ s/ $//; $text =~ s/^ //; return $text; } sub normalise_node($) { return undef unless (defined ($_[0])); my $text = shift; $text = normalise_space($text); $text =~ s/^top$/Top/i; return $text; } sub do_math($;$) { #return l2h_ToLatex("\$".$_[0]."\$"); return Texi2HTML::LaTeX2HTML::to_latex("\$".$_[0]."\$"); } sub do_anchor_label($$$$) { my $command = shift; #my $anchor = shift; my $args = shift; my $anchor = $args->[0]; my $style_stack = shift; my $state = shift; my $line_nr = shift; return '' if ($state->{'multiple_pass'}); $anchor = normalise_node($anchor); return &$Texi2HTML::Config::anchor($nodes{$anchor}->{'id'}); } sub get_format_command($) { my $format = shift; my $command = ''; my $format_name = ''; my $term = 0; my $item_nr; my $paragraph_number; my $enumerate_type; my $number; if (defined($format) and ref($format) eq "HASH") { $command = $format->{'command'}; $command = '' if (!defined($command)); $paragraph_number = \$format->{'paragraph_number'}; $format_name = $format->{'format'}; $term = 1 if ($format->{'term'}); #This should never happen $item_nr = $format->{'item_nr'}; $enumerate_type = $format->{'spec'}; $number = $format->{'number'}; } return ($format_name, $command, $paragraph_number, $term, $item_nr, $enumerate_type, $number); } sub do_paragraph($$) { my $text = shift; my $state = shift; my ($format, $paragraph_command, $paragraph_number, $term, $item_nr, $enumerate_type, $number) = get_format_command ($state->{'paragraph'}); delete $state->{'paragraph'}; my $paragraph_command_formatted; $state->{'paragraph_nr'}--; (print STDERR "Bug text undef in do_paragraph", return '') unless defined($text); my $align = ''; $align = $state->{'paragraph_style'}->[-1] if ($state->{'paragraph_style'}->[-1]); if (exists($style_map_ref->{$paragraph_command}) and !exists($Texi2HTML::Config::special_list_commands{$format}->{$paragraph_command})) { if ($format eq 'itemize') { chomp ($text); $text = do_simple($paragraph_command, $text, $state, [$text]); $text = $text . "\n"; } } elsif (exists($things_map_ref->{$paragraph_command})) { $paragraph_command_formatted = do_simple($paragraph_command, '', $state); } return &$Texi2HTML::Config::paragraph($text, $align, $paragraph_command, $paragraph_command_formatted, $paragraph_number, $format, $item_nr, $enumerate_type, $number); } sub do_preformatted($$) { my $text = shift; my $state = shift; my ($format, $leading_command, $preformatted_number, $term, $item_nr, $enumerate_type, $number) = get_format_command($state->{'preformatted_format'}); delete ($state->{'preformatted_format'}); my $leading_command_formatted; my $pre_style = ''; my $class = ''; $pre_style = $state->{'preformatted_stack'}->[-1]->{'pre_style'} if ($state->{'preformatted_stack'}->[-1]->{'pre_style'}); $class = $state->{'preformatted_stack'}->[-1]->{'class'}; print STDERR "BUG: !state->{'preformatted_stack'}->[-1]->{'class'}\n" unless ($class); if (exists($style_map_ref->{$leading_command}) and !exists($Texi2HTML::Config::special_list_commands{$format}->{$leading_command}) and ($style_type{$leading_command} eq 'style')) { $text = do_simple($leading_command, $text, $state,[$text]) if ($format eq 'itemize'); } elsif (exists($things_map_ref->{$leading_command})) { $leading_command_formatted = do_simple($leading_command, '', $state); } return &$Texi2HTML::Config::preformatted($text, $pre_style, $class, $leading_command, $leading_command_formatted, $preformatted_number, $format, $item_nr, $enumerate_type, $number); } sub do_external_href($) { my $texi_node = shift; my $file = ''; my $node_id = ''; my $node_xhtml_id = ''; if ($texi_node =~ s/^\((.+?)\)//) { $file = $1; } $texi_node = normalise_node($texi_node); if ($texi_node ne '') { if (exists($nodes{$texi_node}) and ($nodes{$texi_node}->{'cross_manual_target'})) { $node_id = $nodes{$texi_node}->{'cross_manual_target'}; } else { $node_id = cross_manual_line($texi_node); } $node_xhtml_id = node_to_id($node_id); } return &$Texi2HTML::Config::external_href($texi_node, $node_id, $node_xhtml_id, $file); } # transform node for cross ref name to id suitable for xhtml. sub node_to_id($) { my $cross_ref_node_name = shift; $cross_ref_node_name =~ s/^([0-9_])/g_t$1/; return $cross_ref_node_name; } # return 1 if the following tag shouldn't begin a line sub no_line($) { my $line = shift; my $next_tag = next_tag($line); return 1 if (($line =~ /^\s*$/) or $no_line_macros{$next_tag} or (($next_tag =~ /^(\w+?)index$/) and ($1 ne 'print')) or (($line =~ /^\@end\s+(\w+)/) and $no_line_macros{"end $1"})); return 0; } sub no_paragraph($$) { my $state = shift; my $line = shift; return ($state->{'paragraph'} or $state->{'preformatted'} or $state->{'remove_texi'} or no_line($line) or $state->{'no_paragraph'}); } sub automatic_preformatted($$) { my $state = shift; my $macro = shift; return ($state->{'preformatted'} and !$Texi2HTML::Config::format_in_paragraph{$macro}); } # handle raw formatting, ignored regions... sub do_text_macro($$$$) { my $type = shift; my $line = shift; my $state = shift; my $line_nr = shift; my $value; #print STDERR "do_text_macro $type\n"; if (not $text_macros{$type}) { # ignored text $state->{'ignored'} = $type; #print STDERR "IGNORED\n"; } elsif ($text_macros{$type} eq 'raw' or $text_macros{$type} eq 'special') { $state->{'raw'} = $type; #print STDERR "RAW\n"; } elsif ($text_macros{$type} eq 'value') { if (($line =~ s/(\s+)($VARRE)$//) or ($line =~ s/(\s+)($VARRE)(\s)//)) { $value = $1 . $2; $value .= $3 if defined($3); if ($type eq 'ifclear') { if (defined($value{$2})) { $state->{'ignored'} = $type; } else { push @{$state->{'text_macro_stack'}}, $type; } } elsif ($type eq 'ifset') { unless (defined($value{$2})) { $state->{'ignored'} = $type; } else { push @{$state->{'text_macro_stack'}}, $type; } } } else { echo_error ("Bad $type line: $line", $line_nr); #warn "$ERROR Bad $type line: $line"; } } else { push @{$state->{'text_macro_stack'}}, $type; } my $text = "\@$type"; $text .= $value if defined($value); return ($line, $text); } # do regions handled specially, currently only tex, going throug latex2html sub do_special ($$) { my $style = shift; my $text = shift; if ($style eq 'tex') { # add space to the end -- tex(i2dvi) does this, as well #return (l2h_ToLatex($text . " ")); return (Texi2HTML::LaTeX2HTML::to_latex($text . " ")); } } sub do_insertcopying($) { my $state = shift; return '' unless @{$region_lines{'copying'}}; return substitute_text(duplicate_state($state), @{$region_lines{'copying'}}); } sub get_deff_index($$$) { my $tag = shift; my $line = shift; my $line_nr = shift; $tag =~ s/x$// if $tag =~ /x$/; my ($style, $category, $name, $type, $class, $arguments); ($style, $category, $name, $type, $class, $arguments) = parse_def($tag, $line, $line_nr); # FIXME -- --- ''... should be protected for name and maybe class $name = &$Texi2HTML::Config::definition_category($name, $class, $style); return undef if (!$name or ($name =~ /^\s*$/)); return ($style, $name); } sub parse_def($$$) { my $tag = shift; my $line = shift; my $line_nr = shift; if (!ref ($Texi2HTML::Config::def_map{$tag})) { # substitute shortcuts for definition commands my $substituted = $Texi2HTML::Config::def_map{$tag}; $substituted =~ s/(\w+)//; $tag = $1; $line = $substituted . $line; } #print STDERR "PARSE_DEF $line"; my ($category, $name, $type, $class, $arguments); my @args = @{$Texi2HTML::Config::def_map{$tag}}; my $style = shift @args; while (@args) { my $arg = shift @args; if (defined($arg)) { # backward compatibility, it was possible to have a { in front. $arg =~ s/^\{//; my $item; my $spaces; ($item, $line,$spaces) = next_bracketed($line, $line_nr); last if (!defined($item)); $item =~ s/^\{(.*)\}$/$1/ if ($item =~ /^\{/); if ($arg eq 'category') { $category = $item; } elsif ($arg eq 'name') { $name = $item; } elsif ($arg eq 'type') { $type = $item; } elsif ($arg eq 'class') { $class = $item; } elsif ($arg eq 'arg') { $line = $spaces . $item . $line; } } else { # chomp ($line); # $line =~ s/\s*$//; # $arguments = $line if ($line ne ''); last; } } #return ($style, $category, $name, $type, $class, $arguments); #print STDERR "PARSE_DEF (style $style, category $category, name $name, type $type, class $class, line $line)\n"; return ($style, $category, $name, $type, $class, $line); } #FIXME this is rather fragile. sub begin_deff_item($$;$) { my $stack = shift; my $state = shift; my $no_paragraph = shift; return if ($state->{'cmd_line'}); #print STDERR "DEF push deff_item for $state->{'deff'}\n"; push @$stack, { 'format' => 'deff_item', 'text' => '' }; # there is no paragraph when a new deff just follows the deff we are # opening begin_paragraph($stack, $state) if ($state->{'preformatted'} and !$no_paragraph); $state->{'deff'} = undef; delete($state->{'deff'}); #dump_stack(undef, $stack, $state); } sub begin_paragraph($$) { my $stack = shift; my $state = shift; my $command = 1; my $top_format = top_format($stack); if (defined($top_format)) { $command = $top_format; } if ($state->{'preformatted'}) { push @$stack, {'format' => 'preformatted', 'text' => '' }; $state->{'preformatted_format'} = $command if ($command ne '1'); push @$stack, @{$state->{'paragraph_macros'}} if $state->{'paragraph_macros'}; delete $state->{'paragraph_macros'}; return; } $state->{'paragraph'} = $command; $state->{'paragraph_nr'}++; push @$stack, {'format' => 'paragraph', 'text' => '' }; # if there are macros which weren't closed when the previous # paragraph was closed we reopen them here push @$stack, @{$state->{'paragraph_macros'}} if $state->{'paragraph_macros'}; delete $state->{'paragraph_macros'}; } sub parse_format_command($$) { my $line = shift; my $tag = shift; my $command = 'asis'; if (($line =~ /^\s*\@([A-Za-z]\w*)(\{\})?$/ or $line =~ /^\s*\@([A-Za-z]\w*)(\{\})?\s/) and ($things_map_ref->{$1} or defined($style_map_ref->{$1}))) { $line =~ s/^\s*\@([A-Za-z]\w*)(\{\})?\s*//; $command = $1; } return ('', $command) if ($line =~ /^\s*$/); chomp $line; $line = substitute_text ({'keep_nr' => 1, 'keep_texi' => 1, 'check_item' => $tag}, $line); return ($line, $command); } sub parse_enumerate($) { my $line = shift; my $spec; if ($line =~ /^\s*(\w)\b/ and ($1 ne '_')) { $spec = $1; $line =~ s/^\s*(\w)\s*//; } return ($line, $spec); } sub parse_multitable($$) { my $line = shift; my $line_nr = shift; # first find the table width my $table_width = 0; if ($line =~ s/^\s+\@columnfractions\s+//) { my @fractions = split /\s+/, $line; $table_width = $#fractions + 1; while (@fractions) { my $fraction = shift @fractions; unless ($fraction =~ /^(\d*\.\d+)|(\d+)\.?$/) { echo_error ("column fraction not a number: $fraction", $line_nr); #warn "$ERROR column fraction not a number: $fraction"; } } } else { my $element; my $line_orig = $line; while ($line !~ /^\s*$/) { my $spaces; ($element, $line, $spaces) = next_bracketed($line, $line_nr); if ($element =~ /^\{/) { $table_width++; } else { echo_error ("garbage in multitable specification: $element", $line_nr); } } } return ($table_width); } sub end_format($$$$$) { my $text = shift; my $stack = shift; my $state = shift; my $format = shift; my $line_nr = shift; #print STDERR "END FORMAT $format\n"; #dump_stack($text, $stack, $state); #sleep 1; close_menu($text, $stack, $state, $line_nr) if ($format_type{$format} eq 'menu'); if (($format_type{$format} eq 'list') or ($format_type{$format} eq 'table')) { # those functions return if they detect an inapropriate context add_item($text, $stack, $state, $line_nr, '', 1); # handle lists add_term($text, $stack, $state, $line_nr, 1); # handle table add_line($text, $stack, $state, $line_nr, 1); # handle table add_row($text, $stack, $state, $line_nr); # handle multitable } #print STDERR "END_FORMAT\n"; #dump_stack($text, $stack, $state); my $format_ref = pop @$stack; # debug if (!defined($format_ref->{'text'})) { push @$stack, $format_ref; print STDERR "Bug: text undef in end_format $format\n"; dump_stack($text, $stack, $state); pop @$stack; } if (defined($Texi2HTML::Config::def_map{$format})) { close_stack($text, $stack, $state, $line_nr, undef, 'deff_item') unless ($format_ref->{'format'} eq 'deff_item'); add_prev($text, $stack, &$Texi2HTML::Config::def_item($format_ref->{'text'})); $format_ref = pop @$stack; # pop deff if (!defined($format_ref->{'format'}) or !defined($Texi2HTML::Config::def_map{$format_ref->{'format'}})) { print STDERR "Bug: not a def* under deff_item\n"; push (@$stack, $format_ref); dump_stack($text, $stack, $state); pop @$stack; } elsif ($format_ref->{'format'} ne $format) { echo_warn ("Waiting for \@end $format_ref->{'format'}, found \@end $format", $line_nr); } add_prev($text, $stack, &$Texi2HTML::Config::def($format_ref->{'text'})); } elsif ($format_type{$format} eq 'cartouche') { add_prev($text, $stack, &$Texi2HTML::Config::cartouche($format_ref->{'text'})); } elsif ($format eq 'float') { if (!defined($state->{'float'})) { echo_warn ("Waiting for \@end $format_ref->{'format'}, found \@end $format", $line_nr); } else { my ($caption_lines, $shortcaption_lines) = &$Texi2HTML::Config::caption_shortcaption($state->{'float'}); my ($caption_text, $shortcaption_text); $caption_text = substitute_text(duplicate_state($state), @$caption_lines) if (defined($caption_lines)); $shortcaption_text = substitute_text(duplicate_state($state), @$shortcaption_lines) if (defined($shortcaption_lines)); add_prev($text, $stack, &$Texi2HTML::Config::float($format_ref->{'text'}, $state->{'float'}, $caption_text, $shortcaption_text)); delete $state->{'float'}; } } elsif ($format_type{$format} eq 'menu') { if ($state->{'preformatted'}) { # end the fake complex format $state->{'preformatted'}--; pop @{$state->{'preformatted_stack'}}; pop @$stack; } $state->{'menu'}--; add_prev($text, $stack, &$Texi2HTML::Config::menu($format_ref->{'text'})); } elsif ($format_type{$format} eq 'complex') { $state->{'preformatted'}--; pop @{$state->{'preformatted_stack'}}; # debug if (!defined($Texi2HTML::Config::complex_format_map->{$format_ref->{'format'}}->{'begin'})) { print STDERR "Bug undef $format_ref->{'format'}" . "->{'begin'} (for $format...)\n"; dump_stack ($text, $stack, $state); } #print STDERR "before $format\n"; #dump_stack ($text, $stack, $state); add_prev($text, $stack, &$Texi2HTML::Config::complex_format($format_ref->{'format'}, $format_ref->{'text'})); #print STDERR "after $format\n"; #dump_stack ($text, $stack, $state); } elsif (($format_type{$format} eq 'table') or ($format_type{$format} eq 'list')) { #print STDERR "CLOSE $format ($format_ref->{'format'})\n$format_ref->{'text'}\n"; pop @{$state->{'format_stack'}}; #dump_stack($text, $stack, $state); if ($format_ref->{'format'} ne $format) { echo_warn ("Waiting for \@end $format_ref->{'format'}, found \@end $format", $line_nr); } if ($Texi2HTML::Config::format_map{$format}) { # table or list has a simple format add_prev($text, $stack, end_simple_format($format_ref->{'format'}, $format_ref->{'text'})); } else { # table or list handler defined by the user add_prev($text, $stack, &$Texi2HTML::Config::table_list($format_ref->{'format'}, $format_ref->{'text'}, $format_ref->{'command'})); } } elsif ($format eq 'quotation') { my $quotation_args = pop @{$state->{'quotation_stack'}}; add_prev($text, $stack, &$Texi2HTML::Config::quotation($format_ref->{'text'}, $quotation_args->{'text'}, $quotation_args->{'style_texi'}, $quotation_args->{'style_id'})); } elsif ($format_type{$format} eq 'paragraph_style') { if ($state->{'paragraph_style'}->[-1] eq $format) { pop @{$state->{'paragraph_style'}}; } add_prev($text, $stack, &$Texi2HTML::Config::paragraph_style_command($format_ref->{'format'},$format_ref->{'text'})); } elsif (exists($Texi2HTML::Config::format_map{$format})) { if ($format_ref->{'format'} ne $format) { # FIXME hasn't that case been handled before ? echo_warn ("Waiting for \@end $format_ref->{'format'}, found \@end $format", $line_nr); } add_prev($text, $stack, end_simple_format($format_ref->{'format'}, $format_ref->{'text'})); } else { echo_warn("Unknown format $format", $line_nr); } # We restart the preformatted format which was stopped by the format # if in preformatted if (automatic_preformatted($state,$format)) { #print STDERR "restart preformatted, $format\n"; begin_paragraph($stack, $state); } } sub do_text($;$) { my $text = shift; my $state = shift; return $text if ($state->{'keep_texi'}); if (defined($state) and !$state->{'preformatted'} and !$state->{'code_style'}) { # in normal text `` and '' serve as quotes, --- is for a long dash # and -- for a medium dash. # (see texinfo.txi, @node Conventions) $text = &$Texi2HTML::Config::normal_text($text); } if ($state->{'no_protection'}) { return $text; } return &$Texi2HTML::Config::protect_text($text); } sub end_simple_format($$) { my $tag = shift; my $text = shift; my $element = $Texi2HTML::Config::format_map{$tag}; return &$Texi2HTML::Config::format($tag, $element, $text); } sub close_menu($$$$) { my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; if ($state->{'menu_comment'}) { #print STDERR "close MENU_COMMENT Before close_stack\n"; #dump_stack($text, $stack, $state); close_stack($text, $stack, $state, $line_nr, undef, 'menu_comment'); # close_paragraph isn't needed in most cases, but A preformatted may # appear after close_stack if we closed a format, as formats reopen # preformatted. However it is empty and close_paragraph will remove it close_paragraph($text, $stack, $state); my $menu_comment = pop @$stack; if (!$menu_comment->{'format'} or $menu_comment->{'format'} ne 'menu_comment') { warn "Bug waiting for menu_comment, got $menu_comment->{'format'}\n"; dump_stack($text, $stack, $state); } add_prev($text, $stack, &$Texi2HTML::Config::menu_comment($menu_comment->{'text'})); pop @{$state->{'preformatted_stack'}}; $state->{'preformatted'}--; $state->{'menu_comment'}--; } if ($state->{'menu_entry'}) { close_stack($text, $stack,$state, $line_nr, undef, 'menu_description'); my $descr = pop(@$stack); print STDERR "# close_menu: close description\n" if ($T2H_DEBUG & $DEBUG_MENU); add_prev($text, $stack, menu_description($descr->{'text'}, $state)); delete $state->{'menu_entry'}; } } # Format menu link, the sub do_menu_link($$;$) { my $state = shift; my $line_nr = shift; my $simple = shift; my $menu_entry = $state->{'menu_entry'}; my $file = $state->{'element'}->{'file'}; my $node_name = normalise_node($menu_entry->{'node'}); my $substitution_state = duplicate_state($state); my $name = substitute_line($menu_entry->{'name'}, $substitution_state); my $node = substitute_line($menu_entry->{'node'}, $substitution_state); if (($name ne '') and !$state->{'preformatted'} and $Texi2HTML::Config::AVOID_MENU_REDUNDANCY) { $name = '' unless (clean_text(remove_texi($menu_entry->{'name'})) ne clean_text(remove_texi($menu_entry->{'node'}))) } my $entry = ''; my $href; my $element = $nodes{$node_name}; if ($element->{'seen'}) { if ($element->{'with_section'}) { $element = $element->{'with_section'}; } #print STDERR "SUBHREF in menu for $element->{'texi'}\n"; $href = href($element, $file); if (! $element->{'node'}) { $entry = $element->{'text'}; # this is the section name without number $entry = $element->{'name'} if (!$Texi2HTML::Config::NUMBER_SECTIONS); $entry = "$Texi2HTML::Config::MENU_SYMBOL $entry" if (($entry ne '') and (!defined($element->{'number'}) or ($element->{'number'} =~ /^\s*$/)) and $Texi2HTML::Config::UNNUMBERED_SYMBOL_IN_MENU); } } elsif ($menu_entry->{'node'} =~ /^\s*\(.*\)/ or $novalidate) {#FIXME this is wrong for $novalidate # menu entry points to another info manual #$href = $nodes{$node_name}->{'file'}; $href = do_external_href($node_name); } else { echo_error ("Unknown node in menu entry `$node_name'", $line_nr); } return &$Texi2HTML::Config::menu_link($entry, $state, $href, $node, $name, $menu_entry->{'ending'}) unless ($simple); return &$Texi2HTML::Config::simple_menu_link($entry, $state->{'preformatted'}, $href, $node, $name, $menu_entry->{'ending'}); } sub menu_description($$) { my $descr = shift; my $state = shift; my $menu_entry = $state->{'menu_entry'}; my $node_name = normalise_node($menu_entry->{'node'}); my $element = $nodes{$node_name}; if ($element->{'seen'}) { if ($element->{'with_section'}) { $element = $element->{'with_section'}; } if ($Texi2HTML::Config::AVOID_MENU_REDUNDANCY && ($descr ne '') && !$state->{'preformatted'}) { $descr = '' if (clean_text($element->{'name'}) eq clean_text($descr)); } } return &$Texi2HTML::Config::menu_description($descr, $state); } sub clean_text($) { my $text = shift; $text =~ s/[^\w]//g; return $text; } sub do_xref($$$$) { my $macro = shift; #my $text = shift; my $args = shift; my $style_stack = shift; my $state = shift; my $line_nr = shift; my $result = ''; #$text =~ s/\s+/ /gos; # remove useless spaces and newlines #my @args = split(/\s*,\s*/, $text); my @args = @$args; #print STDERR "DO_XREF: $macro\n"; my $j = 0; for ($j = 0; $j <= $#$args; $j++) { $args[$j] = normalise_space($args[$j]); # print STDERR " ($j)$args[$j]\n"; } #$args[0] = normalise_space($args[0]); $args[0] = '' if (!defined($args[0])); my $node_texi = normalise_node($args[0]); # a ref to a node in an info manual if ($args[0] =~ s/^\(([^\)]+)\)\s*//) { if ($macro eq 'inforef') { $args[2] = $1 unless ($args[2]); } else { $args[3] = $1 unless ($args[3]); } } if (($macro ne 'inforef') and $args[3]) { $node_texi = "($args[3])" . normalise_node($args[0]); } if ($macro eq 'inforef') { if ((@args < 1) or ($args[0] eq '')) { echo_error ("Need a node name for \@$macro", $line_nr); return ''; } if (@args > 3) { echo_warn ("Too much arguments for \@$macro", $line_nr); } $args[2] = '' if (!defined($args[2])); $args[1] = '' if (!defined($args[1])); $node_texi = "($args[2])$args[0]"; } my $i; my $new_state = duplicate_state($state); $new_state->{'keep_texi'} = 0; $new_state->{'keep_nr'} = 0; for ($i = 0; $i < 5; $i++) { $args[$i] = substitute_line($args[$i], $new_state); } #print STDERR "(@args)\n"; if (($macro eq 'inforef') or ($args[3] ne '') or ($args[4] ne '')) {# external ref if ($macro eq 'inforef') { $macro = 'xref'; $args[3] = $args[2]; } my $href = ''; my $node_file = ''; if ($args[3] ne '') { $href = do_external_href($node_texi); $node_file = "($args[3])$args[0]"; } my $section = ''; if ($args[4] ne '') { $section = $args[0]; if ($args[2] ne '') { $section = $args[2]; } } $result = &$Texi2HTML::Config::external_ref($macro, $section, $args[4], $node_file, $href, $args[1]); } else { my $element = $nodes{$node_texi}; if ($element and $element->{'seen'}) { if ($element->{'with_section'}) { $element = $element->{'with_section'}; } my $file = ''; if (defined($state->{'element'})) { $file = $state->{'element'}->{'file'}; } else { echo_warn ("\@$macro not in text (in anchor, node, section...)", $line_nr); # if Texi2HTML::Config::SPLIT the file is '' which ensures a href with the file # name. if ! Texi2HTML::Config::SPLIT the 2 file will be the same thus there # won't be the file name $file = $element->{'file'} unless ($Texi2HTML::Config::SPLIT); } #print STDERR "SUBHREF in ref `$node_texi': $_"; my $href = href($element, $file); my $section = $args[2]; $section = $args[1] if ($section eq ''); my $name = $section; my $short_name = $section; if ($section eq '') { $name = $element->{'name'}; $short_name = $args[0]; } $result = &$Texi2HTML::Config::internal_ref ($macro, $href, $short_name, $name, $element->{'section'}); } else { if (($node_texi eq '') or !$novalidate) { echo_error ("Undefined node `$node_texi' in \@$macro", $line_nr); my $text = ''; for (my $i = 0; $i < @$args -1; $i++) { $text .= $args->[$i] .','; } $text .= $args->[-1]; $result = "\@$macro"."{${text}}"; } else { $result = &$Texi2HTML::Config::external_ref($macro, '', '', $args[0], do_external_href($node_texi), $args[1]); } } } return $result; } sub do_acronym_like($$$$$) { my $command = shift; my $args = shift; my $acronym_texi = shift @$args; my $explanation = shift @$args; my $style_stack = shift; my $state = shift; my $line_nr = shift; my $explanation_lines; my $explanation_text; my $explanation_unformatted; if (defined($explanation)) { $explanation =~ s/^\s*//; $explanation =~ s/\s*$//; $explanation = undef if ($explanation eq ''); } $acronym_texi =~ s/^\s*//; $acronym_texi =~ s/\s*$//; return '' if ($acronym_texi eq ''); my $with_explanation = 0; my $normalized_text = cross_manual_line (normalise_node($acronym_texi)); if (defined($explanation)) { $with_explanation = 1; $acronyms_like{$command}->{$normalized_text} = $explanation; } elsif (exists($acronyms_like{$command}->{$normalized_text})) { $explanation = $acronyms_like{$command}->{$normalized_text}; } if (defined($explanation)) { @$explanation_lines = map {$_ = $_."\n"} split (/\n/, $explanation); my $text = ''; foreach my $line(@$explanation_lines) { $line .= ' ' if (chomp ($line)); $text .= $line } $text =~ s/ $//; my $unformatted_state = duplicate_state($state); $unformatted_state->{'unformatted'} = 1; $explanation_unformatted = substitute_line($text, $unformatted_state); $explanation_text = substitute_line($text, duplicate_state($state)); } return &$Texi2HTML::Config::acronym_like($command, $acronym_texi, substitute_line ($acronym_texi, duplicate_state($state)), $with_explanation, $explanation_lines, $explanation_text, $explanation_unformatted); } sub do_caption_shortcaption($$$$$) { my $command = shift; my $args = shift; my $text = $args->[0]; my $style_stack = shift; my $state = shift; my $line_nr = shift; if (!exists($state->{'float'})) { #dump_stack(\"", [], $state); echo_error("\@$command outside of float", $line_nr); return ''; } my $float = $state->{'float'}; my @texi_lines = map {$_ = $_."\n"} split (/\n/, $text); $float->{"${command}_texi"} = \@texi_lines; return ''; } sub do_float_line($$$$$) { my $command = shift; my $args = shift; my @args = @$args; my $style_texi = shift @args; my $label_texi = shift @args; my $style_stack = shift; my $state = shift; my $line_nr = shift; $style_texi = undef if (defined($style_texi) and $style_texi=~/^\s*$/); $label_texi = undef if (defined($label_texi) and $label_texi=~/^\s*$/); if (defined($label_texi)) { #my $id = cross_manual_line($label_texi); $state->{'float'} = $nodes{normalise_node($label_texi)}; #print STDERR "float: $state->{'float'}, $state->{'float'}->{'texi'}\n"; } else { $state->{'float'} = { 'float' => 1 }; if (defined($style_texi)) { $state->{'float'}->{'style_texi'} = normalise_space($style_texi); $state->{'float'}->{'style_id'} = cross_manual_line($style_texi); $state->{'float'}->{'style'} = substitute_line($style_texi); } #print STDERR "float: (no label) $state->{'float'}\n"; } return ''; } sub do_quotation_line($$$$$) { my $command = shift; my $args = shift; my @args = @$args; my $style_texi = shift @args; my $text_texi = shift @args; my $style_stack = shift; my $state = shift; my $line_nr = shift; my $text; $style_texi = undef if (defined($style_texi) and $style_texi=~/^\s*$/); $text_texi = undef if (defined($text_texi) and $text_texi=~/^\s*$/); if (defined($style_texi) and !defined($text_texi)) { $text_texi = $style_texi; $style_texi = undef; } if (defined($text_texi)) { $text = substitute_line($text_texi, duplicate_state($state)); $text =~ s/\s*$//; } my $quotation_args = { 'style_texi' => $style_texi, 'text' => $text, 'text_texi' => $text_texi }; if (defined($style_texi)) { $quotation_args->{'style_id'} = cross_manual_line(normalize_space($style_texi)); } push @{$state->{'quotation_stack'}}, $quotation_args; $state->{'prepend_text'} = &$Texi2HTML::Config::quotation_prepend_text($style_texi, $text_texi); return ''; } sub do_def_line($$$$$) { my $command = shift; my $args = shift; my @args = @$args; my $arguments = shift @args; my $style_stack = shift; my $state = shift; my $line_nr = shift; $state->{'deff'}->{'arguments'} = $arguments; return ''; } sub do_footnote($$$$) { my $command = shift; my $args = shift; my $text = $args->[0]; my $style_stack = shift; my $state = shift; my $line_nr = shift; $text .= "\n"; $foot_num++; $relative_foot_num++; my $docid = "DOCF$foot_num"; my $footid = "FOOT$foot_num"; my $from_file = ''; if ($state->{'element'} and $Texi2HTML::Config::SPLIT and $Texi2HTML::Config::SEPARATED_FOOTNOTES) { $from_file = $state->{'element'}->{'file'}; } my %state; initialise_state (\%state); if ($Texi2HTML::Config::SEPARATED_FOOTNOTES) { $state{'element'} = $footnote_element; } else { $state{'element'} = $state->{'element'}; } my $file = ''; $file = $docu_foot if ($Texi2HTML::Config::SPLIT and $Texi2HTML::Config::SEPARATED_FOOTNOTES); # FIXME use split_lines ? It seems to work like it is now ? my @lines = substitute_text(\%state, map {$_ = $_."\n"} split (/\n/, $text)); my ($foot_lines, $foot_label) = &$Texi2HTML::Config::foot_line_and_ref ($foot_num, $relative_foot_num, $footid, $docid, $from_file, $file, \@lines, $state); push(@foot_lines, @{$foot_lines}); return $foot_label; } sub do_image($$$$) { # replace images my $command = shift; my $args = shift; my $text = $args->[0]; my $style_stack = shift; my $state = shift; my $line_nr = shift; $text =~ s/\s+/ /gos; # remove useless spaces and newlines my @args = split (/\s*,\s*/, $text); my $base = $args[0]; if ($base eq '') { echo_error ("no file argument for \@image", $line_nr); #warn "$ERROR no file argument for \@image\n"; return ''; } $args[4] = '' if (!defined($args[4])); $args[3] = '' if (!defined($args[3])); my $image; my $file_name; $image = locate_include_file("$base.$args[4]") if (defined($args[4]) and ($args[4] ne '')); if (defined($image)) { $file_name = "$base.$args[4]"; } elsif ($image = locate_include_file("$base.png")) { $file_name = "$base.png"; } elsif ($image = locate_include_file("$base.jpg")) { $file_name = "$base.jpg"; } elsif ($image = locate_include_file("$base.gif")) { $file_name = "$base.gif"; } else { $image = "$base.jpg"; $image = "$base.$args[4]" if (defined($args[4]) and ($args[4] ne '')); $file_name = $image; echo_error ("no image file for $base, (using $image)", $line_nr); #warn "$ERROR no image file for $base, (using $image) : $text\n"; } # FIXME use full file name for alt instead of base when there is no # alttext ? if ($args[3] =~ /\S/) { # FIXME makeinfo don't do that. $args[3] = do_text($args[3]); $base = $args[3] if ($args[3] =~ /\S/); } return &$Texi2HTML::Config::image( &$Texi2HTML::Config::protect_text($path_to_working_dir . $image), &$Texi2HTML::Config::protect_text($base), $state->{'preformatted'}, &$Texi2HTML::Config::protect_text($file_name)); } sub duplicate_state($) { my $state = shift; my $new_state = { 'element' => $state->{'element'}, 'preformatted' => $state->{'preformatted'}, 'code_style' => $state->{'code_style'}, 'keep_texi' => $state->{'keep_texi'}, 'keep_nr' => $state->{'keep_nr'}, 'preformatted_stack' => $state->{'preformatted_stack'} }; return $new_state; } sub expand_macro($$$$$) { my $name = shift; my $args = shift; my $end_line = shift; my $line_nr = shift; my $state = shift; my $index = 0; foreach my $arg (@$args) { # expand @macros in arguments $args->[$index] = substitute_text({'texi' => 1, 'arg_expansion' => 1}, split_lines($arg)); $index++; } my $macrobody = $macros->{$name}->{'Body'}; my $formal_args = $macros->{$name}->{'Args'}; my $args_index = $macros->{$name}->{'Args_index'}; my $i; die "Bug end_line not defined" if (!defined($end_line)); for ($i=0; $i<=$#$formal_args; $i++) { $args->[$i] = "" unless (defined($args->[$i])); print STDERR "# arg($i): $args->[$i]\n" if ($T2H_DEBUG & $DEBUG_MACROS); } echo_error ("too much arguments for macro $name", $line_nr) if (defined($args->[$i + 1])); #warn "$ERROR too much arguments for macro $name" if (defined($args->[$i + 1])); my $result = ''; while ($macrobody) { if ($macrobody =~ s/^([^\\]*)\\//o) { $result .= $1 if defined($1); if ($macrobody =~ s/^\\//) { $result .= '\\'; } elsif ($macrobody =~ s/^(\@end\sr?macro)$// or $macrobody =~ s/^(\@end\sr?macro\s)// or $macrobody =~ s/^(\@r?macro\s+\w+\s*.*)//) { # \ protect @end macro $result .= $1; } elsif ($macrobody =~ s/^([^\\]*)\\//) { my $arg = $1; if (defined($args_index->{$arg})) { $result .= $args->[$args_index->{$arg}]; } else { warn "$ERROR \\ not followed by \\ or an arg but by $arg in macro\n"; $result .= '\\' . $arg; } } next; } $result .= $macrobody; last; } #$result .= $end_line; my @result = split(/^/m, $result); #my $first_line = shift (@result); if ($state->{'arg_expansion'}) { unshift @{$state->{'spool'}}, (@result, $end_line); } else { unshift @{$input_spool->{'spool'}}, (@result, $end_line); $input_spool->{'macro'} = $name if ($input_spool->{'macro'} eq ''); } if ($T2H_DEBUG & $DEBUG_MACROS) { print STDERR "# macro expansion result:\n"; #print STDERR "$first_line"; foreach my $line (@result) { print STDERR "$line"; } print STDERR "# macro expansion result end\n"; } #return $first_line; } sub do_index_summary_file($) { my $name = shift; my ($Pages, $Entries) = get_index($name); &$Texi2HTML::Config::index_summary_file_begin ($name, $printed_indices{$name}); #open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx") # || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n"; #print STDERR "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE; print STDERR "# writing $name index summary\n" if $T2H_VERBOSE; foreach my $key (sort keys %$Entries) { #print FHIDX "$key\t$Entries->{$key}->{href}\n"; my $entry = $Entries->{$key}; my $label = $entry->{'element'}; my $entry_element = $label; # notice that we use the section associated with a node even when # there is no with_section, i.e. when there is another node preceding # the sectionning command. # However when it is the Top node, we use the node instead. # (for the Top node, 'section_ref' is himself, and 'as_section' is # true) $entry_element = $entry_element->{'section_ref'} if ($entry_element->{'node'} and $entry_element->{'section_ref'} and !$entry_element->{'section_ref'}->{'as_section'}); my $origin_href = $entry->{'file'}; #print STDERR "$entry $entry->{'entry'}, real elem $label->{'texi'}, section $entry_element->{'texi'}, real $label->{'file'}, entry file $entry->{'file'}\n"; if ($entry->{'label'}) { $origin_href .= '#' . $entry->{'label'}; } else { # If the $label element and the $index entry are on the same # file the label is prefered. If they aren't on the same file # the entry id is choosed as it means that the label element # and the index entry are separated by a printindex. print STDERR "id undef ($entry) entry: $entry->{'entry'}, label: $label->{'text'}\n" if (!defined($entry->{'id'})); if ($entry->{'file'} eq $label->{'file'}) { $origin_href .= '#' . $label->{'id'}; } else { $origin_href .= '#' . $entry->{'id'} ; } } #print STDERR "SUBHREF in index summary file for $entry_element->{'texi'}\n"; #print FHIDX '' . &$Texi2HTML::Config::index_summary_file_entry ($name, $key, $origin_href, substitute_line($entry->{'entry'}), $entry->{'entry'}, href($entry_element, ''), $entry_element->{'text'}, $printed_indices{$name}); } &$Texi2HTML::Config::index_summary_file_end ($name, $printed_indices{$name}); } sub do_index_page($$;$) { my $index_elements = shift; my $nr = shift; my $page = shift; my $index_element = $index_elements->[$nr]; my $summary = do_index_summary($index_element->{'element'}, $index_elements); my $entries = do_index_entries($index_element->{'element'}, $index_element->{'page'}, $index_element->{'name'}); return $summary . $entries . $summary; } sub do_index_summary($$) { my $element = shift; my $index_elements = shift; my @letters; my @symbols; for my $index_element_item (@$index_elements) { my $index_element = $index_element_item->{'element'}; my $file = ''; $file .= $index_element->{'file'} if ($index_element->{'file'} ne $element->{'file'}); my $index = 0; for my $letter (@{$index_element_item->{'page'}->{Letters}}) { if ($letter =~ /^[A-Za-z]/) { push @letters, &$Texi2HTML::Config::summary_letter($letter, $file, "$index_element->{'id'}" . "_$index"); } else { push @symbols, &$Texi2HTML::Config::summary_letter($letter, $file, "$index_element->{'id'}" . "_$index"); } $index++; } } return &$Texi2HTML::Config::index_summary(\@letters, \@symbols); } sub do_index_entries($$$) { my $element = shift; my $page = shift; my $name = shift; my $letters = ''; my $index = 0; for my $letter (@{$page->{'Letters'}}) { my $entries = ''; for my $entry (@{$page->{'EntriesByLetter'}->{$letter}}) { my $label = $entry->{'element'}; my $entry_element = $label; # notice that we use the section associated with a node even when # there is no with_section, i.e. when there is another node preceding # the sectionning command. # However when it is the Top node, we use the node instead. # (for the Top node, 'section_ref' is himself, and 'as_section' is # true) $entry_element = $entry_element->{'section_ref'} if ($entry_element->{'node'} and $entry_element->{'section_ref'} and !$entry_element->{'section_ref'}->{'as_section'}); my $origin_href = ''; $origin_href = $entry->{'file'} if ($Texi2HTML::Config::SPLIT and $entry->{'file'} ne $element->{'file'}); #print STDERR "$entry $entry->{'entry'}, real elem $label->{'texi'}, section $entry_element->{'texi'}, real $label->{'file'}, entry file $entry->{'file'}\n"; if ($entry->{'label'}) { $origin_href .= '#' . $entry->{'label'}; } else { # If the $label element and the $index entry are on the same # file the label is prefered. If they aren't on the same file # the entry id is choosed as it means that the label element # and the index entry are separated by a printindex. print STDERR "id undef ($entry) entry: $entry->{'entry'}, label: $label->{'text'}\n" if (!defined($entry->{'id'})); if ($entry->{'file'} eq $label->{'file'}) { $origin_href .= '#' . $label->{'id'}; } else { $origin_href .= '#' . $entry->{'id'} ; } } #print STDERR "SUBHREF in index for $entry_element->{'texi'}\n"; $entries .= &$Texi2HTML::Config::index_entry ($origin_href, substitute_line($entry->{'entry'}), href($entry_element, $element->{'file'}), $entry_element->{'text'}); } $letters .= &$Texi2HTML::Config::index_letter ($letter, "$element->{'id'}" . "_$index", $entries); $index++; } return &$Texi2HTML::Config::print_index($letters, $name); } # remove texi commands, replacing with what seems adequate. see simple_map_texi # and texi_map. # Doesn't protect html sub remove_texi(@) { return substitute_text ({ 'remove_texi' => 1, 'no_protection' => 1 }, @_); } # Same as remove texi but protect text and use special maps for @-commands sub unformatted_text($@) { my $state = shift; $state = {} if (!defined($state)); $state->{'remove_texi'} = 1; $simple_map_texi_ref = \%Texi2HTML::Config::unformatted_text_simple_map_texi; $style_map_texi_ref = \%Texi2HTML::Config::unformatted_text_style_map_texi; $texi_map_ref = \%Texi2HTML::Config::unformatted_text_texi_map; my $text = substitute_text ($state, @_); $simple_map_texi_ref = \%Texi2HTML::Config::simple_map_texi; $style_map_texi_ref = \%Texi2HTML::Config::style_map_texi; $texi_map_ref = \%Texi2HTML::Config::texi_map; return $text; } sub enter_table_index_entry($$$$) { my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; if ($state->{'item'} and ($state->{'table_stack'}->[-1] =~ /^(v|f)table$/)) { my $index = $1; my $macro = $state->{'item'}; delete $state->{'item'}; close_stack($text, $stack, $state, $line_nr, undef, 'index_item'); my $item = pop @$stack; my $element = $state->{'element'}; $element = $state->{'node_ref'} unless ($element); #print STDERR "enter_table_index_entry $item->{'text'}"; enter_index_entry($index, $line_nr, $item->{'text'}, $state->{'place'}, $element, 0); add_prev($text, $stack, "\@$macro" . $item->{'text'}); } } sub scan_texi($$$$;$) { my $line = shift; my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; die "stack not an array ref" unless (ref($stack) eq "ARRAY"); local $_ = $line; while(1) { # scan_texi #print STDERR "WHILE:$_"; #dump_stack($text, $stack, $state); # In ignored region if ($state->{'ignored'}) { my $line; if (s/^(.*?\@end\s+$state->{'ignored'})//) { $line = $1; if (s/^$// or s/(\s+)//) { $line = $line . $1 if (defined($1)); } elsif (/[^\@]/) { $_ .= $line; $line = undef; } } if (defined($line)) { delete $state->{'ignored'}; #dump_stack($text, $stack, $state); # MACRO_ARG => keep ignored text if ($state->{'arg_expansion'}) { #add_prev ($text, $stack, $1); add_prev ($text, $stack, $line); next; } return if /^\s*$/o; next; } add_prev ($text, $stack, $_) if ($state->{'arg_expansion'}); return; } # in macro definition if (defined($state->{'macro'})) { if (s/^([^\\\@]*\\)//) {# I believe it is correct, although makeinfo don't do that. $state->{'macro'}->{'Body'} .= $1; if (s/^\\//) { $state->{'macro'}->{'Body'} .= '\\'; next; } elsif (s/^(\@end\sr?macro)$//o or s/^(\@end\sr?macro\s)//o or s/^(\@r?macro\s+\w+\s*.*)//o) { $state->{'macro'}->{'Body'} .= $1; next; } } #if (s/^(.*?)\@end\sr?macro$//o or s/^(.*?)\@end\sr?macro\s+//o) if (s/^(\@end\sr?macro)$//o or s/^(\@end\sr?macro\s+)//o) { $state->{'macro_inside'}--; if ($state->{'macro_inside'}) { $state->{'macro'}->{'Body'} .= $1; next; } #$state->{'macro'}->{'Body'} .= $1 if defined($1) ; chomp $state->{'macro'}->{'Body'}; print STDERR "# end macro def. Body:\n$state->{'macro'}->{'Body'}" if ($T2H_DEBUG & $DEBUG_MACROS); delete $state->{'macro'}; return if (/^\s*$/); next; } elsif(/^(\@r?macro\s+\w+\s*.*)/) { $state->{'macro'}->{'Body'} .= $_; $state->{'macro_inside'}++; return; } elsif (s/^\@(.)//) { $state->{'macro'}->{'Body'} .= '@' . $1; next; } elsif (s/^\@//) { $state->{'macro'}->{'Body'} .= '@'; next; } else { s/([^\@\\]*)//; $state->{'macro'}->{'Body'} .= $1 if (defined($1)); if (/^$/) { $state->{'macro'}->{'Body'} .= $_; return; } next; #$state->{'macro'}->{'Body'} .= $_ if defined($_) ; #return; } } # in macro arguments parsing/expansion if (defined($state->{'macro_name'})) { my $special_chars = quotemeta ('\{}'); my $multi_args = 0; my $formal_args = $macros->{$state->{'macro_name'}}->{'Args'}; $multi_args = 1 if ($#$formal_args >= 1); $special_chars .= quotemeta(',') if ($multi_args); if ($state->{'macro_args'}->[-1] eq '') { s/^\s*//o; } if (s/^([^$special_chars]*)([$special_chars])//) { $state->{'macro_args'}->[-1] .= $1 if defined($1); # \ protects any character in macro arguments if ($2 eq '\\') { print STDERR "# macro call: protected char\n" if ($T2H_DEBUG & $DEBUG_MACROS); if (s/^(.)//) { $state->{'macro_args'}->[-1] .= $1; } else { $state->{'macro_args'}->[-1] .= '\\'; } } elsif ($2 eq ',') { # separate args print STDERR "# macro call: new arg\n" if ($T2H_DEBUG & $DEBUG_MACROS); s/^\s*//o; push @{$state->{'macro_args'}}, ''; } elsif ($2 eq '}') { # balanced } ends the macro call, otherwise it is in the arg $state->{'macro_depth'}--; if ($state->{'macro_depth'} == 0) { print STDERR "# expanding macro $state->{'macro_name'}\n" if ($T2H_DEBUG & $DEBUG_MACROS); $_ = expand_macro($state->{'macro_name'}, $state->{'macro_args'}, $_, $line_nr, $state); delete $state->{'macro_name'}; delete $state->{'macro_depth'}; delete $state->{'macro_args'}; return; } else { print STDERR "# macro call: closing }\n" if ($T2H_DEBUG & $DEBUG_MACROS); add_text('}', \$state->{'macro_args'}->[-1]); } } elsif ($2 eq '{') { print STDERR "# macro call: opening {\n" if ($T2H_DEBUG & $DEBUG_MACROS); $state->{'macro_depth'}++; add_text('{', \$state->{'macro_args'}->[-1]); } next; } print STDERR "# macro call: end of line\n" if ($T2H_DEBUG & $DEBUG_MACROS); $state->{'macro_args'}->[-1] .= $_; return; } # in a raw format, verbatim, tex or html if ($state->{'raw'}) { my $tag = $state->{'raw'}; # debugging if (! @$stack or ($stack->[-1]->{'style'} ne $tag)) { print STDERR "Bug: raw or special: $tag but not on top of stack\n"; print STDERR "line: $_"; dump_stack($text, $stack, $state); exit 1; } if (s/^(.*?)(\@end\s$tag)$// or s/^(.*?)(\@end\s$tag\s)//) { add_prev ($text, $stack, $1); my $end = $2; my $style = pop @$stack; if ($style->{'text'} !~ /^\s*$/ or $state->{'arg_expansion'}) { my $after_macro = ''; $after_macro = ' ' unless (/^\s*$/); add_prev ($text, $stack, $style->{'text'} . $end . $after_macro); delete $state->{'raw'}; } next; } else { add_prev ($text, $stack, $_); last; } } # in a @verb{ .. } macro if (defined($state->{'verb'})) { my $char = quotemeta($state->{'verb'}); if (s/^(.*?)$char\}/\}/) { add_prev($text, $stack, $1 . $state->{'verb'}); $stack->[-1]->{'text'} = $state->{'verb'} . $stack->[-1]->{'text'}; delete $state->{'verb'}; next; } else { add_prev($text, $stack, $_); last; } } # an @end tag if (s/^([^{}@]*)\@end(\s+)([a-zA-Z]\w*)//) { add_prev($text, $stack, $1); my $space = $2; my $end_tag = $3; if (defined($state->{'text_macro_stack'}) and @{$state->{'text_macro_stack'}} and ($end_tag eq $state->{'text_macro_stack'}->[-1])) { pop @{$state->{'text_macro_stack'}}; # we keep menu and titlepage for the following pass if ((($end_tag eq 'menu') and $text_macros{'menu'}) or ($region_lines{$end_tag}) or $state->{'arg_expansion'}) { add_prev($text, $stack, "\@end${space}$end_tag"); } else { #print STDERR "End $end_tag\n"; #dump_stack($text, $stack, $state); return if (/^\s*$/); } } elsif ($text_macros{$end_tag}) { echo_error ("\@end $end_tag without corresponding element", $line_nr); } else { add_prev($text, $stack, "\@end${space}$end_tag"); } next; } elsif (s/^([^{}@]*)\@(["'~\@\}\{,\.!\?\s\*\-\^`=:\|\/])//o or s/^([^{}@]*)\@([a-zA-Z]\w*)([\s\{\}\@])/$3/o or s/^([^{}@]*)\@([a-zA-Z]\w*)$//o) { add_prev($text, $stack, $1); my $macro = $2; #print STDERR "MACRO $macro\n"; $state->{'bye'} = 1 if ($macro eq 'bye'); if (defined($Texi2HTML::Config::misc_command{$macro}) and !$Texi2HTML::Config::misc_command{$macro}->{'texi'} and $macro ne 'documentencoding') { my ($line, $args); ($_, $line, $args) = preserve_command($_, $macro); add_prev ($text, $stack, $line); next; } # pertusus: it seems that value substitution are performed after # macro argument expansions: if we have # @set comma , # and a call to a macro @macro {arg1 @value{comma} arg2} # the macro arg is arg1 , arg2 and the comma don't separate # args. Likewise it seems that the @value are not expanded # in macro definitions # track variables my $value_macro = 1; if ($macro eq 'set' and s/^(\s+)($VARRE)(\s+)(.*)$//o) { if ($state->{'arg_expansion'}) { my $line = "\@$macro" . $1.$2.$3; $line .= $4 if (defined($4)); add_prev($text, $stack, $line); next; } $value{$2} = $4; } elsif ($macro eq 'clear' and s/^(\s+)($VARRE)//o) { if ($state->{'arg_expansion'}) { add_prev($text, $stack, "\@$macro" . $1 . $2); next; } delete $value{$2}; } else { $value_macro = 0; } if ($value_macro) { return if (/^\s*$/); next; } if ($macro =~ /^r?macro$/) { #FIXME what to do if 'arg_expansion' is true (ie within another # macro call arguments ? if (/^\s+(\w+)\s*(.*)/) { my $name = $1; if (exists($macros->{$name})) { echo_warn ("macro `$name' allready defined " . format_line_number($macros->{$name}->{'line_nr'}) . " redefined", $line_nr); } $state->{'macro_inside'} = 1; my @args = (); @args = split(/\s*,\s*/ , $1) if ($2 =~ /^\s*{\s*(.*?)\s*}\s*/); # keep the context information of the definition $macros->{$name}->{'line_nr'} = { 'file_name' => $line_nr->{'file_name'}, 'line_nr' => $line_nr->{'line_nr'}, 'macro' => $line_nr->{'macro'} } if (defined($line_nr)); $macros->{$name}->{'Args'} = \@args; my $arg_index = 0; my $debug_msg = ''; foreach my $arg (@args) { # when expanding macros, the argument index is retrieved # with Args_index $macros->{$name}->{'Args_index'}->{$arg} = $arg_index; $debug_msg .= "$arg($arg_index) "; $arg_index++; } $macros->{$name}->{'Body'} = ''; $state->{'macro'} = $macros->{$name}; print STDERR "# macro def $name: $debug_msg\n" if ($T2H_DEBUG & $DEBUG_MACROS); } else { echo_error ("Bad macro defintion $_", $line_nr); #warn "$ERROR Bad macro defintion $_"; } return; } elsif (defined($text_macros{$macro})) { my $tag; ($_, $tag) = do_text_macro ($macro, $_, $state, $line_nr); # if it is a raw formatting command or a menu command # we must keep it for later my $macro_kept; if ($state->{'raw'} or (($macro eq 'menu') and $text_macros{'menu'}) or (exists($region_lines{$macro})) or $state->{'arg_expansion'}) { add_prev($text, $stack, $tag); $macro_kept = 1; } if ($state->{'raw'}) { push @$stack, { 'style' => $macro, 'text' => '' }; } next if $macro_kept; #dump_stack ($text, $stack, $state); return if (/^\s*$/); } elsif ($macro eq 'value') { if (s/^{($VARRE)}//) { if ($state->{'arg_expansion'}) { add_prev($text, $stack, "\@$macro" . '{' . $1 . '}'); next; } $_ = get_value($1) . $_; } else { if ($state->{'arg_expansion'}) { add_prev($text, $stack, "\@$macro"); next; } echo_error ("bad \@value macro", $line_nr); #warn "$ERROR bad \@value macro"; } } elsif ($macro eq 'definfoenclose') { if ($state->{'arg_expansion'}) { add_prev($text, $stack, "\@$macro" . $_); return; } if (s/^\s+([a-z]+)\s*,\s*([^\s]+)\s*,\s*([^\s]+)//) { $info_enclose{$1} = [ $2, $3 ]; } else { echo_error("Bad \@$macro", $line_nr); } return if (/^\s*$/); s/^\s*//; } elsif ($macro eq 'include') { if ($state->{'arg_expansion'}) { add_prev($text, $stack, "\@$macro" . $_); return; } #if (s/^\s+([\/\w.+-]+)//o) if (s/^(\s+)(.*)//o) { my $file = locate_include_file($2); if (defined($file)) { open_file($file, $line_nr); print STDERR "# including $file\n" if $T2H_VERBOSE; } else { echo_error ("Can't find $2, skipping", $line_nr); #warn "$ERROR Can't find $1, skipping\n"; } } else { echo_error ("Bad include line: $_", $line_nr); return; } # makeinfo remove the @include but not the end of line # FIXME verify if it is right #return if (/^\s*$/); } elsif ($macro eq 'documentencoding') { if (s/(\s+)([0-9\w\-]+)//) { my $encoding = $2; $Texi2HTML::Config::DOCUMENT_ENCODING = $encoding; $from_encoding = set_encoding($encoding); if (defined($from_encoding)) { foreach my $file (@fhs) { binmode($file->{'fh'}, ":encoding($from_encoding)"); } } } add_prev($text, $stack, "\@$macro" . $1 . $2); } elsif ($macro eq 'unmacro') { #FIXME with 'arg_expansion' should it be passed unmodified ? delete $macros->{$1} if (s/^\s+(\w+)//); return if (/^\s*$/); s/^\s*//; } elsif (exists($macros->{$macro})) { my $ref = $macros->{$macro}->{'Args'}; # we remove any space/new line before the argument if (s/^\s*{\s*//) { $state->{'macro_args'} = [ "" ]; $state->{'macro_name'} = $macro; $state->{'macro_depth'} = 1; } elsif ($#$ref >= 1) { # no brace -> no arg $_ = expand_macro ($macro, [], $_, $line_nr, $state); return; } else { # macro with one arg on the line chomp $_; $_ = expand_macro ($macro, [$_], "\n", $line_nr, $state); return; } } elsif ($macro eq ',') {# the @, causes problems when `,' separates things (in @node, @ref) $_ = "\@m_cedilla" . $_; } elsif (s/^{//) { if ($macro eq 'verb') { if (/^$/) { echo_error ("verb at end of line", $line_nr); #warn "$ERROR verb at end of line"; } else { s/^(.)//; $state->{'verb'} = $1; } } push (@$stack, { 'style' => $macro, 'text' => '' }); } else { add_prev($text, $stack, "\@$macro"); } next; } #elsif(s/^([^{}@]*)\@(.)//o) elsif(s/^([^{}@]*)\@([^\s\}\{\@]*)//o) { # No need to warn here it is done later add_prev($text, $stack, $1 . "\@$2"); next; } elsif (s/^([^{}]*)([{}])//o) { add_prev($text, $stack, $1); if ($2 eq '{') { push @$stack, { 'style' => '', 'text' => '' }; } else { if (@$stack) { my $style = pop @$stack; my $result; if (($style->{'style'} ne '') and exists($info_enclose{$style->{'style'}}) and !$state->{'arg_expansion'}) { $result = $info_enclose{$style->{'style'}}->[0] . $style->{'text'} . $info_enclose{$style->{'style'}}->[1]; } elsif ($style->{'style'} ne '') { $result = '@' . $style->{'style'} . '{' . $style->{'text'} . '}'; } else { $result = '{' . $style->{'text'}; # don't close { if we are closing stack as we are not # sure this is a licit { ... } construct. $result .= '}' unless ($state->{'close_stack'} or $state->{'arg_expansion'}); } add_prev ($text, $stack, $result); #print STDERR "MACRO end $style->{'style'} remaining: $_"; next; } else { # we warn in the last pass #echo_error ("'}' without opening '{', before: $_", $line_nr); #warn "$ERROR '}' without opening '{' line: $line"; add_prev ($text, $stack, '}'); } } } else { #print STDERR "END_LINE $_"; add_prev($text, $stack, $_); last; } } return 1; } sub scan_structure($$$$;$) { my $line = shift; my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; die "stack not an array ref" unless (ref($stack) eq "ARRAY"); local $_ = $line; #print STDERR "SCAN_STRUCTURE: $line"; #dump_stack ($text, $stack, $state); if (!$state->{'raw'} and !$state->{'special'} and (!exists($state->{'region_lines'}))) { if (!$state->{'verb'} and $state->{'menu'} and /^\*/o) { # new menu entry delete ($state->{'after_element'}); my $menu_line = $_; my $node; if (/^\*\s+($NODERE)::/) { $node = $1; } elsif (/^\*\s+([^:]+):\s*([^\t,\.\n]+)[\t,\.\n]/) { #$name = $1; $node = $2; } if ($node) { menu_entry_texi(normalise_node($node), $state, $line_nr); } } if (/\S/ and !no_line($_)) { delete $state->{'after_element'}; } } while(1) { # scan structure #print STDERR "WHILE\n"; #dump_stack($text, $stack, $state); # as texinfo 4.5 # verbatim might begin at another position than beginning # of line, and end verbatim might too. To end a verbatim section # @end verbatim must have exactly one space between end and verbatim # things following end verbatim are not ignored. # # html might begin at another position than beginning # of line, but @end html must begin the line, and have # exactly one space. Things following end html are ignored. # tex and ignore works like html # # ifnothtml might begin at another position than beginning # of line, and @end ifnothtml might too, there might be more # than one space between @end and ifnothtml but nothing more on # the line. # @end itemize, @end ftable works like @end ifnothtml. # except that @item on the same line than @end vtable doesn't work # # text right after the itemize before an item is displayed. # @item might be somewhere in a line. # strangely @item on the same line than @end vtable doesn't work # there should be nothing else than a command following @itemize... # # see more examples in formatting directory if ($state->{'raw'} or $state->{'special'}) { my $tag = $state->{'raw'}; $tag = $state->{'special'} unless $tag; if (! @$stack or ($stack->[-1]->{'style'} ne $tag)) { print STDERR "Bug: raw or special: $tag but not on top of stack\n"; print STDERR "line: $_"; dump_stack($text, $stack, $state); exit 1; } if (s/^(.*?)\@end\s$tag$// or s/^(.*?)\@end\s$tag\s//) { add_prev ($text, $stack, $1); my $style = pop @$stack; if ($state->{'special'}) { delete $state->{'special'}; if ($style->{'text'} !~ /^\s*$/) { add_prev ($text, $stack, do_special($style->{'style'}, $style->{'text'})); } } else { my $after_macro = ''; $after_macro = ' ' unless (/^\s*$/); add_prev ($text, $stack, $style->{'text'} . "\@end $state->{'raw'}" . $after_macro); delete $state->{'raw'}; } unless (no_line($_)) { delete ($state->{'after_element'}); } next; } else { add_prev ($text, $stack, $_); last unless ($state->{'special'}); return; } } if (defined($state->{'verb'})) { my $char = quotemeta($state->{'verb'}); if (s/^(.*?)$char\}/\}/) { add_prev($text, $stack, $1 . $state->{'verb'}); $stack->[-1]->{'text'} = $state->{'verb'} . $stack->[-1]->{'text'}; delete $state->{'verb'}; next; } else { add_prev($text, $stack, $_); last; } } unless (no_line($_)) { delete $state->{'after_element'}; } if (s/^([^{}@]*)\@end\s+([a-zA-Z]\w*)//) { add_prev($text, $stack, $1); my $end_tag = $2; $state->{'detailmenu'}-- if ($end_tag eq 'detailmenu' and $state->{'detailmenu'}); if (defined($state->{'text_macro_stack'}) and @{$state->{'text_macro_stack'}} and ($end_tag eq $state->{'text_macro_stack'}->[-1])) { pop @{$state->{'text_macro_stack'}}; if (exists($region_lines{$end_tag})) { print STDERR "Bug: end_tag $end_tag ne $state->{'region_lines'}->{'format'}" if ( $end_tag ne $state->{'region_lines'}->{'format'}); $state->{'region_lines'}->{'number'}--; if ($state->{'region_lines'}->{'number'} == 0) { $state->{'after_element'} = 1; delete $state->{'after_element'} unless ($state->{'region_lines'}->{'after_element'}); delete $state->{'region_lines'}->{'number'}; delete $state->{'region_lines'}->{'format'}; delete $state->{'region_lines'}->{'after_element'}; delete $state->{'region_lines'}; } #dump_stack($text, $stack, $state); } if ($end_tag eq 'menu') { add_prev($text, $stack, "\@end $end_tag"); $state->{'menu'}--; } else { #print STDERR "End $end_tag\n"; #dump_stack($text, $stack, $state); return if (/^\s*$/); } } elsif ($text_macros{$end_tag}) { echo_error ("\@end $end_tag without corresponding element", $line_nr); #dump_stack($text, $stack, $state); } else { if ($end_tag eq 'float' and $state->{'float'}) { delete $state->{'float'}; } elsif ($end_tag eq $state->{'table_stack'}->[-1]) { enter_table_index_entry($text, $stack, $state, $line_nr); pop @{$state->{'table_stack'}}; } #add end tag add_prev($text, $stack, "\@end $end_tag"); } next; } #elsif (s/^([^{}@]*)\@([a-zA-Z]\w*|["'~\@\}\{,\.!\?\s\*\-\^`=:\/])//o) elsif (s/^([^{}@]*)\@(["'~\@\}\{,\.!\?\s\*\-\^`=:\|\/])//o or s/^([^{}@]*)\@([a-zA-Z]\w*)([\s\{\}\@])/$3/o or s/^([^{}@]*)\@([a-zA-Z]\w*)$//o) { add_prev($text, $stack, $1); my $macro = $2; #print STDERR "MACRO $macro\n"; if (defined($Texi2HTML::Config::misc_command{$macro})) { my $line; ($_, $line) = misc_command_structure($_, $macro, $state, $line_nr); add_prev ($text, $stack, $line); next; } if ($macro =~ /^(\w+?)index/ and ($1 ne 'print') and ($1 ne 'syncode') and ($1 ne 'syn') and ($1 ne 'def') and ($1 ne 'defcode')) { my $index_prefix = $1; if (/^\s+(.*)/) { my $key = $1; $_ = substitute_texi_line($_); my $index_entry = enter_index_entry($index_prefix, $line_nr, $key, $state->{'place'}, $state->{'element'}, $state->{'after_element'}); if ($index_entry) { add_prev ($text, $stack, "\@$macro" . $_); last; } elsif (!defined($index_entry)) { echo_warn ("Bad index entry: $_", $line_nr); #warn "$WARN Bad index entry: $_"; } } else { echo_warn ("empty index entry", $line_nr); #warn "$WARN empty index entry\n"; } return; } elsif (defined($text_macros{$macro})) { #print STDERR "TEXT_MACRO: $macro\n"; if ($text_macros{$macro} eq 'special') { $state->{'special'} = $macro; } elsif ($text_macros{$macro} eq 'raw') { $state->{'raw'} = $macro; #print STDERR "RAW\n"; } elsif ($format_type{$macro} and $format_type{$macro} eq 'menu') { $state->{'menu'}++; delete ($state->{'prev_menu_node'}); push @{$state->{'text_macro_stack'}}, $macro; #print STDERR "MENU (text_macro_stack: @{$state->{'text_macro_stack'}})\n"; } elsif (exists($region_lines{$macro})) { if (exists($state->{'region_lines'}) and ($state->{'region_lines'}->{'format'} ne $macro)) { echo_error("\@$macro not allowed within $state->{'region_lines'}->{'format'}", $line_nr); next; } if (!exists($state->{'region_lines'})) { $state->{'region_lines'}->{'format'} = $macro; $state->{'region_lines'}->{'number'} = 1; $state->{'region_lines'}->{'after_element'} = 1 if ($state->{'after_element'}); } else { $state->{'region_lines'}->{'number'}++; } push @{$state->{'text_macro_stack'}}, $macro; } # if it is a raw formatting command or a menu command # we must keep it for later my $macro_kept; if ($state->{'raw'} or ($macro eq 'menu')) { add_prev($text, $stack, "\@$macro"); $macro_kept = 1; } if ($state->{'raw'} or $state->{'special'}) { push @$stack, { 'style' => $macro, 'text' => '' }; } next if $macro_kept; #dump_stack ($text, $stack, $state); return if (/^\s*$/); } elsif (defined($Texi2HTML::Config::def_map{$macro})) { #We must enter the index entries my ($prefix, $entry) = get_deff_index($macro, $_, $line_nr); enter_index_entry($prefix, $line_nr, $entry, $state->{'place'}, $state->{'element'}, 0) if ($prefix and defined($entry)); s/(.*)//; add_prev($text, $stack, "\@$macro" . $1); } elsif ($macro =~ /^itemx?$/) { enter_table_index_entry($text, $stack, $state, $line_nr); if ($state->{'table_stack'}->[-1] =~ /^(v|f)table$/) { $state->{'item'} = $macro; push @$stack, { 'format' => 'index_item', 'text' => "" }; } else { add_prev($text, $stack, "\@$macro"); } } elsif ($format_type{$macro} and ($format_type{$macro} eq 'table' or $format_type{$macro} eq 'list')) { # We must enter the index entries of (v|f)table thus we track # in which table we are push @{$state->{'table_stack'}}, $macro; add_prev($text, $stack, "\@$macro"); } elsif (s/^{//) { if ($macro eq 'verb') { if (/^$/) { # We allready warned in pass texi #warn "$ERROR verb at end of line"; } else { s/^(.)//; $state->{'verb'} = $1; } } elsif ($macro eq 'footnote' and $Texi2HTML::Config::SEPARATED_FOOTNOTES) { $state->{'footnote_element'} = $state->{'element'}; $state->{'footnote_place'} = $state->{'place'}; $state->{'element'} = $footnote_element; $state->{'place'} = $footnote_element->{'place'}; } push (@$stack, { 'style' => $macro, 'text' => '' }); } else { add_prev($text, $stack, "\@$macro"); } next; } #elsif(s/^([^{}@]*)\@(.)//o) elsif(s/^([^{}@]*)\@([^\s\}\{\@]*)//o) { add_prev($text, $stack, $1 . "\@$2"); next; } elsif (s/^([^{}]*)([{}])//o) { add_prev($text, $stack, $1); if ($2 eq '{') { push @$stack, { 'style' => '', 'text' => '' }; } else { if (@$stack) { my $style = pop @$stack; my $result; if ($style->{'style'} eq 'anchor') { my $anchor = $style->{'text'}; $anchor = normalise_node($anchor); if ($nodes{$anchor}) { echo_error ("Duplicate node for anchor found: $anchor", $line_nr); next; } $anchor_num++; $nodes{$anchor} = { 'anchor' => 1, 'seen' => 1, 'texi' => $anchor, 'id' => 'ANC' . $anchor_num}; push @{$state->{'place'}}, $nodes{$anchor}; } elsif ($style->{'style'} eq 'footnote') { if ($Texi2HTML::Config::SEPARATED_FOOTNOTES) { $state->{'element'} = $state->{'footnote_element'}; $state->{'place'} = $state->{'footnote_place'}; } } elsif ($style->{'style'} eq 'math' and $Texi2HTML::Config::L2H) { add_prev ($text, $stack, do_math($style->{'text'})); next; } elsif ($style->{'style'} eq 'caption' or $style->{'style'} eq 'shortcaption' and $state->{'float'}) { my @texi_lines = map {$_ = $_."\n"} split (/\n/, $style->{'text'}); $state->{'float'}->{$style->{'style'} . "_texi"} = \@texi_lines; } if (($style->{'style'} eq 'titlefont') and ($style->{'text'} =~ /\S/)) { $state->{'element'}->{'titlefont'} = $style->{'text'} unless ((exists($state->{'region_lines'}) and ($state->{'region_lines'}->{'format'} eq 'titlepage')) or defined($state->{'element'}->{'titlefont'})) ; } if ($style->{'style'}) { $result = '@' . $style->{'style'} . '{' . $style->{'text'} . '}'; } else { $result = '{' . $style->{'text'}; # don't close { if we are closing stack as we are not # sure this is a licit { ... } construct. $result .= '}' unless $state->{'close_stack'}; } add_prev ($text, $stack, $result); #print STDERR "MACRO end $style->{'style'} remaining: $_"; next; } else { # We warn in the last pass #warn "$ERROR '}' without opening '{' line: $line"; #echo_error ("'}' without opening '{' line: $line", $line_nr); add_prev ($text, $stack, '}'); } } } else { #print STDERR "END_LINE $_"; add_prev($text, $stack, $_); enter_table_index_entry($text, $stack, $state, $line_nr); last; } } return 1; } sub scan_line($$$$;$) { my $line = shift; my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; die "stack not an array ref" unless (ref($stack) eq "ARRAY"); local $_ = $line; #print STDERR "SCAN_LINE: $line"; #dump_stack($text, $stack, $state ); my $new_menu_entry; # true if there is a new menu entry my $menu_description_in_format; # true if we are in a menu description # but in another format section (@table....) if (defined($state->{'prepend_text'})) { $_ = $state->{'prepend_text'} . $_; $state->{'prepend_text'} = undef; delete $state->{'prepend_text'}; } if (defined($state->{'end_of_line_protected'})) { #print STDERR "END_OF_LINE_PROTECTED, $_"; #dump_stack($text, $stack, $state); delete $state->{'end_of_line_protected'}; } if (!$state->{'raw'} and !$state->{'verb'} and $state->{'menu'}) { # new menu entry my ($node, $name, $ending); if (s/^\*(\s+$NODERE)(::)//o) { $node = $1; $ending = $2; } elsif (s/^\*(\s+[^:]+):(\s*[^\t,\.\n]+)([\t,\.\n])//o) { $name = $1; $node = $2; $ending = $3; } if ($node) { my $top_stack = top_stack($stack); if ($top_stack and $top_stack->{'format'} and ( ($top_stack->{'format'} eq 'menu_description') or ($top_stack->{'format'} eq 'menu') or (($top_stack->{'format'} eq 'preformatted') and (stack_order($stack, 'preformatted', 'menu_comment'))) or ($top_stack->{'format'} eq 'menu_preformatted') or ($top_stack->{'format'} eq 'menu_comment') ) ) { # we are in a normal menu state. close_menu($text, $stack, $state, $line_nr); $new_menu_entry = 1; $state->{'menu_entry'} = { 'name' => $name, 'node' => $node, 'ending' => $ending }; add_prev ($text, $stack, do_menu_link($state, $line_nr)); print STDERR "# New menu entry: $node\n" if ($T2H_DEBUG & $DEBUG_MENU); push @$stack, {'format' => 'menu_description', 'text' => ''}; } else { # we are within a macro or a format. In that case we use # a simplified formatting of menu which should be right whatever # the context my $menu_entry = $state->{'menu_entry'}; $state->{'menu_entry'} = { 'name' => $name, 'node' => $node, 'ending' => $ending }; add_prev ($text, $stack, do_menu_link($state, $line_nr, 1)); $state->{'menu_entry'} = $menu_entry; } } } # we're in a menu entry description if ($state->{'menu_entry'} and !$new_menu_entry) { my $top_stack = top_stack($stack); if (/^\s+\S.*$/ or (!$top_stack->{'format'} or ($top_stack->{'format'} ne 'menu_description'))) { # description continues $menu_description_in_format = 1 if ($top_stack->{'format'} and ($top_stack->{'format'} ne 'menu_description')); print STDERR "# Description continues\n" if ($T2H_DEBUG & $DEBUG_MENU); #dump_stack ($text, $stack, $state); } else { # enter menu comment after menu entry if (!$top_stack->{'format'} or ($top_stack->{'format'} ne 'menu_description')) { print STDERR "Bug: begin menu comment but previous isn't menu_description\n"; dump_stack ($text, $stack, $state); } print STDERR "# Menu comment begins\n" if ($T2H_DEBUG & $DEBUG_MENU); #dump_stack ($text, $stack, $state); my $descr = pop(@$stack); add_prev ($text, $stack, menu_description($descr->{'text'}, $state)); delete $state->{'menu_entry'}; unless (/^\s*\@end\s+menu\b/) { $state->{'menu_comment'}++; push @$stack, {'format' => 'menu_comment', 'text' => ''}; push @{$state->{'preformatted_stack'}}, {'pre_style' => $Texi2HTML::Config::MENU_PRE_STYLE, 'class' => 'menu-comment' }; $state->{'preformatted'}++; begin_paragraph($stack, $state); } #dump_stack ($text, $stack, $state); } } if ($state->{'open_paragraph'} and !$state->{'no_paragraph'}) { delete $state->{'open_paragraph'}; if ($state->{'preformatted'} or !no_paragraph($state,$_)) { begin_paragraph($stack, $state); } } if (($state->{'menu_entry'} and !$menu_description_in_format) or $state->{'raw'} or $state->{'preformatted'} or $state->{'no_paragraph'} or $state->{'keep_texi'} or $state->{'remove_texi'}) { # empty lines are left unmodified if (/^\s*$/) { add_prev($text, $stack, $_); return; } else { my $next_tag = next_tag($_); if ($state->{'deff'} and !defined($Texi2HTML::Config::def_map{$next_tag})) { begin_deff_item($stack, $state); } } } else { #FIXME @syncodeindex cp fn # on a line should also end paragraphs. if (/^\s*$/) { #ignore the line if it just follows a deff return if ($state->{'deff'}); if ($state->{'paragraph'}) { # An empty line ends a paragraph close_paragraph($text, $stack, $state, $line_nr); add_prev($text, $stack, &$Texi2HTML::Config::empty_line($_)); return 1; } else { add_prev($text, $stack, &$Texi2HTML::Config::empty_line($_)); return 1; } } else { #print STDERR "a line not empty and not in no paragraph format\n"; my $next_tag = next_tag($_); if ($state->{'deff'} and !defined($Texi2HTML::Config::def_map{$next_tag})) { # finish opening the deff, as this is not a deff tag, it can't be # a deff macro with x begin_deff_item($stack, $state); } #print STDERR "NEXT_TAG $next_tag:$_"; if (!no_paragraph($state,$_)) { # index entries, @html and @* don't trigger new paragraph beginning # otherwise we begin a new paragraph #print STDERR "begin paragraph\n"; begin_paragraph($stack, $state); } } } while(1) { # scan_line #print STDERR "WHILE: $_"; #dump_stack($text, $stack, $state); # we're in a raw format (html, tex if !L2H, verbatim) if (defined($state->{'raw'})) { (dump_stack($text, $stack, $state), die "Bug for raw ($state->{'raw'})") if (! @$stack or ! ($stack->[-1]->{'style'} eq $state->{'raw'})); if (s/^(.*?)\@end\s$state->{'raw'}$// or s/^(.*?)\@end\s$state->{'raw'}\s+//) # don't protect html, it is done by Texi2HTML::Config::raw if needed { print STDERR "# end raw $state->{'raw'}\n" if ($T2H_DEBUG & $DEBUG_FORMATS); add_prev ($text, $stack, $1); my $style = pop @$stack; if ($style->{'text'} !~ /^\s*$/) { if ($state->{'remove_texi'}) { add_prev ($text, $stack, $style->{'text'}); } elsif ($state->{'keep_texi'}) { add_prev ($text, $stack, $style->{'text'} . "\@end $state->{'raw'}"); } else { add_prev($text, $stack, &$Texi2HTML::Config::raw($style->{'style'}, $style->{'text'})); } } if (!$state->{'keep_texi'} and !$state->{'remove_texi'}) { # reopen preformatted if it was interrupted by the raw format # if raw format is html the preformatted wasn't interrupted begin_paragraph($stack, $state) if ($state->{'preformatted'} and (!$Texi2HTML::Config::format_in_paragraph{$state->{'raw'}})); delete $state->{'raw'}; return if (/^\s*$/); } delete $state->{'raw'}; next; } else { print STDERR "#within raw $state->{'raw'}:$_" if ($T2H_DEBUG & $DEBUG_FORMATS); add_prev ($text, $stack, $_); last; } } # we are within a @verb if (defined($state->{'verb'})) { my $char = quotemeta($state->{'verb'}); if (s/^(.*?)$char\}/\}/) { if ($state->{'keep_texi'}) { add_prev($text, $stack, $1 . $state->{'verb'}); $stack->[-1]->{'text'} = $state->{'verb'} . $stack->[-1]->{'text'}; } elsif ($state->{'remove_texi'}) { add_prev($text, $stack, $1); } else { add_prev($text, $stack, do_text($1, $state)); } delete $state->{'verb'}; next; } else { add_prev($text, $stack, $_); last; } } # We handle now the end tags if ($state->{'keep_texi'} and s/^([^{}@]*)\@end\s+([a-zA-Z]\w*)//) { my $end_tag = $2; add_prev($text, $stack, $1 . "\@end $end_tag"); next; } elsif ($state->{'remove_texi'} and s/^([^{}@]*)\@end\s+([a-zA-Z]\w*)//) { add_prev($text, $stack, $1); next; } if (s/^([^{}@,]*)\@end\s+([a-zA-Z]\w*)\s// or s/^([^{}@,]*)\@end\s+([a-zA-Z]\w*)$//) { add_prev($text, $stack, do_text($1, $state)); my $end_tag = $2; #print STDERR "END_MACRO $end_tag\n"; #dump_stack ($text, $stack, $state); # First we test if the stack is not empty. # Then we test if the end tag is a format tag. # If so, we close the styles. # We then close paragraphs and preformatted at top of the stack. # We handle the end tag (even when it was not the tag which appears # on the top of the stack; in that case we close anything # until that element) $state->{'detailmenu'}-- if ($end_tag eq 'detailmenu' and $state->{'detailmenu'}); # FIXME handle in sub skip next if (defined($Texi2HTML::Config::misc_command{"end $end_tag"})); my $top_stack = top_stack($stack); if (!$top_stack) { echo_error ("\@end $end_tag without corresponding opening", $line_nr); add_prev($text, $stack, "\@end $end_tag"); next; } if (!$format_type{$end_tag}) { echo_warn ("Unknown \@end $end_tag", $line_nr); #warn "$ERROR Unknown \@end $end_tag\n"; add_prev($text, $stack, "\@end $end_tag"); next; } unless ($Texi2HTML::Config::format_in_paragraph{$end_tag}) { close_paragraph($text, $stack, $state, $line_nr); } $top_stack = top_stack($stack); if (!$top_stack or (!defined($top_stack->{'format'}))) { echo_error ("\@end $end_tag without corresponding opening element", $line_nr); add_prev($text, $stack, "\@end $end_tag"); next; } # Warn if the format on top of stack is not compatible with the # end tag, and find the end tag. unless ( ($top_stack->{'format'} eq $end_tag) or ( ($format_type{$end_tag} eq 'menu') and ( ($top_stack->{'format'} eq 'menu_preformatted') or ($top_stack->{'format'} eq 'menu_comment') or ($top_stack->{'format'} eq 'menu_description') ) ) or ( ($end_tag eq 'multitable') and ( ($top_stack->{'format'} eq 'cell') or ($top_stack->{'format'} eq 'null') ) ) or ( ($format_type{$end_tag} eq 'list' ) and ($top_stack->{'format'} eq 'item') ) or ( ( ($format_type{$end_tag} eq 'table') and ($end_tag ne 'multitable') ) and ( ($top_stack->{'format'} eq 'term') or ($top_stack->{'format'} eq 'line') ) ) or ( (defined($Texi2HTML::Config::def_map{$end_tag})) and ($top_stack->{'format'} eq 'deff_item') ) or ( ($end_tag eq 'row') and ($top_stack->{'format'} eq 'cell') ) ) { my $waited_format = $top_stack->{'format'}; $waited_format = $fake_format{$top_stack->{'format'}} if ($format_type{$top_stack->{'format'}} eq 'fake'); echo_error ("waiting for end of $waited_format, found \@end $end_tag", $line_nr); close_stack($text, $stack, $state, $line_nr, undef, $end_tag); # an empty preformatted may appear when closing things as # when closed, formats reopen the preformatted environment # in case there is some text following, but we know it isn't # the case here, thus we can close paragraphs. close_paragraph($text, $stack, $state); my $new_top_stack = top_stack($stack); next unless ($new_top_stack and defined($new_top_stack->{'format'}) and (($new_top_stack->{'format'} eq $end_tag) or (($format_type{$new_top_stack->{'format'}} eq 'fake') and ($fake_format{$new_top_stack->{'format'}} eq $format_type{$end_tag})))); } # We should now be able to handle the format if (defined($format_type{$end_tag}) and $format_type{$end_tag} ne 'fake') { end_format($text, $stack, $state, $end_tag, $line_nr); } else { # this is a fake format, ie a format used internally, inside # a real format. We do nothing, hoping the real format will # get closed, closing the fake internal formats #print STDERR "FAKE \@end $end_tag\n"; #add_prev($text, $stack, "\@end $end_tag"); } next; } # This is a macro #elsif (s/^([^{}@]*)\@([a-zA-Z]\w*|["'~\@\}\{,\.!\?\s\*\-\^`=:\/])//o) elsif (s/^([^{},@]*)\@(["'~\@\}\{,\.!\?\s\*\-\^`=:\|\/])//o or s/^([^{}@,]*)\@([a-zA-Z]\w*)([\s\{\}\@])/$3/o or s/^([^{},@]*)\@([a-zA-Z]\w*)$//o) { add_prev($text, $stack, do_text($1, $state)); my $macro = $2; #print STDERR "MACRO $macro\n"; #dump_stack ($text, $stack, $state); # This is a macro added by close_stack to mark paragraph end if ($macro eq 'end_paragraph') { my $top_stack = top_stack($stack); if (!$top_stack or !$top_stack->{'format'} or ($top_stack->{'format'} ne 'paragraph')) { print STDERR "Bug: end_paragraph but no paragraph to end\n"; dump_stack ($text, $stack, $state); next; } s/^\s//; my $paragraph = pop @$stack; add_prev ($text, $stack, do_paragraph($paragraph->{'text'}, $state)); next; } # Handle macro added by close_stack to mark preformatted region end elsif ($macro eq 'end_preformatted') { my $top_stack = top_stack($stack); if (!$top_stack or !$top_stack->{'format'} or ($top_stack->{'format'} ne 'preformatted')) { print STDERR "Bug: end_preformatted but no preformatted to end\n"; dump_stack ($text, $stack, $state); next; } my $paragraph = pop @$stack; s/^\s//; add_prev ($text, $stack, do_preformatted($paragraph->{'text'}, $state)); next; } if (defined($Texi2HTML::Config::misc_command{$macro})) { # This strange condition is there because for an argument # appearing on an @itemize line, appended to an @item # we don't want to keep @c or @comment as otherwise it eats # the line. Other commands could do that too but then the user # deserves what he gets. if (($state->{'keep_texi'} and (!$state->{'check_item'} or ($macro ne 'c' and $macro ne 'comment'))) or $state->{'remove_texi'}) { my ($line, $args); ($_, $line, $args) = preserve_command($_, $macro); if ($state->{'keep_texi'}) { add_prev($text, $stack, $line); } next; } my $keep = $Texi2HTML::Config::misc_command{$macro}->{'keep'}; $_ = misc_command_text($_, $macro, $stack, $state, $text, $line_nr); return unless (defined($_)); unless ($keep) { begin_paragraph($stack, $state) if (!no_paragraph($state,$_)); next; } } # if ($macro eq 'sp') # { # my ($space1, $sp_number, $space2); # if (s/^(\s+)(\d+)(\s*)//) # { # $space1 = $1; # $sp_number = $2; # $space2 = $3; # } # elsif (s/(\s*)$//) # { # $space1 = $1; # $sp_number = ''; # $space2 = ''; # } # else # { # next if ($state->{'remove_texi'}); # if ($state->{'keep_texi'}) # { # add_prev($text, $stack, "\@$macro"); # next; # } # echo_error ("\@$macro needs a numeric arg or no arg", $line_nr); # next; # } # next if ($state->{'remove_texi'}); # if ($state->{'keep_texi'}) # { # add_prev($text, $stack, "\@$macro" . $space1 . $sp_number . $space2); # next; # } # $sp_number = 1 if ($sp_number eq ''); # add_prev($text, $stack, &$Texi2HTML::Config::sp($sp_number, $state->{'preformatted'})); # next; # } #if ($macro eq 'verbatiminclude' or $macro eq 'listoffloats') if ($macro eq 'listoffloats') { if ($state->{'keep_texi'}) { if (s/(.*)//o) { add_prev($text, $stack, "\@$macro" . $1); } next; } return undef if ($state->{'remove_texi'}); if (s/^(\s+)(.*)//o) { my $arg = $2; # if ($macro eq 'verbatiminclude') # { # my $file = locate_include_file($arg); # if (defined($file)) # { # if (!open(VERBINCLUDE, $file)) # { # echo_warn ("Can't read file $file: $!",$line_nr); # } # else # { # my $verb_text = ''; # while (my $line = ) # { # $verb_text .= $line; # } # add_prev($text, $stack, &$Texi2HTML::Config::raw('verbatim',$verb_text)); # close VERBINCLUDE; # } # } # else # { # echo_error ("Can't find $arg, skipping", $line_nr); # } # } # elsif ($macro eq 'listoffloats') # { my $style_id = cross_manual_line (normalise_space($arg)); my $style = substitute_line (&$Texi2HTML::Config::listoffloats_style($arg)); if (exists ($floats{$style_id})) { close_paragraph($text, $stack, $state, $line_nr); my @listoffloats_entries = (); foreach my $float (@{$floats{$style_id}->{'floats'}}) { my $float_style = substitute_line(&$Texi2HTML::Config::listoffloats_float_style($arg, $float)); my $caption_lines = &$Texi2HTML::Config::listoffloats_caption($float); my $caption = substitute_text({ 'multiple_pass' => 1 }, @$caption_lines); push @listoffloats_entries, &$Texi2HTML::Config::listoffloats_entry($arg, $float, $float_style, $caption, href($float, $state->{'element'}->{'file'})); } add_prev($text, $stack, &$Texi2HTML::Config::listoffloats($arg, $style, \@listoffloats_entries)); } else { echo_warn ("Unknown float style $arg", $line_nr); } # } } else { echo_error ("Bad \@$macro line: $_", $line_nr); } return undef; } # This is a @macroname{...} construct. We add it on top of stack # It will be handled when we encounter the '}' if (s/^{//) { if ($macro eq 'verb') { if (/^$/) { # Allready warned #warn "$ERROR verb at end of line"; } else { s/^(.)//; $state->{'verb'} = $1; } } #FIXME what to do if remove_texi and anchor/ref/footnote ? elsif ($macro eq 'm_cedilla' and !$state->{'keep_texi'}) { $macro = ','; } push (@$stack, { 'style' => $macro, 'text' => '', 'arg_nr' => 0 }); $state->{'no_paragraph'}++ if ($no_paragraph_macro{$macro}); open_arg($macro, 0, $state); push (@{$state->{'style_stack'}}, $macro) if (defined($style_type{$macro}) and (($style_type{$macro} eq 'style') or ($style_type{$macro} eq 'accent'))); next; } # special case if we are checking items if ($state->{'check_item'} and ($macro =~ /^itemx?$/ or $macro eq 'headitem')) { echo_error("\@$macro on \@$state->{'check_item'} line", $line_nr); next; } # if we're keeping texi unmodified we can do it now if ($state->{'keep_texi'}) { # We treat specially formats accepting {} on command line if ($macro eq 'multitable' or defined($Texi2HTML::Config::def_map{$macro})) { add_prev($text, $stack, "\@$macro" . $_); $_ = ''; next; } # @ at the end of line may protect te end of line even when # keeping texi if ($macro eq "\n") { $state->{'end_of_line_protected'} = 1; #print STDERR "PROTECTING END OF LINE\n"; } add_prev($text, $stack, "\@$macro"); if ($text_macros{$macro} and $text_macros{$macro} eq 'raw') { $state->{'raw'} = $macro; push (@$stack, {'style' => $macro, 'text' => ''}); } next; } # If we are removing texi, the following macros are not removed # as is but modified # a raw macro beginning if ($text_macros{$macro} and $text_macros{$macro} eq 'raw') { if (!$Texi2HTML::Config::format_in_paragraph{$macro}) { # close paragraph before verbatim (and tex if !L2H) close_paragraph($text, $stack, $state, $line_nr); } $state->{'raw'} = $macro; push (@$stack, {'style' => $macro, 'text' => ''}); return if (/^\s*$/); next; } my $simple_macro = 1; # An accent macro if (exists($Texi2HTML::Config::accent_map{$macro})) { if (s/^(\S)//o) { add_prev($text, $stack, do_simple($macro, $1, $state, [ $1 ], $line_nr)); } else { # The accent is at end of line add_prev($text, $stack, do_text($macro, $state)); } } # an @-command which should be like @command{}. We handle it... elsif ($things_map_ref->{$macro}) { echo_warn ("$macro requires {}", $line_nr); add_prev($text, $stack, do_simple($macro, '', $state)); } # an @-command like @command elsif (defined($simple_map_ref->{$macro})) { add_prev($text, $stack, do_simple($macro, '', $state)); } else { $simple_macro = 0; } if ($simple_macro) {# if the macro didn't triggered a paragraph start it might now begin_paragraph($stack, $state) if ($no_line_macros{$macro} and !no_paragraph($state,$_)); next; } # the following macros are not modified but just ignored # if we are removing texi if ($macro =~ /^tex_(\d+)$/o) { add_prev($text, $stack, Texi2HTML::LaTeX2HTML::do_tex($1)); next; } if ($state->{'remove_texi'}) { if ((($macro =~ /^(\w+?)index$/) and ($1 ne 'print')) or ($macro eq 'itemize') or ($macro =~ /^(|v|f)table$/) or ($macro eq 'multitable') or ($macro eq 'quotation')) { return; } elsif ($macro eq 'enumerate') { my $spec; ($_, $spec) = parse_enumerate ($_); return if (/^\s*$/); next; } elsif (defined($Texi2HTML::Config::def_map{$macro})) { my ($style, $category, $name, $type, $class, $arguments); ($style, $category, $name, $type, $class, $arguments) = parse_def($macro, $_, $line_nr); # FIXME maybe a call to substitute_line with state would # be better ? $category = remove_texi($category) if (defined($category)); # FIXME -- --- ''... should be protected (not by makeinfo) $name = remove_texi($name) if (defined($name)); # FIXME -- --- ''... should be protected (not by makeinfo) $type = remove_texi($type) if (defined($type)); # FIXME -- --- ''... should be protected (not by makeinfo) $class = remove_texi($class) if (defined($class)); # FIXME -- --- ''... should be protected $arguments = remove_texi($arguments) if (defined($arguments)); chomp($arguments); add_prev($text, $stack, &$Texi2HTML::Config::def_line_no_texi($category, $name, $type, $arguments)); return; } next; } if (($macro =~ /^(\w+?)index$/) and ($1 ne 'print')) { add_prev($text, $stack, do_index_entry_label($state,$line_nr)); return; } # a macro which triggers paragraph closing if ($macro eq 'insertcopying') { close_paragraph($text, $stack, $state, $line_nr); add_prev($text, $stack, do_insertcopying($state)); # reopen a preformatted format if it was interrupted by the macro begin_paragraph ($stack, $state) if ($state->{'preformatted'}); return; } if ($macro =~ /^itemx?$/ or ($macro eq 'headitem')) { #print STDERR "ITEM: $_"; #dump_stack($text, $stack, $state); # these functions return true if the context was their own abort_empty_preformatted($stack, $state); # FIXME let the user be able not to close the paragraph close_paragraph($text, $stack, $state, $line_nr); my $format; if ($format = add_item($text, $stack, $state, $line_nr, $_)) { # handle lists } elsif ($format = add_term($text, $stack, $state, $line_nr)) {# handle table } elsif ($format = add_line($text, $stack, $state, $line_nr)) {# handle table } if ($format) { if (defined($format->{'appended'})) { $_ = $format->{'appended'} . ' ' . $_ if ($format->{'appended'} ne ''); } if (defined($format->{'command'})) { open_arg($format->{'command'},0, $state); } next; } $format = add_row ($text, $stack, $state, $line_nr); # handle multitable unless ($format) { echo_warn ("\@$macro outside of table or list", $line_nr); next; } push @$stack, {'format' => 'row', 'text' => '', 'item_cmd' => $macro }; if ($format->{'max_columns'}) { push @$stack, {'format' => 'cell', 'text' => ''}; $format->{'cell'} = 1; if (!no_paragraph($state,$_) or automatic_preformatted($state,$macro)) { begin_paragraph($stack, $state); } } else { echo_warn ("\@$macro in empty multitable", $line_nr); } next; } if ($macro eq 'tab') { # FIXME let the user be able not to close the paragraph abort_empty_preformatted($stack, $state); close_paragraph($text, $stack, $state, $line_nr); my $format = add_cell ($text, $stack, $state); #print STDERR "tab, $format->{'cell'}, max $format->{'max_columns'}\n"; if (!$format) { echo_warn ("\@tab outside of multitable", $line_nr); #warn "$WARN \@tab outside of multitable\n"; } elsif (!$format->{'max_columns'}) { echo_warn ("\@$macro in empty multitable", $line_nr); #warn "$WARN \@$macro in empty multitable\n"; push @$stack, {'format' => 'null', 'text' => ''}; next; } elsif ($format->{'cell'} > $format->{'max_columns'}) { echo_warn ("too much \@$macro (multitable has only $format->{'max_columns'} column(s))", $line_nr); #warn "$WARN cell over table width\n"; push @$stack, {'format' => 'null', 'text' => ''}; next; } else { push @$stack, {'format' => 'cell', 'text' => ''}; } if (!no_paragraph($state,$_) or automatic_preformatted($state,$macro)) { begin_paragraph($stack, $state); } next; } # Macro opening a format (table, list, deff, example...) if ($format_type{$macro} and ($format_type{$macro} ne 'fake')) { unless ($Texi2HTML::Config::format_in_paragraph{$macro}) { close_paragraph($text, $stack, $state, $line_nr); } #print STDERR "begin $macro\n"; # A deff like macro if (defined($Texi2HTML::Config::def_map{$macro})) { if ($state->{'deff'} and ("$state->{'deff'}->{'command'}x" eq $macro)) { $macro =~ s/x$//o; #print STDERR "DEFx $macro\n"; } else { # The previous @def command isn't the same @def # command. We begin the item for the previous @def # command and immediatly open the new one. begin_deff_item($stack, $state, 1) if ($state->{'deff'}); $macro =~ s/x$//o; #print STDERR "DEF begin $macro\n"; push @$stack, { 'format' => $macro, 'text' => '' }; } #print STDERR "BEGIN_DEFF $macro\n"; #dump_stack ($text, $stack, $state); $state->{'deff'}->{'command'} = $macro; my ($style, $category, $name, $type, $class, $arguments); #($style, $category, $name, $type, $class, $arguments) = parse_def($macro, $_, $line_nr); ($style, $category, $name, $type, $class, $_) = parse_def($macro, $_, $line_nr); #print STDERR "AFTER parse_def $_"; # duplicate_state ? #$category = substitute_line($category) if (defined($category)); $state->{'deff'}->{'style'} = $style; $state->{'deff'}->{'category'} = substitute_line($category) if (defined($category)); # FIXME -- --- ''... should be protected (not by makeinfo) #$name = substitute_line($name) if (defined($name)); $state->{'deff'}->{'name'} = substitute_line($name) if (defined($name)); # FIXME -- --- ''... should be protected (not by makeinfo) #$type = substitute_line($type) if (defined($type)); $state->{'deff'}->{'type'} = substitute_line($type) if (defined($type)); # FIXME -- --- ''... should be protected (not by makeinfo) #$class = substitute_line($class) if (defined($class)); $state->{'deff'}->{'class'} = substitute_line($class) if (defined($class)); # FIXME -- --- ''... should be protected open_cmd_line($stack, $state, ['keep'], \&do_def_line); next; #$arguments = substitute_line($arguments) if (defined($arguments)); #$category = &$Texi2HTML::Config::definition_category($category, $class, $style); #if (! $category) # category cannot be 0 #{ # echo_warn("Bad definition line $_", $line_nr); # return; #} #my $index_label = main::do_index_entry_label ($state) if ($name ne ''); #add_prev ($text, $stack, &$Texi2HTML::Config::def_line($category, $name, $type, $arguments, $index_label)); #return; } elsif ($format_type{$macro} eq 'menu') { # if we are allready in a menu we must close it first # in order to close the menu comments and entries close_menu($text, $stack, $state, $line_nr); $state->{'menu'}++; push @$stack, { 'format' => $macro, 'text' => '' }; if ($state->{'preformatted'}) { # Start a fake complex format in order to have a given pre style $state->{'preformatted'}++; push @$stack, { 'format' => 'menu_preformatted', 'text' => '', 'pre_style' => $Texi2HTML::Config::MENU_PRE_STYLE }; push @{$state->{'preformatted_stack'}}, {'pre_style' => $Texi2HTML::Config::MENU_PRE_STYLE, 'class' => 'menu-preformatted' }; } } elsif (exists ($Texi2HTML::Config::complex_format_map->{$macro})) { $state->{'preformatted'}++; my $format = { 'format' => $macro, 'text' => '', 'pre_style' => $Texi2HTML::Config::complex_format_map->{$macro}->{'pre_style'} }; push @{$state->{'preformatted_stack'}}, {'pre_style' =>$Texi2HTML::Config::complex_format_map->{$macro}->{'pre_style'}, 'class' => $macro }; push @$stack, $format; unless ($Texi2HTML::Config::format_in_paragraph{$macro}) { begin_paragraph($stack, $state); } } elsif ($Texi2HTML::Config::paragraph_style{$macro}) { # if there are only spaces after the @center, then the end # of line has allready been removed and the code triggered # by end of line for @center closing won't be called. # thus we don't open it (opening @center means pushing it # on the paragraph_style stack) next if (($macro eq 'center') and /^\s*$/); push @{$state->{'paragraph_style'}}, $macro; push (@$stack, { 'format' => $macro, 'text' => '' }) unless ($macro eq 'center'); if (!no_paragraph($state,$_) or automatic_preformatted($state,$macro)) { begin_paragraph($stack, $state); } } elsif (($format_type{$macro} eq 'list') or ($format_type{$macro} eq 'table')) { my $format; #print STDERR "BEGIN $macro\n"; #dump_stack($text, $stack, $state); if (($macro eq 'itemize') or ($macro =~ /^(|v|f)table$/)) { my $command; my $appended; ($appended, $command) = parse_format_command($_,$macro); $format = { 'format' => $macro, 'text' => '', 'command' => $command, 'appended' => $appended, 'term' => 0 }; $_ = ''; } elsif ($macro eq 'enumerate') { my $spec; ($_, $spec) = parse_enumerate ($_); $spec = 1 if (!defined($spec)); $format = { 'format' => $macro, 'text' => '', 'spec' => $spec, 'item_nr' => 0 }; } elsif ($macro eq 'multitable') { my $max_columns = parse_multitable ($_, $line_nr); if (!$max_columns) { echo_warn ("empty multitable", $line_nr); #warn "$WARN empty multitable\n"; $max_columns = 0; } $format = { 'format' => $macro, 'text' => '', 'max_columns' => $max_columns, 'cell' => 1 }; } $format->{'first'} = 1; $format->{'paragraph_number'} = 0; push @$stack, $format; push @{$state->{'format_stack'}}, $format; if ($macro =~ /^(|v|f)table$/) { push @$stack, { 'format' => 'line', 'text' => ''}; } elsif ($macro eq 'multitable') { if ($format->{'max_columns'}) { push @$stack, { 'format' => 'row', 'text' => '', 'item_cmd' => $macro }; push @$stack, { 'format' => 'cell', 'text' => ''}; } else { # multitable without row... We use the special null # format which content is ignored push @$stack, { 'format' => 'null', 'text' => ''}; push @$stack, { 'format' => 'null', 'text' => ''}; } } if ($format_type{$macro} eq 'list') { push @$stack, { 'format' => 'item', 'text' => ''}; } if (($macro ne 'multitable') and !no_paragraph($state,$_) or automatic_preformatted($state,$macro)) { begin_paragraph($stack, $state); } return if ($format_type{$macro} eq 'table' or $macro eq 'itemize'); } elsif ($macro eq 'float' or $macro eq 'quotation') { push @$stack, {'format' => $macro, 'text' => '' }; if ($macro eq 'float') { open_cmd_line($stack, $state, ['keep','keep'], \&do_float_line); } elsif ($macro eq 'quotation') { open_cmd_line($stack, $state, ['keep','keep'], \&do_quotation_line); } #print STDERR "Begin cmd_line\n"; #dump_stack($text, $stack, $state); next; } # keep this one at the end as there are some other formats # which are also in format_map elsif (defined($Texi2HTML::Config::format_map{$macro}) or ($format_type{$macro} eq 'cartouche')) { push @$stack, { 'format' => $macro, 'text' => '' }; if (!no_paragraph($state,$_) or automatic_preformatted($state,$macro)) { begin_paragraph($stack, $state); } } return if (/^\s*$/); next; } $_ = do_unknown ($macro, $_, $text, $stack, $state, $line_nr); next; } elsif(s/^([^{}@,]*)\@([^\s\}\{\@]*)//o) { # A macro with a character which shouldn't appear in macro name add_prev($text, $stack, do_text($1, $state)); $_ = do_unknown ($2, $_, $text, $stack, $state, $line_nr); #add_prev($text, $stack, do_text($1 ."\@$2", $state)); next; } elsif (s/^([^{},]*)([{}])//o or ($state->{'cmd_line'} and /^([^{},]*)$/)) { my $leading_text = $1; my $brace = $2; if (!defined($brace))#in a command line { if (/^$/ and $state->{'end_of_line_protected'} and $state->{'deff'}) { return; } chomp $leading_text; } # a brace closed, at the end of line. If in cmd_line we remove # the end of line, such that the end of line is detected elsif ($state->{'cmd_line'} and /^$/) { chomp $_; } add_prev($text, $stack, do_text($leading_text, $state)); #if ($state->{'cmd_line'}){print STDERR "CMD_LINE\n"; dump_stack($text, $stack, $state);} if (defined($brace) and ($brace eq '{')) { add_prev($text, $stack, '{'); unless ($state->{'keep_texi'} or $state->{'remove_texi'}) { echo_error ("'{' without macro before: $_", $line_nr); } } else { # A @macroname{ ...} is closed if (@$stack and defined($stack->[-1]->{'style'})) { my $macro = $stack->[-1]->{'style'}; if (($macro eq 'cmd_line') and $brace and ($brace eq '}')) { add_prev($text, $stack, '}'); unless ($state->{'keep_texi'} or $state->{'remove_texi'}) { echo_error ("A '}' without opening '{' before: $_", $line_nr); } next; } my $style = pop @$stack; my $result; if (ref($style_map_ref->{$macro}) eq 'HASH') { push (@{$style->{'args'}}, $style->{'text'}); $style->{'fulltext'} .= $style->{'text'}; my $number = 0; #foreach my $arg(@{$style->{'args'}}) #{ #print STDERR " $number: $arg\n"; # $number++; #} $style->{'text'} = $style->{'fulltext'}; $state->{'keep_texi'} = 0 if (#$state->{'keep_texi'} ($style_map_ref->{$macro}->{'args'}->[$style->{'arg_nr'}] eq 'keep') and ($state->{'keep_nr'} == 1)); } $state->{'no_paragraph'}-- if ($no_paragraph_macro{$macro}); if ($macro) { $style->{'no_close'} = 1 if ($state->{'no_close'}); if ($state->{'keep_texi'}) { # don't expand macros in anchor and ref close_arg ($macro, $style->{'arg_nr'}, $state); $result = '@' . $macro . '{' . $style->{'text'} . '}'; } else { if ($style_map_ref->{$macro} and !$style->{'no_close'} and (defined($style_type{'$macro'})) and (($style_type{'$macro'} eq 'style') or ($style_type{'$macro'} eq 'accent'))) { my $style = pop @{$state->{'style_stack'}}; print STDERR "Bug: $style on 'style_stack', not $macro\n" if ($style ne $macro); } $result = do_simple($macro, $style->{'text'}, $state, $style->{'args'}, $line_nr, $style->{'no_open'}, $style->{'no_close'}); if ($state->{'code_style'} < 0) { echo_error ("Bug: negative code_style: $state->{'code_style'}, line:$_", $line_nr); } } } else { #$result = $style->{'text'} . '}'; print STDERR "Bug: empty style in pass_text\n"; } add_prev($text, $stack, $result); if ($state->{'cmd_line'} and ($style->{'style'} eq 'cmd_line')) { if ($state->{'deff'}) { #print STDERR "DO DEFF $state->{'deff'}->{'command'} $state->{'deff'}->{'arguments'}\n"; my $def_style = $state->{'deff'}->{'style'}; my $category = $state->{'deff'}->{'category'}; my $class = $state->{'deff'}->{'class'}; my $type = $state->{'deff'}->{'type'}; my $name = $state->{'deff'}->{'name'}; #my $arguments = $state->{'deff'}->{'arguments'}; my $arguments; $arguments = substitute_line($state->{'deff'}->{'arguments'}) if (defined($state->{'deff'}->{'arguments'})); $category = &$Texi2HTML::Config::definition_category($category, $class, $def_style); if (! $category) # category cannot be 0 { echo_warn("Bad definition line $_", $line_nr); delete $state->{'cmd_line'}; return ''; } my $index_label = do_index_entry_label ($state,$line_nr) if ($name ne ''); add_prev($text, $stack, &$Texi2HTML::Config::def_line($category, $name, $type, $arguments, $index_label)); } else # we've got to mark paragraph here as the following # line will determine whether or not we open a paragraph { $state->{'open_paragraph'} = 1; } delete $state->{'cmd_line'}; $state->{'no_paragraph'}--; return; } next; } else { echo_error("'}' without opening '{' before: $_", $line_nr); # we cannot be in cmd_line as the stack is empty if ($state->{'cmd_line'}) { print STDERR "Bug: state->{'cmd_line'} true but stack empty\n"; dump_stack($text, $stack, $state); delete $state->{'cmd_line'}; } add_prev($text, $stack, '}') if ($state->{'keep_texi'}); } } } elsif (s/^([^,]*)([,])//o) { add_prev($text, $stack, do_text($1, $state)); my $comma = $2; if ($state->{'cmd_line'} and !@$stack) { print STDERR "Bug: state->{'cmd_line'} = $state->{'cmd_line'} but no stack\n"; dump_stack($text, $stack, $state); } if (@$stack and defined($stack->[-1]->{'style'}) and (ref($style_map_ref->{$stack->[-1]->{'style'}}) eq 'HASH')) { my $macro = $stack->[-1]->{'style'}; my $style_args = $style_map_ref->{$macro}->{'args'}; if (defined($style_args->[$stack->[-1]->{'arg_nr'} + 1])) { push (@{$stack->[-1]->{'args'}}, $stack->[-1]->{'text'}); $stack->[-1]->{'fulltext'} .= $stack->[-1]->{'text'} . do_text(',', $state); $stack->[-1]->{'text'} = ''; close_arg ($macro, $stack->[-1]->{'arg_nr'}, $state); $stack->[-1]->{'arg_nr'}++; open_arg ($macro, $stack->[-1]->{'arg_nr'}, $state); next; } } add_prev($text, $stack, do_text(',', $state)); } else { # no macro nor '}', but normal text add_prev($text, $stack, do_text($_, $state)); #print STDERR "END LINE: $_"; #dump_stack($text, $stack, $state); # @item line is closed by end of line add_term($text, $stack, $state, $line_nr); # FIXME test @center @item and @item @center if ($state->{'paragraph_style'}->[-1] eq 'center' and !$state->{'close_stack'}) { close_paragraph($text, $stack, $state, $line_nr); pop @{$state->{'paragraph_style'}}; #$_ = $/ if (chomp($_)); $_ = ''; next; } last; } } return 1; } sub open_arg($$$) { my $macro = shift; my $arg_nr = shift; my $state = shift; if (ref($style_map_ref->{$macro}) eq 'HASH') { my $arg = $style_map_ref->{$macro}->{'args'}->[$arg_nr]; if ($arg eq 'code' and !$state->{'keep_texi'}) { $state->{'code_style'}++; } elsif ($arg eq 'keep') { $state->{'keep_nr'}++; $state->{'keep_texi'} = 1; } } elsif ($code_style_map{$macro} and !$state->{'keep_texi'}) { $state->{'code_style'}++; } } sub close_arg($$$) { my $macro = shift; my $arg_nr = shift; my $state = shift; if (ref($style_map_ref->{$macro}) eq 'HASH') { my $arg = $style_map_ref->{$macro}->{'args'}->[$arg_nr]; if ($arg eq 'code' and !$state->{'keep_texi'}) { $state->{'code_style'}--; } elsif ($arg eq 'keep') { $state->{'keep_nr'}--; $state->{'keep_texi'} = 0 if ($state->{'keep_nr'} == 0); } #print STDERR "c $arg_nr $macro $arg $state->{'code_style'}\n"; } elsif ($code_style_map{$macro} and !$state->{'keep_texi'}) { $state->{'code_style'}--; } } sub open_cmd_line($$$$) { my $stack = shift; my $state = shift; my $args = shift; my $function = shift; push @$stack, {'style' => 'cmd_line', 'text' => '', 'arg_nr' => 0}; foreach my $hash (\%Texi2HTML::Config::style_map, \%Texi2HTML::Config::style_map_pre, \%Texi2HTML::Config::style_map_texi, \%Texi2HTML::Config::unformatted_text_style_map_texi) { $hash->{'cmd_line'}->{'args'} = $args; $hash->{'cmd_line'}->{'function'} = $function; } $state->{'no_paragraph'}++; open_arg ('cmd_line', 0, $state); $state->{'cmd_line'} = 1; } sub get_value($) { my $value = shift; return $value{$value} if ($value{$value}); return "No value for $value"; } sub add_term($$$$;$) { my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; my $end = shift; return unless (exists ($state->{'format_stack'})); my $format = $state->{'format_stack'}->[-1]; return unless (($format_type{$format->{'format'}} eq 'table') and ($format->{'format'} ne 'multitable' ) and $format->{'term'}); #print STDERR "ADD_TERM\n"; # we set 'term' = 0 early such that if we encounter an end of line # during close_stack we don't try to do the term once more $state->{'format_stack'}->[-1]->{'term'} = 0; $format->{'paragraph_number'} = 0; # no
     allowed in 
    , thus it is possible there is a @t added # to have teletype in preformatted. if ($state->{'preformatted'} and $stack->[-1]->{'style'} and ($stack->[-1]->{'style'} eq 't')) { my $style = pop @$stack; add_prev($text, $stack, do_simple($style->{'style'}, $style->{'text'}, $state, [$style->{'text'}])); } #dump_stack($text, $stack, $state); close_stack($text, $stack, $state, $line_nr, undef, 'term'); my $term = pop @$stack; my $command_formatted; chomp ($term->{'text'}); if (exists($style_map_ref->{$format->{'command'}}) and !exists($Texi2HTML::Config::special_list_commands{$format->{'format'}}->{$format->{'command'}}) and ($style_type{$format->{'command'}} eq 'style')) { my $leading_spaces = ''; my $trailing_spaces = ''; $term->{'text'} =~ s/^(\s*)//; $leading_spaces = $1 if (defined($1)); $term->{'text'} =~ s/(\s*)$//; $trailing_spaces = $1 if (defined($1)); $term->{'text'} = do_simple($format->{'command'}, $term->{'text'}, $state, [$term->{'text'}]); $term->{'text'} = $leading_spaces. $term->{'text'} .$trailing_spaces; } elsif (exists($things_map_ref->{$format->{'command'}})) { $command_formatted = do_simple($format->{'command'}, '', $state); } my $index_label; if ($format->{'format'} =~ /^(f|v)/) { $index_label = do_index_entry_label($state,$line_nr); print STDERR "Bug: no index entry for $text" unless defined($index_label); } add_prev($text, $stack, &$Texi2HTML::Config::table_item($term->{'text'}, $index_label,$format->{'format'},$format->{'command'}, $command_formatted)); #add_prev($text, $stack, &$Texi2HTML::Config::table_item($term->{'text'}, $index_entry, $state)); unless ($end) { push (@$stack, { 'format' => 'line', 'text' => '' }); begin_paragraph($stack, $state) if ($state->{'preformatted'}); } return $format; } sub add_row($$$$) { my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; my $format = $state->{'format_stack'}->[-1]; return unless ($format->{'format'} eq 'multitable'); if ($format->{'cell'} > $format->{'max_columns'}) { close_stack($text, $stack, $state, $line_nr, undef, 'null'); pop @$stack; } unless ($format->{'max_columns'}) { # empty multitable pop @$stack; # pop 'row' return $format; } if ($format->{'first'}) { # first row $format->{'first'} = 0; #dump_stack($text, $stack, $state); #if ($stack->[-1]->{'format'} and ($stack->[-1]->{'format'} eq 'paragraph') and ($stack->[-1]->{'text'} =~ /^\s*$/) and ($format->{'cell'} == 1)) if ($stack->[-1]->{'format'} and ($stack->[-1]->{'format'} eq 'cell') and ($stack->[-1]->{'text'} =~ /^\s*$/) and ($format->{'cell'} == 1)) { pop @$stack; pop @$stack; #pop @$stack; return $format; } } add_cell($text, $stack, $state); my $row = pop @$stack; add_prev($text, $stack, &$Texi2HTML::Config::row($row->{'text'}, $row->{'item_cmd'})); return $format; } sub add_cell($$$$) { my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; my $format = $state->{'format_stack'}->[-1]; return unless ($format->{'format'} eq 'multitable'); if ($format->{'cell'} <= $format->{'max_columns'}) { close_stack($text, $stack, $state, $line_nr, undef, 'cell'); my $cell = pop @$stack; my $row = top_stack($stack); print STDERR "Bug: top_stack of cell not a row\n" if (!defined($row) or !defined($row->{'format'}) or ($row->{'format'} ne 'row')); add_prev($text, $stack, &$Texi2HTML::Config::cell($cell->{'text'}, $row->{'item_cmd'})); $format->{'cell'}++; } return $format; } sub add_line($$$$;$) { my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; my $end = shift; my $format = $state->{'format_stack'}->[-1]; return unless ($format_type{$format->{'format'}} eq 'table' and ($format->{'format'} ne 'multitable') and ($format->{'term'} == 0)); #print STDERR "ADD_LINE\n"; #dump_stack($text, $stack, $state); # as in pre the end of line are kept, we must explicitely abort empty # preformatted, close_stack doesn't abort the empty preformatted regions. abort_empty_preformatted($stack, $state) if ($format->{'first'}); close_stack($text, $stack, $state, $line_nr, undef, 'line'); my $line = pop @$stack; $format->{'paragraph_number'} = 0; my $first = 0; $first = 1 if ($format->{'first'}); if ($first) { $format->{'first'} = 0; # we must have
    or
    following
    thus we do a # &$Texi2HTML::Config::table_line here too, although it could have been nice to # have a normal paragraph. add_prev($text, $stack, &$Texi2HTML::Config::table_line($line->{'text'})) if ($line->{'text'} =~ /\S/o); } else { add_prev($text, $stack, &$Texi2HTML::Config::table_line($line->{'text'})); } unless($end) { push (@$stack, { 'format' => 'term', 'text' => '' }); # we cannot have a preformatted in table term (no
     in 
    ) # thus we set teletyped style @t if there is no pre_style push (@$stack, { 'style' => 't', 'text' => '' }) if ($state->{'preformatted'} and (!$state->{'preformatted_stack'}->[-1]->{'pre_style'})); #push (@$stack, { 'style' => $format->{'command'}, 'text' => $format->{'appended'} }); } $format->{'term'} = 1; return $format; } sub add_item($$$$;$) { my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; my $line = shift; my $end = shift; my $format = $state->{'format_stack'}->[-1]; return unless ($format_type{$format->{'format'}} eq 'list'); #print STDERR "ADD_ITEM: \n"; # as in pre the end of line are kept, we must explicitely abort empty # preformatted, close_stack doesn't do that. abort_empty_preformatted($stack, $state) if ($format->{'first'}); close_stack($text, $stack, $state, $line_nr, undef, 'item'); $format->{'paragraph_number'} = 0; if ($format->{'format'} eq 'enumerate') { $format->{'number'} = ''; my $spec = $format->{'spec'}; $format->{'item_nr'}++; if ($spec =~ /^[0-9]$/) { $format->{'number'} = $spec + $format->{'item_nr'} - 1; } else { my $base_letter = ord('a'); $base_letter = ord('A') if (ucfirst($spec) eq $spec); my @letter_ords = decompose(ord($spec) - $base_letter + $format->{'item_nr'} - 1, 26); foreach my $ord (@letter_ords) {#FIXME? we go directly to 'ba' after 'z', and not 'aa' #because 'ba' is 1,0 and 'aa' is 0,0. $format->{'number'} = chr($base_letter + $ord) . $format->{'number'}; } } } #dump_stack ($text, $stack, $state); my $item = pop @$stack; # the element following ol or ul must be li. Thus even though there # is no @item we put a normal item. # don't do an item if it is the first and it is empty if (!$format->{'first'} or ($item->{'text'} =~ /\S/o)) { my $formatted_command; if (defined($format->{'command'}) and exists($things_map_ref->{$format->{'command'}})) { $formatted_command = do_simple($format->{'command'}, '', $state); } #chomp($item->{'text'}); add_prev($text, $stack, &$Texi2HTML::Config::list_item($item->{'text'},$format->{'format'},$format->{'command'}, $formatted_command, $format->{'item_nr'}, $format->{'spec'}, $format->{'number'})); } if ($format->{'first'}) { $format->{'first'} = 0; } # Now prepare the new item unless($end) { push (@$stack, { 'format' => 'item', 'text' => '' }); begin_paragraph($stack, $state) unless (!$state->{'preformatted'} and no_line($line)); } return $format; } # format ``simple'' macros, that is macros without arg or style macros sub do_simple($$$;$$$$) { my $macro = shift; my $text = shift; my $state = shift; my $args = shift; my $line_nr = shift; my $no_open = shift; my $no_close = shift; my $result; my $arg_nr = 0; $arg_nr = @$args - 1 if (defined($args)); #print STDERR "DO_SIMPLE $macro $arg_nr $args @$args\n" if (defined($args)); if (defined($simple_map_ref->{$macro})) { # \n may in certain circumstances, protect end of lines if ($macro eq "\n") { $state->{'end_of_line_protected'} = 1; #print STDERR "PROTECTING END OF LINE\n"; } if ($state->{'keep_texi'}) { return "\@$macro"; } elsif ($state->{'remove_texi'}) { #print STDERR "DO_SIMPLE remove_texi $macro\n"; return $simple_map_texi_ref->{$macro}; } elsif ($state->{'preformatted'}) { return $simple_map_pre_ref->{$macro}; } else { return $simple_map_ref->{$macro}; } } if (defined($things_map_ref->{$macro})) { if ($state->{'keep_texi'}) { $result = "\@$macro" . '{}'; } elsif ($state->{'remove_texi'}) { $result = $texi_map_ref->{$macro}; #print STDERR "DO_SIMPLE remove_texi texi_map $macro\n"; } elsif ($state->{'preformatted'}) { $result = $pre_map_ref->{$macro}; } else { $result = $things_map_ref->{$macro}; } return $result . $text; } elsif (defined($style_map_ref->{$macro})) { if ($state->{'keep_texi'}) { $result = "\@$macro" . '{' . $text . '}'; } else { my $style; if ($state->{'remove_texi'}) { #print STDERR "REMOVE $macro, $style_map_texi_ref->{$macro}, fun $style_map_texi_ref->{$macro}->{'function'} remove cmd " . \&Texi2HTML::Config::t2h_remove_command . " ascii acc " . \&t2h_default_ascii_accent; $style = $style_map_texi_ref->{$macro}; } elsif ($state->{'preformatted'}) { $style = $style_map_pre_ref->{$macro}; } else { $style = $style_map_ref->{$macro}; } if (defined($style)) { # known style $result = &$Texi2HTML::Config::style($style, $macro, $text, $args, $no_close, $no_open, $line_nr, $state, $state->{'style_stack'}); } if (!$no_close) { close_arg($macro,$arg_nr, $state); } } return $result; } # Unknown macro $result = ''; my ($done, $result_text, $message) = &$Texi2HTML::Config::unknown_style($macro, $text); if ($done) { echo_warn($message, $line_nr) if (defined($message)); if (defined($result_text)) { $result = $result_text; } } else { unless ($no_open) { # we warn only if no_open is true, i.e. it is the first time we # close the macro for a multiline macro echo_warn ("Unknown command with braces `\@$macro'", $line_nr); $result = do_text("\@$macro") . "{"; } $result .= $text; $result .= '}' unless ($no_close); } return $result; } sub do_unknown($$$$$$) { my $macro = shift; my $line = shift; my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; my ($result_line, $result, $result_text, $message) = &$Texi2HTML::Config::unknown($macro, $line); if ($result) { add_prev ($text, $stack, $result_text) if (defined($result_text)); echo_warn($message, $line_nr) if (defined($message)); return $result_line; } else { echo_warn ("Unknown command `\@$macro' (left as is)", $line_nr); add_prev ($text, $stack, do_text("\@$macro")); return $line; } } # used only during @macro processing sub add_text($@) { my $string = shift; return if (!defined($string)); foreach my $scalar_ref (@_) { next unless defined($scalar_ref); if (!defined($$scalar_ref)) { $$scalar_ref = $string; } else { $$scalar_ref .= $string; } return; } } sub add_prev ($$$) { my $text = shift; my $stack = shift; my $string = shift; unless (defined($text) and ref($text) eq "SCALAR") { die "text not a SCALAR ref: " . ref($text) . ""; } #if (!defined($stack) or (ref($stack) ne "ARRAY")) #{ # $string = $stack; # $stack = []; #} return if (!defined($string)); if (@$stack) { $stack->[-1]->{'text'} .= $string; return; } if (!defined($$text)) { $$text = $string; } else { $$text .= $string; } } sub close_stack_texi_structure($$$$) { my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; return undef unless (@$stack or $state->{'raw'} or $state->{'macro'} or $state->{'macro_name'} or $state->{'ignored'}); my $stack_level = $#$stack + 1; my $string = ''; if ($state->{'ignored'}) { $string .= "\@end $state->{'ignored'} "; echo_warn ("closing $state->{'ignored'}", $line_nr); } if ($state->{'texi'}) { if ($state->{'macro'}) { $string .= "\@end macro "; echo_warn ("closing macro", $line_nr); } elsif ($state->{'macro_name'}) { $string .= ('}' x $state->{'macro_depth'}) . " "; echo_warn ("closing $state->{'macro_name'} ($state->{'macro_depth'} braces missing)", $line_nr); } elsif ($state->{'verb'}) { echo_warn ("closing \@verb", $line_nr); $string .= $state->{'verb'} . '}'; } elsif ($state->{'raw'}) { echo_warn ("closing \@$state->{'raw'} raw format", $line_nr); $string .= "\@end $state->{'raw'} "; } if ($string ne '') { #print STDERR "scan_texi ($string)\n"; scan_texi ($string, $text, $stack, $state, $line_nr); $string = ''; } } elsif ($state->{'verb'}) { $string .= $state->{'verb'}; } while ($stack_level--) { my $stack_text = $stack->[$stack_level]->{'text'}; $stack_text = '' if (!defined($stack_text)); if ($stack->[$stack_level]->{'format'}) { my $format = $stack->[$stack_level]->{'format'}; if ($format eq 'index_item') { enter_table_index_entry($text, $stack, $state, $line_nr); next; } elsif (!defined($format_type{$format}) or ($format_type{$format} ne 'fake')) { $stack_text = "\@$format\n" . $stack_text; } } elsif (defined($stack->[$stack_level]->{'style'})) { my $style = $stack->[$stack_level]->{'style'}; if ($style ne '') { $stack_text = "\@$style\{" . $stack_text; } else { $stack_text = "\{" . $stack_text; } } pop @$stack; add_prev($text, $stack, $stack_text); } $stack = [ ]; $stack_level = 0; #return ($text, [ ], $state); $state->{'close_stack'} = 1; if ($string ne '') { if ($state->{'texi'}) { #print STDERR "scan_texi in close_stack ($string)\n"; scan_texi($string, $text, $stack, $state, $line_nr); } elsif ($state->{'structure'}) { #print STDERR "scan_structure in close_stack ($string)\n"; scan_structure($string, $text, $stack, $state, $line_nr); } } delete $state->{'close_stack'}; } # close the stack, closing macros and formats left open. # the precise behavior of the function depends on $close_paragraph: # undef -> close everything # defined -> remove empty paragraphs, close until the first format or paragraph. # 1 -> don't close styles, duplicate stack of styles not closed # FIXME never used # '' -> close styles, don't duplicate # if a $format is given the stack is closed according to $close_paragraph but # if $format is encountered the closing stops sub close_stack($$$$;$$$) { my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; my $close_paragraph = shift; my $format = shift; # FIXME this is not used my $search_style = shift; my $new_stack; # cancel paragraph states $state->{'paragraph_style'} = [ '' ] unless (defined($close_paragraph) or defined($format)); #print STDERR "sub_close_stack\n"; return $new_stack unless (@$stack); my $stack_level = $#$stack + 1; my $string = ''; my $verb = ''; if ($state->{'verb'}) { $string .= $state->{'verb'}; $verb = $state->{'verb'}; } #debugging #my $print_format = 'NO FORMAT'; #$print_format = $format if ($format); #my $print_close_paragraph = 'close everything'; #$print_close_paragraph = 'close paragraph without duplicating' if (defined($close_paragraph)); #$print_close_paragraph = $close_paragraph if ($close_paragraph); #print STDERR "Close_stack: format $print_format, close_paragraph: $print_close_paragraph\n"; while ($stack_level--) { if ($stack->[$stack_level]->{'format'}) { my $stack_format = $stack->[$stack_level]->{'format'}; last if (defined($close_paragraph) or (defined($format) and $stack_format eq $format)); # We silently close paragraphs, preformatted sections and fake formats if ($stack_format eq 'paragraph') { $string .= "\@end_paragraph "; } elsif ($stack_format eq 'preformatted') { $string .= "\@end_preformatted "; } else { if ($fake_format{$stack_format}) { warn "# Closing a fake format `$stack_format'\n" if ($T2H_VERBOSE); } else { echo_warn ("closing `$stack_format'", $line_nr); #dump_stack ($text, $stack, $state); #warn "$WARN closing `$stack_format'\n"; } $string .= "\@end $stack_format "; } } else { my $style = $stack->[$stack_level]->{'style'}; last if (defined($search_style) and $style eq $search_style); # FIXME images, footnotes, xrefs, anchors with $close_paragraphs ? if ($close_paragraph) { #duplicate the stack if (exists($style_type{$style}) and ($style_type{$style} eq 'style') or (!exists($style_type{$style}))) { push @$new_stack, { 'style' => $style, 'text' => '', 'no_open' => 1, 'arg_nr' => 0 }; $string .= '} '; } elsif (exists($style_type{$style}) and ($style_type{$style} eq 'simple')) { $string .= '} '; } } else { dump_stack ($text, $stack, $state) if (!defined($style)); $string .= '}'; echo_warn ("closing $style", $line_nr) if ($style); } } } $state->{'no_close'} = 1 if ($close_paragraph); $state->{'close_stack'} = 1; if ($string ne '') { #print STDERR "scan_line in CLOSE_STACK ($string)\n"; #dump_stack ($text, $stack, $state); scan_line($string, $text, $stack, $state, $line_nr); } delete $state->{'no_close'}; delete $state->{'close_stack'}; $state->{'verb'} = $verb if (($verb ne '') and $close_paragraph); return $new_stack; } # given a stack and a list of formats, return true if the stack contains # these formats, first on top sub stack_order($@) { my $stack = shift; my $stack_level = $#$stack + 1; while (@_) { my $format = shift; while ($stack_level--) { if ($stack->[$stack_level]->{'format'}) { if ($stack->[$stack_level]->{'format'} eq $format) { $format = undef; last; } else { return 0; } } } return 0 if ($format); } return 1; } sub top_format($) { my $stack = shift; my $stack_level = $#$stack + 1; while ($stack_level--) { if ($stack->[$stack_level]->{'format'} and !$fake_format{$stack->[$stack_level]->{'format'}}) { return $stack->[$stack_level]; } } return undef; } sub close_paragraph($$$;$) { my $text = shift; my $stack = shift; my $state = shift; my $line_nr = shift; #my $macro = shift; #print STDERR "CLOSE_PARAGRAPH\n"; #dump_stack($text, $stack, $state); my $new_stack = close_stack($text, $stack, $state, $line_nr, 1); my $top_stack = top_stack($stack); if ($top_stack and !defined($top_stack->{'format'})) { #debug print STDERR "Bug: no format on top stack\n"; dump_stack($text, $stack, $state); } if ($top_stack and ($top_stack->{'format'} eq 'paragraph')) { my $paragraph = pop @$stack; add_prev($text, $stack, do_paragraph($paragraph->{'text'}, $state)); $state->{'paragraph_macros'} = $new_stack; return 1; #return "\@$macro "; } elsif ($top_stack and ($top_stack->{'format'} eq 'preformatted')) { my $paragraph = pop @$stack; add_prev($text, $stack, do_preformatted($paragraph->{'text'}, $state)); $state->{'paragraph_macros'} = $new_stack; return 1; #return "\@$macro "; } return; } sub abort_empty_preformatted($$) { my $stack = shift; my $state = shift; if (@$stack and $stack->[-1]->{'format'} and ($stack->[-1]->{'format'} eq 'preformatted') and ($stack->[-1]->{'text'} !~ /\S/)) { pop @$stack; return 1; } return 0; } # for debugging sub dump_stack($$$) { my $text = shift; my $stack = shift; my $state = shift; if (defined($$text)) { print STDERR "text: $$text\n"; } else { print STDERR "text: UNDEF\n"; } print STDERR "state: "; foreach my $key (keys(%$state)) { my $value = 'UNDEF'; $value = $state->{$key} if (defined($state->{$key})); print STDERR "$key: $value "; } print STDERR "\n"; my $stack_level = $#$stack + 1; while ($stack_level--) { print STDERR " $stack_level-> "; foreach my $key (keys(%{$stack->[$stack_level]})) { my $value = 'UNDEF'; $value = $stack->[$stack_level]->{$key} if (defined($stack->[$stack_level]->{$key})); print STDERR "$key: $value "; } print STDERR "\n"; } if (defined($state->{'format_stack'})) { print STDERR "format_stack: "; foreach my $format (@{$state->{'format_stack'}}) { print STDERR "$format->{'format'} "; } print STDERR "\n"; } } # for debugging sub print_elements($) { my $elements = shift; foreach my $elem(@$elements) { if ($elem->{'node'}) { print STDERR "node-> $elem "; } else { print STDERR "chap=> $elem "; } foreach my $key (keys(%$elem)) { my $value = "UNDEF"; $value = $elem->{$key} if (defined($elem->{$key})); print STDERR "$key: $value "; } print STDERR "\n"; } } sub substitute_line($;$) { my $line = shift; my $state = shift; $state = {} if (!defined($state)); $state->{'no_paragraph'} = 1; return unformatted_text($state, $line) if ($state->{'unformatted'}); return substitute_text($state, $line); } sub substitute_text($@) { my $state = shift; my @stack = (); my $text = ''; my $result = ''; if ($state->{'structure'}) { initialise_state_structure($state); } elsif ($state->{'texi'}) { initialise_state_texi($state); } else { initialise_state($state); } $state->{'spool'} = []; #print STDERR "SUBST_TEXT begin\n"; while (@_ or @{$state->{'spool'}}) { my $line; if (@{$state->{'spool'}}) { $line = shift @{$state->{'spool'}}; } else { $line = shift @_; } next unless (defined($line)); if ($state->{'structure'}) { scan_structure ($line, \$text, \@stack, $state); } elsif ($state->{'texi'}) { scan_texi ($line, \$text, \@stack, $state); } else { scan_line($line, \$text, \@stack, $state); } next if (@stack); $result .= $text; $text = ''; } # FIXME could we have the line number ? # close stack in substitute_text if ($state->{'texi'} or $state->{'structure'}) { close_stack_texi_structure(\$text, \@stack, $state, undef); } else { close_stack(\$text, \@stack, $state, undef); } #print STDERR "SUBST_TEXT end\n"; return $result . $text; } sub substitute_texi_line($) { my $text = shift; my @text = substitute_text({'structure' => 1}, $text); my @result = (); while (@text) { push @result, split (/\n/, shift (@text)); } return '' unless (@result); my $result = shift @result; return $result . "\n" unless (@result); foreach my $line (@result) { chomp $line; $result .= ' ' . $line; } return $result . "\n"; } sub print_lines($;$) { my ($fh, $lines) = @_; $lines = $Texi2HTML::THIS_SECTION unless $lines; my @cnt; my $cnt; for my $line (@$lines) { print $fh $line; if (defined($Texi2HTML::Config::WORDS_IN_PAGE) and ($Texi2HTML::Config::SPLIT eq 'node')) { @cnt = split(/\W*\s+\W*/, $line); $cnt += scalar(@cnt); } } return $cnt; } sub do_index_entry_label($$) { my $state = shift; my $line_nr = shift; my $entry = shift @index_labels; return '' if ($state->{'multiple_pass'}); if (!defined($entry)) { echo_warn ("Not enough index entries !", $line_nr); return ''; } print STDERR "[(index) $entry->{'entry'} $entry->{'label'}]\n" if ($T2H_DEBUG & $DEBUG_INDEX); return &$Texi2HTML::Config::index_entry_label ($entry->{'label'}, $state->{'preformatted'}, substitute_line($entry->{'entry'}), $index_properties->{$entry->{'prefix'}}->{'name'}); } # decompose a decimal number on a given base. The algorithm looks like # the division with growing powers (division suivant les puissances # croissantes) ? sub decompose($$) { my $number = shift; my $base = shift; my @result = (); return (0) if ($number == 0); my $power = 1; my $remaining = $number; while ($remaining) { my $factor = $remaining % ($base ** $power); $remaining -= $factor; push (@result, $factor / ($base ** ($power - 1))); $power++; } return @result; } # main processing is called here set_document_language('en') unless ($lang_set); # APA: There's got to be a better way: $T2H_USER = &$I('unknown'); if ($Texi2HTML::Config::TEST) { # to generate files similar to reference ones to be able to check for # real changes we use these dummy values if -test is given $T2H_USER = 'a tester'; $THISPROG = 'texi2html'; setlocale( LC_ALL, "C" ); } else { # the eval prevents this from breaking on system which do not have # a proper getpwuid implemented eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i # APA: Provide Windows NT workaround until getpwuid gets # implemented there. $T2H_USER = $ENV{'USERNAME'} unless defined $T2H_USER; } open_file($docu, $texi_line_number); Texi2HTML::LaTeX2HTML::init($docu_name, $docu_rdir, $T2H_DEBUG & $DEBUG_L2H) if ($Texi2HTML::Config::L2H); pass_texi(); dump_texi(\@lines, 'texi', \@lines_numbers) if ($T2H_DEBUG & $DEBUG_TEXI); if (defined($Texi2HTML::Config::MACRO_EXPAND)) { my @texi_lines = (@first_lines, @lines); dump_texi(\@texi_lines, '', undef, $Texi2HTML::Config::MACRO_EXPAND); } pass_structure(); if ($T2H_DEBUG & $DEBUG_TEXI) { dump_texi(\@doc_lines, 'first', \@doc_numbers); if (defined($Texi2HTML::Config::MACRO_EXPAND and $Texi2HTML::Config::DUMP_TEXI)) { unshift (@doc_lines, @first_lines); push (@doc_lines, "\@bye\n"); dump_texi(\@doc_lines, '', undef, $Texi2HTML::Config::MACRO_EXPAND . ".first"); } } exit(0) if ($Texi2HTML::Config::DUMP_TEXI or defined($Texi2HTML::Config::MACRO_EXPAND)); rearrange_elements(); do_names(); if (@{$region_lines{'documentdescription'}} and (!defined($Texi2HTML::Config::DOCUMENT_DESCRIPTION))) { my $documentdescription = remove_texi(@{$region_lines{'documentdescription'}}); my @documentdescription = split (/\n/, $documentdescription); $Texi2HTML::Config::DOCUMENT_DESCRIPTION = shift @documentdescription; chomp $Texi2HTML::Config::DOCUMENT_DESCRIPTION; foreach my $line (@documentdescription) { chomp $line; $Texi2HTML::Config::DOCUMENT_DESCRIPTION .= ' ' . $line; } } # do copyright notice inserted in comment at the begining of the files if (@{$region_lines{'copying'}}) { $copying_comment = &$Texi2HTML::Config::copying_comment($region_lines{'copying'}); #$copying_comment = remove_texi(@{$region_lines{'copying'}}); #$copying_comment = &$Texi2HTML::Config::comment($copying_comment); } &$Texi2HTML::Config::toc_body(\@elements_list); #&$Texi2HTML::Config::toc_body(\@elements_list, $do_contents, $do_scontents); &$Texi2HTML::Config::css_lines(\@css_import_lines, \@css_rule_lines); $sec_num = 0; #$Texi2HTML::Config::L2H = l2h_FinishToLatex() if ($Texi2HTML::Config::L2H); #$Texi2HTML::Config::L2H = l2h_ToHtml() if ($Texi2HTML::Config::L2H); #$Texi2HTML::Config::L2H = l2h_InitFromHtml() if ($Texi2HTML::Config::L2H); Texi2HTML::LaTeX2HTML::latex2html(); pass_text(); #do_node_files() if ($Texi2HTML::Config::SPLIT ne 'node' and $Texi2HTML::Config::NODE_FILES); if ($Texi2HTML::Config::IDX_SUMMARY) { foreach my $entry (keys(%$index_properties)) { my $name = $index_properties->{$entry}->{'name'}; do_index_summary_file($name) unless ($empty_indices{$name}); } } do_node_files() if ($Texi2HTML::Config::NODE_FILES); #l2h_FinishFromHtml() if ($Texi2HTML::Config::L2H); #l2h_Finish() if($Texi2HTML::Config::L2H); Texi2HTML::LaTeX2HTML::finish(); &$Texi2HTML::Config::finish_out(); print STDERR "# that's all folks\n" if $T2H_VERBOSE; exit(0); ############################################################################## # These next few lines are legal in both Perl and nroff. .00 ; # finish .ig 'di \" finish diversion--previous line must be blank .nr nl 0-1 \" fake up transition to first page again .nr % 0 \" start at page 1 '; __END__ ############# From here on it's a standard manual page ############ .so @mandir@/man1/texi2html.1 texi2html-1.76/texi2html.spec.in0000644000076400007640000000315410030573010012251 Name: @PACKAGE_TARNAME@ Version: @PACKAGE_VERSION@ Release: 1 Epoch: 0 License: GPL Group: Applications/Text Summary: A highly customizable texinfo to HTML and other formats translator Source0: %{name}-%{version}.tar.bz2 #Source: http://texi2html.cvshome.org/servlets/ProjectDownloadList URL: http://texi2html.cvshome.org/ Requires: perl >= 5.004 Prefix: %{_prefix} BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %description The basic purpose of texi2html is to convert Texinfo documents into HTML, and other formats. Configuration files written in perl provide fine degree of control over the final output, allowing most every aspect of the final output not specified in the Texinfo input file to be specified. %prep %setup -q %build %configure make clean make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT #%find_lang %{name} rm -f $RPM_BUILD_ROOT%{_infodir}/dir %clean rm -rf $RPM_BUILD_ROOT %post /sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir 2>/dev/null || : %preun if [ $1 = 0 ]; then /sbin/install-info --delete %{_infodir}/%{name}.info \ %{_infodir}/dir 2>/dev/null || : fi %files %defattr(-,root,root) %doc AUTHORS NEWS README ChangeLog TODO %{name}.init %{_bindir}/%{name} %{_datadir}/texinfo/html/%{name}.html %{_mandir}/man*/%{name}* %{_infodir}/%{name}.info* %dir %{_datadir}/%{name} %{_datadir}/%{name}/*.init %dir %{_datadir}/%{name}/i18n/ %{_datadir}/%{name}/i18n/* %dir %{_datadir}/%{name}/images/ %{_datadir}/%{name}/images/* %changelog * Mon Mar 23 2004 Patrice Dumas 0:1.69-0.fdr.1 - Initial build. texi2html-1.76/configure0000755000076400007640000026165210200537742011003 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for texi2html 1.76. # # Report bugs to . # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME='texi2html' PACKAGE_TARNAME='texi2html' PACKAGE_VERSION='1.76' PACKAGE_STRING='texi2html 1.76' PACKAGE_BUGREPORT='users@texi2html.cvshome.org' ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT PACKAGE_DATE USE_UNICODE PERL build build_cpu build_vendor build_os host host_cpu host_vendor host_os LIBOBJS LTLIBOBJS' ac_subst_files='INIT MYSIMPLE T2H_I18N T2H_L2H_FILE T2H_TRANSLATIONS_FILE' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_PERL_set=${PERL+set} ac_env_PERL_value=$PERL ac_cv_env_PERL_set=${PERL+set} ac_cv_env_PERL_value=$PERL # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures texi2html 1.76 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of texi2html 1.76:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-multiplatform put executables in bin/PLATFORM Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-encode use encode (default: detected) Some influential environment variables: PERL The path to the `perl' executable. Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF texi2html configure 1.76 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by texi2html $as_me 1.76, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version="1.9" ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='texi2html' VERSION='1.76' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi; echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE PACKAGE_DATE=`"$srcdir"/mdate-sh "$srcdir"/configure.ac` INIT=$srcdir/texi2html.init MYSIMPLE=$srcdir/MySimple.pm T2H_I18N=$srcdir/T2h_i18n.pm T2H_L2H_FILE=$srcdir/l2h.init T2H_TRANSLATIONS_FILE=$srcdir/translations.pl # Check whether --with-encode or --without-encode was given. if test "${with_encode+set}" = set; then withval="$with_encode" if test $withval = 'no'; then USE_UNICODE=0 else USE_UNICODE=1 fi else if perl -e "use Encode; use Unicode::Normalize;" > /dev/null 2>&1; then USE_UNICODE=1 else USE_UNICODE=0 fi fi; # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_PERL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="/opt/perl5/bin:"$PATH"" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="/usr/bin/env perl" ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then echo "$as_me:$LINENO: result: $PERL" >&5 echo "${ECHO_T}$PERL" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # For teTeX and TeX Live. # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6 if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_build_alias=$build_alias test -z "$ac_cv_build_alias" && ac_cv_build_alias=`$ac_config_guess` test -z "$ac_cv_build_alias" && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6 if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_host_alias=$host_alias test -z "$ac_cv_host_alias" && ac_cv_host_alias=$ac_cv_build_alias ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Check whether --enable-multiplatform or --disable-multiplatform was given. if test "${enable_multiplatform+set}" = set; then enableval="$enable_multiplatform" fi; test "x$enable_multiplatform" = xyes \ && test "x$bindir" = 'x${exec_prefix}/bin' \ && bindir="$bindir/$host" ac_config_files="$ac_config_files texi2html:texi2html.pl" ac_config_files="$ac_config_files check_texinfo.pl" ac_config_files="$ac_config_files Makefile Tests/Makefile doc/Makefile texi2html.1 texi2html.spec" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by texi2html $as_me 1.76, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ texi2html config.status 1.76 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "texi2html" ) CONFIG_FILES="$CONFIG_FILES texi2html:texi2html.pl" ;; "check_texinfo.pl" ) CONFIG_FILES="$CONFIG_FILES check_texinfo.pl" ;; "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "Tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES Tests/Makefile" ;; "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "texi2html.1" ) CONFIG_FILES="$CONFIG_FILES texi2html.1" ;; "texi2html.spec" ) CONFIG_FILES="$CONFIG_FILES texi2html.spec" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@AMTAR@,$AMTAR,;t t s,@am__tar@,$am__tar,;t t s,@am__untar@,$am__untar,;t t s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t s,@MAINT@,$MAINT,;t t s,@PACKAGE_DATE@,$PACKAGE_DATE,;t t s,@USE_UNICODE@,$USE_UNICODE,;t t s,@PERL@,$PERL,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t s,@build_os@,$build_os,;t t s,@host@,$host,;t t s,@host_cpu@,$host_cpu,;t t s,@host_vendor@,$host_vendor,;t t s,@host_os@,$host_os,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t /@INIT@/r $INIT s,@INIT@,,;t t /@MYSIMPLE@/r $MYSIMPLE s,@MYSIMPLE@,,;t t /@T2H_I18N@/r $T2H_I18N s,@T2H_I18N@,,;t t /@T2H_L2H_FILE@/r $T2H_L2H_FILE s,@T2H_L2H_FILE@,,;t t /@T2H_TRANSLATIONS_FILE@/r $T2H_TRANSLATIONS_FILE s,@T2H_TRANSLATIONS_FILE@,,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi # Run the commands associated with the file. case $ac_file in texi2html ) chmod +x texi2html ;; check_texinfo.pl ) chmod +x check_texinfo.pl ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi texi2html-1.76/AUTHORS0000644000076400007640000000027707730374510010144 Lionel Cons, Karl Berry, Olaf Bachmann, Karl-Heinz Marbaise (texi2html manual) and many others. Images in the images directory come from the Singular project: http://www.singular.uni-kl.de/ texi2html-1.76/COPYING0000664000076400007640000004311007272740535010127 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. texi2html-1.76/ChangeLog0000644000076400007640000025254210200537362010642 2005-02-03 Patrice Dumas * texi2html.pl: don't use exists for reference in an array, for old perl. Report from Sven de Vries. * T2h_i18n.pm: remove useless use that prevented to run on IRIX. Report from ezra peisach. * Tests/*: remove some $Id: ChangeLog,v 1.179 2005/02/04 00:14:39 pertusus Exp $ rcs tags 2005-02-03 Patrice Dumas * texi2html.pl: require perl 5.00405 for File::Spec (report from Ezra peisach). 2005-02-03 Patrice Dumas * texi2html.pl: don't use open with three args, use binmode (for old perl, reported by Sven de Vries). * doc/Makefile.am: rebuild the manual based on the sources, not on the script, as it is remade by ./configure. Use the rebuild of the manual as a check target (ideas from Derek). * Tests/*: test for results with USE_UNICODE set to 0. 2005-02-01 Derek Price * configure.ac: Revert most of the PERL change. 2005-02-01 Patrice Dumas * texi2html.init, examples/chm.init: remove our keywords for old perl (reported by Sven de Vries). 2005-02-01 Derek Price * Makefile.am (EXTRA_DIST): Include missing-texi2html. 2005-02-01 Derek Price * NEWS: Note that Perl is no longer required to build. * configure.ac: Don't search for texinfo programs handled by Automake. Declare PERL a precious var. Exit when not found and not set. Warn when set to a relative path. * missing-texi2html, doc/texi2html.html: New files. * doc/.cvsignore: Add more intermediate files. * doc/Makefile.am: Remove targets autogenerated by Automake. (EXTRA_DIST): Distribute texi2html.html. (texi2html.html): Call texi2html via missing-texi2html. 2005-01-31 Derek Price * configure.in, NEWS: Update for development. * configure.in: Rename to... * configure.ac: ...this, to match current Autoconf standards. 2005-01-31 Derek Price * configure.in, NEWS: Update for the 1.74 release. 2005-01-16 Patrice Dumas * texi2html.pl, texi2html.init: more robust handling of deffn lines. The argument may be in bracket, therefore there is no difference beteen arg and other item specification for def like commands. * Tests: test for more deffn lines, and for @-commands in floats. * doc/texi2html.texi: update. 2005-01-16 Patrice Dumas * texi2html.pl: close quotes within html elements. Apply commands to @item lines in table after leading and trailing spaces removal. * Tests: regenerate. 2005-01-06 Patrice Dumas * texi2html.pl, texi2html.init: handle explicitely formats that don't trigger paragraph opening. Handle all commands even those that aren't used. End lines more correctly. 2004-12-29 Derek Price * NEWS: Date the 1.72 release. 2004-12-29 Derek Price * configure.in: Update for 1.72 release. * Makefile.in, aclocal.m4, configure, Tests/Makefile.in, doc/Makefile.in, doc/stamp-vti, doc/version.texi: Regenerated. 2004-12-29 Derek Price * README: Remove obsolete note about using shar for binary attachments to mailing lists. 2004-12-29 Derek Price * config.guess, config.sub: New files from Automake. 2004-12-13 Patrice Dumas * INTRODUCTION, README: update with dev mailing list. Advertise the manual as being rather complete. * Makefile.am,Makefile.in: build in . before doc, as texi2html is needed to rebuild the doc. 2004-12-11 Patrice Dumas * texi2html.init,examples/roff.init,examples/html32.init, examples/inlinestyle.init,NEWS: add support for @euro, @sansserif. * Tests: test for @euro, @sansserif, deff arguments with braces appearing within the argument (and not at the beginning). Sync. 2004-12-11 Patrice Dumas * texi2html.pl, texi2html.init: internal targets and targets of cross refs are valid as XML identifiers. This is compatible with the updated specification presented in the texinfo manual in the node HTML Xref. * doc,Tests: sync. 2004-11-22 Patrice Dumas * texi2html.pl: handle right deff arguments with braces appearing within the argument (and not at the beginning). 2004-10-08 Patrice Dumas * texi2html.pl: add a mail address to the --help screen (idea from Karl Berry). 2004-10-06 Patrice Dumas * configure.in: add the lines asked for by Thomas Esser for addition to teTeX. * Makefile.in...: regenerate with automake 1.9.1. 2004-10-06 Patrice Dumas * Makefile.am: use $(PERL) and $(srcdir) in manage_i18n.pl rule (idea of Karl Berry). 2004-08-13 Patrice Dumas * texi2html.pl, texi2html.init: Cross refs are done according to the specification presented in the texinfo manual in the node HTML Xref. The "external source of information" is also used although it isn't formally part of the specification. Handle novalidate better. * Tests: sync. 2004-08-07 Patrice Dumas * texi2html.pl, texi2html.init: handle @slanted and @abbr. 2004-06-27 Patrice Dumas * texi2html.pl, T2h_i18n.pm, manage_i18n.pl: Re enable compatibility with perl older that 5.6, by changing most of our to use vars, and some other to my. 2004-06-13 Patrice Dumas * texi2html.pl: split close_stack in 2, one for the last pass the other for the previous passes. Simplification of the code handling paragraph closing. More macros don't begin paragraphs. Pass opened commands through @tab and @item. Every @def* is considered to have arguments. continue the @def* line if there is a @ at the end line. * texi2html.pl, texi2html.init: Handle @float, @listoffloats, @caption, @shortcaption, @ordf, @ordm, @registeredsymbol, @deftypecv, @LaTeX, @indicateurl, @docbook, @ifdocbook, @ifnotdocbook, @comma, @headitem, @quotation second arg, @acronym second arg. @url is now a synonym for @uref. * doc/texi2html.texi: bring up-to-date. 2004-04-28 Patrice Dumas * T2h_i18n.pl, texi2html.pl: pass the state to the internationalized strings if needed. 2004-04-28 Patrice Dumas * texi2html.init, texi2html.pl: generate unformatted text with text protected and %unformatted_text_* hashs used. use unformatted text in element. put preparation of special styles in texi2html.init. copying_comment formats the copying comment. 2004-04-26 Patrice Dumas <dumas@centre-cired.fr> * example/book.init: stick to the same style for manual not split at node. * texi2html.pl: handle better @today even in non english cases. don't use (encoding) in open, but set it in binmode (perl seems unhappy otherwise ?). * texi2html.init: don't enclose paragraph in <p> when it is the first paragraph of enumerate or itemize, as the <li> is allready something like a begining of paragraph. 2004-03-25 Derek Price <derek@ximbiot.com> * .cvsignore: Ignore texi2html.spec. 2004-03-25 Derek Price <derek@ximbiot.com> * NEWS: Add section for 1.72. * configure.in: Update to dev version 1.71. Generate texi2html.spec. * texi2html.spec: Move this file... * texi2html.spec.in: ...here and replace some strings with text generated by configure. * Makefile.in, configure, doc/stamp-vti, doc/version.texi: Regenerated. 2004-03-24 Patrice Dumas <dumas@centre-cired.fr> * NEWS: fill 1.70 section. * configure.in, texi2html.spec: update version. * Makefile.in: regenerate, now it doesn't want config.guess. 2004-03-23 Patrice Dumas <dumas@centre-cired.fr> * Makefile.am, texi2html.spec: add a spec file usefull to build a rpm. * doc/Makefile.am: install texi2html.html in $(datadir)/texinfo/html as discussed on the texinfo/automake mailing lists. 2004-03-22 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: get language files before testing for language hash. * Makefile.am: add a rule for translations.pl. 2004-03-20 Derek Price <derek@ximbiot.com> * NEWS: Add section for 1.70 release. * configure.in: Update for 1.69 dev version. * configure: Regenerated. 2004-03-20 Derek Price <derek@ximbiot.com> * NEWS: Add date to 1.68 release. 2004-03-20 Derek Price <derek@ximbiot.com> * NEWS: Update Automake & Autoconf versions in developer info section. 2004-03-20 Derek Price <derek@ximbiot.com> * .cvsignore: Ignore the distribution archives. * Makefile.am (texi2html_SOURCES): Add and use to avoid having to maintain two lists of files. * configure.in: Update to version 1.68 for release. * Makefile.in, configure: Regenerated. * doc/stamp-vti, doc/version.texi: Regenerated. 2004-02-26 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: change $DOCUMENTDESCRIPTION to $DOCUMENT_DESCRIPTION for consistency. if $ENCODING is '' don't put it in the headers. add a new entry to $Texi2HTML::THISDOC: 'title_texi', the title with texinfo @-commands. * examples/chm.init: don't convert to utf8 in the html files generated (unless the encoding is really utf8), but produce utf8 in hhc, hhk and hhp files whatever the encoding is. * doc/texi2html.texi: update. 2004-02-23 Patrice Dumas <dumas@centre-cired.fr> * Makefile.am: ask for a version above 1.7 for automake. * Makefile.in...: regenerate with automake 1.8.2 autoconf 2.59. * texi2tml.pl, texi2html.init, examples/chm.init: add a new variable $DOCUMENTDESCRIPTION. If it is undef, @documentdescription is used or the long title. If it is set but empty no description <meta> element is used, if it isn't empty, the value is used in the description <meta> element. 2004-02-11 Patrice Dumas <dumas@centre-cired.fr> * Makefile.am: add T2h_i18n.pm texi2html.init MySimple.pm and l2h.init to the distribution. 2004-02-11 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: use the manual name (file basename) as default output directory when split. * NEWS, Tests/test.sh: update. 2004-02-11 Derek Price <derek@ximbiot.com> * Tests/GermanNodeTest/.cvsignore, Tests/index_table/.cvsignore, Tests/macros/.cvsignore, Tests/sectionning/.cvsignore, Tests/ccvs/.cvsignore, Tests/nodes_texinfo/.cvsignore, Tests/texi2html/.cvsignore, Tests/texinfo/.cvsignore, Tests/viper/.cvsignore, Tests/viper_monolithic/.cvsignore, Tests/xemacs/.cvsignore, Tests/xemacs_frame/.cvsignore, Tests/formatting/.cvsignore: New files to suppress warnings about files created by the test scripts. 2004-02-11 Derek Price <derek@ximbiot.com> * Makefile.am (bin_PROGRAMS): Move... (bin_SCRIPTS): ...here. (texi2html_SOURCES): Remove unused variable. 2004-02-10 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: put the code related with cross references in the main namespace. * Makefile.am: remove T2h_unicode.pm, T2h_nounicode.pm. 2004-02-10 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: put cross manual reference and unicode related functions in the main program (instead of T2h_unicode.pm, T2h_nounicode.pm). Don't add no-... options when there are allready the options added. * T2h_unicode.pm, T2h_nounicode.pm: remove. 2004-02-07 Patrice Dumas <dumas@centre-cired.fr> * T2h_unicode.pm, T2h_nounicode.pm: make global variables lexical variables. * texi2html.init: output header if there is only one section. * Tests/: more tests for the new cross references scheme. * doc/: use a newer texinfo.tex. Be texi2dvi friendly. * Tests/Makefile.am: comment out check-local, it isn't ready. 2004-02-06 Derek Price <derek@ximbiot.com> * T2h_unicode.pm, T2h_nounicode.pm: Declare some otherwise undeclared variables as global variables. 2004-02-06 Derek Price <derek@ximbiot.com> * doc/Makefile.am (txt): New targets to convert .texinfo files into text. * doc/.cvsignore: Ignore texi2html.txt. 2004-02-06 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init, T2h_unicode.pm, T2h_nounicode.pm: when called with --test, @today value is fixed. Find the relative path leading back to the current directory from the output directory, such that the path to the image files are right. Use a ref on the Texi2HTML::Config hashes such that changing the hash used is easy. This is used in T2h_unicode.pm and T2h_nounicode.pm for expansion of nodes in external refs. Add special styles early. A new variable NEW_CROSSREF_STYLE. If true the new scheme for html cross refs proposed onthe texinfo list is used for @ref. * Tests/formatting/test_refs.texi, Tests/formatting/cross_refs.init: new files used to test the new cross ref scheme. 2004-02-03 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: call the $index_summary_file_* function references for all the indices, even those not printed. * examples/chm.init: enhancements based on the Peter Verhсs implementation (t2h.pl) and languages codes based on the docbook xslt. 2004-02-03 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: add $EXTENSION variable, holding the extension for files. Add $Texi2HTML::THISDOC{'file_base_name'} and $Texi2HTML::THISDOC{'destination_directory'} such that it is possible to construct file and directory names in init files. Add $finish_out function reference called at the end of document outputting. Add $index_summary_file_begin and $index_summary_file_end to ease special index files generation. * examples/noheaders.init: perform better when split. * examples/chm.init: new init file to generate chm files (after compilation by a windows application, leads to windows help files). After Josщ Fonseca (jrfonseca at users dot berlios dot de) work on an older texi2html. * l2h.init: Set NO_SUBDIRS to 1, don't set html version. 2004-01-28 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: reopen styles in preformatted environments. When there is a complex format or a table or the like the opened styles are kept such that they are reopened when there is a paragraph or a preformatted within the format. * T2h_unicode.pm: use the right code point for dotless i. * Tests/*: add tests for formats imbricated in style command. add tests for latin1 and utf8 encoded files. add tests for ifset and ifclear in macros. * Makefile.am: add the new source files and init files. 2004-01-25 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init, T2h_unicode.pm, T2h_nounicode.pm: Handle encodings. It is possible to customize what is outputted in string context, when removing texinfo commands. Handle @email and @image better in string context. Use unicode instead of utf8 in variable names when it is really unicode. cross_manual_links is done in Texi2HTML::Config in T2h_unicode.pm in case the perl version is above 5.8, in T2h_nounicode.pm otherwise. add @NODE_FOOTER_BUTTONS for buttons at the footer of nodes. Add two more function references, element_file_name and node_file_name used to customize the file names. Don't warn when the character is not a precomposed unicode character, as it is possible to have totally valid character, not precomposed. Use us-ascii as default charset encoding. * examples/book.init: an init file based on the scriptbasic manuals file which formats manuals like books (no menu but tables of contents for the element under each element). * examples/utf8.init: use utf8 in strings. * doc/texi2html.texi: document the new elements of the interface. 2004-01-19 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init, examples/*: New variables $DO_CONTENTS and $DO_SCONTENTS, $OPEN_QUOTE_SYMBOL and $CLOSE_QUOTE_SYMBOL. Use a hash for the files such that each element may be associated with any file name and written down to that file. This should enable customization of the file names. print_Top_header and print_Top_footer are called from the main program. Add Texi2HTML::THIS_ELEMENT holding the current element structure. * doc/texi2html.texi: document the new variables and the new interface with a hash reference for style @-commands. 2004-01-12 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: --- and `` are kept in first arg of uref and email 2004-01-11 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: parse arguments separated with , in main program. Use a new interface for style commands with a hash instead of a string. The old interface is still available. Give a type to the style_map commands (accent, style, simple or special). Normalise spaces for @url, @uref and @email. Handle better ignored regions end (at end of file or before @). Don't reinject @-commands after closing paragraphs. Add a hash for commands if paragraphs should not be done in these commands. 2004-01-04 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: handle @flushleft and @flushright like normal formats and do something special at the end of line for @center. Put the @-command name in the paragraph_style stack (not the align attribute). use a new function reference init_out instead of set_buttons_text and set_body_text, called just before the outputting is done. Handle a lower level element appearing before a higher level element. * texi2html.pl, examples: call or prepare for calling of ascii_accents instead of rewriting the function each time. * examples/utf8.init: prepare for transcoding in utf8. * Tests/sectionning/section_before_chapter.texi: test for sectionning element before chapter. 2003-12-16 Peter Pentchev <roam@ringlet.net> * texi2html.pl: don't use symbolic refs at all, instead eval the code (for the style functions) or use a local glob for the filehandle. 2003-12-15 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: add hashes for the ascii representations of @-commands and a function for ascii accents. Give style functions the style @-command stack. New function duplicate_state to be used when special text is expanded within a normal context. substitute_line accepts a $state argument. 2003-12-10 Patrice Dumas <dumas@centre-cired.fr> * INTRODUCTION, NEWS, README, TODO, texi2html.1.in, doc/TODO: bring those files a bit more up-to-date and correct typos. * doc/IDEA: removed, the content was obsolete or in TODO. * texi2html.pl: add no-... options for the options needing it. echo less options with --help. 2003-12-10 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init, TODO: add hashes for unicode encodings of accented letter and characters. A function cross_manual_links can expand node name according to the proposal I made on the texinfo-pretest list (currently unused). * examples/utf8.init: add an init file for outputting of utf8 encoded characters. 2003-12-05 Derek Price <derek@ximbiot.com> * texi2html.pl: Suggest `--help' rather than `-help' in error messages. 2003-12-05 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: @sp without arg is considered to be @sp 1 * Tests/formatting/formatting.texi: add test for @sp * TODO: begin a list of UTF8 characters corresponding with accented texinfo letters, in order to implement cross manual references scheme described on the bug-texinfo mailing list and maybe output utf8. 2003-12-02 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: don't collect @copying lines in the first pass but in the second. Use the same mechanism to collect @copying, @documentdescription and @titlepage lines. 2003-12-01 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: new option -macro-expand which generates a file with expanded macros and @include. don't close environments until last pass, except for @verb, raw environments and macro stuff. * texi2html.init: use @emph instead of @i in strings. 2003-11-25 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: format titlepage lines, resulting text is put in $Texi2HTML::TITLEPAGE. Use a new function reference $titlepage to finalize $Texi2HTML::TITLEPAGE. titles, subtitles and authors are put in arrays in $Texi2HTML::THISDOC{'titles'} and so on... All the skipped commands are kept for the second pass. Handle @noindent and @exdent like other skipped commands. A new type of skipped commands 'whitespace' with newline skipped and 'space' no newline skipped. change name of functions to default_`function'. * examples/roff.init: add a roff formatter added. 2003-11-20 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: Echoes error messages when loading init files. Keep spaces in menu entries and menu descriptions. Clean menu entries code. When handling menu entries, give the formatted node, the name and the remaining of the line to the formatting functions. In enumerate give the style of the enumerate, the item number and a prepared number or letter to the formatting functions. Don't keep the enumerate style in the text. 2003-11-18 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: change protect_html to protect_text. More arguments given to paragraph, preformatted region, list item, table item formatting functions, usefull when the paragraph or preformatted region is within a table or list to give more possibility for use of the formatting command appearing with the table or itemize command. Handle better new lines. new formatting function, normal_text, used to process ---, --, '' and ``. new formatting function, empty_line used to format an empty line, leave the empty line as is by default. 2 new formatting functions are used when the macro isn't handled by the normal functions: unknown and unknown_style. give the file name to the image. * doc/texi2html.texi, Tests/*: sync with code. 2003-11-11 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: the format is applied by a customizable function. More arguments (index name, entry) given to the index label formatting function. When menus are not expanded, don't keep @menu or @end menu. * texi2html.init: warn when an accent is associated with a wrong argument. Produce valid html entities only. * texi2html.init, T2h_i18n.pm: Use @-commands in internationalized strings, not html. * i18n/fr, i18n/es, i18n/pt: use @-commands instead of html. 2003-11-07 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: remove unusefull arguments to functions formatting paragraphs. 2003-11-06 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: the style is applied by a customizable function. * examples/noheader.init: style with no headers. 2003-11-05 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: don't add the leading command if it is a simple command to all the paragraphs in itemize and add it before the paragraph or preformatted section. 2003-11-05 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: in itemize, apply the command to the inside of the paragraph or preformatted section. titlefont don't open paragraphs. 2003-11-02 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: keep texi as is in @image and protect html characters. accept @| as macro, but remove it. cleaning of code for commands with texi kept as is * doc/formatting.texi: add test of flushleft, flushright and center 2003-11-02 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: -- and so on are kept as is in @image except for alt text. Use alt text. File for image is really used, too. handle better @inforef. * doc/clean.texi: add formatting/clean.texi, a test for code acceptable by makeinfo without error. 2003-10-28 Patrice Dumas <dumas@centre-cired.fr> * doc/texi2html.texi: add informations about internationalization 2003-10-28 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: if not split and there is a leading directory specified with --out, create that directory. If a directory creation fails, abort. test the writability of the results directory, even when it is the current directory. 2003-10-28 Patrice Dumas <dumas@centre-cired.fr> * doc/: remove unneeded .texi files, now included in texi2html.texi. * Makefile.am, doc/Makefile.am: include info file in distribution. 2003-10-26 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: support for @verbatiminclude. When split use the -output specification in every cases. * texi2html.init: use `•' instead of `*' for node menu entries. * Makefile.am: fixes for the inclusion of files in packages. * doc/texi2html.texi: add the explanation of the default for all the variables. Explain how the strings are customized and how internationalization works. 2003-10-19 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init, examples/html32.init: don't expand html automatically, only if it is in @EXPAND. Put html in @EXPAND. USE_ISO is now in the default case, but false in html32.init. new hash, %iso_symbols for USE_ISO symbols. Rewroted in the public domain in texi2html.init. Use iso symbols in preformatted environment too. When removing texi @-commands with arguments (@table, @deffn...) are better handled. Ignore content of @anchor, @footnote, @*ref when removing texi. * doc/texi2html.texi: merge content of doc/custpage.texi, doc/custhtml.texi in doc/texi2html.texi. * Tests/formatting/formatting.texi: test for all the constructs in the @copying/@end copying section (to test remove_texi). 2003-10-17 Derek Price <derek@ximbiot.com> * doc/stamp-vti, doc/version.texi: Regenerated. 2003-10-17 Derek Price <derek@ximbiot.com> * texi2html.pl (do_text): Compile-once flag is okay as long as the pattern portion (left side) of a s/// statement is free of change. 2003-10-15 Patrice Dumas <derek@ximbiot.com> * doc/custhtml.texi, doc/custpage.texi: sync with current code (no more $ADDRESS but $end_page, only 2 functions for references). * texi2html.pl: -- in normal text is changed in - ---, -- '' and `` are kept as is in @code, @kbd and so on. 2003-10-14 Derek Price <derek@ximbiot.com> * doc/texi2html.texi: Use @code{} for Perl vars. @var{} is for user supplied data to commands and function calls and the like. Fix EOL indiscretion in the three index macros. * doc/stamp-vti, doc/version.texi: Regenerated. 2003-10-14 Derek Price <derek@ximbiot.com> * doc/custhtml.texi, doc/custpage.texi, doc/texi2html.texi: Misc revisions to Pat's major revisions. Some global changes and reviewed through section 4.3. Consolidate copyleft notice into a macro. Consolidate variable and option references into macros which include an index reference. Make use of appropriate macros from version.texi rather than relying on manual updates. * doc/stamp-vti, doc/version.texi: Regenerated. 2003-10-14 Derek Price <derek@ximbiot.com> * doc/.cvsignore: Add texinfo.info-? files. 2003-10-33 Patrice Dumas <dumas@centre-cired.fr> * Tests/formatting/formatting.texi: test for --- and `` in various constructs. 2003-09-23 Patrice Dumas <dumas@centre-cired.fr> * NEWS: More changes taken from the conversion of the singular manual init file. 2003-09-23 Patrice Dumas <dumas@centre-cired.fr> * NEWS: Note more changes. * Tests/*: Test for novalidate. 2003-09-22 Derek Price <derek@ximbiot.com> * NEWS: Reorganize. Note some more changes. 2003-09-21 Patrice Dumas <dumas@centre-cired.fr> * Makefile.am: package i18n/en * doc/testkb.texi doc/umalaut.texi: remove these test files, they are now in Tests/formatting 2003-09-21 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: source 'Config' file in the configuration directories instead of texi2htmlrc and ~/.texi2htmlrc for the system wide and user configuration. * manage_i18n.pl: language files are the files appearing in the i18n directory. Use 'en' for the file with english strings. 2003-09-17 Patrice Dumas <dumas@centre-cired.fr> * texi2html.init, texi2html.pl: change 'about (this page)' to 'about (help)' as this appears in the title= of the <a> element. ignore @afourlatex, @afourwide, @firstparagraphindent, @exampleindent, handle @definfoenclose, @kbdinputstyle, @novalidate, @centerchap (but without centering), @documentdescription. add -no-validate option. 2003-09-15 Patrice Dumas <dumas@centre-cired.fr> * texi2html.init, texi2html.pl: add &$Texi2HTML::Config::one_section for formatting of document with only one section. find when an element is the first element on a page. add &$Texi2HTML::Config::end_section, called when an element is finished unless it is the end of a page and do less in print_section Don't use $ADDRESS anymore. Change &$Texi2HTML::Config::external_ref such that it is easier to internationalize. 2003-09-13 Patrice Dumas <dumas@centre-cired.fr> * texi2html.init, texi2html.pl: mark strings of buttons, about, definitions and footers for internationalization. new function reference $set_buttons_text used to generate the button text hashes dynamically (for internationalization). require all files in i18n/* for languages. * i18n/fr: translate strings related with buttons, about, definitions and footers in french. 2003-09-12 Patrice Dumas <dumas@centre-cired.fr> * manage_i18n.pl: remove \ from strings when finding out strings to translate. * i18n/fr: translate strings related with references. 2003-09-12 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: 0 is accepted as a value for the reference arguments. rewrite from scratch the functions handling references in .init files to put them in the public domain. Avoid string concatenation to ease internationalization. 2003-09-11 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init, T2h_i18n.pm, manage_i18n.pl, configure.in: The ideas come from Derek. new script manage_i18n.pl used to manage translation files. remove -i18n switch. parse source files to extract strings to be translated. complete these strings with the element of %$template_strings in manage_i18n.pl and fill the i18n/template file with these strings in the 'en' language hash. With the 'all' arg given to manage_i18n.pl the template is regenerated the language files are updated and merged in translations.pl. translations.pl is pasted in texi2html.pl. give arguments to the string to be translated: when something like %{arg} appears in the string and { 'arg' => 'some string'} is given as second argument, %{arg} is replaced by 'some string' after retrieval of the translated string. 2003-09-06 Patrice Dumas <dumas@centre-cired.fr> * images, AUTHORS: add images from the Singular project. 2003-09-06 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, T2h_i18n.pm, texi2html.init: new handling of languages in documents. instead of using the hash reference $Texi2HTML::I18n::WORDS for translation of words, call &Texi2HTML::I18n::get_string (more precisely use &$I, a reference on the function). The strings are the real english strings and not identifiers. The date formatting depends on the language. Use translations for months and not a months array. Put translations in one file per language and not in T2h_i18n.pm. Those files are in the i18n directory. They are to be concatenated in the file translated.pl which is required or pasted in texi2html. Add a switch -i18n for the specification of a management command related with internationalization: if the command is merge, the files in the i18n directory are concatenated into translated.pl; if the command is update the files are updated with their own informations and the list of valid strings appearing in T2h_i18n.pm, invalid strings are obsoleted but kept. * test.sh: add a test for internationalization. 2003-09-05 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: detect @item on @itemize and table line to avoid infinite recursion. 2003-09-04 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: handle better @itemize and @table, by appending the text appearing on the format command line. Use %special_list_commands to inhibit calling the formatting command on an item in a given format command. if '-' is given to the -output option, output on STDOUT. Find more format command mismatches, and handle better formats not closed. 2003-09-02 Patrice Dumas <dumas@centre-cired.fr> * Tests/macros/glossary.texi: test for nested macros definitions 2003-08-29 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: support nested macro definitions. 2003-08-29 Patrice Dumas <dumas@centre-cired.fr> * texi2html.init, texi2html.pl: hide m_cedilla. new handling of definition commands, with a specification of the definition line parsing. get HTML attributes from hash values of %format_map and %style_map. Simplify the handling of tables. The default is to use %format_map or otherwise a user defined function, $table_list. All the css commands are in %css_map. 'pre_style' in $complex_formats is taken from %css_map. handle @sp. Remove $Texi2HTML::STOC_LINES (use $Texi2HTML::OVERVIEW), remove $Texi2HTML::TOC (use $Texi2HTML::TOC_LINES), remove $T2H_TOP. use references on arrays everywhere (instead of arrays) for Texi2HTML::OVERVIEW and Texi2HTML::TOC_LINES. Use OVERVIEW consistently. use $docu_top when needed, instead of $docu_name.$docu_ext, which is wrong if -o is used. prepare index entries label text in main program. rewrite from scratch most of the function in .init files to put them in the public domain. expand macros in macro arguments. \ protects @end macro in macros body. This may be wrong. ignore space and newline following a region opening command. rename -css-file to -css-include. Add 'This' to the hashes for buttons, icons and so on. Add option -toc-links, create links from headings to toc entries with 9 lines from Martin Herbert Dietze <martin@the-little-red-haired-girl.org> macros are expanded in macro arguments, taking care of context (in @verbatim, @ignore, @comment...). Don't remove empty lines from output. Reenable handling of -idx-sum. * Tests/*: add tests for macros expansion in macro arguments, and for command line option style which are not default. * examples/*: use code in the public domain. In makeinfo.init use makeinfo style for index formatting. 2003-08-29 Derek Price <derek@ximbiot.com> * MySimple.pm (helpOptions): Prepend a second `-' before options. 2003-08-29 Derek Price <derek@ximbiot.com> * doc/stamp-vti, doc/version.texi: Regenerated. 2003-08-11 Patrice Dumas <dumas@centre-cired.fr> * texi2html.init, texi2html.pl: don't always open paragraphs in tables and such, only when needed. option -output obsoletes -out_file and -subdir. It is the same than -out_file when output is not split, and the same than -subdir when it is split. Handle empty indices. Handle better @-commands with letters mixed with other characters. Be more carefull about NUMBER_SECTION, such that nothing is numbered when it is false. Support for @documentencoding. * Tests/*: add tests from the doc directory in formatting. * doc/*: add a section about installation and make the manual more makeinfo friendly. 2003-08-04 Patrice Dumas <dumas@centre-cired.fr> * texi2html.init, Tests/test.sh, Tests/ccvs: don't expand info section in default settings. Expand info sections for the xemacs manual, the viper manual and the texinfo manual. The cvs manual is updated. 2003-08-04 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: pass line numbers to all the functions echoing error messages and use these line numbers in error messages. Some error messages rewrited. Correct tag for sectionning commands in case raisesection or lowersection were used. -P option prepends before the document directory, and use an array, @Texi2HTML::Config::PREPEND_DIRS. Add options --ifhtml, --ifinfo and so on (similar with makeinfo options). It is also possible not to expand html now. Add entries for xml. when a region is expanded the corresponding ifnot region isn't. Add support for -css-file option which does the same than in makeinfo (parse the file, and echo the @import part before the texi2html css rules, the rules part after the texi2html css rules). If split at node and NODE_FILES is true but USE_NODES is not, the correct file nema is used for nodes not associated with sections and a redirection file is made. ignore spaces or not for def*index, pagesizes, syn*index properly. bugfixes: line beginning by any command not ignored begins a paragraph, don't ignore text before macro with unknown character). no empty style in pass_text. misc element have always a navigation printed at foot. * Tests/*: add singular test, test for css files, test all html formatting and macro within another macro. 2003-08-04 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: don't remove empty line in the second pass, pass_structure. collect line numbers/file name/macro expanding text in pass_texi. pass these informations down to pass_structure. take care of arguments not provided in some @-commands (no file in @image, no node in @inforef and so on). remove unneeded code in macro text expansion. remove leading spaces and newlines in macros arguments. add support for @\ (ignore). put code extracted from texi2html.pl and placed in texi2html.init, covered by the GPL back to texi2html.pl. Document the API between texi2html.pl and texi2html.init, i.e. document how the formatting functions called by texi2html.pl should behave. add print_section_header to format section headers. 2003-08-01 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: add option '-noexpand' as a synonym for '-no-expand' like Derek suggested. 2003-07-31 Derek Price <derek@ximbiot.com> * texi2html.pl (T2H_OPTIONS->{'no-expand'}): Remove useless linkage. 2003-07-31 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: A new option -no-expand which does the reverse of -expand. Text before the first @node or sectionning command is outputted as part of the first section. A new option enables the reverse: if -ignore-preamble-text is set (variable $IGNORE_PREAMBLE_TEXT) this text is ignored. Handle macros appearing in that part of texinfo files (@direntry and @dircategory ignored, @shorttitlepage handled). Ignore everything at the beginning of the file until \input or an @-command preceded by optionnal spaces. better handling of @titlefont. 2003-07-29 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: if split, top and misc elements (about, toc, ...) always have a bottom navigation panel. If there is no @top and the @node Top isn't associated with any section it is considered to be the top element. The top name is Top when there is no name nor title (previously was "Untitled Document"). bugfix: top element handled as top even when it is the last element. 2003-07-22 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init, examples/*: add support for @cartouche and @titlefont. preliminary support for css. All the element needing style have a class attribute. The commands which are associated with a class by makeinfo have that class too. The styles are in the <head> in <style>. A new init file, inlinestyle.init, should be used when style attributes within html elements are wanted. A new option, "-U value" does the same than "@clear value" (makeinfo has that option, too). A new configuration variable L2H_HTML_VERSION for the html version passed to latex2html. @tex or @math don't start a new paragraph. * Tests/*: test for @raisesections and @lowersections, and for @cartouche. 2003-07-11 Patrice Dumas <dumas@centre-cired.fr> * Tests/ccvs: update cvs manual. This should fixe the issue of rcs tags expanding in html manual files in ccvs_res. * Tests/*: sync with code. Add missing test result files. * Tests/Makefile.am: add new test subdirs. Better cleaning. * l2h.init: add init file for latex2html. 2003-07-10 Derek Price <derek@ximbiot.com> * Tests/nodes_texinfo/--and-hyphenation.html: Removed this accidentally added file at Pat's request. 2003-07-10 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, Tests/test.sh: command line option names use '-' instead of '_' between words (for example dump_texi becomes dump-texi). * Tests/*: remove unneeded html and passfirst files. 2003-07-03 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, *.init: use a separate namespace for the config variables: Texi2HTML::Config. Use the Texi2HTML:: namespace for variables set in texi2html and used in the init files subroutines. Use Texi2HTML::LaTeX2HTML namespace for latex2html related code. Use Texi2HTML::I18n namespace for internationalisation. Variables related with latex2html are removed from texi2html.init and put in l2h.init. harmonize function names style (all like get_index and not GetIndex). * Makefine.am, texi2html.pl: install examples init files in shared directory. try to find init files in the current directory, then the .texi2html user directory, the local texi2html directory and lastly the shared texi2html directory. 2003-06-17 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: error messages go to STDERR instead of STDIN * Tests/test.sh: add -x to perl invocation to avoid perl trying to execute @PERL@. Small fixes. * Tests/README: added README file in Tests to explain how to make tests. 2003-06-16 Derek Price <derek@ximbiot.com> * NEWS: Add some of Patrice's features, note new AC/AM versions, note --enable-maintainer-mode requirement. * Makefile.am (all): Remove automake supplied target. (texi2html): Update dependencies. (EXTRA_DIST): Update these. (MAINTAINER_CLEAN_FILES): Remove automatically included files. (TEXI2HTML): Remove unused variable. (AUTOMAKE_OPTIONS): Move to... * configure.in (AM_INIT_AUTOMAKE): ...here. (AC_ARG_PROGRAM): Remove call - AM_INIT_AUTOMAKE handles it. (T2H_VERSION): Rename to... (PACKAGE_VERSION): ...to avoid extra cruft since Autoconf already sets this automatically. (T2H_DATE): Rename to... (PACKAGE_DATE): ...this in keeping with Autoconf naming convention and set it automatically using mdate-sh. (extrasub): Remove uneeded cruft. (AM_MAINTAINER_MODE): Call this macro to make things easier on inexperienced users. (AC_OUTPUT): Move these files into... (AC_CONFIG_FILES): ...calls to this macro and update some calls to set the executable bit on files which need it. * check_texinfo.pl.in: s/@BANGPERL@/! @PERL@/g; * texi2html.1.in: s/@T2H_VERSION@/@PACKAGE_VERSION@/g; s/@T2H_DATE@/@PACKAGE_DATE@/g. * texi2html.init: Correct opening comment. * texi2html.pl: s/@BANGPERL@/! @PERL@/g; s/@T2H_VERSION@/@PACKAGE_VERSION@/g. * Tests/Makefile.am (test): Rename to... (check-local): ...this to conform with Automake requirements & GNU standards. (clean): Rename to... (clean-local): ...for compatibility with Automake. * Makefile.in: Regenerated. * aclocal.m4: Ditto. * configure: Ditto. * Tests/Makefile.in: Ditto. * doc/Makefile.in: Ditto. 2003-06-16 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: @include replaced by an empty line no end of line after last line when expanding macros include of files within lines expanded from macros happen at the right place better handling of format command in section names and of empty raw formats (like @html@end html) * Tests/*: sync with code 2003-05-20 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: split pass_texi in 2 pass. pass_texi rearranges texi expanding macros and values, removing comments. pass_structure remove unneeded empty lines and find out the structure of the document. use a different formatting for menu entries in other environments than menus. cleaning of code. use close_stack in all the passes to close environments not rightly closed. Fix some places where stack wasn't closed rightly. New direction, 'NodeNext' and 'NodePrev' which contains the prev node and next node which may be different from Next and Prev for sections. use style font-size:smaller in pre instead of <font> for smallexample and friends to produce valid html. spaces and arguments following commands are removed or kept in the same way than makeinfo does. * Tests/*: add tests for environments not closed. Sync with code. 2003-05-09 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: refs to other manuals conforms to makeinfo with separated files for nodes. If $T2H_NODE_FILES (-node-files) is true one file per node is created which redirects to the real file or is the node file (if T2H_SPLIT at node), to allow for cross manual references. Add a T2H_NO_TEXI hash similar with T2H_HREF, T2H_NODES... and T2H_THISDOC{title_no_texi} to have a texi free and thus html free text for nodes/sections/title to be used in the <title> which element which cannot contain other html elements. Also usefull for files with node names generation. t2h_set_body_text and t2h_protect_html put in texi2html.init to be able to make changes more easily. $T2H_TOC_LIST_STYLE is used for style in toc. Makes customisation easier too. * examples/html32.init: init file for html 3.2 generation * Tests/test.sh: add validation * Tests/*: tests for files with node names generation 2003-05-07 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: put a label in splitted index. splitted indices which are not at the level of splitting are kept in the same file but in different sections. different horizontal rules are global variables. functions formatting index summary and index entry split between a function in texi2html.pl and smaller functions doing the real formatting in texi2html.init. no formatting is done in texi2html.init. heading appears in documents with only one section. if $T2H_SEPARATED_FOOTNOTES is false (-noseparated_footnotes) the footnotes are on the page they appear. More possibility of customization of footnotes (insert things before and after each footnotes and all footnotes). use top file for the top element even when there is no @top section. when there is a top element and splitting, no other element than the top element appear in the top file. * examples/makeinfo.init: format footnotes like makeinfo * examples/xhtml.init: init file for xhtml * Tests/test.sh: little fixes * Tests/*: all tex stuff taken from verbatim_html and put in tex.texi. tests for index entries in top and before top. tests for documents with only one section or node or no node. 2003-05-02 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: 3 split commands: split at chapter, section or for every node (previously node and section where the same than node now). specific section footer. find prev and next like makeinfo. new directions, for nodes: NodeUp (up for node) and Following (next node in reading order). if in detailmenu menu entries are not used to find next and prev. only one Top in nodes and anchors. Any case combination accepted for any reference. don't close { when not associated with an @command. reintroduced code for counting words. new possibilities for buttons. If this is a ref to a scalar, the text appears in navigation. If it is an array, the first element is a direction used for the href, the second element is a scalar ref for the text (see makeinfo.init in examples for an example). * Tests/*: test for recursive nodes references and other little tests * examples/*: new directory for examples of config files. There is a file which tries to have an output which looks like makeinfo --html output (makeinfo.init). 2003-04-30 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: add the node as element when there is a @printindex split accross pages between node and section. * Tests/*: tests for documents with indices in top and between node and section. 2003-04-29 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: add $T2H_MENU_SYMBOL before nodes in menu and optionnaly before unnumbered section names in menu entry. next are not menu childs but next node in menu. it is possible not to have next or prev for node. any case combination of top is accepted in nodes, menus and nodes directions. Not changed in anchors and refs (makeinfo shows that kind of inconsistencies too). the top_element it the @top section, then the Top node and last the first element. '(file) node' and '(file)' accepted in menus and nodes references. better looking verbose output. * Tests/*: tests for documents without sections and double top 2003-04-28 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: No heading for top, as print_Top allready does it. if $T2H_USE_NODES (command line -use-nodes) is set, the nodes are used as sections when they are not associated with a section. find sections structure before handling nodes. no more use of menu level for structuring. @html sections don't close paragraphs. * Tests/*: tests for document structure. Sync with code. 2003-04-23 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: when there is no section nodes are used instead * .cvsignore: add autom4te-2.53.cache and check_texinfo.pl * Tests/.cvsignore: create .cvsignore for Tests * Tests/ccvs: update to latest cvs manual 2003-04-22 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: constants declared early as they are used in texi2html.init (at least $WARN is used) * Makefile.in, Tests/Makefile.in, Tests/Makefile.am: add .passfirst and .2 files in regenerate and clean * Tests/*: results of tests added 2003-04-10 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: labels were put 2 times in special sections (Top, about, toc...). in vtable, ftable and table, even with an empty first item we begin a <dd> as only <dd> and <dt> are allowed to follow <dl>. Right labels are put in special sections and files are omitted when the href is on the same file. change œ to œ and Œ to Œ (as tidy do) * Tests/*/nodetest.texi: test for more simple special commands 2003-04-09 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: formatting put in texi2html.init hrefs to anchors and index entries which are in footnotes are right scan_texi changed to have a stack verbose and debug goes to STDERR unusefull empty lines removed new option -dump_texi used to debug, dumps the result of pass_texi to a file menu_comments are always preformatted better handling of @math and @sc * Tests/*: a little more things tested. 2003-04-04 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: deffn and the like better handled preformatted sections are closed when there is a new format and reopened right after the format such that there is no validation error. The preformatted state is kept within menu, deff body, simple formats, tables, with tt instead of pre for terms, as pre isn't allowed in dt, but not in indices. simple macros are better handled when texi macros are removed or in preformatted sections. copying/end copying and insertcopying handled @head_lines containing things which should be before the navigation panel are used to get the labels for elements. first page of index is handled like a normal format * Tests/*: more tests for imbrications. 2003-04-02 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: footnotes better handled, they have a separated stack, state and text. footnotes, anchors and refs can be mixed with better results. $value{_title}... have only their texinfo expanded during pass_texi, including values, macros and so on and the html is generated during pass_text. * Tests/*: minor changes, more tests. 2003-04-02 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: macros splitted by 3 paragraphs are better handled. more isolation of formatting. better generation of index keys from commands, with more macros replaced by the right letter or symbol. better handling of @things{} in preformatted sections. preformatted sections handled with a new format, preformatted (similar with what is done for paragraphs). Some validation errors avoided. commands for tables are handled. index entries have the right file/id from their place. The files are omitted from hrefs when the href points to the same file. * Tests/*: formatting/imbrications.texi added. Sync with code. 2003-03-27 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: rewrite of the parsing of texi and of the handling of sectionning. pass0 is now pass_texi. It still only generates texinfo. pass_texi now also collects informations from sectionning commands index entries, printindex commands. pass1 through pass4 are now in just one pass, pass_text. between pass_texi and pass_text, the information is used to figure out the document and indices structure. pass_text reparses the texinfo generated by pass_texi and produces html. All the formatting is done in isolated subroutines such that it is easy to change the formatting witout bothering with the parsing. pass_text uses scan_line to process a line. A stack is used which holds opened macros and formats. Thus the html is always closed and should be valid. The document structure seems right with this approach, unnumbered sections are at the right level and indices don't break the document structure anymore. * Tests/*: more tests for the @macros. Other minor modifications. sync with new code. 2003-03-06 Patrice Dumas <dumas@centre-cired.fr> * T2h_i18n.pm: added the licence * texi2html.pl, texi2html.init, check_texinfo.pl.in: check function put in check_texinfo.pl.in. T2H_EXPAND is now an array such that more than one type may be expanded * texi2html.pl: added a new pass before the other ones, pass0 and a function scan_line0 used in that pass. During that pass the ifhtml, ifnot*, the comments and multiple empty lines, the macros, values and includes are handled. No html is generated. the different things that are expanded can now be within a line and not necessarily at the begining of the line. The handling of values and macros is not changed. scan_line handles more constructs (newlines (still bugged), verbatim, html and tex, deffn (incomplete)). new function close_stack which might be used to close the things forgotten by users or between paragraphs. new function substitute_text which uses scan_line to render arbitrary text. little improvements in menu comments handling. accent_map/do_accent should handle all the accents. * Tests/test.sh: minor changes. * Tests/*: regenerated tests to keep in sync. added formatting/imbrications.texi to test for imbricated things. * configure, configure.in: added check_texinfo.pl.in. 2003-02-28 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init, T2h_i18n.pm: options specifications moved from texi2html.init to texi2html.pl, such that texi2html.init resembles a regular user init file. internationalization move from texi2html.init to T2h_i18n.pm. * configure.in: added substitution of T2h_i18n.pm within texi2html.pl * configure, doc/Makefile.in, Makefile.in, aclocal.m4, Tests/Makefile.in: regenerated with automake-1.6.3, autoconf-2.53 2003-02-24 Patrice Dumas <dumas@centre-cired.fr> * Tests: small fixes, more tests showing brokeness of texi2html for some features and info and tex differences. A change in texinfo.txi to permit handling of verb despite some substitutions have allready been done * texi2html.pl: add comment about the formats in texinfo 4.5 setlocale is used in case of tests to avoid change in ordering of indices while testing against a reference file footnotes refs and image handled by parse_line, which calls a sub routine (do_footnote, do_ref or do_image). for footnotes, _$doc_num instead of $docu_doc appended tp keep track of the file of the footnote, such that it is easier to match. instead of <!--::${section}::--> added before printindex, _$sec_num is appended to printindex, to keep track of the section number. images extention is taken from the @image tag if available everything which was splitted accross pass2, pass3 and pass4 is now done in pass2. in pass3 only very little cleaning is done, pass4 is removed. 2003-02-21 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: added handling of overbar accent @= is transformed in = the handling of multi lines macro is done in a function, scan_line which scans a line, keeping a record of the text allready ready, the macro stack and a state which for now only contains 'verb' if in @verb macro. The @verb macro is handled by this function (but since things have allready been substituted, it cannot give the right result easily) 2003-02-19 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: T2H_DEFAULT_button_icon_img behaves better when it has some undef arguments the variables which may be redefined by the user are now global. They are grouped in texi2html.init, and also in the Declaration in texi2html.pl and sorted by class. new elements in %T2H_THISDOC for items which are global but shouldn't be redefined by the user (instead of $T2H_HOMEPAGE, $THISPROG...). t2h_Init_global has been removed and the code scattered according to the principles above other minor fixes 2003-02-18 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: handle @verbatim, and @html differently. Added push_until function which shift from a lines array and push to another array until @end tag. Remove PROTECTTAG remove unneeded push of index entry for vtable or ftable which created 2 indices entry * Tests: added more tests 2003-02-13 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: avoid using $_ in functions, as it is a global variable, use my variables instead * Tests/test.sh: if called with arguments, the test specified by the arguments is the only one done * Tests/*: add Makefile.in, more subdirectories, synchronise reference files with changes in the code 2003-02-12 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: add prototype for the functions ; remove & in front of functions ; remove the unusefull main() and Unprotect_texi functions * Tests/Makefile.am, Tests/test.sh: add regenerate target to redo the reference files add test with tidy, remove cvs/rcs tags when doing diffs 2003-02-11 Patrice Dumas <dumas@centre-cired.fr> * Tests/Makefile.am, Tests/test.sh: changes to reflect change in directory name for the cvs manual from cvs to ccvs 2003-02-11 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: unused variables removed use_bibliography removed, lots of global variables made lexical. open renamed open_file to avoid clashing with perl builtin. remove sub init_input, the initialization is done in the script itself. add meta http-equiv="Content-Type" tag for the charset declaration. 2003-02-06 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl, texi2html.init: some unused variables removed use_acc not used anymore, accents are always handled Remove a lot of global variables. Use global lexical or lexically scoped variables (with my) when possible. Pass variables as arguments when the function is in texi2html.init bugfixes: frame target is the top file, and not the toc file during pass1 some lines where pushed in @lines2 instead of @lines * Tests/test.sh: ignore CVS directory when doing diffs 2003-02-03 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: Remove handling of setref which is a TeX macro. The corresponding texinfo macro is anchor. Remove an unneeded protect_texi * configure.in, Makefile.am, Tests/test.sh, Tests/Makefile.am Tests/*: Files used for testing added, texinfo manuals and the html results for some of the texinfo manuals 2003-01-30 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: fix nesting of multi line style macros (previously, @kbd{@code{my thing}} became <kbd>my thing<kbd><code></code> (or something approaching) no style substitution is done in indexes (indexes are already good html). Added %sec2index which is undef for a section name not in index, 1 if the section name is in index. the value of $docu_doc set if $T2H_OUT was set (option -o) wasn't used to define docu_doc_file, thus the output file was the basename of the texinfo file with extension appended, and not $T2H_OUT. 2003-01-28 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: fixes in the handling of characters which are special in html (&, "), involving some rewriting/replacements of other functions which were bugged normalise_node now really uses protect_html new function protect_space_style used to normalise nodes without calling protect_html 2003-01-24 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: fixes for @multitables: size detection, elements out of bounds are ignored @item and @tab may appear anywhere within table lines 2003-01-22 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: Ref to info files are handled correctly @ref{(perl)Top} is transformed into @ref{Top,,,perl}. Any character is allowed in menu comments In menu, lines begining with * which are not menu entries are allowed and treated as comments Added a style handle for @bullet (do_bullet) such that @bullet{text} is handled Cedilla are now accepted in node names. Added protect_cedilla and unprotect_cedilla functions. * texi2html.pl, texi2html.init: Add -test option which sets $T2H_TODAY $T2H_USER $THISPROG to given values. This is in order to be able to compare with reference files for testing purproses. 2003-01-16 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: @H{a} is changed in a'' and not á which was wrong, as there are 2 acute accents on @H{a}. 2003-01-09 Patrice Dumas <dumas@centre-cired.fr> * texi2html.pl: Suppress warnings for undefined patterns or variables when running with -w 2003-01-08 Patrice Dumas <dumas@centre-cired.fr> * texi2html.init: small typo in a french word corrected * texi2html.pl: @dotless macros are processed before accents constructs like @'{a} are handled, typo in variable names corrected 2002-06-25 Derek Price <oberon@umich.edu> * texi2html.init, texi2html.pl: Miscellaneous HTML improvements, towards strictness and easier transition to XHTML later; lowercase elements and attributes, avoid using deprecated elements and attributes, always quote attribute values, avoid use of minimized attributes. Internal cleanups. (Patch from Ville Skyttф <ville.skytta@xemacs.org> through Adrian Aichner <adrian@xemacs.org>.) 2002-06-08 Derek Price <oberon@umich.edu> * configure: Update to a new development release number. * NEWS: Add news template for next release. * configure.in: Regenerated. * doc/stamp-vti: Ditto. * doc/version.texi: Ditto. 2002-06-08 Derek Price <oberon@umich.edu> * configure.in: Update Texi2HTML date. * NEWS: Update for new release. * .cvsignore: Add autom4te.cache for new version of Autoconf. * Makefile.in: Regenerated. * aclocal.m4: Ditto. * configure: Ditto. * doc/Makefile.in: Ditto. * doc/stamp-vti: Ditto. * doc/version.texi: Ditto. 2001-11-27 Adrian Aichner <adrian@xemacs.org> * texi2html.pl (pass5): Improve wording to say "# writing X sections ...". * texi2html.pl (next_doc): Skip over $docu_top_file and issue warning. 2001-11-25 Adrian Aichner <adrian@xemacs.org> * texi2html.init (T2H_InitGlobals): Improve documentation. Prepend $T2H_ADDRESS, which contains nothing but the address now, with "by". * texi2html.init (T2H_DEFAULT_print_page_foot): Prepend $T2H_ADDRESS, which contains nothing but the address now, with "by". * texi2html.init (T2H_PRE_ABOUT): Ditto. * texi2html.init (T2H_AFTER_ABOUT): Make it a lexical. * texi2html.pl: Remove trailing whitespace from lines. Use protect_html of HREF and NAME. Use /o where possible in substitutions. * texi2html.pl (T2H_HOMEPAGE): Get rid of newlines. * texi2html.pl (T2H_ADDRESS): Move to texi2html.init. * texi2html.pl (pass1): Fix severe top node matching bug. * texi2html.pl (do_uref): Don't markup obviously bad uref. * texi2html.pl (t2h_anchor): Use protect_html to allow double-quoting of all html attributes. 2001-11-19 Adrian Aichner <adrian@xemacs.org> * texi2html.init: Initialize T2H_INCLUDE_DIRS to the empty list. * texi2html.pl (LocateIncludeFile): Don't look in ., unless it's part of T2H_INCLUDE_DIRS. 2001-09-18 Derek Price <dprice@collab.net> * texi2html.pl (T2H_HOMEPAGE): Use new link. (T2H_AUTHORS): Direct to dev@texi2html.cvshome.org for maintainer. (T2H_ADDRESS): Default to "an unknown user". 2001-09-18 Derek Price <dprice@collab.net> * doc/.cvsignore: Add several files generated by pdftex. 2001-09-18 Derek Price <dprice@collab.net> * doc/Makefile.am (texi2html_TEXINFOS): Remove version.texi - AM includes it automatically. (texi2html.html): Include version.texi as a dependency. (texi2html.pdf): Use pdftex to create instead of ps2pdf - hyperlinks! * doc/Makefile.in: Regenerated. 2001-09-18 Derek Price <dprice@collab.net> * configure.in: Bump package version number. * Makefile.am (AUTOMAKE_OPTIONS): Bump required Automake version to 1.5. * doc/texinfo.tex: New File. * TODO: Add note about `make distcheck' being broken and about lack of a comprehensive test suite. * Makefile.in: Regenerated using Automake 1.5. * aclocal.m4: Ditto. * configure: Ditto. * doc/Makefile.in: Ditto. * doc/stamp-vti: Ditto. * doc/version.texi: Ditto. 2001-09-17 Derek Price <dprice@collab.net> * texi2html.init (T2H_WORDS_FR, MONTH_NAMES_FR): Add French translations. (Patch from Dumas Patrice <dumas@centre-cired.fr>.) 2001-09-17 Derek Price <dprice@collab.net> * texi2html.1.in (AVAILABILITY): Add detail. 2001-09-17 Derek Price <dprice@collab.net> * .cvsignore: Add `texi2html.1'. 2001-09-17 Derek Price <dprice@collab.net> * texi2html.1: Removed this file since it is generated by configure. 2001-08-10 Derek Price <dprice@collab.net> * INTRODUCTION: Fix email addresses and links. * README: Ditto. * NEWS: Update. 2001-08-10 Derek Price <dprice@collab.net> * doc/Makefile.am: Made a few changes so we can build in a dir other than $(srcdir). (Bug report from Richard Pixley <rpixley@zhone.com>.) * Makefile.am: Remove some useless comments. * doc/Makefile.am: Simplify some targets which Automake already knew how to handle. * aclocal.m4: Regenerated. * configure: Regenerated. * Makefile.in: Regenerated. * doc/Makefile.in: Ditto. 2001-01-20 Adrian Aichner <adrian@xemacs.org> * INTRODUCTION (http): Typo fixes. * texi2html.init (T2H_DEFAULT_print_toc_frame): Improve wording. * texi2html.pl: Avoid newlines around URL in $T2H_HOMEPAGE. * texi2html.pl (pass1): Remove incorrect "node is undefined ..." warnings (as pointed out by larry.jones@sdrc.com (Larry Jones) in <200011152253.RAA16633@thor.sdrc.com>. * texi2html.pl (Sec2PrevNode): Fix bug of calculating next node instead of previous. * texi2html.pl (main): Provide Windows NT workaround for $T2H_USER until getpwuid gets implemented there. 2000-11-15 Adrian Aichner <adrian@xemacs.org> * texi2html.pl: Comment out warnings pragma which, according to larry.jones@sdrc.com (Larry Jones), is not available in perl5.004_02. 2000-11-12 Adrian Aichner <adrian@xemacs.org> * doc/custhtml.texi: Fix @node and @menu commands according to feedback from makeinfo and texi2html, which reports undefined nodes now. * doc/custhtml.texi (CustHTMLBody): Ditto. * doc/custhtml.texi (CustHTMLBodyText): Ditto. * doc/custhtml.texi (CustHTMLAfterBody): Ditto. * doc/custpage.texi: Ditto. * doc/custpage.texi (TipsNewDesign): Ditto. * doc/custpage.texi (CustPagePhil): Ditto. * doc/custpage.texi (CustPagePhilNav): Ditto. * doc/custpage.texi (CustPageMiscPage): Ditto. * doc/custpage.texi (CustPagePageHeadToc): Ditto. * doc/custpage.texi (CustPagePageHead): Ditto. * doc/initfile.texi: Ditto. * doc/initfile.texi (InitFileBasics): Ditto. * doc/reference.texi: Ditto. * doc/reference.texi (Refptocframe): Ditto. * doc/stamp-vti: Updated. * doc/texi2html.texi: Ditto. * doc/texi2html.texi (Top): Ditto. * doc/texi2html.texi (Indexvr): Ditto. * doc/version.texi: Ditto. 2000-11-12 Adrian Aichner <adrian@xemacs.org> * texi2html.init: Re-format file according to M-x cperl-set-style RET C++ RET. Following subs are affected by re-indentatition and bug fixes due to use of warnings pragma. * texi2html.init (T2H_DEFAULT_print_section): * texi2html.init (T2H_DEFAULT_print_Top_header): * texi2html.init (T2H_DEFAULT_print_Top): * texi2html.init (T2H_DEFAULT_print_misc_header): * texi2html.init (T2H_DEFAULT_print_misc): * texi2html.init (T2H_DEFAULT_print_chapter_header): * texi2html.init (T2H_DEFAULT_print_chapter_footer): * texi2html.init (T2H_InitGlobals): * texi2html.init (T2H_DEFAULT_print_page_head): * texi2html.init (T2H_DEFAULT_print_page_foot): * texi2html.init (T2H_DEFAULT_print_foot_navigation): * texi2html.init (T2H_DEFAULT_button_icon_img): * texi2html.init (T2H_DEFAULT_print_navigation): * texi2html.init (T2H_DEFAULT_print_frame): * texi2html.init (T2H_DEFAULT_print_toc_frame): * texi2html.init (T2H_DEFAULT_about_body): * texi2html.pl: Re-format file according to M-x cperl-set-style RET C++ RET. Add pragma: use warnings; Following subs are affected by re-indentatition and bug fixes due to use of warnings pragma. * texi2html.pl (LoadInitFile): * texi2html.pl (SetDocumentLanguage): * texi2html.pl (l2h_Init): * texi2html.pl (l2h_InitToLatex): * texi2html.pl (l2h_ToLatex): * texi2html.pl (l2h_FinishToLatex): * texi2html.pl (l2h_ToHtml): * texi2html.pl (getcwd): * texi2html.pl (l2h_InitFromHtml): * texi2html.pl (l2h_FromHtml): * texi2html.pl (l2h_ExtractFromHtml): * texi2html.pl (l2h_Finish): * texi2html.pl (l2h_InitCache): * texi2html.pl (l2h_StoreCache): * texi2html.pl (l2h_FromCache): * texi2html.pl (l2h_ToCache): * texi2html.pl (pass1): * texi2html.pl (EnterIndexEntry): * texi2html.pl (IndexName2Prefix): * texi2html.pl (GetIndexEntries): * texi2html.pl (byAlpha): * texi2html.pl (GetIndexPages): * texi2html.pl (GetIndexSummary): * texi2html.pl (PrintIndexPage): * texi2html.pl (PrintIndex): 2000-11-05 Adrian Aichner <adrian@xemacs.org> * MySimple.pm (getOptions): Correct typo found with "use strict;". * texi2html.init: Convert from dynamically to lexically scoped variables. * texi2html.init (pretty_date): Ditto. This sub is defined in texi2html.pl as well! * texi2html.pl: Ditto. * texi2html.pl (l2h_FromHtml): Ditto. * texi2html.pl (pass1): Ditto. * texi2html.pl (pass2): Ditto. * texi2html.pl (pass3): Ditto. * texi2html.pl (pass4): Ditto. * texi2html.pl (update_sec_num): Ditto. * texi2html.pl (open): Ditto. * texi2html.pl (next_line): Ditto. * texi2html.pl (html_debug): Ditto. * texi2html.pl (debug): Ditto. * texi2html.pl (do_email): Ditto. * texi2html.pl (do_math): Ditto. * texi2html.pl (do_uref): Ditto. * texi2html.pl (apply_style): Ditto. * texi2html.pl (substitute_style): Ditto, except $_. * texi2html.pl (t2h_anchor): Ditto. * texi2html.pl (pretty_date): Ditto. This sub is defined in texi2html.init as well! 2000-11-05 Adrian Aichner <adrian@xemacs.org> * texi2html.pl (pass1): Generate valid HTML for <a name=...> anchors produced for @itemx?. 2000-11-05 Adrian Aichner <adrian@xemacs.org> * texi2html.init: Eliminate bare-word use of variable T2H_OPTIONS. 2000-11-05 Adrian Aichner <adrian@xemacs.org> * texi2html.pl: Use strict pragma to detect potential bugs. Declare local variables (currently 396!). Fix HTML syntax in $complex_format_map. Eliminate bare-word use of variables (eg. use $T2H_LANG instead of T2H_LANG). * texi2html.pl (GetIndexSummary): Remove <br> after <table>. * texi2html.pl (Sec2NextNode): Re-write section-number regexp for readability and to make cperl-mode happy. * texi2html.pl (Sec2PrevNode): Ditto. * texi2html.pl (main): New sub encapsulating top-level code. * texi2html.pl (pass1): Ditto. Re-write texinfo comment regexp for readability and to make cperl-mode happy. End HTML <p> before @printindex, <dl>, and </dl>. * texi2html.pl (pass2): Ditto. Quote <table> attributes. * texi2html.pl (pass3): Ditto. * texi2html.pl (pass4): Ditto. Remove </p> before first paragraph! * texi2html.pl (pass5): Ditto. * texi2html.pl (open): Use no strict "refs" to allow symbolic reference. * texi2html.pl (apply_style): Ditto. 2000-11-04 Adrian Aichner <adrian@xemacs.org> * texi2html.init ($T2H_DOCTYPE): Add SystemLiteral to identify the canonical DTD. * texi2html.init (T2H_DEFAULT_about_body): Fix HTML syntax of Subsubsection One-Two-Three example. * texi2html.pl: Close HTML <p> before HTML <table> and HTML <dl>. Correct handling of texinfo menu comment lines. * texi2html.pl (protect_html): Simplify. This subroutine was way too smart! Use Character entity references (eg <) instead of Numeric character references (eg. <). * texi2html.pl (unprotect_html): Use Character entity references (eg <) instead of Numeric character references (eg. <). 2000-09-14 Eric Sunshine <sunshine@sunshineco.com> * doc/Makefile.in: Added missing doc/Makefile.in since its absence caused 'configure' and make targets (such as 'distclean') to bomb. 2000-09-14 Olaf Bachmann <obachman@mathematik.uni-kl.de> * applied patches/fixes from Eric Marsden <emarsden@mail.dotcom.fr>. o DTD now at the beginning of the document o default language to 'en' wasn't working which led to empty LANG="" in <BODY> o missing </FONT> in footer blurb o when the ToC was generated in some cases, the code used <UL></UL> to indent, but didn't have any <LI> tags. <blockquote> is now used in such cases, instead. 2000-09-11 Eric Sunshine <sunshine@sunshineco.com> * texi2html.pl: Fixed severe macro expansion bug. Macro argument parsing code did not handle nested braces ('{' and '}') at all, thus valid macro invocations such as "@mymacro{Hello @emph{there} @strong{world}.}" would fail. Prior to this fix, @mymacro would be handed the argument "Hello @emph{there", which is clearly incorrect. Now @mymacro correctly receives "Hello @emph{there} @strong{world}." as its argument. This fix also deals properly with the protected brace sequences \{, \}, @{, and @}. * texi2html.pl: Fixed severe macro expansion bug. Macro argument parsing code did not handle arguments split over multiple lines, such as "@mymacro{Hello \n world.}". Now it correctly handles macro invocations split across any number of lines, and properly flags an error at the correct location if the user forgets the closing brace '}'. * texi2html.pl: Fixed formatting errors in expansions of @SPACE, @TAB, and @NL (where SPACE, TAB, and NL represent the actual space, tab, and newline characters). The Texinfo manual explicitly states that each of these sequences should expand to a "printable" space in the [rendered] output. The example given in the manual shows that "Spacey@ @ @ @ example" should expand to "Spacey example". However, texi2html was only emitting the insignificant whitespace ' ' and '\n' into the HTML output which did not properly preserve the hard spaces in "Spacey example". Now each of these directives expands to ' ' instead. * texi2html.pl: Made aesthetic improvement to the output of @file{}, @option{}, and @samp{}. The argument string is now quoted with ` and ' _after_ the style has been applied. For instance, @samp{perl} now expands to "`<samp>perl</samp>'", whereas it used to expand to "<samp>`perl'</samp>". In my tests, this change results in more aesthetically pleasing rendered output on various browsers. 2000-08-16 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.pl: Bug fix from: "joseph" <joseph@freenet.de> MySimple.pm should be 'require'd, but checked is still texi2html.init. 2000-08-14 Karl Heinz Marbaise <khmarbaise@gmx.de> * new command line switch (Test purposes only!) to show new layout in HTML for @def stuff. * Texinfo-Documentation updated. - New chapter about ``customizing HTML'' started. - multiple files instead of one. - subdirectory doc. 2000-07-27 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.pl: Fixed Getopt::Long::Configure("pass_through") for older versions of Getopt::Long which do not support his function. 2000-07-11 Olaf Bachmann <obachman@mathematik.uni-kl.de> * implemented @documentlanguage: - sets language of document, unless overwritten by -lang, or explicitly set $T2H_LANG * introduced T2H_OBSOLETE_OPTIONS to prevent obsolete options to ambiguate current options 2000-07-09 Karl Heinz Marbaise <khmarbaise@gmx.de> * Texinfo-Documentation: - fixes from Peter Moulder <pjm@bofh.asn.au> incorporated into manual. - Updated Manual o improved o indices for options, variables of script. o much more. * texi2html.init: - improvements for different languages (month names, words in different languages). 2000-07-05 Olaf Bachmann <obachman@mathematik.uni-kl.de> * Provided CVS anonymous read-access to Texi2html: cvs -d :pserver:t2h-anon@urmel.mathematik.uni-kl.de:/usr/local/Singular/cvsroot login cvs -d :pserver:t2h-anon@urmel.mathematik.uni-kl.de:/usr/local/Singular/cvsroot co Texi2html Passwd: texi2html * Provided CVS write-access to Texi2html: contact me for instructions 2000-07-01 Olaf Bachmann <obachman@mathematik.uni-kl.de> * primitive support for some toher def stuff (needs to be fixed, though) * Distribution: Incorporated texi2html.texi authored by Karl Heinz Marbaise <khmarbaise@gmx.de> (THANKS!) * texi2html.1.in: Updates to reflect new cmd-line options * Rewrote handling of command-line options: - based on (My)Simple.pm, and Getopt::Long -help now works and is up-to-date -help 1 lists also "not-so-important" options -help 2 lists also obsolete options - the following options were renamed: (old options still work, but are marked as obsolete) verbose ==> Verbose section_navigation ==> sec_nav output_file ==> out_file - the following options are obsoleted (still work, though): no-section_navigation ==> -nosec_nav use_acc ==> ALWAYS use accents expandinfo ==> -expand info expandtex ==> -expand tex no_verbose ==> default case monolithic ==> default case split_node ==> -split section split_chapter ==> -split chapter 2000-06-27 Olaf Bachmann <obachman@mathematik.uni-kl.de> * Fixed bug in anchor generation (reported by various people who noticed that @anchor may not be on one line with @item) * Fixed infinite loop on missing '@end macro' * texi2html.pl: -expandinfo and -expandtex command-line options for backward compatibility * texi2html.init: Use ISO 639 language codes for keys in $T2H_LANG hash. 2000-06-26 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.pl: new command-line options: -nonumber, -nomenu to unset the default -number -menu * texi2html.pl: As suggested by "Richard Y. Kim" <ryk@coho.net>: insert <A NAME="#nodename"></A> for each nodename in a document (nodename is exactly as in texinfo source). * From: "Richard Y. Kim" <ryk@coho.net> o $T2H_FRAMES internal boolean variable which defaults to 0 o -frames command line option which changes $T2H_FRAMES to 1. o If $T2H_FRAMES is 1, then two additional files are output. If mydoc.html is output normally, then mydoc_frame.html and mydoc_frame_toc.html files are output. o The functions T2H_print_frame, and T2H_print_toc_frame are used to generate contents of these files. o The T2H_DEFAULT_print_frame and T2H_DEFAULT_print_toc_frame (defined in texi2html.ini) do the following: mydoc_frame.html is the short file with <FRAME> tags. mydoc_frame_toc.html is basically the short table of contents which goes on the narrow left frame. * texi2html.pl: @,{c} --> ç 2000-06-23 Olaf Bachmann <obachman@mathematik.uni-kl.de> * released version 1.63 * texi2html.init (T2H_DEFAULT_print_page_head): make <html> tag very first thing in every file * fixed macro quoting and special cases of macro invocation * from "Richard Y. Kim" <ryk@coho.net>: o handle \} in macro arguments * from brlewis@alum.mit.edu: o Changes to facilitate CSS o -toc_file option for those who want the TOC to be index.html o Config variable $T2H_HREF_DIR_INSTEAD_FILE: if set (e.g., to index.html) replace hrefs to this file (i.e., to index.html) by ./ * texi2html.pl: index generation after value substitution 2000-05-31 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.pl: for def_map stuff <A NAME=..> before output * texi2html.pl: applied patch from "Richard Y. Kim" <ryk@ap.com> for @refs with 2 or 3 args: use 3rd or 2nd argor section (in that order) as text for reference. 2000-04-18 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.pl: Applied patches of <sunshine@sunshineco.com> to make texi2html work with older versions of Perl 2000-04-13 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.pl: fixed unmacro * distribution: applied patches from Peter Moulder and Teun Burgers. * fixed "Duplicate section found" -- section may now have duplicate names * fixed bug related to $T2H_AVOID_MENU_REDUNDANCY 2000-04-12 Olaf Bachmann <obachman@mathematik.uni-kl.de> * release 1.62 * added $T2H_NODE_NAME_IN_MENU for enforcing node names in meny entries, and $T2H_AVOID_MENU_REDUNDANCY to avoid display of duplicate meny entry information 2000-04-11 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.pl: fixed two small bugs reported by sunshine@sunshineco.com (</TR> in menu, <P> after itemize). * implemented @ftable, @vtable * index generation reimplemented: - Can be split over several pages, depending on the value of $T2H_SPLIT_INDEX - typesetting in fixed-width font is observed * texi2html.init: T2H_IDX_SUMMARY either set or not set, takes no argument. 2000-04-08 Peter Moulder <pjm@bofh.asn.au> * Makefile.am, configure.in: Generate texi2html in configure script instead of Makefile. (Due mostly to Teun Burgers.) * README, TODO, texi2html.1.in, texi2html.init, texi2html.pl: Misc. documentation changes. 2000-04-07 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.init: $T2H_INDEX_CHAPTER introduced: if set, use this chapter for Index button, else use first chapter whose name matches 'index' (case insensitive) * fixed atuomatic pointer creation for appendix chapters * fixed handling of menu entries with description going into the next line, use numbered section names, if $T2H_NUMBER_SECTIONS * texi2html.init: $T2H_TOP_HEADING for explicitly specifying heading of top node * fixed handling of headings (no new page on -split section) * fixed bug in index (generation of section names) * stoc in _ovr.html within BLOCKQUOTES * get rid of bullets in ToC, if $T2H_NUMBER_SECTIONS 2000-04-06 Olaf Bachmann <obachman@mathematik.uni-kl.de> * fixed bug in creation of index entries (eval of section names) * fixed table within itemize and parapgraphs * surpress <P></P> when within <pre> * allow @include within top node 2000-04-03 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.init: By default, T2H_TOP_FILE is set to '' * texi2html.pl: $docu_top=$T2H_TOP_FILE || $docu_name. $docu_ext; 2000-03-31 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.pl: $complex_format_map for complex enclosing constructs where which: * texi2html.init:$T2H_EXAMPLE_INDENT_CELL, $T2H_SMALL_EXAMPLE_INDENT_CELL, $T2H_SMALL_FONT_SIZE for customizing indent/font size of block-enclosing texinfo command (@example, @format, @display, etc). * Release version 1.61. 2000-03-29 Olaf Bachmann <obachman@mathematik.uni-kl.de> * Cleaned up texi2html.pl and added loading of init file (when texi2html.pl is run) such that it can directly be used as script (otherwise, debugging is much harder). * fixed getpwuid * Added T2H_print_chapter_header, T2H_print_chapter_footer for more fine-grained control of T2H_SPLIT eq 'chapter', added option -section_navigation, $T2H_SECTION_NAVIGATION to suppress output of navigation panels per section * Changed naming and and calling convention of customizable subs: They all have prefix T2H_, are called with &$T2H_, are assigned by $T2H_<name> = \&T2H_DEFAULT_<name>. * texi2html.init: Incorporated changed of Peter Moulder: 2000-03-27 Olaf Bachmann <obachman@mathematik.uni-kl.de> * debian/*: deleted * texi2html.pl: Incorporated changes of Peter Moulder * texi2html.pl: Automatic node pointer creation added * texi2html.pl: @enddots, @exclamdown, etc added 2000-03-26 Peter Moulder <reiter@netspace.net.au> * texi2html.init: Address a couple of weblint/tidy warnings. * texi2html.init: * texi2html.pl: The init file is inserted into the executable at build time (see Makefile.am). * texi2html.pl: Source each of @sysconfdir@/texi2htmlrc and $HOME/.texi2htmlrc if it exists, after processing texi2html.init but before anything on the command-line. Allow -split_chapter, -split_node, -monolithic options, which is what previous versions of texi2html used. Support `@command{...}'. Add --help, --version options. -sidx isn't used, so comment out. * configure.in: * Makefile.am: * autogen.sh: New files. * configure.in: Change version number from 1.60Beta to 1.59.2. * debian/*: New files. * texi2html.1.in: * texi2html.pl: Extract the man page into a separate file. At the moment, the man page is even installed separately (with texi2html.pl having `.so @MANPAGE_PATH@' in place of the manpage). Conceivably we could add a configure option to construct everything as one file like we used to; just replace that text with `@EMBEDDED_MANPAGE@', which would be replaced with either the existing `.so @MANPAGE_PATH@' or with texi2html.1 contents the way texi2html.init is done. 2000-03-14 Olaf Bachmann <obachman@mathematik.uni-kl.de> * texi2html.pl: center @image by default, can be overwritten by T2H_CENTER_IMAGE (sunshine@sunshineco.com) # vim:tabstop=8:shiftwidth=8 ��������������������������������������������������������������������������������������������������������������������������������������������������������������texi2html-1.76/INSTALL������������������������������������������������������������������������������0000664�0000764�0000764�00000017227�07272740536�010140� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������texi2html-1.76/NEWS���������������������������������������������������������������������������������0000664�0000764�0000764�00000034634�10200552451�007565� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This file records noteworthy changes. 1.76 (February 3 2005) * BUG FIXES --------- * Perl no longer needs to be installed at build time, but when it is not, the path to `perl' that will be used at run time must be passed to the `configure' script. 1.74 (January 31 2005) * COMPATIBILITY ------------- * The argument on def like commands line (@deffn and friends) may be bracketed, therefore there is no difference between this element and others. There is no need of items with { in front in the %def_map anymore. * NEW FEATURES ------------ * More @-commands are available to the user, that were ignored before. Most of these @-commands are those related with structure or printed output. * BUG FIXES --------- * many deffn and friends line parsing bugs fixed. 1.72 (December 29 2004) * NEW FEATURES ------------ * Handle texinfo 4.7 constructs: @caption, @shortcaption, @ordf, @ordm, @registeredsymbol, @deftypecv, @LaTeX, @indicateurl, @docbook, @ifdocbook, @ifnotdocbook, @comma, @headitem, @quotation second arg, @acronym second arg. @url is now a synonym for @uref. @ at the end of a @def* line continues the line. Handle texinfo 4.8 constructs: @abbr, @slanted, @euro and @sansserif. * Cross refs are done according to the specification presented in the texinfo manual in the node HTML Xref. * BUG FIXES --------- * Re enable compatibility with perl older that 5.6. 1.70 (March 24 2004) * BUG FIXES --------- * use i18n files even when translations.pl is not included. Include translations.pl. * COMPATIBILITY ------------- * install html manual in $datadir/texinfo/html. * NEW FEATURES ------------ * Add a spec file, usefull to build a rpm. * FOR DEVELOPERS -------------- * Standardized on Autoconf 2.59 & Automake 1.8.3 1.68 (March 20 2004) * COMPATIBILITY ------------- * When the manual is split the default is to put resulting files in a directory with name the manual file basename (previously they were left in the current directory). To avoid that, call texi2html with '-output .'. * The main configuration files are now ./Config, ~/.texi2html/Config, $sysconfdir/texi2html/Config and last $datadir/texi2html/Config. They are sourced in that order. In the future `/etc/texi2htmlrc' and `~/.texi2htmlrc' will no longer be sourced and any existing site or user configuration should be moved to the new locations if you wish it to be used by newer versions of Texi2HTML. * Translation files are now stored in $datadir/texi2html/i18n/*, $sysconfdir/texi2html/i18n/*, ~/.texi2html/i18n/*, and sourced in that order. The translated strings are now associated with the english strings. Please see the documentation for the format of the new translation files. * First index page is the first page with a non empty index (with @printindex). * The glossary and bibliography terms aren't searched anymore. You should use @macro to simulate these features (look at Tests/macros/glossary.texi for an example). * We've standardized on GNU-style `--' prefixed long options, rather than the old single-dash prefixed long options in the help, but the single-dash style is still accepted on the command line for the time being. We also changed `_' to `-' in option names. * @setref handling is removed as the right corresponding @-command is @anchor. * No more global variables outside of namespaces. Global variables are now in the Texi2HTML namespace. leading T2H_ is stripped from variable, hashes and array names. You should change your variable names for the new release. As the global variables (%THISDOC, $THIS_SECTION...) are in the Texi2HTML namespace you should use, for example, $Texi2HTML::THISDOC{'fulltitle'} now. functions from the main program should now be qualified in the main namespace. t2h_ is stripped from the function names too. t2h_anchor is now a function reference in init file, and thus should be called like &$anchor(...). toc file and main file are arguments for print_frame, overview lines are arguments for print_toc_frame (instead of global variables). * $THISPROG, $T2H_HOMEPAGE, $T2H_AUTHORS, $T2H_TODAY, $T2H_USER are now values associated with the following keys in %Texi2HTML::THISDOC: `program', `program_homepage', `today', `user'. * Changes in the function reference used for the page layout: print_section don't do the end of page or section anymore (except when split at node), end_section does the end of a section, and print_*_footer does the end of page. the print_*_header, print_*_footer... functions take a ref on the buttons array as argument, instead of using the $T2H_BUTTONS global variable. Have a look at the texi2html.init file to update your configuration files. * T2H_InitGlobals is not used anymore. Use the function reference init_out to define $BODYTEXT dynamically and %Texi2HTML::THISDOC values in print_page_foot and about_body to recreate the address instead of the $T2H_ADDRESS. You can have a look at program_string in texi2html.init which recreates the address. $T2H_ADDRESS isn't used anymore. * variables for latex2html are not in texi2html init file anymore but in l2h.init. * don't expand @ifinfo regions by default. * option --output obsoletes -out_file and -subdir. It is the same than --out_file when output is not split, and the same than --subdir when it is split. * If not split, the resulting file has a leading directory, and the directory doesn't exist, it is created. * If a directory creation fails the program aborts. * Don't use T2H_CENTER_IMAGE, @center should be used. * the init_out function redefines dynamically %NAVIGATION_TEXT, %BUTTONS_GOTO and $BODYTEXT. You should redefine the hash values in that function. If you want to reuse the values of the default values set by init_out, you could do something like: my $default_init_out = $init_out; $init_out = \&makeinfo_like_init_out; sub makeinfo_like_init_out() { my $encoding = &$default_init_out(); $NAVIGATION_TEXT{'Following'} = ' > '; return $encoding; } * NEW FEATURES ------------ * Many changes towards output of stricter HTML. * initialization files for html 3.2, xhtml, html 4.0 with inline style, no header, utf8 characters outputted, makeinfo style, book style, conversion to chm files and conversion to roff. Initialization files are searched in ./, ~/.texi2html, $sysconfdir/texi2html and last $datadir/texi2html. The file names are html32.init, xhtml.init, inlinestyle.init, noheaders.init, utf8.init, makeinfo.init, book.init, chm.init and roff.init. * The test suite is much more comprehensive and uses validate and tidy to assess the correctness of the HTML. * Handling of @html, @verbatim, @verb, @sp, @=, @copying, @insertcopying, @cartouche, @titlefont, @dircategory, @direntry, @shorttitlepage, @\, @afourlatex, @afourwide, @firstparagraphindent, @exampleindent, @novalidate, @definfoenclose, @kbdinputstyle, @centerchap, @documentdescription, @documentencoding, @contents, @shortcontents, @verbatiminclude. * With --no-validate node cross-reference validation is suppressed (like @novalidate). * --expand may be specified more than once such that more than one additional region could be expanded. --noexpand does the reverse. --iftex, --ifinfo... and --no-ifinfo... can be used instead. * add http-equiv="Content-Type" tag for the charset declaration. * HTML formatting is isolated in customizable functions located in the initialization files. * menu comments are in a preformatted context. * Any combination of caps for `top' leads to the top node. * @ref{(perl)Top} leads to a ref to the info manual. * References to external manual in @ref and menus are links to the html pages (with the same convention than makeinfo --html use). --html-xref-prefix is the base dir for external manual references. * With --node-files do a file per node which can be used as a target for cross references from other manuals (including manuals generated with makeinfo --html). * With --use-nodes nodes are sectionning commands whe they are not associated with a structuring command. * With --toc-links create links from headings to toc entries. * distinct directions (next, prev...) for nodes and sections, more directions. * split at chapter, section or for every node. * new possibilities for buttons. If this is a ref to a scalar, the text appears in navigation. If it is an array, the first element is a direction used for the href, the second element is a scalar ref for the text. * With --noseparated-footnotes the footnotes are in the same page than the text. * %NO_TEXI hash similar with %HREF but without texinfo commands, %THISDOC{'title_no_texi'} * "-U value" does the same than "@clear value". * -P option prepends directory for include files before the document directory. * -macro-expand generates a file with expanded macros and @include. * pass $L2H_HTML_VERSION for the html version to latex2html. * support for css. The --css-include option does the same than in makeinfo (parse the file, and echo the @import part before the texi2html css rules, the rules part after the texi2html css rules). The texi2html css commands may be customized too. * Text before the first @node or sectionning command is part of the first section unless -ignore-preamble-text is set. * if `-' is given to the -output option, output on STDOUT. * Add images from the Singular project. * All the strings appearing in the HTML are internationalized. * centering and flushing is really handled. * Format titlepage (even though the formatted text isn't used by default). * Handle all the encodings perl knows about. * BUG FIXES --------- * @multitable size determination, out of bounds columns ignored. * In @table and @itemize, @item is replaced by the @-command argument. * nested @-commands are better handled. * in index keys @-commands are replaced by the right symbols. * files are omitted in hrefs when they points to the same file. * $value{_title}... are expanded during HTML generation. * @H{a} leads to a'' and not á * cedilla are accepted in node names. * Any characters are accepted in menu comments. * frame target is the top file, and not the toc file. * rewriting of the @macro code completely. This likely fixed some bugs but this hasn't been verified by running the new, more complex test cases against the old code. * rewriting of the document structure resolution. unnumbered regions are at the right level and splitted indices don't break the document structure anymore. index entries and footnotes are more precisely located. * @-commands ignored are ignored with the line, the arg or following spaces like makeinfo does. * FOR DEVELOPERS -------------- * Standardized on Autoconf 2.59 & Automake 1.8.2 * The --enable-maintainer-mode option is now required by configure to enable what is considered the maintainer-specific portions of Makefiles. This includes the portions which automatically rebuild the configure and build files (configure, aclocal, Makefile.in, etc) when configure.in or other dependencies are changed. * The config is in the Texi2HTML::Config namespace. The latex2html related functions are in the Texi2HTML::LaTeX2HTML namespace. The internationalization functions are in the Texi2HTML::I18n namespace in T2h_i18n.pm. 1.66 (June 8 2002) * Many bug fixes. 1.65 (August 26 2001) * Many bug fixes. * The operation of the previously broken << (FastBack) and >> (FastForward) buttons has changed slightly. FastBack now returns to the beginning of the current chapter and FastForward now jumps to the beginning of the next chapter. 1.64 (July 3 2000) * Incorporated first version of Texi2html Texinfo manual, authored by Karl Heinz Marbaise <khmarbaise@gmx.de> * New handling of command line options: - can be abbreviated to shortest unique prefix -help now works and is up-to-date 1.63 (June 23 2000) * New customization variable: $T2H_HREF_DIR_INSTEAD_FILE: if set (e.g., to index.html) replace hrefs to this file (i.e., to index.html) by ./ * New command-line option: -toc_file FILE for those who want the TOC to be in FILE * bug fixes related to macro invocation 1.62 (12 April 2000) * New customization variables: $T2H_SPLIT_INDEX [default: = 100] index pages are split at next letter, if more than that many entries $T2H_NODE_NAME_IN_MENU [default = 0] for enforcing node names in meny entries $T2H_AVOID_MENU_REDUNDANCY [default = 1] to avoid display of duplicate meny entry information $T2H_INDEX_CHAPTER [default = ''] if set, use chapter of this name for 'Index' Button in navigation bars, else use first chapter whose name matches "index" (case insensitive). $T2H_TOP_HEADING [ default = ''] if non-empty, and no heading is in Top node, then use this as heading for top node/section; otherwise, use @settitle, @shorttitle. * index generation: observes typesetting in fixed-width font, @ftable, @vtable implemented * Peter Moulder & Teun Burgers: Misc documentation and distribution changes * numerous small bugs fixed (handling of menu entries, paragraphs in lists/tables, etc). 1.61 (31 March 2000) * By default, $T2H_TOP_FILE is not set, and so $docu_name.html is used. * Added T2H_print_chapter_header, T2H_print_chapter_footer for more fine-grained control of T2H_SPLIT eq 'chapter', added option -section_navigation, $T2H_SECTION_NAVIGATION to supress output of navigation panels per section * naming scheme and calling convention of customizable subs changed: prefix T2H_, call &$T2H_, assignment $T2H_<name> = \&T2H_DEFAULT_<name> * mailinglist created: texi2html@mathematik.uni-kl.de * conversion to standard gnu package with Makefile.am, README, AUTHORS, etc. (Peter Moulder <reiter@netspace.net.au>) * Initialization as suggested by Peter Moulder: 1. /usr/local/etc/texi2htmlrc (or whatever given by --sysconfdir to configure) 2. $HOME/.texi2htmlrc 3. command-line options, including -init_file where later options override previous ones. * incoporated patches from Peter Moulder (backward-compatible command-line options, separate man-page, etc). * Automatic node pointer creation added * @enddots, @exclamdown, @pounds, and relatives added. Major Changes from 1.58 to 1.60 * primitve foreign language support * support of all "Umlaute" * anchors, macros * latex2html incooperation * customizable page layout (texi2html.init) * index as table with corresponding sections ����������������������������������������������������������������������������������������������������texi2html-1.76/TODO���������������������������������������������������������������������������������0000664�0000764�0000764�00000004521�10177547174�007571� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This file contains a list of things yet to be done (see also in doc/IDEAS): * Create detailed texinfo documentation (see in doc) * add sample init files for different layouts - use events (onmousover, etc) for anchors - use style-sheets for formatting of various elements (like @example, etc). - xhtml with in line style - Singular manual style - How complicated could it be to get a creation of XML, what about SGML ? * document css classes, and have similar classes with makeinfo - makeinfo classes: ul menu, ul index-cp index-*, div node (navigation bar), - texi2html classes: table index-cp index-*, table menu, h3 node ul toc, - same classes: pre verbatim, pre example display..., table cartouche, small dots, small enddots, div contents shortcontents, div footnote, h? unnumbered chapter appendix..., h1 settitle (title before contents, if not set by titlefont), h1 titlefont (@titlefont), * use <link> for navigation, maybe wait before this is done in makeinfo (see http://www.w3.org/TR/REC-html40/types.html#h-6.12 and http://www.w3.org/TR/REC-html40/struct/links.html#h-12.3.3) * Document Texi2HTML::THIS_ELEMENT * Document $NEW_CROSSREF_STYLE, $EXTERNAL_CROSSREF_SPLIT, $Texi2HTML::THISDOC{'htmlxref'} * Test the back path stuff for images. * Test refs with no unicode support. Test for @ commands in refs, and refs in ascii 8 bit/utf8 manuals. * add a configure switch --with-encode * don't double in title when the @top and @settitle are the same * handle right things like -> error with @item on same line than @table @xref{node, @table @emph @item line text @end table } @code{ @printindex cp } * maybe some @-commands appearing on lines should stop paragraphs, namely @page. That's not sure. Maybe this should be up to the writer to add a line. * handle better things like @itemize @bullet @cindex example @item In the example @end itemize * @m_cedilla appears in output with --macro-expand. That's a bug. * in chm.init (Jose Fonseca) [WINDOWS] Default=,"ug.hhc","ug.hhk","ug.html","ug.html",,,,,0x22520,,0x384e,,,,,,,,0 The numbers are a bitmask of the enabled buttons. The ones here are IMO a good default. In the future you may also add that as an option, as the Docbook XSL stylesheets do (see in http://docbook.sourceforge.net/release/xsl/snapshot/doc/html/rn20.html all the CHM related parameters one can change). �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������texi2html-1.76/config.guess�������������������������������������������������������������������������0000755�0000764�0000764�00000122065�10164547154�011415� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-06-17' # This file 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner <per@bothner.com>. # Please send patches to <config-patches@gnu.org>. Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to <config-patches@gnu.org>." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown ## for Red Hat Linux if test -f /etc/redhat-release ; then VENDOR=redhat ; else VENDOR= ; fi # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha*:OpenVMS:*:*) echo alpha-hp-vms exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include <stdio.h> /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include <sys/systemcfg.h> main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include <stdlib.h> #include <unistd.h> int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include <unistd.h> int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*|*:GNU/FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include <features.h> #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR:-unknown}-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-${VENDOR:-unknown}-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-${VENDOR:-unknown}-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR:-ibm}-linux-gnu exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-${VENDOR:-unknown}-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include <features.h> #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-${VENDOR:-pc}-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` echo ${UNAME_MACHINE}-pc-isc$UNAME_REL elif /bin/uname -X 2>/dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says <Richard.M.Bartel@ccMail.Census.GOV> echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes <hewes@openmarket.com>. # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c <<EOF #ifdef _SEQUENT_ # include <sys/types.h> # include <sys/utsname.h> #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include <sys/param.h> printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include <sys/param.h> # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 <<EOF $0: unable to guess system type This script, last modified $timestamp, has failed to recognize the operating system you are using. It is advised that you download the most up to date version of the config scripts from ftp://ftp.gnu.org/pub/gnu/config/ If the version you run ($0) is already up to date, please send the following data and any information you think might be pertinent to <config-patches@gnu.org> in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������texi2html-1.76/config.sub���������������������������������������������������������������������������0000755�0000764�0000764�00000073015�10164547154�011060� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-06-18' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to <config-patches@gnu.org>. Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to <config-patches@gnu.org>." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | s390 | s390x \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | msp430-* \ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | s390-* | s390x-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nv1) basic_machine=nv1-cray os=-unicosmp ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������texi2html-1.76/install-sh���������������������������������������������������������������������������0000775�0000764�0000764�00000012736�07272740540�011106� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 ����������������������������������texi2html-1.76/mdate-sh�����������������������������������������������������������������������������0000775�0000764�0000764�00000005163�07273625670�010535� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # Get modification time of a file or directory and pretty-print it. # Copyright 1995, 1996, 1997 Free Software Foundation, Inc. # written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995 # # 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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME # Get the extended ls output of the file or directory. # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. if ls -L /dev/null 1>/dev/null 2>&1; then set - x`ls -L -l -d $1` else set - x`ls -l -d $1` fi # The month is at least the fourth argument # (3 shifts here, the next inside the loop). shift shift shift # Find the month. Next argument is day, followed by the year or time. month= until test $month do shift case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac done day=$2 # Here we have to deal with the problem that the ls output gives either # the time of day or the year. case $3 in *:*) set `date`; eval year=\$$# case $2 in Jan) nummonthtod=1;; Feb) nummonthtod=2;; Mar) nummonthtod=3;; Apr) nummonthtod=4;; May) nummonthtod=5;; Jun) nummonthtod=6;; Jul) nummonthtod=7;; Aug) nummonthtod=8;; Sep) nummonthtod=9;; Oct) nummonthtod=10;; Nov) nummonthtod=11;; Dec) nummonthtod=12;; esac # For the first six month of the year the time notation can also # be used for files modified in the last year. if (expr $nummonth \> $nummonthtod) > /dev/null; then year=`expr $year - 1` fi;; *) year=$3;; esac # The result. echo $day $month $year �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������texi2html-1.76/missing������������������������������������������������������������������������������0000775�0000764�0000764�00000020103�07273625670�010473� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. # Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing 0.3 - GNU automake" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`configure.in'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`configure.in'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`configure.in'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar ${1+"$@"} && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar ${1+"$@"} && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" ${1+"$@"} && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" ${1+"$@"} && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������texi2html-1.76/mkinstalldirs������������������������������������������������������������������������0000775�0000764�0000764�00000001324�07273625670�011706� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman <friedman@prep.ai.mit.edu> # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.2 2001/05/01 21:33:44 dprice Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������texi2html-1.76/INTRODUCTION�������������������������������������������������������������������������0000644�0000764�0000764�00000006345�10164547016�010740� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Getting Started with texi2html ============================== 'texi2html' converts texinfo documents to HTML. Texinfo is the official documentation format of the GNU project. It uses a single source file to produce both on-line information and printed output. For more details about texinfo, see http://www.texinfo.org. In contrast to the HTML produced by 'makeinfo --html' (the 'makeinfo' program is part of the Texinfo distribution), the HTML output of 'texi2html' is highly configurable. Among others, with 'texi2html' you can customize your entire page layout (like headers, footers, style sheets, etc), split documents at various levels and use 'latex2html' to convert @tex sections. 'texi2html' should reasonably convert all Texinfo 4.8 constructs. If not, please send a bug report to 'dev@texi2html.cvshome.org'. To create HTML of texinfo documents =================================== Make sure that you have 'texi2html' correctly installed on your system. The general synopsis of 'texi2html' is texi2html [options] texinfo-source-file Without any options, this will create the file <docname>.html where <docname> is the basename of your texinfo files. See the beginning of the file 'texi2html.init' for explanations of command-line options and their default values, or run 'texi2html -h' for a short overview of the most important options. Customizing texi2html ===================== Initialisation options are read first from '/usr/local/etc/texi2html/Config' (the exact location being changeable with the '--sysconfdir=dir' option to the configure script), then from $HOME/.texi2html/Config, then any command-line options including -init-file options; with later settings overriding earlier ones. The default initialisation options are defined in the 'texi2html.init' file contained in the Texi2html distribution (in fact, 'configure' pastes this file into beginning of texi2html.pl and generates the actual 'texi2html' script this way.). To customize 'texi2html' it is best if you copy the appropriate sections from