@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 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,5 @@
1
+ import type { ParsedMarkdownDocument } from "./types.js";
2
+ export declare function parseMarkdownDocument(raw: string, options?: {
3
+ excerptSeparator?: string;
4
+ }): ParsedMarkdownDocument;
5
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -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,3 @@
1
+ import type { ExtractMarkdownHeadingsOptions, MarkdownHeading } from "./types.js";
2
+ export declare function extractMarkdownHeadings(markdown: string, options?: ExtractMarkdownHeadingsOptions): readonly MarkdownHeading[];
3
+ //# sourceMappingURL=headings.d.ts.map
@@ -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"}
@@ -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, "&amp;")
5
+ .replace(/</g, "&lt;")
6
+ .replace(/>/g, "&gt;")
7
+ .replace(/\"/g, "&quot;")
8
+ .replace(/'/g, "&#39;");
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
@@ -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"}
@@ -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"}
@@ -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,2 @@
1
+ export declare function slugifyHeading(text: string): string;
2
+ //# sourceMappingURL=slug.d.ts.map
@@ -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
@@ -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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare const MARKDOWN_RENDERER_CORE_VERSION = "1.0.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const MARKDOWN_RENDERER_CORE_VERSION = "1.0.0";
2
+ //# sourceMappingURL=version.js.map
@@ -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
+ }