texinfo-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

branch master updated: * tp/Texinfo/Common.pm (%default_main_program_com


From: Patrice Dumas
Subject: branch master updated: * tp/Texinfo/Common.pm (%default_main_program_command_line_options), tp/Texinfo/Config.pm (GNUT_set_main_program_default, Texinfo::MainConfig, new, get_conf, set_conf), texi2any.pl: add a scope with functions that mimics parser or converter with get_conf() and set_conf() methods, have access to Texinfo::Config informations. This allows to set a $main_configuration object in main program that is passed to functions that need information. Used in tests too, simply setting a hash reference a [...]
Date: Fri, 03 Sep 2021 12:59:45 -0400

This is an automated email from the git hooks/post-receive script.

pertusus pushed a commit to branch master
in repository texinfo.

The following commit(s) were added to refs/heads/master by this push:
     new 85c66a7  * tp/Texinfo/Common.pm 
(%default_main_program_command_line_options), tp/Texinfo/Config.pm 
(GNUT_set_main_program_default, Texinfo::MainConfig, new, get_conf, set_conf), 
texi2any.pl: add a scope with functions that mimics parser or converter with 
get_conf() and set_conf() methods, have access to Texinfo::Config informations. 
 This allows to set a $main_configuration object in main program that is passed 
to functions that need information. Used in tests too, simply setting [...]
85c66a7 is described below

commit 85c66a7d11e62b64dbe391b5f77bd2631d3c9542
Author: Patrice Dumas <pertusus@free.fr>
AuthorDate: Fri Sep 3 18:59:35 2021 +0200

    * tp/Texinfo/Common.pm (%default_main_program_command_line_options),
    tp/Texinfo/Config.pm (GNUT_set_main_program_default,
    Texinfo::MainConfig, new, get_conf, set_conf), texi2any.pl: add
    a scope with functions that mimics parser or converter with
    get_conf() and set_conf() methods, have access to Texinfo::Config
    informations.  This allows to set a $main_configuration object in
    main program that is passed to functions that need information.
    Used in tests too, simply setting a hash reference and not accessing
    Texinfo::Config informations.
    handle FORMAT_MENU and CHECK_NORMAL_MENU_STRUCTURE more like a
    normal main program option.
    
    * tp/Texinfo/Common.pm (%default_structure_customization_values),
    tp/Texinfo/XS/parsetexi/Parsetexi.pm, tp/Texinfo/ParserNonXS.pm:
    remove %default_structure_customization_values.
    
    * tp/Texinfo/Common.pm (set_output_encodings),
    tp/Texinfo/Convert/Converter.pm (converter), texi2any.pl: add
    set_output_encodings(), based on Texinfo::Converter::Convert
    to call on main program configuration for
    Texinfo::Common::output_files_open_out().
---
 ChangeLog                            |  25 +++++++
 tp/Texinfo/Common.pm                 |  43 ++++++++----
 tp/Texinfo/Config.pm                 |  67 ++++++++++++++++++
 tp/Texinfo/Convert/Converter.pm      |  13 +---
 tp/Texinfo/ParserNonXS.pm            |   1 -
 tp/Texinfo/XS/parsetexi/Parsetexi.pm |   3 +-
 tp/t/test_utils.pl                   |  71 +++++++++++--------
 tp/texi2any.pl                       | 131 ++++++++++++++++++++---------------
 8 files changed, 241 insertions(+), 113 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e1dbb50..13ded9f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2021-09-03  Patrice Dumas  <pertusus@free.fr>
+
+       * tp/Texinfo/Common.pm (%default_main_program_command_line_options),
+       tp/Texinfo/Config.pm (GNUT_set_main_program_default,
+       Texinfo::MainConfig, new, get_conf, set_conf), texi2any.pl: add
+       a scope with functions that mimics parser or converter with
+       get_conf() and set_conf() methods, have access to Texinfo::Config
+       informations.  This allows to set a $main_configuration object in
+       main program that is passed to functions that need information.
+       Used in tests too, simply setting a hash reference and not accessing
+       Texinfo::Config informations.
+       handle FORMAT_MENU and CHECK_NORMAL_MENU_STRUCTURE more like a
+       normal main program option.
+       
+
+       * tp/Texinfo/Common.pm (%default_structure_customization_values),
+       tp/Texinfo/XS/parsetexi/Parsetexi.pm, tp/Texinfo/ParserNonXS.pm:
+       remove %default_structure_customization_values.
+
+       * tp/Texinfo/Common.pm (set_output_encodings),
+       tp/Texinfo/Convert/Converter.pm (converter), texi2any.pl: add
+       set_output_encodings(), based on Texinfo::Converter::Convert
+       to call on main program configuration for
+       Texinfo::Common::output_files_open_out().
+
 2021-09-02  Patrice Dumas  <pertusus@free.fr>
 
        * tp/Texinfo/Convert/Converter.pm (converter): set
diff --git a/tp/Texinfo/Common.pm b/tp/Texinfo/Common.pm
index d0d0334..70c9156 100644
--- a/tp/Texinfo/Common.pm
+++ b/tp/Texinfo/Common.pm
@@ -28,6 +28,7 @@ use 5.006;
 # to determine the null file
 use Config;
 use File::Spec;
+use Encode;
 
 use Texinfo::Documentlanguages;
 # used in functions, but Texinfo::Convert::Texinfo uses
@@ -140,17 +141,6 @@ our %default_parser_customization_values = 
(%default_parser_common_customization
   %default_parser_specific_customization);
 
 
-# Customization variables set in the parser for other modules, and the
-# default values.
-our %default_structure_customization_values = (
-  # following are used in Texinfo::Structuring
-  'CHECK_NORMAL_MENU_STRUCTURE' => 0, # output warnings when node with
-            # automatic direction does directions in menu are not consistent
-            # with sectionning, and when node directions are not consistent
-            # with menu directions.  Used in complete_node_tree_with_menus()
-);
-
-
 # @-commands that can be used multiple time in a document and default
 # values.  Associated with customization values too.
 our %document_settable_multiple_at_commands = (
@@ -214,7 +204,6 @@ our %default_converter_command_line_options = (
   'SPLIT'                => undef,   # --split
   'HEADERS'              => 1,       # --headers.  Used to set diverse 
customization options
                                      # in main program.  Only directly used in 
HTML converter
-  'FORMAT_MENU'          => undef,   # --headers.  Modified by the format.
   'NODE_FILES'           => undef,   # --node-files.  Depend on SPLIT
   'VERBOSE'              => undef,   # --verbose
   'OUTFILE'              => undef,   # --output    If non split and not ending 
by /. 
@@ -229,14 +218,18 @@ our %default_converter_command_line_options = (
                                      # converter defaults.
 );
 
-# only used in main program, defaults documented in manual
+# used in main program, defaults documented in manual
 my %default_main_program_command_line_options = (
+  # only in main program
   'MACRO_EXPAND'         => undef,   # --macro-expand
   # used in HTML only, called from main program
   'INTERNAL_LINKS'       => undef,   # --internal-links
   'ERROR_LIMIT'          => 100,     # --error-limit
   'FORCE'                => undef,   # --force
   'NO_WARN'              => undef,   # --no-warn
+
+  # following also used in converters
+  'FORMAT_MENU'          => 'menu',  # --headers.  Modified by the format.
 );
 
 # used in main program, defaults documented in manual
@@ -247,6 +240,10 @@ my %default_main_program_customization = (
   'TREE_TRANSFORMATIONS'        => undef,
   'DUMP_TREE'                   => undef,
   'DUMP_TEXI'                   => undef,
+  'CHECK_NORMAL_MENU_STRUCTURE' => 0, # output warnings when node with
+            # automatic direction does directions in menu are not consistent
+            # with sectionning, and when node directions are not consistent
+            # with menu directions.
 );
 
 # defaults for the main program.  In general transmitted to converters as 
defaults
@@ -282,7 +279,6 @@ our @variable_string_settables = (
 'COPIABLE_ANCHORS',
 'CHAPTER_HEADER_LEVEL',
 'CHECK_HTMLXREF',
-'CHECK_NORMAL_MENU_STRUCTURE',
 'CLOSE_QUOTE_SYMBOL',
 'COMPLEX_FORMAT_IN_TABLE',
 'CONTENTS_OUTPUT_LOCATION',
@@ -1328,6 +1324,25 @@ sub warn_unknown_split($) {
   return @messages;
 }
 
+# in Texinfo::Structuring?
+sub set_output_encodings($$)
+{
+  my $configuration_informations = shift;
+  my $parser_informations = shift;
+
+  $configuration_informations->set_conf('OUTPUT_ENCODING_NAME',
+               $parser_informations->{'input_encoding_name'})
+     if ($parser_informations->{'input_encoding_name'});
+  if (!$configuration_informations->get_conf('OUTPUT_PERL_ENCODING')
+       and $configuration_informations->get_conf('OUTPUT_ENCODING_NAME')) {
+    my $perl_encoding
+      = 
Encode::resolve_alias($configuration_informations->get_conf('OUTPUT_ENCODING_NAME'));
+    if ($perl_encoding) {
+      $configuration_informations->set_conf('OUTPUT_PERL_ENCODING', 
$perl_encoding);
+    }
+  }
+}
+
 # This should do the job, or at least don't do wrong if $self
 # is not defined, as could be the case if called from 
 # Texinfo::Convert::Text.
diff --git a/tp/Texinfo/Config.pm b/tp/Texinfo/Config.pm
index 0cd2582..dfb3cbb 100644
--- a/tp/Texinfo/Config.pm
+++ b/tp/Texinfo/Config.pm
@@ -157,6 +157,23 @@ sub GNUT_set_from_cmdline($$) {
   return 1;
 }
 
+# add default based, for instance, on the format.
+sub GNUT_set_main_program_default($$) {
+  my $var = shift;
+  my $value = shift;
+
+  ($var, $value) = _GNUT_map_obsolete_options($var, $value);
+  if (!defined($var)) {
+    return 1;
+  }
+
+  return 0 if (defined($cmdline_options->{$var})
+    or defined($init_files_options->{$var}));
+  $main_program_default_options->{$var} = $value;
+  return 1;
+}
+
+
 # called both from main program and init files.
 sub texinfo_add_to_option_list($$)
 {
@@ -294,4 +311,54 @@ sub GNUT_get_types_conversion()
 }
 
 
+package Texinfo::MainConfig;
+
+# the objective of this small package is to be in another
+# scope than init files, still have access to configuration
+# options, and setup blessed object that can call a
+# get_conf() and set_conf() method like parser or converter
+# that return the same as Texinfo::Config::texinfo_get_conf
+
+# this is used in tests too.  In the tests nothing from
+# Texinfo::Config is used, and it is assumed that the
+# configuration is available as a hash reference key
+# value, which is the case if new is called with an hash
+# reference argument.
+
+my $additional_conf = {};
+
+sub new(;$)
+{
+  my $options = shift;
+  if (defined($options)) {
+    # creates a new object based on input hash reference
+    %$additional_conf = %$options;
+    bless $options;
+  } else {
+    # use Texinfo::Config
+    bless $cmdline_options;
+  }
+}
+
+sub get_conf($$)
+{
+  my $self = shift;
+  my $var = shift;
+
+  if (defined($additional_conf->{$var})) {
+    return $additional_conf->{$var};
+  }
+  return Texinfo::Config::texinfo_get_conf($var);
+}
+
+sub set_conf($$$)
+{
+  my $self = shift;
+  my $var = shift;
+  my $val = shift;
+  # overrides command line
+  $additional_conf->{$var} = $val;
+}
+
+
 1;
diff --git a/tp/Texinfo/Convert/Converter.pm b/tp/Texinfo/Convert/Converter.pm
index 54b2b33..3cb3152 100644
--- a/tp/Texinfo/Convert/Converter.pm
+++ b/tp/Texinfo/Convert/Converter.pm
@@ -219,17 +219,8 @@ sub converter(;$)
     }
   }
 
-  $converter->set_conf('OUTPUT_ENCODING_NAME', 
-                 $converter->{'parser_info'}->{'input_encoding_name'})
-     if ($converter->{'parser_info'}->{'input_encoding_name'});
-  if (!$converter->get_conf('OUTPUT_PERL_ENCODING')
-       and $converter->get_conf('OUTPUT_ENCODING_NAME')) {
-    my $perl_encoding 
-      = Encode::resolve_alias($converter->get_conf('OUTPUT_ENCODING_NAME'));
-    if ($perl_encoding) {
-      $converter->set_conf('OUTPUT_PERL_ENCODING', $perl_encoding);
-    }
-  }
+  Texinfo::Common::set_output_encodings($converter,
+    $converter->{'parser_info'});
 
   # turn the array to a hash for speed.  Not sure it really matters for such
   # a small array.
diff --git a/tp/Texinfo/ParserNonXS.pm b/tp/Texinfo/ParserNonXS.pm
index 6731f68..7e462f1 100644
--- a/tp/Texinfo/ParserNonXS.pm
+++ b/tp/Texinfo/ParserNonXS.pm
@@ -152,7 +152,6 @@ my %parser_state_configuration = (
 my %parser_default_configuration = (
     %parser_state_configuration,
     %Texinfo::Common::default_parser_customization_values,
-    %Texinfo::Common::default_structure_customization_values,
 );
 
 # the other possible keys for the parser state are:
diff --git a/tp/Texinfo/XS/parsetexi/Parsetexi.pm 
b/tp/Texinfo/XS/parsetexi/Parsetexi.pm
index d8604fe..c42842a 100644
--- a/tp/Texinfo/XS/parsetexi/Parsetexi.pm
+++ b/tp/Texinfo/XS/parsetexi/Parsetexi.pm
@@ -123,8 +123,7 @@ sub parser (;$$)
         set_accept_internalvalue();
       } elsif ($key eq 'ENABLE_ENCODING'
                or $key eq 'novalidate'
-               or $key eq 'registrar'
-               or 
defined($Texinfo::Common::default_structure_customization_values{$key})) {
+               or $key eq 'registrar') {
         # no action needed
       } else {
         warn "ignoring parser configuration value \"$key\"\n";
diff --git a/tp/t/test_utils.pl b/tp/t/test_utils.pl
index 97f9753..0b2ae41 100644
--- a/tp/t/test_utils.pl
+++ b/tp/t/test_utils.pl
@@ -516,7 +516,7 @@ sub filter_elements_keys {[grep 
{!$avoided_keys_elements{$_}}
 sub set_converter_option_defaults($$$)
 {
   my $converter_options = shift;
-  my $parser_options = shift;
+  my $main_configuration = shift;
   my $format = shift;
   $converter_options = {} if (!defined($converter_options));
   if (!defined($converter_options->{'EXPANDED_FORMATS'})) {
@@ -549,11 +549,11 @@ sub convert_to_plaintext($$$$$$;$)
   my $format = shift;
   my $tree = shift;
   my $parser = shift;
-  my $parser_options = shift;
+  my $main_configuration = shift;
   my $converter_options = shift;
   $converter_options 
     = set_converter_option_defaults($converter_options,
-                                    $parser_options, $format);
+                                    $main_configuration, $format);
   if (!defined($converter_options->{'OUTFILE'})
       and defined($converter_options->{'SUBDIR'})) {
     $converter_options->{'OUTFILE'} 
@@ -584,12 +584,12 @@ sub convert_to_info($$$$$;$)
   my $format = shift;
   my $tree = shift;
   my $parser = shift;
-  my $parser_options = shift;
+  my $main_configuration = shift;
   my $converter_options = shift;
   # FIXME plaintext too?
   $converter_options 
     = set_converter_option_defaults($converter_options,
-                                    $parser_options, $format);
+                                    $main_configuration, $format);
   
   my $converter = 
      Texinfo::Convert::Info->converter ({'DEBUG' => $self->{'DEBUG'},
@@ -610,11 +610,11 @@ sub convert_to_html($$$$$$;$)
   my $format = shift;
   my $tree = shift;
   my $parser = shift;
-  my $parser_options = shift;
+  my $main_configuration = shift;
   my $converter_options = shift;
   $converter_options 
     = set_converter_option_defaults($converter_options,
-                                    $parser_options, 'html');
+                                    $main_configuration, 'html');
   
   $converter_options->{'SPLIT'} = 0
     if ($format eq 'html_text' 
@@ -643,11 +643,11 @@ sub convert_to_xml($$$$$$;$)
   my $format = shift;
   my $tree = shift;
   my $parser = shift;
-  my $parser_options = shift;
+  my $main_configuration = shift;
   my $converter_options = shift;
   $converter_options 
     = set_converter_option_defaults($converter_options,
-                                    $parser_options, 'xml');
+                                    $main_configuration, 'xml');
   
   my $converter =
      Texinfo::Convert::TexinfoXML->converter ({'DEBUG' => $self->{'DEBUG'},
@@ -675,11 +675,11 @@ sub convert_to_docbook($$$$$$;$)
   my $format = shift;
   my $tree = shift;
   my $parser = shift;
-  my $parser_options = shift;
+  my $main_configuration = shift;
   my $converter_options = shift;
   $converter_options 
     = set_converter_option_defaults($converter_options,
-                                    $parser_options, 'docbook');
+                                    $main_configuration, 'docbook');
   
   my $converter =
      Texinfo::Convert::DocBook->converter ({'DEBUG' => $self->{'DEBUG'},
@@ -706,11 +706,11 @@ sub convert_to_latex($$$$$$;$)
   my $format = shift;
   my $tree = shift;
   my $parser = shift;
-  my $parser_options = shift;
+  my $main_configuration = shift;
   my $converter_options = shift;
   $converter_options 
     = set_converter_option_defaults($converter_options,
-                                    $parser_options, 'latex');
+                                    $main_configuration, 'latex');
   
   my $converter =
      Texinfo::Convert::LaTeX->converter ({'DEBUG' => $self->{'DEBUG'},
@@ -797,6 +797,14 @@ sub test($$)
     delete $parser_options->{'SIMPLE_MENU'};
   }
 
+  # always set FORMAT_MENU to menu, which is the default for parser
+  my $added_main_configurations = {'FORMAT_MENU' => 'menu'};
+  if ($parser_options->{'CHECK_NORMAL_MENU_STRUCTURE'}) {
+    $added_main_configurations->{'CHECK_NORMAL_MENU_STRUCTURE'}
+      = $parser_options->{'CHECK_NORMAL_MENU_STRUCTURE'};
+    delete $parser_options->{'CHECK_NORMAL_MENU_STRUCTURE'};
+  }
+
   my %todos;
   if ($parser_options->{'todo'}) {
     %todos = %{$parser_options->{'todo'}};
@@ -826,11 +834,13 @@ sub test($$)
     }
     delete $parser_options->{'init_files'};
   }
-
-  my $parser = Texinfo::Parser::parser({'INCLUDE_DIRECTORIES' => [
-                                          $srcdir.'t/include/'],
+  my $completed_parser_options = {'INCLUDE_DIRECTORIES' => 
[$srcdir.'t/include/'],
                                         'DEBUG' => $self->{'DEBUG'},
-                                       %$parser_options});
+                                       %$parser_options};
+  my $main_configuration = Texinfo::MainConfig::new({ 
%$completed_parser_options,
+                                                      
%$added_main_configurations });
+
+  my $parser = Texinfo::Parser::parser($completed_parser_options);
 
   # take the initial values to record only if there is something new
   my $initial_index_names = $parser->indices_information();
@@ -850,7 +860,8 @@ sub test($$)
   my $parser_informations = $parser->global_informations();
   my ($labels, $targets_list, $nodes_list) = $parser->labels_information();
   my $refs = $parser->internal_references_information();
-  Texinfo::Structuring::associate_internal_references($registrar, $parser,
+  Texinfo::Structuring::associate_internal_references($registrar,
+                                        $main_configuration,
                                         $parser_informations, $labels, $refs);
   my $floats = $parser->floats_information();
 
@@ -859,29 +870,30 @@ sub test($$)
   my $structure_informations = {};
   my ($sectioning_root, $sections_list)
               = Texinfo::Structuring::sectioning_structure($registrar,
-                                                             $parser, $result);
+                                                      $main_configuration, 
$result);
   if ($sectioning_root) {
-    Texinfo::Structuring::warn_non_empty_parts($registrar, $parser, 
$global_commands);
+    Texinfo::Structuring::warn_non_empty_parts($registrar, $main_configuration,
+                                               $global_commands);
     $structure_informations->{'sectioning_root'} = $sectioning_root;
     $structure_informations->{'sections_list'} = $sections_list;
   }
 
   Texinfo::Structuring::number_floats($floats);
 
-  Texinfo::Structuring::set_menus_node_directions($registrar, $parser,
+  Texinfo::Structuring::set_menus_node_directions($registrar, 
$main_configuration,
                   $parser_informations, $global_commands, $nodes_list, 
$labels);
-  my $top_node = Texinfo::Structuring::nodes_tree($registrar, $parser,
+  my $top_node = Texinfo::Structuring::nodes_tree($registrar, 
$main_configuration,
                                     $parser_informations, $nodes_list, 
$labels);
   if (defined($top_node)) {
     $structure_informations->{'top_node'} = $top_node;
   }
 
   if (defined($nodes_list)) {
-    Texinfo::Structuring::complete_node_tree_with_menus($registrar, $parser,
-                                                        $nodes_list, 
$top_node);
-    Texinfo::Structuring::check_nodes_are_referenced($registrar, $parser,
-                                                     $nodes_list, $top_node,
-                                                     $labels, $refs);
+    Texinfo::Structuring::complete_node_tree_with_menus($registrar,
+                                $main_configuration, $nodes_list, $top_node);
+    Texinfo::Structuring::check_nodes_are_referenced($registrar,
+                                          $main_configuration, $nodes_list,
+                                          $top_node, $labels, $refs);
   }
 
   my ($errors, $error_nrs) = $registrar->errors();
@@ -900,7 +912,8 @@ sub test($$)
   my $sorted_index_entries;
   if ($merged_index_entries) {
     $sorted_index_entries 
-      = Texinfo::Structuring::sort_indices_by_letter($parser, $registrar, 
$parser,
+      = Texinfo::Structuring::sort_indices_by_letter($parser, $registrar,
+                                   $main_configuration,
                                    $merged_index_entries, $index_names);
   }
   if ($simple_menus) {
@@ -953,7 +966,7 @@ sub test($$)
       ($converted_errors{$format}, $converted{$format})
            = &{$formats{$format}}($self, $test_name, $format_type, 
                                   $result, $parser, 
-                                  $parser_options, $format_converter_options);
+                                  $main_configuration, 
$format_converter_options);
       $converted_errors{$format} = undef if (!@{$converted_errors{$format}});
 
       # output converted result and errors in files if $arg_output is set
diff --git a/tp/texi2any.pl b/tp/texi2any.pl
index 0f28273..5dcc5b8 100755
--- a/tp/texi2any.pl
+++ b/tp/texi2any.pl
@@ -331,6 +331,10 @@ sub set_from_cmdline($$) {
   return &Texinfo::Config::GNUT_set_from_cmdline(@_);
 }
 
+sub set_main_program_default($$) {
+  return &Texinfo::Config::GNUT_set_main_program_default(@_);
+}
+
 sub get_conf($) {
   return &Texinfo::Config::texinfo_get_conf(@_);
 }
@@ -376,14 +380,17 @@ my @prepend_dirs = ();
 #
 # There is in addition $parser_options for parser related informations
 # that are not set otherwise.
-# The configuration text values are later on copied over to the parser if
-# they are parser options, with format specific options also set with
-# less precedence.
+# The configuration values are later on copied over to the parser if
+# they are parser options.
 my $parser_options = {'values' => {'txicommandconditionals' => 1}};
 
 my $init_files_options = Texinfo::Config::GNUT_initialize_config(
       $real_command_name, $main_program_default_options, $cmdline_options);
 
+# setup a configuration object which defines get_conf and gives the same as
+# get_conf() in main program
+my $main_configuration = Texinfo::MainConfig::new();
+
 # read initialization files.  Better to do that after
 # Texinfo::Config::GNUT_initialize_config() in case loaded
 # files replace default options.
@@ -929,7 +936,11 @@ sub process_config {
 
 process_config($cmdline_options);
 
-# FIXME do this here or inside format-specific code?
+# The configuration API is setup such that the loading of init
+# files can be done here and not in format specific code.  There is
+# only one format, HTML, with use of complex customization (besides setting
+# customization options), so maybe this would need to be revisited
+# if another format uses complex customization.
 my $latex2html_file = 'latex2html.pm';
 if (defined($cmdline_options->{'HTML_MATH'})
       and $cmdline_options->{'HTML_MATH'} eq 'l2h') {
@@ -1033,29 +1044,44 @@ if (defined($formats_table{$format}->{'module'})) {
         .'->converter(@_)};';
 }
 
+# For now, FORMAT_MENU is the only variable that can be set from converter 
defaults
+# for the main program structuring and for the parser.
+# This could be done for more variables if
+# converter default becomes relevant for more variables, either
+# for the parser or the main program.
+
+# Specific variable for 'FORMAT_MENU' to keep the converter information
+# even if the command line higher precedence option is set in case
+# command line is set_format_menu_from_cmdline_header.
+my $conversion_format_menu_default;
 if (defined($formats_table{$format}->{'module'})) {
   $converter_class = $formats_table{$format}->{'module'};
-  # $cmdline_options is passed to have TEXI2HTML set for conversion to
-  # HTML
+  # $cmdline_options is passed to have command line settings, here
+  # in practice TEXI2HTML set, for conversion to HTML to select
+  # possibly different customization variable values.
   %converter_defaults = $converter_class->converter_defaults($cmdline_options);
-
-  # set FORMAT_MENU to the output format default, if not nomenu. We do not
-  # simply let it be set by taking %converter_defaults values if not already 
set
-  # below in case the default $converter_defaults{'FORMAT_MENU'} is nomenu, but
-  # for the other cases we could simply unset 
$converter_defaults{'FORMAT_MENU'}
-  # and let the converter default value be
-  if (defined(get_conf('FORMAT_MENU'))
-      and get_conf('FORMAT_MENU') eq 'set_format_menu_from_cmdline_header') {
-    if (defined($converter_defaults{'FORMAT_MENU'})
-        and $converter_defaults{'FORMAT_MENU'} ne 'nomenu') {
-      set_from_cmdline('FORMAT_MENU', $converter_defaults{'FORMAT_MENU'});
-    } else {
-      set_from_cmdline('FORMAT_MENU', 'menu');
-    }
+  $conversion_format_menu_default = undef;
+  if (defined($converter_defaults{'FORMAT_MENU'})) {
+    # could be done for other customization options
+    set_main_program_default('FORMAT_MENU', 
$converter_defaults{'FORMAT_MENU'});
+    # for FORMAT_MENU need in addition to have the value if
+    # command-line set to 'set_format_menu_from_cmdline_header'
+    $conversion_format_menu_default = $converter_defaults{'FORMAT_MENU'};
+  } else {
+    # this happens for the plaintexinfo format for which nothing
+    # is set.
   }
-} else {
-  if (defined(get_conf('FORMAT_MENU'))
-      and get_conf('FORMAT_MENU') eq 'set_format_menu_from_cmdline_header') {
+}
+
+# special case for FORMAT_MENU of delayed setting based in
+# some case on converter
+if (defined(get_conf('FORMAT_MENU'))
+    and get_conf('FORMAT_MENU') eq 'set_format_menu_from_cmdline_header') {
+   # set FORMAT_MENU to the output format default, if not nomenu
+  if (defined($conversion_format_menu_default)
+      and $conversion_format_menu_default ne 'nomenu') {
+    set_from_cmdline('FORMAT_MENU', $conversion_format_menu_default);
+  } else {
     set_from_cmdline('FORMAT_MENU', 'menu');
   }
 }
@@ -1063,25 +1089,14 @@ if (defined($formats_table{$format}->{'module'})) {
 # using no warnings is wrong, but a way to avoid a spurious warning.
 no warnings 'once';
 my @parser_settable_options = 
keys(%Texinfo::Common::default_parser_customization_values);
-push @parser_settable_options, 
keys(%Texinfo::Common::default_structure_customization_values);
-# Copy some of the customization variables into the parser options.
-# Here customization options set on the command line and set by
-# the converter associated with the output format, command line
-# taking precedence.
+# Copy relevant customization variables into the parser options.
 foreach my $parser_settable_option (@parser_settable_options) {
   if (defined(get_conf($parser_settable_option))) {
     $parser_options->{$parser_settable_option} 
        = get_conf($parser_settable_option);
-  } elsif (defined($converter_class) 
-           and defined($converter_defaults{$parser_settable_option})) {
-    $parser_options->{$parser_settable_option} 
-       = $converter_defaults{$parser_settable_option};
   }
 }
 
-#print STDERR "V ".join('|', sort(keys(%{$parser_options->{'values'}})))."\n";
-
-
 # Main processing, process all the files given on the command line
 
 my @input_files = @ARGV;
@@ -1127,6 +1142,7 @@ while(@input_files) {
   @prepended_include_directories =
     (@prepend_dirs, @prepended_include_directories);
 
+  # FIXME isn't that done for each output file?
   unshift @{$parser_file_options->{'INCLUDE_DIRECTORIES'}},
           @prepended_include_directories;
 
@@ -1168,6 +1184,9 @@ while(@input_files) {
     Texinfo::Transformations::set_menus_to_simple_menu($nodes_list);
   }
 
+  my $parser_informations = $parser->global_informations();
+  Texinfo::Common::set_output_encodings($main_configuration, 
$parser_informations);
+
   if (defined(get_conf('MACRO_EXPAND')) and $file_number == 0) {
     require Texinfo::Convert::Texinfo;
     my $texinfo_text = Texinfo::Convert::Texinfo::convert_to_texinfo($tree);
@@ -1175,7 +1194,7 @@ while(@input_files) {
     my $macro_expand_file = get_conf('MACRO_EXPAND');
     my $macro_expand_files_information = {};
     my $macro_expand_fh = Texinfo::Common::output_files_open_out(
-          $macro_expand_files_information, $parser, $macro_expand_file);
+          $macro_expand_files_information, $main_configuration, 
$macro_expand_file);
     my $error_macro_expand_file;
     if (defined($macro_expand_fh)) {
       print $macro_expand_fh $texinfo_text;
@@ -1232,8 +1251,8 @@ while(@input_files) {
   }
 
   my $refs = $parser->internal_references_information();
-  my $parser_informations = $parser->global_informations();
-  Texinfo::Structuring::associate_internal_references($registrar, $parser,
+  Texinfo::Structuring::associate_internal_references($registrar, 
+                                                      $main_configuration,
                                         $parser_informations, $labels, $refs);
   # filled with informations obtained through Texinfo::Structuring
   # and usefull in converters.
@@ -1243,14 +1262,14 @@ while(@input_files) {
   # every format needs the sectioning structure
   my ($sectioning_root, $sections_list)
             = Texinfo::Structuring::sectioning_structure($registrar,
-                                                             $parser, $tree);
+                                               $main_configuration, $tree);
 
   my $global_commands = $parser->global_commands_information();
   if ($sectioning_root) {
     $structure_informations->{'sectioning_root'} = $sectioning_root;
     $structure_informations->{'sections_list'} = $sections_list;
     if (!$formats_table{$format}->{'no_warn_non_empty_parts'}) {
-      Texinfo::Structuring::warn_non_empty_parts($registrar, $parser,
+      Texinfo::Structuring::warn_non_empty_parts($registrar, 
$main_configuration,
                                                  $global_commands);
     }
   }
@@ -1271,28 +1290,28 @@ while(@input_files) {
   my $top_node;
   if ($formats_table{$format}->{'nodes_tree'}) {
 
-    # it is not get_conf('FORMAT_MENU') but $parser_options as
-    # $parser_options is set to the output default and then replaced.
-    # with get_conf('FORMAT_MENU') if needed.
-    # 'FORMAT_MENU' may not be defined in some special cases,
-    # for instance if format is structure.
-    if (not defined($parser_options->{'FORMAT_MENU'})
-        or $parser_options->{'FORMAT_MENU'} eq 'menu') {
-      Texinfo::Structuring::set_menus_node_directions($registrar, $parser,
-               $parser_informations, $global_commands, $nodes_list, $labels);
+    # FIXME makes implicitely menu the default here.  'FORMAT_MENU'
+    # not being set here happens rarely, when there is a format, but the
+    # format does not define 'FORMAT_MENU' (case of plaintexinfo).
+    if (not defined(get_conf('FORMAT_MENU'))
+        or get_conf('FORMAT_MENU') eq 'menu') {
+      Texinfo::Structuring::set_menus_node_directions($registrar,
+               $main_configuration, $parser_informations, $global_commands,
+               $nodes_list, $labels);
     }
-    $top_node = Texinfo::Structuring::nodes_tree($registrar, $parser,
+    $top_node = Texinfo::Structuring::nodes_tree($registrar, 
$main_configuration,
                                    $parser_informations, $nodes_list, $labels);
     if (defined($top_node)) {
       $structure_informations->{'top_node'} = $top_node;
     }
-    if (not defined($parser_options->{'FORMAT_MENU'})
-        or $parser_options->{'FORMAT_MENU'} eq 'menu') {
+    if (not defined(get_conf('FORMAT_MENU'))
+        or get_conf('FORMAT_MENU') eq 'menu') {
       if (defined($nodes_list)) {
-        Texinfo::Structuring::complete_node_tree_with_menus($registrar, 
$parser,
-                                                       $nodes_list, $top_node);
-        Texinfo::Structuring::check_nodes_are_referenced($registrar, $parser,
-                                                     $nodes_list, $top_node,
+
+        Texinfo::Structuring::complete_node_tree_with_menus($registrar,
+                                 $main_configuration, $nodes_list, $top_node);
+        Texinfo::Structuring::check_nodes_are_referenced($registrar,
+                                    $main_configuration, $nodes_list, 
$top_node,
                                                      $labels, $refs);
       }
     }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]