simple-customize-markdown-converter 1.0.7 → 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.
Files changed (55) hide show
  1. package/README.md +74 -17
  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/lexer.d.ts +46 -0
  7. package/dist/core/lexer.js +433 -0
  8. package/dist/core/parser/handler.d.ts +19 -0
  9. package/dist/core/parser/handler.js +254 -0
  10. package/dist/core/parser/index.d.ts +33 -0
  11. package/dist/core/parser/index.js +149 -0
  12. package/dist/core/parser.d.ts +37 -0
  13. package/dist/core/parser.js +346 -0
  14. package/dist/core/renderer.d.ts +3 -0
  15. package/dist/core/renderer.js +99 -0
  16. package/dist/core/resolver/footnote-resolver.d.ts +15 -0
  17. package/dist/core/resolver/footnote-resolver.js +36 -0
  18. package/dist/core/resolver.d.ts +15 -0
  19. package/dist/core/resolver.js +36 -0
  20. package/dist/index.d.ts +6 -3
  21. package/dist/index.js +10 -7
  22. package/dist/react.d.ts +36 -0
  23. package/dist/react.js +56 -0
  24. package/dist/renderers/default/handler.d.ts +21 -0
  25. package/dist/renderers/default/handler.js +114 -0
  26. package/dist/renderers/default/index.d.ts +14 -0
  27. package/dist/renderers/default/index.js +117 -0
  28. package/dist/renderers/default.d.ts +26 -0
  29. package/dist/renderers/default.js +105 -0
  30. package/dist/renderers/index.d.ts +10 -0
  31. package/dist/renderers/index.js +2 -0
  32. package/dist/renderers/react/handler.d.ts +22 -0
  33. package/dist/renderers/react/handler.js +123 -0
  34. package/dist/renderers/react/index.d.ts +15 -0
  35. package/dist/renderers/react/index.js +123 -0
  36. package/dist/renderers/react.d.ts +26 -0
  37. package/dist/renderers/react.js +123 -0
  38. package/dist/types/options/converterOptions.d.ts +11 -0
  39. package/dist/types/options/converterOptions.js +2 -0
  40. package/dist/types/options/index.d.ts +10 -0
  41. package/dist/types/options/index.js +2 -0
  42. package/dist/types/options/reactRenderOptions.d.ts +50 -0
  43. package/dist/types/options/reactRenderOptions.js +2 -0
  44. package/dist/types/options/renderOptions.d.ts +86 -0
  45. package/dist/types/options/renderOptions.js +2 -0
  46. package/dist/types/parser.d.ts +132 -0
  47. package/dist/types/parser.js +2 -0
  48. package/dist/types/renderer.d.ts +12 -0
  49. package/dist/types/renderer.js +2 -0
  50. package/dist/types/token.d.ts +94 -74
  51. package/dist/utilities/parser-utils.d.ts +5 -0
  52. package/dist/utilities/parser-utils.js +65 -0
  53. package/dist/utilities/tokenizer-utils.d.ts +11 -0
  54. package/dist/utilities/tokenizer-utils.js +159 -0
  55. package/package.json +24 -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,37 @@
1
+ import { FootnoteResolver } from "../core/resolver";
2
+ import { Node } from "../types/node";
3
+ import { Token } from "../types/token";
4
+ export declare class Parser {
5
+ listToken: Token[];
6
+ pos: number;
7
+ footNoteResolver: FootnoteResolver;
8
+ constructor(listToken: Token[], footNoteResolver: FootnoteResolver);
9
+ /**
10
+ * Parse a list token to a node
11
+ * @return A parsed abstract syntax tree (AST)
12
+ */
13
+ parse(): Node;
14
+ private peek;
15
+ private next;
16
+ private isEnd;
17
+ private parseBlocks;
18
+ private parseParagraph;
19
+ private parseCodeBlock;
20
+ private parseHeader;
21
+ private parseBold;
22
+ private parseItalic;
23
+ private parseStrikethrough;
24
+ private parseInlineCode;
25
+ private parseQuote;
26
+ private parseList;
27
+ private parseListItem;
28
+ private parseLink;
29
+ private parseImage;
30
+ private parseTable;
31
+ private parseHtmlBlock;
32
+ private parseHtmlInline;
33
+ private parseHorizontalLine;
34
+ private parseFootnoteDef;
35
+ private parseFootnoteRef;
36
+ private parseInlineUntil;
37
+ }