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