diff --git a/packages/content/src/parser.ts b/packages/content/src/parser.ts index 5091c64..e335b02 100644 --- a/packages/content/src/parser.ts +++ b/packages/content/src/parser.ts @@ -41,6 +41,7 @@ export enum ParsedType { Cashu = "cashu", Code = "code", Ellipsis = "ellipsis", + Email = "email", Emoji = "emoji", Event = "event", Invoice = "invoice", @@ -71,6 +72,11 @@ export type ParsedEllipsis = ParsedBase & { value: string } +export type ParsedEmail = ParsedBase & { + type: ParsedType.Email + value: string +} + export type ParsedEmojiValue = { name: string url?: string @@ -140,6 +146,7 @@ export type Parsed = | ParsedCashu | ParsedCode | ParsedEllipsis + | ParsedEmail | ParsedEmoji | ParsedEvent | 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 isEllipsis = (parsed: Parsed): parsed is ParsedEllipsis => 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 isEvent = (parsed: Parsed): parsed is ParsedEvent => parsed.type === ParsedType.Event 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 => { const [raw, _, value] = text.match(/^(lightning:)(ln(bc|url)[0-9a-z]{10,})/i) || [] @@ -368,6 +385,7 @@ export const parsers = [ parseEvent, parseCashu, parseInvoice, + parseEmail, parseLink, ] diff --git a/packages/content/src/render.ts b/packages/content/src/render.ts index 6eb74c2..312af9d 100644 --- a/packages/content/src/render.ts +++ b/packages/content/src/render.ts @@ -10,6 +10,7 @@ import { ParsedInvoice, ParsedEvent, ParsedEmoji, + ParsedEmail, ParsedEllipsis, ParsedCode, 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 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 renderInvoice = (p: ParsedInvoice, r: Renderer) => @@ -130,6 +133,9 @@ export const renderOne = (parsed: Parsed, renderer: Renderer) => { case ParsedType.Ellipsis: renderEllipsis(parsed as ParsedEllipsis, renderer) break + case ParsedType.Email: + renderEmail(parsed as ParsedEmail, renderer) + break case ParsedType.Emoji: renderEmoji(parsed as ParsedEmoji, renderer) break