28 lines
1,023 B
JavaScript
28 lines
1,023 B
JavaScript
![]() |
import { markHTMLString } from "../escape.js";
|
||
|
import { renderSlotToString } from "./slot.js";
|
||
|
import { toAttributeString } from "./util.js";
|
||
|
function componentIsHTMLElement(Component) {
|
||
|
return typeof HTMLElement !== "undefined" && HTMLElement.isPrototypeOf(Component);
|
||
|
}
|
||
|
async function renderHTMLElement(result, constructor, props, slots) {
|
||
|
const name = getHTMLElementName(constructor);
|
||
|
let attrHTML = "";
|
||
|
for (const attr in props) {
|
||
|
attrHTML += ` ${attr}="${toAttributeString(await props[attr])}"`;
|
||
|
}
|
||
|
return markHTMLString(
|
||
|
`<${name}${attrHTML}>${await renderSlotToString(result, slots == null ? void 0 : slots.default)}</${name}>`
|
||
|
);
|
||
|
}
|
||
|
function getHTMLElementName(constructor) {
|
||
|
const definedName = customElements.getName(constructor);
|
||
|
if (definedName)
|
||
|
return definedName;
|
||
|
const assignedName = constructor.name.replace(/^HTML|Element$/g, "").replace(/[A-Z]/g, "-$&").toLowerCase().replace(/^-/, "html-");
|
||
|
return assignedName;
|
||
|
}
|
||
|
export {
|
||
|
componentIsHTMLElement,
|
||
|
renderHTMLElement
|
||
|
};
|