@arborium/arborium 2.12.4 → 2.14.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 +1 -1
- package/dist/arborium.d.ts +2 -2
- package/dist/arborium.iife.js +2 -2
- package/dist/arborium.iife.js.map +1 -1
- package/dist/arborium.js +197 -154
- package/dist/arborium.js.map +1 -1
- package/dist/arborium_host.d.ts +94 -0
- package/dist/arborium_host.js +300 -295
- package/dist/arborium_host_bg.wasm +0 -0
- package/dist/loader.d.ts +17 -0
- package/dist/plugins-manifest.d.ts +1 -1
- package/dist/types.d.ts +10 -4
- package/package.json +9 -2
package/dist/arborium.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _ = [
|
|
2
2
|
[/^#!.*\bpython[23]?\b/, "python"],
|
|
3
3
|
[/^#!.*\bnode\b/, "javascript"],
|
|
4
4
|
[/^#!.*\bdeno\b/, "typescript"],
|
|
@@ -74,20 +74,20 @@ const L = [
|
|
|
74
74
|
function M(e) {
|
|
75
75
|
const t = e.split(`
|
|
76
76
|
`)[0];
|
|
77
|
-
for (const [
|
|
78
|
-
if (
|
|
79
|
-
return
|
|
80
|
-
for (const [
|
|
81
|
-
if (
|
|
82
|
-
return
|
|
77
|
+
for (const [r, s] of _)
|
|
78
|
+
if (r.test(t))
|
|
79
|
+
return s;
|
|
80
|
+
for (const [r, s] of $)
|
|
81
|
+
if (r.test(e))
|
|
82
|
+
return s;
|
|
83
83
|
return null;
|
|
84
84
|
}
|
|
85
85
|
function R(e) {
|
|
86
86
|
const t = e.match(/\blanguage-(\w+)\b/);
|
|
87
87
|
if (t) return t[1];
|
|
88
|
-
const
|
|
89
|
-
if (
|
|
90
|
-
const
|
|
88
|
+
const r = e.match(/\blang-(\w+)\b/);
|
|
89
|
+
if (r) return r[1];
|
|
90
|
+
const s = /* @__PURE__ */ new Set([
|
|
91
91
|
"rust",
|
|
92
92
|
"javascript",
|
|
93
93
|
"typescript",
|
|
@@ -123,12 +123,12 @@ function R(e) {
|
|
|
123
123
|
"console",
|
|
124
124
|
"sh"
|
|
125
125
|
]);
|
|
126
|
-
for (const
|
|
127
|
-
if (
|
|
128
|
-
return
|
|
126
|
+
for (const a of e.split(/\s+/))
|
|
127
|
+
if (s.has(a.toLowerCase()))
|
|
128
|
+
return a.toLowerCase();
|
|
129
129
|
return null;
|
|
130
130
|
}
|
|
131
|
-
function
|
|
131
|
+
function F(e) {
|
|
132
132
|
const t = {
|
|
133
133
|
js: "javascript",
|
|
134
134
|
ts: "typescript",
|
|
@@ -149,10 +149,10 @@ function H(e) {
|
|
|
149
149
|
plaintext: "text",
|
|
150
150
|
plain: "text",
|
|
151
151
|
txt: "text"
|
|
152
|
-
},
|
|
153
|
-
return t[
|
|
152
|
+
}, r = e.toLowerCase();
|
|
153
|
+
return t[r] || r;
|
|
154
154
|
}
|
|
155
|
-
const
|
|
155
|
+
const L = "2.14.0", U = [
|
|
156
156
|
"ada",
|
|
157
157
|
"agda",
|
|
158
158
|
"asciidoc",
|
|
@@ -255,7 +255,7 @@ const _ = "2.12.4", U = [
|
|
|
255
255
|
"yuri",
|
|
256
256
|
"zig",
|
|
257
257
|
"zsh"
|
|
258
|
-
],
|
|
258
|
+
], J = [
|
|
259
259
|
{
|
|
260
260
|
name: "attribute",
|
|
261
261
|
tag: "at"
|
|
@@ -589,243 +589,286 @@ const _ = "2.12.4", U = [
|
|
|
589
589
|
tag: "cb"
|
|
590
590
|
}
|
|
591
591
|
];
|
|
592
|
-
function
|
|
592
|
+
function P(e) {
|
|
593
593
|
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
594
594
|
}
|
|
595
|
-
const
|
|
595
|
+
const j = {
|
|
596
596
|
manual: !1,
|
|
597
597
|
theme: "one-dark",
|
|
598
598
|
selector: "pre code",
|
|
599
599
|
cdn: "jsdelivr",
|
|
600
|
-
version:
|
|
600
|
+
version: L,
|
|
601
601
|
// Precise version from manifest
|
|
602
602
|
pluginsUrl: "",
|
|
603
603
|
// Empty means use bundled manifest
|
|
604
604
|
hostUrl: "",
|
|
605
605
|
// Empty means use CDN based on version
|
|
606
606
|
logger: console,
|
|
607
|
+
resolveHostJs: ({ baseUrl: e, path: t }) => import(
|
|
608
|
+
/* @vite-ignore */
|
|
609
|
+
`${e}/${t}`
|
|
610
|
+
),
|
|
611
|
+
resolveHostWasm: ({ baseUrl: e, path: t }) => fetch(`${e}/${t}`),
|
|
607
612
|
resolveJs: ({ baseUrl: e, path: t }) => import(
|
|
608
613
|
/* @vite-ignore */
|
|
609
614
|
`${e}/${t}`
|
|
610
615
|
),
|
|
611
616
|
resolveWasm: ({ baseUrl: e, path: t }) => fetch(`${e}/${t}`)
|
|
612
617
|
};
|
|
613
|
-
let
|
|
614
|
-
const
|
|
615
|
-
let
|
|
616
|
-
async function
|
|
618
|
+
let m = null, d = null, f = { ...j };
|
|
619
|
+
const h = /* @__PURE__ */ new Map(), k = /* @__PURE__ */ new Map(), p = new Set(U);
|
|
620
|
+
let c = null, b = null;
|
|
621
|
+
async function T(e) {
|
|
617
622
|
if (e.pluginsUrl)
|
|
618
|
-
return
|
|
623
|
+
return b || (b = (async () => {
|
|
619
624
|
e.logger.debug(`[arborium] Loading local plugins manifest from: ${e.pluginsUrl}`);
|
|
620
625
|
const t = await fetch(e.pluginsUrl);
|
|
621
626
|
if (!t.ok)
|
|
622
627
|
throw new Error(`Failed to load plugins.json: ${t.status}`);
|
|
623
|
-
|
|
624
|
-
})(),
|
|
628
|
+
c = await t.json(), e.logger.debug(`[arborium] Loaded local manifest with ${c?.entries.length} entries`);
|
|
629
|
+
})(), b);
|
|
625
630
|
}
|
|
626
|
-
function
|
|
627
|
-
if (
|
|
628
|
-
const
|
|
629
|
-
if (
|
|
630
|
-
return
|
|
631
|
+
function E(e, t) {
|
|
632
|
+
if (c) {
|
|
633
|
+
const n = c.entries.find((l) => l.language === e);
|
|
634
|
+
if (n)
|
|
635
|
+
return n.local_js.substring(0, n.local_js.lastIndexOf("/"));
|
|
631
636
|
}
|
|
632
|
-
const
|
|
633
|
-
let
|
|
634
|
-
return
|
|
637
|
+
const r = t.cdn, s = t.version;
|
|
638
|
+
let a;
|
|
639
|
+
return r === "jsdelivr" ? a = "https://cdn.jsdelivr.net/npm" : r === "unpkg" ? a = "https://unpkg.com" : a = r, `${a}/@arborium/${e}@${s}`;
|
|
635
640
|
}
|
|
636
|
-
async function
|
|
637
|
-
const a = y.get(e);
|
|
638
|
-
if (a)
|
|
639
|
-
return t.logger.debug(`[arborium] Grammar '${e}' found in cache`), a;
|
|
641
|
+
async function x(e, t) {
|
|
640
642
|
const r = h.get(e);
|
|
641
643
|
if (r)
|
|
642
|
-
return t.logger.debug(`[arborium] Grammar '${e}'
|
|
643
|
-
const
|
|
644
|
-
|
|
644
|
+
return t.logger.debug(`[arborium] Grammar '${e}' found in cache`), r;
|
|
645
|
+
const s = k.get(e);
|
|
646
|
+
if (s)
|
|
647
|
+
return t.logger.debug(`[arborium] Grammar '${e}' already loading, waiting...`), s;
|
|
648
|
+
const a = H(e, t);
|
|
649
|
+
k.set(e, a);
|
|
645
650
|
try {
|
|
646
|
-
return await
|
|
651
|
+
return await a;
|
|
647
652
|
} finally {
|
|
648
|
-
|
|
653
|
+
k.delete(e);
|
|
649
654
|
}
|
|
650
655
|
}
|
|
651
|
-
async function
|
|
652
|
-
if (await
|
|
656
|
+
async function H(e, t) {
|
|
657
|
+
if (await T(t), !p.has(e) && !c?.entries.some((r) => r.language === e))
|
|
653
658
|
return t.logger.debug(`[arborium] Grammar '${e}' not available`), null;
|
|
654
659
|
try {
|
|
655
|
-
const
|
|
656
|
-
t.logger.debug(`[arborium] Loading grammar '${e}'${
|
|
657
|
-
const
|
|
660
|
+
const r = E(e, t), s = t.resolveJs === j.resolveJs ? ` from ${r}/grammar.js` : "";
|
|
661
|
+
t.logger.debug(`[arborium] Loading grammar '${e}'${s}`);
|
|
662
|
+
const a = await t.resolveJs({
|
|
658
663
|
language: e,
|
|
659
|
-
baseUrl:
|
|
664
|
+
baseUrl: r,
|
|
660
665
|
path: "grammar.js"
|
|
661
|
-
}),
|
|
662
|
-
await
|
|
663
|
-
const
|
|
664
|
-
|
|
665
|
-
const
|
|
666
|
+
}), n = await t.resolveWasm({ language: e, baseUrl: r, path: "grammar_bg.wasm" });
|
|
667
|
+
await a.default({ module_or_path: n });
|
|
668
|
+
const l = a.language_id();
|
|
669
|
+
l !== e && t.logger.warn(`[arborium] Language ID mismatch: expected '${e}', got '${l}'`);
|
|
670
|
+
const w = a.injection_languages(), y = {
|
|
666
671
|
languageId: e,
|
|
667
|
-
injectionLanguages:
|
|
668
|
-
module:
|
|
672
|
+
injectionLanguages: w,
|
|
673
|
+
module: a,
|
|
669
674
|
// UTF-8 parsing for Rust host
|
|
670
|
-
parseUtf8: (
|
|
671
|
-
const
|
|
675
|
+
parseUtf8: (g) => {
|
|
676
|
+
const i = a.create_session();
|
|
672
677
|
try {
|
|
673
|
-
|
|
674
|
-
const
|
|
678
|
+
a.set_text(i, g);
|
|
679
|
+
const o = a.parse(i);
|
|
675
680
|
return {
|
|
676
|
-
spans:
|
|
677
|
-
injections:
|
|
681
|
+
spans: o.spans || [],
|
|
682
|
+
injections: o.injections || []
|
|
678
683
|
};
|
|
679
|
-
} catch (
|
|
680
|
-
return t.logger.error("[arborium] Parse error:",
|
|
684
|
+
} catch (o) {
|
|
685
|
+
return t.logger.error("[arborium] Parse error:", o), { spans: [], injections: [] };
|
|
681
686
|
} finally {
|
|
682
|
-
|
|
687
|
+
a.free_session(i);
|
|
683
688
|
}
|
|
684
689
|
},
|
|
685
690
|
// UTF-16 parsing for JavaScript public API
|
|
686
|
-
parseUtf16: (
|
|
687
|
-
const
|
|
691
|
+
parseUtf16: (g) => {
|
|
692
|
+
const i = a.create_session();
|
|
688
693
|
try {
|
|
689
|
-
|
|
690
|
-
const
|
|
694
|
+
a.set_text(i, g);
|
|
695
|
+
const o = a.parse_utf16(i);
|
|
691
696
|
return {
|
|
692
|
-
spans:
|
|
693
|
-
injections:
|
|
697
|
+
spans: o.spans || [],
|
|
698
|
+
injections: o.injections || []
|
|
694
699
|
};
|
|
695
|
-
} catch (
|
|
696
|
-
return t.logger.error("[arborium] Parse error:",
|
|
700
|
+
} catch (o) {
|
|
701
|
+
return t.logger.error("[arborium] Parse error:", o), { spans: [], injections: [] };
|
|
697
702
|
} finally {
|
|
698
|
-
|
|
703
|
+
a.free_session(i);
|
|
699
704
|
}
|
|
700
705
|
}
|
|
701
706
|
};
|
|
702
|
-
return
|
|
703
|
-
} catch (
|
|
704
|
-
return t.logger.error(`[arborium] Failed to load grammar '${e}':`,
|
|
707
|
+
return h.set(e, y), t.logger.debug(`[arborium] Grammar '${e}' loaded successfully`), y;
|
|
708
|
+
} catch (r) {
|
|
709
|
+
return t.logger.error(`[arborium] Failed to load grammar '${e}':`, r), null;
|
|
705
710
|
}
|
|
706
711
|
}
|
|
707
|
-
const
|
|
708
|
-
let
|
|
709
|
-
function
|
|
710
|
-
|
|
712
|
+
const v = /* @__PURE__ */ new Map();
|
|
713
|
+
let I = 1;
|
|
714
|
+
function q(e) {
|
|
715
|
+
globalThis.arboriumHost = {
|
|
711
716
|
/** Check if a language is available (sync) */
|
|
712
717
|
isLanguageAvailable(t) {
|
|
713
|
-
return
|
|
718
|
+
return p.has(t) || h.has(t);
|
|
714
719
|
},
|
|
715
720
|
/** Load a grammar and return a handle (async) */
|
|
716
721
|
async loadGrammar(t) {
|
|
717
|
-
const
|
|
718
|
-
if (!
|
|
719
|
-
for (const [
|
|
720
|
-
if (
|
|
721
|
-
const
|
|
722
|
-
return
|
|
722
|
+
const r = await x(t, e);
|
|
723
|
+
if (!r) return 0;
|
|
724
|
+
for (const [a, n] of v)
|
|
725
|
+
if (n === r) return a;
|
|
726
|
+
const s = I++;
|
|
727
|
+
return v.set(s, r), s;
|
|
723
728
|
},
|
|
724
729
|
/** Parse text using a grammar handle (sync) - returns UTF-8 offsets for Rust host */
|
|
725
|
-
parse(t,
|
|
726
|
-
const
|
|
727
|
-
return
|
|
730
|
+
parse(t, r) {
|
|
731
|
+
const s = v.get(t);
|
|
732
|
+
return s ? s.parseUtf8(r) : { spans: [], injections: [] };
|
|
728
733
|
}
|
|
729
734
|
};
|
|
730
735
|
}
|
|
731
|
-
function
|
|
736
|
+
function C(e) {
|
|
732
737
|
if (e.hostUrl)
|
|
733
738
|
return e.hostUrl;
|
|
734
|
-
const t = e.cdn,
|
|
735
|
-
let
|
|
736
|
-
t === "jsdelivr" ?
|
|
737
|
-
const
|
|
738
|
-
return `${
|
|
739
|
+
const t = e.cdn, r = e.version;
|
|
740
|
+
let s;
|
|
741
|
+
t === "jsdelivr" ? s = "https://cdn.jsdelivr.net/npm" : t === "unpkg" ? s = "https://unpkg.com" : s = t;
|
|
742
|
+
const a = r === "latest" ? "" : `@${r}`;
|
|
743
|
+
return `${s}/@arborium/arborium${a}/dist`;
|
|
739
744
|
}
|
|
740
|
-
async function
|
|
741
|
-
return
|
|
742
|
-
|
|
743
|
-
const t =
|
|
744
|
-
e.logger.debug(`[arborium] Loading host
|
|
745
|
+
async function G(e) {
|
|
746
|
+
return m || d || (d = (async () => {
|
|
747
|
+
q(e);
|
|
748
|
+
const t = C(e), r = e.resolveHostJs === j.resolveHostJs ? ` from ${t}/arborium_host.js` : "";
|
|
749
|
+
e.logger.debug(`[arborium] Loading host${r}`);
|
|
745
750
|
try {
|
|
746
|
-
const
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
}, e.logger.debug("[arborium] Host loaded successfully"), g;
|
|
754
|
-
} catch (n) {
|
|
755
|
-
return e.logger.error("[arborium] Failed to load host:", n), null;
|
|
751
|
+
const s = await e.resolveHostJs({ baseUrl: t, path: "arborium_host.js" }), a = await e.resolveHostWasm({ baseUrl: t, path: "arborium_host_bg.wasm" });
|
|
752
|
+
return await s.default({ module_or_path: a }), m = {
|
|
753
|
+
highlight: s.highlight,
|
|
754
|
+
isLanguageAvailable: s.isLanguageAvailable
|
|
755
|
+
}, e.logger.debug("[arborium] Host loaded successfully"), m;
|
|
756
|
+
} catch (s) {
|
|
757
|
+
return e.logger.error("[arborium] Failed to load host:", s), null;
|
|
756
758
|
}
|
|
757
|
-
})(),
|
|
759
|
+
})(), d);
|
|
758
760
|
}
|
|
759
|
-
async function
|
|
760
|
-
const
|
|
761
|
-
if (
|
|
761
|
+
async function S(e, t, r) {
|
|
762
|
+
const s = u(r), a = await G(s);
|
|
763
|
+
if (a)
|
|
762
764
|
try {
|
|
763
|
-
return
|
|
764
|
-
} catch (
|
|
765
|
-
|
|
765
|
+
return a.highlight(e, t);
|
|
766
|
+
} catch (n) {
|
|
767
|
+
s.logger.error("[arborium] Host highlight failed:", n);
|
|
766
768
|
}
|
|
767
|
-
return
|
|
769
|
+
return P(t);
|
|
768
770
|
}
|
|
769
|
-
async function
|
|
770
|
-
const
|
|
771
|
-
if (!
|
|
772
|
-
const { module:
|
|
771
|
+
async function A(e, t) {
|
|
772
|
+
const r = u(t), s = await x(e, r);
|
|
773
|
+
if (!s) return null;
|
|
774
|
+
const { module: a } = s;
|
|
773
775
|
return {
|
|
774
|
-
languageId: () =>
|
|
775
|
-
injectionLanguages: () =>
|
|
776
|
-
highlight: async (
|
|
776
|
+
languageId: () => s.languageId,
|
|
777
|
+
injectionLanguages: () => s.injectionLanguages,
|
|
778
|
+
highlight: async (n) => S(e, n, t),
|
|
777
779
|
// Public API returns UTF-16 offsets for JavaScript compatibility
|
|
778
|
-
parse: (
|
|
780
|
+
parse: (n) => s.parseUtf16(n),
|
|
779
781
|
createSession: () => {
|
|
780
|
-
const
|
|
782
|
+
const n = a.create_session();
|
|
781
783
|
return {
|
|
782
|
-
setText: (
|
|
784
|
+
setText: (l) => a.set_text(n, l),
|
|
783
785
|
// Session.parse() returns UTF-16 offsets for JavaScript compatibility
|
|
784
786
|
parse: () => {
|
|
785
787
|
try {
|
|
786
|
-
const
|
|
788
|
+
const l = a.parse_utf16(n);
|
|
787
789
|
return {
|
|
788
|
-
spans:
|
|
789
|
-
injections:
|
|
790
|
+
spans: l.spans || [],
|
|
791
|
+
injections: l.injections || []
|
|
790
792
|
};
|
|
791
|
-
} catch (
|
|
792
|
-
return
|
|
793
|
+
} catch (l) {
|
|
794
|
+
return r.logger.error("[arborium] Session parse error:", l), { spans: [], injections: [] };
|
|
793
795
|
}
|
|
794
796
|
},
|
|
795
|
-
cancel: () =>
|
|
796
|
-
free: () =>
|
|
797
|
+
cancel: () => a.cancel(n),
|
|
798
|
+
free: () => a.free_session(n)
|
|
797
799
|
};
|
|
798
800
|
},
|
|
799
801
|
dispose: () => {
|
|
800
802
|
}
|
|
801
803
|
};
|
|
802
804
|
}
|
|
803
|
-
function
|
|
804
|
-
|
|
805
|
+
async function z(e, t, r) {
|
|
806
|
+
const s = u(r), a = e;
|
|
807
|
+
await a.default({ module_or_path: t });
|
|
808
|
+
const n = a.language_id(), l = a.injection_languages(), w = {
|
|
809
|
+
languageId: n,
|
|
810
|
+
injectionLanguages: l,
|
|
811
|
+
module: a,
|
|
812
|
+
parseUtf8: (g) => {
|
|
813
|
+
const i = a.create_session();
|
|
814
|
+
try {
|
|
815
|
+
a.set_text(i, g);
|
|
816
|
+
const o = a.parse(i);
|
|
817
|
+
return {
|
|
818
|
+
spans: o.spans || [],
|
|
819
|
+
injections: o.injections || []
|
|
820
|
+
};
|
|
821
|
+
} catch (o) {
|
|
822
|
+
return s.logger.error("[arborium] Parse error:", o), { spans: [], injections: [] };
|
|
823
|
+
} finally {
|
|
824
|
+
a.free_session(i);
|
|
825
|
+
}
|
|
826
|
+
},
|
|
827
|
+
parseUtf16: (g) => {
|
|
828
|
+
const i = a.create_session();
|
|
829
|
+
try {
|
|
830
|
+
a.set_text(i, g);
|
|
831
|
+
const o = a.parse_utf16(i);
|
|
832
|
+
return {
|
|
833
|
+
spans: o.spans || [],
|
|
834
|
+
injections: o.injections || []
|
|
835
|
+
};
|
|
836
|
+
} catch (o) {
|
|
837
|
+
return s.logger.error("[arborium] Parse error:", o), { spans: [], injections: [] };
|
|
838
|
+
} finally {
|
|
839
|
+
a.free_session(i);
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
};
|
|
843
|
+
return h.set(n, w), p.add(n), s.logger.debug(`[arborium] Grammar '${n}' registered`), await A(n, r);
|
|
844
|
+
}
|
|
845
|
+
function u(e) {
|
|
846
|
+
return e ? { ...f, ...e } : { ...f };
|
|
805
847
|
}
|
|
806
848
|
function N(e) {
|
|
807
|
-
|
|
849
|
+
f = { ...f, ...e };
|
|
808
850
|
}
|
|
809
851
|
async function O(e, t) {
|
|
810
|
-
const
|
|
811
|
-
return await
|
|
852
|
+
const r = u(t);
|
|
853
|
+
return await T(r), p.has(e) || (c?.entries.some((s) => s.language === e) ?? !1);
|
|
812
854
|
}
|
|
813
|
-
async function
|
|
814
|
-
const t =
|
|
815
|
-
return await
|
|
855
|
+
async function W(e) {
|
|
856
|
+
const t = u(e);
|
|
857
|
+
return await T(t), c ? c.entries.map((r) => r.language) : Array.from(p);
|
|
816
858
|
}
|
|
817
859
|
export {
|
|
818
860
|
U as availableLanguages,
|
|
819
861
|
M as detectLanguage,
|
|
820
862
|
R as extractLanguageFromClass,
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
863
|
+
W as getAvailableLanguages,
|
|
864
|
+
u as getConfig,
|
|
865
|
+
S as highlight,
|
|
866
|
+
J as highlights,
|
|
825
867
|
O as isLanguageAvailable,
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
868
|
+
A as loadGrammar,
|
|
869
|
+
F as normalizeLanguage,
|
|
870
|
+
L as pluginVersion,
|
|
871
|
+
z as registerGrammar,
|
|
829
872
|
N as setConfig
|
|
830
873
|
};
|
|
831
874
|
//# sourceMappingURL=arborium.js.map
|