Merge pull request #18 from ticruz38/feat/link-grid

Add linkGrid type and the reduceLinks function
This commit is contained in:
hodlbod
2025-01-29 08:54:29 -08:00
committed by GitHub
2 changed files with 51 additions and 1 deletions
+1 -1
View File
@@ -33,4 +33,4 @@
"@welshman/lib": "~0.0.37", "@welshman/lib": "~0.0.37",
"nostr-tools": "^2.7.2" "nostr-tools": "^2.7.2"
} }
} }
+50
View File
@@ -45,6 +45,7 @@ export enum ParsedType {
Event = "event", Event = "event",
Invoice = "invoice", Invoice = "invoice",
Link = "link", Link = "link",
LinkGrid = "link-grid",
Newline = "newline", Newline = "newline",
Profile = "profile", Profile = "profile",
Text = "text", Text = "text",
@@ -81,12 +82,22 @@ export type ParsedLinkValue = {
isMedia: boolean isMedia: boolean
} }
export type ParsedLinkGridValue = {
links: ParsedLinkValue[]
}
export type ParsedLink = { export type ParsedLink = {
type: ParsedType.Link type: ParsedType.Link
value: ParsedLinkValue value: ParsedLinkValue
raw: string raw: string
} }
export type ParsedLinkGrid = {
type: ParsedType.LinkGrid
value: ParsedLinkGridValue
raw: string
}
export type ParsedNewline = { export type ParsedNewline = {
type: ParsedType.Newline type: ParsedType.Newline
value: string value: string
@@ -131,6 +142,7 @@ export type Parsed =
| ParsedEvent | ParsedEvent
| ParsedInvoice | ParsedInvoice
| ParsedLink | ParsedLink
| ParsedLinkGrid
| ParsedNewline | ParsedNewline
| ParsedProfile | ParsedProfile
| ParsedText | ParsedText
@@ -148,6 +160,10 @@ export const isEvent = (parsed: Parsed): parsed is ParsedEvent => parsed.type ==
export const isInvoice = (parsed: Parsed): parsed is ParsedInvoice => export const isInvoice = (parsed: Parsed): parsed is ParsedInvoice =>
parsed.type === ParsedType.Invoice parsed.type === ParsedType.Invoice
export const isLink = (parsed: Parsed): parsed is ParsedLink => parsed.type === ParsedType.Link export const isLink = (parsed: Parsed): parsed is ParsedLink => parsed.type === ParsedType.Link
export const isImage = (parsed: Parsed): parsed is ParsedLink =>
isLink(parsed) && Boolean(parsed.value.url.toString().match(/\.(jpe?g|png|gif|webp)$/))
export const isLinkGrid = (parsed: Parsed): parsed is ParsedLinkGrid =>
parsed.type === ParsedType.LinkGrid
export const isNewline = (parsed: Parsed): parsed is ParsedNewline => export const isNewline = (parsed: Parsed): parsed is ParsedNewline =>
parsed.type === ParsedType.Newline parsed.type === ParsedType.Newline
export const isProfile = (parsed: Parsed): parsed is ParsedProfile => export const isProfile = (parsed: Parsed): parsed is ParsedProfile =>
@@ -383,6 +399,7 @@ export const truncate = (
const sizes = content.map((parsed: Parsed) => { const sizes = content.map((parsed: Parsed) => {
switch (parsed.type) { switch (parsed.type) {
case ParsedType.Link: case ParsedType.Link:
case ParsedType.LinkGrid:
case ParsedType.Cashu: case ParsedType.Cashu:
case ParsedType.Invoice: case ParsedType.Invoice:
return mediaLength return mediaLength
@@ -419,6 +436,39 @@ export const truncate = (
return content return content
} }
export const reduceLinks = (content: Parsed[]) => {
let images: URL[] = []
let newLine: ParsedNewline | null = null
let emptyText: ParsedText | null = null
const parsedContent = []
for (const parsed of content) {
if (isImage(parsed)) {
images.push((parsed.value as ParsedLinkValue).url)
} else if (images.length && isNewline(parsed)) {
newLine = parsed
} else if (images.length && isText(parsed) && !parsed.value.trim()) {
emptyText = parsed
} else if (images.length) {
parsedContent.push({type: ParsedType.LinkGrid, value: {links: [...images]}})
if (newLine) {
parsedContent.push(newLine)
newLine = null
} else if (emptyText) {
parsedContent.push(emptyText)
emptyText = null
}
images = []
} else {
parsedContent.push(parsed)
}
}
if (images.length) {
parsedContent.push({type: ParsedType.LinkGrid, value: {links: [...images]}})
}
return parsedContent
}
// Renderer // Renderer
export class Renderer { export class Renderer {