diff --git a/package.json b/package.json index 03cb12ae..062186d4 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "@vite-pwa/assets-generator": "^1.0.2", "@vite-pwa/sveltekit": "^1.1.0", "@welshman/app": "^0.10.3", - "@welshman/content": "^0.10.3", + "@welshman/content": "^0.10.5", "@welshman/domain": "^0.10.3", "@welshman/editor": "^0.10.3", "@welshman/feeds": "^0.10.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 934163e1..3ffd660e 100644 Binary files a/pnpm-lock.yaml and b/pnpm-lock.yaml differ diff --git a/src/app/render.ts b/src/app/render.ts index 5605f637..67ae30b1 100644 --- a/src/app/render.ts +++ b/src/app/render.ts @@ -1,54 +1,15 @@ -import {ParsedType, isImage, parse} from "@welshman/content" -import type {Parsed} from "@welshman/content" +import {ParsedType, parse, renderAsText, summarize} from "@welshman/content" +import type {Parsed, SummaryName} from "@welshman/content" import type {TrustedEvent} from "@welshman/util" import {profiles} from "@app/core" -// Welshman's text renderer resolves an entity or a link to the string it links to, so anything -// reading a message as text rather than rendering it as components gets a hundred characters of -// bech32 where a quote was. Everything that is not prose is named instead. -export const renderNode = (parsed: Parsed): string => { - switch (parsed.type) { - case ParsedType.Address: - return "another post" - case ParsedType.Cashu: - return "a cashu token" - case ParsedType.Code: - return parsed.value - case ParsedType.Command: - return parsed.raw - case ParsedType.Ellipsis: - return "…" - case ParsedType.Email: - return parsed.value - case ParsedType.Emoji: - return parsed.value.name - case ParsedType.Event: - return "another message" - case ParsedType.Invoice: - return "a lightning invoice" - case ParsedType.Link: { - const {host} = parsed.value.url +const summaryName: SummaryName = parsed => + parsed.type === ParsedType.Profile ? profiles.get().display(parsed.value.pubkey).get() : undefined - return isImage(parsed) ? "an image" : `a link to ${host}` - } - case ParsedType.LinkGrid: - return "some images" - case ParsedType.Newline: - return parsed.value - case ParsedType.Profile: - return profiles.get().display(parsed.value.pubkey).get() - case ParsedType.Room: - return parsed.value.room - case ParsedType.Text: - return parsed.value - case ParsedType.Topic: - return parsed.value - } -} +const renderSummary = (parsed: Parsed[]) => + renderAsText(summarize(parsed, summaryName)).toString().trim() -export const renderNodes = (parsed: Parsed[]) => parsed.map(renderNode).join("") - -export const renderEventAsText = (event: TrustedEvent) => renderNodes(parse(event)).trim() +export const renderEventAsText = (event: TrustedEvent) => renderSummary(parse(event)) const splitLines = (parsed: Parsed[]) => { const lines: Parsed[][] = [[]] @@ -71,7 +32,6 @@ const hasProse = (line: Parsed[]) => // nothing about the reply. The first line carrying words of its own is what the message is about. export const renderEventAsSummary = (event: TrustedEvent) => { const lines = splitLines(parse(event)) - const line = lines.find(hasProse) || lines[0] || [] - return renderNodes(line).trim() + return renderSummary(lines.find(hasProse) || lines[0] || []) }