refactor: share tlon inline text rendering

This commit is contained in:
Peter Steinberger 2026-03-13 16:32:26 +00:00
parent 966653e174
commit ef8cc3d0fb
1 changed files with 55 additions and 76 deletions

View File

@ -162,41 +162,55 @@ export function isGroupInviteAllowed(
}
// Helper to recursively extract text from inline content
function renderInlineItem(
item: any,
options?: {
linkMode?: "content-or-href" | "href";
allowBreak?: boolean;
allowBlockquote?: boolean;
},
): string {
if (typeof item === "string") {
return item;
}
if (!item || typeof item !== "object") {
return "";
}
if (item.ship) {
return item.ship;
}
if ("sect" in item) {
return `@${item.sect || "all"}`;
}
if (options?.allowBreak && item.break !== undefined) {
return "\n";
}
if (item["inline-code"]) {
return `\`${item["inline-code"]}\``;
}
if (item.code) {
return `\`${item.code}\``;
}
if (item.link && item.link.href) {
return options?.linkMode === "href" ? item.link.href : item.link.content || item.link.href;
}
if (item.bold && Array.isArray(item.bold)) {
return `**${extractInlineText(item.bold)}**`;
}
if (item.italics && Array.isArray(item.italics)) {
return `*${extractInlineText(item.italics)}*`;
}
if (item.strike && Array.isArray(item.strike)) {
return `~~${extractInlineText(item.strike)}~~`;
}
if (options?.allowBlockquote && item.blockquote && Array.isArray(item.blockquote)) {
return `> ${extractInlineText(item.blockquote)}`;
}
return "";
}
function extractInlineText(items: any[]): string {
return items
.map((item: any) => {
if (typeof item === "string") {
return item;
}
if (item && typeof item === "object") {
if (item.ship) {
return item.ship;
}
if ("sect" in item) {
return `@${item.sect || "all"}`;
}
if (item["inline-code"]) {
return `\`${item["inline-code"]}\``;
}
if (item.code) {
return `\`${item.code}\``;
}
if (item.link && item.link.href) {
return item.link.content || item.link.href;
}
if (item.bold && Array.isArray(item.bold)) {
return `**${extractInlineText(item.bold)}**`;
}
if (item.italics && Array.isArray(item.italics)) {
return `*${extractInlineText(item.italics)}*`;
}
if (item.strike && Array.isArray(item.strike)) {
return `~~${extractInlineText(item.strike)}~~`;
}
}
return "";
})
.join("");
return items.map((item: any) => renderInlineItem(item)).join("");
}
export function extractMessageText(content: unknown): string {
@ -209,48 +223,13 @@ export function extractMessageText(content: unknown): string {
// Handle inline content (text, ships, links, etc.)
if (verse.inline && Array.isArray(verse.inline)) {
return verse.inline
.map((item: any) => {
if (typeof item === "string") {
return item;
}
if (item && typeof item === "object") {
if (item.ship) {
return item.ship;
}
// Handle sect (role mentions like @all)
if ("sect" in item) {
return `@${item.sect || "all"}`;
}
if (item.break !== undefined) {
return "\n";
}
if (item.link && item.link.href) {
return item.link.href;
}
// Handle inline code (Tlon uses "inline-code" key)
if (item["inline-code"]) {
return `\`${item["inline-code"]}\``;
}
if (item.code) {
return `\`${item.code}\``;
}
// Handle bold/italic/strike - recursively extract text
if (item.bold && Array.isArray(item.bold)) {
return `**${extractInlineText(item.bold)}**`;
}
if (item.italics && Array.isArray(item.italics)) {
return `*${extractInlineText(item.italics)}*`;
}
if (item.strike && Array.isArray(item.strike)) {
return `~~${extractInlineText(item.strike)}~~`;
}
// Handle blockquote inline
if (item.blockquote && Array.isArray(item.blockquote)) {
return `> ${extractInlineText(item.blockquote)}`;
}
}
return "";
})
.map((item: any) =>
renderInlineItem(item, {
linkMode: "href",
allowBreak: true,
allowBlockquote: true,
}),
)
.join("");
}