{"version":3,"file":"component-o8uZ9l7y.cjs","sources":["../src/renderer/types.ts","../src/extensions/component.ts"],"sourcesContent":["export const builtinTokenNames = [\n  'blockquote',\n  'heading',\n  'list',\n  'list_item',\n  'br',\n  'code',\n  'codespan',\n  'table',\n  'html',\n  'paragraph',\n  'link',\n  'text',\n  'def',\n  'del',\n  'em',\n  'hr',\n  'strong',\n  'image',\n  'space',\n] as const;\n\nexport type BuiltinTokenName = typeof builtinTokenNames[number];\n\n// Includes custom component token emitted by the extension\nexport type ComponentTokenName = BuiltinTokenName | 'component';\n\n\n","import type { TokenizerAndRendererExtension } from 'marked';\nimport { Lexer, Marked } from 'marked';\n\nconst TAG = '[A-Z][A-Za-z0-9:_-]*';\nconst SELF = new RegExp(`^<(${TAG})\\\\s*([^>]*)\\/>`);\nconst OPEN = new RegExp(`^<(${TAG})\\\\s*([^>]*)>`);\n\nfunction parseProps(attrs: string): Record<string, unknown> {\n  const props: Record<string, unknown> = {};\n  if (!attrs) return props;\n  const re = /([a-zA-Z_][\\w:-]*)=(?:\"([^\"]*)\"|\\{([\\s\\S]*?)\\})|\\b([a-zA-Z_][\\w:-]*)\\b/g;\n  let m: RegExpExecArray | null;\n  while ((m = re.exec(attrs))) {\n    const key = (m[1] || m[4]) as string;\n    if (!key) continue;\n    if (m[2] !== undefined) {\n      props[key] = m[2];\n    } else if (m[3] !== undefined) {\n      try {\n        props[key] = JSON.parse(m[3]);\n      } catch {\n        props[key] = m[3];\n      }\n    } else if (m[4] !== undefined) {\n      props[key] = true;\n    }\n  }\n  return props;\n}\n\nfunction findMatchingClose(src: string, name: string, startIndex: number): number {\n  const openTag = new RegExp(`<${name}(?:\\s[^>]*)?>`, 'g');\n  // Handle both regular closing tags and HTML-encoded closing tags\n  const closeTag = new RegExp(`(?:</${name}>|&lt;/${name}&gt;)`, 'g');\n  openTag.lastIndex = startIndex;\n  closeTag.lastIndex = startIndex;\n\n  let depth = 1;\n  while (true) {\n    const nextOpen = openTag.exec(src);\n    const nextClose = closeTag.exec(src);\n    if (!nextClose) return -1;\n    if (nextOpen && nextOpen.index < nextClose.index) {\n      depth++;\n      continue;\n    }\n    depth--;\n    if (depth === 0) {\n      return nextClose.index + nextClose[0].length;\n    }\n  }\n}\n\n// Create a function that returns the extension with access to the Marked instance\nexport function createComponentExtension(markedInstance?: Marked): TokenizerAndRendererExtension {\n  return {\n    name: 'component',\n    level: 'block',\n    start(src: string) {\n      // Process components that are at the start of a line or indented (block-level)\n      const i = src.search(/^\\s*<[A-Z]/m);\n      return i < 0 ? undefined : i;\n    },\n    tokenizer(src: string) {\n      let m = SELF.exec(src);\n      if (m) {\n        const raw = m[0];\n        const name = m[1] as string;\n        const attrs = m[2] ?? '';\n        return { type: 'component', raw, name, props: parseProps(attrs) } as any;\n      }\n\n      m = OPEN.exec(src);\n      if (m) {\n        const openRaw = m[0];\n        const name = m[1] as string;\n        const attrs = m[2] ?? '';\n        const innerStart = openRaw.length;\n        const endIndex = findMatchingClose(src, name, innerStart);\n        if (endIndex > -1) {\n          // For block-level components, we need to consume the entire line including trailing newlines\n          // Find the end of the line after the component\n          let lineEnd = endIndex;\n          while (lineEnd < src.length && src[lineEnd] !== '\\n') {\n            lineEnd++;\n          }\n          // Include the newline if it exists\n          if (lineEnd < src.length && src[lineEnd] === '\\n') {\n            lineEnd++;\n          }\n          const raw = src.slice(0, lineEnd);\n          \n          const inner = src.slice(innerStart, endIndex - (`</${name}>`.length));\n          \n          // Parse nested content safely - use simple markdown parsing to avoid parser state corruption\n          let children: any[];\n          if (inner.trim()) {\n            try {\n              // Use a simple approach: create a new Marked instance with basic extensions only\n              const { Marked } = require('marked');\n              const nestedMarked = new Marked();\n              \n              // Only use basic markdown extensions, no custom component extensions\n              // This prevents recursion and parser state corruption\n              const nestedTokens = nestedMarked.lexer(inner);\n              \n              // Flatten nested tokens into children array\n              children = nestedTokens.flatMap((token: any) => {\n                if (token.type === 'paragraph' && token.tokens) {\n                  return token.tokens;\n                }\n                return [token];\n              });\n            } catch (error) {\n              // Fallback to simple text token if parsing fails\n              children = [{ type: 'text', raw: inner, text: inner.trim() }];\n            }\n          } else {\n            children = [];\n          }\n          const token = { type: 'component', raw, name, props: parseProps(attrs), children } as any;\n          return token;\n        } else {\n          // No matching close tag found - treat as self-closing component\n          const raw = openRaw;\n          return { type: 'component', raw, name, props: parseProps(attrs) } as any;\n        }\n      }\n    },\n  };\n}\n\n// Create an inline component extension for components within inline text\nexport function createInlineComponentExtension(markedInstance?: Marked): TokenizerAndRendererExtension {\n  return {\n    name: 'inline-component',\n    level: 'inline',\n    start(src: string) {\n      const i = src.search(/<[A-Z]/);\n      return i < 0 ? undefined : i;\n    },\n    tokenizer(src: string) {\n      let m = SELF.exec(src);\n      if (m) {\n        const raw = m[0];\n        const name = m[1] as string;\n        const attrs = m[2] ?? '';\n        return { type: 'component', raw, name, props: parseProps(attrs) } as any;\n      }\n\n      m = OPEN.exec(src);\n      if (m) {\n        const openRaw = m[0];\n        const name = m[1] as string;\n        const attrs = m[2] ?? '';\n        const innerStart = openRaw.length;\n        const endIndex = findMatchingClose(src, name, innerStart);\n        if (endIndex > -1) {\n          // For inline components, only consume up to the closing tag\n          const raw = src.slice(0, endIndex + (`</${name}>`.length));\n          \n          const inner = src.slice(innerStart, endIndex - (`</${name}>`.length));\n          \n          // Parse nested content safely - use simple markdown parsing to avoid parser state corruption\n          let children: any[];\n          if (inner.trim()) {\n            try {\n              // Use a simple approach: create a new Marked instance with basic extensions only\n              const { Marked } = require('marked');\n              const nestedMarked = new Marked();\n              \n              // Only use basic markdown extensions, no custom component extensions\n              // This prevents recursion and parser state corruption\n              const nestedTokens = nestedMarked.lexer(inner);\n              \n              // Flatten nested tokens into children array\n              children = nestedTokens.flatMap((token: any) => {\n                if (token.type === 'paragraph' && token.tokens) {\n                  return token.tokens;\n                }\n                return [token];\n              });\n            } catch (error) {\n              // Fallback to simple text token if parsing fails\n              children = [{ type: 'text', raw: inner, text: inner.trim() }];\n            }\n          } else {\n            children = [];\n          }\n          const token = { type: 'component', raw, name, props: parseProps(attrs), children } as any;\n          return token;\n        } else {\n          // No matching close tag found - treat as self-closing component\n          const raw = openRaw;\n          return { type: 'component', raw, name, props: parseProps(attrs) } as any;\n        }\n      }\n    },\n  };\n}\n\n// Default export for backward compatibility\nexport const componentExtension = createComponentExtension();\n"],"names":["Marked","token"],"mappings":"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"}