UNPKG

@astro-tei/react

Version:

Astro integration for TEI as Custom Elements with React support

36 lines 1.58 kB
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