x-star-editor 0.1.1 → 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.
- package/dist/components/Fade.js +2 -7
- package/dist/components/FileInput.js +2 -10
- package/dist/components/Toolbar.js +17 -24
- package/dist/locales/index.js +6 -5
- package/dist/styles/index.css +52 -45
- package/dist/utils/container.js +1 -3
- package/dist/utils/handler.js +1 -3
- package/dist/utils/history.js +3 -16
- package/dist/utils/markdown.d.ts +31 -29
- package/dist/utils/markdown.js +106 -62
- package/dist/x-star-editor/index.d.ts +12 -4
- package/dist/x-star-editor/index.js +10 -16
- package/dist/x-star-md-editor/index.js +19 -22
- package/dist/x-star-md-viewer/index.d.ts +22 -1
- package/dist/x-star-md-viewer/index.js +42 -8
- package/package.json +4 -2
- package/workers/markdown.worker.js +1 -0
package/dist/utils/markdown.js
CHANGED
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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,44 +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
|
-
svg: ['xmlns', 'width', 'height', 'viewBox', 'preserveAspectRatio'],
|
|
40
|
-
path: ['d'],
|
|
41
|
-
custom: ['meta', 'value']
|
|
42
|
-
}),
|
|
43
|
-
protocols: _objectSpread(_objectSpread({}, defaultSchema.protocols), {}, {
|
|
44
|
-
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'])
|
|
45
|
-
}),
|
|
46
|
-
tagNames: [].concat(_toConsumableArray((_defaultSchema$tagNam = defaultSchema.tagNames) !== null && _defaultSchema$tagNam !== void 0 ? _defaultSchema$tagNam : []), ['svg', 'path', 'custom'])
|
|
47
|
-
});
|
|
48
|
-
};
|
|
49
22
|
|
|
50
23
|
/**
|
|
51
|
-
* 将 Markdown 文本解析为 Mdast
|
|
24
|
+
* 将 Markdown 文本解析为 Mdast 树的处理器
|
|
52
25
|
*/
|
|
53
|
-
var
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
+
}();
|
|
69
45
|
|
|
70
46
|
/**
|
|
71
47
|
* Mdast 节点
|
|
@@ -125,7 +101,7 @@ export var editorRender = function editorRender(sourceCode) {
|
|
|
125
101
|
var styleElement = stack[index && !isFlowContent(stack[index - 1].node) ? index : 0].el;
|
|
126
102
|
styleElement.classList.add("".concat(mdPrefix).concat(node.type));
|
|
127
103
|
if (node.type === 'heading') {
|
|
128
|
-
styleElement.classList.add("".concat(mdPrefix, "heading").concat(node.depth));
|
|
104
|
+
styleElement.classList.add("".concat(mdPrefix, "heading-").concat(node.depth));
|
|
129
105
|
}
|
|
130
106
|
|
|
131
107
|
// 如果索引为 0,则父节点为块级元素,否则为前一个索引的 DOM 元素
|
|
@@ -267,7 +243,7 @@ export var editorRender = function editorRender(sourceCode) {
|
|
|
267
243
|
}
|
|
268
244
|
addText(sourceCode.slice(scanOffset, parentEndOffset), true);
|
|
269
245
|
};
|
|
270
|
-
getChildren(
|
|
246
|
+
getChildren(cachedParse(sourceCode).children, sourceCode.length);
|
|
271
247
|
if (scanOffset <= sourceCode.length) {
|
|
272
248
|
// 添加最后一行文本
|
|
273
249
|
block.append(createLine(sourceCode.slice(scanOffset)));
|
|
@@ -275,15 +251,73 @@ export var editorRender = function editorRender(sourceCode) {
|
|
|
275
251
|
}
|
|
276
252
|
return el;
|
|
277
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
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Hast 根节点
|
|
277
|
+
*/
|
|
278
|
+
|
|
278
279
|
/**
|
|
279
|
-
* 将 Markdown
|
|
280
|
+
* 将 Markdown 文本转成 Hast 树
|
|
280
281
|
*
|
|
281
282
|
* @param sourceCode Markdown 文本
|
|
282
|
-
* @
|
|
283
|
-
|
|
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 树
|
|
284
318
|
*/
|
|
285
|
-
export var viewerRender = function viewerRender(
|
|
286
|
-
return
|
|
319
|
+
export var viewerRender = function viewerRender(root, schema) {
|
|
320
|
+
return unified().use(rehypeRaw).use(rehypeSanitize, schema).use(function () {
|
|
287
321
|
return function (root) {
|
|
288
322
|
var _iterator2 = _createForOfIteratorHelper(root.children),
|
|
289
323
|
_step2;
|
|
@@ -301,7 +335,18 @@ export var viewerRender = function viewerRender(sourceCode, options) {
|
|
|
301
335
|
_iterator2.f();
|
|
302
336
|
}
|
|
303
337
|
};
|
|
304
|
-
}).runSync(
|
|
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, {
|
|
305
350
|
Fragment: Fragment,
|
|
306
351
|
jsx: jsx,
|
|
307
352
|
jsxs: jsxs,
|
|
@@ -317,10 +362,9 @@ export var viewerRender = function viewerRender(sourceCode, options) {
|
|
|
317
362
|
})
|
|
318
363
|
});
|
|
319
364
|
};
|
|
320
|
-
var
|
|
365
|
+
var toHTMLProcessor = unified().use(remarkParse).use(remarkGfm).use(remarkBreaks).use(remarkRehype, {
|
|
321
366
|
allowDangerousHtml: true
|
|
322
|
-
}).use(rehypeRaw).freeze();
|
|
323
|
-
var toHTMLProcessor = unified().use(rehypeStringify).freeze();
|
|
367
|
+
}).use(rehypeRaw).use(rehypeStringify).freeze();
|
|
324
368
|
|
|
325
369
|
/**
|
|
326
370
|
* 将 Markdown 文本转成 HTML 文本
|
|
@@ -329,9 +373,9 @@ var toHTMLProcessor = unified().use(rehypeStringify).freeze();
|
|
|
329
373
|
* @returns HTML 文本
|
|
330
374
|
*/
|
|
331
375
|
export var toHTML = function toHTML(sourceCode) {
|
|
332
|
-
return toHTMLProcessor.
|
|
376
|
+
return toHTMLProcessor.processSync(sourceCode).toString();
|
|
333
377
|
};
|
|
334
|
-
var toMarkdownProcessor = unified().use(rehypeRemark).use(remarkGfm).use(
|
|
378
|
+
var toMarkdownProcessor = unified().use(rehypeRemark).use(remarkGfm).use(remarkStringify).freeze();
|
|
335
379
|
|
|
336
380
|
/**
|
|
337
381
|
* 将带有 HTML 的 Markdown 文本转成 Markdown 文本
|
|
@@ -340,7 +384,7 @@ var toMarkdownProcessor = unified().use(rehypeRemark).use(remarkGfm).use(remarkB
|
|
|
340
384
|
* @returns Markdown 文本
|
|
341
385
|
*/
|
|
342
386
|
export var toMarkdown = function toMarkdown(sourceCode) {
|
|
343
|
-
return toMarkdownProcessor.stringify(toMarkdownProcessor.runSync(
|
|
387
|
+
return toMarkdownProcessor.stringify(toMarkdownProcessor.runSync(toHTMLProcessor.runSync(toHTMLProcessor.parse(sourceCode))));
|
|
344
388
|
};
|
|
345
389
|
var toTextProcessor = unified().use(strip).freeze();
|
|
346
390
|
|
|
@@ -13,23 +13,31 @@ export interface XStarEditorProps {
|
|
|
13
13
|
/**
|
|
14
14
|
* 语言
|
|
15
15
|
*/
|
|
16
|
-
locale?:
|
|
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?:
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
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',
|
|
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
|
-
|
|
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
|
|
218
|
-
|
|
214
|
+
var options = useMemo(function () {
|
|
215
|
+
return composeHandlers(plugins)({
|
|
216
|
+
toolbarItemMap: getDefaultToolbarItemMap(locale, onInsertFile),
|
|
219
217
|
toolbarItems: getDefaultToolbarItems(),
|
|
220
218
|
keyboardEventHandlers: getDefaultKeyboardEventHandlers()
|
|
221
|
-
})
|
|
222
|
-
|
|
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:
|
|
234
|
-
sourceCode:
|
|
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 {
|
|
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
|
-
},
|
|
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.
|
|
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",
|