UNPKG

@astro-tei/react

Version:

Astro integration for TEI as Custom Elements with React support

98 lines 4.44 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import React from "react"; import { serialize } from "CETEIcean/utilities.js"; import { TEINode, TEINodes } from "./TEINode"; import Behavior, { forwardAttributes } from "./Behavior"; export const SafeUnchangedNode = ({ element, content }) => { // Re-build an element that does not need changing // to avoid routes from being infinitely re-applied. return React.createElement(element.tagName.toLowerCase(), forwardAttributes(element.attributes), content); }; export const Eg = ({ element }) => { let content = serialize(element, true); const ws = content.match(/^[\t ]+/); if (ws) { content = content.replace(new RegExp("^" + ws[0], "mg"), ""); } return (_jsx(Behavior, { node: element, children: _jsx("pre", { children: content }) })); }; export const Graphic = ({ element }) => { const el = element; const src = el.getAttribute("url"); if (!src) { return null; } ; const imgProps = { src }; if (el.getAttribute("width")) { imgProps.width = el.getAttribute("width") || ""; } if (el.getAttribute("height")) { imgProps.height = el.getAttribute("width") || ""; } return (_jsx(Behavior, { node: element, children: _jsx("img", { ...imgProps }) })); }; export const List = ({ element, content }) => { if (element.getAttribute("type") !== "gloss") { return _jsx(SafeUnchangedNode, { element: element, content: content }); } const children = Array.from(element.childNodes); return (_jsx(Behavior, { node: element, children: _jsx("dl", { children: children.map((child, i) => { if (child.nodeType !== 1) { return (_jsx(TEINode, { node: child }, `t-${i}`)); } const childEl = child; switch (childEl.localName) { case "tei-label": return (_jsx("dt", { children: _jsx(TEINodes, { nodes: childEl.childNodes }) }, `tt-${i}`)); case "tei-item": return (_jsx("dd", { children: _jsx(TEINodes, { nodes: childEl.childNodes }) }, `td-${i}`)); } }) }) })); }; export const Ptr = ({ element }) => { const target = element.getAttribute("target") || ""; return (_jsx(Behavior, { node: element, children: _jsx("a", { href: target, children: target }) })); }; export const Ref = ({ element, content }) => { const target = element.getAttribute("target") || ""; return (_jsx(Behavior, { node: element, children: _jsx("a", { href: target, children: content }) })); }; const NoteCounterContext = React.createContext({ n: 0, setNoteCounter: () => console.warn('no note counter data provider') }); const NoteCounterProvider = ({ children }) => { const [n, setNoteCounter] = React.useState(0); return _jsx(NoteCounterContext, { value: { n, setNoteCounter }, children: children }); }; export const Note = ({ element, content }) => { // THIS BEHAVIORS DEPENDS ON THE Tei BEHAVIOR if (element.getAttribute("place") !== "end") { return _jsx(SafeUnchangedNode, { element: element, content: content }); } const id = `_note_${element.getAttribute("data-idx")}`; return (_jsx(Behavior, { node: element, children: _jsx("sup", { children: _jsx("a", { id: `src${id}`, href: `#${id}`, children: element.getAttribute("data-idx") }) }) })); }; export const Tei = ({ element, content }) => { const before = []; const after = []; // end notes const endNotes = Array.from(element.getElementsByTagName("tei-note")).reduce((acc, note, i) => { if (note.getAttribute("place") === "end") { // Add an index to the note note.setAttribute("data-idx", (i + 1).toString()); const id = `_note_${i + 1}`; acc.push(_jsx("li", { id: id, children: _jsx(TEINodes, { nodes: note.childNodes }, `en${i}`) }, id)); } return acc; }, []); if (endNotes.length > 0) { after.push(_jsx("ol", { className: "ceteicean-notes", children: endNotes }, `endnotes-${after.length}`)); } return (_jsxs(NoteCounterProvider, { children: [before, _jsx(SafeUnchangedNode, { element: element, content: content }), after] })); }; export const TeiHeader = ({ element }) => { return _jsx(Behavior, { node: element }); }; //# sourceMappingURL=DefaultBehaviors.js.map