-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathindex.ts
96 lines (77 loc) · 2.1 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Markdown Tokenizer
import { lexer } from "marked";
// Types
import { TDocumentDefinitions } from "pdfmake/interfaces";
// Utils
import { pdfMakeImage } from "./utils/image";
import { pdfMakeParagraph } from "./utils/paragraph";
import { pdfMakeHeading } from "./utils/heading";
import { pdfMakeList } from "./utils/list";
import { pdfMakeBlockquote } from "./utils/blockquote";
import { pdfMakeCodeblock } from "./utils/codeblock";
import { pdfMakeHR } from "./utils/hr";
interface MOptions {
headingFontSizes: number[];
headingUnderline?: boolean;
}
export const globalOptions: MOptions = {
headingFontSizes: [36, 30, 24, 18, 15, 12],
headingUnderline: true,
};
async function mdpdfmake(
markdown: string,
options?: MOptions
): Promise<TDocumentDefinitions> {
// Set default options
if (options?.headingFontSizes?.length > 0) {
// override only added values
options.headingFontSizes.forEach((size, index) => {
globalOptions.headingFontSizes[index] = size;
});
}
if (options?.headingUnderline !== undefined) {
globalOptions.headingUnderline = options.headingUnderline;
}
// Tokenize markdown
const tokens = lexer(markdown);
const content: any[] = [];
for (const token of tokens) {
switch (token.type) {
case "paragraph":
await pdfMakeParagraph(token, content);
break;
case "heading":
pdfMakeHeading(token, content);
break;
case "list":
await pdfMakeList(token, content);
break;
case "blockquote":
await pdfMakeBlockquote(token, content);
break;
case "image":
await pdfMakeImage(token, content);
break;
case "code":
await pdfMakeCodeblock(token, content);
break;
case "hr":
await pdfMakeHR(token, content);
break;
case "space":
break;
case "br":
content.push({ text: "\n" });
break;
default:
console.warn(`Unhandled token type: ${token.type}`);
}
}
return {
content: content,
defaultStyle: {
font: "Roboto",
},
};
}
export { mdpdfmake };