* tp/Texinfo/Common.pm: Implement relate_index_entries_to_table_items, a transform that finds all table terms and associates their indices with them, so that the HTML backend generates a copyable anchor. * tp/texi2any.pl: Invoke the new relate_index_entries_to_table_items transform. (formats_table): Enable the relate_index_entries_to_table_items transformation on HTML. * tp/tests/indices/Makefile.am (EXTRA_DIST): New test case. * tp/tests/test_scripts/indices_index_entries_relate_to_item.sh: Ditto. * tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.1: Ditto. * tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.2: Ditto. * tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.html: Ditto. * tp/tests/indices/index_entries_relate_to_item.texi: Ditto. * tp/tests/indices/list-of-tests: Ditto. * tp/tests/indices/res_parser/indices_in_begin_tables_lists/indices_in_begin_tables_lists.html: Update with respect to the new transformation. --- Evening,
I cleaned up the anchors patch from a bit ago slightly, and added a test case for it. I decided to send this out without the related @[fv]table patch due to time constraints. I might be able to finish that one this year, but I can't promise anything. I also added some documentation about the transformation, but it's somewhat stubby, and I'm not sure if I got the syntax right. I can elaborate on that more if need be. Thanks in advance, happy holidays! ChangeLog | 26 ++++++++ tp/Texinfo/Common.pm | 65 +++++++++++++++++++ tp/tests/indices/Makefile.am | 1 + .../indices/index_entries_relate_to_item.texi | 22 +++++++ tp/tests/indices/list-of-tests | 2 + .../index_entries_relate_to_item.1 | 0 .../index_entries_relate_to_item.2 | 4 ++ .../index_entries_relate_to_item.html | 52 +++++++++++++++ .../indices_in_begin_tables_lists.html | 14 ++-- .../indices_index_entries_relate_to_item.sh | 19 ++++++ tp/texi2any.pl | 6 ++ 11 files changed, 202 insertions(+), 9 deletions(-) create mode 100644 tp/tests/indices/index_entries_relate_to_item.texi create mode 100644 tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.1 create mode 100644 tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.2 create mode 100644 tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.html create mode 100755 tp/tests/test_scripts/indices_index_entries_relate_to_item.sh diff --git a/ChangeLog b/ChangeLog index a2afc49c78..d7f42c22a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2022-12-24 Arsen Arsenović <ar...@aarsen.me> + + Re-enable copyable anchors in HTML output + + * tp/Texinfo/Common.pm: Implement + relate_index_entries_to_table_items, a transform that finds all + table terms and associates their indices with them, so that the + HTML backend generates a copyable anchor. + * tp/texi2any.pl: Invoke the new + relate_index_entries_to_table_items transform. + (formats_table): Enable the relate_index_entries_to_table_items + transformation on HTML. + * tp/tests/indices/Makefile.am (EXTRA_DIST): New test case. + * tp/tests/test_scripts/indices_index_entries_relate_to_item.sh: + Ditto. + * tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.1: + Ditto. + * tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.2: + Ditto. + * tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.html: + Ditto. + * tp/tests/indices/index_entries_relate_to_item.texi: Ditto. + * tp/tests/indices/list-of-tests: Ditto. + * tp/tests/indices/res_parser/indices_in_begin_tables_lists/indices_in_begin_tables_lists.html: + Update with respect to the new transformation. + 2022-12-24 Patrice Dumas <pertu...@free.fr> * doc/Makefile.am (TEXINFO_TEX): use in-source texinfo.tex. diff --git a/tp/Texinfo/Common.pm b/tp/Texinfo/Common.pm index ddd17ad6b9..e076bdefa7 100644 --- a/tp/Texinfo/Common.pm +++ b/tp/Texinfo/Common.pm @@ -54,6 +54,7 @@ use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); collect_commands_in_tree collect_commands_list_in_tree move_index_entries_after_items_in_tree +relate_index_entries_to_table_items_in_tree protect_colon_in_tree protect_comma_in_tree protect_first_parenthesis @@ -525,6 +526,7 @@ foreach my $output_format_command ('info', 'plaintext', my %valid_tree_transformations; foreach my $valid_transformation ('simple_menus', 'fill_gaps_in_sectioning', 'move_index_entries_after_items', + 'relate_index_entries_to_items', 'insert_nodes_for_sectioning_commands', 'complete_tree_nodes_menus', 'regenerate_master_menu', 'indent_menu_descriptions') { @@ -2176,6 +2178,63 @@ sub move_index_entries_after_items_in_tree($) return modify_tree($tree, \&_move_index_entries_after_items); } +# Locates all @tables in the tree, and relocates index entriy groups to be +# related to the @item that immediately follows them. + +sub _relate_index_entries_to_table_items_in($) +{ + my $table = shift; + + return unless $table->{'contents'}; + + # For each table_term in $table->{'contents'}->[0], relate it's content's + # first index_entry_command to the term itself. + foreach my $table_entry (@{$table->{'contents'}}) { + next unless $table_entry->{'contents'} + and $table_entry->{'type'} eq 'table_entry'; + + # AFAIU, there's always a unique term in the first position in an entries + # contents. + my $term = $table_entry->{'contents'}->[0]; + + # Now, to discover the related @index and @item entries. + my ($item, $index); + foreach my $content (@{$term->{'contents'}}) { + if ($content->{'extra'} + and $content->{'extra'}->{'index_entry'}) { + $index = $content->{'extra'}->{'index_entry'} unless $index; + } elsif ($content->{'cmdname'} and $content->{'cmdname'} eq 'item') { + $item = $content unless $item; + } + # If we found both, no need to proceed; + last if $item and $index; + } + + next unless $item and $index; + $index->{'entry_element'} = $item; + } +} + +sub _relate_index_entries_to_table_items($$) +{ + my $type = shift; + my $current = shift; + + return ($current) unless $current->{'cmdname'}; + + if ($current->{'cmdname'} eq 'table') { + _relate_index_entries_to_table_items_in($current); + } + + return ($current); +} + +sub relate_index_entries_to_table_items_in_tree($) +{ + my $tree = shift; + return modify_tree($tree, \&_relate_index_entries_to_table_items); +} + # Common to different module, but not meant to be used in user-defined # codes. # @@ -2571,6 +2630,12 @@ In C<@enumerate> and C<@itemize> from the tree, move index entries appearing just before C<@item> after the C<@item>. Comment lines between index entries are moved too. +=item relate_index_entries_to_table_items_in_tree($tree) +X<C<relate_index_entries_to_table_items_in_tree>> + +In tables, relates index entries preceding items with said item, by placing it +inside the entries C<entry_element>. + =item $normalized_name = normalize_top_node_name($node_string) X<C<normalize_top_node_name>> diff --git a/tp/tests/indices/Makefile.am b/tp/tests/indices/Makefile.am index 2056d1eb53..e26e80580e 100644 --- a/tp/tests/indices/Makefile.am +++ b/tp/tests/indices/Makefile.am @@ -9,6 +9,7 @@ EXTRA_DIST = index_table.texi index_split.texi \ same_doc_nr_split_index_and_element.texi \ printindex_between_part_chapter.texi \ indices_in_begin_tables_lists.texi \ + index_entries_relate_to_item.texi \ list-of-tests res_parser res_parser_info DISTCLEANFILES = tests.log tests.out diff --git a/tp/tests/indices/index_entries_relate_to_item.texi b/tp/tests/indices/index_entries_relate_to_item.texi new file mode 100644 index 0000000000..420c3c7bb5 --- /dev/null +++ b/tp/tests/indices/index_entries_relate_to_item.texi @@ -0,0 +1,22 @@ +\input texinfo @c -*-texinfo-*- + +@setfilename index_entries_relate_to_items + +@table @code + +@cindex A +@cindex B +@cindex C +@item A +@itemx B +@itemx C + +body + +@item D + +body2 + +@end table + +@bye diff --git a/tp/tests/indices/list-of-tests b/tp/tests/indices/list-of-tests index 939ff799f1..7007de834b 100644 --- a/tp/tests/indices/list-of-tests +++ b/tp/tests/indices/list-of-tests @@ -24,3 +24,5 @@ index_table index_table.texi -c 'TEXI2HTML 1' --split chapter indices_in_begin_tables_lists indices_in_begin_tables_lists.texi indices_in_begin_tables_lists_latex indices_in_begin_tables_lists.texi --latex + +index_entries_relate_to_item index_entries_relate_to_item.texi --html diff --git a/tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.1 b/tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.1 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.2 b/tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.2 new file mode 100644 index 0000000000..ed00112c9e --- /dev/null +++ b/tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.2 @@ -0,0 +1,4 @@ +index_entries_relate_to_item.texi:7: warning: entry for index `cp' outside of any node +index_entries_relate_to_item.texi:8: warning: entry for index `cp' outside of any node +index_entries_relate_to_item.texi:9: warning: entry for index `cp' outside of any node +index_entries_relate_to_item.texi: warning: must specify a title with a title command or @top diff --git a/tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.html b/tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.html new file mode 100644 index 0000000000..0c206130c2 --- /dev/null +++ b/tp/tests/indices/res_parser/index_entries_relate_to_item/index_entries_relate_to_item.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<html> +<!-- Created by texinfo, http://www.gnu.org/software/texinfo/ --> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>Untitled Document</title> + +<meta name="description" content="Untitled Document"> +<meta name="keywords" content="Untitled Document"> +<meta name="resource-type" content="document"> +<meta name="distribution" content="global"> +<meta name="Generator" content="texi2any"> +<meta name="viewport" content="width=device-width,initial-scale=1"> + +<style type="text/css"> +<!-- +a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em} +span.program-in-footer {font-size: smaller} +span:hover a.copiable-link {visibility: visible} +--> +</style> + + +</head> + +<body lang="en"> + +<dl class="table"> +<dt><a class="index-entry-id" id="index-B"></a> +<a class="index-entry-id" id="index-C"></a> +<a id='index-A'></a><span><code class="code">A</code><a class="copiable-link" href='#index-A'> ¶</a></span></dt> +<dt><code class="code">B</code></dt> +<dt><code class="code">C</code></dt> +<dd> +<p>body +</p> +</dd> +<dt><code class="code">D</code></dt> +<dd> +<p>body2 +</p> +</dd> +</dl> + +<hr> +<p> + <span class="program-in-footer">This document was generated on <em class="emph">a sunny day</em> using <a class="uref" href="http://www.gnu.org/software/texinfo/"><em class="emph">texi2any</em></a>.</span> +</p> + + +</body> +</html> diff --git a/tp/tests/indices/res_parser/indices_in_begin_tables_lists/indices_in_begin_tables_lists.html b/tp/tests/indices/res_parser/indices_in_begin_tables_lists/indices_in_begin_tables_lists.html index 592b37203f..b5c6eccc1a 100644 --- a/tp/tests/indices/res_parser/indices_in_begin_tables_lists/indices_in_begin_tables_lists.html +++ b/tp/tests/indices/res_parser/indices_in_begin_tables_lists/indices_in_begin_tables_lists.html @@ -142,8 +142,7 @@ enum </dl> <dl class="table"> -<dt><a class="index-entry-id" id="index-cindex-in-table"></a> -<code class="code">abb</code></dt> +<dt><a id='index-cindex-in-table'></a><span><code class="code">abb</code><a class="copiable-link" href='#index-cindex-in-table'> ¶</a></span></dt> <dd><p>l–ine </p></dd> </dl> @@ -156,8 +155,7 @@ enum </dl> <dl class="table"> -<dt><a class="index-entry-id" id="index-samp-cindex-in-table"></a> -‘<samp class="samp">asamp--bb</samp>’</dt> +<dt><a id='index-samp-cindex-in-table'></a><span>‘<samp class="samp">asamp--bb</samp>’<a class="copiable-link" href='#index-samp-cindex-in-table'> ¶</a></span></dt> <dd><p>l–ine samp </p></dd> </dl> @@ -185,15 +183,13 @@ enum </dl> <dl class="table"> -<dt><a class="index-entry-id" id="index-cindex-after-line"></a> -‘<samp class="samp">asamp--bb2</samp>’</dt> +<dt><a id='index-cindex-after-line'></a><span>‘<samp class="samp">asamp--bb2</samp>’<a class="copiable-link" href='#index-cindex-after-line'> ¶</a></span></dt> </dl> <dl class="table"> -<dt><a class="index-entry-id" id="index-cindex-first"></a> -<a class="index-entry-id" id="index-second"></a> +<dt><a class="index-entry-id" id="index-second"></a> <a class="index-entry-id" id="index-third"></a> -‘<samp class="samp">asamp--bb2</samp>’</dt> +<a id='index-cindex-first'></a><span>‘<samp class="samp">asamp--bb2</samp>’<a class="copiable-link" href='#index-cindex-first'> ¶</a></span></dt> </dl> <hr> diff --git a/tp/tests/test_scripts/indices_index_entries_relate_to_item.sh b/tp/tests/test_scripts/indices_index_entries_relate_to_item.sh new file mode 100755 index 0000000000..2395e45f39 --- /dev/null +++ b/tp/tests/test_scripts/indices_index_entries_relate_to_item.sh @@ -0,0 +1,19 @@ +#! /bin/sh +# This file generated by maintain/regenerate_cmd_tests.sh + +if test z"$srcdir" = "z"; then + srcdir=. +fi + +one_test_logs_dir=test_log + + +dir=indices +name='index_entries_relate_to_item' +mkdir -p $dir + +"$srcdir"/run_parser_all.sh -dir $dir $name +exit_status=$? +cat $dir/$one_test_logs_dir/$name.log +exit $exit_status + diff --git a/tp/texi2any.pl b/tp/texi2any.pl index 398dbc9791..147872ef30 100755 --- a/tp/texi2any.pl +++ b/tp/texi2any.pl @@ -589,6 +589,7 @@ my %formats_table = ( 'internal_links' => 1, 'simple_menu' => 1, 'move_index_entries_after_items' => 1, + 'relate_index_entries_to_table_items' => 1, 'no_warn_non_empty_parts' => 1, 'module' => 'Texinfo::Convert::HTML' }, @@ -1485,6 +1486,11 @@ while(@input_files) { next; } + if ($formats_table{$converted_format}->{'relate_index_entries_to_table_items'} + or $tree_transformations{'relate_index_entries_to_table_items'}) { + Texinfo::Common::relate_index_entries_to_table_items_in_tree($tree); + } + if ($formats_table{$converted_format}->{'move_index_entries_after_items'} or $tree_transformations{'move_index_entries_after_items'}) { Texinfo::Common::move_index_entries_after_items_in_tree($tree); -- 2.39.0