@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/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"],
@@ -74,20 +74,20 @@ const L = [
74
74
  function M(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, 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 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 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 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 (s.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.4", U = [
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
- ], F = [
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 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
- const T = {
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 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) {
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 m || (m = (async () => {
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
- l = await t.json(), e.logger.debug(`[arborium] Loaded local manifest with ${l?.entries.length} entries`);
624
- })(), m);
628
+ c = await t.json(), e.logger.debug(`[arborium] Loaded local manifest with ${c?.entries.length} entries`);
629
+ })(), b);
625
630
  }
626
- function P(e, t) {
627
- if (l) {
628
- const s = l.entries.find((o) => o.language === e);
629
- if (s)
630
- return s.local_js.substring(0, s.local_js.lastIndexOf("/"));
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 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}`;
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 j(e, t) {
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}' already loading, waiting...`), r;
643
- const n = q(e, t);
644
- h.set(e, n);
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 n;
651
+ return await a;
647
652
  } finally {
648
- h.delete(e);
653
+ k.delete(e);
649
654
  }
650
655
  }
651
- async function q(e, t) {
652
- if (await k(t), !d.has(e) && !l?.entries.some((a) => a.language === e))
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 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({
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: a,
664
+ baseUrl: r,
660
665
  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 = {
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: x,
668
- module: n,
672
+ injectionLanguages: w,
673
+ module: a,
669
674
  // UTF-8 parsing for Rust host
670
- parseUtf8: (f) => {
671
- const c = n.create_session();
675
+ parseUtf8: (g) => {
676
+ const i = a.create_session();
672
677
  try {
673
- n.set_text(c, f);
674
- const i = n.parse(c);
678
+ a.set_text(i, g);
679
+ const o = a.parse(i);
675
680
  return {
676
- spans: i.spans || [],
677
- injections: i.injections || []
681
+ spans: o.spans || [],
682
+ injections: o.injections || []
678
683
  };
679
- } catch (i) {
680
- return t.logger.error("[arborium] Parse error:", i), { spans: [], injections: [] };
684
+ } catch (o) {
685
+ return t.logger.error("[arborium] Parse error:", o), { spans: [], injections: [] };
681
686
  } finally {
682
- n.free_session(c);
687
+ a.free_session(i);
683
688
  }
684
689
  },
685
690
  // UTF-16 parsing for JavaScript public API
686
- parseUtf16: (f) => {
687
- const c = n.create_session();
691
+ parseUtf16: (g) => {
692
+ const i = a.create_session();
688
693
  try {
689
- n.set_text(c, f);
690
- const i = n.parse_utf16(c);
694
+ a.set_text(i, g);
695
+ const o = a.parse_utf16(i);
691
696
  return {
692
- spans: i.spans || [],
693
- injections: i.injections || []
697
+ spans: o.spans || [],
698
+ injections: o.injections || []
694
699
  };
695
- } catch (i) {
696
- return t.logger.error("[arborium] Parse error:", i), { spans: [], injections: [] };
700
+ } catch (o) {
701
+ return t.logger.error("[arborium] Parse error:", o), { spans: [], injections: [] };
697
702
  } finally {
698
- n.free_session(c);
703
+ a.free_session(i);
699
704
  }
700
705
  }
701
706
  };
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;
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 w = /* @__PURE__ */ new Map();
708
- let C = 1;
709
- function I(e) {
710
- window.arboriumHost = {
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 d.has(t) || y.has(t);
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 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;
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, a) {
726
- const r = w.get(t);
727
- return r ? r.parseUtf8(a) : { spans: [], injections: [] };
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 S(e) {
736
+ function C(e) {
732
737
  if (e.hostUrl)
733
738
  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`;
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 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}`);
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 n = await import(
747
- /* @vite-ignore */
748
- a
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;
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
- })(), p);
759
+ })(), d);
758
760
  }
759
- async function G(e, t, a) {
760
- const r = b(a), n = await A(r);
761
- if (n)
761
+ async function S(e, t, r) {
762
+ const s = u(r), a = await G(s);
763
+ if (a)
762
764
  try {
763
- return n.highlight(e, t);
764
- } catch (s) {
765
- r.logger.error("[arborium] Host highlight failed:", s);
765
+ return a.highlight(e, t);
766
+ } catch (n) {
767
+ s.logger.error("[arborium] Host highlight failed:", n);
766
768
  }
767
- return E(t);
769
+ return P(t);
768
770
  }
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;
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: () => r.languageId,
775
- injectionLanguages: () => r.injectionLanguages,
776
- highlight: async (s) => G(e, s, t),
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: (s) => r.parseUtf16(s),
780
+ parse: (n) => s.parseUtf16(n),
779
781
  createSession: () => {
780
- const s = n.create_session();
782
+ const n = a.create_session();
781
783
  return {
782
- setText: (o) => n.set_text(s, o),
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 o = n.parse_utf16(s);
788
+ const l = a.parse_utf16(n);
787
789
  return {
788
- spans: o.spans || [],
789
- injections: o.injections || []
790
+ spans: l.spans || [],
791
+ injections: l.injections || []
790
792
  };
791
- } catch (o) {
792
- return a.logger.error("[arborium] Session parse error:", o), { spans: [], injections: [] };
793
+ } catch (l) {
794
+ return r.logger.error("[arborium] Session parse error:", l), { spans: [], injections: [] };
793
795
  }
794
796
  },
795
- cancel: () => n.cancel(s),
796
- free: () => n.free_session(s)
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 b(e) {
804
- return e ? { ...u, ...e } : { ...u };
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
- u = { ...u, ...e };
849
+ f = { ...f, ...e };
808
850
  }
809
851
  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);
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 B(e) {
814
- const t = b(e);
815
- return await k(t), l ? l.entries.map((a) => a.language) : Array.from(d);
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
- B as getAvailableLanguages,
822
- b as getConfig,
823
- G as highlight,
824
- F as highlights,
863
+ W as getAvailableLanguages,
864
+ u as getConfig,
865
+ S as highlight,
866
+ J as highlights,
825
867
  O as isLanguageAvailable,
826
- z as loadGrammar,
827
- H as normalizeLanguage,
828
- _ as pluginVersion,
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