texinfo-commits
[Top][All Lists]
Advanced

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

texinfo/tp Texinfo/Structuring.pm t/do_master_m...


From: Patrice Dumas
Subject: texinfo/tp Texinfo/Structuring.pm t/do_master_m...
Date: Sun, 26 Feb 2012 20:34:45 +0000

CVSROOT:        /sources/texinfo
Module name:    texinfo
Changes by:     Patrice Dumas <pertusus>        12/02/26 20:34:45

Modified files:
        tp/Texinfo     : Structuring.pm 
        tp/t           : do_master_menu.t 

Log message:
        regenerate_master_menu to regenerate the Top node master menu, 
replacing 
        the first detailmenu in Top node menus or appending at the end of the 
Top 
        node menu.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Structuring.pm?cvsroot=texinfo&r1=1.122&r2=1.123
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/t/do_master_menu.t?cvsroot=texinfo&r1=1.1&r2=1.2

Patches:
Index: Texinfo/Structuring.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Structuring.pm,v
retrieving revision 1.122
retrieving revision 1.123
diff -u -b -r1.122 -r1.123
--- Texinfo/Structuring.pm      26 Feb 2012 18:26:03 -0000      1.122
+++ Texinfo/Structuring.pm      26 Feb 2012 20:34:45 -0000      1.123
@@ -49,9 +49,11 @@
   elements_file_directions
   insert_nodes_for_sectioning_commands
   merge_indices
+  new_master_menu
   nodes_tree
   number_floats
   menu_to_simple_menu
+  regenerate_master_menu
   sectioning_structure
   set_menus_to_simple_menu
   sort_indices
@@ -1544,7 +1546,7 @@
   }
 }
 
-sub do_master_menu($;$)
+sub new_master_menu($;$)
 {
   my $self = shift;
   my $labels = shift;
@@ -1613,6 +1615,45 @@
   return _new_block_command(address@hidden, undef, 'detailmenu');
 }
 
+sub regenerate_master_menu($;$)
+{
+  my $self = shift;
+  my $labels = shift;
+  $labels = $self->labels_information() if (!defined($labels));
+  my $top_node = $labels->{'Top'};
+  return undef if (!defined($top_node));
+
+  my $new_master_menu = new_master_menu($self, $labels);
+  return undef if (!defined($new_master_menu) or !$top_node->{'menus'}
+                   or !scalar(@{$top_node->{'menus'}}));
+
+  foreach my $menu (@{$top_node->{'menus'}}) {
+    my $detailmenu_index = 0;
+    foreach my $entry (@{$menu->{'contents'}}) {
+      if ($entry->{'cmdname'} and $entry->{'cmdname'} eq 'detailmenu') {
+        # replace existing detailmenu by the master menu
+        $new_master_menu->{'parent'} = $menu;
+        splice (@{$menu->{'contents'}}, $detailmenu_index, 1, 
+                $new_master_menu);
+        return 1;
+      }
+      $detailmenu_index++;
+    }
+  }
+
+  my $last_menu = $top_node->{'menus'}->[-1];
+  my $index = scalar(@{$last_menu->{'contents'}});
+  if (scalar(@{$last_menu->{'contents'}})
+      and $last_menu->{'contents'}->[-1]->{'cmdname'}
+      and $last_menu->{'contents'}->[-1]->{'cmdname'} eq 'end') {
+    $index --;
+  }
+  $new_master_menu->{'parent'} = $last_menu;
+  splice (@{$last_menu->{'contents'}}, $index, 0, $new_master_menu);
+
+  return 1;
+}
+
 sub _sort_string($$)
 {
   my $a = shift;
@@ -2197,6 +2238,15 @@
 based on the sectioning tree.  This function should therefore be
 called after L<sectioning_structure>.
 
+=item $detailmenu = new_master_menu ($parser)
+
+Returns a detailmenu tree element formatted as a master node.
+
+=item regenerate_master_menu ($parser)
+
+Regenerate the Top node master menu, replacing the first detailmenu
+in Top node menus or appending at the end of the Top node menu.
+
 =back
 
 =head1 SEE ALSO

Index: t/do_master_menu.t
===================================================================
RCS file: /sources/texinfo/texinfo/tp/t/do_master_menu.t,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- t/do_master_menu.t  26 Feb 2012 18:26:03 -0000      1.1
+++ t/do_master_menu.t  26 Feb 2012 20:34:45 -0000      1.2
@@ -1,7 +1,7 @@
 use strict;
 
 use Test::More;
-BEGIN { plan tests => 1 };
+BEGIN { plan tests => 5 };
 
 use lib 'maintain/lib/Unicode-EastAsianWidth/lib/';
 use lib 'maintain/lib/libintl-perl/lib/';
@@ -14,9 +14,11 @@
 
 ok(1);
 
-sub _get_in($)
+sub _get_in($;$)
 {
   my $fragment = shift;
+  my $other_fragment = shift;
+  $other_fragment = '' if (!defined($other_fragment));
 
   my $in = '@node Top
 @top top
@@ -33,7 +35,8 @@
 
 @menu
 * unnumbered1::
address@hidden menu
+'.$other_fragment.
+'@end menu
 
 @node chap1
 @chapter chap
@@ -110,11 +113,16 @@
 
 my $in_detailmenu = _get_in('@detailmenu
 * sec1::
address@hidden detailmenu');
address@hidden detailmenu
+');
+my $no_detailmenu = _get_in('');
+#print STDERR $no_detailmenu;
+#print STDERR "GGG\n";
+#print STDERR $in_detailmenu;
 
 my $parser = Texinfo::Parser::parser();
 my $tree = $parser->parse_texi_text($in_detailmenu);
-my $master_menu = Texinfo::Structuring::do_master_menu($parser);
+my $master_menu = Texinfo::Structuring::new_master_menu($parser);
 my $out = Texinfo::Convert::Texinfo::convert($master_menu);
 
 my $reference = '@detailmenu
@@ -145,7 +153,27 @@
 @end detailmenu
 ';
 #print STDERR $out;
-is ($reference, $out, 'master menu');
+is ($out, $reference, 'master menu');
+
+$parser = Texinfo::Parser::parser();
+$tree = $parser->parse_texi_text($no_detailmenu);
+$master_menu = Texinfo::Structuring::new_master_menu($parser);
+$out = Texinfo::Convert::Texinfo::convert($master_menu);
+is ($out, $reference, 'master menu no detailmenu');
+
+$parser = Texinfo::Parser::parser();
+$tree = $parser->parse_texi_text($in_detailmenu);
+Texinfo::Structuring::regenerate_master_menu($parser);
+$out = Texinfo::Convert::Texinfo::convert($tree);
+
+is ($out, _get_in($reference), 'regenerate with existing detailmenu');
+#print STDERR "$out";
+
 
+$parser = Texinfo::Parser::parser();
+$tree = $parser->parse_texi_text($no_detailmenu);
+Texinfo::Structuring::regenerate_master_menu($parser);
+$out = Texinfo::Convert::Texinfo::convert($tree);
 
+is ($out, _get_in('',$reference), 'regenerate with no detailmenu');
 



reply via email to

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