x-star-editor 0.1.0 → 0.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.
@@ -1,16 +1,7 @@
1
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
- 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; } } }; }
3
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
4
- 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."); }
5
- 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); }
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 _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; }
9
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
10
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
11
- 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; }
12
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
13
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
+ import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
4
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
14
5
  import { toJsxRuntime } from 'hast-util-to-jsx-runtime';
15
6
  import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
16
7
  import rehypeKatex from 'rehype-katex';
@@ -28,42 +19,29 @@ import remarkStringify from 'remark-stringify';
28
19
  import strip from 'strip-markdown';
29
20
  import { unified } from 'unified';
30
21
  import { prefix } from "./global";
31
- export var getDefaultSchema = function getDefaultSchema() {
32
- var _defaultSchema$attrib, _defaultSchema$attrib2, _defaultSchema$attrib3, _defaultSchema$attrib4, _defaultSchema$attrib5, _defaultSchema$attrib6, _defaultSchema$attrib7, _defaultSchema$attrib8, _defaultSchema$protoc, _defaultSchema$protoc2, _defaultSchema$tagNam;
33
- return _objectSpread(_objectSpread({}, defaultSchema), {}, {
34
- attributes: _objectSpread(_objectSpread({}, defaultSchema.attributes), {}, {
35
- pre: [].concat(_toConsumableArray((_defaultSchema$attrib = (_defaultSchema$attrib2 = defaultSchema.attributes) === null || _defaultSchema$attrib2 === void 0 ? void 0 : _defaultSchema$attrib2.pre) !== null && _defaultSchema$attrib !== void 0 ? _defaultSchema$attrib : []), ['className', 'style']),
36
- code: [].concat(_toConsumableArray((_defaultSchema$attrib3 = (_defaultSchema$attrib4 = defaultSchema.attributes) === null || _defaultSchema$attrib4 === void 0 ? void 0 : _defaultSchema$attrib4.code) !== null && _defaultSchema$attrib3 !== void 0 ? _defaultSchema$attrib3 : []), ['className', 'style']),
37
- div: [].concat(_toConsumableArray((_defaultSchema$attrib5 = (_defaultSchema$attrib6 = defaultSchema.attributes) === null || _defaultSchema$attrib6 === void 0 ? void 0 : _defaultSchema$attrib6.div) !== null && _defaultSchema$attrib5 !== void 0 ? _defaultSchema$attrib5 : []), ['className', 'style']),
38
- span: [].concat(_toConsumableArray((_defaultSchema$attrib7 = (_defaultSchema$attrib8 = defaultSchema.attributes) === null || _defaultSchema$attrib8 === void 0 ? void 0 : _defaultSchema$attrib8.span) !== null && _defaultSchema$attrib7 !== void 0 ? _defaultSchema$attrib7 : []), ['className', 'style', 'line']),
39
- custom: ['meta', 'value']
40
- }),
41
- protocols: _objectSpread(_objectSpread({}, defaultSchema.protocols), {}, {
42
- src: [].concat(_toConsumableArray((_defaultSchema$protoc = (_defaultSchema$protoc2 = defaultSchema.protocols) === null || _defaultSchema$protoc2 === void 0 ? void 0 : _defaultSchema$protoc2.src) !== null && _defaultSchema$protoc !== void 0 ? _defaultSchema$protoc : []), ['data'])
43
- }),
44
- tagNames: [].concat(_toConsumableArray((_defaultSchema$tagNam = defaultSchema.tagNames) !== null && _defaultSchema$tagNam !== void 0 ? _defaultSchema$tagNam : []), ['custom'])
45
- });
46
- };
47
22
 
48
23
  /**
49
- * 将 Markdown 文本解析为 Mdast 树并转换为 Hast 树的处理器
24
+ * 将 Markdown 文本解析为 Mdast 树的处理器
50
25
  */
