[Crystaldoc-cvs] crystaldoc/base translations.pl,NONE,1.1 texi2html.patch,NONE,1.1 texi2html.pl,NONE
Status: Alpha
Brought to you by:
vknecht
From: Vincent K. <vk...@us...> - 2005-07-14 18:40:54
|
Update of /cvsroot/crystaldoc/crystaldoc/base In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12013/base Added Files: translations.pl texi2html.patch texi2html.pl T2h_i18n.pm nodefix.pl MySimple.pod MySimple.pm Log Message: New texi2html and nodefix addition --- NEW FILE: MySimple.pm --- package Getopt::MySimple; # Name: # Getopt::MySimple. # # Documentation: # POD-style (incomplete) documentation is in file MySimple.pod # # Tabs: # 4 spaces || die. # # Author: # Ron Savage rps...@oz.... # 1.00 19-Aug-97 Initial version. # 1.10 13-Oct-97 Add arrays of switches (eg '=s@'). # 1.20 3-Dec-97 Add 'Help' on a per-switch basis. # 1.30 11-Dec-97 Change 'Help' to 'verbose'. Make all hash keys lowercase. # 1.40 10-Nov-98 Change width of help report. Restructure tests. # 1-Jul-00 Modifications for Texi2html # -------------------------------------------------------------------------- # Locally modified by obachman (Display type instead of env, order by cmp) # $Id: MySimple.pm,v 1.1 2005/07/14 18:40:45 vknecht Exp $ # use strict; # no strict 'refs'; use vars qw(@EXPORT @EXPORT_OK @ISA); use vars qw($fieldWidth $opt $VERSION); use Exporter(); use Getopt::Long; @ISA = qw(Exporter); @EXPORT = qw(); @EXPORT_OK = qw($opt); # An alias for $self -> {'opt'}. # -------------------------------------------------------------------------- $fieldWidth = 20; $VERSION = '1.41'; # -------------------------------------------------------------------------- sub byOrder { my($self) = @_; return uc($a) cmp (uc($b)); } # -------------------------------------------------------------------------- sub dumpOptions { my($self) = @_; print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n"; for (sort byOrder keys(%{$self -> {'opt'} }) ) { print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n"; } print "\n"; } # End of dumpOptions. # -------------------------------------------------------------------------- # Return: # 0 -> Error. # 1 -> Ok. sub getOptions { push(@_, 0) if ($#_ == 2); # Default for $ignoreCase is 0. push(@_, 1) if ($#_ == 3); # Default for $helpThenExit is 1. my($self, $default, $helpText, $versionText, $helpThenExit, $versionThenExit, $ignoreCase) = @_; $helpThenExit = 1 unless (defined($helpThenExit)); $versionThenExit = 1 unless (defined($versionThenExit)); $ignoreCase = 0 unless (defined($ignoreCase)); $self -> {'default'} = $default; $self -> {'helpText'} = $helpText; $self -> {'versionText'} = $versionText; $Getopt::Long::ignorecase = $ignoreCase; unless (defined($self -> {'default'}{'help'})) { $self -> {'default'}{'help'} = { type => ':i', default => '', linkage => sub {$self->helpOptions($_[1]); sleep 5;exit (0) if $helpThenExit;}, verbose => "print help and exit" }; } unless (defined($self -> {'default'}{'version'})) { $self -> {'default'}{'version'} = { type => '', default => '', linkage => sub {print $self->{'versionText'}; exit (0) if $versionThenExit;}, verbose => "print version and exit" }; } for (keys(%{$self -> {'default'} }) ) { my $type = ${$self -> {'default'} }{$_}{'type'}; push(@{$self -> {'type'} }, "$_$type"); $self->{'opt'}->{$_} = ${$self -> {'default'} }{$_}{'linkage'} if ${$self -> {'default'} }{$_}{'linkage'}; } my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} }); return $result unless $result; for (keys(%{$self -> {'default'} }) ) { if (! defined(${$self -> {'opt'} }{$_})) #{ { ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'}; } } $result; } # End of getOptions. # -------------------------------------------------------------------------- sub helpOptions { my($self) = shift; my($noHelp) = shift; $noHelp = 0 unless $noHelp; my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth) = (10, 5, 9, 78, 4, 11); print "$self->{'helpText'}" if ($self -> {'helpText'}); print ' Option', ' ' x ($optwidth - length('Option') -1 ), 'Type', ' ' x ($typewidth - length('Type') + 1), 'Default', ' ' x ($defaultwidth - length('Default') ), "Description\n"; for (sort byOrder keys(%{$self -> {'default'} }) ) { my($line, $help, $option, $val); $option = $_; next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp; #$line = " -$_" . ' ' x ($optwidth - (2 + length) ) . # "${$self->{'default'} }{$_}{'type'} ". # ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) )); $line = " --$_" . "${$self->{'default'} }{$_}{'type'}". ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) )); $val = ${$self->{'default'} }{$_}{'linkage'}; if ($val) { if (ref($val) eq 'SCALAR') { $val = $$val; } else { $val = ''; } } else { $val = ${$self->{'default'} }{$_}{'default'}; } $line .= "$val "; $line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line)); if (defined(${$self -> {'default'} }{$_}{'verbose'}) && ${$self -> {'default'} }{$_}{'verbose'} ne '') { $help = "${$self->{'default'} }{$_}{'verbose'}"; } else { $help = ' '; } if ((length("$line") + length($help)) < $maxlinewidth) { print $line , $help, "\n"; } else { print $line, "\n", ' ' x $valind, $help, "\n"; } for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}})) { print ' ' x ($valind + 2); print $val, ' ', ' ' x ($valwidth - length($val) - 2); print ${$self->{'default'}}{$option}{'values'}{$val}, "\n"; } } print <<EOT; Note: 'Options' may be abbreviated. 'Type' specifications mean: <none>| ! no argument: variable is set to 1 on -foo (or, to 0 on -nofoo) =s | :s mandatory (or, optional) string argument =i | :i mandatory (or, optional) integer argument EOT } # End of helpOptions. #------------------------------------------------------------------- sub new { my($class) = @_; my($self) = {}; $self -> {'default'} = {}; $self -> {'helpText'} = ''; $self -> {'opt'} = {}; $opt = $self -> {'opt'}; # An alias for $self -> {'opt'}. $self -> {'type'} = (); return bless $self, $class; } # End of new. # -------------------------------------------------------------------------- 1; # End MySimple.pm --- NEW FILE: MySimple.pod --- =head1 NAME C<Getopt::MySimple> - Provide a simple wrapper around Getopt::Long. =head NOTE Based on GetOpt::Simple, with some (here undocumented) modifications to fit texi2hml needs. =head1 SYNOPSIS use Getopt::MySimple; # Or ... # use Getopt::MySimple qw($opt); my($options) = { 'help' => { 'type' => '', 'default' => '', # 'verbose' => '', # Not needed on every key. }, 'username' => { 'type' => '=s', # As per Getopt::Long. 'default' => $ENV{'USER'} || 'RonSavage', # In case $USER is undef. 'verbose' => 'Specify the username on the remote machine', }, 'password' => { 'type' => '=s', 'default' => 'password', 'verbose' => 'Specify the password on the remote machine', }, }; my($option) = new Getopt::MySimple; if (! $option -> getOptions($options, "Usage: testMySimple.pl [options]") ) { exit(-1); # Failure. } print "username: $option->{'opt'}{'username'}. \n"; print "password: $option->{'opt'}{'password'}. \n"; # Or, after 'use Getopt::MySimple qw($opt);' ... # print "username: $opt->{'username'}. \n"; # print "password: $opt->{'password'}. \n"; =head1 DESCRIPTION The C<Getopt::MySimple> module provides a simple way of specifying: =over 4 =item * Command line optes =item * Type information for opt values =item * Default values for the optes =item * Help text per opt =back =head1 The C<getOptions()> function The C<getOptions()> function takes 4 parameters: =over 4 =item * A hash defining the command line optes =item * A string to display as a help text heading =item * A Boolean. 0 = (Default) Use case-sensitive opt names. 1 = Ignore case =item * A Boolean. 0 = Return after displaying help. 1 = (Default) Terminate with exit(0) after displaying help =back =head1 The $classRef -> {'opt'} hash reference Command line option values are accessed in your code by dereferencing the hash reference $classRef -> {'opt'}. Two examples are given above, under synopsis. Alternately, you can use the hash reference $opt. See below. =head1 The $opt hash reference Command line option values are accessed in your code by dereferencing the hash reference $opt. Two examples are given above, under synopsis. Alternately, you can use the hash reference $classRef -> {'opt'}. See above. =head1 The C<dumpOptions()> function C<dumpOptions()> prints all your option's keys and their current values. =head1 The C<helpOptions()> function C<helpOptions()> prints nicely formatted help text. =head1 WARNING re Perl bug As always, be aware that these 2 lines mean the same thing, sometimes: =over 4 =item * $self -> {'thing'} =item * $self->{'thing'} =back The problem is the spaces around the ->. Inside double quotes, "...", the first space stops the dereference taking place. Outside double quotes the scanner correctly associates the $self token with the {'thing'} token. I regard this as a bug. =head1 REQUIRED MODULES =over 4 =item * Exporter =item * Getopt::Long =back =head1 RETURN VALUES =over 4 =item * C<dumpOptions()> returns nothing =item * C<helpOptions()> returns nothing =item * C<getOptions()> returns 0 for failure and 1 for success =back =head1 AUTHOR C<Getopt::MySimple> was written by Ron Savage I<E<lt>rps...@oz...E<gt>> in 1997. Modifications for texi2html by Olaf Bachmann I<E<lt>oba...@ma...E<gt>> in 2000. =head1 LICENCE This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. --- NEW FILE: nodefix.pl --- #!/usr/bin/perl -w #============================================================================== # # Texinfo @node and @menu Repair Script # Copyright (C) 2000 by Eric Sunshine <sun...@su...> # # 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 # #============================================================================== #------------------------------------------------------------------------------ # nodefix.pl # # A tool for repairing broken and out-of-date @node directives and @menu # blocks. Understands @include and @import{} directives and will correctly # repair an entire Texinfo tree when given a root Texinfo file which # directly or indirectly includes all other files within the tree. # # (The @import{} directive is a special macro developed by Eric Sunshine to # deal gracefully with differences in pathname syntax between platforms.) # # To-Do List # * Add support for @detailmenu. # #------------------------------------------------------------------------------ use strict; use Getopt::Long; $Getopt::Long::ignorecase = 0; my $PROG_NAME = 'nodefix.pl'; my $PROG_VERSION = '1.3'; my $AUTHOR_NAME = 'Eric Sunshine'; my $AUTHOR_EMAIL = 'sun...@su...'; my $COPYRIGHT = "Copyright (C) 2000 by $AUTHOR_NAME <$AUTHOR_EMAIL>"; @main::opt_include_dir = (); $main::opt_verbose = 0; $main::opt_debug = 0; $main::opt_help = 0; my @script_options = ('include-dir|I=s@', 'verbose!', 'debug!', 'help' ); my $broken_nodes = 0; my $broken_menus = 0; my $broken_files = 0; $main::current_file = undef; $main::line_number = 0; $main::scan_depth = 0; my $current_node = undef; my $current_depth = 0; my $depth_adjustment = 0; my %node_map; my @node_list; my @menu_list; my @file_list; my %ignored_blocks = ( 'iftex' => 1, 'ifhtml' => 1, 'ifnotinfo' => 1, 'ignore' => 1, 'macro' => 1, 'rmacro' => 1, ); my $depth_min = 1; # Limit for @raisesections. my $depth_max = 4; # Limit for @lowersections. my %depth_map = ( 'chapter' => 1, 'section' => 2, 'subsection' => 3, 'subsubsection' => 4, 'top' => 0, 'unnumbered' => 1, 'unnumberedsec' => 2, 'unnumberedsubsec' => 3, 'unnumberedsubsubsec' => 4, 'appendix' => 1, 'appendixsec' => 2, 'appendixsection' => 2, 'appendixsubsec' => 3, 'appendixsubsubsec' => 4, ); #------------------------------------------------------------------------------ # Emit an error message and terminate abnormally. #------------------------------------------------------------------------------ sub fatal { my $msg = shift; die "ERROR: $msg\n"; } #------------------------------------------------------------------------------ # Emit a warning message. #------------------------------------------------------------------------------ sub warning { my $msg = shift; warn "WARNING: $msg\n"; } #------------------------------------------------------------------------------ # Print an underlined title. #------------------------------------------------------------------------------ sub print_title { my $msg = shift; print "$msg\n", '-' x length($msg), "\n"; } #------------------------------------------------------------------------------ # Find a file, possibly searching a list of alternate directories specified # on the command line. #------------------------------------------------------------------------------ sub find_include_file { my $file = shift; return $file if -f "$file"; my $dir; foreach $dir (@main::opt_include_dir) { return "$dir/$file" if -f "$dir/$file"; } return undef; } #------------------------------------------------------------------------------ # For older versions of Perl which lack FileHandle, we fake up a unique file # handle type object. #------------------------------------------------------------------------------ *main::file_handle_template = 'FH0000'; sub new_file_handle { return $main::file_handle_template++; } #------------------------------------------------------------------------------ # Open a Texinfo file for input and construct a file record which records the # contained nodes and menus. #------------------------------------------------------------------------------ sub open_input_file { my $file = shift; my $path = find_include_file($file) or fatal "Unable to locate file: $file"; local *handle = new_file_handle(); open(*handle, $path) or fatal "Failed to open file: $path"; $main::current_file = { 'path' => $path, 'nodes' => [], 'menus' => [], }; push(@file_list, $main::current_file); $main::line_number = 0; return *handle; } #------------------------------------------------------------------------------ # Read an input line from a Texinfo file. If the line begins with a Texinfo # directive, parse it and strip the trailing @comment if present. #------------------------------------------------------------------------------ sub input_line { my $handle = shift; my $line = <$handle>; close($handle), return () unless $line; my ($key, $option) = ('', ''); if ($line =~ /^\@(\w+)\s*(.*)$/) { # Got a @directive? ($key, $option) = ($1, $2); # Extract components. $option =~ s/\@c(?:omment)?\b.*$//; # Strip trailing comment. $option =~ s/\s+$//; # Strip trailing whitespace. } return ($line, $key, $option); } #------------------------------------------------------------------------------ # Canonicalize a node name. #------------------------------------------------------------------------------ sub canonicalize { local $_ = $_[0]; $_ = '' unless $_; s/\s+/ /g; s/^ //; s/ $//; $_[0] = $_; } #------------------------------------------------------------------------------ # Parse the contents of a @node line ("Name, Next, Previous, Up"). #------------------------------------------------------------------------------ sub parse_node { my $node = shift; my ($nname, $nnext, $nprev, $nup) = split(/,/, $node); canonicalize($nname); canonicalize($nnext); canonicalize($nprev); canonicalize($nup ); return ($nname, $nnext, $nprev, $nup); } #------------------------------------------------------------------------------ # Get a node's depth. Internally, a negative depth is used as a flag to # indicate that a node's depth has not been changed by one of the sectioning # commands. The first sectioning directive following a @node is allowed to # change the node's depth; subsequent sectioning directives do not. This # function always returns the node's real (positive) depth. #------------------------------------------------------------------------------ sub node_depth { my $node = shift; my $depth = $node->{'depth'}; return $depth < 0 ? -$depth - 1 : $depth; } #------------------------------------------------------------------------------ # Scan a @node line and construct a node record. #------------------------------------------------------------------------------ sub scan_node { my $node_line = shift; my ($nname, $nnext, $nprev, $nup) = parse_node($node_line); fatal "Malformed \@node at line $main::line_number in " . "$main::current_file->{'path'}." unless $nname; $current_node = { 'name' => $nname, 'old' => { 'next' => $nnext, 'prev' => $nprev, 'up' => $nup, }, 'new' => { 'next' => '', 'prev' => '', 'up' => '', }, 'title' => $nname, 'file' => $main::current_file, 'depth' => -$current_depth - 1, 'menu' => undef, 'dirty' => 0, }; $node_map{$nname} = $current_node; push(@node_list, $current_node); push(@{$main::current_file->{'nodes'}}, $current_node); } #------------------------------------------------------------------------------ # Add a menu item to a menu record's item list. #------------------------------------------------------------------------------ sub add_menu_item { my ($item_list, $node, $title) = @_; $title = '' if $node eq $title; my $item = { 'node' => $node, 'title' => $title, }; push(@{$item_list}, $item); } #------------------------------------------------------------------------------ # Parse a menu item ("Entry:Node. Title" or "Node:: Title"). #------------------------------------------------------------------------------ sub parse_menu_item { my $item = shift; return () unless $item =~ /^\s*\*\s+(.+?):(.*?)[:,.\t\n]\s*(.*)\s*$/; my ($entry, $node, $title) = ($1, $2, $3); $node = $entry unless $node; return ($node, $title); } #------------------------------------------------------------------------------ # Scan a menu. Build a new menu record and then iteratively scan each item # contained within the menu. #------------------------------------------------------------------------------ sub scan_menu { fatal "Orphaned \@menu outside of \@node block at line " . "$main::line_number in $main::current_file->{'path'}" unless $current_node; fatal "Mutiple \@menus in node \"$current_node->{'name'}\" at line " . "$main::line_number in $main::current_file->{'path'}" if $current_node->{'menu'}; my $handle = shift; my $start_line = $main::line_number; my $menu = { 'node' => $current_node, 'file' => $main::current_file, 'items' => [], 'detail' => undef, 'dirty' => 0, }; $current_node->{'menu'} = $menu; push(@menu_list, $menu); push(@{$main::current_file->{'menus'}}, $menu); my ($line, $key, $option) = (undef, undef, undef); while (($line, $key, $option) = input_line($handle)) { $main::line_number++; return if $key eq 'end' && $option eq 'menu'; next unless my ($node, $title) = parse_menu_item($line); add_menu_item($menu->{'items'}, $node, $title); } fatal "Missing \"\@end menu\" near line $start_line in " . "$main::current_file->{'path'}."; } #------------------------------------------------------------------------------ # Ignore a section of text enclosed within a specified "@foo...@end foo" block. #------------------------------------------------------------------------------ sub scan_ignored { my ($key, $handle) = @_; my $start_line = $main::line_number; while (<$handle>) { $main::line_number++; next unless /\@end\s+(\w+)\b/; return if $key eq $1; } fatal "Missing \"\@end $key\" near line $start_line in " . "$main::current_file->{'path'}."; } #------------------------------------------------------------------------------ # Scan a sectioning command which indicate a node's depth. #------------------------------------------------------------------------------ sub scan_depth { my ($key, $title) = @_; $current_depth = $depth_map{$key}; $current_depth += $depth_adjustment if ($depth_adjustment < 0 && $current_depth > $depth_min) || ($depth_adjustment > 0 && $current_depth < $depth_max); if ($current_node && $current_node->{'depth'} < 0) { $current_node->{'depth'} = $current_depth; $current_node->{'title'} = $title; } } #------------------------------------------------------------------------------ # Recursively scan included files. Understands the standard @include directive # as well as @import{} which is a special Texinfo macro designed by Eric # Sunshine to deal with differences in pathname syntax between platorms. #------------------------------------------------------------------------------ sub scan_include { my $line = shift; my $child; $line =~ /^\@include\s+(.+)$/ && do { $child = $1; }; $line =~ /^\@imports*\s*\{(.+)\}/ && do { $child = $1; $child =~ tr|,|/| }; fatal "Missing filename following \@include or \@import{} at line " . "$main::line_number in $main::current_file->{'path'}" unless $child; return scan_file($child); } #------------------------------------------------------------------------------ # Scan a file and build a list of nodes and menus. Handle sectioning # directives which indicate a node's depth (and implicitly which other nodes # are its siblings, children, and parent). Recursively scan included files. #------------------------------------------------------------------------------ sub scan_file { local ($main::current_file, $main::line_number); my $file = shift; my $handle = open_input_file($file); my $path = $main::current_file->{'path'}; local $main::scan_depth = $main::scan_depth + 1; print ' ' x ($main::scan_depth - 1) . "$path\n" if $main::opt_verbose; my ($line, $key, $option) = (undef, undef, undef); LINE: while (($line, $key, $option) = input_line($handle)) { $main::line_number++; next LINE unless $key; # Got a @directive? next LINE if $key eq 'c' || $key eq 'comment'; # Ignore @comments. return undef if $key eq 'bye'; # @bye terminates. $depth_adjustment++, next LINE if $key eq 'raisesections'; $depth_adjustment--, next LINE if $key eq 'lowersections'; scan_depth($key, $option), next LINE if exists $depth_map{$key}; scan_ignored($key, $handle), next LINE if exists $ignored_blocks{$key}; scan_node($option), next LINE if $key eq 'node'; scan_menu($handle), next LINE if $key eq 'menu'; warning("Orphaned \@detailmenu at line $main::line_number in $path."), next LINE if $key eq 'detailmenu'; if ($key =~ /include|imports*/) { scan_include($line) or return undef; next LINE; } } return 1; } #------------------------------------------------------------------------------ # Scan the root Texinfo file and all files it includes directly or indirectly. #------------------------------------------------------------------------------ sub scan_root_file { my $file = shift; print_title("Scanning") if $main::opt_verbose; scan_file($file) and warning "Missing \"\@bye\" directive."; print "\n" if $main::opt_verbose; } #------------------------------------------------------------------------------ # Update a node pointer and mark the node as dirty if necessary. #------------------------------------------------------------------------------ sub node_set { my ($node, $key, $value) = @_; $node->{'new'}{$key} = ($value ? $value->{'name'} : ''); } sub node_set_next { node_set(shift, 'next', shift); } sub node_set_prev { node_set(shift, 'prev', shift); } sub node_set_up { node_set(shift, 'up' , shift); } #------------------------------------------------------------------------------ # Repair links of all @nodes lines. Set up the links in the customary Texinfo # fashion where "next" and "previous" point at sibling nodes at the same # "depth" (chapter, section, subsection, etc.), rather than merely pointing at # physical neighboring nodes. The "up" link points at the immediate parent # node. The "top" node is handled specially. Its "next" link points at its # first child node (rather than a sibling), and its "up" link points at the # literal name "(dir)". #------------------------------------------------------------------------------ sub repair_nodes { my @prev_at_depth; my $last_depth = -1; my $node; foreach $node (@node_list) { my $depth = node_depth($node); my $parent_depth = ($depth > 0 ? $depth - 1 : 0); if ($depth < $last_depth) { my $i; foreach $i ($depth + 1..$last_depth) { $prev_at_depth[$i] = undef; } } my $prev_node = $prev_at_depth[$depth]; node_set_next($prev_node, $node) if $prev_node; my $up_node = $prev_at_depth[$parent_depth]; node_set_up($node, $up_node) unless $depth == 0; # 'top' special case. $prev_node = $up_node unless $prev_node; node_set_prev($node, $prev_node); if ($last_depth == 0) { # 'top' special case. my $top_node = $prev_at_depth[$last_depth]; node_set_next($top_node, $node); node_set_up($top_node, { 'name' => '(dir)' }); } $prev_at_depth[$depth] = $node; $last_depth = $depth; } foreach $node (@node_list) { $node->{'dirty'} = 1 if $node->{'new'}{'next'} ne $node->{'old'}{'next'} || $node->{'new'}{'prev'} ne $node->{'old'}{'prev'} || $node->{'new'}{'up' } ne $node->{'old'}{'up' }; } } #------------------------------------------------------------------------------ # Perform a deep comparision of two menu item lists to see if they differ. #------------------------------------------------------------------------------ sub menus_differ { my ($old_items, $new_items) = @_; return 1 unless scalar(@{$old_items}) == scalar(@{$new_items}); my $i; for ($i = 0; $i < @{$new_items}; $i++) { my $old_item = @{$old_items}[$i]; my $new_item = @{$new_items}[$i]; return 1 if ($old_item->{'node'} ne $new_item->{'node'} || $old_item->{'title'} ne $new_item->{'title'}); } return 0; } #------------------------------------------------------------------------------ # Repair all menus in the entire document hierarchy. For each node, if it # has an existing menu, build a brand new menu from scratch and replace the # old menu with the new one if the two menus differ in any way. #------------------------------------------------------------------------------ sub repair_menus { my $i; for ($i = 0; $i < @node_list; $i++) { my $menu_node = $node_list[$i]; my $menu = $menu_node->{'menu'}; next unless $menu; my $item_depth = node_depth($menu_node) + 1; # Node depth of items. my $items = []; my $j; for ($j = $i + 1; $j < @node_list; $j++) { my $node = $node_list[$j]; my $node_depth = node_depth($node); next if $node_depth > $item_depth; last if $node_depth < $item_depth; add_menu_item($items, $node->{'name'}, $node->{'title'}); } if (menus_differ($menu->{'items'}, $items)) { $menu->{'items'} = $items; $menu->{'dirty'} = 1; } } } #------------------------------------------------------------------------------ # Patch a @node by emitting the correct links if the old links are broken. #------------------------------------------------------------------------------ sub patch_node { my ($lines, $node_line) = @_; my ($nname, $nnext, $nprev, $nup) = parse_node($node_line); if (exists $node_map{$nname}) { my $node = $node_map{$nname}; if ($node->{'dirty'}) { $node_line = "$nname, " . "$node->{'new'}{'next'}, " . "$node->{'new'}{'prev'}, " . "$node->{'new'}{'up'}"; $broken_nodes++; } } push(@{$lines}, "\@node $node_line\n"); } #------------------------------------------------------------------------------ # Patch a @menu by emitting an entire new menu if the old one is broken. # Always emits items of form "Node:: Title", or "Node::" if Title is identical # to Node. Never emits item of form "Entry:Node. Title" since Entry can not # be automatically gleaned from any source, whereas Node and Title can. #------------------------------------------------------------------------------ sub patch_menu { my ($lines, $menu, $handle) = @_; push(@{$lines}, "\@menu\n"); # Always emit whether dirty or not. if ($menu->{'dirty'}) { scan_ignored('menu', $handle); # Skip the old menu. my $item; foreach $item (@{$menu->{'items'}}) { # Emit the new menu. my $line = "* $item->{'node'}::" . ($item->{'title'} ? " $item->{'title'}" : '') . "\n"; push(@{$lines}, $line); } push(@{$lines}, "\@end menu\n"); $broken_menus++; } } #------------------------------------------------------------------------------ # Patch a file by repairing each broken node and menu. #------------------------------------------------------------------------------ sub patch_file { my $file = shift; my $path = $file->{'path'}; my $menu_number = 0; print "$path\n" if $main::opt_verbose; $broken_files++; local *handle = new_file_handle(); open(*handle, $path) or fatal "Failed to open file: $path"; my $lines = []; my ($line, $key, $option) = (undef, undef, undef); while (($line, $key, $option) = input_line(*handle)) { patch_node($lines, $option), next if $key eq 'node'; patch_menu($lines, $file->{'menus'}[$menu_number++], *handle), next if $key eq 'menu'; push(@{$lines}, $line); } close(*handle); unless ($main::opt_debug) { open(*handle, ">$path") or fatal "Failed to truncate file: $path"; print {*handle} @{$lines} or fatal "Failed to write file: $path"; close(*handle); } } #------------------------------------------------------------------------------ # Patch all files which contain broken nodes or menus. #------------------------------------------------------------------------------ sub patch_files { print_title("Repairing") if $main::opt_verbose; my $file; FILE: foreach $file (@file_list) { my $node; foreach $node (@{$file->{'nodes'}}) { patch_file($file), next FILE if $node->{'dirty'}; } my $menu; foreach $menu (@{$file->{'menus'}}) { patch_file($file), next FILE if $menu->{'dirty'}; } } print "\n" if $main::opt_verbose; } #------------------------------------------------------------------------------ # Display repair summary. #------------------------------------------------------------------------------ sub summary { print_title("Repair Summary"); print <<EOS; Nodes: $broken_nodes of ${\scalar(@node_list)} Menus: $broken_menus of ${\scalar(@menu_list)} Files: $broken_files of ${\scalar(@file_list)} EOS } #------------------------------------------------------------------------------ # Display usage statement. #------------------------------------------------------------------------------ sub print_usage { my $stream = shift; $stream = \*STDOUT unless $stream; print $stream <<EOT; $PROG_NAME version $PROG_VERSION $COPYRIGHT Repairs out-of-date and broken \@node directives and \@menu blocks. Understands \@include and \@import{} directives and will correctly repair an entire Texinfo tree when given a root Texinfo file which directly or indirectly includes all other files within the tree. Usage: $PROG_NAME [options] <file> <file> is the root file of the entire Texinfo hierarchy. This file is repaired along with all files which it directly or indirectly includes. Options: -I <dir> --include-dir=<dir> Search directory <dir> when looking for files included by \@include or \@import{}. May be used multiple times to specify additional search directories. -v --verbose Emit informational messages as processing proceeds. -d --debug Perform all repair work but do not actually modify any files. -h --help Print this usage message. EOT } #------------------------------------------------------------------------------ # Process command-line options. #------------------------------------------------------------------------------ sub process_options { GetOptions(@script_options) or usage_error(''); print_help() if $main::opt_help; usage_error("Must specify exactly one input file.\n") unless @ARGV == 1; print "$PROG_NAME version $PROG_VERSION\n$COPYRIGHT\n\n"; print "Debugging enabled.\n\n" if $main::opt_debug; } sub print_help { print_usage(\*STDOUT); exit(0); } sub usage_error { my $msg = shift; print STDERR "$msg\n"; print_usage(\*STDERR); exit(1); } #------------------------------------------------------------------------------ # Perform the complete repair process. #------------------------------------------------------------------------------ process_options(); scan_root_file(shift @ARGV); repair_nodes(); repair_menus(); patch_files(); summary(); --- NEW FILE: T2h_i18n.pm --- #+############################################################################## # # T2h_i18n.pm: Internationalization for texi2html # # 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; package Texi2HTML::I18n; use strict; use vars qw( @ISA @EXPORT ); use Exporter; @ISA = qw(Exporter); @EXPORT = qw(pretty_date); my $language; my $i18n_dir = 'i18n'; # name of the directory containing the per language files #my $translation_file = 'translations.pl'; # file containing all the translations #my @known_languages = ('de', 'nl', 'es', 'no', 'pt', 'fr'); # The supported # languages ######################################################################## # Language dependencies: # To add a new language extend the WORDS hash and create $T2H_<...>_WORDS hash # To redefine one word, simply do: # $T2h_i18n::T2H_LANGUAGES->{<language>}->{<word>} = 'whatever' in your personal init file. # my $T2H_WORDS_EN = { # titles of pages #'Table of Contents' => 'Table of Contents', #'Short Table of Contents' => 'Short Table of Contents', #'Index' => 'Index', #'About This Document' => 'About This Document', #'Footnotes' => 'Footnotes', #'See' => 'See', #'see' => 'see', #'section' => 'section', 'About This Document' => '', 'Table of Contents' => '', 'Short Table of Contents', => '', 'Index' => '', 'Footnotes' => '', 'See' => '', 'see' => '', 'section' => '', 'Top' => '', 'Untitled Document' => '', # If necessary, we could extend this as follows: # # text for buttons # 'Top_Button' => 'Top', # 'ToC_Button' => 'Contents', # 'Overview_Button' => 'Overview', # 'Index_button' => 'Index', # 'Back_Button' => 'Back', # 'FastBack_Button' => 'FastBack', # 'Prev_Button' => 'Prev', # 'Up_Button' => 'Up', # 'Next_Button' => 'Next', # 'Forward_Button' =>'Forward', # 'FastWorward_Button' => 'FastForward', # 'First_Button' => 'First', # 'Last_Button' => 'Last', # 'About_Button' => 'About' 'January' => '', 'February' => '', 'March' => '', 'April' => '', 'May' => '', 'June' => '', 'July' => '', 'August' => '', 'September' => '', 'October' => '', 'November' => '', 'December' => '', 'T2H_today' => '%s, %d %d', }; my $T2H_WORDS_DE = { 'Table of Contents' => 'Inhaltsverzeichniss', 'Short Table of Contents' => 'Kurzes Inhaltsverzeichniss', 'Index' => 'Index', 'About This Document' => 'Über dieses Dokument', 'Footnotes' => 'Fußnoten', 'See' => 'Siehe', 'see' => 'siehe', 'section' => 'Abschnitt', 'January' => 'Januar', 'February' => 'Februar', 'March' => 'März', 'April' => 'April', 'May' => 'Mai', 'June' => 'Juni', 'July' => 'Juli', 'August' => 'August', 'September' => 'September', 'October' => 'Oktober', 'November' => 'November', 'December' => 'Dezember', }; my $T2H_WORDS_NL = { 'Table of Contents' => 'Inhoudsopgave', 'Short Table of Contents' => 'Korte inhoudsopgave', 'Index' => 'Index', #Not sure ;-) 'About This Document' => 'No translation available!', #No translation available! 'Footnotes' => 'No translation available!', #No translation available! 'See' => 'Zie', 'see' => 'zie', 'section' => 'sectie', 'January' => 'Januari', 'February' => 'Februari', 'March' => 'Maart', 'April' => 'April', 'May' => 'Mei', 'June' => 'Juni', 'July' => 'Juli', 'August' => 'Augustus', 'September' => 'September', 'October' => 'Oktober', 'November' => 'November', 'December' => 'December', }; my $T2H_WORDS_ES = { 'Table of Contents' => 'índice General', 'Short Table of Contents' => 'Resumen del Contenido', 'Index' => 'Index', #Not sure ;-) 'About This Document' => 'No translation available!', #No translation available! 'Footnotes' => 'Fußnoten', 'See' => 'Véase', 'see' => 'véase', 'section' => 'sección', 'January' => 'enero', 'February' => 'febrero', 'March' => 'marzo', 'April' => 'abril', 'May' => 'mayo', 'June' => 'junio', 'July' => 'julio', 'August' => 'agosto', 'September' => 'septiembre', 'October' => 'octubre', 'November' => 'noviembre', 'December' => 'diciembre', }; my $T2H_WORDS_NO = { 'Table of Contents' => 'Innholdsfortegnelse', 'Short Table of Contents' => 'Kort innholdsfortegnelse', 'Index' => 'Indeks', #Not sure ;-) 'About This Document' => 'No translation available!', #No translation available! 'Footnotes' => 'No translation available!', 'See' => 'Se', 'see' => 'se', 'section' => 'avsnitt', 'January' => 'januar', 'February' => 'februar', 'March' => 'mars', 'April' => 'april', 'May' => 'mai', 'June' => 'juni', 'July' => 'juli', 'August' => 'august', 'September' => 'september', 'October' => 'oktober', 'November' => 'november', 'December' => 'desember', }; my $T2H_WORDS_PT = { 'Table of Contents' => 'Sumário', 'Short Table of Contents' => 'Breve Sumário', 'Index' => 'Índice', #Not sure ;-) 'About This Document' => 'No translation available!', #No translation available! 'Footnotes' => 'No translation available!', 'See' => 'Veja', 'see' => 'veja', 'section' => 'Seção', 'January' => 'Janeiro', 'February' => 'Fevereiro', 'March' => 'Março', 'April' => 'Abril', 'May' => 'Maio', 'June' => 'Junho', 'July' => 'Julho', 'August' => 'Agosto', 'September' => 'Setembro', 'October' => 'Outubro', 'November' => 'Novembro', 'December' => 'Dezembro', }; my $T2H_WORDS_FR = { 'Table of Contents' => 'Table des matières', 'Short Table of Contents' => 'Résumée du contenu', 'Index' => 'Index', 'About This Document' => 'A propos de ce document', 'Footnotes' => 'Notes de bas de page', 'See' => 'Voir', 'see' => 'voir', 'section' => 'section', 'January' => 'Janvier', 'February' => 'Février', 'March' => 'Mars', 'April' => 'Avril', 'May' => 'Mai', 'June' => 'Juin', 'July' => 'Juillet', 'August' => 'Août', 'September' => 'Septembre', 'October' => 'Octobre', 'November' => 'Novembre', 'December' => 'Décembre', 'T2H_today' => 'le %2$d %1$s %3$d' }; #$T2H_LANGUAGES = #{ # 'en' => $T2H_WORDS_EN, # 'de' => $T2H_WORDS_DE, # 'nl' => $T2H_WORDS_NL, # 'es' => $T2H_WORDS_ES, # 'no' => $T2H_WORDS_NO, # 'pt' => $T2H_WORDS_PT, # 'fr' => $T2H_WORDS_FR, #}; sub set_language($) { my $lang = shift; if (defined($lang) && exists($Texi2HTML::Config::LANGUAGES->{$lang}) && defined($Texi2HTML::Config::LANGUAGES->{$lang})) { $language = $lang; return 1; } else { return 0; } } my @MONTH_NAMES = ( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ); my $I = \&get_string; sub pretty_date($) { my $lang = shift; my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $year += ($year < 70) ? 2000 : 1900; # obachman: Let's do it as the Americans do #return($MONTH_NAMES->{$lang}[$mon] . ", " . $mday . " " . $year); #return(sprintf(&$I('T2H_today'), (get_string($MONTH_NAMES[$mon]), $mday, $year))); return &$I('%{month}, %{day} %{year}', { 'month' => get_string($MONTH_NAMES[$mon]), 'day' => $mday, 'year' => $year }); } my $error_no_en = 0; sub get_string($;$$) { my $string = shift; my $arguments = shift; my $state = shift; my $T2H_LANGUAGES = $Texi2HTML::Config::LANGUAGES; if (! exists($T2H_LANGUAGES->{'en'})) { unless($error_no_en) { print STDERR "i18n: no LANGUAGES->{'en'} hash\n"; $error_no_en = 1; } } else { print STDERR "i18n: missing string $string\n" unless (exists ($T2H_LANGUAGES->{'en'}->{$string})); if (defined ($T2H_LANGUAGES->{$language}->{$string}) and ($T2H_LANGUAGES->{$language}->{$string} ne '')) { $string = $T2H_LANGUAGES->{$language}->{$string}; } elsif (defined ($T2H_LANGUAGES->{'en'}->{$string}) and ($T2H_LANGUAGES->{'en'}->{$string} ne '')) { $string = $T2H_LANGUAGES->{'en'}->{$string}; } } return main::substitute_line($string, $state) unless (defined($arguments) or !keys(%$arguments)); my $result = ''; while ($string) { if ($string =~ s/^([^%]*)%//) { $result .= $1 if (defined($1)); $result .= '%'; if ($string =~ s/^%//) { $result .= '%'; } elsif ($string =~ /^\{(\w+)\}/ and exists($arguments->{$1})) { $string =~ s/^\{(\w+)\}//; if (!$state->{'keep_texi'}) { $result .= "\@\{$1\@\}"; } else { $result .= "\{$1\}"; } } else { $result .= '%'; } next; } else { $result .= $string; last; } } if (!$state->{'keep_texi'}) { $string = main::substitute_line($result, $state); } else { $string = $result; } $result = ''; while ($string) { if ($string =~ s/^([^%]*)%//) { $result .= $1 if (defined($1)); if ($string =~ s/^%//) { $result .= '%'; } elsif ($string =~ /^\{(\w+)\}/ and exists($arguments->{$1})) { $string =~ s/^\{(\w+)\}//; $result .= $arguments->{$1}; } else { $result .= '%'; } next; } else { $result .= $string; last; } } return $result; } 1; --- NEW FILE: texi2html.pl --- #! /usr/bin/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. # [...11786 lines suppressed...] #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 --- NEW FILE: texi2html.patch --- --- texi2html.pl Wed Jun 29 10:48:57 2005 +++ CrystalSpace/CS/docs/support/texi2html.pl Wed Jun 29 10:51:58 2005 @@ -1,4 +1,4 @@ -#! @PERL@ +#! /usr/bin/perl 'di '; 'ig 00 '; #+############################################################################## @@ -32,8 +32,11 @@ use strict; # used in case of tests, to revert to "C" locale. use POSIX qw(setlocale LC_ALL LC_CTYPE); +# used to obtain the name of the current working directory +use Cwd; # used to find a relative path back to the current working directory use File::Spec; + # # According to # lar...@sd... (Larry Jones) @@ -55,7 +58,7 @@ #--############################################################################## # CVS version: -# $Id: texi2html.patch,v 1.1 2005/07/14 18:40:45 vknecht Exp $ +# $Id: texi2html.patch,v 1.1 2005/07/14 18:40:45 vknecht Exp $ # Homepage: my $T2H_HOMEPAGE = "http://texi2html.cvshome.org/"; @@ -71,7 +74,7 @@ EOT # Version: set in configure.in -my $THISVERSION = '@PACKAGE_VERSION@'; +my $THISVERSION = '1.76'; my $THISPROG = "texi2html $THISVERSION"; # program name and version # set by configure, prefix for the sysconfdir and so on @@ -2360,17 +2363,6 @@ # 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 @@ -2500,7 +2492,7 @@ my $path_to_working_dir = $docu_rdir; if ($docu_rdir ne '') { - my $cwd = getcwd; + my $cwd = cwd; my $docu_path = $docu_rdir; $docu_path = $cwd . '/' . $docu_path unless ($docu_path =~ /^\//); my @result = (); @@ -3037,7 +3029,7 @@ } else { - if (main::getcwd() =~ /\./) + if (cwd() =~ /\./) { warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n"; $dotbug = 1; @@ -4415,12 +4407,18 @@ { $section->{'number'} = $number; } + $section->{'id'} = $section->{'number'}; $level--; } my $toplevel_number = $previous_numbers[$toplevel]; $toplevel_number = 0 if (!defined($toplevel_number)); $section->{'number'} = "$toplevel_number.$section->{'number'}"; + $section->{'id'} = $section->{'number'}; } + else + { + $section->{'id'} = $section->{'texi'}; + } # find the previous section if (defined($previous_sections[$section->{'level'}])) { --- NEW FILE: translations.pl --- $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'} = {}; $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' => '', ... [truncated message content] |