On Sat, Jul 05, 2025 at 10:29:00AM +0200, Patrice Dumas wrote:
> On Sat, Jul 05, 2025 at 01:06:29AM +0100, Gavin Smith wrote:
> > On Fri, Jul 04, 2025 at 10:18:05PM +0100, Gavin Smith wrote:
> > > All these nodes (in the Sphinx output) have explicit pointers on the
> > > node lines, just like the affected part of the libc manual.
> > > 
> > > So I expect we will have to take some account of node pointers
> > > when generating these warnings.  (We could still give 1 or 2 warnings if
> > > there is a simple way of doing so, but not 197.)
> > 
> > Here's my current version (done in both Perl and C).  Only the first block
> > of code is new in each file; the second ("check consistency..."") is
> > just moved from later in the function.
> > 
> > As with the existing warnings, node pointers can be used to get the next
> > expected node to appear in a menu.
> > 
> > I just need to check through all the changes in the test suite to check
> > if they are satisfactory and tidy up the patch a bit.  I probably need
> > one or two more test cases for explicit node pointers.
> > 
> > 
> > diff --git a/tta/perl/Texinfo/Structuring.pm 
> > b/tta/perl/Texinfo/Structuring.pm
> > index 5f79484786..5345b28026 100644
> > --- a/tta/perl/Texinfo/Structuring.pm
> > +++ b/tta/perl/Texinfo/Structuring.pm
> > @@ -844,12 +844,133 @@ sub check_node_tree_menu_structure($)
> >      }
> >    }
> >  
> > +  # Go through all the menus and check if they match subordinate
> > +  # nodes.
> > +  if ($customization_information->get_conf('CHECK_NORMAL_MENU_STRUCTURE')) 
> > {
> > +    foreach my $node_relations (@{$nodes_list}) {
> > +      if ($node_relations->{'menus'}) {
> > +        next if !$node_relations->{'associated_section'};
> > +        my $section_childs = $node_relations->{'associated_section'}
> > +                                            ->{'section_childs'};
> > +        next if !defined($section_childs) or !@{$section_childs};
> > +
> 
> In the following code, and also maybe below in the main loop, I think
> that the next section should be used instead of going out of the loop.
> That way, a structure like the following will have checks:
> 
> @node chap
> @chapter Chap
> 
> @menu
> * with node::
> * ...
> @end menu
> 
> @section no node
> 
> @node with node
> @section a section with node

Thanks for the suggestion.

> 
> ....
> 
> > +        my $first_child_node_relations = 
> > $section_childs->[0]->{'associated_node'};
> > +        next if !defined($first_child_node_relations);
> > +
> > +        # Set to the first subordinate section, which should appear first 
> > in the
> > +        # menu.
> > +        my ($section_node, $last_menu_node_relations);
> > +        $section_node = $first_child_node_relations->{'element'};
> > +        next if !defined($section_node);

I used a loop like this:

      # Find the first subordinate section, which should appear first
      # in the menu.
      my $first_child = $section_children->[0];
      while (!defined($first_child->{'associated_node'})
               and defined($first_child->{'section_directions'})
               and defined($first_child->{'section_directions'}->{'next'})) {
        $first_child = $first_child->{'section_directions'}->{'next'};
      }

      my $first_child_node_relations = $first_child->{'associated_node'};
      next if !defined($first_child_node_relations);


Reply via email to