@leadertechie/md2html 0.1.0-alpha.17 → 0.1.0-alpha.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -208,6 +208,22 @@ export declare class ImageHandler implements TokenHandler {
208
208
  };
209
209
  }
210
210
 
211
+ /**
212
+ * Handles standalone 'link' tokens (e.g., reference-style links, or links
213
+ * that appear outside paragraphs in certain edge cases).
214
+ */
215
+ export declare class LinkHandler implements TokenHandler {
216
+ readonly type = "link";
217
+ handle(token: Record<string, unknown>, ctx: ParseContext): {
218
+ type: "link";
219
+ content: string;
220
+ attributes: {
221
+ title?: string | undefined;
222
+ href: string;
223
+ };
224
+ };
225
+ }
226
+
211
227
  /**
212
228
  * Handles 'list' tokens (ordered and unordered).
213
229
  */
@@ -389,7 +405,7 @@ export declare interface NodeVisitor {
389
405
  }
390
406
 
391
407
  /**
392
- * Handles 'paragraph' tokens, including inline images and raw HTML.
408
+ * Handles 'paragraph' tokens, including inline images, links, and raw HTML.
393
409
  */
394
410
  export declare class ParagraphHandler implements TokenHandler {
395
411
  readonly type = "paragraph";
package/dist/index.js CHANGED
@@ -55,8 +55,9 @@ class ParagraphHandler {
55
55
  handle(token, ctx) {
56
56
  const tokens = token.tokens || [];
57
57
  const hasInlineImage = tokens.some((t) => t.type === "image");
58
+ const hasInlineLink = tokens.some((t) => t.type === "link");
58
59
  const hasInlineHTML = tokens.some((t) => t.type === "html");
59
- if (hasInlineImage || ctx.preserveRawHTML && hasInlineHTML) {
60
+ if (hasInlineImage || hasInlineLink || ctx.preserveRawHTML && hasInlineHTML) {
60
61
  const children = tokens.map((t) => {
61
62
  if (t.type === "image") {
62
63
  return {
@@ -65,6 +66,16 @@ class ParagraphHandler {
65
66
  alt: t.text || ""
66
67
  };
67
68
  }
69
+ if (t.type === "link") {
70
+ return {
71
+ type: "link",
72
+ content: ctx.processSlots(ctx.processInlineFormatting(t.text || "")),
73
+ attributes: {
74
+ href: t.href || "",
75
+ ...t.title ? { title: t.title } : {}
76
+ }
77
+ };
78
+ }
68
79
  if (t.type === "html" && ctx.preserveRawHTML) {
69
80
  const processed = ctx.processRawHTML(t.raw);
70
81
  if (processed.trim()) {
@@ -161,6 +172,24 @@ class HtmlHandler {
161
172
  return { type: "container", content: token.raw };
162
173
  }
163
174
  }
175
+ class LinkHandler {
176
+ constructor() {
177
+ this.type = "link";
178
+ }
179
+ handle(token, ctx) {
180
+ const text = token.text || "";
181
+ const href = token.href || "";
182
+ const title = token.title || "";
183
+ return {
184
+ type: "link",
185
+ content: ctx.processSlots(ctx.processInlineFormatting(text)),
186
+ attributes: {
187
+ href,
188
+ ...title ? { title } : {}
189
+ }
190
+ };
191
+ }
192
+ }
164
193
  class CatchAllHandler {
165
194
  constructor() {
166
195
  this.type = "*";
@@ -265,6 +294,7 @@ class TokenHandlerRegistry {
265
294
  this.register(new HtmlHandler());
266
295
  this.register(new FrontmatterHandler());
267
296
  this.register(new ContainerBlockHandler());
297
+ this.register(new LinkHandler());
268
298
  this.catchAll = new CatchAllHandler();
269
299
  }
270
300
  /** Register a handler. Overrides any existing handler for the same token type. */
@@ -1064,6 +1094,7 @@ export {
1064
1094
  HrHandler,
1065
1095
  HtmlHandler,
1066
1096
  ImageHandler,
1097
+ LinkHandler,
1067
1098
  ListHandler,
1068
1099
  MarkdownParser,
1069
1100
  MarkdownPipeline,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/types.ts","../src/handlers/heading-handler.ts","../src/handlers/paragraph-handler.ts","../src/handlers/list-handler.ts","../src/handlers/image-handler.ts","../src/handlers/code-handler.ts","../src/handlers/hr-handler.ts","../src/handlers/blockquote-handler.ts","../src/handlers/html-handler.ts","../src/handlers/catchall-handler.ts","../src/handlers/frontmatter-handler.ts","../src/handlers/container-block-handler.ts","../src/handlers/registry.ts","../src/parser.ts","../src/renderer-strategies.ts","../src/renderer.ts","../src/pipeline.ts","../src/visitor.ts","../src/factory.ts"],"sourcesContent":["export type ContentNodeType = \n | 'text' \n | 'heading' \n | 'paragraph' \n | 'list' \n | 'list-item' \n | 'image' \n | 'code' \n | 'container'\n | 'strong'\n | 'emphasis'\n | 'link';\n\nexport interface ContentNode {\n type: ContentNodeType;\n content?: string;\n children?: ContentNode[];\n attributes?: Record<string, unknown>;\n className?: string;\n src?: string;\n alt?: string;\n ordered?: boolean;\n /** Raw HTML content for passthrough mode */\n rawHTML?: string;\n /** Scope anchor value for data-md-scope */\n scope?: string;\n}\n\nexport interface MarkdownContent {\n title: string;\n metadata?: Record<string, unknown>;\n content: ContentNode[];\n}\n\nexport interface ParseOptions {\n gfm?: boolean;\n breaks?: boolean;\n pedantic?: boolean;\n}\n\nexport interface StyleConfig {\n classPrefix?: string;\n customCSS?: string;\n addHeadingIds?: boolean;\n}\n\n/**\n * v2: Extended StyleConfig with scope anchor support.\n */\nexport interface StyleConfigV2 extends StyleConfig {\n /** Emit data-md-scope attributes for CSS @scope anchoring (default: false) */\n emitScopeAnchors?: boolean;\n}\n\nexport interface PipelineConfig {\n imagePathPrefix?: string;\n imageBaseUrl?: string;\n parseOptions?: ParseOptions;\n styleOptions?: StyleConfig | StyleConfigV2;\n}\n\n/**\n * v2: Extended PipelineConfig with raw HTML passthrough, slot hooks, and error recovery.\n */\nexport interface PipelineConfigV2 extends PipelineConfig {\n styleOptions?: StyleConfigV2;\n /** Preserve raw HTML tags in markdown (img, style, div, span, etc.) (default: false) */\n preserveRawHTML?: boolean;\n /** Regex pattern for slot placeholders like [[SLOT_NAME]] (default: /\\[\\[(.*?)\\]\\]/g) */\n slotPattern?: RegExp;\n /** Callback to resolve slot values. Called with the slot name, returns replacement string. */\n onSlot?: (name: string) => string;\n /** Error recovery mode (default: 'throw' — backward compatible) */\n errorRecovery?: 'throw' | 'warn' | 'silent';\n /** Max recursion depth to prevent stack overflow (default: 100) */\n maxRecursionDepth?: number;\n /** Additional allowed HTML tags for preserveRawHTML mode */\n allowedHTMLTags?: string[];\n /**\n * Allowed HTML attributes per tag for preserveRawHTML mode.\n * Key \"*\" applies to all tags. Key \"tag\" applies to specific tags.\n * Supports \"data-*\" wildcard prefix matching.\n * Example: { \"*\": [\"id\", \"class\"], \"script\": [\"type\", \"src\"] }\n */\n allowedAttributes?: Record<string, string[]>;\n}\n\n\n/** Default allowed HTML tags for preserveRawHTML mode */\nexport const defaultAllowedHTMLTags = [\n 'img', 'style', 'div', 'span', 'section', 'article',\n 'aside', 'header', 'footer', 'nav', 'main', 'figure',\n 'figcaption', 'details', 'summary', 'mark', 'time',\n 'video', 'audio', 'source', 'iframe', 'embed'\n];\n\n/** Scope hierarchy values for data-md-scope */\nexport type ScopeValue =\n | 'root'\n | 'heading'\n | 'paragraph'\n | 'list'\n | 'list-item'\n | 'image'\n | 'code'\n | 'strong'\n | 'emphasis'\n | 'link'\n | 'container';\n\n/** Maps ContentNodeType to ScopeValue */\nexport const nodeTypeToScope: Record<ContentNodeType, ScopeValue> = {\n 'text': 'root',\n 'heading': 'heading',\n 'paragraph': 'paragraph',\n 'list': 'list',\n 'list-item': 'list-item',\n 'image': 'image',\n 'code': 'code',\n 'container': 'container',\n 'strong': 'strong',\n 'emphasis': 'emphasis',\n 'link': 'link',\n};\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'heading' tokens (h1-h6).\n */\nexport class HeadingHandler implements TokenHandler {\n readonly type = 'heading';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n return {\n type: 'heading' as const,\n content: ctx.processSlots(token.text as string),\n attributes: { level: String(token.depth) }\n };\n }\n}\n","import { ContentNode } from '../types.js';\nimport { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'paragraph' tokens, including inline images and raw HTML.\n */\nexport class ParagraphHandler implements TokenHandler {\n readonly type = 'paragraph';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n const tokens = (token.tokens as Array<Record<string, unknown>>) || [];\n const hasInlineImage = tokens.some(t => t.type === 'image');\n const hasInlineHTML = tokens.some(t => t.type === 'html');\n\n if (hasInlineImage || (ctx.preserveRawHTML && hasInlineHTML)) {\n const children = tokens.map(t => {\n if (t.type === 'image') {\n return {\n type: 'image' as const,\n src: ctx.processImagePath(t.href as string),\n alt: t.text as string || ''\n };\n }\n if (t.type === 'html' && ctx.preserveRawHTML) {\n const processed = ctx.processRawHTML(t.raw as string);\n if (processed.trim()) {\n return { type: 'text' as const, content: processed };\n }\n return null;\n }\n return {\n type: 'text' as const,\n content: ctx.processSlots(ctx.processInlineFormatting(t.text as string || ''))\n };\n }).filter(Boolean) as ContentNode[];\n\n if (children.length === 0) return null;\n\n return { type: 'paragraph' as const, children };\n }\n\n return {\n type: 'paragraph' as const,\n content: ctx.processSlots(ctx.processInlineFormatting(token.text as string))\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'list' tokens (ordered and unordered).\n */\nexport class ListHandler implements TokenHandler {\n readonly type = 'list';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n return {\n type: 'list' as const,\n ordered: token.ordered as boolean,\n children: (token.items as Array<Record<string, unknown>>).map((item) => ({\n type: 'list-item' as const,\n content: ctx.processSlots(ctx.processInlineFormatting(item.text as string))\n }))\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles standalone 'image' tokens.\n */\nexport class ImageHandler implements TokenHandler {\n readonly type = 'image';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n return {\n type: 'image' as const,\n src: ctx.processImagePath(token.href as string),\n alt: token.title as string || ''\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'code' tokens (fenced code blocks).\n */\nexport class CodeHandler implements TokenHandler {\n readonly type = 'code';\n\n handle(token: Record<string, unknown>, _ctx: ParseContext) {\n return {\n type: 'code' as const,\n content: token.text as string,\n attributes: { lang: token.lang as string || '' }\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'hr' tokens (horizontal rules).\n */\nexport class HrHandler implements TokenHandler {\n readonly type = 'hr';\n\n handle(_token: Record<string, unknown>, _ctx: ParseContext) {\n return { type: 'container' as const, attributes: { tag: 'hr' } };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'blockquote' tokens.\n */\nexport class BlockquoteHandler implements TokenHandler {\n readonly type = 'blockquote';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n return {\n type: 'container' as const,\n attributes: { tag: 'blockquote' },\n children: ctx.parseTokens((token.tokens as unknown[]) || [], ctx.maxRecursionDepth + 1)\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'html' tokens (inline or block-level raw HTML).\n * In preserveRawHTML mode, passes through allowed HTML tags.\n * Otherwise, stores the raw content as a container node.\n */\nexport class HtmlHandler implements TokenHandler {\n readonly type = 'html';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n if (ctx.preserveRawHTML) {\n const raw = token.raw as string;\n const processed = ctx.processRawHTML(raw);\n if (processed.trim()) {\n return { type: 'container' as const, rawHTML: processed };\n }\n return null;\n }\n return { type: 'container' as const, content: token.raw as string };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Catch-all handler for any token type that doesn't have a dedicated handler.\n * Wraps the raw token content in a container node so content is never silently lost.\n * Reports the unhandled type via the context's reportUnhandled callback.\n */\nexport class CatchAllHandler implements TokenHandler {\n readonly type = '*';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n const tokenType = token.type as string;\n\n // Report the unhandled token so callers can be notified\n ctx.reportUnhandled(tokenType, token);\n\n // Try to extract meaningful content from the raw token\n const raw = token.raw as string | undefined;\n const text = token.text as string | undefined;\n const content = raw || text || `[unhandled: ${tokenType}]`;\n\n return {\n type: 'container' as const,\n content,\n attributes: {\n 'data-unhandled': tokenType,\n tag: 'div'\n }\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * FrontmatterHandler — consumes YAML-ish frontmatter tokens produced by marked.lexer().\n * Parses the raw YAML and stores key-value pairs onto ctx.metadata.\n * Returns null so no HTML is emitted for frontmatter blocks.\n *\n * Handles both formats:\n * key: value\n * key:\n * - item1\n * - item2\n */\nexport class FrontmatterHandler implements TokenHandler {\n readonly type = 'frontmatter';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n const raw = (token.raw as string) || '';\n\n // Normalize line endings\n const lines = raw.split('\\n');\n const parsed: Record<string, unknown> = {};\n\n let currentKey: string | null = null;\n let currentArray: string[] = [];\n\n for (const line of lines) {\n // Detect dashed list item (indented with `- `)\n const listMatch = line.match(/^\\s+-\\s+(.+)$/);\n if (listMatch && currentKey) {\n currentArray.push(listMatch[1].trim());\n continue;\n }\n\n // If we were building an array, flush it\n if (currentKey && currentArray.length > 0) {\n parsed[currentKey] = [...currentArray];\n currentArray = [];\n currentKey = null;\n }\n\n // Detect key: value or key:\n const keyMatch = line.match(/^(\\w[\\w_-]*)\\s*:\\s*(.*)$/);\n if (keyMatch) {\n currentKey = keyMatch[1];\n const val = keyMatch[2].trim();\n\n if (val === '') {\n // List follows — continue\n continue;\n } else if (val.startsWith('[') && val.endsWith(']')) {\n // Inline array: [a, b, c]\n parsed[currentKey] = val.slice(1, -1).split(',').map(s => s.trim().replace(/^[\"']|[\"']$/g, ''));\n currentKey = null;\n } else {\n parsed[currentKey] = val.replace(/^[\"']|[\"']$/g, '');\n currentKey = null;\n }\n }\n }\n\n // Flush any remaining array\n if (currentKey && currentArray.length > 0) {\n parsed[currentKey] = [...currentArray];\n }\n\n // Merge parsed metadata into the shared context metadata\n if (ctx.metadata) {\n Object.assign(ctx.metadata, parsed);\n }\n\n // Return null — frontmatter produces no HTML\n return null;\n }\n}\n","import { ContentNode } from '../types.js';\nimport { TokenHandler, ParseContext } from './types.js';\n\n/**\n * ContainerBlockHandler — handles custom :::tag#id.class container blocks.\n *\n * These are produced by the MarkdownParser's preprocessor which converts\n * the ::: syntax into marked tokens before lexing, then reconstructs\n * containerBlock tokens after lexing.\n *\n * The handler parses the specifier (e.g. \"section#header.content\") into\n * tag name, id, and class(es), then recursively parses the inner tokens\n * as normal markdown content, producing a container node with the\n * specified HTML wrapper.\n */\nexport class ContainerBlockHandler implements TokenHandler {\n readonly type = 'containerBlock';\n\n handle(token: Record<string, unknown>, ctx: ParseContext): ContentNode | null {\n const specifier = token.specifier as string;\n const childTokens = token.tokens as unknown[];\n\n if (!specifier) return null;\n\n // Parse specifier: tag#id.class (any order, all optional except tag)\n const tagMatch = specifier.match(/^(\\w+)/);\n const idMatch = specifier.match(/#([\\w-]+)/);\n const classMatches = [...specifier.matchAll(/\\.([\\w-]+)/g)];\n\n const tag = tagMatch?.[1] || 'div';\n const id = idMatch?.[1] || '';\n const classes = classMatches.map(m => m[1]);\n\n // Recursively parse inner tokens as markdown\n const children = ctx.parseTokens(childTokens, 0);\n\n return {\n type: 'container' as const,\n children,\n attributes: {\n tag,\n id: id || undefined,\n },\n className: classes.length > 0 ? classes.join(' ') : undefined,\n };\n }\n}\n","import type { TokenHandler } from './types.js';\nimport { HeadingHandler } from './heading-handler.js';\nimport { ParagraphHandler } from './paragraph-handler.js';\nimport { ListHandler } from './list-handler.js';\nimport { ImageHandler } from './image-handler.js';\nimport { CodeHandler } from './code-handler.js';\nimport { HrHandler } from './hr-handler.js';\nimport { BlockquoteHandler } from './blockquote-handler.js';\nimport { HtmlHandler } from './html-handler.js';\nimport { CatchAllHandler } from './catchall-handler.js';\nimport { FrontmatterHandler } from './frontmatter-handler.js';\nimport { ContainerBlockHandler } from './container-block-handler.js';\n\n\n/**\n * Registry of token handlers. Handlers can be added/overridden externally\n * to extend the parser without modifying its internals.\n *\n * The registry uses a two-tier lookup:\n * 1. First, check for a dedicated handler by token type name\n * 2. If none found, fall back to the catch-all handler (registered as '*')\n *\n * The catch-all handler ensures no content is silently lost — unhandled\n * token types are wrapped in a container node with `data-unhandled` attribute.\n */\nexport class TokenHandlerRegistry {\n private handlers = new Map<string, TokenHandler>();\n private catchAll: TokenHandler;\n\n constructor() {\n // Register all built-in handlers\n this.register(new HeadingHandler());\n this.register(new ParagraphHandler());\n this.register(new ListHandler());\n this.register(new ImageHandler());\n this.register(new CodeHandler());\n this.register(new HrHandler());\n this.register(new BlockquoteHandler());\n this.register(new HtmlHandler());\n this.register(new FrontmatterHandler());\n this.register(new ContainerBlockHandler());\n\n\n // Catch-all handler for any unregistered token types\n this.catchAll = new CatchAllHandler();\n }\n\n /** Register a handler. Overrides any existing handler for the same token type. */\n register(handler: TokenHandler): void {\n this.handlers.set(handler.type, handler);\n }\n\n /** Unregister a handler by token type. */\n unregister(type: string): void {\n this.handlers.delete(type);\n }\n\n /**\n * Get a handler for the given token type.\n * Falls back to the catch-all handler if no dedicated handler is registered.\n */\n get(type: string): TokenHandler {\n return this.handlers.get(type) ?? this.catchAll;\n }\n\n /** Check if a dedicated handler exists for the given token type (excludes catch-all). */\n has(type: string): boolean {\n return this.handlers.has(type);\n }\n\n /** Get all registered dedicated handler types. */\n get types(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n /** Replace the catch-all handler with a custom implementation. */\n setCatchAll(handler: TokenHandler): void {\n this.catchAll = handler;\n }\n\n /** Get the current catch-all handler. */\n getCatchAll(): TokenHandler {\n return this.catchAll;\n }\n}\n","import { marked } from 'marked';\nimport { ContentNode, MarkdownContent, ParseOptions, defaultAllowedHTMLTags } from './types.js';\nimport { TokenHandlerRegistry, ParseContext } from './handlers/index.js';\n\nexport interface ParserOptions {\n imagePathPrefix?: string;\n imageBaseUrl?: string;\n preserveRawHTML?: boolean;\n slotPattern?: RegExp;\n onSlot?: (name: string) => string;\n errorRecovery?: 'throw' | 'warn' | 'silent';\n maxRecursionDepth?: number;\n allowedHTMLTags?: string[];\n /**\n * Allowed HTML attributes per tag for preserveRawHTML mode.\n * Key \"*\" applies to all tags. Key \"tag\" applies to specific tags.\n * Supports \"data-*\" wildcard prefix matching.\n */\n allowedAttributes?: Record<string, string[]>;\n /**\n * Callback invoked when a token type has no dedicated handler.\n\n * The catch-all handler will still produce a container node for the content,\n * but this callback allows callers to log, warn, or track unhandled types.\n *\n * @param type - The unhandled token type name (e.g. 'table', 'def')\n * @param token - The raw marked token\n */\n onUnhandledToken?: (type: string, token: Record<string, unknown>) => void;\n}\n\nconst DEFAULT_SLOT_PATTERN = /\\[\\[(.*?)\\]\\]/g;\n\n// Re-export handler types for convenience\nexport { TokenHandlerRegistry } from './handlers/index.js';\nexport type { TokenHandler, ParseContext } from './handlers/index.js';\n\n// ─── MarkdownParser ───────────────────────────────────────────────────────────\n\nexport class MarkdownParser {\n private imagePathPrefix: string;\n private imageBaseUrl: string;\n private preserveRawHTML: boolean;\n private slotPattern: RegExp;\n private onSlot: ((name: string) => string) | undefined;\n private errorRecovery: 'throw' | 'warn' | 'silent';\n private maxRecursionDepth: number;\n private allowedHTMLTags: Set<string>;\n private allowedAttributes: Record<string, string[]>;\n private handlerRegistry: TokenHandlerRegistry;\n private onUnhandledToken?: (type: string, token: Record<string, unknown>) => void;\n\n constructor(options?: ParserOptions) {\n this.imagePathPrefix = options?.imagePathPrefix || '';\n this.imageBaseUrl = options?.imageBaseUrl || '';\n this.preserveRawHTML = options?.preserveRawHTML ?? false;\n this.slotPattern = options?.slotPattern ?? DEFAULT_SLOT_PATTERN;\n this.onSlot = options?.onSlot;\n this.errorRecovery = options?.errorRecovery ?? 'throw';\n this.maxRecursionDepth = options?.maxRecursionDepth ?? 100;\n this.allowedHTMLTags = new Set([\n ...defaultAllowedHTMLTags,\n ...(options?.allowedHTMLTags ?? [])\n ]);\n this.allowedAttributes = options?.allowedAttributes ?? {};\n this.handlerRegistry = new TokenHandlerRegistry();\n this.onUnhandledToken = options?.onUnhandledToken;\n }\n\n\n /** Access the handler registry for customization. */\n get handlers(): TokenHandlerRegistry {\n return this.handlerRegistry;\n }\n\n private processImagePath(src: string): string {\n if (src.startsWith('http') || src.startsWith('/')) {\n return src;\n }\n let path = this.imagePathPrefix ? `${this.imagePathPrefix}${src}` : src;\n if (this.imageBaseUrl && !path.startsWith('http')) {\n path = `${this.imageBaseUrl}${path}`;\n }\n return path;\n }\n\n private processInlineFormatting(text: string): string {\n return text\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/\\*(.+?)\\*/g, '<em>$1</em>');\n }\n\n private processSlots(text: string): string {\n if (!this.onSlot) return text;\n return text.replace(this.slotPattern, (match, name: string) => {\n return this.onSlot!(name.trim());\n });\n }\n\n /**\n * Check if an attribute name is allowed for a given tag.\n * Supports \"data-*\" wildcard prefix matching.\n */\n private isAttributeAllowed(tagName: string, attrName: string): boolean {\n const globalAllowed = this.allowedAttributes['*'];\n if (globalAllowed && this.matchesAttributeList(attrName, globalAllowed)) {\n return true;\n }\n const tagAllowed = this.allowedAttributes[tagName];\n if (tagAllowed && this.matchesAttributeList(attrName, tagAllowed)) {\n return true;\n }\n return false;\n }\n\n /**\n * Check if an attribute name matches a list of allowed patterns.\n * Supports \"data-*\" wildcard prefix matching.\n */\n private matchesAttributeList(attrName: string, allowed: string[]): boolean {\n const lower = attrName.toLowerCase();\n for (const pattern of allowed) {\n if (pattern.endsWith('-*')) {\n const prefix = pattern.slice(0, -1).toLowerCase();\n if (lower.startsWith(prefix)) return true;\n } else if (pattern.toLowerCase() === lower) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Filter attributes on an HTML tag, keeping only allowed ones.\n */\n private filterTagAttributes(tag: string): string {\n // Match opening tag: <tagname ...attrs...>\n const tagMatch = tag.match(/^<\\/?(\\w+)/);\n if (!tagMatch) return tag;\n const tagName = tagMatch[1].toLowerCase();\n\n // If no attribute rules defined, return as-is\n const hasRules = Object.keys(this.allowedAttributes).length > 0;\n if (!hasRules) return tag;\n\n // Extract all attributes from the tag\n const attrRegex = /(\\S+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+))/g;\n const selfClosing = tag.endsWith('/>');\n\n // Get the tag opening part (e.g., <div or </div)\n const tagOpen = tagMatch[0];\n const remaining = tag.slice(tagOpen.length);\n\n // Rebuild the tag with only allowed attributes\n let filtered = tagOpen;\n let match: RegExpExecArray | null;\n while ((match = attrRegex.exec(remaining)) !== null) {\n const attrName = match[1];\n const attrValue = match[2] ?? match[3] ?? match[4] ?? '';\n if (this.isAttributeAllowed(tagName, attrName)) {\n filtered += ` ${attrName}=\"${attrValue.replace(/\"/g, '\"')}\"`;\n }\n }\n\n // Close the tag\n if (selfClosing) {\n filtered += ' /';\n }\n filtered += '>';\n\n return filtered;\n }\n\n private processRawHTML(html: string): string {\n if (!this.allowedHTMLTags.has('script')) {\n html = html.replace(/<script[\\s\\S]*?<\\/script>/gi, '');\n html = html.replace(/<\\/?script[^>]*>/gi, '');\n }\n if (!this.allowedHTMLTags.has('style')) {\n html = html.replace(/<style[\\s\\S]*?<\\/style>/gi, '');\n html = html.replace(/<\\/?style[^>]*>/gi, '');\n }\n\n // Filter attributes on all remaining HTML tags\n const hasAttrRules = Object.keys(this.allowedAttributes).length > 0;\n if (hasAttrRules) {\n html = html.replace(/<[^>]+>/g, (match) => this.filterTagAttributes(match));\n }\n\n return html;\n }\n\n\n /**\n * Build the ParseContext that is passed to every token handler.\n * This is the bridge between the parser's private services and the handlers.\n */\n private createContext(): ParseContext {\n const self = this;\n const metadata: Record<string, unknown> = {};\n return {\n get preserveRawHTML() { return self.preserveRawHTML; },\n get errorRecovery() { return self.errorRecovery; },\n get maxRecursionDepth() { return self.maxRecursionDepth; },\n processImagePath: (src: string) => self.processImagePath(src),\n processInlineFormatting: (text: string) => self.processInlineFormatting(text),\n processSlots: (text: string) => self.processSlots(text),\n processRawHTML: (html: string) => self.processRawHTML(html),\n parseTokens: (tokens: unknown[], depth: number) => self.parseTokens(tokens, depth),\n reportUnhandled: (type: string, token: Record<string, unknown>) => {\n self.onUnhandledToken?.(type, token);\n },\n metadata\n };\n }\n\n /**\n * Process an array of marked tokens into ContentNodes.\n * When depth === 0 (root), creates a shared context that accumulates metadata.\n * For recursive calls (depth > 0), creates a fresh context for each level.\n */\n private parseTokens(tokens: unknown[], depth: number = 0, sharedCtx?: ParseContext): ContentNode[] {\n if (depth > this.maxRecursionDepth) {\n const msg = `[md2html] Max recursion depth (${this.maxRecursionDepth}) exceeded, truncating`;\n if (this.errorRecovery === 'warn') {\n console.warn(msg);\n }\n return [];\n }\n\n const nodes: ContentNode[] = [];\n // Use shared context at root level (depth 0), create fresh for recursive calls\n const ctx = sharedCtx || this.createContext();\n\n for (const token of tokens) {\n const typedToken = token as Record<string, unknown>;\n // The registry automatically falls back to the catch-all handler\n const handler = this.handlerRegistry.get(typedToken.type as string);\n const node = handler.handle(typedToken, ctx);\n if (node) {\n nodes.push(node);\n }\n }\n\n return nodes;\n }\n\n /**\n * Pre-process markdown: convert `:::tag#id.class` container syntax\n * into HTML comment markers that marked will preserve as html tokens,\n * but won't affect markdown parsing of the inner content.\n *\n * Example:\n * :::section#header\n * # Heading inside container\n * Some text\n * :::\n *\n * Becomes:\n * <!-- md-container:section#header -->\n * # Heading inside container\n * Some text\n * <!-- /md-container -->\n */\n private preprocessContainerBlocks(markdown: string): string {\n // Match opening fence: :::tagname#id.class (at start of line)\n // Valid patterns: :::div, :::section#header, :::div.container, :::section#header.main\n return markdown.replace(/^:::(?:(\\w+(?:[.#][\\w-]+)*)\\s*)?$/gm, (match, specifier) => {\n if (!specifier) {\n // Closing fence :::\n return '<!-- /md-container -->';\n }\n // Normalize: if no tag name given, default to \"div\"\n const normalized = specifier.match(/^\\w/) ? specifier : `div${specifier}`;\n return `<!-- md-container:${normalized} -->`;\n });\n }\n\n /**\n * Post-process marked tokens to collapse container block markers\n * into structured containerBlock tokens with proper nesting.\n *\n * This handles nesting depth up to maxRecursionDepth.\n */\n private postprocessTokens(tokens: unknown[]): unknown[] {\n const result: unknown[] = [];\n const stack: { specifier: string; tokens: unknown[] }[] = [];\n let current = result;\n\n for (const token of tokens) {\n const t = token as Record<string, unknown>;\n\n // Detect container opening comment\n if (t.type === 'html') {\n const raw = (t.raw as string).trim();\n const openMatch = raw.match(/^<!--\\s*md-container:\\s*(\\S+)\\s*-->$/);\n const closeMatch = raw.match(/^<!--\\s*\\/md-container\\s*-->$/);\n\n\n if (openMatch) {\n // Start a new container\n const newContainer: { specifier: string; tokens: unknown[] } = {\n specifier: openMatch[1],\n tokens: []\n };\n stack.push(newContainer);\n continue;\n }\n\n if (closeMatch) {\n if (stack.length === 0) {\n // Unmatched closing fence — ignore\n continue;\n }\n const container = stack.pop()!;\n // Recursively process inner tokens for any nested containers\n const processedInner = this.postprocessTokens(container.tokens);\n const containerToken = {\n type: 'containerBlock',\n specifier: container.specifier,\n tokens: processedInner\n };\n\n if (stack.length > 0) {\n stack[stack.length - 1].tokens.push(containerToken);\n } else {\n result.push(containerToken);\n }\n continue;\n }\n }\n\n // Not a container marker — add to current context\n if (stack.length > 0) {\n stack[stack.length - 1].tokens.push(token);\n } else {\n result.push(token);\n }\n }\n\n return result;\n }\n\n parse(markdown: string, options?: ParseOptions): MarkdownContent {\n const parseOptions = {\n gfm: options?.gfm ?? true,\n breaks: options?.breaks ?? false,\n pedantic: options?.pedantic ?? false\n };\n\n try {\n // Step 1: Pre-process ::: container syntax into HTML comment markers\n const processed = this.preprocessContainerBlocks(markdown);\n\n // Step 2: Lex with marked (content between markers is parsed as normal markdown)\n const rawTokens = marked.lexer(processed, parseOptions as Parameters<typeof marked.lexer>[1]);\n\n // Step 3: Post-process to collapse comment markers into containerBlock tokens\n const tokens = this.postprocessTokens(rawTokens);\n\n // Create a shared context at root level so frontmatter metadata accumulates\n const ctx = this.createContext();\n const content = this.parseTokens(tokens, 0, ctx);\n\n return {\n title: '',\n metadata: { ...ctx.metadata },\n content\n };\n } catch (err) {\n if (this.errorRecovery === 'throw') throw err;\n\n const msg = `[md2html] Parse error: ${err instanceof Error ? err.message : String(err)}`;\n if (this.errorRecovery === 'warn') {\n console.warn(msg);\n }\n\n return {\n title: '',\n content: [{ type: 'text', content: markdown }]\n };\n }\n }\n\n\n parseToNodes(markdown: string, options?: ParseOptions): ContentNode[] {\n return this.parse(markdown, options).content;\n }\n}\n","import { ContentNode } from './types.js';\n\n/**\n * Strategy interface for rendering a specific ContentNode type to HTML.\n * This is the renderer-side equivalent of TokenHandler — each node type\n * gets its own strategy, eliminating the large switch statement.\n *\n * To add support for a new node type:\n * 1. Create a class implementing NodeRendererStrategy\n * 2. Register it with the RendererStrategyRegistry\n */\nexport interface NodeRendererStrategy {\n /** The node type this strategy handles */\n readonly type: string;\n /** Render a node of this type to an HTML string */\n render(node: ContentNode, renderChild: (child: ContentNode) => string, ctx: RenderContext): string;\n}\n\n/**\n * Context passed to every render strategy, providing access to\n * shared rendering services and configuration.\n */\nexport interface RenderContext {\n classPrefix: string;\n addHeadingIds: boolean;\n emitScopeAnchors: boolean;\n customCSS: string;\n getClass(baseClass: string, nodeClass?: string): string;\n getScopeAttr(node: ContentNode): string;\n generateHeadingId(content?: string): string;\n getContainerClass(tag: string): string;\n hasClassConfig(): boolean;\n}\n\n// ─── Heading Strategy ───────────────────────────────────────────────────\n\nexport class HeadingRendererStrategy implements NodeRendererStrategy {\n readonly type = 'heading';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const level = (node.attributes?.level as string) || '2';\n const headingId = ctx.addHeadingIds \n ? ` id=\"${ctx.generateHeadingId(node.content)}\"` \n : '';\n const scopeAttr = ctx.getScopeAttr(node);\n\n if (!ctx.hasClassConfig()) {\n return `<h${level}${headingId}${scopeAttr}>${node.content || ''}</h${level}>`;\n }\n\n const prefix = ctx.classPrefix;\n const levelClass = level === '1' ? 'h1' : level === '2' ? 'h2' : level === '3' ? 'h3' : level === '4' ? 'h4' : level === '5' ? 'h5' : 'h6';\n const headingClass = prefix ? `${prefix}${levelClass}` : levelClass;\n return `<h${level}${headingId}${scopeAttr} class=\"${headingClass}\">${node.content || ''}</h${level}>`;\n }\n}\n\n// ─── Paragraph Strategy ─────────────────────────────────────────────────\n\nexport class ParagraphRendererStrategy implements NodeRendererStrategy {\n readonly type = 'paragraph';\n\n render(node: ContentNode, renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const scopeAttr = ctx.getScopeAttr(node);\n if (node.children) {\n const childrenHtml = node.children.map(renderChild).join('');\n return ctx.hasClassConfig() && ctx.classPrefix\n ? `<p class=\"${ctx.classPrefix}paragraph\"${scopeAttr}>${childrenHtml}</p>`\n : `<p${scopeAttr}>${childrenHtml}</p>`;\n }\n return ctx.hasClassConfig() && ctx.classPrefix\n ? `<p class=\"${ctx.classPrefix}paragraph\"${scopeAttr}>${node.content || ''}</p>`\n : `<p${scopeAttr}>${node.content || ''}</p>`;\n }\n}\n\n// ─── List Strategy ──────────────────────────────────────────────────────\n\nexport class ListRendererStrategy implements NodeRendererStrategy {\n readonly type = 'list';\n\n render(node: ContentNode, renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const tag = node.ordered ? 'ol' : 'ul';\n const items = node.children?.map(renderChild).join('') || '';\n const scopeAttr = ctx.getScopeAttr(node);\n return ctx.hasClassConfig() && ctx.classPrefix\n ? `<${tag} class=\"${ctx.classPrefix}list\"${scopeAttr}>${items}</${tag}>`\n : `<${tag}${scopeAttr}>${items}</${tag}>`;\n }\n}\n\n// ─── List Item Strategy ─────────────────────────────────────────────────\n\nexport class ListItemRendererStrategy implements NodeRendererStrategy {\n readonly type = 'list-item';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const scopeAttr = ctx.getScopeAttr(node);\n return ctx.hasClassConfig() && ctx.classPrefix\n ? `<li class=\"${ctx.classPrefix}list-item\"${scopeAttr}>${node.content || ''}</li>`\n : `<li${scopeAttr}>${node.content || ''}</li>`;\n }\n}\n\n// ─── Image Strategy ─────────────────────────────────────────────────────\n\nexport class ImageRendererStrategy implements NodeRendererStrategy {\n readonly type = 'image';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const src = node.src || (node.attributes?.src as string) || '';\n const alt = node.alt || (node.attributes?.alt as string) || '';\n const scopeAttr = ctx.getScopeAttr(node);\n let classStr = '';\n if (ctx.hasClassConfig()) {\n const prefix = ctx.classPrefix;\n classStr = prefix ? `${prefix}image` : 'image';\n if (node.className) classStr += ` ${node.className}`;\n return `<img src=\"${src}\" alt=\"${alt}\" class=\"${classStr}\"${scopeAttr}>`;\n }\n if (node.className) {\n return `<img src=\"${src}\" alt=\"${alt}\" class=\"${node.className}\"${scopeAttr}>`;\n }\n return `<img src=\"${src}\" alt=\"${alt}\"${scopeAttr}>`;\n }\n}\n\n// ─── Code Strategy ──────────────────────────────────────────────────────\n\nexport class CodeRendererStrategy implements NodeRendererStrategy {\n readonly type = 'code';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const scopeAttr = ctx.getScopeAttr(node);\n const lang = (node.attributes?.lang as string) || '';\n if (ctx.hasClassConfig()) {\n const prefix = ctx.classPrefix;\n const codeClass = prefix ? `${prefix}code` : 'code';\n return `<pre${scopeAttr}><code class=\"${codeClass} language-${lang}\">${node.content || ''}</code></pre>`;\n }\n return `<pre${scopeAttr}><code class=\"language-${lang}\">${node.content || ''}</code></pre>`;\n }\n}\n\n// ─── Container Strategy ─────────────────────────────────────────────────\n\nexport class ContainerRendererStrategy implements NodeRendererStrategy {\n readonly type = 'container';\n\n render(node: ContentNode, renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n // If node has rawHTML, emit it directly (passthrough mode)\n if (node.rawHTML) {\n return node.rawHTML;\n }\n\n const tag = (node.attributes?.tag as string) || 'div';\n const children = node.children?.map(renderChild).join('') || '';\n const id = node.attributes?.id as string;\n const idAttr = id ? ` id=\"${id}\"` : '';\n const scopeAttr = ctx.getScopeAttr(node);\n\n // Self-closing tags\n if (tag === 'hr') return '<hr>';\n\n if (ctx.hasClassConfig()) {\n const containerClass = ctx.getContainerClass(tag);\n const prefix = ctx.classPrefix;\n // If we have a classPrefix, use prefixed tag name as class\n if (prefix) {\n const classes = [prefix + (containerClass || 'container')];\n if (node.className) classes.push(node.className);\n return `<${tag} class=\"${classes.join(' ')}\"${idAttr}${scopeAttr}>${children}</${tag}>`;\n }\n // No prefix, use the default container class\n const classes = [containerClass || 'container'];\n if (node.className) classes.push(node.className);\n return `<${tag} class=\"${classes.join(' ')}\"${idAttr}${scopeAttr}>${children}</${tag}>`;\n }\n\n // No class config at all\n if (node.className) {\n return `<${tag} class=\"${node.className}\"${idAttr}${scopeAttr}>${children}</${tag}>`;\n }\n return `<${tag}${idAttr}${scopeAttr}>${children}</${tag}>`;\n }\n}\n\n// ─── Strong Strategy ────────────────────────────────────────────────────\n\nexport class StrongRendererStrategy implements NodeRendererStrategy {\n readonly type = 'strong';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n return `<strong${ctx.getScopeAttr(node)}>${node.content || ''}</strong>`;\n }\n}\n\n// ─── Emphasis Strategy ──────────────────────────────────────────────────\n\nexport class EmphasisRendererStrategy implements NodeRendererStrategy {\n readonly type = 'emphasis';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n return `<em${ctx.getScopeAttr(node)}>${node.content || ''}</em>`;\n }\n}\n\n// ─── Link Strategy ──────────────────────────────────────────────────────\n\nexport class LinkRendererStrategy implements NodeRendererStrategy {\n readonly type = 'link';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const href = node.attributes?.href || '';\n return `<a href=\"${href}\"${ctx.getScopeAttr(node)}>${node.content || ''}</a>`;\n }\n}\n\n// ─── Text Strategy (fallback) ───────────────────────────────────────────\n\nexport class TextRendererStrategy implements NodeRendererStrategy {\n readonly type = 'text';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, _ctx: RenderContext): string {\n return node.content || '';\n }\n}\n\n// ─── Registry ───────────────────────────────────────────────────────────\n\n/**\n * Registry of renderer strategies. Maps ContentNode types to their\n * rendering strategy. This is the renderer-side equivalent of\n * TokenHandlerRegistry.\n *\n * The registry uses a two-tier lookup:\n * 1. Check for a dedicated strategy by node type\n * 2. Fall back to the catch-all strategy (registered as '*')\n */\nexport class RendererStrategyRegistry {\n private strategies = new Map<string, NodeRendererStrategy>();\n private fallback: NodeRendererStrategy;\n\n constructor() {\n // Register all built-in strategies\n this.register(new HeadingRendererStrategy());\n this.register(new ParagraphRendererStrategy());\n this.register(new ListRendererStrategy());\n this.register(new ListItemRendererStrategy());\n this.register(new ImageRendererStrategy());\n this.register(new CodeRendererStrategy());\n this.register(new ContainerRendererStrategy());\n this.register(new StrongRendererStrategy());\n this.register(new EmphasisRendererStrategy());\n this.register(new LinkRendererStrategy());\n this.register(new TextRendererStrategy());\n\n // Fallback renders the content as plain text\n this.fallback = new TextRendererStrategy();\n }\n\n /** Register a strategy for a node type. Overrides any existing strategy. */\n register(strategy: NodeRendererStrategy): void {\n this.strategies.set(strategy.type, strategy);\n }\n\n /** Unregister a strategy by node type. */\n unregister(type: string): void {\n this.strategies.delete(type);\n }\n\n /** Get a strategy for the given node type, falling back to catch-all. */\n get(type: string): NodeRendererStrategy {\n return this.strategies.get(type) ?? this.fallback;\n }\n\n /** Check if a dedicated strategy exists for the given node type. */\n has(type: string): boolean {\n return this.strategies.has(type);\n }\n\n /** Get all registered dedicated strategy types. */\n get types(): string[] {\n return Array.from(this.strategies.keys());\n }\n\n /** Replace the fallback strategy. */\n setFallback(strategy: NodeRendererStrategy): void {\n this.fallback = strategy;\n }\n}\n","import { ContentNode, StyleConfigV2, nodeTypeToScope } from './types.js';\nimport { RendererStrategyRegistry, RenderContext } from './renderer-strategies.js';\n\nexport { RendererStrategyRegistry } from './renderer-strategies.js';\nexport type { NodeRendererStrategy, RenderContext } from './renderer-strategies.js';\n\nexport class HTMLRenderer {\n private config: Required<StyleConfigV2>;\n private strategyRegistry: RendererStrategyRegistry;\n\n constructor(config: StyleConfigV2 = {}) {\n this.config = {\n classPrefix: config.classPrefix || '',\n customCSS: config.customCSS || '',\n addHeadingIds: config.addHeadingIds ?? false,\n emitScopeAnchors: config.emitScopeAnchors ?? false\n };\n this.strategyRegistry = new RendererStrategyRegistry();\n }\n\n /** Access the strategy registry for customization. */\n get strategies(): RendererStrategyRegistry {\n return this.strategyRegistry;\n }\n\n private hasClassConfig(): boolean {\n return this.config.classPrefix !== '' || this.config.addHeadingIds;\n }\n\n private getClass(baseClass: string, nodeClass?: string): string {\n if (!this.hasClassConfig()) {\n return nodeClass || '';\n }\n const prefix = this.config.classPrefix;\n const classes = [prefix ? `${prefix}${baseClass}` : baseClass];\n if (nodeClass) classes.push(nodeClass);\n return classes.join(' ');\n }\n\n private generateHeadingId(content?: string): string {\n if (!content) return '';\n return content\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n }\n\n /**\n * Get the scope attribute string for a node type.\n * Returns empty string if emitScopeAnchors is disabled.\n */\n private getScopeAttr(node: ContentNode): string {\n if (!this.config.emitScopeAnchors) return '';\n const scopeValue = node.scope || nodeTypeToScope[node.type] || 'container';\n return ` data-md-scope=\"${scopeValue}\"`;\n }\n\n /**\n * Get the CSS class for a container's tag-based rendering.\n * Returns just the tag name since renderWithClass applies the prefix.\n */\n private getContainerClass(tag: string): string {\n if (!this.hasClassConfig()) return '';\n return tag;\n }\n\n private buildRenderContext(): RenderContext {\n const self = this;\n return {\n get classPrefix() { return self.config.classPrefix; },\n get addHeadingIds() { return self.config.addHeadingIds; },\n get emitScopeAnchors() { return self.config.emitScopeAnchors; },\n get customCSS() { return self.config.customCSS; },\n hasClassConfig: () => self.hasClassConfig(),\n getClass: (baseClass: string, nodeClass?: string) => self.getClass(baseClass, nodeClass),\n getScopeAttr: (node: ContentNode) => self.getScopeAttr(node),\n generateHeadingId: (content?: string) => self.generateHeadingId(content),\n getContainerClass: (tag: string) => self.getContainerClass(tag)\n };\n }\n\n renderNode(node: ContentNode): string {\n const ctx = this.buildRenderContext();\n const strategy = this.strategyRegistry.get(node.type);\n return strategy.render(node, (child) => this.renderNode(child), ctx);\n }\n\n renderNodes(nodes: ContentNode[]): string {\n if (!nodes || nodes.length === 0) {\n return '';\n }\n // Wrap in scope root if emitScopeAnchors is enabled\n if (this.config.emitScopeAnchors) {\n const inner = nodes.map(node => this.renderNode(node)).join('\\n');\n return `<div data-md-scope=\"root\">\\n${inner}\\n</div>`;\n }\n return nodes.map(node => this.renderNode(node)).join('\\n');\n }\n\n renderToHTMLString(nodes: ContentNode[]): string {\n return this.renderNodes(nodes);\n }\n\n render(markdown: string): string {\n return markdown;\n }\n\n getCustomCSS(): string {\n return this.config.customCSS;\n }\n}\n","import { MarkdownParser } from './parser.js';\nimport { HTMLRenderer } from './renderer.js';\nimport { ContentNode, MarkdownContent, PipelineConfigV2 } from './types.js';\n\ntype NormalizedPipelineConfig = Required<Omit<PipelineConfigV2, 'onSlot' | 'slotPattern'>> & {\n onSlot?: (name: string) => string;\n slotPattern: RegExp;\n};\n\nexport class MarkdownPipeline {\n private parser: MarkdownParser;\n private renderer: HTMLRenderer;\n private config: NormalizedPipelineConfig;\n\n constructor(config: PipelineConfigV2 = {}) {\n this.config = {\n imagePathPrefix: config.imagePathPrefix || '',\n imageBaseUrl: config.imageBaseUrl || '',\n parseOptions: {\n gfm: config.parseOptions?.gfm ?? true,\n breaks: config.parseOptions?.breaks ?? false,\n pedantic: config.parseOptions?.pedantic ?? false\n },\n styleOptions: {\n classPrefix: config.styleOptions?.classPrefix || '',\n customCSS: config.styleOptions?.customCSS || '',\n addHeadingIds: config.styleOptions?.addHeadingIds ?? false,\n emitScopeAnchors: config.styleOptions?.emitScopeAnchors ?? false\n },\n preserveRawHTML: config.preserveRawHTML ?? false,\n slotPattern: config.slotPattern ?? /\\[\\[(.*?)\\]\\]/g,\n onSlot: config.onSlot,\n errorRecovery: config.errorRecovery ?? 'throw',\n maxRecursionDepth: config.maxRecursionDepth ?? 100,\n allowedHTMLTags: config.allowedHTMLTags ?? [],\n allowedAttributes: config.allowedAttributes ?? {}\n };\n\n\n this.parser = new MarkdownParser({\n imagePathPrefix: this.config.imagePathPrefix,\n imageBaseUrl: this.config.imageBaseUrl,\n preserveRawHTML: this.config.preserveRawHTML,\n slotPattern: this.config.slotPattern,\n onSlot: this.config.onSlot,\n errorRecovery: this.config.errorRecovery,\n maxRecursionDepth: this.config.maxRecursionDepth,\n allowedHTMLTags: this.config.allowedHTMLTags,\n allowedAttributes: this.config.allowedAttributes\n });\n\n this.renderer = new HTMLRenderer(this.config.styleOptions);\n }\n\n parse(markdown: string): ContentNode[] {\n return this.parser.parseToNodes(markdown, this.config.parseOptions);\n }\n\n parseWithMetadata(markdown: string): MarkdownContent {\n return this.parser.parse(markdown, this.config.parseOptions);\n }\n\n render(nodes: ContentNode[]): string {\n return this.renderer.renderNodes(nodes);\n }\n\n renderMarkdown(markdown: string): string {\n const nodes = this.parse(markdown);\n return this.render(nodes);\n }\n\n renderPage(title: string, nodes: ContentNode[], options?: {\n lang?: string;\n charset?: string;\n }): string {\n const html = this.render(nodes);\n return `<!DOCTYPE html>\n<html lang=\"${options?.lang || 'en'}\">\n<head>\n <meta charset=\"${options?.charset || 'UTF-8'}\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${title}</title>\n</head>\n<body>\n ${html}\n</body>\n</html>`;\n }\n\n getConfig(): Readonly<PipelineConfigV2> {\n return { ...this.config };\n }\n\n getCustomCSS(): string {\n return this.renderer.getCustomCSS();\n }\n}\n","import { ContentNode } from './types.js';\n\n/**\n * Visitor interface for traversing/walking a ContentNode AST.\n *\n * Implement this interface to inspect, collect, or transform nodes.\n * Each method returns a ContentNode or null — returning null removes the node.\n *\n * Use cases:\n * - Collect all images for preloading\n * - Transform link URLs\n * - Validate AST structure\n * - Extract headings for ToC\n * - Inject attributes\n */\nexport interface NodeVisitor {\n /** Called when entering a node, before visiting its children. */\n enter?(node: ContentNode, parent: ContentNode | null, depth: number): ContentNode | null;\n /** Called after visiting all children of the node. */\n exit?(node: ContentNode, parent: ContentNode | null, depth: number): ContentNode | null;\n}\n\n/**\n * Walk a ContentNode tree, applying a visitor at each node.\n * Returns a new tree (immutable) — does not mutate the original.\n */\nexport function walkTree(root: ContentNode, visitor: NodeVisitor): ContentNode {\n return walkNode(root, null, 0, visitor);\n}\n\nfunction walkNode(\n node: ContentNode,\n parent: ContentNode | null,\n depth: number,\n visitor: NodeVisitor\n): ContentNode {\n // Enter phase\n let processed = visitor.enter ? visitor.enter(node, parent, depth) : node;\n if (processed === null) return null as unknown as ContentNode;\n\n // Recursively walk children\n if (processed.children && processed.children.length > 0) {\n processed = {\n ...processed,\n children: processed.children\n .map(child => walkNode(child, processed, depth + 1, visitor))\n .filter(Boolean) as ContentNode[]\n };\n }\n\n // Exit phase\n processed = visitor.exit ? visitor.exit(processed, parent, depth) : processed;\n if (processed === null) return null as unknown as ContentNode;\n\n return processed;\n}\n\n/**\n * Walk a ContentNode tree and collect results from the visitor.\n * The collector function is called for each node and returns a value or null.\n */\nexport function collectFromTree<T>(\n root: ContentNode,\n collector: (node: ContentNode, parent: ContentNode | null, depth: number) => T | null\n): T[] {\n const results: T[] = [];\n collectNode(root, null, 0, collector, results);\n return results;\n}\n\nfunction collectNode<T>(\n node: ContentNode,\n parent: ContentNode | null,\n depth: number,\n collector: (node: ContentNode, parent: ContentNode | null, depth: number) => T | null,\n results: T[]\n): void {\n const result = collector(node, parent, depth);\n if (result !== null) {\n results.push(result);\n }\n if (node.children) {\n for (const child of node.children) {\n collectNode(child, node, depth + 1, collector, results);\n }\n }\n}\n\n/**\n * Built-in visitor: collect all nodes of a specific type.\n */\nexport function collectByType(root: ContentNode, type: string): ContentNode[] {\n return collectFromTree(root, (node) => \n node.type === type ? node : null\n );\n}\n\n/**\n * Built-in visitor: collect all headings with their levels.\n */\nexport function collectHeadings(root: ContentNode): Array<{ level: string; text: string; id?: string }> {\n return collectFromTree(root, (node) => {\n if (node.type === 'heading') {\n return {\n level: (node.attributes?.level as string) || '2',\n text: node.content || '',\n id: node.attributes?.id as string | undefined\n };\n }\n return null;\n });\n}\n\n/**\n * Built-in visitor: collect all images with their src/alt.\n */\nexport function collectImages(root: ContentNode): Array<{ src: string; alt: string }> {\n return collectFromTree(root, (node) => {\n if (node.type === 'image') {\n return { src: node.src || '', alt: node.alt || '' };\n }\n return null;\n });\n}\n","import { ContentNode } from './types.js';\n\n/**\n * ContentNode factory — a builder API for creating ContentNode instances\n * consistently across the codebase. Eliminates scattered object literals\n * and provides type-safe construction with sensible defaults.\n *\n * Usage:\n * NodeFactory.heading('Hello', { level: '1' })\n * NodeFactory.paragraph('Some text')\n * NodeFactory.container({ tag: 'section', id: 'main' }, [children...])\n */\nexport class NodeFactory {\n static heading(content: string, attributes?: Record<string, unknown>): ContentNode {\n return {\n type: 'heading',\n content,\n attributes: { level: attributes?.level || '2', ...attributes }\n };\n }\n\n static paragraph(\n contentOrChildren: string | ContentNode[],\n children?: ContentNode[]\n ): ContentNode {\n if (typeof contentOrChildren === 'string') {\n return { type: 'paragraph', content: contentOrChildren };\n }\n return { type: 'paragraph', children: contentOrChildren ?? children };\n }\n\n static list(\n items: ContentNode[],\n ordered?: boolean,\n attributes?: Record<string, unknown>\n ): ContentNode {\n return {\n type: 'list',\n ordered: ordered ?? false,\n children: items,\n ...(attributes ? { attributes } : {})\n };\n }\n\n static listItem(content: string): ContentNode {\n return { type: 'list-item', content };\n }\n\n static image(src: string, alt?: string, className?: string): ContentNode {\n return { type: 'image', src, alt: alt || '', ...(className ? { className } : {}) };\n }\n\n static code(content: string, lang?: string): ContentNode {\n return {\n type: 'code',\n content,\n attributes: { lang: lang || '' }\n };\n }\n\n static container(\n children?: ContentNode[],\n config?: {\n tag?: string;\n id?: string;\n className?: string;\n rawHTML?: string;\n scope?: string;\n }\n ): ContentNode {\n const node: ContentNode = { type: 'container' };\n if (children && children.length > 0) node.children = children;\n if (config?.rawHTML) node.rawHTML = config.rawHTML;\n if (config?.scope) node.scope = config.scope;\n\n const attrs: Record<string, unknown> = {};\n if (config?.tag) attrs.tag = config.tag;\n if (config?.id) attrs.id = config.id;\n if (Object.keys(attrs).length > 0) node.attributes = attrs;\n if (config?.className) node.className = config.className;\n\n return node;\n }\n\n static text(content: string): ContentNode {\n return { type: 'text', content };\n }\n\n static strong(content: string): ContentNode {\n return { type: 'strong', content };\n }\n\n static emphasis(content: string): ContentNode {\n return { type: 'emphasis', content };\n }\n\n static link(href: string, content: string): ContentNode {\n return { type: 'link', content, attributes: { href } };\n }\n}\n"],"names":["classes"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/types.ts","../src/handlers/heading-handler.ts","../src/handlers/paragraph-handler.ts","../src/handlers/list-handler.ts","../src/handlers/image-handler.ts","../src/handlers/code-handler.ts","../src/handlers/hr-handler.ts","../src/handlers/blockquote-handler.ts","../src/handlers/html-handler.ts","../src/handlers/link-handler.ts","../src/handlers/catchall-handler.ts","../src/handlers/frontmatter-handler.ts","../src/handlers/container-block-handler.ts","../src/handlers/registry.ts","../src/parser.ts","../src/renderer-strategies.ts","../src/renderer.ts","../src/pipeline.ts","../src/visitor.ts","../src/factory.ts"],"sourcesContent":["export type ContentNodeType = \n | 'text' \n | 'heading' \n | 'paragraph' \n | 'list' \n | 'list-item' \n | 'image' \n | 'code' \n | 'container'\n | 'strong'\n | 'emphasis'\n | 'link';\n\nexport interface ContentNode {\n type: ContentNodeType;\n content?: string;\n children?: ContentNode[];\n attributes?: Record<string, unknown>;\n className?: string;\n src?: string;\n alt?: string;\n ordered?: boolean;\n /** Raw HTML content for passthrough mode */\n rawHTML?: string;\n /** Scope anchor value for data-md-scope */\n scope?: string;\n}\n\nexport interface MarkdownContent {\n title: string;\n metadata?: Record<string, unknown>;\n content: ContentNode[];\n}\n\nexport interface ParseOptions {\n gfm?: boolean;\n breaks?: boolean;\n pedantic?: boolean;\n}\n\nexport interface StyleConfig {\n classPrefix?: string;\n customCSS?: string;\n addHeadingIds?: boolean;\n}\n\n/**\n * v2: Extended StyleConfig with scope anchor support.\n */\nexport interface StyleConfigV2 extends StyleConfig {\n /** Emit data-md-scope attributes for CSS @scope anchoring (default: false) */\n emitScopeAnchors?: boolean;\n}\n\nexport interface PipelineConfig {\n imagePathPrefix?: string;\n imageBaseUrl?: string;\n parseOptions?: ParseOptions;\n styleOptions?: StyleConfig | StyleConfigV2;\n}\n\n/**\n * v2: Extended PipelineConfig with raw HTML passthrough, slot hooks, and error recovery.\n */\nexport interface PipelineConfigV2 extends PipelineConfig {\n styleOptions?: StyleConfigV2;\n /** Preserve raw HTML tags in markdown (img, style, div, span, etc.) (default: false) */\n preserveRawHTML?: boolean;\n /** Regex pattern for slot placeholders like [[SLOT_NAME]] (default: /\\[\\[(.*?)\\]\\]/g) */\n slotPattern?: RegExp;\n /** Callback to resolve slot values. Called with the slot name, returns replacement string. */\n onSlot?: (name: string) => string;\n /** Error recovery mode (default: 'throw' — backward compatible) */\n errorRecovery?: 'throw' | 'warn' | 'silent';\n /** Max recursion depth to prevent stack overflow (default: 100) */\n maxRecursionDepth?: number;\n /** Additional allowed HTML tags for preserveRawHTML mode */\n allowedHTMLTags?: string[];\n /**\n * Allowed HTML attributes per tag for preserveRawHTML mode.\n * Key \"*\" applies to all tags. Key \"tag\" applies to specific tags.\n * Supports \"data-*\" wildcard prefix matching.\n * Example: { \"*\": [\"id\", \"class\"], \"script\": [\"type\", \"src\"] }\n */\n allowedAttributes?: Record<string, string[]>;\n}\n\n\n/** Default allowed HTML tags for preserveRawHTML mode */\nexport const defaultAllowedHTMLTags = [\n 'img', 'style', 'div', 'span', 'section', 'article',\n 'aside', 'header', 'footer', 'nav', 'main', 'figure',\n 'figcaption', 'details', 'summary', 'mark', 'time',\n 'video', 'audio', 'source', 'iframe', 'embed'\n];\n\n/** Scope hierarchy values for data-md-scope */\nexport type ScopeValue =\n | 'root'\n | 'heading'\n | 'paragraph'\n | 'list'\n | 'list-item'\n | 'image'\n | 'code'\n | 'strong'\n | 'emphasis'\n | 'link'\n | 'container';\n\n/** Maps ContentNodeType to ScopeValue */\nexport const nodeTypeToScope: Record<ContentNodeType, ScopeValue> = {\n 'text': 'root',\n 'heading': 'heading',\n 'paragraph': 'paragraph',\n 'list': 'list',\n 'list-item': 'list-item',\n 'image': 'image',\n 'code': 'code',\n 'container': 'container',\n 'strong': 'strong',\n 'emphasis': 'emphasis',\n 'link': 'link',\n};\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'heading' tokens (h1-h6).\n */\nexport class HeadingHandler implements TokenHandler {\n readonly type = 'heading';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n return {\n type: 'heading' as const,\n content: ctx.processSlots(token.text as string),\n attributes: { level: String(token.depth) }\n };\n }\n}\n","import { ContentNode } from '../types.js';\nimport { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'paragraph' tokens, including inline images, links, and raw HTML.\n */\nexport class ParagraphHandler implements TokenHandler {\n readonly type = 'paragraph';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n const tokens = (token.tokens as Array<Record<string, unknown>>) || [];\n const hasInlineImage = tokens.some(t => t.type === 'image');\n const hasInlineLink = tokens.some(t => t.type === 'link');\n const hasInlineHTML = tokens.some(t => t.type === 'html');\n\n if (hasInlineImage || hasInlineLink || (ctx.preserveRawHTML && hasInlineHTML)) {\n const children = tokens.map(t => {\n if (t.type === 'image') {\n return {\n type: 'image' as const,\n src: ctx.processImagePath(t.href as string),\n alt: t.text as string || ''\n };\n }\n if (t.type === 'link') {\n return {\n type: 'link' as const,\n content: ctx.processSlots(ctx.processInlineFormatting(t.text as string || '')),\n attributes: {\n href: t.href as string || '',\n ...(t.title ? { title: t.title as string } : {})\n }\n };\n }\n if (t.type === 'html' && ctx.preserveRawHTML) {\n const processed = ctx.processRawHTML(t.raw as string);\n if (processed.trim()) {\n return { type: 'text' as const, content: processed };\n }\n return null;\n }\n return {\n type: 'text' as const,\n content: ctx.processSlots(ctx.processInlineFormatting(t.text as string || ''))\n };\n }).filter(Boolean) as ContentNode[];\n\n\n if (children.length === 0) return null;\n\n return { type: 'paragraph' as const, children };\n }\n\n return {\n type: 'paragraph' as const,\n content: ctx.processSlots(ctx.processInlineFormatting(token.text as string))\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'list' tokens (ordered and unordered).\n */\nexport class ListHandler implements TokenHandler {\n readonly type = 'list';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n return {\n type: 'list' as const,\n ordered: token.ordered as boolean,\n children: (token.items as Array<Record<string, unknown>>).map((item) => ({\n type: 'list-item' as const,\n content: ctx.processSlots(ctx.processInlineFormatting(item.text as string))\n }))\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles standalone 'image' tokens.\n */\nexport class ImageHandler implements TokenHandler {\n readonly type = 'image';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n return {\n type: 'image' as const,\n src: ctx.processImagePath(token.href as string),\n alt: token.title as string || ''\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'code' tokens (fenced code blocks).\n */\nexport class CodeHandler implements TokenHandler {\n readonly type = 'code';\n\n handle(token: Record<string, unknown>, _ctx: ParseContext) {\n return {\n type: 'code' as const,\n content: token.text as string,\n attributes: { lang: token.lang as string || '' }\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'hr' tokens (horizontal rules).\n */\nexport class HrHandler implements TokenHandler {\n readonly type = 'hr';\n\n handle(_token: Record<string, unknown>, _ctx: ParseContext) {\n return { type: 'container' as const, attributes: { tag: 'hr' } };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'blockquote' tokens.\n */\nexport class BlockquoteHandler implements TokenHandler {\n readonly type = 'blockquote';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n return {\n type: 'container' as const,\n attributes: { tag: 'blockquote' },\n children: ctx.parseTokens((token.tokens as unknown[]) || [], ctx.maxRecursionDepth + 1)\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles 'html' tokens (inline or block-level raw HTML).\n * In preserveRawHTML mode, passes through allowed HTML tags.\n * Otherwise, stores the raw content as a container node.\n */\nexport class HtmlHandler implements TokenHandler {\n readonly type = 'html';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n if (ctx.preserveRawHTML) {\n const raw = token.raw as string;\n const processed = ctx.processRawHTML(raw);\n if (processed.trim()) {\n return { type: 'container' as const, rawHTML: processed };\n }\n return null;\n }\n return { type: 'container' as const, content: token.raw as string };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Handles standalone 'link' tokens (e.g., reference-style links, or links\n * that appear outside paragraphs in certain edge cases).\n */\nexport class LinkHandler implements TokenHandler {\n readonly type = 'link';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n const text = token.text as string || '';\n const href = token.href as string || '';\n const title = token.title as string || '';\n\n return {\n type: 'link' as const,\n content: ctx.processSlots(ctx.processInlineFormatting(text)),\n attributes: {\n href,\n ...(title ? { title } : {})\n }\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * Catch-all handler for any token type that doesn't have a dedicated handler.\n * Wraps the raw token content in a container node so content is never silently lost.\n * Reports the unhandled type via the context's reportUnhandled callback.\n */\nexport class CatchAllHandler implements TokenHandler {\n readonly type = '*';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n const tokenType = token.type as string;\n\n // Report the unhandled token so callers can be notified\n ctx.reportUnhandled(tokenType, token);\n\n // Try to extract meaningful content from the raw token\n const raw = token.raw as string | undefined;\n const text = token.text as string | undefined;\n const content = raw || text || `[unhandled: ${tokenType}]`;\n\n return {\n type: 'container' as const,\n content,\n attributes: {\n 'data-unhandled': tokenType,\n tag: 'div'\n }\n };\n }\n}\n","import { TokenHandler, ParseContext } from './types.js';\n\n/**\n * FrontmatterHandler — consumes YAML-ish frontmatter tokens produced by marked.lexer().\n * Parses the raw YAML and stores key-value pairs onto ctx.metadata.\n * Returns null so no HTML is emitted for frontmatter blocks.\n *\n * Handles both formats:\n * key: value\n * key:\n * - item1\n * - item2\n */\nexport class FrontmatterHandler implements TokenHandler {\n readonly type = 'frontmatter';\n\n handle(token: Record<string, unknown>, ctx: ParseContext) {\n const raw = (token.raw as string) || '';\n\n // Normalize line endings\n const lines = raw.split('\\n');\n const parsed: Record<string, unknown> = {};\n\n let currentKey: string | null = null;\n let currentArray: string[] = [];\n\n for (const line of lines) {\n // Detect dashed list item (indented with `- `)\n const listMatch = line.match(/^\\s+-\\s+(.+)$/);\n if (listMatch && currentKey) {\n currentArray.push(listMatch[1].trim());\n continue;\n }\n\n // If we were building an array, flush it\n if (currentKey && currentArray.length > 0) {\n parsed[currentKey] = [...currentArray];\n currentArray = [];\n currentKey = null;\n }\n\n // Detect key: value or key:\n const keyMatch = line.match(/^(\\w[\\w_-]*)\\s*:\\s*(.*)$/);\n if (keyMatch) {\n currentKey = keyMatch[1];\n const val = keyMatch[2].trim();\n\n if (val === '') {\n // List follows — continue\n continue;\n } else if (val.startsWith('[') && val.endsWith(']')) {\n // Inline array: [a, b, c]\n parsed[currentKey] = val.slice(1, -1).split(',').map(s => s.trim().replace(/^[\"']|[\"']$/g, ''));\n currentKey = null;\n } else {\n parsed[currentKey] = val.replace(/^[\"']|[\"']$/g, '');\n currentKey = null;\n }\n }\n }\n\n // Flush any remaining array\n if (currentKey && currentArray.length > 0) {\n parsed[currentKey] = [...currentArray];\n }\n\n // Merge parsed metadata into the shared context metadata\n if (ctx.metadata) {\n Object.assign(ctx.metadata, parsed);\n }\n\n // Return null — frontmatter produces no HTML\n return null;\n }\n}\n","import { ContentNode } from '../types.js';\nimport { TokenHandler, ParseContext } from './types.js';\n\n/**\n * ContainerBlockHandler — handles custom :::tag#id.class container blocks.\n *\n * These are produced by the MarkdownParser's preprocessor which converts\n * the ::: syntax into marked tokens before lexing, then reconstructs\n * containerBlock tokens after lexing.\n *\n * The handler parses the specifier (e.g. \"section#header.content\") into\n * tag name, id, and class(es), then recursively parses the inner tokens\n * as normal markdown content, producing a container node with the\n * specified HTML wrapper.\n */\nexport class ContainerBlockHandler implements TokenHandler {\n readonly type = 'containerBlock';\n\n handle(token: Record<string, unknown>, ctx: ParseContext): ContentNode | null {\n const specifier = token.specifier as string;\n const childTokens = token.tokens as unknown[];\n\n if (!specifier) return null;\n\n // Parse specifier: tag#id.class (any order, all optional except tag)\n const tagMatch = specifier.match(/^(\\w+)/);\n const idMatch = specifier.match(/#([\\w-]+)/);\n const classMatches = [...specifier.matchAll(/\\.([\\w-]+)/g)];\n\n const tag = tagMatch?.[1] || 'div';\n const id = idMatch?.[1] || '';\n const classes = classMatches.map(m => m[1]);\n\n // Recursively parse inner tokens as markdown\n const children = ctx.parseTokens(childTokens, 0);\n\n return {\n type: 'container' as const,\n children,\n attributes: {\n tag,\n id: id || undefined,\n },\n className: classes.length > 0 ? classes.join(' ') : undefined,\n };\n }\n}\n","import type { TokenHandler } from './types.js';\nimport { HeadingHandler } from './heading-handler.js';\nimport { ParagraphHandler } from './paragraph-handler.js';\nimport { ListHandler } from './list-handler.js';\nimport { ImageHandler } from './image-handler.js';\nimport { CodeHandler } from './code-handler.js';\nimport { HrHandler } from './hr-handler.js';\nimport { BlockquoteHandler } from './blockquote-handler.js';\nimport { HtmlHandler } from './html-handler.js';\nimport { LinkHandler } from './link-handler.js';\nimport { CatchAllHandler } from './catchall-handler.js';\n\nimport { FrontmatterHandler } from './frontmatter-handler.js';\nimport { ContainerBlockHandler } from './container-block-handler.js';\n\n\n/**\n * Registry of token handlers. Handlers can be added/overridden externally\n * to extend the parser without modifying its internals.\n *\n * The registry uses a two-tier lookup:\n * 1. First, check for a dedicated handler by token type name\n * 2. If none found, fall back to the catch-all handler (registered as '*')\n *\n * The catch-all handler ensures no content is silently lost — unhandled\n * token types are wrapped in a container node with `data-unhandled` attribute.\n */\nexport class TokenHandlerRegistry {\n private handlers = new Map<string, TokenHandler>();\n private catchAll: TokenHandler;\n\n constructor() {\n // Register all built-in handlers\n this.register(new HeadingHandler());\n this.register(new ParagraphHandler());\n this.register(new ListHandler());\n this.register(new ImageHandler());\n this.register(new CodeHandler());\n this.register(new HrHandler());\n this.register(new BlockquoteHandler());\n this.register(new HtmlHandler());\n this.register(new FrontmatterHandler());\n this.register(new ContainerBlockHandler());\n this.register(new LinkHandler());\n\n\n\n // Catch-all handler for any unregistered token types\n this.catchAll = new CatchAllHandler();\n }\n\n /** Register a handler. Overrides any existing handler for the same token type. */\n register(handler: TokenHandler): void {\n this.handlers.set(handler.type, handler);\n }\n\n /** Unregister a handler by token type. */\n unregister(type: string): void {\n this.handlers.delete(type);\n }\n\n /**\n * Get a handler for the given token type.\n * Falls back to the catch-all handler if no dedicated handler is registered.\n */\n get(type: string): TokenHandler {\n return this.handlers.get(type) ?? this.catchAll;\n }\n\n /** Check if a dedicated handler exists for the given token type (excludes catch-all). */\n has(type: string): boolean {\n return this.handlers.has(type);\n }\n\n /** Get all registered dedicated handler types. */\n get types(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n /** Replace the catch-all handler with a custom implementation. */\n setCatchAll(handler: TokenHandler): void {\n this.catchAll = handler;\n }\n\n /** Get the current catch-all handler. */\n getCatchAll(): TokenHandler {\n return this.catchAll;\n }\n}\n","import { marked } from 'marked';\nimport { ContentNode, MarkdownContent, ParseOptions, defaultAllowedHTMLTags } from './types.js';\nimport { TokenHandlerRegistry, ParseContext } from './handlers/index.js';\n\nexport interface ParserOptions {\n imagePathPrefix?: string;\n imageBaseUrl?: string;\n preserveRawHTML?: boolean;\n slotPattern?: RegExp;\n onSlot?: (name: string) => string;\n errorRecovery?: 'throw' | 'warn' | 'silent';\n maxRecursionDepth?: number;\n allowedHTMLTags?: string[];\n /**\n * Allowed HTML attributes per tag for preserveRawHTML mode.\n * Key \"*\" applies to all tags. Key \"tag\" applies to specific tags.\n * Supports \"data-*\" wildcard prefix matching.\n */\n allowedAttributes?: Record<string, string[]>;\n /**\n * Callback invoked when a token type has no dedicated handler.\n\n * The catch-all handler will still produce a container node for the content,\n * but this callback allows callers to log, warn, or track unhandled types.\n *\n * @param type - The unhandled token type name (e.g. 'table', 'def')\n * @param token - The raw marked token\n */\n onUnhandledToken?: (type: string, token: Record<string, unknown>) => void;\n}\n\nconst DEFAULT_SLOT_PATTERN = /\\[\\[(.*?)\\]\\]/g;\n\n// Re-export handler types for convenience\nexport { TokenHandlerRegistry } from './handlers/index.js';\nexport type { TokenHandler, ParseContext } from './handlers/index.js';\n\n// ─── MarkdownParser ───────────────────────────────────────────────────────────\n\nexport class MarkdownParser {\n private imagePathPrefix: string;\n private imageBaseUrl: string;\n private preserveRawHTML: boolean;\n private slotPattern: RegExp;\n private onSlot: ((name: string) => string) | undefined;\n private errorRecovery: 'throw' | 'warn' | 'silent';\n private maxRecursionDepth: number;\n private allowedHTMLTags: Set<string>;\n private allowedAttributes: Record<string, string[]>;\n private handlerRegistry: TokenHandlerRegistry;\n private onUnhandledToken?: (type: string, token: Record<string, unknown>) => void;\n\n constructor(options?: ParserOptions) {\n this.imagePathPrefix = options?.imagePathPrefix || '';\n this.imageBaseUrl = options?.imageBaseUrl || '';\n this.preserveRawHTML = options?.preserveRawHTML ?? false;\n this.slotPattern = options?.slotPattern ?? DEFAULT_SLOT_PATTERN;\n this.onSlot = options?.onSlot;\n this.errorRecovery = options?.errorRecovery ?? 'throw';\n this.maxRecursionDepth = options?.maxRecursionDepth ?? 100;\n this.allowedHTMLTags = new Set([\n ...defaultAllowedHTMLTags,\n ...(options?.allowedHTMLTags ?? [])\n ]);\n this.allowedAttributes = options?.allowedAttributes ?? {};\n this.handlerRegistry = new TokenHandlerRegistry();\n this.onUnhandledToken = options?.onUnhandledToken;\n }\n\n\n /** Access the handler registry for customization. */\n get handlers(): TokenHandlerRegistry {\n return this.handlerRegistry;\n }\n\n private processImagePath(src: string): string {\n if (src.startsWith('http') || src.startsWith('/')) {\n return src;\n }\n let path = this.imagePathPrefix ? `${this.imagePathPrefix}${src}` : src;\n if (this.imageBaseUrl && !path.startsWith('http')) {\n path = `${this.imageBaseUrl}${path}`;\n }\n return path;\n }\n\n private processInlineFormatting(text: string): string {\n return text\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/\\*(.+?)\\*/g, '<em>$1</em>');\n }\n\n private processSlots(text: string): string {\n if (!this.onSlot) return text;\n return text.replace(this.slotPattern, (match, name: string) => {\n return this.onSlot!(name.trim());\n });\n }\n\n /**\n * Check if an attribute name is allowed for a given tag.\n * Supports \"data-*\" wildcard prefix matching.\n */\n private isAttributeAllowed(tagName: string, attrName: string): boolean {\n const globalAllowed = this.allowedAttributes['*'];\n if (globalAllowed && this.matchesAttributeList(attrName, globalAllowed)) {\n return true;\n }\n const tagAllowed = this.allowedAttributes[tagName];\n if (tagAllowed && this.matchesAttributeList(attrName, tagAllowed)) {\n return true;\n }\n return false;\n }\n\n /**\n * Check if an attribute name matches a list of allowed patterns.\n * Supports \"data-*\" wildcard prefix matching.\n */\n private matchesAttributeList(attrName: string, allowed: string[]): boolean {\n const lower = attrName.toLowerCase();\n for (const pattern of allowed) {\n if (pattern.endsWith('-*')) {\n const prefix = pattern.slice(0, -1).toLowerCase();\n if (lower.startsWith(prefix)) return true;\n } else if (pattern.toLowerCase() === lower) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Filter attributes on an HTML tag, keeping only allowed ones.\n */\n private filterTagAttributes(tag: string): string {\n // Match opening tag: <tagname ...attrs...>\n const tagMatch = tag.match(/^<\\/?(\\w+)/);\n if (!tagMatch) return tag;\n const tagName = tagMatch[1].toLowerCase();\n\n // If no attribute rules defined, return as-is\n const hasRules = Object.keys(this.allowedAttributes).length > 0;\n if (!hasRules) return tag;\n\n // Extract all attributes from the tag\n const attrRegex = /(\\S+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+))/g;\n const selfClosing = tag.endsWith('/>');\n\n // Get the tag opening part (e.g., <div or </div)\n const tagOpen = tagMatch[0];\n const remaining = tag.slice(tagOpen.length);\n\n // Rebuild the tag with only allowed attributes\n let filtered = tagOpen;\n let match: RegExpExecArray | null;\n while ((match = attrRegex.exec(remaining)) !== null) {\n const attrName = match[1];\n const attrValue = match[2] ?? match[3] ?? match[4] ?? '';\n if (this.isAttributeAllowed(tagName, attrName)) {\n filtered += ` ${attrName}=\"${attrValue.replace(/\"/g, '\"')}\"`;\n }\n }\n\n // Close the tag\n if (selfClosing) {\n filtered += ' /';\n }\n filtered += '>';\n\n return filtered;\n }\n\n private processRawHTML(html: string): string {\n if (!this.allowedHTMLTags.has('script')) {\n html = html.replace(/<script[\\s\\S]*?<\\/script>/gi, '');\n html = html.replace(/<\\/?script[^>]*>/gi, '');\n }\n if (!this.allowedHTMLTags.has('style')) {\n html = html.replace(/<style[\\s\\S]*?<\\/style>/gi, '');\n html = html.replace(/<\\/?style[^>]*>/gi, '');\n }\n\n // Filter attributes on all remaining HTML tags\n const hasAttrRules = Object.keys(this.allowedAttributes).length > 0;\n if (hasAttrRules) {\n html = html.replace(/<[^>]+>/g, (match) => this.filterTagAttributes(match));\n }\n\n return html;\n }\n\n\n /**\n * Build the ParseContext that is passed to every token handler.\n * This is the bridge between the parser's private services and the handlers.\n */\n private createContext(): ParseContext {\n const self = this;\n const metadata: Record<string, unknown> = {};\n return {\n get preserveRawHTML() { return self.preserveRawHTML; },\n get errorRecovery() { return self.errorRecovery; },\n get maxRecursionDepth() { return self.maxRecursionDepth; },\n processImagePath: (src: string) => self.processImagePath(src),\n processInlineFormatting: (text: string) => self.processInlineFormatting(text),\n processSlots: (text: string) => self.processSlots(text),\n processRawHTML: (html: string) => self.processRawHTML(html),\n parseTokens: (tokens: unknown[], depth: number) => self.parseTokens(tokens, depth),\n reportUnhandled: (type: string, token: Record<string, unknown>) => {\n self.onUnhandledToken?.(type, token);\n },\n metadata\n };\n }\n\n /**\n * Process an array of marked tokens into ContentNodes.\n * When depth === 0 (root), creates a shared context that accumulates metadata.\n * For recursive calls (depth > 0), creates a fresh context for each level.\n */\n private parseTokens(tokens: unknown[], depth: number = 0, sharedCtx?: ParseContext): ContentNode[] {\n if (depth > this.maxRecursionDepth) {\n const msg = `[md2html] Max recursion depth (${this.maxRecursionDepth}) exceeded, truncating`;\n if (this.errorRecovery === 'warn') {\n console.warn(msg);\n }\n return [];\n }\n\n const nodes: ContentNode[] = [];\n // Use shared context at root level (depth 0), create fresh for recursive calls\n const ctx = sharedCtx || this.createContext();\n\n for (const token of tokens) {\n const typedToken = token as Record<string, unknown>;\n // The registry automatically falls back to the catch-all handler\n const handler = this.handlerRegistry.get(typedToken.type as string);\n const node = handler.handle(typedToken, ctx);\n if (node) {\n nodes.push(node);\n }\n }\n\n return nodes;\n }\n\n /**\n * Pre-process markdown: convert `:::tag#id.class` container syntax\n * into HTML comment markers that marked will preserve as html tokens,\n * but won't affect markdown parsing of the inner content.\n *\n * Example:\n * :::section#header\n * # Heading inside container\n * Some text\n * :::\n *\n * Becomes:\n * <!-- md-container:section#header -->\n * # Heading inside container\n * Some text\n * <!-- /md-container -->\n */\n private preprocessContainerBlocks(markdown: string): string {\n // Match opening fence: :::tagname#id.class (at start of line)\n // Valid patterns: :::div, :::section#header, :::div.container, :::section#header.main\n return markdown.replace(/^:::(?:(\\w+(?:[.#][\\w-]+)*)\\s*)?$/gm, (match, specifier) => {\n if (!specifier) {\n // Closing fence :::\n return '<!-- /md-container -->';\n }\n // Normalize: if no tag name given, default to \"div\"\n const normalized = specifier.match(/^\\w/) ? specifier : `div${specifier}`;\n return `<!-- md-container:${normalized} -->`;\n });\n }\n\n /**\n * Post-process marked tokens to collapse container block markers\n * into structured containerBlock tokens with proper nesting.\n *\n * This handles nesting depth up to maxRecursionDepth.\n */\n private postprocessTokens(tokens: unknown[]): unknown[] {\n const result: unknown[] = [];\n const stack: { specifier: string; tokens: unknown[] }[] = [];\n let current = result;\n\n for (const token of tokens) {\n const t = token as Record<string, unknown>;\n\n // Detect container opening comment\n if (t.type === 'html') {\n const raw = (t.raw as string).trim();\n const openMatch = raw.match(/^<!--\\s*md-container:\\s*(\\S+)\\s*-->$/);\n const closeMatch = raw.match(/^<!--\\s*\\/md-container\\s*-->$/);\n\n\n if (openMatch) {\n // Start a new container\n const newContainer: { specifier: string; tokens: unknown[] } = {\n specifier: openMatch[1],\n tokens: []\n };\n stack.push(newContainer);\n continue;\n }\n\n if (closeMatch) {\n if (stack.length === 0) {\n // Unmatched closing fence — ignore\n continue;\n }\n const container = stack.pop()!;\n // Recursively process inner tokens for any nested containers\n const processedInner = this.postprocessTokens(container.tokens);\n const containerToken = {\n type: 'containerBlock',\n specifier: container.specifier,\n tokens: processedInner\n };\n\n if (stack.length > 0) {\n stack[stack.length - 1].tokens.push(containerToken);\n } else {\n result.push(containerToken);\n }\n continue;\n }\n }\n\n // Not a container marker — add to current context\n if (stack.length > 0) {\n stack[stack.length - 1].tokens.push(token);\n } else {\n result.push(token);\n }\n }\n\n return result;\n }\n\n parse(markdown: string, options?: ParseOptions): MarkdownContent {\n const parseOptions = {\n gfm: options?.gfm ?? true,\n breaks: options?.breaks ?? false,\n pedantic: options?.pedantic ?? false\n };\n\n try {\n // Step 1: Pre-process ::: container syntax into HTML comment markers\n const processed = this.preprocessContainerBlocks(markdown);\n\n // Step 2: Lex with marked (content between markers is parsed as normal markdown)\n const rawTokens = marked.lexer(processed, parseOptions as Parameters<typeof marked.lexer>[1]);\n\n // Step 3: Post-process to collapse comment markers into containerBlock tokens\n const tokens = this.postprocessTokens(rawTokens);\n\n // Create a shared context at root level so frontmatter metadata accumulates\n const ctx = this.createContext();\n const content = this.parseTokens(tokens, 0, ctx);\n\n return {\n title: '',\n metadata: { ...ctx.metadata },\n content\n };\n } catch (err) {\n if (this.errorRecovery === 'throw') throw err;\n\n const msg = `[md2html] Parse error: ${err instanceof Error ? err.message : String(err)}`;\n if (this.errorRecovery === 'warn') {\n console.warn(msg);\n }\n\n return {\n title: '',\n content: [{ type: 'text', content: markdown }]\n };\n }\n }\n\n\n parseToNodes(markdown: string, options?: ParseOptions): ContentNode[] {\n return this.parse(markdown, options).content;\n }\n}\n","import { ContentNode } from './types.js';\n\n/**\n * Strategy interface for rendering a specific ContentNode type to HTML.\n * This is the renderer-side equivalent of TokenHandler — each node type\n * gets its own strategy, eliminating the large switch statement.\n *\n * To add support for a new node type:\n * 1. Create a class implementing NodeRendererStrategy\n * 2. Register it with the RendererStrategyRegistry\n */\nexport interface NodeRendererStrategy {\n /** The node type this strategy handles */\n readonly type: string;\n /** Render a node of this type to an HTML string */\n render(node: ContentNode, renderChild: (child: ContentNode) => string, ctx: RenderContext): string;\n}\n\n/**\n * Context passed to every render strategy, providing access to\n * shared rendering services and configuration.\n */\nexport interface RenderContext {\n classPrefix: string;\n addHeadingIds: boolean;\n emitScopeAnchors: boolean;\n customCSS: string;\n getClass(baseClass: string, nodeClass?: string): string;\n getScopeAttr(node: ContentNode): string;\n generateHeadingId(content?: string): string;\n getContainerClass(tag: string): string;\n hasClassConfig(): boolean;\n}\n\n// ─── Heading Strategy ───────────────────────────────────────────────────\n\nexport class HeadingRendererStrategy implements NodeRendererStrategy {\n readonly type = 'heading';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const level = (node.attributes?.level as string) || '2';\n const headingId = ctx.addHeadingIds \n ? ` id=\"${ctx.generateHeadingId(node.content)}\"` \n : '';\n const scopeAttr = ctx.getScopeAttr(node);\n\n if (!ctx.hasClassConfig()) {\n return `<h${level}${headingId}${scopeAttr}>${node.content || ''}</h${level}>`;\n }\n\n const prefix = ctx.classPrefix;\n const levelClass = level === '1' ? 'h1' : level === '2' ? 'h2' : level === '3' ? 'h3' : level === '4' ? 'h4' : level === '5' ? 'h5' : 'h6';\n const headingClass = prefix ? `${prefix}${levelClass}` : levelClass;\n return `<h${level}${headingId}${scopeAttr} class=\"${headingClass}\">${node.content || ''}</h${level}>`;\n }\n}\n\n// ─── Paragraph Strategy ─────────────────────────────────────────────────\n\nexport class ParagraphRendererStrategy implements NodeRendererStrategy {\n readonly type = 'paragraph';\n\n render(node: ContentNode, renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const scopeAttr = ctx.getScopeAttr(node);\n if (node.children) {\n const childrenHtml = node.children.map(renderChild).join('');\n return ctx.hasClassConfig() && ctx.classPrefix\n ? `<p class=\"${ctx.classPrefix}paragraph\"${scopeAttr}>${childrenHtml}</p>`\n : `<p${scopeAttr}>${childrenHtml}</p>`;\n }\n return ctx.hasClassConfig() && ctx.classPrefix\n ? `<p class=\"${ctx.classPrefix}paragraph\"${scopeAttr}>${node.content || ''}</p>`\n : `<p${scopeAttr}>${node.content || ''}</p>`;\n }\n}\n\n// ─── List Strategy ──────────────────────────────────────────────────────\n\nexport class ListRendererStrategy implements NodeRendererStrategy {\n readonly type = 'list';\n\n render(node: ContentNode, renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const tag = node.ordered ? 'ol' : 'ul';\n const items = node.children?.map(renderChild).join('') || '';\n const scopeAttr = ctx.getScopeAttr(node);\n return ctx.hasClassConfig() && ctx.classPrefix\n ? `<${tag} class=\"${ctx.classPrefix}list\"${scopeAttr}>${items}</${tag}>`\n : `<${tag}${scopeAttr}>${items}</${tag}>`;\n }\n}\n\n// ─── List Item Strategy ─────────────────────────────────────────────────\n\nexport class ListItemRendererStrategy implements NodeRendererStrategy {\n readonly type = 'list-item';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const scopeAttr = ctx.getScopeAttr(node);\n return ctx.hasClassConfig() && ctx.classPrefix\n ? `<li class=\"${ctx.classPrefix}list-item\"${scopeAttr}>${node.content || ''}</li>`\n : `<li${scopeAttr}>${node.content || ''}</li>`;\n }\n}\n\n// ─── Image Strategy ─────────────────────────────────────────────────────\n\nexport class ImageRendererStrategy implements NodeRendererStrategy {\n readonly type = 'image';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const src = node.src || (node.attributes?.src as string) || '';\n const alt = node.alt || (node.attributes?.alt as string) || '';\n const scopeAttr = ctx.getScopeAttr(node);\n let classStr = '';\n if (ctx.hasClassConfig()) {\n const prefix = ctx.classPrefix;\n classStr = prefix ? `${prefix}image` : 'image';\n if (node.className) classStr += ` ${node.className}`;\n return `<img src=\"${src}\" alt=\"${alt}\" class=\"${classStr}\"${scopeAttr}>`;\n }\n if (node.className) {\n return `<img src=\"${src}\" alt=\"${alt}\" class=\"${node.className}\"${scopeAttr}>`;\n }\n return `<img src=\"${src}\" alt=\"${alt}\"${scopeAttr}>`;\n }\n}\n\n// ─── Code Strategy ──────────────────────────────────────────────────────\n\nexport class CodeRendererStrategy implements NodeRendererStrategy {\n readonly type = 'code';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const scopeAttr = ctx.getScopeAttr(node);\n const lang = (node.attributes?.lang as string) || '';\n if (ctx.hasClassConfig()) {\n const prefix = ctx.classPrefix;\n const codeClass = prefix ? `${prefix}code` : 'code';\n return `<pre${scopeAttr}><code class=\"${codeClass} language-${lang}\">${node.content || ''}</code></pre>`;\n }\n return `<pre${scopeAttr}><code class=\"language-${lang}\">${node.content || ''}</code></pre>`;\n }\n}\n\n// ─── Container Strategy ─────────────────────────────────────────────────\n\nexport class ContainerRendererStrategy implements NodeRendererStrategy {\n readonly type = 'container';\n\n render(node: ContentNode, renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n // If node has rawHTML, emit it directly (passthrough mode)\n if (node.rawHTML) {\n return node.rawHTML;\n }\n\n const tag = (node.attributes?.tag as string) || 'div';\n const children = node.children?.map(renderChild).join('') || '';\n const id = node.attributes?.id as string;\n const idAttr = id ? ` id=\"${id}\"` : '';\n const scopeAttr = ctx.getScopeAttr(node);\n\n // Self-closing tags\n if (tag === 'hr') return '<hr>';\n\n if (ctx.hasClassConfig()) {\n const containerClass = ctx.getContainerClass(tag);\n const prefix = ctx.classPrefix;\n // If we have a classPrefix, use prefixed tag name as class\n if (prefix) {\n const classes = [prefix + (containerClass || 'container')];\n if (node.className) classes.push(node.className);\n return `<${tag} class=\"${classes.join(' ')}\"${idAttr}${scopeAttr}>${children}</${tag}>`;\n }\n // No prefix, use the default container class\n const classes = [containerClass || 'container'];\n if (node.className) classes.push(node.className);\n return `<${tag} class=\"${classes.join(' ')}\"${idAttr}${scopeAttr}>${children}</${tag}>`;\n }\n\n // No class config at all\n if (node.className) {\n return `<${tag} class=\"${node.className}\"${idAttr}${scopeAttr}>${children}</${tag}>`;\n }\n return `<${tag}${idAttr}${scopeAttr}>${children}</${tag}>`;\n }\n}\n\n// ─── Strong Strategy ────────────────────────────────────────────────────\n\nexport class StrongRendererStrategy implements NodeRendererStrategy {\n readonly type = 'strong';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n return `<strong${ctx.getScopeAttr(node)}>${node.content || ''}</strong>`;\n }\n}\n\n// ─── Emphasis Strategy ──────────────────────────────────────────────────\n\nexport class EmphasisRendererStrategy implements NodeRendererStrategy {\n readonly type = 'emphasis';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n return `<em${ctx.getScopeAttr(node)}>${node.content || ''}</em>`;\n }\n}\n\n// ─── Link Strategy ──────────────────────────────────────────────────────\n\nexport class LinkRendererStrategy implements NodeRendererStrategy {\n readonly type = 'link';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, ctx: RenderContext): string {\n const href = node.attributes?.href || '';\n return `<a href=\"${href}\"${ctx.getScopeAttr(node)}>${node.content || ''}</a>`;\n }\n}\n\n// ─── Text Strategy (fallback) ───────────────────────────────────────────\n\nexport class TextRendererStrategy implements NodeRendererStrategy {\n readonly type = 'text';\n\n render(node: ContentNode, _renderChild: (child: ContentNode) => string, _ctx: RenderContext): string {\n return node.content || '';\n }\n}\n\n// ─── Registry ───────────────────────────────────────────────────────────\n\n/**\n * Registry of renderer strategies. Maps ContentNode types to their\n * rendering strategy. This is the renderer-side equivalent of\n * TokenHandlerRegistry.\n *\n * The registry uses a two-tier lookup:\n * 1. Check for a dedicated strategy by node type\n * 2. Fall back to the catch-all strategy (registered as '*')\n */\nexport class RendererStrategyRegistry {\n private strategies = new Map<string, NodeRendererStrategy>();\n private fallback: NodeRendererStrategy;\n\n constructor() {\n // Register all built-in strategies\n this.register(new HeadingRendererStrategy());\n this.register(new ParagraphRendererStrategy());\n this.register(new ListRendererStrategy());\n this.register(new ListItemRendererStrategy());\n this.register(new ImageRendererStrategy());\n this.register(new CodeRendererStrategy());\n this.register(new ContainerRendererStrategy());\n this.register(new StrongRendererStrategy());\n this.register(new EmphasisRendererStrategy());\n this.register(new LinkRendererStrategy());\n this.register(new TextRendererStrategy());\n\n // Fallback renders the content as plain text\n this.fallback = new TextRendererStrategy();\n }\n\n /** Register a strategy for a node type. Overrides any existing strategy. */\n register(strategy: NodeRendererStrategy): void {\n this.strategies.set(strategy.type, strategy);\n }\n\n /** Unregister a strategy by node type. */\n unregister(type: string): void {\n this.strategies.delete(type);\n }\n\n /** Get a strategy for the given node type, falling back to catch-all. */\n get(type: string): NodeRendererStrategy {\n return this.strategies.get(type) ?? this.fallback;\n }\n\n /** Check if a dedicated strategy exists for the given node type. */\n has(type: string): boolean {\n return this.strategies.has(type);\n }\n\n /** Get all registered dedicated strategy types. */\n get types(): string[] {\n return Array.from(this.strategies.keys());\n }\n\n /** Replace the fallback strategy. */\n setFallback(strategy: NodeRendererStrategy): void {\n this.fallback = strategy;\n }\n}\n","import { ContentNode, StyleConfigV2, nodeTypeToScope } from './types.js';\nimport { RendererStrategyRegistry, RenderContext } from './renderer-strategies.js';\n\nexport { RendererStrategyRegistry } from './renderer-strategies.js';\nexport type { NodeRendererStrategy, RenderContext } from './renderer-strategies.js';\n\nexport class HTMLRenderer {\n private config: Required<StyleConfigV2>;\n private strategyRegistry: RendererStrategyRegistry;\n\n constructor(config: StyleConfigV2 = {}) {\n this.config = {\n classPrefix: config.classPrefix || '',\n customCSS: config.customCSS || '',\n addHeadingIds: config.addHeadingIds ?? false,\n emitScopeAnchors: config.emitScopeAnchors ?? false\n };\n this.strategyRegistry = new RendererStrategyRegistry();\n }\n\n /** Access the strategy registry for customization. */\n get strategies(): RendererStrategyRegistry {\n return this.strategyRegistry;\n }\n\n private hasClassConfig(): boolean {\n return this.config.classPrefix !== '' || this.config.addHeadingIds;\n }\n\n private getClass(baseClass: string, nodeClass?: string): string {\n if (!this.hasClassConfig()) {\n return nodeClass || '';\n }\n const prefix = this.config.classPrefix;\n const classes = [prefix ? `${prefix}${baseClass}` : baseClass];\n if (nodeClass) classes.push(nodeClass);\n return classes.join(' ');\n }\n\n private generateHeadingId(content?: string): string {\n if (!content) return '';\n return content\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n }\n\n /**\n * Get the scope attribute string for a node type.\n * Returns empty string if emitScopeAnchors is disabled.\n */\n private getScopeAttr(node: ContentNode): string {\n if (!this.config.emitScopeAnchors) return '';\n const scopeValue = node.scope || nodeTypeToScope[node.type] || 'container';\n return ` data-md-scope=\"${scopeValue}\"`;\n }\n\n /**\n * Get the CSS class for a container's tag-based rendering.\n * Returns just the tag name since renderWithClass applies the prefix.\n */\n private getContainerClass(tag: string): string {\n if (!this.hasClassConfig()) return '';\n return tag;\n }\n\n private buildRenderContext(): RenderContext {\n const self = this;\n return {\n get classPrefix() { return self.config.classPrefix; },\n get addHeadingIds() { return self.config.addHeadingIds; },\n get emitScopeAnchors() { return self.config.emitScopeAnchors; },\n get customCSS() { return self.config.customCSS; },\n hasClassConfig: () => self.hasClassConfig(),\n getClass: (baseClass: string, nodeClass?: string) => self.getClass(baseClass, nodeClass),\n getScopeAttr: (node: ContentNode) => self.getScopeAttr(node),\n generateHeadingId: (content?: string) => self.generateHeadingId(content),\n getContainerClass: (tag: string) => self.getContainerClass(tag)\n };\n }\n\n renderNode(node: ContentNode): string {\n const ctx = this.buildRenderContext();\n const strategy = this.strategyRegistry.get(node.type);\n return strategy.render(node, (child) => this.renderNode(child), ctx);\n }\n\n renderNodes(nodes: ContentNode[]): string {\n if (!nodes || nodes.length === 0) {\n return '';\n }\n // Wrap in scope root if emitScopeAnchors is enabled\n if (this.config.emitScopeAnchors) {\n const inner = nodes.map(node => this.renderNode(node)).join('\\n');\n return `<div data-md-scope=\"root\">\\n${inner}\\n</div>`;\n }\n return nodes.map(node => this.renderNode(node)).join('\\n');\n }\n\n renderToHTMLString(nodes: ContentNode[]): string {\n return this.renderNodes(nodes);\n }\n\n render(markdown: string): string {\n return markdown;\n }\n\n getCustomCSS(): string {\n return this.config.customCSS;\n }\n}\n","import { MarkdownParser } from './parser.js';\nimport { HTMLRenderer } from './renderer.js';\nimport { ContentNode, MarkdownContent, PipelineConfigV2 } from './types.js';\n\ntype NormalizedPipelineConfig = Required<Omit<PipelineConfigV2, 'onSlot' | 'slotPattern'>> & {\n onSlot?: (name: string) => string;\n slotPattern: RegExp;\n};\n\nexport class MarkdownPipeline {\n private parser: MarkdownParser;\n private renderer: HTMLRenderer;\n private config: NormalizedPipelineConfig;\n\n constructor(config: PipelineConfigV2 = {}) {\n this.config = {\n imagePathPrefix: config.imagePathPrefix || '',\n imageBaseUrl: config.imageBaseUrl || '',\n parseOptions: {\n gfm: config.parseOptions?.gfm ?? true,\n breaks: config.parseOptions?.breaks ?? false,\n pedantic: config.parseOptions?.pedantic ?? false\n },\n styleOptions: {\n classPrefix: config.styleOptions?.classPrefix || '',\n customCSS: config.styleOptions?.customCSS || '',\n addHeadingIds: config.styleOptions?.addHeadingIds ?? false,\n emitScopeAnchors: config.styleOptions?.emitScopeAnchors ?? false\n },\n preserveRawHTML: config.preserveRawHTML ?? false,\n slotPattern: config.slotPattern ?? /\\[\\[(.*?)\\]\\]/g,\n onSlot: config.onSlot,\n errorRecovery: config.errorRecovery ?? 'throw',\n maxRecursionDepth: config.maxRecursionDepth ?? 100,\n allowedHTMLTags: config.allowedHTMLTags ?? [],\n allowedAttributes: config.allowedAttributes ?? {}\n };\n\n\n this.parser = new MarkdownParser({\n imagePathPrefix: this.config.imagePathPrefix,\n imageBaseUrl: this.config.imageBaseUrl,\n preserveRawHTML: this.config.preserveRawHTML,\n slotPattern: this.config.slotPattern,\n onSlot: this.config.onSlot,\n errorRecovery: this.config.errorRecovery,\n maxRecursionDepth: this.config.maxRecursionDepth,\n allowedHTMLTags: this.config.allowedHTMLTags,\n allowedAttributes: this.config.allowedAttributes\n });\n\n this.renderer = new HTMLRenderer(this.config.styleOptions);\n }\n\n parse(markdown: string): ContentNode[] {\n return this.parser.parseToNodes(markdown, this.config.parseOptions);\n }\n\n parseWithMetadata(markdown: string): MarkdownContent {\n return this.parser.parse(markdown, this.config.parseOptions);\n }\n\n render(nodes: ContentNode[]): string {\n return this.renderer.renderNodes(nodes);\n }\n\n renderMarkdown(markdown: string): string {\n const nodes = this.parse(markdown);\n return this.render(nodes);\n }\n\n renderPage(title: string, nodes: ContentNode[], options?: {\n lang?: string;\n charset?: string;\n }): string {\n const html = this.render(nodes);\n return `<!DOCTYPE html>\n<html lang=\"${options?.lang || 'en'}\">\n<head>\n <meta charset=\"${options?.charset || 'UTF-8'}\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${title}</title>\n</head>\n<body>\n ${html}\n</body>\n</html>`;\n }\n\n getConfig(): Readonly<PipelineConfigV2> {\n return { ...this.config };\n }\n\n getCustomCSS(): string {\n return this.renderer.getCustomCSS();\n }\n}\n","import { ContentNode } from './types.js';\n\n/**\n * Visitor interface for traversing/walking a ContentNode AST.\n *\n * Implement this interface to inspect, collect, or transform nodes.\n * Each method returns a ContentNode or null — returning null removes the node.\n *\n * Use cases:\n * - Collect all images for preloading\n * - Transform link URLs\n * - Validate AST structure\n * - Extract headings for ToC\n * - Inject attributes\n */\nexport interface NodeVisitor {\n /** Called when entering a node, before visiting its children. */\n enter?(node: ContentNode, parent: ContentNode | null, depth: number): ContentNode | null;\n /** Called after visiting all children of the node. */\n exit?(node: ContentNode, parent: ContentNode | null, depth: number): ContentNode | null;\n}\n\n/**\n * Walk a ContentNode tree, applying a visitor at each node.\n * Returns a new tree (immutable) — does not mutate the original.\n */\nexport function walkTree(root: ContentNode, visitor: NodeVisitor): ContentNode {\n return walkNode(root, null, 0, visitor);\n}\n\nfunction walkNode(\n node: ContentNode,\n parent: ContentNode | null,\n depth: number,\n visitor: NodeVisitor\n): ContentNode {\n // Enter phase\n let processed = visitor.enter ? visitor.enter(node, parent, depth) : node;\n if (processed === null) return null as unknown as ContentNode;\n\n // Recursively walk children\n if (processed.children && processed.children.length > 0) {\n processed = {\n ...processed,\n children: processed.children\n .map(child => walkNode(child, processed, depth + 1, visitor))\n .filter(Boolean) as ContentNode[]\n };\n }\n\n // Exit phase\n processed = visitor.exit ? visitor.exit(processed, parent, depth) : processed;\n if (processed === null) return null as unknown as ContentNode;\n\n return processed;\n}\n\n/**\n * Walk a ContentNode tree and collect results from the visitor.\n * The collector function is called for each node and returns a value or null.\n */\nexport function collectFromTree<T>(\n root: ContentNode,\n collector: (node: ContentNode, parent: ContentNode | null, depth: number) => T | null\n): T[] {\n const results: T[] = [];\n collectNode(root, null, 0, collector, results);\n return results;\n}\n\nfunction collectNode<T>(\n node: ContentNode,\n parent: ContentNode | null,\n depth: number,\n collector: (node: ContentNode, parent: ContentNode | null, depth: number) => T | null,\n results: T[]\n): void {\n const result = collector(node, parent, depth);\n if (result !== null) {\n results.push(result);\n }\n if (node.children) {\n for (const child of node.children) {\n collectNode(child, node, depth + 1, collector, results);\n }\n }\n}\n\n/**\n * Built-in visitor: collect all nodes of a specific type.\n */\nexport function collectByType(root: ContentNode, type: string): ContentNode[] {\n return collectFromTree(root, (node) => \n node.type === type ? node : null\n );\n}\n\n/**\n * Built-in visitor: collect all headings with their levels.\n */\nexport function collectHeadings(root: ContentNode): Array<{ level: string; text: string; id?: string }> {\n return collectFromTree(root, (node) => {\n if (node.type === 'heading') {\n return {\n level: (node.attributes?.level as string) || '2',\n text: node.content || '',\n id: node.attributes?.id as string | undefined\n };\n }\n return null;\n });\n}\n\n/**\n * Built-in visitor: collect all images with their src/alt.\n */\nexport function collectImages(root: ContentNode): Array<{ src: string; alt: string }> {\n return collectFromTree(root, (node) => {\n if (node.type === 'image') {\n return { src: node.src || '', alt: node.alt || '' };\n }\n return null;\n });\n}\n","import { ContentNode } from './types.js';\n\n/**\n * ContentNode factory — a builder API for creating ContentNode instances\n * consistently across the codebase. Eliminates scattered object literals\n * and provides type-safe construction with sensible defaults.\n *\n * Usage:\n * NodeFactory.heading('Hello', { level: '1' })\n * NodeFactory.paragraph('Some text')\n * NodeFactory.container({ tag: 'section', id: 'main' }, [children...])\n */\nexport class NodeFactory {\n static heading(content: string, attributes?: Record<string, unknown>): ContentNode {\n return {\n type: 'heading',\n content,\n attributes: { level: attributes?.level || '2', ...attributes }\n };\n }\n\n static paragraph(\n contentOrChildren: string | ContentNode[],\n children?: ContentNode[]\n ): ContentNode {\n if (typeof contentOrChildren === 'string') {\n return { type: 'paragraph', content: contentOrChildren };\n }\n return { type: 'paragraph', children: contentOrChildren ?? children };\n }\n\n static list(\n items: ContentNode[],\n ordered?: boolean,\n attributes?: Record<string, unknown>\n ): ContentNode {\n return {\n type: 'list',\n ordered: ordered ?? false,\n children: items,\n ...(attributes ? { attributes } : {})\n };\n }\n\n static listItem(content: string): ContentNode {\n return { type: 'list-item', content };\n }\n\n static image(src: string, alt?: string, className?: string): ContentNode {\n return { type: 'image', src, alt: alt || '', ...(className ? { className } : {}) };\n }\n\n static code(content: string, lang?: string): ContentNode {\n return {\n type: 'code',\n content,\n attributes: { lang: lang || '' }\n };\n }\n\n static container(\n children?: ContentNode[],\n config?: {\n tag?: string;\n id?: string;\n className?: string;\n rawHTML?: string;\n scope?: string;\n }\n ): ContentNode {\n const node: ContentNode = { type: 'container' };\n if (children && children.length > 0) node.children = children;\n if (config?.rawHTML) node.rawHTML = config.rawHTML;\n if (config?.scope) node.scope = config.scope;\n\n const attrs: Record<string, unknown> = {};\n if (config?.tag) attrs.tag = config.tag;\n if (config?.id) attrs.id = config.id;\n if (Object.keys(attrs).length > 0) node.attributes = attrs;\n if (config?.className) node.className = config.className;\n\n return node;\n }\n\n static text(content: string): ContentNode {\n return { type: 'text', content };\n }\n\n static strong(content: string): ContentNode {\n return { type: 'strong', content };\n }\n\n static emphasis(content: string): ContentNode {\n return { type: 'emphasis', content };\n }\n\n static link(href: string, content: string): ContentNode {\n return { type: 'link', content, attributes: { href } };\n }\n}\n"],"names":["classes"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leadertechie/md2html",
3
- "version": "0.1.0-alpha.17",
3
+ "version": "0.1.0-alpha.18",
4
4
  "description": "Markdown to HTML pipeline - parse markdown to AST, render to HTML or Lit templates",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",