@lobehub/ui 2.15.4 → 2.15.5

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.
@@ -2,11 +2,27 @@
2
2
 
3
3
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
4
  function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
5
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
6
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
8
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
5
9
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
6
10
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
11
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
12
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
14
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
15
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
16
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
17
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
19
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
20
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
21
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
22
  import { transformerNotationDiff, transformerNotationErrorLevel, transformerNotationFocus, transformerNotationHighlight, transformerNotationWordHighlight } from '@shikijs/transformers';
8
23
  import { useTheme, useThemeMode } from 'antd-style';
9
- import { useMemo } from 'react';
24
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
25
+ import { ShikiStreamTokenizer } from 'shiki-stream';
10
26
  import useSWR from 'swr';
11
27
  import { Md5 } from 'ts-md5';
12
28
  import { getCodeLanguageByInput } from "../Highlighter/const";
@@ -17,10 +33,15 @@ var MD5_LENGTH_THRESHOLD = 10000; // Use async MD5 for text exceeding this lengt
17
33
  // Color replacement mapping type
18
34
 
19
35
  // Lazy load shiki
20
- var loadShiki = function loadShiki() {
36
+ var loadShikiModule = function loadShikiModule() {
21
37
  if (typeof window === 'undefined') return Promise.resolve(null);
22
- return import('shiki').then(function (mod) {
23
- return mod.codeToHtml;
38
+ return import('shiki');
39
+ };
40
+ var shikiModulePromise = loadShikiModule();
41
+ var loadShiki = function loadShiki() {
42
+ return shikiModulePromise.then(function (mod) {
43
+ var _mod$codeToHtml;
44
+ return (_mod$codeToHtml = mod === null || mod === void 0 ? void 0 : mod.codeToHtml) !== null && _mod$codeToHtml !== void 0 ? _mod$codeToHtml : null;
24
45
  });
25
46
  };
26
47
  var shikiPromise = loadShiki();
@@ -29,12 +50,248 @@ var shikiPromise = loadShiki();
29
50
  var escapeHtml = function escapeHtml(str) {
30
51
  return str.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&#039;');
31
52
  };
53
+ var tokensToLineTokens = function tokensToLineTokens(tokens) {
54
+ if (!tokens.length) return [[]];
55
+ var lines = [[]];
56
+ var currentLine = lines[0];
57
+ var startNewLine = function startNewLine() {
58
+ currentLine = [];
59
+ lines.push(currentLine);
60
+ };
61
+ tokens.forEach(function (token) {
62
+ var _token$content;
63
+ var content = (_token$content = token.content) !== null && _token$content !== void 0 ? _token$content : '';
64
+ if (content === '\n') {
65
+ startNewLine();
66
+ return;
67
+ }
68
+ if (!content.includes('\n')) {
69
+ currentLine.push(token);
70
+ return;
71
+ }
72
+ var segments = content.split('\n');
73
+ segments.forEach(function (segment, index) {
74
+ if (segment) {
75
+ currentLine.push(_objectSpread(_objectSpread({}, token), {}, {
76
+ content: segment
77
+ }));
78
+ }
79
+ if (index < segments.length - 1) {
80
+ startNewLine();
81
+ }
82
+ });
83
+ });
84
+ if (lines.length === 0) return [[]];
85
+ return lines;
86
+ };
87
+ var createPreStyle = function createPreStyle(bg, fg) {
88
+ if (!bg && !fg) return undefined;
89
+ return {
90
+ backgroundColor: bg,
91
+ color: fg
92
+ };
93
+ };
94
+ var useStreamingHighlighter = function useStreamingHighlighter(text, options) {
95
+ var colorReplacements = options.colorReplacements,
96
+ enabled = options.enabled,
97
+ language = options.language,
98
+ theme = options.theme;
99
+ var _useState = useState(),
100
+ _useState2 = _slicedToArray(_useState, 2),
101
+ result = _useState2[0],
102
+ setResult = _useState2[1];
103
+ var tokenizerRef = useRef(null);
104
+ var previousTextRef = useRef('');
105
+ var latestTextRef = useRef(text);
106
+ var preStyleRef = useRef(undefined);
107
+ var colorReplacementsRef = useRef(colorReplacements);
108
+ var linesRef = useRef([[]]);
109
+ useEffect(function () {
110
+ latestTextRef.current = text;
111
+ }, [text]);
112
+ useEffect(function () {
113
+ colorReplacementsRef.current = colorReplacements;
114
+ }, [colorReplacements]);
115
+ var setStreamingResult = useCallback(function (rawLines) {
116
+ var previousLines = linesRef.current;
117
+ var mergedLines = rawLines.map(function (line, index) {
118
+ var previousLine = previousLines[index];
119
+ if (previousLine && previousLine.length === line.length && previousLine.every(function (token, tokenIndex) {
120
+ return token === line[tokenIndex];
121
+ })) {
122
+ return previousLine;
123
+ }
124
+ return line;
125
+ });
126
+ linesRef.current = mergedLines;
127
+ setResult({
128
+ colorReplacements: colorReplacementsRef.current,
129
+ lines: mergedLines,
130
+ preStyle: preStyleRef.current
131
+ });
132
+ }, []);
133
+ var updateTokens = useCallback( /*#__PURE__*/function () {
134
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(nextText) {
135
+ var forceReset,
136
+ tokenizer,
137
+ previousText,
138
+ chunk,
139
+ canAppend,
140
+ mergedTokens,
141
+ _mergedTokens,
142
+ _args = arguments;
143
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
144
+ while (1) switch (_context.prev = _context.next) {
145
+ case 0:
146
+ forceReset = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
147
+ tokenizer = tokenizerRef.current;
148
+ if (tokenizer) {
149
+ _context.next = 4;
150
+ break;
151
+ }
152
+ return _context.abrupt("return");
153
+ case 4:
154
+ if (forceReset) {
155
+ tokenizer.clear();
156
+ previousTextRef.current = '';
157
+ }
158
+ previousText = previousTextRef.current;
159
+ chunk = nextText;
160
+ canAppend = !forceReset && nextText.startsWith(previousText);
161
+ if (canAppend) {
162
+ chunk = nextText.slice(previousText.length);
163
+ } else if (!forceReset) {
164
+ tokenizer.clear();
165
+ }
166
+ previousTextRef.current = nextText;
167
+ if (chunk) {
168
+ _context.next = 14;
169
+ break;
170
+ }
171
+ mergedTokens = [].concat(_toConsumableArray(tokenizer.tokensStable), _toConsumableArray(tokenizer.tokensUnstable));
172
+ setStreamingResult(mergedTokens.length ? tokensToLineTokens(mergedTokens) : [[]]);
173
+ return _context.abrupt("return");
174
+ case 14:
175
+ _context.prev = 14;
176
+ _context.next = 17;
177
+ return tokenizer.enqueue(chunk);
178
+ case 17:
179
+ _mergedTokens = [].concat(_toConsumableArray(tokenizer.tokensStable), _toConsumableArray(tokenizer.tokensUnstable));
180
+ setStreamingResult(tokensToLineTokens(_mergedTokens));
181
+ _context.next = 24;
182
+ break;
183
+ case 21:
184
+ _context.prev = 21;
185
+ _context.t0 = _context["catch"](14);
186
+ console.error('Streaming highlighting failed:', _context.t0);
187
+ case 24:
188
+ case "end":
189
+ return _context.stop();
190
+ }
191
+ }, _callee, null, [[14, 21]]);
192
+ }));
193
+ return function (_x) {
194
+ return _ref.apply(this, arguments);
195
+ };
196
+ }(), [setStreamingResult]);
197
+ useEffect(function () {
198
+ if (!enabled) {
199
+ var _tokenizerRef$current;
200
+ (_tokenizerRef$current = tokenizerRef.current) === null || _tokenizerRef$current === void 0 || _tokenizerRef$current.clear();
201
+ tokenizerRef.current = null;
202
+ previousTextRef.current = '';
203
+ preStyleRef.current = undefined;
204
+ linesRef.current = [[]];
205
+ setResult(undefined);
206
+ return;
207
+ }
208
+ var cancelled = false;
209
+ _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
210
+ var mod, highlighter, tokenizer, themeInfo, currentText;
211
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
212
+ while (1) switch (_context2.prev = _context2.next) {
213
+ case 0:
214
+ _context2.next = 2;
215
+ return shikiModulePromise;
216
+ case 2:
217
+ mod = _context2.sent;
218
+ if (!(!mod || cancelled)) {
219
+ _context2.next = 5;
220
+ break;
221
+ }
222
+ return _context2.abrupt("return");
223
+ case 5:
224
+ _context2.prev = 5;
225
+ _context2.next = 8;
226
+ return mod.getSingletonHighlighter({
227
+ langs: language ? [language] : [],
228
+ themes: [theme]
229
+ });
230
+ case 8:
231
+ highlighter = _context2.sent;
232
+ if (!(!highlighter || cancelled)) {
233
+ _context2.next = 11;
234
+ break;
235
+ }
236
+ return _context2.abrupt("return");
237
+ case 11:
238
+ tokenizer = new ShikiStreamTokenizer({
239
+ highlighter: highlighter,
240
+ lang: language,
241
+ theme: theme
242
+ });
243
+ tokenizerRef.current = tokenizer;
244
+ previousTextRef.current = '';
245
+ linesRef.current = [[]];
246
+ themeInfo = highlighter.getTheme(theme);
247
+ preStyleRef.current = createPreStyle(themeInfo === null || themeInfo === void 0 ? void 0 : themeInfo.bg, themeInfo === null || themeInfo === void 0 ? void 0 : themeInfo.fg);
248
+ currentText = latestTextRef.current;
249
+ if (!currentText) {
250
+ _context2.next = 23;
251
+ break;
252
+ }
253
+ _context2.next = 21;
254
+ return updateTokens(currentText, true);
255
+ case 21:
256
+ _context2.next = 24;
257
+ break;
258
+ case 23:
259
+ setStreamingResult([[]]);
260
+ case 24:
261
+ _context2.next = 29;
262
+ break;
263
+ case 26:
264
+ _context2.prev = 26;
265
+ _context2.t0 = _context2["catch"](5);
266
+ console.error('Streaming highlighter initialization failed:', _context2.t0);
267
+ case 29:
268
+ case "end":
269
+ return _context2.stop();
270
+ }
271
+ }, _callee2, null, [[5, 26]]);
272
+ }))();
273
+ return function () {
274
+ var _tokenizerRef$current2;
275
+ cancelled = true;
276
+ (_tokenizerRef$current2 = tokenizerRef.current) === null || _tokenizerRef$current2 === void 0 || _tokenizerRef$current2.clear();
277
+ tokenizerRef.current = null;
278
+ previousTextRef.current = '';
279
+ };
280
+ }, [enabled, language, setStreamingResult, theme, updateTokens]);
281
+ useEffect(function () {
282
+ if (!enabled) return;
283
+ if (!tokenizerRef.current) return;
284
+ updateTokens(text);
285
+ }, [enabled, text, updateTokens]);
286
+ return result;
287
+ };
32
288
 
