[LyX/master] Handle empty index subentries (#7820)

Juergen Spitzmueller spitz at lyx.org
Tue Nov 1 08:28:28 UTC 2022


commit fd5adacef25eb40f813dedd961920c353448213a
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Tue Nov 1 10:20:50 2022 +0100

    Handle empty index subentries (#7820)
---
 src/insets/InsetIndex.cpp      |   31 ++++++++++++++++++++++++++++---
 src/insets/InsetIndex.h        |    4 +++-
 src/insets/InsetIndexMacro.cpp |    6 ++++++
 src/insets/InsetIndexMacro.h   |    2 ++
 4 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp
index 13a7b4d..b3024bf 100644
--- a/src/insets/InsetIndex.cpp
+++ b/src/insets/InsetIndex.cpp
@@ -160,7 +160,7 @@ void InsetIndex::latex(otexstream & ios, OutputParams const & runparams_in) cons
 		getSortkey(os, runparams);
 		os << "@";
 		os << ourlatex.str();
-		getSubentries(os, runparams);
+		getSubentries(os, runparams, ourlatex.str());
 		if (hasSeeRef()) {
 			os << "|";
 			os << insetindexpagerangetranslator_latex().find(params_.range);
@@ -214,7 +214,7 @@ void InsetIndex::latex(otexstream & ios, OutputParams const & runparams_in) cons
 
 		odocstringstream subentries;
 		otexstream otsub(subentries);
-		getSubentries(otsub, runparams);
+		getSubentries(otsub, runparams, ourlatex.str());
 		if (subentries.str().empty()) {
 			// Separate the entries and subentries, i.e., split on "!".
 			// This goes wrong on an escaped "!", but as the escape
@@ -230,6 +230,12 @@ void InsetIndex::latex(otexstream & ios, OutputParams const & runparams_in) cons
 			vector<docstring>::const_iterator it2 = levels_plain.begin();
 			bool first = true;
 			for (; it != end; ++it) {
+				if ((*it).empty()) {
+					emptySubentriesWarning(ourlatex.str());
+					if (it2 < levels_plain.end())
+						++it2;
+					continue;
+				}
 				// The separator needs to be put back when
 				// writing the levels, except for the first level
 				if (!first)
@@ -668,7 +674,22 @@ docstring InsetIndex::getSortkeyAsText(OutputParams const & runparams) const
 }
 
 
-void InsetIndex::getSubentries(otexstream & os, OutputParams const & runparams) const
+void InsetIndex::emptySubentriesWarning(docstring const & mainentry) const
+{
+	// Empty subentries crash makeindex. So warn and ignore this.
+	TeXErrors terr;
+	ErrorList & errorList = buffer().errorList("Export");
+	docstring const s = bformat(_("There is an empty index subentry in the entry '%1$s'.\n"
+				      "It will be ignored in the output."), mainentry);
+	Paragraph const & par = buffer().paragraphs().front();
+	errorList.push_back(ErrorItem(_("Empty index subentry!"), s,
+				      {par.id(), 0}, {par.id(), -1}));
+	buffer().bufferErrors(terr, errorList);
+}
+
+
+void InsetIndex::getSubentries(otexstream & os, OutputParams const & runparams,
+			       docstring const & mainentry) const
 {
 	Paragraph const & par = paragraphs().front();
 	InsetList::const_iterator it = par.insetList().begin();
@@ -679,6 +700,10 @@ void InsetIndex::getSubentries(otexstream & os, OutputParams const & runparams)
 			InsetIndexMacro const & iim =
 				static_cast<InsetIndexMacro const &>(inset);
 			if (iim.params().type == InsetIndexMacroParams::Subentry) {
+				if (iim.hasNoContent()) {
+					emptySubentriesWarning(mainentry);
+					continue;
+				}
 				++i;
 				if (i > 2)
 					return;
diff --git a/src/insets/InsetIndex.h b/src/insets/InsetIndex.h
index 1aaf2d7..742ecae 100644
--- a/src/insets/InsetIndex.h
+++ b/src/insets/InsetIndex.h
@@ -102,7 +102,9 @@ private:
 	///
 	docstring getSortkeyAsText(OutputParams const &) const;
 	///
-	void getSubentries(otexstream &, OutputParams const &) const;
+	void emptySubentriesWarning(docstring const & mainentry) const;
+	///
+	void getSubentries(otexstream &, OutputParams const &, docstring const &) const;
 	///
 	std::vector<docstring> getSubentriesAsText(OutputParams const &,
 						   bool const asLabel = false) const;
diff --git a/src/insets/InsetIndexMacro.cpp b/src/insets/InsetIndexMacro.cpp
index 3175430..e4dc167 100644
--- a/src/insets/InsetIndexMacro.cpp
+++ b/src/insets/InsetIndexMacro.cpp
@@ -205,6 +205,12 @@ docstring InsetIndexMacro::getXhtml(XMLStream & xs, OutputParams const & runpara
 }
 
 
+bool InsetIndexMacro::hasNoContent() const
+{
+	return paragraphs().front().empty();
+}
+
+
 void InsetIndexMacro::doDispatch(Cursor & cur, FuncRequest & cmd)
 {
 	switch (cmd.action()) {
diff --git a/src/insets/InsetIndexMacro.h b/src/insets/InsetIndexMacro.h
index 3d56e39..07109f8 100644
--- a/src/insets/InsetIndexMacro.h
+++ b/src/insets/InsetIndexMacro.h
@@ -66,6 +66,8 @@ public:
 	int getPlaintext(odocstringstream &, OutputParams const &, size_t) const;
 	///
 	void getDocbook(XMLStream &, OutputParams const &) const;
+	///
+	bool hasNoContent() const;
 private:
 	///
 	InsetCode lyxCode() const override;


More information about the lyx-cvs mailing list