Handle empty index subentries (#7820)

This commit is contained in:
Juergen Spitzmueller 2022-11-01 10:20:50 +01:00
parent 3bf1b97ae5
commit fd5adacef2
4 changed files with 39 additions and 4 deletions

View File

@ -160,7 +160,7 @@ void InsetIndex::latex(otexstream & ios, OutputParams const & runparams_in) cons
getSortkey(os, runparams); getSortkey(os, runparams);
os << "@"; os << "@";
os << ourlatex.str(); os << ourlatex.str();
getSubentries(os, runparams); getSubentries(os, runparams, ourlatex.str());
if (hasSeeRef()) { if (hasSeeRef()) {
os << "|"; os << "|";
os << insetindexpagerangetranslator_latex().find(params_.range); os << insetindexpagerangetranslator_latex().find(params_.range);
@ -214,7 +214,7 @@ void InsetIndex::latex(otexstream & ios, OutputParams const & runparams_in) cons
odocstringstream subentries; odocstringstream subentries;
otexstream otsub(subentries); otexstream otsub(subentries);
getSubentries(otsub, runparams); getSubentries(otsub, runparams, ourlatex.str());
if (subentries.str().empty()) { if (subentries.str().empty()) {
// Separate the entries and subentries, i.e., split on "!". // Separate the entries and subentries, i.e., split on "!".
// This goes wrong on an escaped "!", but as the escape // 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(); vector<docstring>::const_iterator it2 = levels_plain.begin();
bool first = true; bool first = true;
for (; it != end; ++it) { 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 // The separator needs to be put back when
// writing the levels, except for the first level // writing the levels, except for the first level
if (!first) 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(); Paragraph const & par = paragraphs().front();
InsetList::const_iterator it = par.insetList().begin(); InsetList::const_iterator it = par.insetList().begin();
@ -679,6 +700,10 @@ void InsetIndex::getSubentries(otexstream & os, OutputParams const & runparams)
InsetIndexMacro const & iim = InsetIndexMacro const & iim =
static_cast<InsetIndexMacro const &>(inset); static_cast<InsetIndexMacro const &>(inset);
if (iim.params().type == InsetIndexMacroParams::Subentry) { if (iim.params().type == InsetIndexMacroParams::Subentry) {
if (iim.hasNoContent()) {
emptySubentriesWarning(mainentry);
continue;
}
++i; ++i;
if (i > 2) if (i > 2)
return; return;

View File

@ -102,7 +102,9 @@ private:
/// ///
docstring getSortkeyAsText(OutputParams const &) const; 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 &, std::vector<docstring> getSubentriesAsText(OutputParams const &,
bool const asLabel = false) const; bool const asLabel = false) const;

View File

@ -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) void InsetIndexMacro::doDispatch(Cursor & cur, FuncRequest & cmd)
{ {
switch (cmd.action()) { switch (cmd.action()) {

View File

@ -66,6 +66,8 @@ public:
int getPlaintext(odocstringstream &, OutputParams const &, size_t) const; int getPlaintext(odocstringstream &, OutputParams const &, size_t) const;
/// ///
void getDocbook(XMLStream &, OutputParams const &) const; void getDocbook(XMLStream &, OutputParams const &) const;
///
bool hasNoContent() const;
private: private:
/// ///
InsetCode lyxCode() const override; InsetCode lyxCode() const override;