[Top][All Lists]
[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');