diff --git a/src/core/dfn.js b/src/core/dfn.js index 96d3c7e19e..c6047e4d92 100644 --- a/src/core/dfn.js +++ b/src/core/dfn.js @@ -237,4 +237,26 @@ function addContractDefaults() { for (const dfn of exportableDfns) { dfn.dataset.export = ""; } + + // - Sets data-defines on well-known definition content patterns + + // A dt with class dfn-desc (on in a dl with such a class) + // containing a definition + // indicates that the following dd or div element contains its prose content + for (const dt of document.querySelectorAll("dl.dfn-desc dt:has(dfn[data-dfn-type]), dt.dfn-desc:has(dfn[data-dfn-type])")) { + const dfnId = dt.querySelector("dfn[id]").id; + const dfnContent = dt.nextElementSibling; + if (dfnId && ["DIV", "DD"].includes(dfnContent.tagName)) { + dfnContent.dataset.defines = `#${dfnId}`; + } + } + + // a non-dt element with class dfn-desc containing a definition + // indicates that the said element contains its prose content + for (const el of document.querySelectorAll(":not(dt):not(dl).dfn-desc:has(dfn[data-dfn-type])")) { + const dfnId = el.querySelector("dfn[id]").id; + if (dfnId) { + el.dataset.defines = `#${dfnId}`; + } + } } diff --git a/tests/spec/core/dfn-spec.js b/tests/spec/core/dfn-spec.js index fb1b4003e7..ecee316651 100644 --- a/tests/spec/core/dfn-spec.js +++ b/tests/spec/core/dfn-spec.js @@ -655,5 +655,33 @@ describe("Core — Definitions", () => { expect(errors[0].message).toContain("Declares both"); expect(errors[1].message).toContain("but also has a"); }); + + it("assigns data-defines on well-known pattern", async () => { + const body = ` +
+

Definition and its description

+

+ A definition can also have an associated description +

+
+
different convention
+
Different conventions can be applied to associate a term with its description
+
+
+
local convention
+
The local convention can be applied to a dt individually
+
+
+ `; + const ops = makeStandardOps(null, body); + const doc = await makeRSDoc(ops); + const desc1 = doc.getElementById("desc1"); + const desc2 = doc.getElementById("desc2"); + const desc3 = doc.getElementById("desc3"); + expect(desc1.dataset.defines).toBe("#dfn-definition"); + expect(desc2.dataset.defines).toBe("#dfn-different-convention"); + expect(desc3.dataset.defines).toBe("#dfn-local-convention"); + }); + }); });