33
289
  // Main highlight component
34
- export var useHighlight = function useHighlight(text, _ref) {
35
- var language = _ref.language,
36
- enableTransformer = _ref.enableTransformer,
37
- builtinTheme = _ref.theme;
290
+ export var useHighlight = function useHighlight(text, _ref3) {
291
+ var language = _ref3.language,
292
+ enableTransformer = _ref3.enableTransformer,
293
+ builtinTheme = _ref3.theme,
294
+ streaming = _ref3.streaming;
38
295
  var _useThemeMode = useThemeMode(),
39
296
  isDarkMode = _useThemeMode.isDarkMode;
40
297
  var theme = useTheme();
@@ -88,23 +345,23 @@ export var useHighlight = function useHighlight(text, _ref) {
88
345
  }, [text, matchedLanguage, isDarkMode, builtinTheme]);
89
346
 
90
347
  // Use SWR to get highlighted HTML
91
- return useSWR(cacheKey, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
348
+ var response = useSWR(streaming ? null : cacheKey, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
92
349
  var codeToHtml, html, _codeToHtml, _html, fallbackHtml;
93
- return _regeneratorRuntime().wrap(function _callee$(_context) {
94
- while (1) switch (_context.prev = _context.next) {
350
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
351
+ while (1) switch (_context3.prev = _context3.next) {
95
352
  case 0:
96
- _context.prev = 0;
97
- _context.next = 3;
353
+ _context3.prev = 0;
354
+ _context3.next = 3;
98
355
  return shikiPromise;
99
356
  case 3:
100
- codeToHtml = _context.sent;
357
+ codeToHtml = _context3.sent;
101
358
  if (codeToHtml) {
102
- _context.next = 6;
359
+ _context3.next = 6;
103
360
  break;
104
361
  }
105
- return _context.abrupt("return", text);
362
+ return _context3.abrupt("return", text);
106
363
  case 6:
107
- _context.next = 8;
364
+ _context3.next = 8;
108
365
  return codeToHtml(text, {
109
366
  colorReplacements: builtinTheme ? undefined : colorReplacements,
110
367
  lang: matchedLanguage,
@@ -112,42 +369,42 @@ export var useHighlight = function useHighlight(text, _ref) {
112
369
  transformers: transformers
113
370
  });
114
371
  case 8:
115
- html = _context.sent;
116
- return _context.abrupt("return", html);
372
+ html = _context3.sent;
373
+ return _context3.abrupt("return", html);
117
374
  case 12:
118
- _context.prev = 12;
119
- _context.t0 = _context["catch"](0);
120
- console.error('Advanced rendering failed:', _context.t0);
121
- _context.prev = 15;
122
- _context.next = 18;
375
+ _context3.prev = 12;
376
+ _context3.t0 = _context3["catch"](0);
377
+ console.error('Advanced rendering failed:', _context3.t0);
378
+ _context3.prev = 15;
379
+ _context3.next = 18;
123
380
  return shikiPromise;
124
381
  case 18:
125
- _codeToHtml = _context.sent;
382
+ _codeToHtml = _context3.sent;
126
383
  if (_codeToHtml) {
127
- _context.next = 21;
384
+ _context3.next = 21;
128
385
  break;
129
386
  }
130
- return _context.abrupt("return", text);
387
+ return _context3.abrupt("return", text);
131
388
  case 21:
132
- _context.next = 23;
389
+ _context3.next = 23;
133
390
  return _codeToHtml(text, {
134
391
  lang: matchedLanguage,
135
392
  theme: isDarkMode ? 'dark-plus' : 'light-plus'
136
393
  });
137
394
  case 23:
138
- _html = _context.sent;
139
- return _context.abrupt("return", _html);
395
+ _html = _context3.sent;
396
+ return _context3.abrupt("return", _html);
140
397
  case 27:
141
- _context.prev = 27;
142
- _context.t1 = _context["catch"](15);
398
+ _context3.prev = 27;
399
+ _context3.t1 = _context3["catch"](15);
143
400
  // Fallback to plain text
144
401
  fallbackHtml = "<pre class=\"fallback\"><code>".concat(escapeHtml(text), "</code></pre>");
145
- return _context.abrupt("return", fallbackHtml);
402
+ return _context3.abrupt("return", fallbackHtml);
146
403
  case 31:
147
404
  case "end":
148
- return _context.stop();
405
+ return _context3.stop();
149
406
  }
150
- }, _callee, null, [[0, 12], [15, 27]]);
407
+ }, _callee3, null, [[0, 12], [15, 27]]);
151
408
  })), {
152
409
  dedupingInterval: 3000,
153
410
  // Only execute once for the same request within 3 seconds
@@ -156,5 +413,16 @@ export var useHighlight = function useHighlight(text, _ref) {
156
413
  revalidateOnFocus: false,
157
414
  revalidateOnReconnect: false
158
415
  });
