@leadertechie/md2html 0.1.0-alpha.19 → 0.1.0-alpha.20

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.
@@ -0,0 +1,332 @@
1
+ const defaultAllowedHTMLTags = [
2
+ "img",
3
+ "style",
4
+ "div",
5
+ "span",
6
+ "section",
7
+ "article",
8
+ "aside",
9
+ "header",
10
+ "footer",
11
+ "nav",
12
+ "main",
13
+ "figure",
14
+ "figcaption",
15
+ "details",
16
+ "summary",
17
+ "mark",
18
+ "time",
19
+ "video",
20
+ "audio",
21
+ "source",
22
+ "iframe",
23
+ "embed"
24
+ ];
25
+ const nodeTypeToScope = {
26
+ "text": "root",
27
+ "heading": "heading",
28
+ "paragraph": "paragraph",
29
+ "list": "list",
30
+ "list-item": "list-item",
31
+ "image": "image",
32
+ "code": "code",
33
+ "container": "container",
34
+ "strong": "strong",
35
+ "emphasis": "emphasis",
36
+ "link": "link"
37
+ };
38
+ class HeadingRendererStrategy {
39
+ constructor() {
40
+ this.type = "heading";
41
+ }
42
+ render(node, _renderChild, ctx) {
43
+ const level = node.attributes?.level || "2";
44
+ const headingId = ctx.addHeadingIds ? ` id="${ctx.generateHeadingId(node.content)}"` : "";
45
+ const scopeAttr = ctx.getScopeAttr(node);
46
+ if (!ctx.hasClassConfig()) {
47
+ return `<h${level}${headingId}${scopeAttr}>${node.content || ""}</h${level}>`;
48
+ }
49
+ const prefix = ctx.classPrefix;
50
+ const levelClass = level === "1" ? "h1" : level === "2" ? "h2" : level === "3" ? "h3" : level === "4" ? "h4" : level === "5" ? "h5" : "h6";
51
+ const headingClass = prefix ? `${prefix}${levelClass}` : levelClass;
52
+ return `<h${level}${headingId}${scopeAttr} class="${headingClass}">${node.content || ""}</h${level}>`;
53
+ }
54
+ }
55
+ class ParagraphRendererStrategy {
56
+ constructor() {
57
+ this.type = "paragraph";
58
+ }
59
+ render(node, renderChild, ctx) {
60
+ const scopeAttr = ctx.getScopeAttr(node);
61
+ if (node.children) {
62
+ const childrenHtml = node.children.map(renderChild).join("");
63
+ return ctx.hasClassConfig() && ctx.classPrefix ? `<p class="${ctx.classPrefix}paragraph"${scopeAttr}>${childrenHtml}</p>` : `<p${scopeAttr}>${childrenHtml}</p>`;
64
+ }
65
+ return ctx.hasClassConfig() && ctx.classPrefix ? `<p class="${ctx.classPrefix}paragraph"${scopeAttr}>${node.content || ""}</p>` : `<p${scopeAttr}>${node.content || ""}</p>`;
66
+ }
67
+ }
68
+ class ListRendererStrategy {
69
+ constructor() {
70
+ this.type = "list";
71
+ }
72
+ render(node, renderChild, ctx) {
73
+ const tag = node.ordered ? "ol" : "ul";
74
+ const items = node.children?.map(renderChild).join("") || "";
75
+ const scopeAttr = ctx.getScopeAttr(node);
76
+ return ctx.hasClassConfig() && ctx.classPrefix ? `<${tag} class="${ctx.classPrefix}list"${scopeAttr}>${items}</${tag}>` : `<${tag}${scopeAttr}>${items}</${tag}>`;
77
+ }
78
+ }
79
+ class ListItemRendererStrategy {
80
+ constructor() {
81
+ this.type = "list-item";
82
+ }
83
+ render(node, _renderChild, ctx) {
84
+ const scopeAttr = ctx.getScopeAttr(node);
85
+ return ctx.hasClassConfig() && ctx.classPrefix ? `<li class="${ctx.classPrefix}list-item"${scopeAttr}>${node.content || ""}</li>` : `<li${scopeAttr}>${node.content || ""}</li>`;
86
+ }
87
+ }
88
+ class ImageRendererStrategy {
89
+ constructor() {
90
+ this.type = "image";
91
+ }
92
+ render(node, _renderChild, ctx) {
93
+ const src = node.src || node.attributes?.src || "";
94
+ const alt = node.alt || node.attributes?.alt || "";
95
+ const scopeAttr = ctx.getScopeAttr(node);
96
+ let classStr = "";
97
+ if (ctx.hasClassConfig()) {
98
+ const prefix = ctx.classPrefix;
99
+ classStr = prefix ? `${prefix}image` : "image";
100
+ if (node.className) classStr += ` ${node.className}`;
101
+ return `<img src="${src}" alt="${alt}" class="${classStr}"${scopeAttr}>`;
102
+ }
103
+ if (node.className) {
104
+ return `<img src="${src}" alt="${alt}" class="${node.className}"${scopeAttr}>`;
105
+ }
106
+ return `<img src="${src}" alt="${alt}"${scopeAttr}>`;
107
+ }
108
+ }
109
+ class CodeRendererStrategy {
110
+ constructor() {
111
+ this.type = "code";
112
+ }
113
+ render(node, _renderChild, ctx) {
114
+ const scopeAttr = ctx.getScopeAttr(node);
115
+ const lang = node.attributes?.lang || "";
116
+ if (ctx.hasClassConfig()) {
117
+ const prefix = ctx.classPrefix;
118
+ const codeClass = prefix ? `${prefix}code` : "code";
119
+ return `<pre${scopeAttr}><code class="${codeClass} language-${lang}">${node.content || ""}</code></pre>`;
120
+ }
121
+ return `<pre${scopeAttr}><code class="language-${lang}">${node.content || ""}</code></pre>`;
122
+ }
123
+ }
124
+ class ContainerRendererStrategy {
125
+ constructor() {
126
+ this.type = "container";
127
+ }
128
+ render(node, renderChild, ctx) {
129
+ if (node.rawHTML) {
130
+ return node.rawHTML;
131
+ }
132
+ const tag = node.attributes?.tag || "div";
133
+ const children = node.children?.map(renderChild).join("") || "";
134
+ const id = node.attributes?.id;
135
+ const idAttr = id ? ` id="${id}"` : "";
136
+ const scopeAttr = ctx.getScopeAttr(node);
137
+ if (tag === "hr") return "<hr>";
138
+ if (ctx.hasClassConfig()) {
139
+ const containerClass = ctx.getContainerClass(tag);
140
+ const prefix = ctx.classPrefix;
141
+ if (prefix) {
142
+ const classes2 = [prefix + (containerClass || "container")];
143
+ if (node.className) classes2.push(node.className);
144
+ return `<${tag} class="${classes2.join(" ")}"${idAttr}${scopeAttr}>${children}</${tag}>`;
145
+ }
146
+ const classes = [containerClass || "container"];
147
+ if (node.className) classes.push(node.className);
148
+ return `<${tag} class="${classes.join(" ")}"${idAttr}${scopeAttr}>${children}</${tag}>`;
149
+ }
150
+ if (node.className) {
151
+ return `<${tag} class="${node.className}"${idAttr}${scopeAttr}>${children}</${tag}>`;
152
+ }
153
+ return `<${tag}${idAttr}${scopeAttr}>${children}</${tag}>`;
154
+ }
155
+ }
156
+ class StrongRendererStrategy {
157
+ constructor() {
158
+ this.type = "strong";
159
+ }
160
+ render(node, _renderChild, ctx) {
161
+ return `<strong${ctx.getScopeAttr(node)}>${node.content || ""}</strong>`;
162
+ }
163
+ }
164
+ class EmphasisRendererStrategy {
165
+ constructor() {
166
+ this.type = "emphasis";
167
+ }
168
+ render(node, _renderChild, ctx) {
169
+ return `<em${ctx.getScopeAttr(node)}>${node.content || ""}</em>`;
170
+ }
171
+ }
172
+ class LinkRendererStrategy {
173
+ constructor() {
174
+ this.type = "link";
175
+ }
176
+ render(node, _renderChild, ctx) {
177
+ const href = node.attributes?.href || "";
178
+ return `<a href="${href}"${ctx.getScopeAttr(node)}>${node.content || ""}</a>`;
179
+ }
180
+ }
181
+ class TextRendererStrategy {
182
+ constructor() {
183
+ this.type = "text";
184
+ }
185
+ render(node, _renderChild, _ctx) {
186
+ return node.content || "";
187
+ }
188
+ }
189
+ class RendererStrategyRegistry {
190
+ constructor() {
191
+ this.strategies = /* @__PURE__ */ new Map();
192
+ this.register(new HeadingRendererStrategy());
193
+ this.register(new ParagraphRendererStrategy());
194
+ this.register(new ListRendererStrategy());
195
+ this.register(new ListItemRendererStrategy());
196
+ this.register(new ImageRendererStrategy());
197
+ this.register(new CodeRendererStrategy());
198
+ this.register(new ContainerRendererStrategy());
199
+ this.register(new StrongRendererStrategy());
200
+ this.register(new EmphasisRendererStrategy());
201
+ this.register(new LinkRendererStrategy());
202
+ this.register(new TextRendererStrategy());
203
+ this.fallback = new TextRendererStrategy();
204
+ }
205
+ /** Register a strategy for a node type. Overrides any existing strategy. */
206
+ register(strategy) {
207
+ this.strategies.set(strategy.type, strategy);
208
+ }
209
+ /** Unregister a strategy by node type. */
210
+ unregister(type) {
211
+ this.strategies.delete(type);
212
+ }
213
+ /** Get a strategy for the given node type, falling back to catch-all. */
214
+ get(type) {
215
+ return this.strategies.get(type) ?? this.fallback;
216
+ }
217
+ /** Check if a dedicated strategy exists for the given node type. */
218
+ has(type) {
219
+ return this.strategies.has(type);
220
+ }
221
+ /** Get all registered dedicated strategy types. */
222
+ get types() {
223
+ return Array.from(this.strategies.keys());
224
+ }
225
+ /** Replace the fallback strategy. */
226
+ setFallback(strategy) {
227
+ this.fallback = strategy;
228
+ }
229
+ }
230
+ class HTMLRenderer {
231
+ constructor(config = {}) {
232
+ this.config = {
233
+ classPrefix: config.classPrefix || "",
234
+ customCSS: config.customCSS || "",
235
+ addHeadingIds: config.addHeadingIds ?? false,
236
+ emitScopeAnchors: config.emitScopeAnchors ?? false
237
+ };
238
+ this.strategyRegistry = new RendererStrategyRegistry();
239
+ }
240
+ /** Access the strategy registry for customization. */
241
+ get strategies() {
242
+ return this.strategyRegistry;
243
+ }
244
+ hasClassConfig() {
245
+ return this.config.classPrefix !== "" || this.config.addHeadingIds;
246
+ }
247
+ getClass(baseClass, nodeClass) {
248
+ if (!this.hasClassConfig()) {
249
+ return nodeClass || "";
250
+ }
251
+ const prefix = this.config.classPrefix;
252
+ const classes = [prefix ? `${prefix}${baseClass}` : baseClass];
253
+ if (nodeClass) classes.push(nodeClass);
254
+ return classes.join(" ");
255
+ }
256
+ generateHeadingId(content) {
257
+ if (!content) return "";
258
+ return content.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
259
+ }
260
+ /**
261
+ * Get the scope attribute string for a node type.
262
+ * Returns empty string if emitScopeAnchors is disabled.
263
+ */
264
+ getScopeAttr(node) {
265
+ if (!this.config.emitScopeAnchors) return "";
266
+ const scopeValue = node.scope || nodeTypeToScope[node.type] || "container";
267
+ return ` data-md-scope="${scopeValue}"`;
268
+ }
269
+ /**
270
+ * Get the CSS class for a container's tag-based rendering.
271
+ * Returns just the tag name since renderWithClass applies the prefix.
272
+ */
273
+ getContainerClass(tag) {
274
+ if (!this.hasClassConfig()) return "";
275
+ return tag;
276
+ }
277
+ buildRenderContext() {
278
+ const self = this;
279
+ return {
280
+ get classPrefix() {
281
+ return self.config.classPrefix;
282
+ },
283
+ get addHeadingIds() {
284
+ return self.config.addHeadingIds;
285
+ },
286
+ get emitScopeAnchors() {
287
+ return self.config.emitScopeAnchors;
288
+ },
289
+ get customCSS() {
290
+ return self.config.customCSS;
291
+ },
292
+ hasClassConfig: () => self.hasClassConfig(),
293
+ getClass: (baseClass, nodeClass) => self.getClass(baseClass, nodeClass),
294
+ getScopeAttr: (node) => self.getScopeAttr(node),
295
+ generateHeadingId: (content) => self.generateHeadingId(content),
296
+ getContainerClass: (tag) => self.getContainerClass(tag)
297
+ };
298
+ }
299
+ renderNode(node) {
300
+ const ctx = this.buildRenderContext();
301
+ const strategy = this.strategyRegistry.get(node.type);
302
+ return strategy.render(node, (child) => this.renderNode(child), ctx);
303
+ }
304
+ renderNodes(nodes) {
305
+ if (!nodes || nodes.length === 0) {
306
+ return "";
307
+ }
308
+ if (this.config.emitScopeAnchors) {
309
+ const inner = nodes.map((node) => this.renderNode(node)).join("\n");
310
+ return `<div data-md-scope="root">
311
+ ${inner}
312
+ </div>`;
313
+ }
314
+ return nodes.map((node) => this.renderNode(node)).join("\n");
315
+ }
316
+ renderToHTMLString(nodes) {
317
+ return this.renderNodes(nodes);
318
+ }
319
+ render(markdown) {
320
+ return markdown;
321
+ }
322
+ getCustomCSS() {
323
+ return this.config.customCSS;
324
+ }
325
+ }
326
+ export {
327
+ HTMLRenderer as H,
328
+ RendererStrategyRegistry as R,
329
+ defaultAllowedHTMLTags as d,
330
+ nodeTypeToScope as n
331
+ };
332
+ //# sourceMappingURL=renderer-Ba-j0YEq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-Ba-j0YEq.js","sources":["../src/types.ts","../src/renderer-strategies.ts","../src/renderer.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 /** Optional telemetry logger for observability. Pass your own or a default console logger is used. */\n logger?: import(\"@leadertechie/telemetry\").LoggerInterface;\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 { 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"],"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.19",
3
+ "version": "0.1.0-alpha.20",
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",
@@ -23,11 +23,10 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@leadertechie/telemetry": "^0.0.0",
26
- "marked": "^15.0.0"
27
- },
28
- "peerDependencies": {
29
- "lit": "^3.0.0"
26
+ "marked": "^15.0.0",
27
+ "lit-html": "^3.0.0"
30
28
  },
29
+ "peerDependencies": {},
31
30
  "devDependencies": {
32
31
  "@types/node": "^20.0.0",
33
32
  "typescript": "^5.0.0",
@@ -52,5 +51,10 @@
52
51
  "repository": {
53
52
  "type": "git",
54
53
  "url": "git+https://github.com/leadertechie/md2html.git"
54
+ },
55
+ "peerDependenciesMeta": {
56
+ "lit": {
57
+ "optional": true
58
+ }
55
59
  }
56
60
  }