@leadertechie/md2html 0.1.0-alpha.14 → 0.1.0-alpha.15

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
@@ -270,7 +270,7 @@ export declare interface PipelineConfig {
270
270
  imagePathPrefix?: string;
271
271
  imageBaseUrl?: string;
272
272
  parseOptions?: ParseOptions;
273
- styleOptions?: StyleConfig;
273
+ styleOptions?: StyleConfig | StyleConfigV2;
274
274
  }
275
275
 
276
276
  /**
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/registry.ts","../src/parser.ts","../src/renderer.ts","../src/pipeline.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;\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\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 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';\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\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 * Callback invoked when a token type has no dedicated handler.\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 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.handlerRegistry = new TokenHandlerRegistry();\n this.onUnhandledToken = options?.onUnhandledToken;\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 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 return html;\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 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 };\n }\n\n private parseTokens(tokens: unknown[], depth: number = 0): 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 const ctx = 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 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 const tokens = marked.lexer(markdown, parseOptions as Parameters<typeof marked.lexer>[1]);\n const content = this.parseTokens(tokens);\n\n return {\n title: '',\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 parseToNodes(markdown: string, options?: ParseOptions): ContentNode[] {\n return this.parse(markdown, options).content;\n }\n}\n","import { ContentNode, StyleConfig, StyleConfigV2, nodeTypeToScope } from './types.js';\n\nexport class HTMLRenderer {\n private config: Required<StyleConfigV2>;\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 }\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 private renderWithClass(tag: string, content: string, baseClass?: string, nodeClass?: string, extraAttrs?: string): string {\n const classAttr = this.hasClassConfig() && baseClass \n ? ` class=\"${this.getClass(baseClass, nodeClass)}\"` \n : '';\n return `<${tag}${classAttr}${extraAttrs || ''}>${content}</${tag}>`;\n }\n\n renderNode(node: ContentNode): string {\n const scopeAttr = this.getScopeAttr(node);\n\n switch (node.type) {\n case 'heading':\n const level = node.attributes?.level || '2';\n const headingId = this.config.addHeadingIds \n ? ` id=\"${this.generateHeadingId(node.content)}\"` \n : '';\n let headingClass = '';\n if (this.hasClassConfig()) {\n const prefix = this.config.classPrefix;\n const levelClass = level === '1' ? 'h1' : level === '2' ? 'h2' : level === '3' ? 'h3' : level === '4' ? 'h4' : level === '5' ? 'h5' : 'h6';\n headingClass = prefix ? `${prefix}${levelClass}` : levelClass;\n }\n if (!headingClass) {\n return `<h${level}${headingId}${scopeAttr}>${node.content || ''}</h${level}>`;\n }\n return `<h${level}${headingId}${scopeAttr} class=\"${headingClass}\">${node.content || ''}</h${level}>`;\n \n case 'paragraph':\n if (node.children) {\n const childrenHtml = node.children.map(child => this.renderNode(child)).join('');\n return this.renderWithClass('p', childrenHtml, 'paragraph', undefined, scopeAttr);\n }\n return this.renderWithClass('p', node.content || '', 'paragraph', undefined, scopeAttr);\n \n case 'list':\n const tag = node.ordered ? 'ol' : 'ul';\n const items = node.children?.map(child => this.renderNode(child)).join('') || '';\n return this.renderWithClass(tag, items, 'list', undefined, scopeAttr);\n \n case 'list-item':\n return this.renderWithClass('li', node.content || '', 'list-item', undefined, scopeAttr);\n \n case 'image':\n const src = node.src || node.attributes?.src || '';\n const alt = node.alt || node.attributes?.alt || '';\n const classStr = this.getClass('image', node.className || undefined);\n return `<img src=\"${src}\" alt=\"${alt}\"${classStr ? ` class=\"${classStr}\"` : ''}${scopeAttr}>`;\n \n case 'code':\n const codeClass = this.hasClassConfig() \n ? ` class=\"${this.getClass('code')} language-${node.attributes?.lang || ''}\"` \n : ` class=\"language-${node.attributes?.lang || ''}\"`;\n return `<pre${scopeAttr}><code${codeClass}>${node.content || ''}</code></pre>`;\n \n case 'container':\n if (node.attributes?.tag === 'hr') return '<hr>';\n if (node.attributes?.tag === 'blockquote') {\n const children = node.children?.map(child => this.renderNode(child)).join('') || '';\n return this.renderWithClass('blockquote', children, 'blockquote', undefined, scopeAttr);\n }\n // If node has rawHTML, emit it directly\n if (node.rawHTML) {\n return node.rawHTML;\n }\n const containerChildren = node.children?.map(child => this.renderNode(child)).join('') || '';\n return this.renderWithClass('div', containerChildren, 'container', node.className || undefined, scopeAttr);\n \n case 'strong':\n return `<strong${scopeAttr}>${node.content || ''}</strong>`;\n \n case 'emphasis':\n return `<em${scopeAttr}>${node.content || ''}</em>`;\n \n case 'link':\n const href = node.attributes?.href || '';\n return `<a href=\"${href}\"${scopeAttr}>${node.content || ''}</a>`;\n \n case 'text':\n default:\n return node.content || '';\n }\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 };\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 });\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"],"names":[],"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/catchall-handler.ts","../src/handlers/registry.ts","../src/parser.ts","../src/renderer.ts","../src/pipeline.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\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 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';\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\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 * Callback invoked when a token type has no dedicated handler.\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 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.handlerRegistry = new TokenHandlerRegistry();\n this.onUnhandledToken = options?.onUnhandledToken;\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 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 return html;\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 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 };\n }\n\n private parseTokens(tokens: unknown[], depth: number = 0): 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 const ctx = 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 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 const tokens = marked.lexer(markdown, parseOptions as Parameters<typeof marked.lexer>[1]);\n const content = this.parseTokens(tokens);\n\n return {\n title: '',\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 parseToNodes(markdown: string, options?: ParseOptions): ContentNode[] {\n return this.parse(markdown, options).content;\n }\n}\n","import { ContentNode, StyleConfig, StyleConfigV2, nodeTypeToScope } from './types.js';\n\nexport class HTMLRenderer {\n private config: Required<StyleConfigV2>;\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 }\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 private renderWithClass(tag: string, content: string, baseClass?: string, nodeClass?: string, extraAttrs?: string): string {\n const classAttr = this.hasClassConfig() && baseClass \n ? ` class=\"${this.getClass(baseClass, nodeClass)}\"` \n : '';\n return `<${tag}${classAttr}${extraAttrs || ''}>${content}</${tag}>`;\n }\n\n renderNode(node: ContentNode): string {\n const scopeAttr = this.getScopeAttr(node);\n\n switch (node.type) {\n case 'heading':\n const level = node.attributes?.level || '2';\n const headingId = this.config.addHeadingIds \n ? ` id=\"${this.generateHeadingId(node.content)}\"` \n : '';\n let headingClass = '';\n if (this.hasClassConfig()) {\n const prefix = this.config.classPrefix;\n const levelClass = level === '1' ? 'h1' : level === '2' ? 'h2' : level === '3' ? 'h3' : level === '4' ? 'h4' : level === '5' ? 'h5' : 'h6';\n headingClass = prefix ? `${prefix}${levelClass}` : levelClass;\n }\n if (!headingClass) {\n return `<h${level}${headingId}${scopeAttr}>${node.content || ''}</h${level}>`;\n }\n return `<h${level}${headingId}${scopeAttr} class=\"${headingClass}\">${node.content || ''}</h${level}>`;\n \n case 'paragraph':\n if (node.children) {\n const childrenHtml = node.children.map(child => this.renderNode(child)).join('');\n return this.renderWithClass('p', childrenHtml, 'paragraph', undefined, scopeAttr);\n }\n return this.renderWithClass('p', node.content || '', 'paragraph', undefined, scopeAttr);\n \n case 'list':\n const tag = node.ordered ? 'ol' : 'ul';\n const items = node.children?.map(child => this.renderNode(child)).join('') || '';\n return this.renderWithClass(tag, items, 'list', undefined, scopeAttr);\n \n case 'list-item':\n return this.renderWithClass('li', node.content || '', 'list-item', undefined, scopeAttr);\n \n case 'image':\n const src = node.src || node.attributes?.src || '';\n const alt = node.alt || node.attributes?.alt || '';\n const classStr = this.getClass('image', node.className || undefined);\n return `<img src=\"${src}\" alt=\"${alt}\"${classStr ? ` class=\"${classStr}\"` : ''}${scopeAttr}>`;\n \n case 'code':\n const codeClass = this.hasClassConfig() \n ? ` class=\"${this.getClass('code')} language-${node.attributes?.lang || ''}\"` \n : ` class=\"language-${node.attributes?.lang || ''}\"`;\n return `<pre${scopeAttr}><code${codeClass}>${node.content || ''}</code></pre>`;\n \n case 'container':\n if (node.attributes?.tag === 'hr') return '<hr>';\n if (node.attributes?.tag === 'blockquote') {\n const children = node.children?.map(child => this.renderNode(child)).join('') || '';\n return this.renderWithClass('blockquote', children, 'blockquote', undefined, scopeAttr);\n }\n // If node has rawHTML, emit it directly\n if (node.rawHTML) {\n return node.rawHTML;\n }\n const containerChildren = node.children?.map(child => this.renderNode(child)).join('') || '';\n return this.renderWithClass('div', containerChildren, 'container', node.className || undefined, scopeAttr);\n \n case 'strong':\n return `<strong${scopeAttr}>${node.content || ''}</strong>`;\n \n case 'emphasis':\n return `<em${scopeAttr}>${node.content || ''}</em>`;\n \n case 'link':\n const href = node.attributes?.href || '';\n return `<a href=\"${href}\"${scopeAttr}>${node.content || ''}</a>`;\n \n case 'text':\n default:\n return node.content || '';\n }\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 };\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 });\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"],"names":[],"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.14",
3
+ "version": "0.1.0-alpha.15",
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",