Add email to content parser

This commit is contained in:
Jon Staab
2026-05-06 13:15:08 -07:00
parent c6847fa7c9
commit 8ccd499955
2 changed files with 24 additions and 0 deletions
+18
View File
@@ -41,6 +41,7 @@ export enum ParsedType {
Cashu = "cashu", Cashu = "cashu",
Code = "code", Code = "code",
Ellipsis = "ellipsis", Ellipsis = "ellipsis",
Email = "email",
Emoji = "emoji", Emoji = "emoji",
Event = "event", Event = "event",
Invoice = "invoice", Invoice = "invoice",
@@ -71,6 +72,11 @@ export type ParsedEllipsis = ParsedBase & {
value: string value: string
} }
export type ParsedEmail = ParsedBase & {
type: ParsedType.Email
value: string
}
export type ParsedEmojiValue = { export type ParsedEmojiValue = {
name: string name: string
url?: string url?: string
@@ -140,6 +146,7 @@ export type Parsed =
| ParsedCashu | ParsedCashu
| ParsedCode | ParsedCode
| ParsedEllipsis | ParsedEllipsis
| ParsedEmail
| ParsedEmoji | ParsedEmoji
| ParsedEvent | ParsedEvent
| ParsedInvoice | ParsedInvoice
@@ -158,6 +165,7 @@ export const isCashu = (parsed: Parsed): parsed is ParsedCashu => parsed.type ==
export const isCode = (parsed: Parsed): parsed is ParsedCode => parsed.type === ParsedType.Code export const isCode = (parsed: Parsed): parsed is ParsedCode => parsed.type === ParsedType.Code
export const isEllipsis = (parsed: Parsed): parsed is ParsedEllipsis => export const isEllipsis = (parsed: Parsed): parsed is ParsedEllipsis =>
parsed.type === ParsedType.Ellipsis parsed.type === ParsedType.Ellipsis
export const isEmail = (parsed: Parsed): parsed is ParsedEmail => parsed.type === ParsedType.Email
export const isEmoji = (parsed: Parsed): parsed is ParsedEmoji => parsed.type === ParsedType.Emoji export const isEmoji = (parsed: Parsed): parsed is ParsedEmoji => parsed.type === ParsedType.Emoji
export const isEvent = (parsed: Parsed): parsed is ParsedEvent => parsed.type === ParsedType.Event export const isEvent = (parsed: Parsed): parsed is ParsedEvent => parsed.type === ParsedType.Event
export const isInvoice = (parsed: Parsed): parsed is ParsedInvoice => export const isInvoice = (parsed: Parsed): parsed is ParsedInvoice =>
@@ -239,6 +247,15 @@ export const parseEvent = (text: string, context: ParseContext): ParsedEvent | v
} }
} }
export const parseEmail = (text: string, context: ParseContext): ParsedEmail | void => {
const [raw, _, value] =
text.match(/^(mailto:)?([a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,})\b/i) || []
if (raw && value) {
return {type: ParsedType.Email, value, raw}
}
}
export const parseInvoice = (text: string, context: ParseContext): ParsedInvoice | void => { export const parseInvoice = (text: string, context: ParseContext): ParsedInvoice | void => {
const [raw, _, value] = text.match(/^(lightning:)(ln(bc|url)[0-9a-z]{10,})/i) || [] const [raw, _, value] = text.match(/^(lightning:)(ln(bc|url)[0-9a-z]{10,})/i) || []
@@ -368,6 +385,7 @@ export const parsers = [
parseEvent, parseEvent,
parseCashu, parseCashu,
parseInvoice, parseInvoice,
parseEmail,
parseLink, parseLink,
] ]
+6
View File
@@ -10,6 +10,7 @@ import {
ParsedInvoice, ParsedInvoice,
ParsedEvent, ParsedEvent,
ParsedEmoji, ParsedEmoji,
ParsedEmail,
ParsedEllipsis, ParsedEllipsis,
ParsedCode, ParsedCode,
ParsedCashu, ParsedCashu,
@@ -93,6 +94,8 @@ export const renderCode = (p: ParsedCode, r: Renderer) => r.addText(p.value)
export const renderEllipsis = (p: ParsedEllipsis, r: Renderer) => r.addText("…") export const renderEllipsis = (p: ParsedEllipsis, r: Renderer) => r.addText("…")
export const renderEmail = (p: ParsedEmail, r: Renderer) => r.addLink("mailto:" + p.value, p.value)
export const renderEmoji = (p: ParsedEmoji, r: Renderer) => r.addText(p.raw) export const renderEmoji = (p: ParsedEmoji, r: Renderer) => r.addText(p.raw)
export const renderInvoice = (p: ParsedInvoice, r: Renderer) => export const renderInvoice = (p: ParsedInvoice, r: Renderer) =>
@@ -130,6 +133,9 @@ export const renderOne = (parsed: Parsed, renderer: Renderer) => {
case ParsedType.Ellipsis: case ParsedType.Ellipsis:
renderEllipsis(parsed as ParsedEllipsis, renderer) renderEllipsis(parsed as ParsedEllipsis, renderer)
break break
case ParsedType.Email:
renderEmail(parsed as ParsedEmail, renderer)
break
case ParsedType.Emoji: case ParsedType.Emoji:
renderEmoji(parsed as ParsedEmoji, renderer) renderEmoji(parsed as ParsedEmoji, renderer)
break break