use strict; use Test::More; use lib '.'; use Texinfo::ModulePath (undef, undef, undef, 'updirs' => 2); BEGIN { plan tests => 27; } use Texinfo::Parser; use Texinfo::Transformations; use Texinfo::Convert::Texinfo; use Data::Dumper; ok(1); sub test_new_node($$$$) { my $in = shift; my $normalized_ref = shift; my $out = shift; my $name = shift; my $parser = Texinfo::Parser::parser(); my $node_tree = $parser->parse_texi_line ($in); my $registrar = $parser->registered_errors(); my ($labels, $targets_list, $nodes_list) = $parser->labels_information(); my $parser_information = $parser->global_information(); my $refs = $parser->internal_references_information(); Texinfo::Structuring::associate_internal_references($registrar, $parser, $parser_information, $labels, $refs); # $labels, $nodes_list, $targets_list are modified my $node = Texinfo::Transformations::_new_node($node_tree, $nodes_list, $targets_list, $labels); my ($texi_result, $normalized); if (defined($node)) { $texi_result = Texinfo::Convert::Texinfo::convert_to_texinfo($node); my $refs = $parser->internal_references_information(); Texinfo::Structuring::associate_internal_references($registrar, $parser, $parser_information, $labels, $refs); $normalized = $node->{'extra'}->{'normalized'}; my @labels = sort(keys(%$labels)); if (scalar(@labels) != 1) { print STDERR " $name labels: !! ".join("|", @labels)."\n"; } ok ((scalar(@labels) == 1 and $labels[0] eq $normalized), "$name label"); } if (!defined($normalized_ref) and defined($normalized)) { print STDERR " --> $name($normalized): $texi_result"; } else { is ($normalized, $normalized_ref, "$name normalized"); is ($texi_result, $out, $name); } } test_new_node ('a node', 'a-node', '@node a node ', 'simple'); test_new_node ('a node @code{in code} @c comment ', 'a-node-in-code', '@node a node @code{in code} @c comment ', 'complex'); test_new_node ('a ,, node @code{a,b,}', 'a-_002c_002c-node-a_002cb_002c', '@node a @comma{}@comma{} node @code{a@comma{}b@comma{}} ', 'with comma'); test_new_node ('(in paren(too aaa', '_0028in-paren_0028too-aaa', '@node @asis{(}in paren(too aaa ', 'with parenthesis'); test_new_node ('changed @ref{ @code{node}} and (@pxref{ ,, , @samp{file}})', 'changed-node-and-_0028file_0029', '@node changed @code{node} and (@samp{file}) ', 'ref in new node'); test_new_node ('@asis{}', '-1', '@node @asis{} 1 ', 'empty node'); test_new_node ('a::b c', 'a_003a_003ab-c', '@node a@asis{::}b@asis{ } c ', 'with colon and tab'); my $parser = Texinfo::Parser::parser(); my $tree = $parser->parse_texi_piece('@node a node '); my $line_tree = Texinfo::Parser::parse_texi_line (undef, 'a node'); my $registrar = $parser->registered_errors(); my ($labels, $targets_list, $nodes_list) = $parser->labels_information(); my $parser_information = $parser->global_information(); my $refs = $parser->internal_references_information(); Texinfo::Structuring::associate_internal_references($registrar, $parser, $parser_information, $labels, $refs); my $node = Texinfo::Transformations::_new_node($line_tree, $nodes_list, $targets_list, $labels); is ('@node a node 1 ', Texinfo::Convert::Texinfo::convert_to_texinfo($node), 'duplicate node added'); #print STDERR Texinfo::Convert::Texinfo::convert_to_texinfo($node); my $sections_text = '@top top section @part part @chapter chap, @code{a chap} @node a node @section section @section truc @subsection sub1 Text. @subsection sub2 @c comment @section section @section section @unnumbered @section @asis{} @bye'; my $reference = '@node Top @top top section @part part @node chap@comma{} @code{a chap} @chapter chap, @code{a chap} @node a node @section section @node truc @section truc @node sub1 @subsection sub1 Text. @node sub2 @subsection sub2 @c comment @node section @section section @node section 1 @section section @node 1 @unnumbered @node @asis{} 2 @section @asis{} @bye'; $parser = Texinfo::Parser::parser(); $tree = $parser->parse_texi_text($sections_text); $registrar = $parser->registered_errors(); ($labels, $targets_list, $nodes_list) = $parser->labels_information(); $parser_information = $parser->global_information(); $refs = $parser->internal_references_information(); Texinfo::Structuring::associate_internal_references($registrar, $parser, $parser_information, $labels, $refs); my ($new_content, $added_nodes) = Texinfo::Transformations::insert_nodes_for_sectioning_commands($tree, $nodes_list, $targets_list, $labels); $tree->{'contents'} = $new_content; my $result = Texinfo::Convert::Texinfo::convert_to_texinfo($tree); is ($reference, $result, 'add nodes'); #print STDERR "$result"; $parser = Texinfo::Parser::parser(); $tree = $parser->parse_texi_text('@node Top @top top @chapter chap @cindex index entry @menu * (some_manual):: @end menu '); $registrar = $parser->registered_errors(); ($labels, $targets_list, $nodes_list) = $parser->labels_information(); $parser_information = $parser->global_information(); $refs = $parser->internal_references_information(); Texinfo::Structuring::associate_internal_references($registrar, $parser, $parser_information, $labels, $refs); ($new_content, $added_nodes) = Texinfo::Transformations::insert_nodes_for_sectioning_commands($tree, $nodes_list, $targets_list, $labels); $tree->{'contents'} = $new_content; my ($indices_information, $merged_indices) = $parser->indices_information(); ok (($labels->{'chap'}->{'extra'}->{'menus'} and @{$labels->{'chap'}->{'extra'}->{'menus'}} and scalar(@{$labels->{'chap'}->{'extra'}->{'menus'}}) == 1 and !exists($labels->{'Top'}->{'extra'}->{'menus'})), 'new node has a menu'); is (Texinfo::Convert::Texinfo::convert_to_texinfo($labels->{'chap'}->{'extra'}->{'menus'}->[0]), '@menu * (some_manual):: @end menu ', 'reassociated menu is correct'); #print STDERR join('|', # keys(%{$indices_information->{'cp'}->{'index_entries'}}))."\n"; is ($labels->{'chap'}, $indices_information->{'cp'}->{'index_entries'}->[0] ->{'entry_element'}->{'extra'}->{'element_node'}, 'index entry reassociated'); #print STDERR Texinfo::Convert::Texinfo::convert_to_texinfo($tree);