OverviewFilesCommitsIssuesDocsReleasesPeers

wirecore / pear-app / lib / yaml-helper.js

75 lines · javascript ref:
/**
 * YAML Helper for ANProto-compatible messages
 * 
 * Format:
 * name: author
 * image: hash
 * previous: hash
 * ---
 * Message content
 */

export class YAMLHelper {
  /**
   * Create YAML document from metadata and content
   */
  static create(metadata, content) {
    const lines = []

    // Start with opening delimiter (standard YAML frontmatter)
    lines.push('---')

    if (metadata.name) {
      lines.push(`name: ${metadata.name}`)
    }

    if (metadata.image) {
      lines.push(`image: ${metadata.image}`)
    }

    if (metadata.previous) {
      lines.push(`previous: ${metadata.previous}`)
    }

    // Add closing delimiter and content
    lines.push('---')
    lines.push(content)

    return lines.join('\n')
  }
  
  /**
   * Parse YAML document into metadata and content
   */
  static parse(yaml) {
    const parts = yaml.split('\n---\n')

    if (parts.length === 1) {
      // No metadata, just content
      return {
        metadata: {},
        content: yaml
      }
    }

    const [frontMatter, ...contentParts] = parts
    const content = contentParts.join('\n---\n')

    const metadata = {}
    const lines = frontMatter.split('\n')

    for (const line of lines) {
      // Skip the opening --- delimiter
      if (line.trim() === '---') continue

      const match = line.match(/^(\w+):\s*(.+)$/)
      if (match) {
        const [, key, value] = match
        metadata[key] = value
      }
    }

    return { metadata, content }
  }
}