51
- var processor = unified().use(remarkParse).use(remarkBreaks).use(remarkGfm).use(remarkMath).use(remarkRehype, {
52
- allowDangerousHtml: true,
53
- handlers: {
54
- math: function math(h, node) {
55
- return (
56
- // 如果 Math 节点的 `meta` 属性不为空,则视为自定义块
57
- node.meta ? h(node.position, 'custom', {
58
- meta: node.meta,
59
- value: node.value
60
- }) : h(node, 'div')
61
- );
62
- }
63
- }
64
- }).use(rehypePrism, {
65
- ignoreMissing: true
66
- }).use(rehypeKatex).use(rehypeRaw).freeze();
26
+ var toMdastProcessor = unified().use(remarkParse).use(remarkGfm).use(remarkMath).freeze();
27
+
28
+ /**
29
+ * Mdast 根节点
30
+ */
31
+
32
+ /**
33
+ * 带缓存的解析函数
34
+ *
35
+ * @param sourceCode Markdown 文本
36
+ * @returns Mdast 树
37
+ */
38
+ var cachedParse = function () {
39
+ var cache = {};
40
+ return function (sourceCode) {
41
+ var _cache$sourceCode;
42
+ return (_cache$sourceCode = cache[sourceCode]) !== null && _cache$sourceCode !== void 0 ? _cache$sourceCode : (cache = _defineProperty({}, sourceCode, toMdastProcessor.parse(sourceCode)))[sourceCode];
43
+ };
44
+ }();
67
45
 
68
46
  /**
69
47
  * Mdast 节点
@@ -123,7 +101,7 @@ export var editorRender = function editorRender(sourceCode) {
123
101
  var styleElement = stack[index && !isFlowContent(stack[index - 1].node) ? index : 0].el;
124
102
  styleElement.classList.add("".concat(mdPrefix).concat(node.type));
125
103
  if (node.type === 'heading') {
126
- styleElement.classList.add("".concat(mdPrefix, "heading").concat(node.depth));
104
+ styleElement.classList.add("".concat(mdPrefix, "heading-").concat(node.depth));
127
105
  }
128
106
 
129
107
  // 如果索引为 0,则父节点为块级元素,否则为前一个索引的 DOM 元素
@@ -265,7 +243,7 @@ export var editorRender = function editorRender(sourceCode) {
265
243
  }
266
244
  addText(sourceCode.slice(scanOffset, parentEndOffset), true);
267
245
  };
268
- getChildren(processor.parse(sourceCode).children, sourceCode.length);
246
+ getChildren(cachedParse(sourceCode).children, sourceCode.length);
269
247
  if (scanOffset <= sourceCode.length) {
270
248
  // 添加最后一行文本
271
249
  block.append(createLine(sourceCode.slice(scanOffset)));
@@ -273,15 +251,73 @@ export var editorRender = function editorRender(sourceCode) {
273
251
  }
274
252
  return el;
275
253
  };
254
+
255
+ /**
256
+ * 将 Mdast 树转成 Hast 树的处理器
257
+ */
258
+ var toHastProcessor = unified().use(remarkBreaks).use(remarkRehype, {
259
+ allowDangerousHtml: true,
260
+ handlers: {
261
+ math: function math(h, node) {
262
+ return (
263
+ // 如果 Math 节点的 `meta` 属性不为空,则视为自定义块
264
+ node.meta ? h(node.position, 'custom', {
265
+ meta: node.meta,
266
+ value: node.value
267
+ }) : h(node, 'div')
268
+ );
269
+ }
270
+ }
271
+ }).use(rehypePrism, {
272
+ ignoreMissing: true
273
+ }).use(rehypeKatex).freeze();
274
+
276
275
  /**
277
- * Markdown 文本映射到 React 虚拟 DOM 树
276
+ * Hast 根节点
277
+ */
278
+
279
+ /**
280
+ * 将 Markdown 文本转成 Hast 树
278
281
  *
279
282
  * @param sourceCode Markdown 文本
280
- * @param options 配置项
281
- * @returns React 虚拟 DOM 树
283
+ * @returns Hast
284
+ */
285
+ export var preViewerRender = function preViewerRender(sourceCode) {
286
+ return toHastProcessor.runSync(cachedParse(sourceCode));
287
+ };
288
+
289
+ /**
290
+ * 过滤模式
291
+ */
292
+
293
+ export var getDefaultSchema = function getDefaultSchema() {
294
+ var _defaultSchema$attrib, _defaultSchema$attrib2, _defaultSchema$attrib3, _defaultSchema$attrib4, _defaultSchema$attrib5, _defaultSchema$attrib6, _defaultSchema$attrib7, _defaultSchema$attrib8, _defaultSchema$protoc, _defaultSchema$protoc2, _defaultSchema$tagNam;
295
+ return _objectSpread(_objectSpread({}, defaultSchema), {}, {
296
+ attributes: _objectSpread(_objectSpread({}, defaultSchema.attributes), {}, {
297
+ pre: [].concat(_toConsumableArray((_defaultSchema$attrib = (_defaultSchema$attrib2 = defaultSchema.attributes) === null || _defaultSchema$attrib2 === void 0 ? void 0 : _defaultSchema$attrib2.pre) !== null && _defaultSchema$attrib !== void 0 ? _defaultSchema$attrib : []), ['className', 'style']),
298
+ code: [].concat(_toConsumableArray((_defaultSchema$attrib3 = (_defaultSchema$attrib4 = defaultSchema.attributes) === null || _defaultSchema$attrib4 === void 0 ? void 0 : _defaultSchema$attrib4.code) !== null && _defaultSchema$attrib3 !== void 0 ? _defaultSchema$attrib3 : []), ['className', 'style']),
299
+ div: [].concat(_toConsumableArray((_defaultSchema$attrib5 = (_defaultSchema$attrib6 = defaultSchema.attributes) === null || _defaultSchema$attrib6 === void 0 ? void 0 : _defaultSchema$attrib6.div) !== null && _defaultSchema$attrib5 !== void 0 ? _defaultSchema$attrib5 : []), ['className', 'style']),
300
+ span: [].concat(_toConsumableArray((_defaultSchema$attrib7 = (_defaultSchema$attrib8 = defaultSchema.attributes) === null || _defaultSchema$attrib8 === void 0 ? void 0 : _defaultSchema$attrib8.span) !== null && _defaultSchema$attrib7 !== void 0 ? _defaultSchema$attrib7 : []), ['className', 'style', 'line']),
301
+ svg: ['xmlns', 'viewBox', 'preserveAspectRatio'],
302
+ path: ['d'],
303
+ custom: ['meta', 'value']
304
+ }),
305
+ protocols: _objectSpread(_objectSpread({}, defaultSchema.protocols), {}, {
306
+ src: [].concat(_toConsumableArray((_defaultSchema$protoc = (_defaultSchema$protoc2 = defaultSchema.protocols) === null || _defaultSchema$protoc2 === void 0 ? void 0 : _defaultSchema$protoc2.src) !== null && _defaultSchema$protoc !== void 0 ? _defaultSchema$protoc : []), ['data'])
307
+ }),
308
+ tagNames: [].concat(_toConsumableArray((_defaultSchema$tagNam = defaultSchema.tagNames) !== null && _defaultSchema$tagNam !== void 0 ? _defaultSchema$tagNam : []), ['svg', 'path', 'custom'])
309
+ });
310
+ };
311
+
312
+ /**
313
+ * 将 Hast 树转成新的 Hast 树
314
+ *
315
+ * @param root Hast 树
316
+ * @param schema 过滤模式
317
+ * @returns 新的 Hast 树
282
318
  */
