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.
- 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 -60
- 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,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
|
|
24
|
+
* 将 Markdown 文本解析为 Mdast 树的处理器
|
|
50
25
|
*/
|
|
51
|
-
var
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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(
|
|
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
|
-
*
|
|
276
|
+
* Hast 根节点
|
|
277
|
+
*/
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* 将 Markdown 文本转成 Hast 树
|
|
278
281
|
*
|
|
279
282
|
* @param sourceCode Markdown 文本
|
|
280
|
-
* @
|
|
281
|
-
|
|
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(
|
|
284
|
-
return
|
|
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(
|
|
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
|
|
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.
|
|
376
|
+
return toHTMLProcessor.processSync(sourceCode).toString();
|
|
331
377
|
};
|
|
332
|
-
var toMarkdownProcessor = unified().use(rehypeRemark).use(remarkGfm).use(
|
|
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(
|
|
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?:
|
|
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",
|