import { h } from "preact";
import { PubLeafletBlocksText } from "npm:@atcute/leaflet";
interface TextBlockProps {
plaintext: string;
facets?: PubLeafletBlocksText.Main["facets"];
}
export function TextBlock({ plaintext, facets }: TextBlockProps) {
// Only process facets if at least one facet has features
if (!facets || !facets.some(f => f.features && f.features.length > 0)) {
return <>{plaintext}>;
}
const parts: (string | { text: string; type: string; uri?: string })[] = [];
let lastIndex = 0;
facets.forEach((facet) => {
if (facet.index.byteStart > lastIndex) {
parts.push(plaintext.slice(lastIndex, facet.index.byteStart));
}
const text = plaintext.slice(facet.index.byteStart, facet.index.byteEnd);
const feature = facet.features?.[0];
if (!feature) {
parts.push(text);
return;
}
if (feature.$type === "pub.leaflet.richtext.facet#bold") {
parts.push({ text, type: feature.$type });
} else if (feature.$type === "pub.leaflet.richtext.facet#highlight") {
parts.push({ text, type: feature.$type });
} else if (feature.$type === "pub.leaflet.richtext.facet#italic") {
parts.push({ text, type: feature.$type });
} else if (feature.$type === "pub.leaflet.richtext.facet#strikethrough") {
parts.push({ text, type: feature.$type });
} else if (feature.$type === "pub.leaflet.richtext.facet#underline") {
parts.push({ text, type: feature.$type });
} else {
parts.push({ text, type: feature.$type });
}
lastIndex = facet.index.byteEnd;
});
if (lastIndex < plaintext.length) {
parts.push(plaintext.slice(lastIndex));
}
return (
<>
{parts.map((part, i) => {
if (typeof part === "string") {
return part;
}
switch (part.type) {
case "pub.leaflet.richtext.facet#bold":
return {part.text};
case "pub.leaflet.richtext.facet#highlight":
return (
{part.text}
);
case "pub.leaflet.richtext.facet#italic":
return {part.text};
case "pub.leaflet.richtext.facet#strikethrough":
return {part.text};
case "pub.leaflet.richtext.facet#underline":
return {part.text};
default:
return part.text;
}
})}
>
);
}