simple-customize-markdown-converter 1.1.0 → 1.2.1

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.
Files changed (40) hide show
  1. package/README.md +47 -0
  2. package/dist/core/lexer/handler.d.ts +23 -0
  3. package/dist/core/lexer/handler.js +272 -0
  4. package/dist/core/lexer/index.d.ts +42 -0
  5. package/dist/core/lexer/index.js +177 -0
  6. package/dist/core/parser/handler.d.ts +19 -0
  7. package/dist/core/parser/handler.js +254 -0
  8. package/dist/core/parser/index.d.ts +33 -0
  9. package/dist/core/parser/index.js +149 -0
  10. package/dist/core/resolver/footnote-resolver.d.ts +15 -0
  11. package/dist/core/resolver/footnote-resolver.js +36 -0
  12. package/dist/index.d.ts +6 -5
  13. package/dist/index.js +4 -4
  14. package/dist/react.d.ts +3 -6
  15. package/dist/react.js +5 -5
  16. package/dist/renderers/default/handler.d.ts +21 -0
  17. package/dist/renderers/default/handler.js +159 -0
  18. package/dist/renderers/default/index.d.ts +14 -0
  19. package/dist/renderers/default/index.js +119 -0
  20. package/dist/renderers/index.d.ts +10 -0
  21. package/dist/renderers/index.js +2 -0
  22. package/dist/renderers/react/handler.d.ts +22 -0
  23. package/dist/renderers/react/handler.js +140 -0
  24. package/dist/renderers/react/index.d.ts +15 -0
  25. package/dist/renderers/react/index.js +124 -0
  26. package/dist/types/options/converterOptions.d.ts +1 -1
  27. package/dist/types/options/index.d.ts +5 -12
  28. package/dist/types/options/renderOptions.d.ts +70 -21
  29. package/dist/types/parser.d.ts +132 -0
  30. package/dist/types/parser.js +2 -0
  31. package/dist/types/renderer.d.ts +12 -0
  32. package/dist/types/renderer.js +2 -0
  33. package/dist/types/token.d.ts +94 -74
  34. package/dist/utilities/parser-utils.d.ts +5 -0
  35. package/dist/utilities/parser-utils.js +65 -0
  36. package/dist/utilities/renderer-utils.d.ts +4 -0
  37. package/dist/utilities/renderer-utils.js +20 -0
  38. package/dist/utilities/tokenizer-utils.d.ts +11 -0
  39. package/dist/utilities/tokenizer-utils.js +159 -0
  40. package/package.json +5 -3
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FootnoteRefHandler = exports.HTMLInlineHandler = exports.HTMLBlockHandler = exports.TableHandler = exports.TextHandler = exports.HorizontalLineHandler = exports.ImageHandler = exports.LinkHandler = exports.InlineCodeHandler = exports.StrikethroughHandler = exports.ItalicHandler = exports.BoldHandler = exports.TaskItemHandler = exports.ListItemHandler = exports.ListHandler = exports.QuoteHandler = exports.HeaderHandler = exports.CodeBlockHandler = exports.ParagraphHandler = exports.DocumentHandler = void 0;
4
+ const renderer_utils_1 = require("../../utilities/renderer-utils");
5
+ //Base structural nodes
6
+ exports.DocumentHandler = {
7
+ type: "Document",
8
+ render: (_node, children, ctx) => children.join("") + ctx.renderFootnotes()
9
+ };
10
+ exports.ParagraphHandler = {
11
+ type: "Paragraph",
12
+ render: (node, children, ctx) => {
13
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
14
+ return `<p${cls ? ` class="${cls}"` : ""}>${children.join("")}</p>`;
15
+ }
16
+ };
17
+ //Container nodes
18
+ exports.CodeBlockHandler = {
19
+ type: "CodeBlock",
20
+ render: (node, _children, ctx) => {
21
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node, `lang-${node.lang}`);
22
+ return `<pre><code${cls ? ` class="${cls}"` : ""}>${(0, renderer_utils_1.escapeHtml)(node.content || "")}</code></pre>`;
23
+ }
24
+ };
25
+ exports.HeaderHandler = {
26
+ type: "Header",
27
+ render: (node, children, ctx) => {
28
+ if (node.level) {
29
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
30
+ const classAttr = cls ? ` class="${cls}"` : "";
31
+ const style = node.level <= 2 ? ' style="border-bottom: 1px solid #d1d9e0b3"' : '';
32
+ return `<h${node.level}${classAttr}${style}>${children.join("")}</h${node.level}>`;
33
+ }
34
+ return `<p>${children.join("")}</p>`;
35
+ }
36
+ };
37
+ exports.QuoteHandler = {
38
+ type: "Quote",
39
+ render: (node, children, ctx) => {
40
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
41
+ const classAttr = cls ? ` class="${cls}"` : "";
42
+ return `<blockquote${classAttr} style="margin:0; padding:0 1em; color:#59636e; border-left:.25em solid #d1d9e0;">${children.join("")}</blockquote>`;
43
+ }
44
+ };
45
+ //For list nodes
46
+ exports.ListHandler = {
47
+ type: "List",
48
+ render: (node, children, ctx) => {
49
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
50
+ const classAttr = cls ? ` class="${cls}"` : "";
51
+ return node.ordered ? `<ol${classAttr}>${children.join("")}</ol>` : `<ul${classAttr}>${children.join("")}</ul>`;
52
+ }
53
+ };
54
+ exports.ListItemHandler = {
55
+ type: "ListItem",
56
+ render: (node, children, ctx) => {
57
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
58
+ return `<li${cls ? ` class="${cls}"` : ""}>${children.join("")}</li>`;
59
+ }
60
+ };
61
+ exports.TaskItemHandler = {
62
+ type: "TaskItem",
63
+ render: (node, children, ctx) => {
64
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
65
+ return `<li${cls ? ` class="${cls}"` : ""} style="list-style-type: none"><input type="checkbox" disabled ${node.checked ? "checked" : ""}>${children.join("")}</li>`;
66
+ }
67
+ };
68
+ //Styling nodes
69
+ exports.BoldHandler = {
70
+ type: "Bold",
71
+ render: (node, children, ctx) => {
72
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
73
+ return `<strong${cls ? ` class="${cls}"` : ""}>${children.join("")}</strong>`;
74
+ }
75
+ };
76
+ exports.ItalicHandler = {
77
+ type: "Italic",
78
+ render: (node, children, ctx) => {
79
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
80
+ return `<em${cls ? ` class="${cls}"` : ""}>${children.join("")}</em>`;
81
+ }
82
+ };
83
+ exports.StrikethroughHandler = {
84
+ type: "Strikethrough",
85
+ render: (node, children, ctx) => {
86
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
87
+ return `<s${cls ? ` class="${cls}"` : ""}>${children.join("")}</s>`;
88
+ }
89
+ };
90
+ exports.InlineCodeHandler = {
91
+ type: "InlineCode",
92
+ render: (node, _children, ctx) => {
93
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
94
+ return `<code${cls ? ` class="${cls}"` : ""}>${(0, renderer_utils_1.escapeHtml)(node.content || "")}</code>`;
95
+ }
96
+ };
97
+ //Media nodes
98
+ exports.LinkHandler = {
99
+ type: "Link",
100
+ render: (node, _children, ctx) => {
101
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
102
+ return `<a href="${node.href}"${cls ? ` class="${cls}"` : ""} target="_blank" rel="noopener">${node.text}</a>`;
103
+ }
104
+ };
105
+ exports.ImageHandler = {
106
+ type: "Image",
107
+ render: (node, _children, ctx) => {
108
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
109
+ return `<img src="${node.src || ""}" alt="${node.alt || ""}"${cls ? ` class="${cls}"` : ""}/>`;
110
+ }
111
+ };
112
+ //Leaf nodes
113
+ exports.HorizontalLineHandler = {
114
+ type: "HorizontalLine",
115
+ render: (node, _children, ctx) => {
116
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
117
+ return `<hr${cls ? ` class="${cls}"` : ""}>`;
118
+ }
119
+ };
120
+ exports.TextHandler = {
121
+ type: "Text",
122
+ render: (node) => node.value || ""
123
+ };
124
+ //Table nodes
125
+ exports.TableHandler = {
126
+ type: "Table",
127
+ render: (node, children, ctx) => ctx.renderTable(node, children)
128
+ };
129
+ //For HTML
130
+ exports.HTMLBlockHandler = {
131
+ type: "HTMLBlock",
132
+ render: (node, _children, ctx) => {
133
+ const val = node.value || "";
134
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
135
+ const content = ctx.options.converterOptions?.allowDangerousHtml ? val : (0, renderer_utils_1.escapeHtml)(val);
136
+ return cls ? `<div${cls ? ` class="${cls}"` : ""}>${content}</div>` : content;
137
+ }
138
+ };
139
+ exports.HTMLInlineHandler = {
140
+ type: "HTMLInline",
141
+ render: (node, _children, ctx) => {
142
+ const val = node.value || "";
143
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node);
144
+ const content = ctx.options.converterOptions?.allowDangerousHtml ? val : (0, renderer_utils_1.escapeHtml)(val);
145
+ return cls ? `<span${cls ? ` class="${cls}"` : ""}>${content}</span>` : content;
146
+ }
147
+ };
148
+ //For footnote
149
+ exports.FootnoteRefHandler = {
150
+ type: "FootnoteRef",
151
+ render: (node, _children, ctx) => {
152
+ if (node.id) {
153
+ const idx = ctx.footnoteResolver.getUsedRefById(node.id);
154
+ const cls = (0, renderer_utils_1.getClassName)(ctx, node, "footnote-ref");
155
+ return `<sup id="fnref:${idx}"><a href="#fn:${idx}"${cls ? ` class="${cls}"` : ""}>[${idx}]</a></sup>`;
156
+ }
157
+ return "";
158
+ }
159
+ };
@@ -0,0 +1,14 @@
1
+ import { IRenderer } from "..";
2
+ import { MarkdownOptions } from "../../types/options";
3
+ import { ASTNode } from "../../types/parser";
4
+ import { FootnoteResolver } from "../../core/resolver/footnote-resolver";
5
+ export declare class DefaultRenderer implements IRenderer<string> {
6
+ options: MarkdownOptions<string>;
7
+ footnoteResolver: FootnoteResolver;
8
+ private strategies;
9
+ constructor(footnoteResolver: FootnoteResolver, options?: MarkdownOptions<string>);
10
+ private registerDefaultStrategies;
11
+ render(node: ASTNode): string;
12
+ renderFootnotes(): string;
13
+ renderTable(node: ASTNode, children: string[]): string;
14
+ }
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DefaultRenderer = void 0;
37
+ const Handlers = __importStar(require("./handler"));
38
+ const renderer_utils_1 = require("../../utilities/renderer-utils");
39
+ class DefaultRenderer {
40
+ constructor(footnoteResolver, options = {}) {
41
+ this.strategies = new Map();
42
+ this.footnoteResolver = footnoteResolver;
43
+ this.options = options;
44
+ this.registerDefaultStrategies();
45
+ }
46
+ registerDefaultStrategies() {
47
+ const listDefaultStrategy = [
48
+ Handlers.DocumentHandler,
49
+ Handlers.ParagraphHandler,
50
+ Handlers.HeaderHandler,
51
+ Handlers.CodeBlockHandler,
52
+ Handlers.QuoteHandler,
53
+ Handlers.BoldHandler,
54
+ Handlers.ItalicHandler,
55
+ Handlers.StrikethroughHandler,
56
+ Handlers.InlineCodeHandler,
57
+ Handlers.LinkHandler,
58
+ Handlers.ImageHandler,
59
+ Handlers.ListHandler,
60
+ Handlers.ListItemHandler,
61
+ Handlers.TaskItemHandler,
62
+ Handlers.TableHandler,
63
+ Handlers.TextHandler,
64
+ Handlers.HorizontalLineHandler,
65
+ Handlers.HTMLBlockHandler,
66
+ Handlers.HTMLInlineHandler,
67
+ Handlers.FootnoteRefHandler
68
+ ];
69
+ listDefaultStrategy.forEach(s => this.strategies.set(s.type, s));
70
+ }
71
+ render(node) {
72
+ const userRenderer = this.options.renderOptions?.elements?.[node.type];
73
+ const children = (node.children || []).map(child => this.render(child));
74
+ if (userRenderer) {
75
+ return userRenderer(node, children);
76
+ }
77
+ const strategy = this.strategies.get(node.type);
78
+ if (strategy) {
79
+ return strategy.render(node, children, this);
80
+ }
81
+ return children.join("");
82
+ }
83
+ renderFootnotes() {
84
+ if (this.footnoteResolver.isResolverValid()) {
85
+ const used = this.footnoteResolver.getUsedRef();
86
+ if (used.length === 0)
87
+ return "";
88
+ const items = used.map((id, i) => {
89
+ const def = this.footnoteResolver.getDef(id) ?? "";
90
+ const idx = i + 1;
91
+ return `<li id="fn:${idx}"><p>${def} <a href="#fnref:${idx}" class="footnote-backref">↩</a></p></li>`;
92
+ });
93
+ return `<section class="footnotes"><ol>${items.join("")}</ol></section>`;
94
+ }
95
+ else
96
+ return "";
97
+ }
98
+ renderTable(node, children) {
99
+ const cls = (0, renderer_utils_1.getClassName)(this, node);
100
+ if (node.type === "Table" && node.rows) {
101
+ const header = node.rows.filter(row => row.isHeader);
102
+ const body = node.rows.filter(row => !row.isHeader);
103
+ const renderRows = (row) => {
104
+ const tag = row.isHeader ? "th" : "td";
105
+ const cells = row.cells.map(cell => {
106
+ const align = `style="text-align:${cell.align}"`;
107
+ return `<${tag} ${align}>${cell.children.map(c => this.render(c)).join("")}</${tag}>`;
108
+ }).join("");
109
+ return `<tr>${cells}</tr>`;
110
+ };
111
+ const tHead = header.length ? `<thead>${header.map(renderRows).join("")}</thead>` : "";
112
+ const tBody = body.length ? `<tbody>${body.map(renderRows).join("")}</tbody>` : "";
113
+ return `<table${cls ? ` class="${cls}"` : ""}>${tHead}${tBody}</table>`;
114
+ }
115
+ else
116
+ return `<p${cls ? ` class="${cls}"` : ""}>${children.join("\n")}</p>`;
117
+ }
118
+ }
119
+ exports.DefaultRenderer = DefaultRenderer;
@@ -0,0 +1,10 @@
1
+ import { ASTNode } from "../types/parser";
2
+ import { MarkdownOptions } from '../types/options/index';
3
+ import { FootnoteResolver } from "../core/resolver/footnote-resolver";
4
+ export interface IRenderer<TOutput> {
5
+ options: MarkdownOptions<TOutput>;
6
+ footnoteResolver: FootnoteResolver;
7
+ render(node: ASTNode): TOutput;
8
+ renderTable(node: ASTNode, children: TOutput[]): TOutput;
9
+ renderFootnotes(): TOutput;
10
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,22 @@
1
+ import { ReactNode } from "react";
2
+ import { RenderStrategy } from "../../types/renderer";
3
+ export declare const DocumentHandler: RenderStrategy<ReactNode>;
4
+ export declare const ParagraphHandler: RenderStrategy<ReactNode>;
5
+ export declare const CodeBlockHandler: RenderStrategy<ReactNode>;
6
+ export declare const HeaderHandler: RenderStrategy<ReactNode>;
7
+ export declare const QuoteHandler: RenderStrategy<ReactNode>;
8
+ export declare const ListHandler: RenderStrategy<ReactNode>;
9
+ export declare const ListItemHandler: RenderStrategy<ReactNode>;
10
+ export declare const TaskItemHandler: RenderStrategy<ReactNode>;
11
+ export declare const BoldHandler: RenderStrategy<ReactNode>;
12
+ export declare const ItalicHandler: RenderStrategy<ReactNode>;
13
+ export declare const StrikethroughHandler: RenderStrategy<ReactNode>;
14
+ export declare const InlineCodeHandler: RenderStrategy<ReactNode>;
15
+ export declare const LinkHandler: RenderStrategy<ReactNode>;
16
+ export declare const ImageHandler: RenderStrategy<ReactNode>;
17
+ export declare const HorizontalLineHandler: RenderStrategy<ReactNode>;
18
+ export declare const TextHandler: RenderStrategy<ReactNode>;
19
+ export declare const TableHandler: RenderStrategy<ReactNode>;
20
+ export declare const HTMLBlockHandler: RenderStrategy<ReactNode>;
21
+ export declare const HTMLInlineHandler: RenderStrategy<ReactNode>;
22
+ export declare const FootnoteRefHandler: RenderStrategy<ReactNode>;
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FootnoteRefHandler = exports.HTMLInlineHandler = exports.HTMLBlockHandler = exports.TableHandler = exports.TextHandler = exports.HorizontalLineHandler = exports.ImageHandler = exports.LinkHandler = exports.InlineCodeHandler = exports.StrikethroughHandler = exports.ItalicHandler = exports.BoldHandler = exports.TaskItemHandler = exports.ListItemHandler = exports.ListHandler = exports.QuoteHandler = exports.HeaderHandler = exports.CodeBlockHandler = exports.ParagraphHandler = exports.DocumentHandler = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const renderer_utils_1 = require("../../utilities/renderer-utils");
9
+ //Base structural nodes
10
+ exports.DocumentHandler = {
11
+ type: "Document",
12
+ render: (node, children, ctx) => react_1.default.createElement(react_1.default.Fragment, null, ...children, ctx.renderFootnotes())
13
+ };
14
+ exports.ParagraphHandler = {
15
+ type: "Paragraph",
16
+ render: (node, children, ctx) => react_1.default.createElement("p", { className: (0, renderer_utils_1.getClassName)(ctx, node) }, ...children)
17
+ };
18
+ //Container nodes
19
+ exports.CodeBlockHandler = {
20
+ type: "CodeBlock",
21
+ render: (node, _children, ctx) => react_1.default.createElement("pre", null, react_1.default.createElement("code", { className: (0, renderer_utils_1.getClassName)(ctx, node, `lang-${node.lang}`) }, node.content || ""))
22
+ };
23
+ exports.HeaderHandler = {
24
+ type: "Header",
25
+ render: (node, children, ctx) => {
26
+ if (!node.level)
27
+ return react_1.default.createElement("p", null, ...children);
28
+ return react_1.default.createElement(`h${node.level}`, {
29
+ className: (0, renderer_utils_1.getClassName)(ctx, node),
30
+ style: { borderBottom: node.level <= 2 ? "1px solid #d1d9e0b3" : undefined }
31
+ }, ...children);
32
+ }
33
+ };
34
+ exports.QuoteHandler = {
35
+ type: "Quote",
36
+ render: (node, children, ctx) => react_1.default.createElement("blockquote", {
37
+ className: (0, renderer_utils_1.getClassName)(ctx, node),
38
+ style: { margin: "0", padding: "0 1em", color: "#59636e", borderLeft: ".25em solid #d1d9e0" }
39
+ }, ...children)
40
+ };
41
+ //For list nodes
42
+ exports.ListHandler = {
43
+ type: "List",
44
+ render: (node, children, ctx) => react_1.default.createElement(node.ordered ? "ol" : "ul", { className: (0, renderer_utils_1.getClassName)(ctx, node), }, ...children)
45
+ };
46
+ exports.ListItemHandler = {
47
+ type: "ListItem",
48
+ render: (node, children, ctx) => react_1.default.createElement("li", { className: (0, renderer_utils_1.getClassName)(ctx, node), }, ...children)
49
+ };
50
+ exports.TaskItemHandler = {
51
+ type: "TaskItem",
52
+ render: (node, children, ctx) => react_1.default.createElement("li", {
53
+ className: (0, renderer_utils_1.getClassName)(ctx, node),
54
+ style: { listStyleType: "none" }
55
+ }, react_1.default.createElement("input", {
56
+ type: "checkbox",
57
+ disabled: true,
58
+ checked: !!node.checked,
59
+ readOnly: true
60
+ }), ...children)
61
+ };
62
+ //Styling nodes
63
+ exports.BoldHandler = {
64
+ type: "Bold",
65
+ render: (node, children, ctx) => react_1.default.createElement("strong", { className: (0, renderer_utils_1.getClassName)(ctx, node), }, ...children)
66
+ };
67
+ exports.ItalicHandler = {
68
+ type: "Italic",
69
+ render: (node, children, ctx) => react_1.default.createElement("em", { className: (0, renderer_utils_1.getClassName)(ctx, node), }, ...children)
70
+ };
71
+ exports.StrikethroughHandler = {
72
+ type: "Strikethrough",
73
+ render: (node, children, ctx) => react_1.default.createElement("s", { className: (0, renderer_utils_1.getClassName)(ctx, node), }, ...children)
74
+ };
75
+ exports.InlineCodeHandler = {
76
+ type: "InlineCode",
77
+ render: (node, _children, ctx) => react_1.default.createElement("code", { className: (0, renderer_utils_1.getClassName)(ctx, node), }, node.content || "")
78
+ };
79
+ //Media nodes
80
+ exports.LinkHandler = {
81
+ type: "Link",
82
+ render: (node, _children, ctx) => react_1.default.createElement("a", {
83
+ className: (0, renderer_utils_1.getClassName)(ctx, node),
84
+ href: node.href, target: "_blank", rel: "noopener"
85
+ }, node.text)
86
+ };
87
+ exports.ImageHandler = {
88
+ type: "Image",
89
+ render: (node, _children, ctx) => react_1.default.createElement("img", {
90
+ className: (0, renderer_utils_1.getClassName)(ctx, node),
91
+ src: node.src || "",
92
+ alt: node.alt || ""
93
+ })
94
+ };
95
+ //Leaf nodes
96
+ exports.HorizontalLineHandler = {
97
+ type: "HorizontalLine",
98
+ render: (node, _children, ctx) => react_1.default.createElement("hr", { className: (0, renderer_utils_1.getClassName)(ctx, node), })
99
+ };
100
+ exports.TextHandler = {
101
+ type: "Text",
102
+ render: (node) => node.value || ""
103
+ };
104
+ //Table nodes
105
+ exports.TableHandler = {
106
+ type: "Table",
107
+ render: (node, children, ctx) => ctx.renderTable(node, children)
108
+ };
109
+ //For HTML
110
+ exports.HTMLBlockHandler = {
111
+ type: "HTMLBlock",
112
+ render: (node, _children, ctx) => {
113
+ const val = node.value || "";
114
+ return ctx.options.converterOptions?.allowDangerousHtml
115
+ ? react_1.default.createElement("div", { className: (0, renderer_utils_1.getClassName)(ctx, node), dangerouslySetInnerHTML: { __html: val } })
116
+ : react_1.default.createElement("code", { className: (0, renderer_utils_1.getClassName)(ctx, node), }, val);
117
+ }
118
+ };
119
+ exports.HTMLInlineHandler = {
120
+ type: "HTMLInline",
121
+ render: (node, _children, ctx) => {
122
+ const val = node.value || "";
123
+ return ctx.options.converterOptions?.allowDangerousHtml
124
+ ? react_1.default.createElement("span", { className: (0, renderer_utils_1.getClassName)(ctx, node), dangerouslySetInnerHTML: { __html: val } })
125
+ : react_1.default.createElement("code", { className: (0, renderer_utils_1.getClassName)(ctx, node), }, val);
126
+ }
127
+ };
128
+ //For footnote
129
+ exports.FootnoteRefHandler = {
130
+ type: "FootnoteRef",
131
+ render: (node, _children, ctx) => {
132
+ if (!node.id)
133
+ return null;
134
+ const idx = ctx.footnoteResolver.getUsedRefById(node.id);
135
+ return react_1.default.createElement("sup", { id: `fnref:${idx}` }, react_1.default.createElement("a", {
136
+ className: (0, renderer_utils_1.getClassName)(ctx, node, "footnote-ref"),
137
+ href: `#fn:${idx}`,
138
+ }, `[${idx}]`));
139
+ }
140
+ };
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import { IRenderer } from "..";
3
+ import { MarkdownOptions } from "../../types/options";
4
+ import { ASTNode } from "../../types/parser";
5
+ import { FootnoteResolver } from "../../core/resolver/footnote-resolver";
6
+ export declare class ReactRenderer implements IRenderer<React.ReactNode> {
7
+ options: MarkdownOptions<React.ReactNode>;
8
+ footnoteResolver: FootnoteResolver;
9
+ private strategies;
10
+ constructor(footnoteResolver: FootnoteResolver, options?: MarkdownOptions<React.ReactNode>);
11
+ private registerDefaultStrategies;
12
+ render(node: ASTNode): React.ReactNode;
13
+ renderFootnotes(): React.ReactNode;
14
+ renderTable(node: ASTNode, children: React.ReactNode[]): React.ReactNode;
15
+ }
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.ReactRenderer = void 0;
40
+ const react_1 = __importDefault(require("react"));
41
+ const Handlers = __importStar(require("./handler"));
42
+ const renderer_utils_1 = require("../../utilities/renderer-utils");
43
+ class ReactRenderer {
44
+ constructor(footnoteResolver, options = {}) {
45
+ this.strategies = new Map();
46
+ this.footnoteResolver = footnoteResolver;
47
+ this.options = options;
48
+ this.registerDefaultStrategies();
49
+ }
50
+ registerDefaultStrategies() {
51
+ const listDefaultStrategy = [
52
+ Handlers.DocumentHandler,
53
+ Handlers.ParagraphHandler,
54
+ Handlers.HeaderHandler,
55
+ Handlers.CodeBlockHandler,
56
+ Handlers.QuoteHandler,
57
+ Handlers.BoldHandler,
58
+ Handlers.ItalicHandler,
59
+ Handlers.StrikethroughHandler,
60
+ Handlers.InlineCodeHandler,
61
+ Handlers.LinkHandler,
62
+ Handlers.ImageHandler,
63
+ Handlers.ListHandler,
64
+ Handlers.ListItemHandler,
65
+ Handlers.TaskItemHandler,
66
+ Handlers.TableHandler,
67
+ Handlers.TextHandler,
68
+ Handlers.HorizontalLineHandler,
69
+ Handlers.HTMLBlockHandler,
70
+ Handlers.HTMLInlineHandler,
71
+ Handlers.FootnoteRefHandler
72
+ ];
73
+ listDefaultStrategy.forEach(s => this.strategies.set(s.type, s));
74
+ }
75
+ render(node) {
76
+ const userRenderer = this.options.renderOptions?.elements?.[node.type];
77
+ const children = (node.children || []).map(child => this.render(child));
78
+ if (userRenderer) {
79
+ return userRenderer(node, children);
80
+ }
81
+ const strategy = this.strategies.get(node.type);
82
+ if (strategy) {
83
+ return strategy.render(node, children, this);
84
+ }
85
+ return children.join("");
86
+ }
87
+ renderFootnotes() {
88
+ if (this.footnoteResolver.isResolverValid()) {
89
+ const used = this.footnoteResolver.getUsedRef();
90
+ if (used.length === 0)
91
+ return null;
92
+ const items = used.map((id, i) => {
93
+ const def = this.footnoteResolver.getDef(id) ?? "";
94
+ const idx = i + 1;
95
+ return react_1.default.createElement("li", { id: `fn:${idx}` }, react_1.default.createElement("p", null, def + " ", react_1.default.createElement("a", { href: `#fnref:${idx}`, className: "footnote-backref" }, "↩")));
96
+ });
97
+ return react_1.default.createElement("section", { className: "footnotes" }, react_1.default.createElement("ol", null, ...items));
98
+ }
99
+ else
100
+ return null;
101
+ }
102
+ renderTable(node, children) {
103
+ if (node.type === "Table" && node.rows) {
104
+ const header = node.rows.filter(row => row.isHeader);
105
+ const body = node.rows.filter(row => !row.isHeader);
106
+ const renderRows = (row, rowIndex) => {
107
+ return react_1.default.createElement("tr", { key: rowIndex }, row.cells.map((cell, cellIndex) => {
108
+ const tag = row.isHeader ? "th" : "td";
109
+ return react_1.default.createElement(tag, { key: cellIndex, style: { textAlign: cell.align } }, ...cell.children.map(c => this.render(c)));
110
+ }));
111
+ };
112
+ const tHead = header.length
113
+ ? react_1.default.createElement("thead", null, header.map((row, i) => renderRows(row, i)))
114
+ : null;
115
+ const tBody = body.length
116
+ ? react_1.default.createElement("tbody", null, body.map((row, i) => renderRows(row, i)))
117
+ : null;
118
+ return react_1.default.createElement("table", { className: (0, renderer_utils_1.getClassName)(this, node), }, tHead, tBody);
119
+ }
120
+ else
121
+ return react_1.default.createElement("p", { className: (0, renderer_utils_1.getClassName)(this, node), }, ...children);
122
+ }
123
+ }
124
+ exports.ReactRenderer = ReactRenderer;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * General option for the render process,
2
+ * General option for the render process.
3
3
  * These rules define high-level behavior for render process.
4
4
  */
5
5
  export type ConvertOption = {
@@ -1,17 +1,10 @@
1
1
  import { ConvertOption } from "./converterOptions";
2
- import { ReactRenderOption } from "./reactRenderOptions";
3
- import { RenderOption } from "./renderOptions";
2
+ import { RenderOption } from './renderOptions';
4
3
  /**
5
4
  * General option for rendering Markdown into HTML strings
5
+ * @template TOutput - Output type after rendered
6
6
  */
7
- export type MarkdownDefaultOptions = {
8
- renderOptions?: RenderOption;
7
+ export interface MarkdownOptions<TOutput> {
8
+ renderOptions?: RenderOption<TOutput>;
9
9
  converterOptions?: ConvertOption;
10
- };
11
- /**
12
- * General option for rendering Markdown into `React.ReactNode` elements
13
- */
14
- export type MarkdownReactOptions = {
15
- renderOptions?: ReactRenderOption;
16
- converterOptions?: ConvertOption;
17
- };
10
+ }