/
markdown.ts
86 lines (69 loc) 路 2.16 KB
/
markdown.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
import { Data, Engine, Helper, Site } from "../core.ts";
import {
markdownIt,
markdownItAttrs,
markdownItDeflist,
MarkdownItOptions,
} from "../deps/markdown_it.ts";
import loader from "../core/loaders/text.ts";
import { merge } from "../core/utils.ts";
export interface Options {
/** The list of extensions this plugin applies to */
extensions: string[];
/** Options passed to markdown-it library */
options: Partial<MarkdownItOptions>;
/** The list of markdown-it plugins to use */
plugins: unknown[];
/** Set `true` append your plugins to the defaults */
keepDefaultPlugins: boolean;
}
// Default options
const defaults: Options = {
extensions: [".md"],
options: {
html: true,
},
plugins: [
markdownItAttrs,
markdownItDeflist,
],
keepDefaultPlugins: false,
};
interface MarkdownItEngine {
render: (input: string, env?: Record<string, unknown>) => string;
}
/** Template engine to render Markdown files */
export class MarkdownEngine implements Engine {
engine: MarkdownItEngine;
constructor(engine: MarkdownItEngine) {
this.engine = engine;
}
render(content: string, _data: Data, filename: string): string {
return this.engine.render(content, { filename });
}
addHelper() {}
}
/** Register the plugin to support Markdown */
export default function (userOptions?: Partial<Options>) {
const options = merge(defaults, userOptions);
if (options.keepDefaultPlugins && userOptions?.plugins?.length) {
options.plugins = defaults.plugins.concat(userOptions.plugins);
}
return function (site: Site) {
// @ts-ignore: This expression is not callable.
const engine = markdownIt(options.options);
// Register markdown-it plugins
options.plugins.forEach((plugin) =>
Array.isArray(plugin) ? engine.use(...plugin) : engine.use(plugin)
);
// Load the pages
site.loadPages(options.extensions, loader, new MarkdownEngine(engine));
// Register the md filter
site.filter("md", filter as Helper);
function filter(string: string, inline = false): string {
return inline
? engine.renderInline(string || "").trim()
: engine.render(string || "").trim();
}
};
}