@astro-tei/react
Version:
Astro integration for TEI as Custom Elements with React support
98 lines • 4.44 kB
JavaScript
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