Merge pull request #18 from ticruz38/feat/link-grid
Add linkGrid type and the reduceLinks function
This commit is contained in:
@@ -33,4 +33,4 @@
|
|||||||
"@welshman/lib": "~0.0.37",
|
"@welshman/lib": "~0.0.37",
|
||||||
"nostr-tools": "^2.7.2"
|
"nostr-tools": "^2.7.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user