@astro-tei/react
Version:
Astro integration for TEI as Custom Elements with React support
36 lines • 1.58 kB
JavaScript
import { jsx as _jsx } from "react/jsx-runtime";
import React, { createContext, use, useMemo } from "react";
import { forwardAttributes } from "./Behavior";
const ComponentMapContext = createContext({});
export const ComponentMapProvider = ({ componentMap, children }) => {
const memoizedMap = useMemo(() => componentMap, [componentMap]);
return _jsx(ComponentMapContext, { value: memoizedMap, children: children });
};
const useComponentMap = () => use(ComponentMapContext);
export const TEINode = ({ node }) => {
const componentMap = useComponentMap();
// nodeType 3 is Node.TEXT_NODE
if (node.nodeType === 3) {
return node.textContent;
}
// nodeType 1 is Node.ELEMENT_NODE
if (node.nodeType === 1) {
const el = node;
// CETEIcean generates <style> from <tei:rendition>;
// make sure it's not processed further or hydration errors may occur
if (el.tagName === 'style') {
return node.textContent;
}
const Component = componentMap[el.tagName.toLowerCase()];
const children = Array.from(el.childNodes).map((child, index) => (_jsx(TEINode, { node: child }, index)));
if (Component) {
return _jsx(Component, { element: el, content: children });
}
return React.createElement(el.tagName.toLowerCase(), forwardAttributes(el.attributes), children);
}
return null;
};
export const TEINodes = ({ nodes }) => {
return Array.from(nodes).map((child, index) => (_jsx(TEINode, { node: child }, index)));
};
//# sourceMappingURL=TEINode.js.map