[LyX features/features/indexmacros] LyXHTML: implement multiple indices

Thibaut Cuvelier tcuvelier at lyx.org
Wed Aug 31 23:17:23 UTC 2022


The branch, features/indexmacros, has been updated.

- Log -----------------------------------------------------------------

commit 2b177172f17d524cd27727319799112cbc62fa7d
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date:   Thu Sep 1 02:04:05 2022 +0200

    LyXHTML: implement multiple indices

diff --git a/src/insets/InsetCommandParams.cpp b/src/insets/InsetCommandParams.cpp
index 09c9ee8..bff358f 100644
--- a/src/insets/InsetCommandParams.cpp
+++ b/src/insets/InsetCommandParams.cpp
@@ -322,7 +322,7 @@ void InsetCommandParams::Read(Lexer & lex, Buffer const * buffer)
 			preview_ = lex.getBool();
 			continue;
 		}
-		if (info_.hasParam(token)) {
+		if (hasParam(token)) {
 			lex.next(true);
 			docstring data = lex.getDocString();
 			if (buffer && token == "filename") {
@@ -604,10 +604,24 @@ docstring InsetCommandParams::getFirstNonOptParam() const
 }
 
 
+bool InsetCommandParams::hasParam(std::string const & name) const
+{
+	return info_.hasParam(name);
+}
+
+
+docstring const & InsetCommandParams::getParamOr(std::string const & name, docstring const & defaultValue) const
+{
+	if (hasParam(name))
+		return (*this)[name];
+	return defaultValue;
+}
+
+
 docstring const & InsetCommandParams::operator[](string const & name) const
 {
 	static const docstring dummy;
-	LASSERT(info_.hasParam(name), return dummy);
+	LASSERT(hasParam(name), return dummy);
 	ParamMap::const_iterator data = params_.find(name);
 	if (data == params_.end() || data->second.empty())
 		return dummy;
@@ -620,7 +634,7 @@ docstring const & InsetCommandParams::operator[](string const & name) const
 
 docstring & InsetCommandParams::operator[](string const & name)
 {
-	LATTEST(info_.hasParam(name));
+	LATTEST(hasParam(name));
 	// this will add the name in release mode
 	ParamInfo::ParamData const & param = info_[name];
 	if (param.ignore())
diff --git a/src/insets/InsetCommandParams.h b/src/insets/InsetCommandParams.h
index 1800fb5..7ed182a 100644
--- a/src/insets/InsetCommandParams.h
+++ b/src/insets/InsetCommandParams.h
@@ -146,6 +146,10 @@ public:
 	/// FIXME Would be better removed, but is used in BufferView.cpp in
 	/// ways that make removal hard.
 	docstring getFirstNonOptParam() const;
+	/// Determine whether a parameter is set
+	bool hasParam(std::string const & name) const;
+	/// Get the parameter \p name if it is set, \p defaultValue otherwise
+	docstring const & getParamOr(std::string const & name, docstring const & defaultValue) const;
 	/// get parameter \p name
 	/// LyX will assert if name is not a valid parameter.
 	docstring const & operator[](std::string const & name) const;
diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp
index f463b19..d17b059 100644
--- a/src/insets/InsetIndex.cpp
+++ b/src/insets/InsetIndex.cpp
@@ -1656,25 +1656,17 @@ docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const
 {
 	BufferParams const & bp = buffer().masterBuffer()->params();
 
-	// we do not presently support multiple indices, so we refuse to print
-	// anything but the main index, so as not to generate multiple indices.
-	// NOTE Multiple index support would require some work. The reason
-	// is that the TOC does not know about multiple indices. Either it would
-	// need to be told about them (not a bad idea), or else the index entries
-	// would need to be collected differently, say, during validation.
-	if (bp.use_indices && getParam("type") != from_ascii("idx"))
-		return docstring();
-
 	shared_ptr<Toc const> toc = buffer().tocBackend().toc("index");
 	if (toc->empty())
 		return docstring();
 
 	// Collect the index entries in a form we can use them.
 	vector<IndexEntry> entries;
+	const docstring & indexType = params().getParamOr("type", from_ascii("idx"));
 	for (const TocItem& item : *toc) {
-		static_cast<const InsetIndex*>(&(item.dit().inset()))->params_.index;
-		if (item.isOutput())
-			entries.emplace_back(IndexEntry{static_cast<const InsetIndex*>(&(item.dit().inset())), &op});
+		const auto* inset = static_cast<const InsetIndex*>(&(item.dit().inset()));
+		if (item.isOutput() && inset->params().index == indexType)
+			entries.emplace_back(IndexEntry{inset, &op});
 	}
 
 	// If all the index entries are in notes or not displayed, get out sooner.
@@ -1690,6 +1682,7 @@ docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const
 	Layout const & lay = bp.documentClass().htmlTOCLayout();
 	string const & tocclass = lay.defaultCSSClass();
 	string const tocattr = "class='index " + tocclass + "'";
+	docstring const indexName = params().getParamOr("name", from_ascii("Index"));
 
 	// we'll use our own stream, because we are going to defer everything.
 	// that's how we deal with the fact that we're probably inside a standard
@@ -1700,7 +1693,7 @@ docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const
 	xs << xml::StartTag("div", tocattr);
 	xs << xml::CR();
 	xs << xml::StartTag(lay.htmltag(), lay.htmlattr());
-	xs << translateIfPossible(from_ascii("Index"), op.local_font->language()->lang());
+	xs << translateIfPossible(indexName, op.local_font->language()->lang());
 	xs << xml::EndTag(lay.htmltag());
 	xs << xml::CR();
 	xs << xml::StartTag("ul", "class='main'");
diff --git a/src/insets/InsetIndex.h b/src/insets/InsetIndex.h
index 6a74b79..6f0708e 100644
--- a/src/insets/InsetIndex.h
+++ b/src/insets/InsetIndex.h
@@ -54,6 +54,8 @@ public:
 	static std::string params2string(InsetIndexParams const &);
 	///
 	static void string2params(std::string const &, InsetIndexParams &);
+	///
+	const InsetIndexParams& params() const { return params_; }
 private:
 	///
 	bool hasSettings() const override;

commit f4b0cf9b599c0994c0e8c60390a65d57d5f7262a
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date:   Thu Sep 1 01:13:47 2022 +0200

    DocBook: amend 34ea4080
    
    @ for sorting is implemented at 34ea4080, but the user was still shown a warning (now removed).

diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp
index 848d530..f463b19 100644
--- a/src/insets/InsetIndex.cpp
+++ b/src/insets/InsetIndex.cpp
@@ -320,14 +320,6 @@ void InsetIndex::docbook(XMLStream & xs, OutputParams const & runparams) const
 	InsetText::latex(ots, runparams);
 	docstring latexString = trim(odss.str());
 
-	// Check whether there are unsupported things. @ is supported, but only for sorting, without specific formatting.
-	if (latexString.find(from_utf8("@\\")) != lyx::docstring::npos) {
-		docstring error = from_utf8("Unsupported feature: an index entry contains an @\\. "
-									"Complete entry: \"") + latexString + from_utf8("\"");
-		LYXERR0(error);
-		xs << XMLStream::ESCAPE_NONE << (from_utf8("<!-- Output Error: ") + error + from_utf8(" -->\n"));
-	}
-
 	// Handle several indices (indicated in the inset instead of the raw latexString).
 	docstring indexType = from_utf8("");
 	if (buffer().masterBuffer()->params().use_indices) {

commit 35a752e6db95d53dc81e6f8b5f26a8869c13c641
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date:   Thu Sep 1 01:11:40 2022 +0200

    DocBook: add test case for multiple indices

diff --git a/autotests/export/docbook/index_multiple.lyx b/autotests/export/docbook/index_multiple.lyx
new file mode 100644
index 0000000..66542aa
--- /dev/null
+++ b/autotests/export/docbook/index_multiple.lyx
@@ -0,0 +1,248 @@
+#LyX 2.4 created this file. For more info see https://www.lyx.org/
+\lyxformat 609
+\begin_document
+\begin_header
+\save_transient_properties true
+\origin unavailable
+\textclass article
+\use_default_options true
+\maintain_unincluded_children no
+\language american
+\language_package default
+\inputencoding utf8
+\fontencoding auto
+\font_roman "default" "default"
+\font_sans "default" "default"
+\font_typewriter "default" "default"
+\font_math "auto" "auto"
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_roman_osf false
+\font_sans_osf false
+\font_typewriter_osf false
+\font_sf_scale 100 100
+\font_tt_scale 100 100
+\use_microtype false
+\use_dash_ligatures true
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\float_placement class
+\float_alignment class
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry false
+\use_package amsmath 1
+\use_package amssymb 1
+\use_package cancel 1
+\use_package esint 1
+\use_package mathdots 1
+\use_package mathtools 1
+\use_package mhchem 1
+\use_package stackrel 1
+\use_package stmaryrd 1
+\use_package undertilde 1
+\cite_engine basic
+\cite_engine_type default
+\biblio_style plain
+\use_bibtopic false
+\use_indices true
+\paperorientation portrait
+\suppress_date false
+\justification true
+\use_refstyle 1
+\use_minted 0
+\use_lineno 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\index Secondary
+\shortcut sec
+\color #550000
+\end_index
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\is_math_indent 0
+\math_numbering_side default
+\quotes_style english
+\dynamic_quotes 0
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tablestyle default
+\tracking_changes false
+\output_changes false
+\change_bars false
+\postpone_fragile_content true
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\docbook_table_output 0
+\docbook_mathml_prefix 1
+\end_header
+
+\begin_body
+
+\begin_layout Title
+Multiple indices tests
+\end_layout
+
+\begin_layout Standard
+\begin_inset Index idx
+range none
+pageformat default
+status open
+
+\begin_layout Plain Layout
+A
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Index idx
+range none
+pageformat default
+status open
+
+\begin_layout Plain Layout
+A
+\begin_inset IndexMacro subindex
+status open
+
+\begin_layout Plain Layout
+B
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Index sec
+range none
+pageformat default
+status open
+
+\begin_layout Plain Layout
+A
+\begin_inset IndexMacro subindex
+status open
+
+\begin_layout Plain Layout
+B
+\end_layout
+
+\end_inset
+
+
+\begin_inset IndexMacro subindex
+status open
+
+\begin_layout Plain Layout
+C
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Index sec
+range none
+pageformat default
+status open
+
+\begin_layout Plain Layout
+A
+\begin_inset IndexMacro subindex
+status open
+
+\begin_layout Plain Layout
+D
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Index sec
+range none
+pageformat default
+status open
+
+\begin_layout Plain Layout
+E
+\begin_inset IndexMacro subindex
+status open
+
+\begin_layout Plain Layout
+F
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset CommandInset index_print
+LatexCommand printindex
+type "idx"
+name "Index"
+literal "false"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset CommandInset index_print
+LatexCommand printindex
+type "sec"
+name "Index"
+literal "false"
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document
diff --git a/autotests/export/docbook/index_multiple.xml b/autotests/export/docbook/index_multiple.xml
new file mode 100644
index 0000000..dcc60ec
--- /dev/null
+++ b/autotests/export/docbook/index_multiple.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This DocBook file was created by LyX 2.4.0dev
+  See https://www.lyx.org/ for more information -->
+<article xml:lang="en_US" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.2">
+<title>Multiple indices tests</title>
+<para><indexterm type="idx"><primary>A</primary></indexterm></para>
+<para><indexterm type="idx"><primary>A</primary><secondary>B</secondary></indexterm></para>
+<para><indexterm type="sec"><primary>A</primary><secondary>B</secondary><tertiary>C</tertiary></indexterm></para>
+<para><indexterm type="sec"><primary>A</primary><secondary>D</secondary></indexterm></para>
+<para><indexterm type="sec"><primary>E</primary><secondary>F</secondary></indexterm></para>
+</article>
\ No newline at end of file
diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp
index bcae16c..848d530 100644
--- a/src/insets/InsetIndex.cpp
+++ b/src/insets/InsetIndex.cpp
@@ -1680,6 +1680,7 @@ docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const
 	// Collect the index entries in a form we can use them.
 	vector<IndexEntry> entries;
 	for (const TocItem& item : *toc) {
+		static_cast<const InsetIndex*>(&(item.dit().inset()))->params_.index;
 		if (item.isOutput())
 			entries.emplace_back(IndexEntry{static_cast<const InsetIndex*>(&(item.dit().inset())), &op});
 	}

commit 07380a3bc167f6479a6c0c7a639e703d2eedeb9c
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date:   Thu Sep 1 00:14:41 2022 +0200

    DocBook: add missing test case for index

diff --git a/autotests/export/docbook/index_nesting.xml b/autotests/export/docbook/index_nesting.xml
new file mode 100644
index 0000000..e80244e
--- /dev/null
+++ b/autotests/export/docbook/index_nesting.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This DocBook file was created by LyX 2.4.0dev
+  See https://www.lyx.org/ for more information -->
+<article xml:lang="en_US" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.2">
+<title>Index nesting tests</title>
+<para><indexterm><primary>A</primary></indexterm></para>
+<para><indexterm><primary>A</primary><secondary>B</secondary></indexterm></para>
+<para><indexterm><primary>A</primary><secondary>B</secondary><tertiary>C</tertiary></indexterm></para>
+<para><indexterm><primary>A</primary><secondary>D</secondary></indexterm></para>
+<para><indexterm><primary>E</primary><secondary>F</secondary></indexterm></para>
+</article>
\ No newline at end of file

-----------------------------------------------------------------------

Summary of changes:
 .../{index_nesting.lyx => index_multiple.lyx}      |   29 ++++++++++++++++---
 autotests/export/docbook/index_multiple.xml        |   11 +++++++
 autotests/export/docbook/index_nesting.xml         |   11 +++++++
 src/insets/InsetCommandParams.cpp                  |   20 +++++++++++--
 src/insets/InsetCommandParams.h                    |    4 +++
 src/insets/InsetIndex.cpp                          |   26 ++++-------------
 src/insets/InsetIndex.h                            |    2 +
 7 files changed, 75 insertions(+), 28 deletions(-)
 copy autotests/export/docbook/{index_nesting.lyx => index_multiple.lyx} (89%)
 create mode 100644 autotests/export/docbook/index_multiple.xml
 create mode 100644 autotests/export/docbook/index_nesting.xml


hooks/post-receive
-- 
Repository for new features


More information about the lyx-cvs mailing list