simple-customize-markdown-converter 1.1.0 → 1.2.0
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/core/lexer/handler.d.ts +23 -0
- package/dist/core/lexer/handler.js +272 -0
- package/dist/core/lexer/index.d.ts +42 -0
- package/dist/core/lexer/index.js +177 -0
- package/dist/core/parser/handler.d.ts +19 -0
- package/dist/core/parser/handler.js +254 -0
- package/dist/core/parser/index.d.ts +33 -0
- package/dist/core/parser/index.js +149 -0
- package/dist/core/resolver/footnote-resolver.d.ts +15 -0
- package/dist/core/resolver/footnote-resolver.js +36 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.js +4 -4
- package/dist/react.d.ts +3 -6
- package/dist/react.js +5 -5
- package/dist/renderers/default/handler.d.ts +21 -0
- package/dist/renderers/default/handler.js +114 -0
- package/dist/renderers/default/index.d.ts +14 -0
- package/dist/renderers/default/index.js +117 -0
- package/dist/renderers/index.d.ts +10 -0
- package/dist/renderers/index.js +2 -0
- package/dist/renderers/react/handler.d.ts +22 -0
- package/dist/renderers/react/handler.js +123 -0
- package/dist/renderers/react/index.d.ts +15 -0
- package/dist/renderers/react/index.js +123 -0
- package/dist/types/options/converterOptions.d.ts +1 -1
- package/dist/types/options/index.d.ts +5 -12
- package/dist/types/options/renderOptions.d.ts +63 -21
- package/dist/types/parser.d.ts +132 -0
- package/dist/types/parser.js +2 -0
- package/dist/types/renderer.d.ts +12 -0
- package/dist/types/renderer.js +2 -0
- package/dist/types/token.d.ts +94 -74
- package/dist/utilities/parser-utils.d.ts +5 -0
- package/dist/utilities/parser-utils.js +65 -0
- package/dist/utilities/tokenizer-utils.d.ts +11 -0
- package/dist/utilities/tokenizer-utils.js +159 -0
- package/package.json +5 -3
|
@@ -0,0 +1,254 @@
|
|
|
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.TableHandler = exports.StrikethroughHandler = exports.QuoteHandler = exports.NewLineHandler = exports.ListHandler = exports.LinkHandler = exports.ItalicHandler = exports.InlineHandler = exports.ImageHandler = exports.HtmlInlineHandler = exports.HtmlBlockHandler = exports.HorizontalLineHandler = exports.HeaderHandler = exports.FootnoteRefHandler = exports.FootnoteDefHandler = exports.CodeBlockHandler = exports.BoldHandler = void 0;
|
|
37
|
+
const utils = __importStar(require("../../utilities/parser-utils"));
|
|
38
|
+
const CodeBlockHandler = {
|
|
39
|
+
type: "CodeBlock",
|
|
40
|
+
execute: (parser, _token) => {
|
|
41
|
+
const tok = parser.peek(0);
|
|
42
|
+
parser.next(1);
|
|
43
|
+
return {
|
|
44
|
+
type: "CodeBlock",
|
|
45
|
+
lang: tok?.type === "CodeBlock" ? tok.lang : "",
|
|
46
|
+
content: tok?.type === "CodeBlock" ? tok.content : ""
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
exports.CodeBlockHandler = CodeBlockHandler;
|
|
51
|
+
const HeaderHandler = {
|
|
52
|
+
type: "Header",
|
|
53
|
+
execute: (parser, _token) => {
|
|
54
|
+
const currentNode = parser.peek(0);
|
|
55
|
+
parser.next(1);
|
|
56
|
+
return {
|
|
57
|
+
type: "Header",
|
|
58
|
+
level: currentNode?.type === "Header" ? currentNode.level : 1,
|
|
59
|
+
children: parser.parseInlineUntil("NewLine", true) //Temp
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
exports.HeaderHandler = HeaderHandler;
|
|
64
|
+
const BoldHandler = {
|
|
65
|
+
type: "Bold",
|
|
66
|
+
execute: (parser, _token) => {
|
|
67
|
+
parser.next(1); // skip marker
|
|
68
|
+
return { type: "Bold", children: parser.parseInlineUntil("Bold", true) };
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
exports.BoldHandler = BoldHandler;
|
|
72
|
+
const ItalicHandler = {
|
|
73
|
+
type: "Italic",
|
|
74
|
+
execute: (parser, _token) => {
|
|
75
|
+
parser.next(1); // skip marker
|
|
76
|
+
return { type: "Italic", children: parser.parseInlineUntil("Italic", true) };
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
exports.ItalicHandler = ItalicHandler;
|
|
80
|
+
const StrikethroughHandler = {
|
|
81
|
+
type: "Strikethrough",
|
|
82
|
+
execute: (parser, _token) => {
|
|
83
|
+
parser.next(1); // skip marker
|
|
84
|
+
return { type: "Strikethrough", children: parser.parseInlineUntil("Strikethrough", true) };
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
exports.StrikethroughHandler = StrikethroughHandler;
|
|
88
|
+
const InlineHandler = {
|
|
89
|
+
type: "InlineCode",
|
|
90
|
+
execute: (parser, _token) => {
|
|
91
|
+
const tok = parser.peek(0);
|
|
92
|
+
parser.next(1);
|
|
93
|
+
return {
|
|
94
|
+
type: "InlineCode",
|
|
95
|
+
content: tok?.type === "InlineCode" ? tok.content : ""
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
exports.InlineHandler = InlineHandler;
|
|
100
|
+
const QuoteHandler = {
|
|
101
|
+
type: "Quote",
|
|
102
|
+
execute: (parser, _token) => {
|
|
103
|
+
parser.next(1); //skip marker
|
|
104
|
+
return { type: "Quote", children: [{ type: "Paragraph", children: parser.parseInlineUntil("NewLine", true) }] };
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
exports.QuoteHandler = QuoteHandler;
|
|
108
|
+
const ListHandler = {
|
|
109
|
+
type: "ListStart",
|
|
110
|
+
execute: (parser, _token) => utils.parseList(parser)
|
|
111
|
+
};
|
|
112
|
+
exports.ListHandler = ListHandler;
|
|
113
|
+
const LinkHandler = {
|
|
114
|
+
type: "Link",
|
|
115
|
+
execute: (parser, _token) => {
|
|
116
|
+
const tok = parser.peek(0);
|
|
117
|
+
parser.next(1);
|
|
118
|
+
if (tok?.type === "Link") {
|
|
119
|
+
return {
|
|
120
|
+
type: "Link",
|
|
121
|
+
href: tok.href,
|
|
122
|
+
text: tok.text
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return { type: "Link", href: "", text: "" };
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
exports.LinkHandler = LinkHandler;
|
|
129
|
+
const ImageHandler = {
|
|
130
|
+
type: "Image",
|
|
131
|
+
execute: (parser, _token) => {
|
|
132
|
+
const tok = parser.peek(0);
|
|
133
|
+
parser.next(1);
|
|
134
|
+
if (tok?.type === "Image") {
|
|
135
|
+
return {
|
|
136
|
+
type: "Image",
|
|
137
|
+
src: tok.src,
|
|
138
|
+
alt: tok.alt
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
else
|
|
142
|
+
return { type: "Image", src: "", alt: "" };
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
exports.ImageHandler = ImageHandler;
|
|
146
|
+
const TableHandler = {
|
|
147
|
+
type: "TableStart",
|
|
148
|
+
execute: (parser, _token) => {
|
|
149
|
+
parser.next(1); // skip TableStart token
|
|
150
|
+
const parseRow = () => {
|
|
151
|
+
const rowStartToken = parser.peek(0);
|
|
152
|
+
if (rowStartToken?.type !== "RowStart")
|
|
153
|
+
return { isHeader: false, cells: [] };
|
|
154
|
+
parser.next(1); // skip RowStart token
|
|
155
|
+
const cells = [];
|
|
156
|
+
while (parser.peek(0) && parser.peek(0).type !== "RowEnd") {
|
|
157
|
+
cells.push(parseCell());
|
|
158
|
+
}
|
|
159
|
+
parser.next(1); // skip RowEnd token
|
|
160
|
+
return {
|
|
161
|
+
isHeader: rowStartToken.isHeader,
|
|
162
|
+
cells: cells
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
const parseCell = () => {
|
|
166
|
+
const cellStartToken = parser.peek(0);
|
|
167
|
+
if (cellStartToken?.type !== "CellStart") {
|
|
168
|
+
return { align: "left", children: [] };
|
|
169
|
+
}
|
|
170
|
+
parser.next(1); // skip CellStart token
|
|
171
|
+
const childrens = parser.parseInlineUntil("CellEnd", true);
|
|
172
|
+
return {
|
|
173
|
+
align: cellStartToken.align || "left",
|
|
174
|
+
children: childrens
|
|
175
|
+
};
|
|
176
|
+
};
|
|
177
|
+
const rows = [];
|
|
178
|
+
while (parser.peek(0)?.type !== "TableEnd") {
|
|
179
|
+
rows.push(parseRow());
|
|
180
|
+
if (parser.isEnd())
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
parser.next(1);
|
|
184
|
+
return {
|
|
185
|
+
type: "Table",
|
|
186
|
+
rows: rows
|
|
187
|
+
};
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
exports.TableHandler = TableHandler;
|
|
191
|
+
const HtmlBlockHandler = {
|
|
192
|
+
type: "HTMLBlock",
|
|
193
|
+
execute: (parser, _token) => {
|
|
194
|
+
const tok = parser.peek(0);
|
|
195
|
+
parser.next(1); // skip marker
|
|
196
|
+
if (tok?.type === "HTMLBlock") {
|
|
197
|
+
return { type: "HTMLBlock", value: tok.value };
|
|
198
|
+
}
|
|
199
|
+
else
|
|
200
|
+
return { type: "Text", value: "" };
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
exports.HtmlBlockHandler = HtmlBlockHandler;
|
|
204
|
+
const HtmlInlineHandler = {
|
|
205
|
+
type: "HTMLInline",
|
|
206
|
+
execute: (parser, _token) => {
|
|
207
|
+
const tok = parser.peek(0);
|
|
208
|
+
parser.next(1); // skip marker
|
|
209
|
+
if (tok?.type === "HTMLInline") {
|
|
210
|
+
return { type: "HTMLInline", value: tok.value };
|
|
211
|
+
}
|
|
212
|
+
else
|
|
213
|
+
return { type: "Text", value: "" };
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
exports.HtmlInlineHandler = HtmlInlineHandler;
|
|
217
|
+
const HorizontalLineHandler = {
|
|
218
|
+
type: "HorizontalLine",
|
|
219
|
+
execute: (parser, _token) => {
|
|
220
|
+
parser.next(1); // skip marker
|
|
221
|
+
return { type: "HorizontalLine" };
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
exports.HorizontalLineHandler = HorizontalLineHandler;
|
|
225
|
+
const FootnoteDefHandler = {
|
|
226
|
+
type: "FootnoteDef",
|
|
227
|
+
execute: (parser, _token) => {
|
|
228
|
+
const tok = parser.peek(0);
|
|
229
|
+
if (tok?.type === "FootnoteDef" && tok.id) {
|
|
230
|
+
parser.footNoteResolver.addDef(tok.id, tok.content || "");
|
|
231
|
+
}
|
|
232
|
+
parser.next(1);
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
exports.FootnoteDefHandler = FootnoteDefHandler;
|
|
236
|
+
const FootnoteRefHandler = {
|
|
237
|
+
type: "FootnoteRef",
|
|
238
|
+
execute: (parser, _token) => {
|
|
239
|
+
const tok = parser.peek(0);
|
|
240
|
+
parser.next(1);
|
|
241
|
+
if (tok?.type !== "FootnoteRef" || !tok.id)
|
|
242
|
+
return { type: "Text", value: "" };
|
|
243
|
+
parser.footNoteResolver.addUsedRef(tok.id);
|
|
244
|
+
return { type: "FootnoteRef", id: tok.id };
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
exports.FootnoteRefHandler = FootnoteRefHandler;
|
|
248
|
+
const NewLineHandler = {
|
|
249
|
+
type: "NewLine",
|
|
250
|
+
execute: (parser, _token) => {
|
|
251
|
+
parser.next(1);
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
exports.NewLineHandler = NewLineHandler;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ASTNode } from '../../types/parser';
|
|
2
|
+
import { Token } from '../../types/token';
|
|
3
|
+
import { FootnoteResolver } from '../resolver/footnote-resolver';
|
|
4
|
+
export interface IParser {
|
|
5
|
+
listToken: Token[];
|
|
6
|
+
pos: number;
|
|
7
|
+
footNoteResolver: FootnoteResolver;
|
|
8
|
+
peek(offset: number): Token | null;
|
|
9
|
+
next(amount: number): void;
|
|
10
|
+
isEnd(): boolean;
|
|
11
|
+
parseBlocks(): ASTNode[];
|
|
12
|
+
parseInlineUntil(stopType: Token["type"] | Token["type"][], isConsumeStopToken: boolean): ASTNode[];
|
|
13
|
+
}
|
|
14
|
+
export declare class Parser implements IParser {
|
|
15
|
+
listToken: Token[];
|
|
16
|
+
pos: number;
|
|
17
|
+
footNoteResolver: FootnoteResolver;
|
|
18
|
+
private inlineStrategies;
|
|
19
|
+
private blockStrategies;
|
|
20
|
+
constructor(listToken: Token[], footNoteResolver: FootnoteResolver);
|
|
21
|
+
peek(offset?: number): Token | null;
|
|
22
|
+
next(amount?: number): void;
|
|
23
|
+
isEnd(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Parse a list token to a node
|
|
26
|
+
* @return A parsed abstract syntax tree (AST)
|
|
27
|
+
*/
|
|
28
|
+
parse(): ASTNode;
|
|
29
|
+
parseBlocks(): ASTNode[];
|
|
30
|
+
parseInlineUntil(stopType: Token["type"] | Token["type"][], isConsumeStopToken?: boolean): ASTNode[];
|
|
31
|
+
private parseParagraph;
|
|
32
|
+
private parseText;
|
|
33
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
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.Parser = void 0;
|
|
37
|
+
const Handler = __importStar(require("./handler"));
|
|
38
|
+
class Parser {
|
|
39
|
+
constructor(listToken, footNoteResolver) {
|
|
40
|
+
this.pos = 0;
|
|
41
|
+
this.listToken = listToken;
|
|
42
|
+
this.footNoteResolver = footNoteResolver;
|
|
43
|
+
this.blockStrategies = new Map([
|
|
44
|
+
Handler.HeaderHandler,
|
|
45
|
+
Handler.CodeBlockHandler,
|
|
46
|
+
Handler.QuoteHandler,
|
|
47
|
+
Handler.ImageHandler,
|
|
48
|
+
Handler.HorizontalLineHandler,
|
|
49
|
+
Handler.ListHandler,
|
|
50
|
+
Handler.TableHandler,
|
|
51
|
+
Handler.HtmlBlockHandler,
|
|
52
|
+
Handler.FootnoteDefHandler,
|
|
53
|
+
Handler.NewLineHandler
|
|
54
|
+
].map(ele => [ele.type, ele]));
|
|
55
|
+
this.inlineStrategies = new Map([
|
|
56
|
+
Handler.BoldHandler,
|
|
57
|
+
Handler.ItalicHandler,
|
|
58
|
+
Handler.StrikethroughHandler,
|
|
59
|
+
Handler.InlineHandler,
|
|
60
|
+
Handler.LinkHandler,
|
|
61
|
+
Handler.HtmlInlineHandler,
|
|
62
|
+
Handler.FootnoteRefHandler,
|
|
63
|
+
].map(ele => [ele.type, ele]));
|
|
64
|
+
}
|
|
65
|
+
peek(offset = 0) {
|
|
66
|
+
const i = this.pos + offset;
|
|
67
|
+
return i < this.listToken.length ? this.listToken[i] : null;
|
|
68
|
+
}
|
|
69
|
+
next(amount = 1) {
|
|
70
|
+
this.pos += amount;
|
|
71
|
+
}
|
|
72
|
+
isEnd() {
|
|
73
|
+
return this.peek()?.type === "EOF";
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parse a list token to a node
|
|
77
|
+
* @return A parsed abstract syntax tree (AST)
|
|
78
|
+
*/
|
|
79
|
+
parse() {
|
|
80
|
+
return {
|
|
81
|
+
type: "Document",
|
|
82
|
+
children: this.parseBlocks()
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
parseBlocks() {
|
|
86
|
+
const listNode = [];
|
|
87
|
+
while (!this.isEnd()) {
|
|
88
|
+
const token = this.peek();
|
|
89
|
+
if (!token)
|
|
90
|
+
break;
|
|
91
|
+
const strategy = this.blockStrategies.get(token?.type || "");
|
|
92
|
+
if (strategy) {
|
|
93
|
+
const result = strategy.execute(this, token);
|
|
94
|
+
if (result)
|
|
95
|
+
listNode.push(result);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
//Fallback to Paragraph node
|
|
99
|
+
const pNode = this.parseParagraph();
|
|
100
|
+
if (pNode.children && pNode.children.length > 0) {
|
|
101
|
+
listNode.push(pNode);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.next();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return listNode;
|
|
109
|
+
}
|
|
110
|
+
parseInlineUntil(stopType, isConsumeStopToken = false) {
|
|
111
|
+
const stop = Array.isArray(stopType) ? stopType : [stopType];
|
|
112
|
+
const nodes = [];
|
|
113
|
+
while (!this.isEnd()) {
|
|
114
|
+
const currentNode = this.peek();
|
|
115
|
+
if (!currentNode || stop.includes(currentNode.type))
|
|
116
|
+
break;
|
|
117
|
+
if (this.blockStrategies.get(currentNode.type)) {
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
const strategy = this.inlineStrategies.get(currentNode.type);
|
|
121
|
+
if (strategy) {
|
|
122
|
+
const result = strategy.execute(this, currentNode);
|
|
123
|
+
if (result)
|
|
124
|
+
nodes.push(result);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
//Fallback to Text node
|
|
128
|
+
nodes.push(this.parseText(currentNode));
|
|
129
|
+
this.next();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (isConsumeStopToken)
|
|
133
|
+
this.next(); //Skip stop token
|
|
134
|
+
return nodes;
|
|
135
|
+
}
|
|
136
|
+
parseParagraph() {
|
|
137
|
+
return {
|
|
138
|
+
type: "Paragraph",
|
|
139
|
+
children: this.parseInlineUntil("NewLine", true)
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
parseText(currentNode) {
|
|
143
|
+
return {
|
|
144
|
+
type: "Text",
|
|
145
|
+
value: currentNode.value || ""
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.Parser = Parser;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare abstract class Resolver {
|
|
2
|
+
abstract isResolverValid(): boolean;
|
|
3
|
+
}
|
|
4
|
+
export declare class FootnoteResolver extends Resolver {
|
|
5
|
+
private defs;
|
|
6
|
+
private usedRef;
|
|
7
|
+
addDef(id: string, content: string): void;
|
|
8
|
+
addUsedRef(id: string): void;
|
|
9
|
+
resolve(id: string): string | undefined;
|
|
10
|
+
getUsedRef(): string[];
|
|
11
|
+
getUsedRefById(id: string): number;
|
|
12
|
+
getDef(id: string): string | undefined;
|
|
13
|
+
isResolverValid(): boolean;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FootnoteResolver = void 0;
|
|
4
|
+
class Resolver {
|
|
5
|
+
}
|
|
6
|
+
class FootnoteResolver extends Resolver {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
this.defs = new Map();
|
|
10
|
+
this.usedRef = [];
|
|
11
|
+
}
|
|
12
|
+
addDef(id, content) {
|
|
13
|
+
this.defs.set(id, content);
|
|
14
|
+
}
|
|
15
|
+
addUsedRef(id) {
|
|
16
|
+
if (!this.usedRef.includes(id)) {
|
|
17
|
+
this.usedRef.push(id);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
resolve(id) {
|
|
21
|
+
return this.defs.get(id);
|
|
22
|
+
}
|
|
23
|
+
getUsedRef() {
|
|
24
|
+
return this.usedRef;
|
|
25
|
+
}
|
|
26
|
+
getUsedRefById(id) {
|
|
27
|
+
return this.usedRef.indexOf(id) + 1;
|
|
28
|
+
}
|
|
29
|
+
getDef(id) {
|
|
30
|
+
return this.defs.get(id);
|
|
31
|
+
}
|
|
32
|
+
isResolverValid() {
|
|
33
|
+
return this.defs.size !== 0 && this.usedRef.length !== 0;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.FootnoteResolver = FootnoteResolver;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import { MarkdownOptions } from "./types/options";
|
|
2
|
+
import { Token, TokenizerStrategy } from './types/token';
|
|
3
|
+
import { ASTNode, ParsingStrategy } from './types/parser';
|
|
4
|
+
import { RenderStrategy } from './types/renderer';
|
|
5
|
+
export { MarkdownOptions, Token, TokenizerStrategy, ASTNode, ParsingStrategy, RenderStrategy };
|
|
5
6
|
/**
|
|
6
7
|
* Convert a Markdown string into HTML.
|
|
7
8
|
* @param input - The Markdown source string
|
|
@@ -14,4 +15,4 @@ export { RenderOption, MarkdownDefaultOptions, Node };
|
|
|
14
15
|
* // => <p>Hello <strong>world</strong></p>
|
|
15
16
|
* ```
|
|
16
17
|
*/
|
|
17
|
-
export declare function convertMarkdownToHTML(input: string, options?:
|
|
18
|
+
export declare function convertMarkdownToHTML(input: string, options?: MarkdownOptions<string>): string;
|
package/dist/index.js
CHANGED
|
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.convertMarkdownToHTML = convertMarkdownToHTML;
|
|
7
7
|
const lexer_1 = __importDefault(require("./core/lexer"));
|
|
8
8
|
const parser_1 = require("./core/parser");
|
|
9
|
-
const
|
|
10
|
-
const default_1 =
|
|
9
|
+
const footnote_resolver_1 = require("./core/resolver/footnote-resolver");
|
|
10
|
+
const default_1 = require("./renderers/default");
|
|
11
11
|
/**
|
|
12
12
|
* Convert a Markdown string into HTML.
|
|
13
13
|
* @param input - The Markdown source string
|
|
@@ -25,7 +25,7 @@ function convertMarkdownToHTML(input, options = {
|
|
|
25
25
|
converterOptions: { allowDangerousHtml: false }
|
|
26
26
|
}) {
|
|
27
27
|
const tokens = new lexer_1.default(input).tokenize();
|
|
28
|
-
const footNoteResolver = new
|
|
28
|
+
const footNoteResolver = new footnote_resolver_1.FootnoteResolver();
|
|
29
29
|
const nodes = new parser_1.Parser(tokens, footNoteResolver).parse();
|
|
30
|
-
return new default_1.
|
|
30
|
+
return new default_1.DefaultRenderer(footNoteResolver, options).render(nodes);
|
|
31
31
|
}
|
package/dist/react.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
import { MarkdownReactOptions } from "./types/options";
|
|
4
|
-
import { Node } from "./types/node";
|
|
5
|
-
export { MarkdownReactOptions, ReactRenderOption, Node };
|
|
2
|
+
import { MarkdownOptions } from "./types/options";
|
|
6
3
|
/**
|
|
7
4
|
* Convert a Markdown string into a ReactNode.
|
|
8
5
|
* @param input - The Markdown source string
|
|
@@ -16,7 +13,7 @@ export { MarkdownReactOptions, ReactRenderOption, Node };
|
|
|
16
13
|
* return <div>{node}</div>;
|
|
17
14
|
* ```
|
|
18
15
|
*/
|
|
19
|
-
export declare function convertMarkdownToReactNode(input: string, options?:
|
|
16
|
+
export declare function convertMarkdownToReactNode(input: string, options?: MarkdownOptions<React.ReactNode>): React.ReactNode;
|
|
20
17
|
/**
|
|
21
18
|
* A React commponent that renders Markdown content.
|
|
22
19
|
* Using `React.useMemo` to ensure performance and prevent unnecessary re-render.
|
|
@@ -34,6 +31,6 @@ export declare function convertMarkdownToReactNode(input: string, options?: Mark
|
|
|
34
31
|
*/
|
|
35
32
|
export declare const MarkdownComponent: React.FC<{
|
|
36
33
|
content: string;
|
|
37
|
-
options?:
|
|
34
|
+
options?: MarkdownOptions<React.ReactNode>;
|
|
38
35
|
className?: string;
|
|
39
36
|
}>;
|
package/dist/react.js
CHANGED
|
@@ -7,9 +7,9 @@ exports.MarkdownComponent = void 0;
|
|
|
7
7
|
exports.convertMarkdownToReactNode = convertMarkdownToReactNode;
|
|
8
8
|
const react_1 = __importDefault(require("react"));
|
|
9
9
|
const lexer_1 = __importDefault(require("./core/lexer"));
|
|
10
|
-
const resolver_1 = require("./core/resolver");
|
|
11
10
|
const parser_1 = require("./core/parser");
|
|
12
|
-
const
|
|
11
|
+
const footnote_resolver_1 = require("./core/resolver/footnote-resolver");
|
|
12
|
+
const react_2 = require("./renderers/react");
|
|
13
13
|
/**
|
|
14
14
|
* Convert a Markdown string into a ReactNode.
|
|
15
15
|
* @param input - The Markdown source string
|
|
@@ -28,9 +28,9 @@ function convertMarkdownToReactNode(input, options = {
|
|
|
28
28
|
converterOptions: { allowDangerousHtml: false }
|
|
29
29
|
}) {
|
|
30
30
|
const tokens = new lexer_1.default(input).tokenize();
|
|
31
|
-
const footNoteResolver = new
|
|
31
|
+
const footNoteResolver = new footnote_resolver_1.FootnoteResolver();
|
|
32
32
|
const nodes = new parser_1.Parser(tokens, footNoteResolver).parse();
|
|
33
|
-
return new react_2.
|
|
33
|
+
return new react_2.ReactRenderer(footNoteResolver, options).render(nodes);
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
36
|
* A React commponent that renders Markdown content.
|
|
@@ -50,7 +50,7 @@ function convertMarkdownToReactNode(input, options = {
|
|
|
50
50
|
const MarkdownComponent = ({ content, className, options }) => {
|
|
51
51
|
const rendered = react_1.default.useMemo(() => {
|
|
52
52
|
return convertMarkdownToReactNode(content, options);
|
|
53
|
-
}, [content
|
|
53
|
+
}, [content]);
|
|
54
54
|
return react_1.default.createElement("div", { className }, rendered);
|
|
55
55
|
};
|
|
56
56
|
exports.MarkdownComponent = MarkdownComponent;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RenderStrategy } from "../../types/renderer";
|
|
2
|
+
export declare const DocumentHandler: RenderStrategy<string>;
|
|
3
|
+
export declare const ParagraphHandler: RenderStrategy<string>;
|
|
4
|
+
export declare const CodeBlockHandler: RenderStrategy<string>;
|
|
5
|
+
export declare const HeaderHandler: RenderStrategy<string>;
|
|
6
|
+
export declare const QuoteHandler: RenderStrategy<string>;
|
|
7
|
+
export declare const ListHandler: RenderStrategy<string>;
|
|
8
|
+
export declare const ListItemHandler: RenderStrategy<string>;
|
|
9
|
+
export declare const TaskItemHandler: RenderStrategy<string>;
|
|
10
|
+
export declare const BoldHandler: RenderStrategy<string>;
|
|
11
|
+
export declare const ItalicHandler: RenderStrategy<string>;
|
|
12
|
+
export declare const StrikethroughHandler: RenderStrategy<string>;
|
|
13
|
+
export declare const InlineCodeHandler: RenderStrategy<string>;
|
|
14
|
+
export declare const LinkHandler: RenderStrategy<string>;
|
|
15
|
+
export declare const ImageHandler: RenderStrategy<string>;
|
|
16
|
+
export declare const HorizontalLineHandler: RenderStrategy<string>;
|
|
17
|
+
export declare const TextHandler: RenderStrategy<string>;
|
|
18
|
+
export declare const TableHandler: RenderStrategy<string>;
|
|
19
|
+
export declare const HTMLBlockHandler: RenderStrategy<string>;
|
|
20
|
+
export declare const HTMLInlineHandler: RenderStrategy<string>;
|
|
21
|
+
export declare const FootnoteRefHandler: RenderStrategy<string>;
|