@mermkit/core 0.1.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/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +148 -0
- package/dist/index.js.map +1 -0
- package/package.json +16 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type Diagram = {
|
|
2
|
+
id: string;
|
|
3
|
+
source: string;
|
|
4
|
+
title?: string;
|
|
5
|
+
lang?: string;
|
|
6
|
+
meta?: Record<string, string>;
|
|
7
|
+
};
|
|
8
|
+
export type ExtractOptions = {
|
|
9
|
+
fenceLangs?: string[];
|
|
10
|
+
keepFenceLang?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare function extractDiagrams(markdownText: string, options?: ExtractOptions): Diagram[];
|
|
13
|
+
export declare function normalizeDiagram(source: string): string;
|
|
14
|
+
export declare function validateDiagram(source: string): {
|
|
15
|
+
ok: boolean;
|
|
16
|
+
warnings: string[];
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAGF,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,EAAE,CA+C7F;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKvD;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAanF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// Extract Mermaid diagrams from markdown text.
|
|
2
|
+
export function extractDiagrams(markdownText, options = {}) {
|
|
3
|
+
const fenceLangs = (options.fenceLangs ?? ["mermaid", "mmd", "mermkit"]).map((l) => l.toLowerCase());
|
|
4
|
+
const lines = normalizeLineEndings(markdownText).split("\n");
|
|
5
|
+
const diagrams = [];
|
|
6
|
+
let inFence = false;
|
|
7
|
+
let fenceMarker = "";
|
|
8
|
+
let fenceLang = "";
|
|
9
|
+
let fenceMeta;
|
|
10
|
+
let buffer = [];
|
|
11
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
12
|
+
const line = lines[i];
|
|
13
|
+
if (!inFence) {
|
|
14
|
+
const open = parseFenceOpen(line);
|
|
15
|
+
if (open && fenceLangs.includes(open.lang.toLowerCase())) {
|
|
16
|
+
inFence = true;
|
|
17
|
+
fenceMarker = open.marker;
|
|
18
|
+
fenceLang = open.lang;
|
|
19
|
+
fenceMeta = open.meta;
|
|
20
|
+
buffer = [];
|
|
21
|
+
}
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (isFenceClose(line, fenceMarker)) {
|
|
25
|
+
const source = normalizeDiagram(buffer.join("\n"));
|
|
26
|
+
const id = `diagram-${diagrams.length + 1}`;
|
|
27
|
+
diagrams.push({
|
|
28
|
+
id,
|
|
29
|
+
source,
|
|
30
|
+
lang: options.keepFenceLang ? fenceLang : undefined,
|
|
31
|
+
meta: fenceMeta
|
|
32
|
+
});
|
|
33
|
+
inFence = false;
|
|
34
|
+
fenceMarker = "";
|
|
35
|
+
fenceLang = "";
|
|
36
|
+
fenceMeta = undefined;
|
|
37
|
+
buffer = [];
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
buffer.push(line);
|
|
41
|
+
}
|
|
42
|
+
return diagrams;
|
|
43
|
+
}
|
|
44
|
+
// Normalize diagram source (line endings, trimming, etc.).
|
|
45
|
+
export function normalizeDiagram(source) {
|
|
46
|
+
const normalized = normalizeLineEndings(source);
|
|
47
|
+
const lines = normalized.split("\n");
|
|
48
|
+
const trimmedLines = trimBlankEdges(lines).map((line) => line.replace(/[ \t]+$/g, ""));
|
|
49
|
+
return trimmedLines.join("\n");
|
|
50
|
+
}
|
|
51
|
+
// Validate diagram source for basic safety checks.
|
|
52
|
+
export function validateDiagram(source) {
|
|
53
|
+
const warnings = [];
|
|
54
|
+
const lower = source.toLowerCase();
|
|
55
|
+
if (lower.includes("http://") || lower.includes("https://")) {
|
|
56
|
+
warnings.push("diagram contains URLs; remote resources are disabled by default");
|
|
57
|
+
}
|
|
58
|
+
if (lower.includes("%%{")) {
|
|
59
|
+
warnings.push("diagram contains init directives; ensure renderer enforces safe config");
|
|
60
|
+
}
|
|
61
|
+
return { ok: warnings.length === 0, warnings };
|
|
62
|
+
}
|
|
63
|
+
function normalizeLineEndings(text) {
|
|
64
|
+
return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
65
|
+
}
|
|
66
|
+
function parseFenceOpen(line) {
|
|
67
|
+
const match = /^(\s*)(```+|~~~+)(.*)$/.exec(line);
|
|
68
|
+
if (!match)
|
|
69
|
+
return null;
|
|
70
|
+
const marker = match[2];
|
|
71
|
+
const info = match[3].trim();
|
|
72
|
+
if (!info)
|
|
73
|
+
return null;
|
|
74
|
+
const [lang, ...rest] = info.split(/\s+/);
|
|
75
|
+
const meta = parseInfoMeta(rest.join(" "));
|
|
76
|
+
return { marker, lang, meta };
|
|
77
|
+
}
|
|
78
|
+
function parseInfoMeta(info) {
|
|
79
|
+
if (!info)
|
|
80
|
+
return undefined;
|
|
81
|
+
const meta = {};
|
|
82
|
+
const tokens = tokenizeInfo(info);
|
|
83
|
+
for (const token of tokens) {
|
|
84
|
+
const eq = token.indexOf("=");
|
|
85
|
+
if (eq === -1)
|
|
86
|
+
continue;
|
|
87
|
+
const key = token.slice(0, eq).trim();
|
|
88
|
+
const rawValue = token.slice(eq + 1).trim();
|
|
89
|
+
const value = unquote(rawValue);
|
|
90
|
+
if (key)
|
|
91
|
+
meta[key] = value;
|
|
92
|
+
}
|
|
93
|
+
return Object.keys(meta).length > 0 ? meta : undefined;
|
|
94
|
+
}
|
|
95
|
+
function tokenizeInfo(info) {
|
|
96
|
+
const tokens = [];
|
|
97
|
+
let current = "";
|
|
98
|
+
let quote = null;
|
|
99
|
+
for (let i = 0; i < info.length; i += 1) {
|
|
100
|
+
const ch = info[i];
|
|
101
|
+
if (quote) {
|
|
102
|
+
if (ch === quote) {
|
|
103
|
+
quote = null;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
current += ch;
|
|
107
|
+
}
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (ch === "\"" || ch === "'") {
|
|
111
|
+
quote = ch;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (/\s/.test(ch)) {
|
|
115
|
+
if (current) {
|
|
116
|
+
tokens.push(current);
|
|
117
|
+
current = "";
|
|
118
|
+
}
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
current += ch;
|
|
122
|
+
}
|
|
123
|
+
if (current)
|
|
124
|
+
tokens.push(current);
|
|
125
|
+
return tokens;
|
|
126
|
+
}
|
|
127
|
+
function unquote(value) {
|
|
128
|
+
if ((value.startsWith("\"") && value.endsWith("\"")) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
129
|
+
return value.slice(1, -1);
|
|
130
|
+
}
|
|
131
|
+
return value;
|
|
132
|
+
}
|
|
133
|
+
function isFenceClose(line, marker) {
|
|
134
|
+
if (!marker)
|
|
135
|
+
return false;
|
|
136
|
+
const trimmed = line.trim();
|
|
137
|
+
return trimmed.startsWith(marker);
|
|
138
|
+
}
|
|
139
|
+
function trimBlankEdges(lines) {
|
|
140
|
+
let start = 0;
|
|
141
|
+
let end = lines.length;
|
|
142
|
+
while (start < end && lines[start].trim() === "")
|
|
143
|
+
start += 1;
|
|
144
|
+
while (end > start && lines[end - 1].trim() === "")
|
|
145
|
+
end -= 1;
|
|
146
|
+
return lines.slice(start, end);
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mermkit/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc -b"
|
|
15
|
+
}
|
|
16
|
+
}
|