Skip to content
24 changes: 24 additions & 0 deletions src/core/webidl.js
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,7 @@ function renderWebIDL(idlElement, index) {
// Skip this <pre> and move on to the next one.
return [];
}
addDataDfnFor(idlElement, parse);
// we add "idl" as the canonical match, so both "webidl" and "idl" work
idlElement.classList.add("def", "idl");
const highlights = webidl2.write(parse, { templates });
Expand Down Expand Up @@ -364,6 +365,29 @@ function renderWebIDL(idlElement, index) {
addIDLHeader(idlElement);
return parse;
}

/**
* Add data-dfn-for to the closest section if not present already.
* @param {HTMLPreElement} idlElement
* @param {ReturnType<typeof webidl2.parse>} parse
*/
function addDataDfnFor(idlElement, parse) {
const closestSection = idlElement.closest("section");
if (!closestSection || closestSection.hasAttribute("data-dfn-for")) return;

const dfnFors = [];
for (const { tokens } of parse) {
if (["interface", "dictionary", "enum"].includes(tokens.base.type)) {
const dfnFor = tokens.name.value;
dfnFors.push(dfnFor);
}
}
if (dfnFors.length === 1) {
closestSection.dataset.dfnFor = dfnFors[0];
}
// TODO: make linker support multiple dfnFors
}

/**
* Adds a "WebIDL" decorative header/permalink to a block of WebIDL.
* @param {HTMLPreElement} pre
Expand Down