416
+ var effectiveTheme = builtinTheme || (isDarkMode ? 'slack-dark' : 'slack-ochin');
417
+ var streamingResult = useStreamingHighlighter(text, {
418
+ colorReplacements: builtinTheme ? undefined : colorReplacements[effectiveTheme],
419
+ enabled: streaming,
420
+ language: matchedLanguage,
421
+ theme: effectiveTheme
422
+ });
423
+ return _objectSpread(_objectSpread({}, response), {}, {
424
+ colorReplacements: colorReplacements,
425
+ streaming: streamingResult
426
+ });
159
427
  };
160
428
  export { escapeHtml, loadShiki, MD5_LENGTH_THRESHOLD, shikiPromise };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/ui",
3
- "version": "2.15.4",
3
+ "version": "2.15.5",
4
4
  "description": "Lobe UI is an open-source UI component library for building AIGC web apps",
5
5
  "keywords": [
6
6
  "lobehub",
@@ -59,6 +59,7 @@
59
59
  "@mdx-js/mdx": "^3.1.1",
60
60
  "@mdx-js/react": "^3.1.1",
61
61
  "@radix-ui/react-slot": "^1.2.4",
62
+ "@shikijs/core": "^3.15.0",
62
63
  "@shikijs/transformers": "^3.15.0",
63
64
  "@splinetool/runtime": "0.9.526",
64
65
  "ahooks": "^3.9.6",
@@ -102,6 +103,7 @@
102
103
  "remark-github": "^12.0.0",
103
104
  "remark-math": "^6.0.0",
104
105
  "shiki": "^3.15.0",
106
+ "shiki-stream": "^0.1.3",
105
107
  "swr": "^2.3.6",
106
108
  "ts-md5": "^2.0.1",
107
109
  "unified": "^11.0.5",
@@ -1,5 +0,0 @@
1
- /// <reference types="react" />
2
- declare const Line: import("react").NamedExoticComponent<{
3
- children?: string | undefined;
4
- }>;
5
- export default Line;
@@ -1,80 +0,0 @@
1
- 'use client';
2
-
3
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
4
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
5
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
7
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
8
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
9
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
10
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
11
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
12
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
13
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
- import { memo, useEffect, useState } from 'react';
15
- import Span from "./Span";
16
- import { jsx as _jsx } from "react/jsx-runtime";
17
- var Line = /*#__PURE__*/memo(function (_ref) {
18
- var children = _ref.children;
19
- var _useState = useState([]),
20
- _useState2 = _slicedToArray(_useState, 2),
21
- contents = _useState2[0],
22
- setContents = _useState2[1];
23
- useEffect(function () {
24
- if (children && typeof children === 'string') {
25
- // Extract all lines from the HTML content
26
- // We need to handle the structure from shiki which gives us HTML with a <pre><code> structure
27
- var parser = new DOMParser();
28
- var doc = parser.parseFromString(children, 'text/html');
29
- var codeElement = doc.querySelector('span.line');
30
- if (codeElement) {
31
- var spanLines = codeElement.querySelectorAll('span');
32
- var newLines = _toConsumableArray(spanLines).map(function (line) {
33
- return line.outerHTML;
34
- });
35
- setContents(function (prevLines) {
36
- if (prevLines.length !== newLines.length) return newLines;
37
- var hasChanged = false;
38
- var _iterator = _createForOfIteratorHelper(newLines.entries()),
39
- _step;
40
- try {
41
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
42
- var _step$value = _slicedToArray(_step.value, 2),
43
- i = _step$value[0],
44
- newLine = _step$value[1];
45
- if (prevLines[i] !== newLine) {
46
- hasChanged = true;
47
- break;
48
- }
49
- }
50
- } catch (err) {
51
- _iterator.e(err);
52
- } finally {
53
- _iterator.f();
54
- }
55
- return hasChanged ? newLines : prevLines;
56
- });
57
- } else {
58
- // Fallback if the structure is different
59
- var htmlLines = children.split('\n').map(function (line) {
60
- return "<span>".concat(line, "</span>");
61
- });
62
- setContents(htmlLines);
63
- }
64
- }
65
- }, [children]);
66
- return /*#__PURE__*/_jsx("span", {
67
- className: 'line',
68
- children: contents && contents.length > 0 ? contents.map(function (span, index) {
69
- return /*#__PURE__*/_jsx(Span, {
70
- children: span
71
- }, index);
72
- }) : /*#__PURE__*/_jsx("span", {
73
- children: " "
74
- })
75
- });
76
- }, function (prevProps, nextProps) {
77
- return prevProps.children === nextProps.children;
78
- });
79
- Line.displayName = 'HighlighterLine';
80
- export default Line;
@@ -1,5 +0,0 @@
1
- /// <reference types="react" />
2
- declare const Span: import("react").NamedExoticComponent<{
3
- children?: string | undefined;
4
- }>;
5
- export default Span;
@@ -1,16 +0,0 @@
1
- 'use client';
2
-
3
- import { memo } from 'react';
4
- import { jsx as _jsx } from "react/jsx-runtime";
5
- var Span = /*#__PURE__*/memo(function (_ref) {
6
- var children = _ref.children;
7
- return /*#__PURE__*/_jsx("span", {
8
- dangerouslySetInnerHTML: {
9
- __html: children || ''
10
- }
11
- });
12
- }, function (prevProps, nextProps) {
13
- return prevProps.children === nextProps.children;
14
- });
15
- Span.displayName = 'HighlighterSpan';
16
- export default Span;