{"version":3,"sources":["../src/renderers/html/common/resolved-attrs.ts","../src/renderers/html/base-html-renderer.ts"],"names":["BaseRenderer"],"mappings":"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","file":"chunk-WHNF35FN.cjs","sourcesContent":["/**\n * HTML-specific collected attributes.\n *\n * Used by both the inline attributor system (marks that contribute\n * styles/classes to the parent element) and block attribute resolvers\n * (centralized block attribute computation) in HTML renderers.\n */\nexport interface ResolvedAttrs {\n  /** CSS style properties, e.g. `{ color: 'red', 'background-color': '#ff0' }` */\n  style?: Record<string, string>;\n  /** CSS class names to add */\n  classes?: string[];\n  /** Arbitrary HTML attributes, e.g. `{ id: 'my-block', 'data-custom': '1' }` */\n  attrs?: Record<string, string>;\n}\n\n/**\n * An empty `ResolvedAttrs` constant — avoids allocating a new object\n * every time a resolver has nothing to contribute.\n */\nexport const EMPTY_RESOLVED_ATTRS: ResolvedAttrs = Object.freeze({});\n\n/**\n * Merge two `ResolvedAttrs` objects. Styles and attrs are shallow-merged\n * (source overwrites target on key conflict). Classes are concatenated.\n *\n * Returns a new object — inputs are not mutated.\n */\nexport function mergeResolvedAttrs(target: ResolvedAttrs, source: ResolvedAttrs): ResolvedAttrs {\n  const style = target.style || source.style ? { ...target.style, ...source.style } : undefined;\n\n  const classes =\n    target.classes || source.classes\n      ? [...(target.classes ?? []), ...(source.classes ?? [])]\n      : undefined;\n\n  const attrs = target.attrs || source.attrs ? { ...target.attrs, ...source.attrs } : undefined;\n\n  return { style, classes, attrs };\n}\n\n/**\n * Check whether a `ResolvedAttrs` object has any content.\n */\nexport function hasResolvedAttrs(resolved: ResolvedAttrs): boolean {\n  if (resolved.style && Object.keys(resolved.style).length > 0) return true;\n  if (resolved.classes && resolved.classes.length > 0) return true;\n  if (resolved.attrs && Object.keys(resolved.attrs).length > 0) return true;\n  return false;\n}\n","import type { BlockDescriptor, TNode } from '../../core/ast-types';\nimport { BaseRenderer } from '../../core/base-renderer';\nimport type { ResolvedAttrs } from './common/resolved-attrs';\nimport {\n  EMPTY_RESOLVED_ATTRS,\n  hasResolvedAttrs,\n  mergeResolvedAttrs,\n} from './common/resolved-attrs';\n\n/** Lookup table for HTML character escaping. */\nconst HTML_ESCAPE_MAP: Record<string, string> = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;',\n};\n\n/**\n * Escape HTML special characters to prevent XSS.\n * Uses a single-pass regex replacement for performance.\n */\nexport function escapeHtml(str: string): string {\n  return str.replace(/[&<>\"']/g, (ch) => HTML_ESCAPE_MAP[ch]!);\n}\n\n/**\n * Serialize a {@link ResolvedAttrs} object into an HTML attribute string.\n *\n * Returns a leading space if non-empty, or an empty string.\n *\n * @example\n * ```ts\n * serializeResolvedAttrs({ style: { color: 'red' }, classes: ['bold'] })\n * // ' class=\"bold\" style=\"color:red\"'\n * ```\n */\nexport function serializeResolvedAttrs(resolved: ResolvedAttrs | undefined): string {\n  if (!resolved || !hasResolvedAttrs(resolved)) return '';\n\n  const parts: string[] = [];\n\n  if (resolved.classes && resolved.classes.length > 0) {\n    parts.push(`class=\"${resolved.classes.map(escapeHtml).join(' ')}\"`);\n  }\n\n  if (resolved.style && Object.keys(resolved.style).length > 0) {\n    const styleStr = Object.entries(resolved.style)\n      .map(([k, v]) => `${escapeHtml(k)}:${escapeHtml(v)}`)\n      .join(';');\n    parts.push(`style=\"${styleStr}\"`);\n  }\n\n  if (resolved.attrs) {\n    for (const [key, value] of Object.entries(resolved.attrs)) {\n      if (value !== '') {\n        parts.push(`${escapeHtml(key)}=\"${escapeHtml(value)}\"`);\n      }\n    }\n  }\n\n  return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\n/**\n * Shared base for all HTML string renderers.\n *\n * Handles HTML-specific concerns:\n * - Text escaping\n * - String concatenation of children\n * - Serialization of {@link ResolvedAttrs} to HTML attribute strings\n * - Rendering of declarative block/mark descriptors\n *\n * Subclasses provide their own `RendererConfig<string, ResolvedAttrs>` to control\n * how blocks and marks are rendered.\n */\nexport abstract class BaseHtmlRenderer extends BaseRenderer<string, ResolvedAttrs> {\n  // ─── Attrs operations (HTML-specific) ──────────────────────────────────\n\n  protected emptyAttrs(): ResolvedAttrs {\n    return EMPTY_RESOLVED_ATTRS;\n  }\n\n  protected mergeAttrs(target: ResolvedAttrs, source: ResolvedAttrs): ResolvedAttrs {\n    return mergeResolvedAttrs(target, source);\n  }\n\n  protected hasAttrs(attrs: ResolvedAttrs): boolean {\n    return hasResolvedAttrs(attrs);\n  }\n\n  // ─── Output operations ────────────────────────────────────────────────\n\n  protected joinChildren(children: string[]): string {\n    return children.join('');\n  }\n\n  protected renderText(text: string): string {\n    return escapeHtml(text);\n  }\n\n  /**\n   * Wrap content in a `<span>` with the given collected attributor attrs.\n   * Used when a text node has attributor marks but no element marks.\n   */\n  protected wrapWithAttrs(content: string, attrs: ResolvedAttrs): string {\n    const attrStr = serializeResolvedAttrs(attrs);\n    return `<span${attrStr}>${content}</span>`;\n  }\n\n  /**\n   * Render a simple tag mark: `<tag [collected-attrs]>content</tag>`.\n   */\n  protected renderSimpleTag(tag: string, content: string, collectedAttrs?: ResolvedAttrs): string {\n    const attrStr = serializeResolvedAttrs(collectedAttrs);\n    return `<${tag}${attrStr}>${content}</${tag}>`;\n  }\n\n  /**\n   * Render a declarative block descriptor:\n   * `<tag [resolvedAttrs]>{children || '<br/>'}</tag>`.\n   */\n  protected renderBlockFromDescriptor(\n    descriptor: BlockDescriptor,\n    node: TNode,\n    childrenOutput: string,\n    resolvedAttrs: ResolvedAttrs,\n  ): string {\n    const tag = typeof descriptor.tag === 'function' ? descriptor.tag(node) : descriptor.tag;\n\n    const attrStr = serializeResolvedAttrs(resolvedAttrs);\n\n    if (descriptor.selfClosing) {\n      return `<${tag}${attrStr}>`;\n    }\n\n    const content = childrenOutput || '<br/>';\n    return `<${tag}${attrStr}>${content}</${tag}>`;\n  }\n}\n"]}