x-star-editor 0.3.5 → 0.3.7
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/Toolbar.js +25 -7
- package/dist/styles/index.css +24 -0
- package/dist/utils/history.d.ts +1 -1
- package/dist/utils/history.js +20 -8
- package/dist/utils/markdown.js +5 -9
- package/dist/x-star-editor/index.js +12 -10
- package/dist/x-star-md-editor/index.js +9 -7
- package/dist/x-star-md-viewer/index.js +6 -0
- package/package.json +1 -1
|
@@ -423,7 +423,12 @@ export var getDefaultToolbarItemMap = function getDefaultToolbarItemMap(locale,
|
|
|
423
423
|
children: /*#__PURE__*/React.createElement(SvgOrderedList, {
|
|
424
424
|
className: classNames("".concat(prefix, "icon"))
|
|
425
425
|
}),
|
|
426
|
-
tooltip: t('orderedList')
|
|
426
|
+
tooltip: t('orderedList'),
|
|
427
|
+
onClick: function onClick(exec) {
|
|
428
|
+
return exec(toggleHandler({
|
|
429
|
+
type: 'orderedList'
|
|
430
|
+
}));
|
|
431
|
+
}
|
|
427
432
|
},
|
|
428
433
|
redo: function redo(_ref5) {
|
|
429
434
|
var history = _ref5.history;
|
|
@@ -453,13 +458,23 @@ export var getDefaultToolbarItemMap = function getDefaultToolbarItemMap(locale,
|
|
|
453
458
|
children: /*#__PURE__*/React.createElement(SvgTable, {
|
|
454
459
|
className: classNames("".concat(prefix, "icon"))
|
|
455
460
|
}),
|
|
456
|
-
tooltip: t('table')
|
|
461
|
+
tooltip: t('table'),
|
|
462
|
+
onClick: function onClick(exec) {
|
|
463
|
+
return exec(toggleHandler({
|
|
464
|
+
type: 'table'
|
|
465
|
+
}));
|
|
466
|
+
}
|
|
457
467
|
},
|
|
458
468
|
taskList: {
|
|
459
469
|
children: /*#__PURE__*/React.createElement(SvgTaskList, {
|
|
460
470
|
className: classNames("".concat(prefix, "icon"))
|
|
461
471
|
}),
|
|
462
|
-
tooltip: t('taskList')
|
|
472
|
+
tooltip: t('taskList'),
|
|
473
|
+
onClick: function onClick(exec) {
|
|
474
|
+
return exec(toggleHandler({
|
|
475
|
+
type: 'taskList'
|
|
476
|
+
}));
|
|
477
|
+
}
|
|
463
478
|
},
|
|
464
479
|
thematicBreak: {
|
|
465
480
|
children: /*#__PURE__*/React.createElement(SvgThematicBreak, {
|
|
@@ -531,14 +546,17 @@ export var getDefaultToolbarItemMap = function getDefaultToolbarItemMap(locale,
|
|
|
531
546
|
children: /*#__PURE__*/React.createElement(SvgUnorderedList, {
|
|
532
547
|
className: classNames("".concat(prefix, "icon"))
|
|
533
548
|
}),
|
|
534
|
-
tooltip: t('unorderedList')
|
|
549
|
+
tooltip: t('unorderedList'),
|
|
550
|
+
onClick: function onClick(exec) {
|
|
551
|
+
return exec(toggleHandler({
|
|
552
|
+
type: 'unorderedList'
|
|
553
|
+
}));
|
|
554
|
+
}
|
|
535
555
|
}
|
|
536
556
|
};
|
|
537
557
|
};
|
|
538
558
|
export var getDefaultToolbarItems = function getDefaultToolbarItems() {
|
|
539
|
-
return [['heading', 'strong', 'emphasis', 'delete'], ['thematicBreak', 'blockquote'
|
|
540
|
-
// ['orderedList', 'unorderedList', 'taskList'],
|
|
541
|
-
['toMarkdown', 'toHTML']
|
|
559
|
+
return [['heading', 'strong', 'emphasis', 'delete'], ['thematicBreak', 'blockquote', 'table'], ['link', 'image', 'mermaid'], ['inlineCode', 'code', 'inlineMath', 'math'], ['orderedList', 'unorderedList', 'taskList'], ['toMarkdown', 'toHTML'], ['undo', 'redo']
|
|
542
560
|
// ['help'],
|
|
543
561
|
];
|
|
544
562
|
};
|
package/dist/styles/index.css
CHANGED
|
@@ -255,6 +255,30 @@
|
|
|
255
255
|
.x-star-editor-md-viewer ::selection {
|
|
256
256
|
background-color: #c1def1;
|
|
257
257
|
}
|
|
258
|
+
.x-star-editor-md-viewer h1,
|
|
259
|
+
.x-star-editor-md-viewer h2,
|
|
260
|
+
.x-star-editor-md-viewer h3,
|
|
261
|
+
.x-star-editor-md-viewer h4,
|
|
262
|
+
.x-star-editor-md-viewer h5,
|
|
263
|
+
.x-star-editor-md-viewer h6 {
|
|
264
|
+
font-weight: bold;
|
|
265
|
+
}
|
|
266
|
+
.x-star-editor-md-viewer table {
|
|
267
|
+
margin: 1em 0;
|
|
268
|
+
border-collapse: collapse;
|
|
269
|
+
}
|
|
270
|
+
.x-star-editor-md-viewer th,
|
|
271
|
+
.x-star-editor-md-viewer td {
|
|
272
|
+
padding: 0.5em;
|
|
273
|
+
border: 1px solid #dedede;
|
|
274
|
+
}
|
|
275
|
+
.x-star-editor-md-viewer th {
|
|
276
|
+
font-weight: bold;
|
|
277
|
+
background-color: rgba(0, 0, 0, 0.06);
|
|
278
|
+
}
|
|
279
|
+
.x-star-editor-md-viewer tr:nth-child(even) td {
|
|
280
|
+
background-color: rgba(0, 0, 0, 0.04);
|
|
281
|
+
}
|
|
258
282
|
|
|
259
283
|
/* stylelint-disable font-family-no-missing-generic-family-keyword */
|
|
260
284
|
@font-face {
|
package/dist/utils/history.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export interface InsertAction {
|
|
|
17
17
|
export interface ToggleAction {
|
|
18
18
|
type: 'toggle';
|
|
19
19
|
payload: {
|
|
20
|
-
type: 'blockquote' | 'delete' | 'emphasis' | 'inlineCode' | 'inlineMath' | 'math' | 'strong' | 'thematicBreak';
|
|
20
|
+
type: 'blockquote' | 'delete' | 'emphasis' | 'inlineCode' | 'inlineMath' | 'math' | 'orderedList' | 'strong' | 'table' | 'taskList' | 'thematicBreak' | 'unorderedList';
|
|
21
21
|
} | {
|
|
22
22
|
type: 'code';
|
|
23
23
|
lang: string;
|
package/dist/utils/history.js
CHANGED
|
@@ -35,21 +35,26 @@ var stateReducer = function stateReducer(_ref, action) {
|
|
|
35
35
|
var lineAfter = sourceCode.slice(lineEndOffset);
|
|
36
36
|
switch (action.payload.type) {
|
|
37
37
|
case 'blockquote':
|
|
38
|
+
case 'orderedList':
|
|
39
|
+
case 'taskList':
|
|
40
|
+
case 'unorderedList':
|
|
38
41
|
{
|
|
42
|
+
var type = action.payload.type;
|
|
43
|
+
var prefixes = type === 'blockquote' ? ['>', '>'] : type === 'orderedList' ? ['\\d+\\.', '1.'] : type === 'taskList' ? ['[*+-] \\[[ x]]', '* [ ]'] : ['[*+-]', '*'];
|
|
39
44
|
var lines = sourceCode.slice(lineStartOffset, lineEndOffset).split('\n');
|
|
40
45
|
var values = lines.map(function (line) {
|
|
41
|
-
return
|
|
46
|
+
return new RegExp("^ {0,3}".concat(prefixes[0], " +")).test(line);
|
|
42
47
|
});
|
|
43
48
|
for (var i = 0; i < values.length; i++) {
|
|
44
49
|
if (values[i]) {
|
|
45
|
-
lines[i] = lines[i].replace(
|
|
50
|
+
lines[i] = lines[i].replace(new RegExp("^ {0,3}".concat(prefixes[0], " +")), '');
|
|
46
51
|
}
|
|
47
52
|
}
|
|
48
53
|
if (values.some(function (value) {
|
|
49
54
|
return !value;
|
|
50
55
|
})) {
|
|
51
56
|
for (var _i = 0; _i < lines.length; _i++) {
|
|
52
|
-
lines[_i] = "
|
|
57
|
+
lines[_i] = "".concat(prefixes[1], " ").concat(lines[_i]);
|
|
53
58
|
}
|
|
54
59
|
}
|
|
55
60
|
var _text = lines.join('\n');
|
|
@@ -76,8 +81,8 @@ var stateReducer = function stateReducer(_ref, action) {
|
|
|
76
81
|
case 'inlineMath':
|
|
77
82
|
case 'strong':
|
|
78
83
|
{
|
|
79
|
-
var
|
|
80
|
-
var delimiters =
|
|
84
|
+
var _type = action.payload.type;
|
|
85
|
+
var delimiters = _type === 'emphasis' ? ['*', '_'] : _type === 'strong' ? ['**', '__'] : _type === 'inlineCode' ? ['`'] : _type === 'delete' ? ['~~'] : ['$'];
|
|
81
86
|
var _text2 = sourceCode.slice(startOffset, endOffset);
|
|
82
87
|
for (var _i2 = 0, _delimiters = delimiters; _i2 < _delimiters.length; _i2++) {
|
|
83
88
|
var _delimiter = _delimiters[_i2];
|
|
@@ -128,12 +133,12 @@ var stateReducer = function stateReducer(_ref, action) {
|
|
|
128
133
|
case 'link':
|
|
129
134
|
{
|
|
130
135
|
var _action$payload2 = action.payload,
|
|
131
|
-
|
|
136
|
+
_type2 = _action$payload2.type,
|
|
132
137
|
url = _action$payload2.url,
|
|
133
138
|
description = _action$payload2.description;
|
|
134
139
|
return {
|
|
135
|
-
sourceCode: "".concat(before).concat(
|
|
136
|
-
selection: createSelection(startOffset + url.length + description.length + 4 + (
|
|
140
|
+
sourceCode: "".concat(before).concat(_type2 === 'image' ? '!' : '', "[").concat(description, "](").concat(url, ")").concat(after),
|
|
141
|
+
selection: createSelection(startOffset + url.length + description.length + 4 + (_type2 === 'image' ? 1 : 0))
|
|
137
142
|
};
|
|
138
143
|
}
|
|
139
144
|
case 'math':
|
|
@@ -143,6 +148,13 @@ var stateReducer = function stateReducer(_ref, action) {
|
|
|
143
148
|
selection: createSelection(lineEndOffset + 4)
|
|
144
149
|
};
|
|
145
150
|
}
|
|
151
|
+
case 'table':
|
|
152
|
+
{
|
|
153
|
+
return {
|
|
154
|
+
sourceCode: "".concat(sourceCode.slice(0, lineEndOffset), "\n| | |\n| - | - |\n| | |\n| | |\n").concat(lineAfter),
|
|
155
|
+
selection: createSelection(lineEndOffset + 3)
|
|
156
|
+
};
|
|
157
|
+
}
|
|
146
158
|
case 'thematicBreak':
|
|
147
159
|
{
|
|
148
160
|
return {
|
package/dist/utils/markdown.js
CHANGED
|
@@ -308,21 +308,17 @@ export var preViewerRender = /*#__PURE__*/function () {
|
|
|
308
308
|
*/
|
|
309
309
|
|
|
310
310
|
export var getDefaultSchema = function getDefaultSchema() {
|
|
311
|
-
var _defaultSchema$attrib, _defaultSchema$attrib2, _defaultSchema$
|
|
311
|
+
var _defaultSchema$attrib, _defaultSchema$attrib2, _defaultSchema$protoc, _defaultSchema$protoc2, _defaultSchema$tagNam;
|
|
312
312
|
return _objectSpread(_objectSpread({}, defaultSchema), {}, {
|
|
313
313
|
attributes: _objectSpread(_objectSpread({}, defaultSchema.attributes), {}, {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
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']),
|
|
318
|
-
svg: ['xmlns', 'viewBox', 'preserveAspectRatio'],
|
|
319
|
-
path: ['d'],
|
|
320
|
-
custom: ['meta', 'value']
|
|
314
|
+
custom: ['meta', 'value'],
|
|
315
|
+
span: ['line'],
|
|
316
|
+
'*': [].concat(_toConsumableArray((_defaultSchema$attrib = (_defaultSchema$attrib2 = defaultSchema.attributes) === null || _defaultSchema$attrib2 === void 0 ? void 0 : _defaultSchema$attrib2['*']) !== null && _defaultSchema$attrib !== void 0 ? _defaultSchema$attrib : []), ['className', 'style'])
|
|
321
317
|
}),
|
|
322
318
|
protocols: _objectSpread(_objectSpread({}, defaultSchema.protocols), {}, {
|
|
323
319
|
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'])
|
|
324
320
|
}),
|
|
325
|
-
tagNames: [].concat(_toConsumableArray((_defaultSchema$tagNam = defaultSchema.tagNames) !== null && _defaultSchema$tagNam !== void 0 ? _defaultSchema$tagNam : []), ['
|
|
321
|
+
tagNames: [].concat(_toConsumableArray((_defaultSchema$tagNam = defaultSchema.tagNames) !== null && _defaultSchema$tagNam !== void 0 ? _defaultSchema$tagNam : []), ['custom'])
|
|
326
322
|
});
|
|
327
323
|
};
|
|
328
324
|
|
|
@@ -149,21 +149,19 @@ var XStarEditor = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
|
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
};
|
|
152
|
-
var
|
|
152
|
+
var render = function render() {
|
|
153
153
|
return listener({
|
|
154
154
|
currentTarget: editor
|
|
155
155
|
});
|
|
156
|
-
}
|
|
156
|
+
};
|
|
157
157
|
editor.addEventListener('scroll', listener);
|
|
158
158
|
viewer.addEventListener('scroll', listener);
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
childList: true
|
|
162
|
-
});
|
|
159
|
+
// 查看器子节点更新时会手动触发该事件
|
|
160
|
+
viewer.addEventListener('render', render);
|
|
163
161
|
return function () {
|
|
164
162
|
editor.removeEventListener('scroll', listener);
|
|
165
163
|
viewer.removeEventListener('scroll', listener);
|
|
166
|
-
|
|
164
|
+
viewer.removeEventListener('render', render);
|
|
167
165
|
};
|
|
168
166
|
}, []);
|
|
169
167
|
var _useState = useState(initialValue),
|
|
@@ -223,15 +221,19 @@ var XStarEditor = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
|
|
|
223
221
|
var overflow = document.body.style.overflow;
|
|
224
222
|
var listener = createKeybindingsHandler({
|
|
225
223
|
Escape: function Escape(e) {
|
|
226
|
-
e.
|
|
224
|
+
e.stopImmediatePropagation();
|
|
227
225
|
setFullscreen(false);
|
|
228
226
|
}
|
|
229
227
|
});
|
|
230
228
|
document.body.style.overflow = 'hidden';
|
|
231
|
-
document.addEventListener('keydown', listener
|
|
229
|
+
document.addEventListener('keydown', listener, {
|
|
230
|
+
capture: true
|
|
231
|
+
});
|
|
232
232
|
return function () {
|
|
233
233
|
document.body.style.overflow = overflow;
|
|
234
|
-
document.removeEventListener('keydown', listener
|
|
234
|
+
document.removeEventListener('keydown', listener, {
|
|
235
|
+
capture: true
|
|
236
|
+
});
|
|
235
237
|
};
|
|
236
238
|
}
|
|
237
239
|
}, [fullscreen]);
|
|
@@ -189,14 +189,17 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
189
189
|
}
|
|
190
190
|
};
|
|
191
191
|
useEffect(function () {
|
|
192
|
-
var
|
|
192
|
+
var editor = containerRef.current;
|
|
193
|
+
if (!editor) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
193
196
|
var listener = function listener(e) {
|
|
194
197
|
var targetRange = e.getTargetRanges()[0];
|
|
195
|
-
if (!targetRange
|
|
198
|
+
if (!targetRange) {
|
|
196
199
|
return;
|
|
197
200
|
}
|
|
198
|
-
var startOffset = container.getOffset(
|
|
199
|
-
var endOffset = container.getOffset(
|
|
201
|
+
var startOffset = container.getOffset(editor, targetRange.startContainer, targetRange.startOffset);
|
|
202
|
+
var endOffset = container.getOffset(editor, targetRange.endContainer, targetRange.endOffset);
|
|
200
203
|
var selection = createSelection(startOffset, endOffset);
|
|
201
204
|
switch (e.inputType) {
|
|
202
205
|
case 'insertText':
|
|
@@ -352,10 +355,9 @@ var XStarMdEditor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
352
355
|
}
|
|
353
356
|
}
|
|
354
357
|
};
|
|
355
|
-
|
|
358
|
+
editor.addEventListener('beforeinput', listener);
|
|
356
359
|
return function () {
|
|
357
|
-
|
|
358
|
-
return (_containerRef$current2 = containerRef.current) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.removeEventListener('beforeinput', listener);
|
|
360
|
+
return editor.removeEventListener('beforeinput', listener);
|
|
359
361
|
};
|
|
360
362
|
}, []);
|
|
361
363
|
return /*#__PURE__*/React.createElement(LocaleProvider, {
|
|
@@ -78,6 +78,12 @@ var XStarMdViewer = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
78
78
|
}, _callee);
|
|
79
79
|
}))();
|
|
80
80
|
}, [value, options]);
|
|
81
|
+
|
|
82
|
+
// 确保在末尾输入时能同步滚动
|
|
83
|
+
useEffect(function () {
|
|
84
|
+
var _containerRef$current;
|
|
85
|
+
(_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.dispatchEvent(new Event('render'));
|
|
86
|
+
}, [children]);
|
|
81
87
|
return /*#__PURE__*/React.createElement("div", {
|
|
82
88
|
ref: containerRef,
|
|
83
89
|
className: classNames("".concat(prefix, "md-viewer"), _defineProperty({}, "".concat(prefix, "theme-").concat(theme), theme), className),
|