[LyX/2.4.1-devel] XHTML: export paragraph IDs also for list items, but not for the opening tag of the list.

Pavel Sanda sanda at lyx.org
Sun Jun 2 09:59:47 UTC 2024


commit 37a865762b805a9b7cfed783719548a0d86f47e2
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date:   Mon May 20 03:21:00 2024 +0200

    XHTML: export paragraph IDs also for list items, but not for the opening tag of the list.
    
    The IDs are used to link to specific elements (for instance, the User's guide nomenclature).
    
    The beginning of the list (<ul> or <ol>) has the same magic ID as the first item of the list.
---
 src/output_xhtml.cpp | 33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/src/output_xhtml.cpp b/src/output_xhtml.cpp
index f01b0b8e62..f8ccc3733e 100644
--- a/src/output_xhtml.cpp
+++ b/src/output_xhtml.cpp
@@ -210,25 +210,32 @@ inline void closeLabelTag(XMLStream & xs, Layout const & lay)
 }
 
 
-inline void openItemTag(XMLStream & xs, Layout const & lay)
+inline void openItemTag(XMLStream & xs, Layout const & lay,
+                        std::string const & parlabel)
 {
 	if (lay.htmlitemtag() != "NONE") {
-		xs << xml::StartTag(lay.htmlitemtag(), lay.htmlitemattr(), true);
+		string attrs = lay.htmlitemattr();
+		if (!parlabel.empty())
+			attrs += " id='" + parlabel + "'";
+		xs << xml::StartTag(lay.htmlitemtag(), attrs, true);
 	}
 }
 
 
 void openItemTag(XMLStream & xs, Layout const & lay,
-             ParagraphParameters const & params)
+                 ParagraphParameters const & params,
+                 std::string const & parlabel)
 {
 	if (lay.htmlitemtag() != "NONE") {
 		// FIXME Are there other things we should handle here?
 		string const align = alignmentToCSS(params.align());
 		if (align.empty()) {
-			openItemTag(xs, lay);
+			openItemTag(xs, lay, parlabel);
 			return;
 		}
 		string attrs = lay.htmlGetAttrString() + " style='text-align: " + align + ";'";
+		if (!parlabel.empty())
+			attrs += " id='" + parlabel + "'";
 		xs << xml::StartTag(lay.htmlitemtag(), attrs);
 	}
 }
@@ -411,7 +418,8 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf,
 	ParagraphList::const_iterator const begin = text.paragraphs().begin();
 	ParagraphList::const_iterator par = pbegin;
 	Layout const & bstyle = par->layout();
-	depth_type const origdepth = pbegin->params().depth();
+	depth_type const origdepth = par->params().depth();
+	string const parId = bstyle.htmlitemtag().empty() ? par->magicLabel() : "";
 
 	// open tag for this environment
 	if ((bstyle.labeltype == LABEL_ENUMERATE || bstyle.labeltype == LABEL_ITEMIZE)
@@ -444,12 +452,12 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf,
 			// not a valid enumdepth...
 			break;
 		}
-		openParTag(xs, bstyle,
-				   string( isenum ? "lyxenum" : "lyxitem" ) + " "
-					+ to_utf8(enumcounter), pbegin->magicLabel());
+		const string cssClass = string(isenum ? "lyxenum" : "lyxitem") + " "
+		                      + to_utf8(enumcounter);
+		openParTag(xs, bstyle, cssClass, parId);
 	}
 	else
-		openParTag(xs, bstyle, pbegin->magicLabel());
+		openParTag(xs, bstyle, parId);
 	xs << xml::CR();
 
 	// we will on occasion need to remember a layout from before.
@@ -491,7 +499,7 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf,
 				pos_type sep = 0;
 				bool const labelfirst = style.htmllabelfirst();
 				if (!labelfirst)
-					openItemTag(xs, style, par->params());
+					openItemTag(xs, style, par->params(), par->magicLabel());
 
 				// label output
 				if (style.labeltype != LABEL_NO_LABEL &&
@@ -529,7 +537,7 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf,
 				} // end label output
 
 				if (labelfirst)
-					openItemTag(xs, style, par->params());
+					openItemTag(xs, style, par->params(), par->magicLabel());
 
 				docstring deferred = par->simpleLyXHTMLOnePar(buf, xs, runparams,
 					text.outerFont(distance(begin, par)), true, true, sep);
@@ -594,8 +602,7 @@ void makeCommand(Buffer const & buf,
 		buf.masterBuffer()->params().
 		    documentClass().counters().step(style.counter, OutputUpdate);
 
-	bool const make_parid = !runparams.for_toc && runparams.html_make_pars;
-
+	bool const make_parid = !runparams.for_toc && runparams.html_make_pars && style.itemtag().empty();
 	openParTag(xs, style, pbegin->params(),
 	           make_parid ? pbegin->magicLabel() : "");
 


More information about the lyx-cvs mailing list