From 8758000641e9014cd40581d309ded0e1cea44acf Mon Sep 17 00:00:00 2001 From: Thibaut Cuvelier Date: Fri, 11 Sep 2020 23:38:11 +0200 Subject: [PATCH] DocBook: ensure xml:id is not output too many times. This is mostly important for subfigures, but debugging this issue showed that InsetCaption could be slightly simplified and InsetLabel should be made a tad more robust. --- src/insets/InsetCaption.cpp | 3 +-- src/insets/InsetFloat.cpp | 2 +- src/insets/InsetLabel.cpp | 7 +++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/insets/InsetCaption.cpp b/src/insets/InsetCaption.cpp index 029162563a..8297c6fcde 100644 --- a/src/insets/InsetCaption.cpp +++ b/src/insets/InsetCaption.cpp @@ -367,8 +367,7 @@ void InsetCaption::getCaptionAsDocBook(XMLStream & xs, return; // Ignore full_label_, as the DocBook processor will deal with the numbering. - InsetText::XHTMLOptions const opts = - InsetText::WriteLabel | InsetText::WriteInnerTag; + InsetText::XHTMLOptions opts = InsetText::WriteInnerTag; InsetText::docbook(xs, runparams, opts); } diff --git a/src/insets/InsetFloat.cpp b/src/insets/InsetFloat.cpp index d68001366b..eaa24cb5bd 100644 --- a/src/insets/InsetFloat.cpp +++ b/src/insets/InsetFloat.cpp @@ -583,7 +583,7 @@ void docbookSubfigures(XMLStream & xs, OutputParams const & runparams, const Ins xs << xml::StartTag("formalgroup", attr); xs << xml::CR(); - xs << xml::StartTag("title", attr); + xs << xml::StartTag("title"); // Don't take attr here, the ID should only go in one place, not two. if (caption) { caption->getCaptionAsDocBook(xs, rpNoLabel); } else { diff --git a/src/insets/InsetLabel.cpp b/src/insets/InsetLabel.cpp index 2e80e26a83..5ba034456f 100644 --- a/src/insets/InsetLabel.cpp +++ b/src/insets/InsetLabel.cpp @@ -356,8 +356,11 @@ int InsetLabel::plaintext(odocstringstream & os, void InsetLabel::docbook(XMLStream & xs, OutputParams const & runparams) const { // Output an anchor only if it has not been processed before. - if (runparams.docbook_anchors_to_ignore.find(getParam("name")) == runparams.docbook_anchors_to_ignore.end()) { - docstring attr = from_utf8("xml:id=\"") + xml::cleanID(getParam("name")) + from_utf8("\""); + docstring id = getParam("name"); + docstring cleaned_id = xml::cleanID(id); + if (runparams.docbook_anchors_to_ignore.find(id) == runparams.docbook_anchors_to_ignore.end() && + runparams.docbook_anchors_to_ignore.find(cleaned_id) == runparams.docbook_anchors_to_ignore.end()) { + docstring attr = from_utf8("xml:id=\"") + cleaned_id + from_utf8("\""); xs << xml::CompTag("anchor", to_utf8(attr)); } }