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.
@@ -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' /** 'table' */], ['link', 'image', 'mermaid'], ['inlineCode', 'code', 'inlineMath', 'math'], ['undo', 'redo'],
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
  };
@@ -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 {
@@ -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;
@@ -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 /^ {0,3}> */.test(line);
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(/^ {0,3}> */, '');
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] = "> ".concat(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 type = action.payload.type;
80
- var delimiters = type === 'emphasis' ? ['*', '_'] : type === 'strong' ? ['**', '__'] : type === 'inlineCode' ? ['`'] : type === 'delete' ? ['~~'] : ['$'];
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
- _type = _action$payload2.type,
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(_type === 'image' ? '!' : '', "[").concat(description, "](").concat(url, ")").concat(after),
136
- selection: createSelection(startOffset + url.length + description.length + 4 + (_type === 'image' ? 1 : 0))
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 {
@@ -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$attrib3, _defaultSchema$attrib4, _defaultSchema$attrib5, _defaultSchema$attrib6, _defaultSchema$attrib7, _defaultSchema$attrib8, _defaultSchema$protoc, _defaultSchema$protoc2, _defaultSchema$tagNam;
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
- 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']),
315
- 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']),
316
- 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']),
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 : []), ['svg', 'path', 'custom'])
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 observer = new MutationObserver(function () {
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
- observer.observe(viewer, {
160
- subtree: true,
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
- observer.disconnect();
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.stopPropagation();
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 _containerRef$current;
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 || !containerRef.current) {
198
+ if (!targetRange) {
196
199
  return;
197
200
  }
198
- var startOffset = container.getOffset(containerRef.current, targetRange.startContainer, targetRange.startOffset);
199
- var endOffset = container.getOffset(containerRef.current, targetRange.endContainer, targetRange.endOffset);
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
- (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.addEventListener('beforeinput', listener);
358
+ editor.addEventListener('beforeinput', listener);
356
359
  return function () {
357
- var _containerRef$current2;
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),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "x-star-editor",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "An editor developed by turingstar",
5
5
  "license": "MIT",
6
6
  "module": "dist/index.js",