283
- export var viewerRender = function viewerRender(sourceCode, options) {
284
- return toJsxRuntime(processor().use(rehypeSanitize, options.customSchema).use(function () {
319
+ export var viewerRender = function viewerRender(root, schema) {
320
+ return unified().use(rehypeRaw).use(rehypeSanitize, schema).use(function () {
285
321
  return function (root) {
286
322
  var _iterator2 = _createForOfIteratorHelper(root.children),
287
323
  _step2;
@@ -299,7 +335,18 @@ export var viewerRender = function viewerRender(sourceCode, options) {
299
335
  _iterator2.f();
300
336
  }
301
337
  };
302
- }).runSync(processor.parse(sourceCode)), {
338
+ }).runSync(root);
339
+ };
340
+
341
+ /**
342
+ * 将 Hast 树映射到 React 虚拟 DOM 树
343
+ *
344
+ * @param root Hast 树
345
+ * @param options 配置项
346
+ * @returns React 虚拟 DOM 树
347
+ */
348
+ export var postViewerRender = function postViewerRender(root, options) {
349
+ return toJsxRuntime(root, {
303
350
  Fragment: Fragment,
304
351
  jsx: jsx,
305
352
  jsxs: jsxs,
@@ -315,10 +362,9 @@ export var viewerRender = function viewerRender(sourceCode, options) {
315
362
  })
316
363
  });
317
364
  };
318
- var toHastProcessor = unified().use(remarkParse).use(remarkBreaks).use(remarkGfm).use(remarkRehype, {
365
+ var toHTMLProcessor = unified().use(remarkParse).use(remarkGfm).use(remarkBreaks).use(remarkRehype, {
319
366
  allowDangerousHtml: true
320
- }).use(rehypeRaw).freeze();
321
- var toHTMLProcessor = unified().use(rehypeStringify).freeze();
367
+ }).use(rehypeRaw).use(rehypeStringify).freeze();
322
368
 
323
369
  /**
324
370
  * 将 Markdown 文本转成 HTML 文本
@@ -327,9 +373,9 @@ var toHTMLProcessor = unified().use(rehypeStringify).freeze();
327
373
  * @returns HTML 文本
328
374
  */
329
375
  export var toHTML = function toHTML(sourceCode) {
330
- return toHTMLProcessor.stringify(toHastProcessor.runSync(toHastProcessor.parse(sourceCode)));
376
+ return toHTMLProcessor.processSync(sourceCode).toString();
331
377
  };
332
- var toMarkdownProcessor = unified().use(rehypeRemark).use(remarkGfm).use(remarkBreaks).use(remarkStringify).freeze();
378
+ var toMarkdownProcessor = unified().use(rehypeRemark).use(remarkGfm).use(remarkStringify).freeze();
333
379
 
334
380
  /**
335
381
  * 将带有 HTML 的 Markdown 文本转成 Markdown 文本
@@ -338,7 +384,7 @@ var toMarkdownProcessor = unified().use(rehypeRemark).use(remarkGfm).use(remarkB
338
384
  * @returns Markdown 文本
339
385
  */
340
386
  export var toMarkdown = function toMarkdown(sourceCode) {
341
- return toMarkdownProcessor.stringify(toMarkdownProcessor.runSync(toHastProcessor.runSync(toHastProcessor.parse(sourceCode))));
387
+ return toMarkdownProcessor.stringify(toMarkdownProcessor.runSync(toHTMLProcessor.runSync(toHTMLProcessor.parse(sourceCode))));
342
388
  };
343
389
  var toTextProcessor = unified().use(strip).freeze();
344
390
 
@@ -13,23 +13,31 @@ export interface XStarEditorProps {
13
13
  /**
14
14
  * 语言
15
15
  */
16
- locale?: string;
16
+ locale?: XStarMdEditorProps['locale'];
17
17
  /**
18
18
  * 初始文本
19
19
  */
20
20
  initialValue?: string;
21
+ /**
22
+ * 是否启用 Web Worker
23
+ */
24
+ enableWebWorker?: XStarMdViewerProps['enableWebWorker'];
21
25
  /**
22
26
  * 编辑器属性
23
27
  */
24
- editorProps?: Omit<XStarMdEditorProps, 'locale' | 'initialValue' | 'onChange'>;
28
+ editorProps?: Omit<XStarMdEditorProps, 'locale' | 'initialValue' | 'onChange' | 'onInsertFile'>;
25
29
  /**
26
30
  * 浏览器属性
27
31
  */
28
- viewerProps?: Omit<XStarMdViewerProps, 'value'>;
32
+ viewerProps?: Omit<XStarMdViewerProps, 'value' | 'enableWebWorker'>;
29
33
  /**
30
34
  * 文本变化回调函数
31
35
  */
32
- onChange?: (value: string) => void;
36
+ onChange?: XStarMdEditorProps['onChange'];
37
+ /**
38
+ * 文件插入回调函数
39
+ */
40
+ onInsertFile?: XStarMdEditorProps['onInsertFile'];
33
41
  }
34
42
  declare const XStarEditor: React.ForwardRefExoticComponent<XStarEditorProps & React.RefAttributes<XStarEditorHandle>>;
35
43
  export default XStarEditor;
@@ -1,16 +1,6 @@
1
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
3
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
5
- 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; }
6
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
7
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
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(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
13
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
14
4
  import classNames from 'classnames';
15
5
  import React, { useEffect, useImperativeHandle, useRef, useState } from 'react';
16
6
  import { prefix } from "../utils/global";
@@ -20,9 +10,11 @@ var XStarEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
20
10
  var height = _ref.height,
21
11
  locale = _ref.locale,
22
12
  initialValue = _ref.initialValue,
13
+ enableWebWorker = _ref.enableWebWorker,
23
14
  editorProps = _ref.editorProps,
24
15
  viewerProps = _ref.viewerProps,
25
- _onChange = _ref.onChange;
16
+ _onChange = _ref.onChange,
17
+ onInsertFile = _ref.onInsertFile;
26
18
  var _useState = useState(initialValue),
27
19
  _useState2 = _slicedToArray(_useState, 2),
28
20
  value = _useState2[0],
@@ -155,14 +147,16 @@ var XStarEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
155
147
  onChange: function onChange(value) {
156
148
  setValue(value);
157
149
  _onChange === null || _onChange === void 0 ? void 0 : _onChange(value);
158
- }
150
+ },
151
+ onInsertFile: onInsertFile
159
152
  })), /*#__PURE__*/React.createElement(XStarMdViewer, _extends({
160
153
  ref: viewerRef
161
154
  }, viewerProps, {
162
155
  style: _objectSpread(_objectSpread({}, viewerProps === null || viewerProps === void 0 ? void 0 : viewerProps.style), {}, {
163
156
  height: height
164
157
  }),
165
- value: value
158
+ value: value,
159
+ enableWebWorker: enableWebWorker
166
160
  })));
