@pinkpixel/marzipan 1.1.0 → 1.1.2
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 +72 -37
- package/dist/_basePickBy-D4kyG5Tu.js +152 -0
- package/dist/_basePickBy-D4kyG5Tu.js.map +1 -0
- package/dist/_baseUniq-s5uZhHMt.js +615 -0
- package/dist/_baseUniq-s5uZhHMt.js.map +1 -0
- package/dist/arc-Cd2Fw3V6.js +84 -0
- package/dist/arc-Cd2Fw3V6.js.map +1 -0
- package/dist/architectureDiagram-VXUJARFQ-ylT61Lln.js +4663 -0
- package/dist/architectureDiagram-VXUJARFQ-ylT61Lln.js.map +1 -0
- package/dist/blockDiagram-VD42YOAC-CoIxLSyQ.js +2257 -0
- package/dist/blockDiagram-VD42YOAC-CoIxLSyQ.js.map +1 -0
- package/dist/c4Diagram-YG6GDRKO-CsQimMM6.js +1581 -0
- package/dist/c4Diagram-YG6GDRKO-CsQimMM6.js.map +1 -0
- package/dist/channel-0tZUlnqz.js +6 -0
- package/dist/channel-0tZUlnqz.js.map +1 -0
- package/dist/chunk-4BX2VUAB-DVkBhLxy.js +9 -0
- package/dist/chunk-4BX2VUAB-DVkBhLxy.js.map +1 -0
- package/dist/chunk-55IACEB6-CVQcegI-.js +9 -0
- package/dist/chunk-55IACEB6-CVQcegI-.js.map +1 -0
- package/dist/chunk-B4BG7PRW-DPUTNckV.js +1376 -0
- package/dist/chunk-B4BG7PRW-DPUTNckV.js.map +1 -0
- package/dist/chunk-DI55MBZ5-F7DI2N9R.js +1371 -0
- package/dist/chunk-DI55MBZ5-F7DI2N9R.js.map +1 -0
- package/dist/chunk-FMBD7UC4-C3wNpU7V.js +20 -0
- package/dist/chunk-FMBD7UC4-C3wNpU7V.js.map +1 -0
- package/dist/chunk-QN33PNHL-BOdqrixJ.js +20 -0
- package/dist/chunk-QN33PNHL-BOdqrixJ.js.map +1 -0
- package/dist/chunk-QZHKN3VN-BFPNdgmW.js +16 -0
- package/dist/chunk-QZHKN3VN-BFPNdgmW.js.map +1 -0
- package/dist/chunk-TZMSLE5B-BZuxNW58.js +65 -0
- package/dist/chunk-TZMSLE5B-BZuxNW58.js.map +1 -0
- package/dist/classDiagram-2ON5EDUG-CiRjpBEe.js +17 -0
- package/dist/classDiagram-2ON5EDUG-CiRjpBEe.js.map +1 -0
- package/dist/classDiagram-v2-WZHVMYZB-CiRjpBEe.js +17 -0
- package/dist/classDiagram-v2-WZHVMYZB-CiRjpBEe.js.map +1 -0
- package/dist/clone-Bm_onhkP.js +9 -0
- package/dist/clone-Bm_onhkP.js.map +1 -0
- package/dist/cose-bilkent-S5V4N54A-D9xMKgKB.js +2609 -0
- package/dist/cose-bilkent-S5V4N54A-D9xMKgKB.js.map +1 -0
- package/dist/dagre-6UL2VRFP-BhIQJjaK.js +445 -0
- package/dist/dagre-6UL2VRFP-BhIQJjaK.js.map +1 -0
- package/dist/diagram-PSM6KHXK-h4YEzD1S.js +532 -0
- package/dist/diagram-PSM6KHXK-h4YEzD1S.js.map +1 -0
- package/dist/diagram-QEK2KX5R-spuV0akZ.js +218 -0
- package/dist/diagram-QEK2KX5R-spuV0akZ.js.map +1 -0
- package/dist/diagram-S2PKOQOG-CQx-wsyw.js +143 -0
- package/dist/diagram-S2PKOQOG-CQx-wsyw.js.map +1 -0
- package/dist/erDiagram-Q2GNP2WA-Cqkjjf2a.js +842 -0
- package/dist/erDiagram-Q2GNP2WA-Cqkjjf2a.js.map +1 -0
- package/dist/flowDiagram-NV44I4VS-mCXE9u9b.js +1621 -0
- package/dist/flowDiagram-NV44I4VS-mCXE9u9b.js.map +1 -0
- package/dist/ganttDiagram-JELNMOA3-Bz1GBIHE.js +2671 -0
- package/dist/ganttDiagram-JELNMOA3-Bz1GBIHE.js.map +1 -0
- package/dist/gitGraphDiagram-V2S2FVAM-Be01Oq15.js +700 -0
- package/dist/gitGraphDiagram-V2S2FVAM-Be01Oq15.js.map +1 -0
- package/dist/graph-DVWVTM7e.js +248 -0
- package/dist/graph-DVWVTM7e.js.map +1 -0
- package/dist/index-kKw24iiA.js +34 -0
- package/dist/index-kKw24iiA.js.map +1 -0
- package/dist/index.d.ts +0 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +270 -277
- package/dist/index.js.map +1 -1
- package/dist/infoDiagram-HS3SLOUP-joTtnw9j.js +25 -0
- package/dist/infoDiagram-HS3SLOUP-joTtnw9j.js.map +1 -0
- package/dist/journeyDiagram-XKPGCS4Q-CMVu7VEd.js +835 -0
- package/dist/journeyDiagram-XKPGCS4Q-CMVu7VEd.js.map +1 -0
- package/dist/kanban-definition-3W4ZIXB7-CfanK5Eg.js +720 -0
- package/dist/kanban-definition-3W4ZIXB7-CfanK5Eg.js.map +1 -0
- package/dist/katex-Cj93GM5Y.js +11605 -0
- package/dist/katex-Cj93GM5Y.js.map +1 -0
- package/dist/layout-BC8VSiQq.js +1336 -0
- package/dist/layout-BC8VSiQq.js.map +1 -0
- package/dist/linear-GV5CIa17.js +260 -0
- package/dist/linear-GV5CIa17.js.map +1 -0
- package/dist/marzipan.d.ts +1 -2
- package/dist/marzipan.d.ts.map +1 -1
- package/dist/marzipan.js +1 -19
- package/dist/marzipan.js.map +1 -1
- package/dist/mermaid.core-cSWK5aGH.js +15302 -0
- package/dist/mermaid.core-cSWK5aGH.js.map +1 -0
- package/dist/mindmap-definition-VGOIOE7T-Vu_RTZar.js +785 -0
- package/dist/mindmap-definition-VGOIOE7T-Vu_RTZar.js.map +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +6 -5
- package/dist/parser.js.map +1 -1
- package/dist/pieDiagram-ADFJNKIX-BUcd1l-6.js +162 -0
- package/dist/pieDiagram-ADFJNKIX-BUcd1l-6.js.map +1 -0
- package/dist/plugins/accentSwatchPlugin.d.ts +1 -1
- package/dist/plugins/accentSwatchPlugin.d.ts.map +1 -1
- package/dist/plugins/accentSwatchPlugin.js +162 -81
- package/dist/plugins/accentSwatchPlugin.js.map +1 -1
- package/dist/plugins/block-handles.d.ts +10 -2
- package/dist/plugins/block-handles.d.ts.map +1 -1
- package/dist/plugins/block-handles.js +77 -51
- package/dist/plugins/block-handles.js.map +1 -1
- package/dist/plugins/index.d.ts +0 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +27 -29
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/mermaidPlugin.js +1 -1
- package/dist/plugins/tinyHighlight.d.ts.map +1 -1
- package/dist/plugins/tinyHighlight.js +34 -22
- package/dist/plugins/tinyHighlight.js.map +1 -1
- package/dist/quadrantDiagram-AYHSOK5B-B1ekOH99.js +1023 -0
- package/dist/quadrantDiagram-AYHSOK5B-B1ekOH99.js.map +1 -0
- package/dist/requirementDiagram-UZGBJVZJ-BNcVcwNf.js +851 -0
- package/dist/requirementDiagram-UZGBJVZJ-BNcVcwNf.js.map +1 -0
- package/dist/sankeyDiagram-TZEHDZUN-BpHcdj5K.js +811 -0
- package/dist/sankeyDiagram-TZEHDZUN-BpHcdj5K.js.map +1 -0
- package/dist/sequenceDiagram-WL72ISMW-D5UyNvsv.js +2512 -0
- package/dist/sequenceDiagram-WL72ISMW-D5UyNvsv.js.map +1 -0
- package/dist/stateDiagram-FKZM4ZOC-C8DBscXu.js +264 -0
- package/dist/stateDiagram-FKZM4ZOC-C8DBscXu.js.map +1 -0
- package/dist/stateDiagram-v2-4FDKWEC3-CHqwUDPY.js +17 -0
- package/dist/stateDiagram-v2-4FDKWEC3-CHqwUDPY.js.map +1 -0
- package/dist/timeline-definition-IT6M3QCI-Dtg0oJbr.js +796 -0
- package/dist/timeline-definition-IT6M3QCI-Dtg0oJbr.js.map +1 -0
- package/dist/treemap-GDKQZRPO-rbQo3Em-.js +17926 -0
- package/dist/treemap-GDKQZRPO-rbQo3Em-.js.map +1 -0
- package/dist/xychartDiagram-PRI3JC2R-uNpgYSnV.js +1341 -0
- package/dist/xychartDiagram-PRI3JC2R-uNpgYSnV.js.map +1 -0
- package/docs/.vitepress/config.ts +1 -1
- package/docs/README.md +6 -8
- package/docs/TABLE_OF_CONTENTS.md +4 -1
- package/docs/api.md +262 -202
- package/docs/index.md +22 -19
- package/docs/plugins.md +27 -23
- package/package.json +1 -1
- package/docs/block-handles.md +0 -325
|
@@ -1,27 +1,39 @@
|
|
|
1
|
-
function
|
|
1
|
+
function m(e) {
|
|
2
2
|
return e.replace(/[&<>"']/g, (t) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[t]);
|
|
3
3
|
}
|
|
4
4
|
function f(e, t) {
|
|
5
|
-
|
|
6
|
-
for (const { pattern:
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
const c = [];
|
|
6
|
+
for (const { pattern: s, cls: n } of t) {
|
|
7
|
+
const p = new RegExp(s.source, s.flags);
|
|
8
|
+
let l;
|
|
9
|
+
for (; (l = p.exec(e)) !== null && (c.push({ start: l.index, end: l.index + l[0].length, cls: n }), !!p.global); )
|
|
10
|
+
l[0].length === 0 && p.lastIndex++;
|
|
11
|
+
}
|
|
12
|
+
c.sort((s, n) => s.start - n.start || n.end - n.start - (s.end - s.start));
|
|
13
|
+
const i = [];
|
|
14
|
+
let g = 0;
|
|
15
|
+
for (const s of c)
|
|
16
|
+
s.start >= g && (i.push(s), g = s.end);
|
|
17
|
+
let o = "", r = 0;
|
|
18
|
+
for (const s of i)
|
|
19
|
+
s.start > r && (o += m(e.slice(r, s.start))), o += `<span class="tok ${s.cls}">${m(e.slice(s.start, s.end))}</span>`, r = s.end;
|
|
20
|
+
return r < e.length && (o += m(e.slice(r))), o;
|
|
9
21
|
}
|
|
10
|
-
const
|
|
22
|
+
const u = String.raw`\b(abstract|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b`, h = String.raw`\b(string|number|boolean|any|unknown|never|void|null|undefined|Record|Partial|Readonly|Array|Promise|Map|Set)\b`, a = {
|
|
11
23
|
js: [
|
|
12
24
|
{ pattern: /\/\/.*/g, cls: "com" },
|
|
13
25
|
{ pattern: /\/\*[\s\S]*?\*\//g, cls: "com" },
|
|
14
26
|
{ pattern: /(['"`])(?:\\.|(?!\1)[\s\S])*\1/g, cls: "str" },
|
|
15
27
|
{ pattern: /\b\d[\d_]*(?:\.[\d_]+)?\b/g, cls: "num" },
|
|
16
|
-
{ pattern: new RegExp(
|
|
28
|
+
{ pattern: new RegExp(u, "g"), cls: "kw" }
|
|
17
29
|
],
|
|
18
30
|
ts: [
|
|
19
31
|
{ pattern: /\/\/.*/g, cls: "com" },
|
|
20
32
|
{ pattern: /\/\*[\s\S]*?\*\//g, cls: "com" },
|
|
21
33
|
{ pattern: /(['"`])(?:\\.|(?!\1)[\s\S])*\1/g, cls: "str" },
|
|
22
34
|
{ pattern: new RegExp("\\b\\d[\\d_]*(?:\\.[\\d_]+)?\\b", "g"), cls: "num" },
|
|
23
|
-
{ pattern: new RegExp(
|
|
24
|
-
{ pattern: new RegExp(
|
|
35
|
+
{ pattern: new RegExp(u, "g"), cls: "kw" },
|
|
36
|
+
{ pattern: new RegExp(h, "g"), cls: "type" }
|
|
25
37
|
],
|
|
26
38
|
json: [
|
|
27
39
|
{ pattern: /"(?:\\.|[^"])*"(?=\s*:)/g, cls: "prop" },
|
|
@@ -65,29 +77,29 @@ const g = String.raw`\b(abstract|await|break|case|catch|class|const|continue|deb
|
|
|
65
77
|
{ pattern: /\*[^*]+\*/g, cls: "em" }
|
|
66
78
|
]
|
|
67
79
|
};
|
|
68
|
-
function
|
|
80
|
+
function d(e) {
|
|
69
81
|
const t = e.replace(/^language-/, "").toLowerCase();
|
|
70
|
-
return t === "ts" || t === "tsx" ?
|
|
82
|
+
return t === "ts" || t === "tsx" || t === "typescript" ? a.ts : t === "js" || t === "jsx" || t === "mjs" || t === "cjs" || t === "javascript" ? a.js : t === "json" || t === "jsonc" ? a.json : t === "html" || t === "xml" || t === "svg" ? a.html : t === "css" || t === "scss" || t === "less" ? a.css : t === "bash" || t === "sh" || t === "shell" || t === "zsh" || t === "fish" ? a.bash : t === "ini" || t === "conf" || t === "toml" ? a.ini : t === "md" || t === "markdown" ? a.md : [];
|
|
71
83
|
}
|
|
72
84
|
function w() {
|
|
73
85
|
return (e) => {
|
|
74
86
|
const t = e.options.hooks?.afterPreviewRender;
|
|
75
|
-
e.options.hooks = e.options.hooks || {}, e.options.hooks.afterPreviewRender = (
|
|
76
|
-
t?.(
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
79
|
-
const
|
|
80
|
-
if (!
|
|
81
|
-
|
|
87
|
+
e.options.hooks = e.options.hooks || {}, e.options.hooks.afterPreviewRender = (c, i) => {
|
|
88
|
+
t?.(c, i), c.querySelectorAll('pre code[class*="language-"]').forEach((o) => {
|
|
89
|
+
const r = o;
|
|
90
|
+
if (r.dataset.hl === "1") return;
|
|
91
|
+
const s = [...r.classList].find((l) => l.startsWith("language-")), n = d(s);
|
|
92
|
+
if (!n.length) {
|
|
93
|
+
r.dataset.hl = "1";
|
|
82
94
|
return;
|
|
83
95
|
}
|
|
84
|
-
const
|
|
85
|
-
|
|
96
|
+
const p = r.textContent || "";
|
|
97
|
+
r.innerHTML = f(p, n), r.closest("pre")?.classList.add("marzipan-highlight"), r.dataset.hl = "1";
|
|
86
98
|
});
|
|
87
99
|
};
|
|
88
100
|
};
|
|
89
101
|
}
|
|
90
|
-
const
|
|
102
|
+
const k = `
|
|
91
103
|
.marzipan-highlight { line-height: 1.5; overflow: auto; border-radius: 8px; }
|
|
92
104
|
.tok.kw { color: var(--mz-k, #c678dd); font-weight: 600; }
|
|
93
105
|
.tok.type { color: var(--mz-t, #56b6c2); }
|
|
@@ -104,6 +116,6 @@ const b = `
|
|
|
104
116
|
`;
|
|
105
117
|
export {
|
|
106
118
|
w as tinyHighlightPlugin,
|
|
107
|
-
|
|
119
|
+
k as tinyHighlightStyles
|
|
108
120
|
};
|
|
109
121
|
//# sourceMappingURL=tinyHighlight.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tinyHighlight.js","sources":["../../src/plugins/tinyHighlight.ts"],"sourcesContent":["// plugins/tinyHighlight.ts\n// A tiny, regex-based highlighter for common languages. Zero deps.\n// Not spec-perfect; tuned for readability and speed.\n\nexport type MarzipanLike = {\n options: { hooks?: { afterPreviewRender?: (root: HTMLElement, editor: any) => void } };\n};\n\ntype Rule = { pattern: RegExp; cls: string };\n\nfunction escHtml(s: string) {\n return s.replace(/[&<>\"']/g, m => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }[m]!));\n}\n\nfunction applyRules(code: string, rules: Rule[]) {\n // Protect code by escaping, then re-inject spans via token placeholders\n let html = escHtml(code);\n // Run longer-span rules first (comments/strings), then keywords/numbers.\n for (const { pattern, cls } of rules) {\n html = html.replace(pattern, (m) => `<span class=\"tok ${cls}\">${escHtml(m)}</span>`);\n }\n return html;\n}\n\nconst JS_WORDS = String.raw`\\b(abstract|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\\b`;\nconst TYPES = String.raw`\\b(string|number|boolean|any|unknown|never|void|null|undefined|Record|Partial|Readonly|Array|Promise|Map|Set)\\b`;\n\nconst rulesByLang: Record<string, Rule[]> = {\n js: [\n { pattern: /\\/\\/.*/g, cls: 'com' },\n { pattern: /\\/\\*[\\s\\S]*?\\*\\//g, cls: 'com' },\n { pattern: /(['\"`])(?:\\\\.|(?!\\1)[\\s\\S])*\\1/g, cls: 'str' },\n { pattern: /\\b\\d[\\d_]*(?:\\.[\\d_]+)?\\b/g, cls: 'num' },\n { pattern: new RegExp(JS_WORDS, 'g'), cls: 'kw' },\n ],\n ts: [\n { pattern: /\\/\\/.*/g, cls: 'com' },\n { pattern: /\\/\\*[\\s\\S]*?\\*\\//g, cls: 'com' },\n { pattern: /(['\"`])(?:\\\\.|(?!\\1)[\\s\\S])*\\1/g, cls: 'str' },\n { pattern: new RegExp(`\\\\b\\\\d[\\\\d_]*(?:\\\\.[\\\\d_]+)?\\\\b`, 'g'), cls: 'num' },\n { pattern: new RegExp(JS_WORDS, 'g'), cls: 'kw' },\n { pattern: new RegExp(TYPES, 'g'), cls: 'type' },\n ],\n json: [\n { pattern: /\"(?:\\\\.|[^\"])*\"(?=\\s*:)/g, cls: 'prop' },\n { pattern: /\"(?:\\\\.|[^\"])*\"/g, cls: 'str' },\n { pattern: /\\b(true|false|null)\\b/g, cls: 'kw' },\n { pattern: /-?\\b\\d[\\d.]*\\b/g, cls: 'num' },\n ],\n css: [\n { pattern: /\\/\\*[\\s\\S]*?\\*\\//g, cls: 'com' },\n { pattern: /#[0-9a-fA-F]{3,8}\\b/g, cls: 'num' },\n { pattern: /\\b\\d+(\\.\\d+)?(px|em|rem|%|vh|vw)\\b/g, cls: 'num' },\n { pattern: /:[a-z-]+(?=\\s*:)/g, cls: 'prop' },\n { pattern: /\\b(var|calc|clamp)\\b/g, cls: 'kw' },\n ],\n html: [\n { pattern: /<!--[\\s\\S]*?-->/g, cls: 'com' },\n { pattern: /<\\/?[a-zA-Z][\\w:-]*/g, cls: 'tag' },\n { pattern: /\\s+[a-zA-Z_:][\\w:.-]*(?==)/g, cls: 'attr' },\n { pattern: /\"[^\"]*\"|'[^']*'/g, cls: 'str' },\n { pattern: /\\/?>/g, cls: 'tag' },\n ],\n bash: [\n { pattern: /#.*/g, cls: 'com' },\n { pattern: /\\$[A-Za-z_]\\w*/g, cls: 'var' },\n { pattern: /(['\"`])(?:\\\\.|(?!\\1)[\\s\\S])*\\1/g, cls: 'str' },\n { pattern: /^\\s*[a-zA-Z][\\w-]*/gm, cls: 'kw' },\n { pattern: /\\b\\d+\\b/g, cls: 'num' },\n ],\n ini: [\n { pattern: /;.*/g, cls: 'com' },\n { pattern: /^\\s*\\[[^\\]]+\\]/gm, cls: 'kw' },\n { pattern: /^\\s*[A-Za-z0-9_.-]+\\s*(?==)/gm, cls: 'prop' },\n { pattern: /=\\s*\".*?\"|=\\s*'.*?'|=\\s*\\S+/g, cls: 'str' },\n ],\n md: [\n { pattern: /^###[^\\n]+/gm, cls: 'kw' },\n { pattern: /^##[^\\n]+/gm, cls: 'kw' },\n { pattern: /^#[^\\n]+/gm, cls: 'kw' },\n { pattern: /`[^`]+`/g, cls: 'code' },\n { pattern: /\\*\\*[^*]+\\*\\*/g, cls: 'strong' },\n { pattern: /\\*[^*]+\\*/g, cls: 'em' },\n ]\n};\n\nfunction langToRules(langClass: string): Rule[] {\n const lang = langClass.replace(/^language-/, '').toLowerCase();\n if (lang === 'ts' || lang === 'tsx') return rulesByLang.ts;\n if (lang === 'js' || lang === 'jsx' || lang === 'mjs' || lang === 'cjs') return rulesByLang.js;\n if (lang === 'json') return rulesByLang.json;\n if (lang === 'html' || lang === 'xml') return rulesByLang.html;\n if (lang === 'css') return rulesByLang.css;\n if (lang === 'bash' || lang === 'sh' || lang === 'shell') return rulesByLang.bash;\n if (lang === 'ini' || lang === 'conf') return rulesByLang.ini;\n if (lang === 'md' || lang === 'markdown') return rulesByLang.md;\n return []; // unknown -> no-op\n}\n\nexport function tinyHighlightPlugin() {\n return (editor: MarzipanLike) => {\n const prev = editor.options.hooks?.afterPreviewRender;\n editor.options.hooks = editor.options.hooks || {};\n editor.options.hooks.afterPreviewRender = (root: HTMLElement, e: any) => {\n prev?.(root, e);\n\n const blocks = root.querySelectorAll('pre code[class*=\"language-\"]');\n blocks.forEach((codeEl) => {\n const el = codeEl as HTMLElement;\n if (el.dataset.hl === '1') return;\n const cls = [...el.classList].find(c => c.startsWith('language-'))!;\n const rules = langToRules(cls);\n if (!rules.length) { el.dataset.hl = '1'; return; }\n\n const src = el.textContent || '';\n (el as HTMLElement).innerHTML = applyRules(src, rules);\n (el.closest('pre') as HTMLElement)?.classList.add('marzipan-highlight');\n el.dataset.hl = '1';\n });\n };\n };\n}\n\n// Optional styles — include once in your app:\nexport const tinyHighlightStyles = `\n.marzipan-highlight { line-height: 1.5; overflow: auto; border-radius: 8px; }\n.tok.kw { color: var(--mz-k, #c678dd); font-weight: 600; }\n.tok.type { color: var(--mz-t, #56b6c2); }\n.tok.prop { color: var(--mz-p, #e5c07b); }\n.tok.num { color: var(--mz-n, #d19a66); }\n.tok.str { color: var(--mz-s, #98c379); }\n.tok.com { color: var(--mz-c, #7f848e); font-style: italic; }\n.tok.tag { color: var(--mz-tag, #e06c75); }\n.tok.attr { color: var(--mz-attr, #61afef); }\n.tok.var { color: var(--mz-var, #61afef); }\n.tok.code { color: var(--mz-code, #e5c07b); }\n.tok.strong { font-weight: 700; }\n.tok.em { font-style: italic; }\n`;"],"names":["escHtml","s","m","applyRules","code","rules","html","pattern","cls","JS_WORDS","TYPES","rulesByLang","langToRules","langClass","lang","tinyHighlightPlugin","editor","prev","root","e","codeEl","el","c","src","tinyHighlightStyles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tinyHighlight.js","sources":["../../src/plugins/tinyHighlight.ts"],"sourcesContent":["// plugins/tinyHighlight.ts\n// A tiny, regex-based highlighter for common languages. Zero deps.\n// Not spec-perfect; tuned for readability and speed.\n\nexport type MarzipanLike = {\n options: { hooks?: { afterPreviewRender?: (root: HTMLElement, editor: any) => void } };\n};\n\ntype Rule = { pattern: RegExp; cls: string };\n\nfunction escHtml(s: string) {\n return s.replace(/[&<>\"']/g, m => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }[m]!));\n}\n\nfunction applyRules(code: string, rules: Rule[]) {\n // Collect all matches from raw (unescaped) source\n type Match = { start: number; end: number; cls: string };\n const matches: Match[] = [];\n\n for (const { pattern, cls } of rules) {\n const re = new RegExp(pattern.source, pattern.flags);\n let m: RegExpExecArray | null;\n while ((m = re.exec(code)) !== null) {\n matches.push({ start: m.index, end: m.index + m[0].length, cls });\n if (!re.global) break;\n if (m[0].length === 0) { re.lastIndex++; }\n }\n }\n\n // Sort by position; longer matches first for ties at same start\n matches.sort((a, b) => a.start - b.start || (b.end - b.start) - (a.end - a.start));\n\n // Filter overlapping: earlier/longer match wins\n const kept: Match[] = [];\n let cursor = 0;\n for (const m of matches) {\n if (m.start >= cursor) {\n kept.push(m);\n cursor = m.end;\n }\n }\n\n // Build HTML: escape plain text, wrap matched segments in spans\n let html = '';\n let pos = 0;\n for (const m of kept) {\n if (m.start > pos) html += escHtml(code.slice(pos, m.start));\n html += `<span class=\"tok ${m.cls}\">${escHtml(code.slice(m.start, m.end))}</span>`;\n pos = m.end;\n }\n if (pos < code.length) html += escHtml(code.slice(pos));\n\n return html;\n}\n\nconst JS_WORDS = String.raw`\\b(abstract|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\\b`;\nconst TYPES = String.raw`\\b(string|number|boolean|any|unknown|never|void|null|undefined|Record|Partial|Readonly|Array|Promise|Map|Set)\\b`;\n\nconst rulesByLang: Record<string, Rule[]> = {\n js: [\n { pattern: /\\/\\/.*/g, cls: 'com' },\n { pattern: /\\/\\*[\\s\\S]*?\\*\\//g, cls: 'com' },\n { pattern: /(['\"`])(?:\\\\.|(?!\\1)[\\s\\S])*\\1/g, cls: 'str' },\n { pattern: /\\b\\d[\\d_]*(?:\\.[\\d_]+)?\\b/g, cls: 'num' },\n { pattern: new RegExp(JS_WORDS, 'g'), cls: 'kw' },\n ],\n ts: [\n { pattern: /\\/\\/.*/g, cls: 'com' },\n { pattern: /\\/\\*[\\s\\S]*?\\*\\//g, cls: 'com' },\n { pattern: /(['\"`])(?:\\\\.|(?!\\1)[\\s\\S])*\\1/g, cls: 'str' },\n { pattern: new RegExp(`\\\\b\\\\d[\\\\d_]*(?:\\\\.[\\\\d_]+)?\\\\b`, 'g'), cls: 'num' },\n { pattern: new RegExp(JS_WORDS, 'g'), cls: 'kw' },\n { pattern: new RegExp(TYPES, 'g'), cls: 'type' },\n ],\n json: [\n { pattern: /\"(?:\\\\.|[^\"])*\"(?=\\s*:)/g, cls: 'prop' },\n { pattern: /\"(?:\\\\.|[^\"])*\"/g, cls: 'str' },\n { pattern: /\\b(true|false|null)\\b/g, cls: 'kw' },\n { pattern: /-?\\b\\d[\\d.]*\\b/g, cls: 'num' },\n ],\n css: [\n { pattern: /\\/\\*[\\s\\S]*?\\*\\//g, cls: 'com' },\n { pattern: /#[0-9a-fA-F]{3,8}\\b/g, cls: 'num' },\n { pattern: /\\b\\d+(\\.\\d+)?(px|em|rem|%|vh|vw)\\b/g, cls: 'num' },\n { pattern: /:[a-z-]+(?=\\s*:)/g, cls: 'prop' },\n { pattern: /\\b(var|calc|clamp)\\b/g, cls: 'kw' },\n ],\n html: [\n { pattern: /<!--[\\s\\S]*?-->/g, cls: 'com' },\n { pattern: /<\\/?[a-zA-Z][\\w:-]*/g, cls: 'tag' },\n { pattern: /\\s+[a-zA-Z_:][\\w:.-]*(?==)/g, cls: 'attr' },\n { pattern: /\"[^\"]*\"|'[^']*'/g, cls: 'str' },\n { pattern: /\\/?>/g, cls: 'tag' },\n ],\n bash: [\n { pattern: /#.*/g, cls: 'com' },\n { pattern: /\\$[A-Za-z_]\\w*/g, cls: 'var' },\n { pattern: /(['\"`])(?:\\\\.|(?!\\1)[\\s\\S])*\\1/g, cls: 'str' },\n { pattern: /^\\s*[a-zA-Z][\\w-]*/gm, cls: 'kw' },\n { pattern: /\\b\\d+\\b/g, cls: 'num' },\n ],\n ini: [\n { pattern: /;.*/g, cls: 'com' },\n { pattern: /^\\s*\\[[^\\]]+\\]/gm, cls: 'kw' },\n { pattern: /^\\s*[A-Za-z0-9_.-]+\\s*(?==)/gm, cls: 'prop' },\n { pattern: /=\\s*\".*?\"|=\\s*'.*?'|=\\s*\\S+/g, cls: 'str' },\n ],\n md: [\n { pattern: /^###[^\\n]+/gm, cls: 'kw' },\n { pattern: /^##[^\\n]+/gm, cls: 'kw' },\n { pattern: /^#[^\\n]+/gm, cls: 'kw' },\n { pattern: /`[^`]+`/g, cls: 'code' },\n { pattern: /\\*\\*[^*]+\\*\\*/g, cls: 'strong' },\n { pattern: /\\*[^*]+\\*/g, cls: 'em' },\n ]\n};\n\nfunction langToRules(langClass: string): Rule[] {\n const lang = langClass.replace(/^language-/, '').toLowerCase();\n if (lang === 'ts' || lang === 'tsx' || lang === 'typescript') return rulesByLang.ts;\n if (lang === 'js' || lang === 'jsx' || lang === 'mjs' || lang === 'cjs' || lang === 'javascript') return rulesByLang.js;\n if (lang === 'json' || lang === 'jsonc') return rulesByLang.json;\n if (lang === 'html' || lang === 'xml' || lang === 'svg') return rulesByLang.html;\n if (lang === 'css' || lang === 'scss' || lang === 'less') return rulesByLang.css;\n if (lang === 'bash' || lang === 'sh' || lang === 'shell' || lang === 'zsh' || lang === 'fish') return rulesByLang.bash;\n if (lang === 'ini' || lang === 'conf' || lang === 'toml') return rulesByLang.ini;\n if (lang === 'md' || lang === 'markdown') return rulesByLang.md;\n return []; // unknown -> no-op\n}\n\nexport function tinyHighlightPlugin() {\n return (editor: MarzipanLike) => {\n const prev = editor.options.hooks?.afterPreviewRender;\n editor.options.hooks = editor.options.hooks || {};\n editor.options.hooks.afterPreviewRender = (root: HTMLElement, e: any) => {\n prev?.(root, e);\n\n const blocks = root.querySelectorAll('pre code[class*=\"language-\"]');\n blocks.forEach((codeEl) => {\n const el = codeEl as HTMLElement;\n if (el.dataset.hl === '1') return;\n const cls = [...el.classList].find(c => c.startsWith('language-'))!;\n const rules = langToRules(cls);\n if (!rules.length) { el.dataset.hl = '1'; return; }\n\n const src = el.textContent || '';\n (el as HTMLElement).innerHTML = applyRules(src, rules);\n (el.closest('pre') as HTMLElement)?.classList.add('marzipan-highlight');\n el.dataset.hl = '1';\n });\n };\n };\n}\n\n// Optional styles — include once in your app:\nexport const tinyHighlightStyles = `\n.marzipan-highlight { line-height: 1.5; overflow: auto; border-radius: 8px; }\n.tok.kw { color: var(--mz-k, #c678dd); font-weight: 600; }\n.tok.type { color: var(--mz-t, #56b6c2); }\n.tok.prop { color: var(--mz-p, #e5c07b); }\n.tok.num { color: var(--mz-n, #d19a66); }\n.tok.str { color: var(--mz-s, #98c379); }\n.tok.com { color: var(--mz-c, #7f848e); font-style: italic; }\n.tok.tag { color: var(--mz-tag, #e06c75); }\n.tok.attr { color: var(--mz-attr, #61afef); }\n.tok.var { color: var(--mz-var, #61afef); }\n.tok.code { color: var(--mz-code, #e5c07b); }\n.tok.strong { font-weight: 700; }\n.tok.em { font-style: italic; }\n`;"],"names":["escHtml","s","m","applyRules","code","rules","matches","pattern","cls","re","a","b","kept","cursor","html","pos","JS_WORDS","TYPES","rulesByLang","langToRules","langClass","lang","tinyHighlightPlugin","editor","prev","root","e","codeEl","el","c","src","tinyHighlightStyles"],"mappings":"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"}
|