From db06108b146fb6a631c2e01e10a60a4f41a362ae Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Fri, 22 Jul 2022 14:24:42 +0100 Subject: [PATCH] Support indexes pointing directo to varlist items --- script/gen | 54 +++++++++++++++++++++++++++++++++------ templates/doc/chapter.xsl | 8 ++++++ 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/script/gen b/script/gen index 3a45871..747c448 100755 --- a/script/gen +++ b/script/gen @@ -335,10 +335,11 @@ sub xref_fixup { ## Replace all of the xrefs in the XML foreach my $xref ( $xml->findnodes('//xref') ) { my $linkend = $xref->getAttribute('linkend'); + if ( exists $index{$linkend} ) { - $xref->setAttribute( 'chapter_id', $index{$linkend}{'chapter_id'} ); + $xref->setAttribute( 'chapter_id', $index{$linkend}{'chapter_id'} ) if ( $index{$linkend}{'chapter_id'} ); $xref->setAttribute( 'chapter_title', $index{$linkend}{'chapter_title'} ); - $xref->setAttribute( 'section_id', $index{$linkend}{'section_id'} ) if ( $index{$linkend}{'section_id'} ); + $xref->setAttribute( 'section_id', $index{$linkend}{'section_id'} ) if ( $index{$linkend}{'section_id'} ); $xref->setAttribute( 'section_title', $index{$linkend}{'section_title'} ) if ( $index{$linkend}{'section_title'} ); $xref->setAttribute( 'url', @@ -356,7 +357,9 @@ sub build_indexes { my $index_hash = {}; my $seealso_hash = {}; my $current_id; - foreach my $node ( $xml->findnodes('//section | //chapter | //indexterm') ) { + my $verterm_counter = 0; + + foreach my $node ( $xml->findnodes('//section | //chapter | //varlistentry | //indexterm') ) { if ( $node->nodeName eq 'indexterm' ) { my $role = $node->getAttribute('role') || 'concept'; my $primary = $node->findvalue('child::primary'); @@ -376,14 +379,49 @@ sub build_indexes { } else { -# JGH 2022/07/01 -# The $current_id being pushed here is presumably the section, given where the -# hyperlink end up pointing to. For bug 2889 we'd like to have something more -# precise; tha presumably requires an anchor at the indexed point? - push @{ $index_hash->{$role}{$first}{$primary}{$secondary} }, $current_id; } } + elsif ( $node->nodeName eq 'varlistentry' ) { + + foreach my $vitem ( $node->findnodes('listitem') ) { + + # Add an anchorname xml attribute. + # chapter.xsl spots this and places a " " + + my $anchorname = sprintf("vi%d", $verterm_counter++); + $vitem->setAttribute( 'anchorname', $anchorname ); + $current_id = $anchorname; + + # Set the latest indexable id to be picked up by the next indexterm, + # which should be in the content of the listitem + + my ($chapter_title, $sec_id, $sec_title); + + foreach my $chap ( $node->findnodes('ancestor::chapter') ) { + $chapter_title = $chap->findvalue('title'); + } + next unless ($chapter_title); + + # Search upward to find a subsection or section id & title + foreach my $ssec ( $node->findnodes("ancestor::section[\@level='2']") ) { + $sec_id = $ssec->getAttribute('id'); + $sec_title = $ssec->findvalue('title'); + last; + } + if (!defined($sec_id)) { + foreach my $sec ( $node->findnodes('ancestor::section') ) { + $sec_id = $sec->getAttribute('id'); + $sec_title = $sec->findvalue('title'); + last; + } + } + + $xref->{$anchorname}{'chapter_title'} = $chapter_title; + $xref->{$anchorname}{'section_id'} = $sec_id if ($sec_id); + $xref->{$anchorname}{'section_title'} = $sec_title if ($sec_title); + } + } else { $current_id = $node->getAttribute('id'); } diff --git a/templates/doc/chapter.xsl b/templates/doc/chapter.xsl index 03fa348..be6990a 100644 --- a/templates/doc/chapter.xsl +++ b/templates/doc/chapter.xsl @@ -130,6 +130,14 @@

+ + + +
+ +
+
+ -- 2.30.2