167
161
  });
168
162
  if (process.env.NODE_ENV !== 'production') {
@@ -1,5 +1,5 @@
1
1
  import classNames from 'classnames';
2
- import React, { useEffect, useImperativeHandle, useRef } from 'react';
2
+ import React, { useEffect, useImperativeHandle, useMemo, useRef } from 'react';
3
3
  import Toolbar, { getDefaultToolbarItemMap, getDefaultToolbarItems } from "../components/Toolbar";
4
4
  import { LocaleProvider } from "../locales";
5
5
  import { getRange, useContainer } from "../utils/container";
@@ -24,17 +24,12 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
24
24
  selection = _useHistory.selection,
25
25
  dispatch = _useHistory.dispatch;
26
26
  var initialized = useRef(false);
27
- var onChangeLatest = useRef(onChange);
28
- onChangeLatest.current = onChange;
29
- var onInsertFileLatest = useRef(onInsertFile);
30
- onInsertFileLatest.current = onInsertFile;
31
27
 
32
28
  // 将文本同步到容器
33
29
  useEffect(function () {
34
30
  container.setText(sourceCode);
35
31
  if (initialized.current) {
36
- var _onChangeLatest$curre;
37
- (_onChangeLatest$curre = onChangeLatest.current) === null || _onChangeLatest$curre === void 0 ? void 0 : _onChangeLatest$curre.call(onChangeLatest, sourceCode);
32
+ onChange === null || onChange === void 0 ? void 0 : onChange(sourceCode);
38
33
  }
39
34
  }, [sourceCode]);
40
35
 
@@ -96,7 +91,7 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
96
91
  {
97
92
  e.preventDefault();
98
93
  if (startOffset < endOffset) {
99
- e.clipboardData.setData('text/plain', sourceCodeLatest.current.slice(startOffset, endOffset));
94
+ e.clipboardData.setData('text/plain', sourceCode.slice(startOffset, endOffset));
100
95
  if (e.type === 'cut') {
101
96
  dispatch({
102
97
  type: 'delete',
@@ -118,9 +113,8 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
118
113
  selection: selection
119
114
  });
120
115
  } else if (e.clipboardData.types.includes('Files')) {
121
- var _onInsertFileLatest$c;
122
116
  var _file = e.clipboardData.files[0];
123
- (_onInsertFileLatest$c = onInsertFileLatest.current) === null || _onInsertFileLatest$c === void 0 ? void 0 : _onInsertFileLatest$c.call(onInsertFileLatest, _file, {
117
+ onInsertFile === null || onInsertFile === void 0 ? void 0 : onInsertFile(_file, {
124
118
  description: _file.name,
125
119
  image: _file.type.startsWith('image/')
126
120
  });
@@ -134,6 +128,7 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
134
128
  * 开始组合时的选区
135
129
  */
136
130
  var compositionStartSelection = useRef();
131
+ var compositionEndTimer = useRef();
137
132
  var compositionEventHandler = function compositionEventHandler(e) {
138
133
  switch (e.type) {
139
134
  case 'compositionend':
@@ -147,7 +142,7 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
147
142
  selection: compositionStartSelection.current
148
143
  });
149
144
  // 确保组合事件屏蔽表单和键盘事件
150
- window.setTimeout(function () {
145
+ compositionEndTimer.current = window.setTimeout(function () {
151
146
  return compositionStartSelection.current = undefined;
152
147
  });
153
148
  }
@@ -155,6 +150,7 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
155
150
  }
156
151
  case 'compositionstart':
157
152
  {
153
+ window.clearTimeout(compositionEndTimer.current);
158
154
  compositionStartSelection.current = getSelection();
159
155
  break;
160
156
  }
@@ -195,6 +191,7 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
195
191
  };
196
192
  var formEventHandler = function formEventHandler(e) {
197
193
  if (compositionStartSelection.current) {
194
+ e.preventDefault();
198
195
  return;
199
196
  }
200
197
  switch (e.type) {
@@ -214,24 +211,24 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
214
211
  }
215
212
  }
216
213
  };
217
- var _composeHandlers = composeHandlers(plugins)({
218
- toolbarItemMap: getDefaultToolbarItemMap(locale, onInsertFileLatest.current),
214
+ var options = useMemo(function () {
215
+ return composeHandlers(plugins)({
216
+ toolbarItemMap: getDefaultToolbarItemMap(locale, onInsertFile),
219
217
  toolbarItems: getDefaultToolbarItems(),
220
218
  keyboardEventHandlers: getDefaultKeyboardEventHandlers()
221
- }),
222
- toolbarItemMap = _composeHandlers.toolbarItemMap,
223
- toolbarItems = _composeHandlers.toolbarItems,
224
- keyboardEventHandlers = _composeHandlers.keyboardEventHandlers;
219
+ });
220
+ }, [plugins]);
225
221
  var keyboardEventHandler = function keyboardEventHandler(e) {
226
222
  if (compositionStartSelection.current) {
223
+ e.preventDefault();
227
224
  return;
228
225
  }
229
226
  switch (e.type) {
230
227
  case 'keydown':
231
228
  {
232
- composeHandlers(keyboardEventHandlers)({
233
- history: historyLatest.current,
234
- sourceCode: sourceCodeLatest.current,
229
+ composeHandlers(options.keyboardEventHandlers)({
230
+ history: history,
231
+ sourceCode: sourceCode,
235
232
  selection: getSelection(),
236
233
  dispatch: dispatch,
237
234
  e: e
@@ -245,8 +242,8 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
245
242
  }, /*#__PURE__*/React.createElement(Toolbar, {
246
243
  className: classNames(toolbarClassName),
247
244
  style: toolbarStyle,
248
- itemMap: toolbarItemMap,
249
- items: toolbarItems,
245
+ itemMap: options.toolbarItemMap,
246
+ items: options.toolbarItems,
250
247
  exec: exec
251
248
  }), /*#__PURE__*/React.createElement("div", {
252
249
  ref: container.ref,
@@ -1,5 +1,22 @@
1
+ import type { Components } from 'hast-util-to-jsx-runtime';
1
2
  import React from 'react';
2
- import type { ViewerOptions } from '../utils/markdown';
3
+ import type { Schema } from '../utils/markdown';
4
+ export interface ViewerOptions {
5
+ /**
6
+ * 自定义过滤模式
7
+ */
8
+ customSchema: Schema;
9
+ /**
10
+ * 自定义 HTML 元素
11
+ */
12
+ customHTMLElements: Partial<Components>;
13
+ /**
14
+ * 自定义块
15
+ */
16
+ customBlocks: Partial<Record<string, React.ComponentType<{
17
+ children: string;
18
+ }>>>;
19
+ }
3
20
  export interface XStarMdViewerPlugin {
4
21
  (ctx: ViewerOptions): void;
5
22
  }
@@ -23,6 +40,10 @@ export interface XStarMdViewerProps {
23
40
  * 插件
24
41
  */
25
42
  plugins?: XStarMdViewerPlugin[];
43
+ /**
44
+ * 是否启用 Web Worker
45
+ */
46
+ enableWebWorker?: boolean;
26
47
  }
27
48
  declare const XStarMdViewer: React.ForwardRefExoticComponent<XStarMdViewerProps & React.RefAttributes<XStarMdViewerHandle>>;
28
49
  export default XStarMdViewer;
@@ -1,14 +1,16 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
1
2
  import classNames from 'classnames';
2
- import React, { useImperativeHandle, useRef } from 'react';
3
+ import React, { useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
3
4
  import { prefix } from "../utils/global";
4
5
  import { composeHandlers } from "../utils/handler";
5
- import { getDefaultSchema, viewerRender } from "../utils/markdown";
6
+ import { getDefaultSchema, postViewerRender, preViewerRender, viewerRender } from "../utils/markdown";
6
7
  var XStarMdViewer = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7
8
  var className = _ref.className,
8
9
  style = _ref.style,
9
10
  _ref$value = _ref.value,
10
11
  value = _ref$value === void 0 ? '' : _ref$value,
11
- plugins = _ref.plugins;
12
+ plugins = _ref.plugins,
13
+ enableWebWorker = _ref.enableWebWorker;
12
14
  var container = useRef(null);
13
15
  useImperativeHandle(ref, function () {
14
16
  return {
@@ -17,15 +19,47 @@ var XStarMdViewer = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
17
19
  }
18
20
  };
19
21
  }, []);
22
+ var options = useMemo(function () {
23
+ return composeHandlers(plugins)({
24
+ customSchema: getDefaultSchema(),
25
+ customHTMLElements: {},
26
+ customBlocks: {}
27
+ });
28
+ }, [plugins]);
29
+ var optionsLatest = useRef(options);
30
+ optionsLatest.current = options;
31
+ var _useState = useState(),
32
+ _useState2 = _slicedToArray(_useState, 2),
33
+ children = _useState2[0],
34
+ setChildren = _useState2[1];
35
+ var worker = useRef();
36
+ useEffect(function () {
37
+ if (enableWebWorker) {
38
+ worker.current = new Worker(new URL('../../workers/markdown.worker.js', import.meta.url));
39
+ worker.current.addEventListener('message', function (_ref2) {
40
+ var data = _ref2.data;
41
+ return setChildren(postViewerRender(data, optionsLatest.current));
42
+ });
43
+ return function () {
44
+ var _worker$current;
45
+ return (_worker$current = worker.current) === null || _worker$current === void 0 ? void 0 : _worker$current.terminate();
46
+ };
47
+ }
48
+ }, [enableWebWorker]);
49
+ useEffect(function () {
50
+ var params = [preViewerRender(value), options.customSchema];
51
+ if (enableWebWorker) {
52
+ var _worker$current2;
53
+ (_worker$current2 = worker.current) === null || _worker$current2 === void 0 ? void 0 : _worker$current2.postMessage(params);
54
+ } else {
55
+ setChildren(postViewerRender(viewerRender.apply(void 0, params), options));
56
+ }
57
+ }, [value, options]);
20
58
  return /*#__PURE__*/React.createElement("div", {
21
59
  ref: container,
22
60
  className: classNames("".concat(prefix, "md-viewer"), className),
23
61
  style: style
24
- }, viewerRender(value, composeHandlers(plugins)({
25
- customSchema: getDefaultSchema(),
26
- customHTMLElements: {},
27
- customBlocks: {}
28
- })));
62
+ }, children);
29
63
  });
30
64
  if (process.env.NODE_ENV !== 'production') {
31
65
  XStarMdViewer.displayName = 'XStarMdViewer';
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "x-star-editor",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "An editor developed by turingstar",
5
5
  "license": "MIT",
6
6
  "module": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "files": [
9
- "dist"
9
+ "dist",
10
+ "workers"
10
11
  ],
11
12
  "scripts": {
12
13
  "build": "father build && sass src:dist --no-source-map",
@@ -44,6 +45,7 @@
44
45
  ]
45
46
  },
46
47
  "dependencies": {
48
+ "@babel/runtime": "^7.22.11",
47
49
  "classnames": "^2.3.2",
48
50
  "hast-util-to-jsx-runtime": "^1.2.0",
49
51
  "rehype-katex": "^6.0.3",