@astro-tei/react
Version:
Astro integration for TEI as Custom Elements with React support
41 lines • 1.54 kB
JavaScript
import React from "react";
function hideContent(root, rewriteIds = true) {
const elements = root.querySelectorAll("*");
elements.forEach((element) => {
element.setAttribute("data-processed", "");
if (rewriteIds && element.id) {
element.setAttribute("data-origid", element.id);
element.removeAttribute("id");
}
});
return root;
}
export const forwardAttributes = (atts) => {
return Array.from(atts).reduce((acc, att) => {
acc[att.name === "ref" ? "Ref" : att.name] = att.value;
return acc;
}, {});
};
export default function Behavior({ children, node, className, keepOriginal = true, rewriteIds = true }) {
const el = node;
if (!el.tagName) {
throw new Error("Behavior component must be passed an Element node.");
}
let hiddenOriginal = null;
if (keepOriginal) {
const hiddenContent = hideContent(el, rewriteIds).outerHTML
.replace(/<([^\s/]+)([^>]*?)\/>/gm, "<$1$2></$1>"); // expand self closing elements
hiddenOriginal = React.createElement("cetei-original", {
"hidden": "",
"data-original": "",
dangerouslySetInnerHTML: { __html: hiddenContent }
});
}
const classAtt = {};
if (className) {
classAtt.className = className;
}
const attributes = Object.assign(classAtt, forwardAttributes(el.attributes));
return React.createElement(el.tagName, attributes, hiddenOriginal, children);
}
//# sourceMappingURL=Behavior.js.map