@mdwrk/markdown-renderer-core 1.0.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/README.md +16 -0
- package/dist/class-names.d.ts +5 -0
- package/dist/class-names.d.ts.map +1 -0
- package/dist/class-names.js +42 -0
- package/dist/class-names.js.map +1 -0
- package/dist/frontmatter.d.ts +5 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +16 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/headings.d.ts +3 -0
- package/dist/headings.d.ts.map +1 -0
- package/dist/headings.js +29 -0
- package/dist/headings.js.map +1 -0
- package/dist/html.d.ts +4 -0
- package/dist/html.d.ts.map +1 -0
- package/dist/html.js +46 -0
- package/dist/html.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline.d.ts +9 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +204 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/slug.d.ts +2 -0
- package/dist/slug.d.ts.map +1 -0
- package/dist/slug.js +11 -0
- package/dist/slug.js.map +1 -0
- package/dist/types.d.ts +78 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +88 -0
package/README.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# mdwrk/markdown-renderer-core
|
|
2
|
+
|
|
3
|
+
Portable markdown parsing and semantic HTML rendering.
|
|
4
|
+
|
|
5
|
+
## Exports
|
|
6
|
+
|
|
7
|
+
- `parseMarkdownDocument`
|
|
8
|
+
- `extractMarkdownHeadings`
|
|
9
|
+
- `renderMarkdownToHtml`
|
|
10
|
+
- `createHtmlDocument`
|
|
11
|
+
- `renderMarkdownToHtmlDocument`
|
|
12
|
+
- semantic class names and slug helpers
|
|
13
|
+
|
|
14
|
+
## Scope
|
|
15
|
+
|
|
16
|
+
This package owns the portable, framework-agnostic markdown processing pipeline used by Markdown Workspace applications and future third-party integrators.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { MarkdownRendererClassNames } from "./types.js";
|
|
2
|
+
export declare const DEFAULT_MARKDOWN_RENDERER_CLASS_NAMES: MarkdownRendererClassNames;
|
|
3
|
+
export declare const MARKDOWN_RENDERER_CLASS_NAME_VALUES: readonly string[];
|
|
4
|
+
export declare function resolveMarkdownRendererClassNames(overrides?: Partial<MarkdownRendererClassNames>): MarkdownRendererClassNames;
|
|
5
|
+
//# sourceMappingURL=class-names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-names.d.ts","sourceRoot":"","sources":["../src/class-names.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAoC7D,eAAO,MAAM,qCAAqC,EAAE,0BAEnD,CAAC;AAEF,eAAO,MAAM,mCAAmC,mBAE/C,CAAC;AAEF,wBAAgB,iCAAiC,CAC/C,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,0BAA0B,CAK5B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const DEFAULT_MARKDOWN_RENDERER_CLASS_NAME_LITERAL = {
|
|
2
|
+
root: "markdown-body",
|
|
3
|
+
heading1: "md-h1",
|
|
4
|
+
heading2: "md-h2",
|
|
5
|
+
heading3: "md-h3",
|
|
6
|
+
heading4: "md-h4",
|
|
7
|
+
heading5: "md-h5",
|
|
8
|
+
heading6: "md-h6",
|
|
9
|
+
paragraph: "md-p",
|
|
10
|
+
strong: "md-strong",
|
|
11
|
+
emphasis: "md-em",
|
|
12
|
+
hr: "md-hr",
|
|
13
|
+
blockquote: "md-blockquote",
|
|
14
|
+
listUnordered: "md-ul",
|
|
15
|
+
listOrdered: "md-ol",
|
|
16
|
+
listItem: "md-li",
|
|
17
|
+
taskListItem: "md-task-list-item",
|
|
18
|
+
checkbox: "md-checkbox",
|
|
19
|
+
link: "md-link",
|
|
20
|
+
inlineCode: "md-inline-code",
|
|
21
|
+
table: "md-table",
|
|
22
|
+
tableHead: "md-table-head",
|
|
23
|
+
tableBody: "md-table-body",
|
|
24
|
+
tableRow: "md-table-row",
|
|
25
|
+
tableHeader: "md-table-header",
|
|
26
|
+
tableCell: "md-table-cell",
|
|
27
|
+
tableCaption: "md-table-caption",
|
|
28
|
+
tableColumns: "md-table-columns",
|
|
29
|
+
tableColumn: "md-table-column",
|
|
30
|
+
codeBlock: "md-code-block",
|
|
31
|
+
codeHeader: "md-code-header",
|
|
32
|
+
codeSurface: "md-code-surface"
|
|
33
|
+
};
|
|
34
|
+
export const DEFAULT_MARKDOWN_RENDERER_CLASS_NAMES = Object.freeze(DEFAULT_MARKDOWN_RENDERER_CLASS_NAME_LITERAL);
|
|
35
|
+
export const MARKDOWN_RENDERER_CLASS_NAME_VALUES = Object.freeze(Object.values(DEFAULT_MARKDOWN_RENDERER_CLASS_NAMES));
|
|
36
|
+
export function resolveMarkdownRendererClassNames(overrides = {}) {
|
|
37
|
+
return Object.freeze({
|
|
38
|
+
...DEFAULT_MARKDOWN_RENDERER_CLASS_NAMES,
|
|
39
|
+
...overrides,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=class-names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-names.js","sourceRoot":"","sources":["../src/class-names.ts"],"names":[],"mappings":"AAEA,MAAM,4CAA4C,GAAG;IACnD,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,OAAO;IACjB,EAAE,EAAE,OAAO;IACX,UAAU,EAAE,eAAe;IAC3B,aAAa,EAAE,OAAO;IACtB,WAAW,EAAE,OAAO;IACpB,QAAQ,EAAE,OAAO;IACjB,YAAY,EAAE,mBAAmB;IACjC,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,SAAS;IACf,UAAU,EAAE,gBAAgB;IAC5B,KAAK,EAAE,UAAU;IACjB,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE,cAAc;IACxB,WAAW,EAAE,iBAAiB;IAC9B,SAAS,EAAE,eAAe;IAC1B,YAAY,EAAE,kBAAkB;IAChC,YAAY,EAAE,kBAAkB;IAChC,WAAW,EAAE,iBAAiB;IAC9B,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,gBAAgB;IAC5B,WAAW,EAAE,iBAAiB;CACe,CAAC;AAEhD,MAAM,CAAC,MAAM,qCAAqC,GAA+B,MAAM,CAAC,MAAM,CAC5F,4CAA4C,CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG,MAAM,CAAC,MAAM,CAC9D,MAAM,CAAC,MAAM,CAAC,qCAAqC,CAAC,CACrD,CAAC;AAEF,MAAM,UAAU,iCAAiC,CAC/C,YAAiD,EAAE;IAEnD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,qCAAqC;QACxC,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGzD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,sBAAsB,CAaxB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import matter from "gray-matter";
|
|
2
|
+
import { extractMarkdownHeadings } from "./headings.js";
|
|
3
|
+
export function parseMarkdownDocument(raw, options = {}) {
|
|
4
|
+
const parsed = matter(raw, {
|
|
5
|
+
excerpt: Boolean(options.excerptSeparator),
|
|
6
|
+
excerpt_separator: options.excerptSeparator,
|
|
7
|
+
});
|
|
8
|
+
return Object.freeze({
|
|
9
|
+
raw,
|
|
10
|
+
content: parsed.content,
|
|
11
|
+
metadata: Object.freeze({ ...parsed.data }),
|
|
12
|
+
headings: extractMarkdownHeadings(parsed.content),
|
|
13
|
+
excerpt: parsed.excerpt,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,UAAU,qBAAqB,CACnC,GAAW,EACX,UAAyC,EAAE;IAE3C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE;QACzB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC1C,iBAAiB,EAAE,OAAO,CAAC,gBAAgB;KAC5C,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG;QACH,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAI,MAAM,CAAC,IAAgC,EAAE,CAAC;QACxE,QAAQ,EAAE,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC;QACjD,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headings.d.ts","sourceRoot":"","sources":["../src/headings.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,8BAA8B,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElF,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,8BAAmC,GAC3C,SAAS,eAAe,EAAE,CAsB5B"}
|
package/dist/headings.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { toString } from "mdast-util-to-string";
|
|
2
|
+
import remarkGfm from "remark-gfm";
|
|
3
|
+
import remarkParse from "remark-parse";
|
|
4
|
+
import remarkSupersub from "remark-supersub";
|
|
5
|
+
import { unified } from "unified";
|
|
6
|
+
import { visit } from "unist-util-visit";
|
|
7
|
+
import { slugifyHeading } from "./slug.js";
|
|
8
|
+
export function extractMarkdownHeadings(markdown, options = {}) {
|
|
9
|
+
const minimumDepth = options.minimumDepth ?? 1;
|
|
10
|
+
const maximumDepth = options.maximumDepth ?? 6;
|
|
11
|
+
const tree = unified().use(remarkParse).use(remarkGfm).use(remarkSupersub).parse(markdown);
|
|
12
|
+
const headings = [];
|
|
13
|
+
let index = 0;
|
|
14
|
+
visit(tree, "heading", (node) => {
|
|
15
|
+
const depth = Number(node.depth ?? 0);
|
|
16
|
+
if (depth < minimumDepth || depth > maximumDepth) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const text = toString(node).trim();
|
|
20
|
+
headings.push({
|
|
21
|
+
depth,
|
|
22
|
+
text,
|
|
23
|
+
slug: slugifyHeading(text),
|
|
24
|
+
index: index++,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
return Object.freeze(headings);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=headings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headings.js","sourceRoot":"","sources":["../src/headings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,MAAM,UAAU,uBAAuB,CACrC,QAAgB,EAChB,UAA0C,EAAE;IAE5C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAS,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,YAAY,IAAI,KAAK,GAAG,YAAY,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK;YACL,IAAI;YACJ,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;YAC1B,KAAK,EAAE,KAAK,EAAE;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/html.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { HtmlDocumentOptions, RenderMarkdownToHtmlDocumentOptions } from "./types.js";
|
|
2
|
+
export declare function createHtmlDocument(options: HtmlDocumentOptions): string;
|
|
3
|
+
export declare function renderMarkdownToHtmlDocument(markdown: string, options: RenderMarkdownToHtmlDocumentOptions): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mCAAmC,EAAE,MAAM,YAAY,CAAC;AAW3F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAwBvE;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mCAAmC,GAC3C,OAAO,CAAC,MAAM,CAAC,CAWjB"}
|
package/dist/html.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { renderMarkdownToHtml } from "./pipeline.js";
|
|
2
|
+
function escapeHtml(value) {
|
|
3
|
+
return value
|
|
4
|
+
.replace(/&/g, "&")
|
|
5
|
+
.replace(/</g, "<")
|
|
6
|
+
.replace(/>/g, ">")
|
|
7
|
+
.replace(/\"/g, """)
|
|
8
|
+
.replace(/'/g, "'");
|
|
9
|
+
}
|
|
10
|
+
export function createHtmlDocument(options) {
|
|
11
|
+
const title = escapeHtml(options.title);
|
|
12
|
+
const lang = options.lang ?? "en";
|
|
13
|
+
const htmlClassName = options.htmlClassName ? ` class=\"${escapeHtml(options.htmlClassName)}\"` : "";
|
|
14
|
+
const dataTheme = options.dataTheme ? ` data-theme=\"${escapeHtml(options.dataTheme)}\"` : "";
|
|
15
|
+
const bodyClassName = options.bodyClassName ? ` class=\"${escapeHtml(options.bodyClassName)}\"` : "";
|
|
16
|
+
const stylesheets = options.stylesheets?.length
|
|
17
|
+
? `<style>\n${options.stylesheets.join("\n")}\n</style>`
|
|
18
|
+
: "";
|
|
19
|
+
return [
|
|
20
|
+
"<!DOCTYPE html>",
|
|
21
|
+
`<html lang=\"${escapeHtml(lang)}\"${dataTheme}${htmlClassName}>`,
|
|
22
|
+
"<head>",
|
|
23
|
+
" <meta charset=\"UTF-8\" />",
|
|
24
|
+
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />",
|
|
25
|
+
` <title>${title}</title>`,
|
|
26
|
+
stylesheets,
|
|
27
|
+
"</head>",
|
|
28
|
+
`<body${bodyClassName}>`,
|
|
29
|
+
options.bodyHtml,
|
|
30
|
+
"</body>",
|
|
31
|
+
"</html>",
|
|
32
|
+
].filter(Boolean).join("\n");
|
|
33
|
+
}
|
|
34
|
+
export async function renderMarkdownToHtmlDocument(markdown, options) {
|
|
35
|
+
const bodyHtml = await renderMarkdownToHtml(markdown, options);
|
|
36
|
+
return createHtmlDocument({
|
|
37
|
+
title: options.title,
|
|
38
|
+
bodyHtml,
|
|
39
|
+
lang: options.lang,
|
|
40
|
+
dataTheme: options.dataTheme,
|
|
41
|
+
htmlClassName: options.htmlClassName,
|
|
42
|
+
bodyClassName: options.bodyClassName,
|
|
43
|
+
stylesheets: options.stylesheets,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=html.js.map
|
package/dist/html.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9F,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM;QAC7C,CAAC,CAAC,YAAY,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;QACxD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,iBAAiB;QACjB,gBAAgB,UAAU,CAAC,IAAI,CAAC,KAAK,SAAS,GAAG,aAAa,GAAG;QACjE,QAAQ;QACR,8BAA8B;QAC9B,gFAAgF;QAChF,YAAY,KAAK,UAAU;QAC3B,WAAW;QACX,SAAS;QACT,QAAQ,aAAa,GAAG;QACxB,OAAO,CAAC,QAAQ;QAChB,SAAS;QACT,SAAS;KACV,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,QAAgB,EAChB,OAA4C;IAE5C,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,kBAAkB,CAAC;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ;QACR,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./version.js";
|
|
2
|
+
export * from "./types.js";
|
|
3
|
+
export * from "./class-names.js";
|
|
4
|
+
export * from "./slug.js";
|
|
5
|
+
export * from "./frontmatter.js";
|
|
6
|
+
export * from "./headings.js";
|
|
7
|
+
export * from "./pipeline.js";
|
|
8
|
+
export * from "./html.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./version.js";
|
|
2
|
+
export * from "./types.js";
|
|
3
|
+
export * from "./class-names.js";
|
|
4
|
+
export * from "./slug.js";
|
|
5
|
+
export * from "./frontmatter.js";
|
|
6
|
+
export * from "./headings.js";
|
|
7
|
+
export * from "./pipeline.js";
|
|
8
|
+
export * from "./html.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { unified } from "unified";
|
|
2
|
+
import type { MarkdownRendererClassNames, RenderMarkdownToHtmlOptions } from "./types.js";
|
|
3
|
+
export declare function getDefaultMarkdownRemarkPlugins(): unknown[];
|
|
4
|
+
export declare function createMarkdownProcessor(options?: RenderMarkdownToHtmlOptions): {
|
|
5
|
+
processor: ReturnType<typeof unified>;
|
|
6
|
+
classNames: MarkdownRendererClassNames;
|
|
7
|
+
};
|
|
8
|
+
export declare function renderMarkdownToHtml(markdown: string, options?: RenderMarkdownToHtmlOptions): Promise<string>;
|
|
9
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIlC,OAAO,KAAK,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAwK1F,wBAAgB,+BAA+B,IAAI,OAAO,EAAE,CAE3D;AAED,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,2BAAgC,GACxC;IAAE,SAAS,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;IAAC,UAAU,EAAE,0BAA0B,CAAA;CAAE,CAqBnF;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,MAAM,CAAC,CAIjB"}
|
package/dist/pipeline.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import remarkGfm from "remark-gfm";
|
|
2
|
+
import remarkParse from "remark-parse";
|
|
3
|
+
import remarkRehype from "remark-rehype";
|
|
4
|
+
import remarkSupersub from "remark-supersub";
|
|
5
|
+
import rehypeStringify from "rehype-stringify";
|
|
6
|
+
import { unified } from "unified";
|
|
7
|
+
import { visit } from "unist-util-visit";
|
|
8
|
+
import { slugifyHeading } from "./slug.js";
|
|
9
|
+
import { resolveMarkdownRendererClassNames } from "./class-names.js";
|
|
10
|
+
function appendClassName(node, className) {
|
|
11
|
+
if (!className)
|
|
12
|
+
return;
|
|
13
|
+
const properties = (node.properties ??= {});
|
|
14
|
+
const current = properties.className;
|
|
15
|
+
if (Array.isArray(current)) {
|
|
16
|
+
if (!current.includes(className))
|
|
17
|
+
current.push(className);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (typeof current === "string" && current.length > 0) {
|
|
21
|
+
properties.className = Array.from(new Set(`${current} ${className}`.split(/\s+/g))).filter(Boolean);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
properties.className = [className];
|
|
25
|
+
}
|
|
26
|
+
function isExternalHref(href) {
|
|
27
|
+
return Boolean(href && /^(https?:)?\/\//i.test(href));
|
|
28
|
+
}
|
|
29
|
+
function textFromChildren(children) {
|
|
30
|
+
return (children ?? [])
|
|
31
|
+
.map((child) => {
|
|
32
|
+
if (typeof child?.value === "string")
|
|
33
|
+
return child.value;
|
|
34
|
+
if (Array.isArray(child?.children))
|
|
35
|
+
return textFromChildren(child.children);
|
|
36
|
+
return "";
|
|
37
|
+
})
|
|
38
|
+
.join(" ")
|
|
39
|
+
.trim();
|
|
40
|
+
}
|
|
41
|
+
function rehypeApplyMarkdownClasses(classNames) {
|
|
42
|
+
return function applyMarkdownClassesPlugin() {
|
|
43
|
+
return (tree) => {
|
|
44
|
+
visit(tree, "element", (node) => {
|
|
45
|
+
switch (node.tagName) {
|
|
46
|
+
case "h1":
|
|
47
|
+
appendClassName(node, classNames.heading1);
|
|
48
|
+
node.properties.id ??= slugifyHeading(textFromChildren(node.children));
|
|
49
|
+
break;
|
|
50
|
+
case "h2":
|
|
51
|
+
appendClassName(node, classNames.heading2);
|
|
52
|
+
node.properties.id ??= slugifyHeading(textFromChildren(node.children));
|
|
53
|
+
break;
|
|
54
|
+
case "h3":
|
|
55
|
+
appendClassName(node, classNames.heading3);
|
|
56
|
+
node.properties.id ??= slugifyHeading(textFromChildren(node.children));
|
|
57
|
+
break;
|
|
58
|
+
case "h4":
|
|
59
|
+
appendClassName(node, classNames.heading4);
|
|
60
|
+
node.properties.id ??= slugifyHeading(textFromChildren(node.children));
|
|
61
|
+
break;
|
|
62
|
+
case "h5":
|
|
63
|
+
appendClassName(node, classNames.heading5);
|
|
64
|
+
node.properties.id ??= slugifyHeading(textFromChildren(node.children));
|
|
65
|
+
break;
|
|
66
|
+
case "h6":
|
|
67
|
+
appendClassName(node, classNames.heading6);
|
|
68
|
+
node.properties.id ??= slugifyHeading(textFromChildren(node.children));
|
|
69
|
+
break;
|
|
70
|
+
case "p":
|
|
71
|
+
appendClassName(node, classNames.paragraph);
|
|
72
|
+
break;
|
|
73
|
+
case "strong":
|
|
74
|
+
appendClassName(node, classNames.strong);
|
|
75
|
+
break;
|
|
76
|
+
case "em":
|
|
77
|
+
appendClassName(node, classNames.emphasis);
|
|
78
|
+
break;
|
|
79
|
+
case "hr":
|
|
80
|
+
appendClassName(node, classNames.hr);
|
|
81
|
+
break;
|
|
82
|
+
case "blockquote":
|
|
83
|
+
appendClassName(node, classNames.blockquote);
|
|
84
|
+
break;
|
|
85
|
+
case "ul":
|
|
86
|
+
appendClassName(node, classNames.listUnordered);
|
|
87
|
+
break;
|
|
88
|
+
case "ol":
|
|
89
|
+
appendClassName(node, classNames.listOrdered);
|
|
90
|
+
break;
|
|
91
|
+
case "li": {
|
|
92
|
+
appendClassName(node, classNames.listItem);
|
|
93
|
+
const firstChild = node.children?.[0];
|
|
94
|
+
const looksTask = firstChild?.tagName === "input" && firstChild?.properties?.type === "checkbox";
|
|
95
|
+
if (looksTask)
|
|
96
|
+
appendClassName(node, classNames.taskListItem);
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case "input":
|
|
100
|
+
if (node.properties?.type === "checkbox")
|
|
101
|
+
appendClassName(node, classNames.checkbox);
|
|
102
|
+
break;
|
|
103
|
+
case "a": {
|
|
104
|
+
appendClassName(node, classNames.link);
|
|
105
|
+
const href = typeof node.properties?.href === "string" ? node.properties.href : undefined;
|
|
106
|
+
if (isExternalHref(href)) {
|
|
107
|
+
node.properties.target ??= "_blank";
|
|
108
|
+
node.properties.rel ??= "noopener noreferrer";
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
case "code":
|
|
113
|
+
appendClassName(node, classNames.inlineCode);
|
|
114
|
+
break;
|
|
115
|
+
case "table":
|
|
116
|
+
appendClassName(node, classNames.table);
|
|
117
|
+
break;
|
|
118
|
+
case "thead":
|
|
119
|
+
appendClassName(node, classNames.tableHead);
|
|
120
|
+
break;
|
|
121
|
+
case "tbody":
|
|
122
|
+
appendClassName(node, classNames.tableBody);
|
|
123
|
+
break;
|
|
124
|
+
case "tr":
|
|
125
|
+
appendClassName(node, classNames.tableRow);
|
|
126
|
+
break;
|
|
127
|
+
case "th":
|
|
128
|
+
appendClassName(node, classNames.tableHeader);
|
|
129
|
+
break;
|
|
130
|
+
case "td":
|
|
131
|
+
appendClassName(node, classNames.tableCell);
|
|
132
|
+
break;
|
|
133
|
+
case "caption":
|
|
134
|
+
appendClassName(node, classNames.tableCaption);
|
|
135
|
+
break;
|
|
136
|
+
case "colgroup":
|
|
137
|
+
appendClassName(node, classNames.tableColumns);
|
|
138
|
+
break;
|
|
139
|
+
case "col":
|
|
140
|
+
appendClassName(node, classNames.tableColumn);
|
|
141
|
+
break;
|
|
142
|
+
case "pre": {
|
|
143
|
+
const codeChild = node.children?.find((child) => child.tagName === "code");
|
|
144
|
+
const className = Array.isArray(codeChild?.properties?.className)
|
|
145
|
+
? codeChild.properties.className.join(" ")
|
|
146
|
+
: typeof codeChild?.properties?.className === "string"
|
|
147
|
+
? codeChild.properties.className
|
|
148
|
+
: "";
|
|
149
|
+
const language = className.match(/language-([a-z0-9_-]+)/i)?.[1];
|
|
150
|
+
appendClassName(node, classNames.codeBlock);
|
|
151
|
+
if (language) {
|
|
152
|
+
node.children = [
|
|
153
|
+
{
|
|
154
|
+
type: "element",
|
|
155
|
+
tagName: "div",
|
|
156
|
+
properties: { className: [classNames.codeHeader] },
|
|
157
|
+
children: [{ type: "text", value: language }],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: "element",
|
|
161
|
+
tagName: "div",
|
|
162
|
+
properties: { className: [classNames.codeSurface] },
|
|
163
|
+
children: node.children,
|
|
164
|
+
},
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
appendClassName(node, classNames.codeSurface);
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
default:
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
export function getDefaultMarkdownRemarkPlugins() {
|
|
180
|
+
return [remarkGfm, remarkSupersub];
|
|
181
|
+
}
|
|
182
|
+
export function createMarkdownProcessor(options = {}) {
|
|
183
|
+
const classNames = resolveMarkdownRendererClassNames(options.classNames);
|
|
184
|
+
const processor = unified()
|
|
185
|
+
.use(remarkParse)
|
|
186
|
+
.use(remarkGfm)
|
|
187
|
+
.use(remarkSupersub);
|
|
188
|
+
for (const plugin of options.remarkPlugins ?? []) {
|
|
189
|
+
processor.use(plugin);
|
|
190
|
+
}
|
|
191
|
+
processor.use(remarkRehype);
|
|
192
|
+
for (const plugin of options.rehypePlugins ?? []) {
|
|
193
|
+
processor.use(plugin);
|
|
194
|
+
}
|
|
195
|
+
processor.use(rehypeApplyMarkdownClasses(classNames));
|
|
196
|
+
processor.use(rehypeStringify, { allowDangerousHtml: false });
|
|
197
|
+
return { processor, classNames };
|
|
198
|
+
}
|
|
199
|
+
export async function renderMarkdownToHtml(markdown, options = {}) {
|
|
200
|
+
const { processor, classNames } = createMarkdownProcessor(options);
|
|
201
|
+
const file = await processor.process(markdown);
|
|
202
|
+
return `<div class="${classNames.root}">${String(file)}</div>`;
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/slug.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD"}
|
package/dist/slug.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function slugifyHeading(text) {
|
|
2
|
+
return text
|
|
3
|
+
.trim()
|
|
4
|
+
.toLowerCase()
|
|
5
|
+
.replace(/[`*_~]/g, "")
|
|
6
|
+
.replace(/[^a-z0-9\s-]/g, "")
|
|
7
|
+
.replace(/\s+/g, "-")
|
|
8
|
+
.replace(/-+/g, "-")
|
|
9
|
+
.replace(/^-|-$/g, "") || "section";
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=slug.js.map
|
package/dist/slug.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI;SACR,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;AACxC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export interface MarkdownHeading {
|
|
2
|
+
readonly depth: number;
|
|
3
|
+
readonly text: string;
|
|
4
|
+
readonly slug: string;
|
|
5
|
+
readonly index: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ParseMarkdownDocumentOptions {
|
|
8
|
+
readonly excerptSeparator?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ParsedMarkdownDocument {
|
|
11
|
+
readonly raw: string;
|
|
12
|
+
readonly content: string;
|
|
13
|
+
readonly metadata: Readonly<Record<string, unknown>>;
|
|
14
|
+
readonly headings: readonly MarkdownHeading[];
|
|
15
|
+
readonly excerpt?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ExtractMarkdownHeadingsOptions {
|
|
18
|
+
readonly minimumDepth?: number;
|
|
19
|
+
readonly maximumDepth?: number;
|
|
20
|
+
}
|
|
21
|
+
export type MarkdownRendererClassNames = Readonly<{
|
|
22
|
+
root: string;
|
|
23
|
+
heading1: string;
|
|
24
|
+
heading2: string;
|
|
25
|
+
heading3: string;
|
|
26
|
+
heading4: string;
|
|
27
|
+
heading5: string;
|
|
28
|
+
heading6: string;
|
|
29
|
+
paragraph: string;
|
|
30
|
+
strong: string;
|
|
31
|
+
emphasis: string;
|
|
32
|
+
hr: string;
|
|
33
|
+
blockquote: string;
|
|
34
|
+
listUnordered: string;
|
|
35
|
+
listOrdered: string;
|
|
36
|
+
listItem: string;
|
|
37
|
+
taskListItem: string;
|
|
38
|
+
checkbox: string;
|
|
39
|
+
link: string;
|
|
40
|
+
inlineCode: string;
|
|
41
|
+
table: string;
|
|
42
|
+
tableHead: string;
|
|
43
|
+
tableBody: string;
|
|
44
|
+
tableRow: string;
|
|
45
|
+
tableHeader: string;
|
|
46
|
+
tableCell: string;
|
|
47
|
+
tableCaption: string;
|
|
48
|
+
tableColumns: string;
|
|
49
|
+
tableColumn: string;
|
|
50
|
+
codeBlock: string;
|
|
51
|
+
codeHeader: string;
|
|
52
|
+
codeSurface: string;
|
|
53
|
+
}>;
|
|
54
|
+
export interface MarkdownRenderHooks {
|
|
55
|
+
readonly remarkPlugins?: readonly unknown[];
|
|
56
|
+
readonly rehypePlugins?: readonly unknown[];
|
|
57
|
+
}
|
|
58
|
+
export interface RenderMarkdownToHtmlOptions extends MarkdownRenderHooks {
|
|
59
|
+
readonly classNames?: Partial<MarkdownRendererClassNames>;
|
|
60
|
+
}
|
|
61
|
+
export interface HtmlDocumentOptions {
|
|
62
|
+
readonly title: string;
|
|
63
|
+
readonly bodyHtml: string;
|
|
64
|
+
readonly lang?: string;
|
|
65
|
+
readonly dataTheme?: string;
|
|
66
|
+
readonly htmlClassName?: string;
|
|
67
|
+
readonly bodyClassName?: string;
|
|
68
|
+
readonly stylesheets?: readonly string[];
|
|
69
|
+
}
|
|
70
|
+
export interface RenderMarkdownToHtmlDocumentOptions extends RenderMarkdownToHtmlOptions {
|
|
71
|
+
readonly title: string;
|
|
72
|
+
readonly lang?: string;
|
|
73
|
+
readonly dataTheme?: string;
|
|
74
|
+
readonly htmlClassName?: string;
|
|
75
|
+
readonly bodyClassName?: string;
|
|
76
|
+
readonly stylesheets?: readonly string[];
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,UAAU,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG,OAAO,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mdwrk/markdown-renderer-core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=20 <23"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"sideEffects": false,
|
|
17
|
+
"keywords": [
|
|
18
|
+
"markdown-workspace",
|
|
19
|
+
"renderer",
|
|
20
|
+
"markdown",
|
|
21
|
+
"portable",
|
|
22
|
+
"core"
|
|
23
|
+
],
|
|
24
|
+
"description": "Portable markdown parsing, heading extraction, semantic HTML rendering, and HTML document serialization for Markdown Workspace.",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"gray-matter": "^4.0.3",
|
|
27
|
+
"mdast-util-to-string": "^4.0.0",
|
|
28
|
+
"rehype-stringify": "^10.0.1",
|
|
29
|
+
"remark-gfm": "^4.0.1",
|
|
30
|
+
"remark-parse": "^11.0.0",
|
|
31
|
+
"remark-rehype": "^11.1.2",
|
|
32
|
+
"remark-supersub": "^1.0.0",
|
|
33
|
+
"unified": "^11.0.5",
|
|
34
|
+
"unist-util-visit": "^5.0.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"vitest": "^2.1.8"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc -p tsconfig.json",
|
|
41
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
42
|
+
"lint": "npm run typecheck",
|
|
43
|
+
"test": "npm run build && node ./tests/run-smoke.mjs",
|
|
44
|
+
"prepack": "npm run build"
|
|
45
|
+
},
|
|
46
|
+
"exports": {
|
|
47
|
+
".": {
|
|
48
|
+
"types": "./dist/index.d.ts",
|
|
49
|
+
"import": "./dist/index.js"
|
|
50
|
+
},
|
|
51
|
+
"./version": {
|
|
52
|
+
"types": "./dist/version.d.ts",
|
|
53
|
+
"import": "./dist/version.js"
|
|
54
|
+
},
|
|
55
|
+
"./types": {
|
|
56
|
+
"types": "./dist/types.d.ts",
|
|
57
|
+
"import": "./dist/types.js"
|
|
58
|
+
},
|
|
59
|
+
"./class-names": {
|
|
60
|
+
"types": "./dist/class-names.d.ts",
|
|
61
|
+
"import": "./dist/class-names.js"
|
|
62
|
+
},
|
|
63
|
+
"./slug": {
|
|
64
|
+
"types": "./dist/slug.d.ts",
|
|
65
|
+
"import": "./dist/slug.js"
|
|
66
|
+
},
|
|
67
|
+
"./frontmatter": {
|
|
68
|
+
"types": "./dist/frontmatter.d.ts",
|
|
69
|
+
"import": "./dist/frontmatter.js"
|
|
70
|
+
},
|
|
71
|
+
"./headings": {
|
|
72
|
+
"types": "./dist/headings.d.ts",
|
|
73
|
+
"import": "./dist/headings.js"
|
|
74
|
+
},
|
|
75
|
+
"./pipeline": {
|
|
76
|
+
"types": "./dist/pipeline.d.ts",
|
|
77
|
+
"import": "./dist/pipeline.js"
|
|
78
|
+
},
|
|
79
|
+
"./html": {
|
|
80
|
+
"types": "./dist/html.d.ts",
|
|
81
|
+
"import": "./dist/html.js"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"main": "./dist/index.js",
|
|
85
|
+
"types": "./dist/index.d.ts",
|
|
86
|
+
"author": "Jacob Stewart <jacob@swarmauri.com>",
|
|
87
|
+
"homepage": "https://mdwrk.com"
|
|
88
|
+
}
|