Skip to content

Content Parser

The content parser system in @welshman/content provides utilities for parsing Nostr content into structured elements.

Core Types

ParsedType Enum

Defines all supported content types:

  • Address - naddr references to parameterized replaceable events
  • Cashu - Cashu token strings
  • Code - Code blocks and inline code
  • Ellipsis - Truncation indicators
  • Emoji - Custom emoji references
  • Event - Event references (note/nevent)
  • Invoice - Lightning invoices
  • Link - HTTP/HTTPS URLs
  • LinkGrid - Collections of adjacent links
  • Newline - Line breaks
  • Profile - Profile references (npub/nprofile)
  • Text - Plain text content
  • Topic - Hashtags

Main Functions

parse(options)

Main parsing function that processes content into structured elements:

typescript
parse({content?: string, tags?: string[][]}) => Parsed[]

Takes content string and optional tags array, returns array of parsed elements. Uses tags for emoji lookup and imeta information.

truncate(content, options)

Truncates parsed content to specified length limits:

typescript
truncate(content: Parsed[], {
  minLength?: number,     // 500 - minimum before truncating
  maxLength?: number,     // 700 - maximum total length
  mediaLength?: number,   // 200 - assumed size for media
  entityLength?: number   // 30 - assumed size for entities
}) => Parsed[]

Combines adjacent links into LinkGrid elements for better presentation:

typescript
reduceLinks(content: Parsed[]) => Parsed[]

Type Guards

Utility functions to check parsed element types:

  • isAddress(parsed), isCashu(parsed), isCode(parsed), etc.
  • isImage(parsed) - special check for image links

Utilities

  • urlIsMedia(url) - Checks if URL points to media file
  • fromNostrURI(s) - Removes nostr: protocol prefix

Example Usage

typescript
import { parse, truncate, reduceLinks } from '@welshman/content'

const content = `Check out this cool #nostr client!
https://github.com/coracle-social/welshman
https://welshman.coracle.social
Visit npub1jlrs53pkdfjnts29kveljul2sm0actt6n8dxrrzqcersttvcuv3qdjynqn for more info`

// Parse the content into structured elements
const parsed = parse({ content })

// Combine adjacent links into grids
const withLinkGrids = reduceLinks(parsed)

// Truncate to reasonable length for preview
const truncated = truncate(withLinkGrids, {
  minLength: 100,
  maxLength: 200
})

// Result contains structured elements:
// - Text: "Check out this cool "
// - Topic: "nostr"
// - Text: " client!\n"
// - LinkGrid: [github.com/..., welshman.coracle.social]
// - Text: "Visit "
// - Profile: npub1jlrs53pkdfjnts29kveljul2sm0actt6n8dxrrzqcersttvcuv3qdjynqn
// - Text: " for more info"