x-star-editor 0.6.2 → 0.6.3

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/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export type { ToolbarItem } from './components/Toolbar';
2
2
  export { createSelection, getRange } from './utils/container';
3
- export { batchHandler, insertHandler, mutateHandler, redoHandler, selectHandler, setHandler, toggleHandler, undoHandler, } from './utils/handler';
3
+ export { batchHandler, indentHandler, insertHandler, mutateHandler, redoHandler, selectHandler, setHandler, toggleHandler, undoHandler, } from './utils/handler';
4
4
  export type { Executor, Handler, KeyboardEventHandler } from './utils/handler';
5
5
  export { toHTML, toMarkdown, toText } from './utils/markdown';
6
6
  export { default as XStarEditor, useEditorRef } from './x-star-editor';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { createSelection, getRange } from "./utils/container";
2
- export { batchHandler, insertHandler, mutateHandler, redoHandler, selectHandler, setHandler, toggleHandler, undoHandler } from "./utils/handler";
2
+ export { batchHandler, indentHandler, insertHandler, mutateHandler, redoHandler, selectHandler, setHandler, toggleHandler, undoHandler } from "./utils/handler";
3
3
  export { toHTML, toMarkdown, toText } from "./utils/markdown";
4
4
  export { default as XStarEditor, useEditorRef } from "./x-star-editor";
5
5
  export { default as XStarMdEditor, useMdEditorRef } from "./x-star-md-editor";
@@ -1857,10 +1857,10 @@ body {
1857
1857
  transform-origin: top left;
1858
1858
  }
1859
1859
  .x-star-editor-slide-viewer .x-star-editor-slide > :first-child {
1860
- margin-top: 0; /* 防止垂直居中时出现的视觉上的不居中现象 */
1860
+ margin-top: 0;
1861
1861
  }
1862
1862
  .x-star-editor-slide-viewer .x-star-editor-slide > :last-child {
1863
- margin-bottom: 0; /* 防止垂直居中时出现的视觉上的不居中现象 */
1863
+ margin-bottom: 0;
1864
1864
  }
1865
1865
  .x-star-editor-slide-viewer .x-star-editor-slide h1,
1866
1866
  .x-star-editor-slide-viewer .x-star-editor-slide h2,
@@ -1887,11 +1887,11 @@ body {
1887
1887
  background-color: rgba(0, 0, 0, 0.04);
1888
1888
  }
1889
1889
  .x-star-editor-slide-viewer .x-star-editor-slide pre {
1890
- width: 70%;
1890
+ width: max-content;
1891
+ max-width: 100%;
1891
1892
  }
1892
- .x-star-editor-slide-viewer .x-star-editor-slide img[id^=user-content-mermaid-] {
1893
- width: 100%;
1894
- max-height: 100%;
1893
+ .x-star-editor-slide-viewer .x-star-editor-slide img[id^=user-content-mermaid] {
1894
+ max-width: 100%;
1895
1895
  }
1896
1896
  .x-star-editor-slide-viewer .x-star-editor-custom-cursor-pencil {
1897
1897
  cursor: url("./cursor/pencil.png"), auto;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import type { BatchAction, InsertAction, MutateAction, SelectAction, SetAction, ToggleAction, useHistory } from './history';
2
+ import type { BatchAction, IndentAction, InsertAction, MutateAction, SelectAction, SetAction, ToggleAction, useHistory } from './history';
3
3
  /**
4
4
  * 处理函数上下文
5
5
  */
@@ -12,6 +12,7 @@ export interface Handler<T = void> {
12
12
  }
13
13
  export declare const insertHandler: (payload: InsertAction['payload']) => Handler;
14
14
  export declare const toggleHandler: (payload: ToggleAction['payload']) => Handler;
15
+ export declare const indentHandler: (payload: IndentAction['payload']) => Handler;
15
16
  export declare const setHandler: (payload: SetAction['payload']) => Handler;
16
17
  export declare const undoHandler: () => Handler;
17
18
  export declare const redoHandler: () => Handler;
@@ -1,6 +1,6 @@
1
1
  import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
2
2
  import { createKeybindingsHandler } from 'tinykeys';
3
- import { createSelection } from "./container";
3
+ import { createSelection, getRange } from "./container";
4
4
 
5
5
  /**
6
6
  * 处理函数上下文
@@ -32,10 +32,21 @@ export var toggleHandler = function toggleHandler(payload) {
32
32
  });
33
33
  };
34
34
  };
35
- export var setHandler = function setHandler(payload) {
35
+ export var indentHandler = function indentHandler(payload) {
36
36
  return function (_ref3) {
37
37
  var selection = _ref3.selection,
38
38
  dispatch = _ref3.dispatch;
39
+ return dispatch({
40
+ type: 'indent',
41
+ payload: payload,
42
+ selection: selection
43
+ });
44
+ };
45
+ };
46
+ export var setHandler = function setHandler(payload) {
47
+ return function (_ref4) {
48
+ var selection = _ref4.selection,
49
+ dispatch = _ref4.dispatch;
39
50
  return dispatch({
40
51
  type: 'set',
41
52
  payload: payload,
@@ -44,24 +55,24 @@ export var setHandler = function setHandler(payload) {
44
55
  };
45
56
  };
46
57
  export var undoHandler = function undoHandler() {
47
- return function (_ref4) {
48
- var dispatch = _ref4.dispatch;
58
+ return function (_ref5) {
59
+ var dispatch = _ref5.dispatch;
49
60
  return dispatch({
50
61
  type: 'undo'
51
62
  });
52
63
  };
53
64
  };
54
65
  export var redoHandler = function redoHandler() {
55
- return function (_ref5) {
56
- var dispatch = _ref5.dispatch;
66
+ return function (_ref6) {
67
+ var dispatch = _ref6.dispatch;
57
68
  return dispatch({
58
69
  type: 'redo'
59
70
  });
60
71
  };
61
72
  };
62
73
  export var batchHandler = function batchHandler(payload) {
63
- return function (_ref6) {
64
- var dispatch = _ref6.dispatch;
74
+ return function (_ref7) {
75
+ var dispatch = _ref7.dispatch;
65
76
  return dispatch({
66
77
  type: 'batch',
67
78
  payload: payload
@@ -69,8 +80,8 @@ export var batchHandler = function batchHandler(payload) {
69
80
  };
70
81
  };
71
82
  export var mutateHandler = function mutateHandler(payload) {
72
- return function (_ref7) {
73
- var dispatch = _ref7.dispatch;
83
+ return function (_ref8) {
84
+ var dispatch = _ref8.dispatch;
74
85
  return dispatch({
75
86
  type: 'mutate',
76
87
  payload: payload
@@ -78,8 +89,8 @@ export var mutateHandler = function mutateHandler(payload) {
78
89
  };
79
90
  };
80
91
  export var selectHandler = function selectHandler(payload) {
81
- return function (_ref8) {
82
- var dispatch = _ref8.dispatch;
92
+ return function (_ref9) {
93
+ var dispatch = _ref9.dispatch;
83
94
  return dispatch({
84
95
  type: 'select',
85
96
  payload: payload
@@ -98,18 +109,42 @@ export var selectHandler = function selectHandler(payload) {
98
109
  */
99
110
 
100
111
  export var getDefaultKeyboardEventHandlers = function getDefaultKeyboardEventHandlers() {
101
- return [function (_ref9) {
102
- var sourceCode = _ref9.sourceCode,
103
- selection = _ref9.selection,
104
- dispatch = _ref9.dispatch,
105
- e = _ref9.e;
112
+ return [function (_ref10) {
113
+ var sourceCode = _ref10.sourceCode,
114
+ selection = _ref10.selection,
115
+ dispatch = _ref10.dispatch,
116
+ e = _ref10.e;
106
117
  return createKeybindingsHandler({
107
118
  Tab: function Tab(e) {
119
+ e.preventDefault();
120
+ var _getRange = getRange(selection),
121
+ startOffset = _getRange.startOffset,
122
+ endOffset = _getRange.endOffset;
123
+ var text = sourceCode.slice(startOffset, endOffset);
124
+ if (text.includes('\n')) {
125
+ dispatch({
126
+ type: 'indent',
127
+ payload: {
128
+ indent: true
129
+ },
130
+ selection: selection
131
+ });
132
+ } else {
133
+ dispatch({
134
+ type: 'insert',
135
+ payload: {
136
+ text: '\t'
137
+ },
138
+ selection: selection
139
+ });
140
+ }
141
+ },
142
+ 'Shift+Tab': function ShiftTab(e) {
108
143
  e.preventDefault();
109
144
  dispatch({
110
- type: 'insert',
145
+ type: 'indent',
111
146
  payload: {
112
- text: '\t'
147
+ indent: false
113
148
  },
114
149
  selection: selection
115
150
  });
@@ -33,12 +33,19 @@ export interface ToggleAction {
33
33
  };
34
34
  selection: ContainerSelection;
35
35
  }
36
+ export interface IndentAction {
37
+ type: 'indent';
38
+ payload: {
39
+ indent: boolean;
40
+ };
41
+ selection: ContainerSelection;
42
+ }
36
43
  export interface SetAction {
37
44
  type: 'set';
38
45
  payload: State;
39
46
  selection: ContainerSelection;
40
47
  }
41
- type StateAction = InsertAction | ToggleAction | SetAction;
48
+ type StateAction = InsertAction | ToggleAction | IndentAction | SetAction;
42
49
  /**
43
50
  * 编辑器历史
44
51
  */
@@ -33,6 +33,34 @@ var stateReducer = function stateReducer(_ref, action) {
33
33
  var lineEndOffset = endOffset + "".concat(after, "\n").indexOf('\n');
34
34
  var lineBefore = sourceCode.slice(0, lineStartOffset);
35
35
  var lineAfter = sourceCode.slice(lineEndOffset);
36
+ var toggleDelimiters = function toggleDelimiters() {
37
+ var text = sourceCode.slice(startOffset, endOffset);
38
+ for (var _len = arguments.length, delimiters = new Array(_len), _key = 0; _key < _len; _key++) {
39
+ delimiters[_key] = arguments[_key];
40
+ }
41
+ for (var _i = 0, _delimiters = delimiters; _i < _delimiters.length; _i++) {
42
+ var _delimiter = _delimiters[_i];
43
+ if (before.endsWith(_delimiter) && after.startsWith(_delimiter)) {
44
+ // 删除分隔文本
45
+ return {
46
+ sourceCode: "".concat(before.slice(0, before.length - _delimiter.length)).concat(text).concat(after.slice(_delimiter.length)),
47
+ selection: createSelection(anchorOffset - _delimiter.length, focusOffset - _delimiter.length)
48
+ };
49
+ }
50
+ }
51
+ var delimiter = delimiters[0];
52
+ // 插入分隔文本
53
+ return {
54
+ sourceCode: "".concat(before).concat(delimiter).concat(text).concat(delimiter).concat(after),
55
+ selection: createSelection(anchorOffset + delimiter.length, focusOffset + delimiter.length)
56
+ };
57
+ };
58
+ var toggleBlock = function toggleBlock(block, offset) {
59
+ return {
60
+ sourceCode: "".concat(sourceCode.slice(0, lineEndOffset), "\n").concat(block, "\n").concat(lineAfter),
61
+ selection: createSelection(lineEndOffset + offset + 1)
62
+ };
63
+ };
36
64
  switch (action.payload.type) {
37
65
  case 'blockquote':
38
66
  case 'orderedList':
@@ -53,8 +81,8 @@ var stateReducer = function stateReducer(_ref, action) {
53
81
  if (values.some(function (value) {
54
82
  return !value;
55
83
  })) {
56
- for (var _i = 0; _i < lines.length; _i++) {
57
- lines[_i] = "".concat(prefixes[1], " ").concat(lines[_i]);
84
+ for (var _i2 = 0; _i2 < lines.length; _i2++) {
85
+ lines[_i2] = "".concat(prefixes[1], " ").concat(lines[_i2]);
58
86
  }
59
87
  }
60
88
  var _text = lines.join('\n');
@@ -76,30 +104,12 @@ var stateReducer = function stateReducer(_ref, action) {
76
104
  };
77
105
  }
78
106
  case 'delete':
107
+ {
108
+ return toggleDelimiters('~~');
109
+ }
79
110
  case 'emphasis':
80
- case 'inlineCode':
81
- case 'inlineMath':
82
- case 'strong':
83
111
  {
84
- var _type = action.payload.type;
85
- var delimiters = _type === 'emphasis' ? ['*', '_'] : _type === 'strong' ? ['**', '__'] : _type === 'inlineCode' ? ['`'] : _type === 'delete' ? ['~~'] : ['$'];
86
- var _text2 = sourceCode.slice(startOffset, endOffset);
87
- for (var _i2 = 0, _delimiters = delimiters; _i2 < _delimiters.length; _i2++) {
88
- var _delimiter = _delimiters[_i2];
89
- if (before.endsWith(_delimiter) && after.startsWith(_delimiter)) {
90
- // 删除分隔文本
91
- return {
92
- sourceCode: "".concat(before.slice(0, before.length - _delimiter.length)).concat(_text2).concat(after.slice(_delimiter.length)),
93
- selection: createSelection(anchorOffset - _delimiter.length, focusOffset - _delimiter.length)
94
- };
95
- }
96
- }
97
- var delimiter = delimiters[0];
98
- // 插入分隔文本
99
- return {
100
- sourceCode: "".concat(before).concat(delimiter).concat(_text2).concat(delimiter).concat(after),
101
- selection: createSelection(anchorOffset + delimiter.length, focusOffset + delimiter.length)
102
- };
112
+ return toggleDelimiters('*', '_');
103
113
  }
104
114
  case 'heading':
105
115
  {
@@ -123,44 +133,47 @@ var stateReducer = function stateReducer(_ref, action) {
123
133
  _lines[_i4] = "".concat('#'.repeat(depth), " ").concat(_lines[_i4]);
124
134
  }
125
135
  }
126
- var _text3 = _lines.join('\n');
136
+ var _text2 = _lines.join('\n');
127
137
  return {
128
- sourceCode: "".concat(lineBefore).concat(_text3).concat(lineAfter),
129
- selection: createSelection(lineStartOffset + _text3.length)
138
+ sourceCode: "".concat(lineBefore).concat(_text2).concat(lineAfter),
139
+ selection: createSelection(lineStartOffset + _text2.length)
130
140
  };
131
141
  }
132
142
  case 'image':
133
143
  case 'link':
134
144
  {
135
145
  var _action$payload2 = action.payload,
136
- _type2 = _action$payload2.type,
146
+ _type = _action$payload2.type,
137
147
  url = _action$payload2.url,
138
148
  description = _action$payload2.description;
139
149
  return {
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))
150
+ sourceCode: "".concat(before).concat(_type === 'image' ? '!' : '', "[").concat(description, "](").concat(url, ")").concat(after),
151
+ selection: createSelection(startOffset + url.length + description.length + 4 + (_type === 'image' ? 1 : 0))
142
152
  };
143
153
  }
154
+ case 'inlineCode':
155
+ {
156
+ return toggleDelimiters('`');
157
+ }
158
+ case 'inlineMath':
159
+ {
160
+ return toggleDelimiters('$');
161
+ }
144
162
  case 'math':
145
163
  {
146
- return {
147
- sourceCode: "".concat(sourceCode.slice(0, lineEndOffset), "\n$$\n\n$$\n").concat(lineAfter),
148
- selection: createSelection(lineEndOffset + 4)
149
- };
164
+ return toggleBlock('$$\n\n$$', 3);
165
+ }
166
+ case 'strong':
167
+ {
168
+ return toggleDelimiters('**', '__');
150
169
  }
151
170
  case 'table':
152
171
  {
153
- return {
154
- sourceCode: "".concat(sourceCode.slice(0, lineEndOffset), "\n| | |\n| - | - |\n| | |\n| | |\n").concat(lineAfter),
155
- selection: createSelection(lineEndOffset + 3)
156
- };
172
+ return toggleBlock('| | |\n| - | - |\n| | |\n| | |', 2);
157
173
  }
158
174
  case 'thematicBreak':
159
175
  {
160
- return {
161
- sourceCode: "".concat(sourceCode.slice(0, lineEndOffset), "\n***\n").concat(lineAfter),
162
- selection: createSelection(lineEndOffset + 5)
163
- };
176
+ return toggleBlock('***', 4);
164
177
  }
165
178
  default:
166
179
  {
@@ -169,6 +182,20 @@ var stateReducer = function stateReducer(_ref, action) {
169
182
  }
170
183
  }
171
184
  }
185
+ case 'indent':
186
+ {
187
+ var _lineStartOffset = before.lastIndexOf('\n') + 1;
188
+ var _lineEndOffset = endOffset + "".concat(after, "\n").indexOf('\n');
189
+ var _lineBefore = sourceCode.slice(0, _lineStartOffset);
190
+ var _lineAfter = sourceCode.slice(_lineEndOffset);
191
+ var _text3 = sourceCode.slice(_lineStartOffset, _lineEndOffset).split('\n').map(function (line) {
192
+ return action.payload.indent ? "\t".concat(line) : line.replace(/^(\t| )/, '');
193
+ }).join('\n');
194
+ return {
195
+ sourceCode: "".concat(_lineBefore).concat(_text3).concat(_lineAfter),
196
+ selection: createSelection(_lineStartOffset, _lineStartOffset + _text3.length)
197
+ };
198
+ }
172
199
  case 'set':
173
200
  {
174
201
  var _action$payload3 = action.payload,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "x-star-editor",
3
- "version": "0.6.2",
3
+ "version": "0.6.3",
4
4
  "description": "An editor developed by turingstar",
5
5
  "license": "MIT",
6
6
  "module": "dist/index.js",
@@ -44,7 +44,7 @@
44
44
  ]
45
45
  },
46
46
  "dependencies": {
47
- "@babel/runtime": "^7.22.11",
47
+ "@babel/runtime": "^7.24.1",
48
48
  "ahooks": "^3.7.10",
49
49
  "classnames": "^2.3.2",
50
50
  "hast-util-to-jsx-runtime": "^1.2.0",
@@ -71,8 +71,8 @@
71
71
  "unist-util-visit": "^4.1.2"
72
72
  },
73
73
  "devDependencies": {
74
- "@babel/core": "^7.22.10",
75
- "@babel/preset-typescript": "^7.22.11",
74
+ "@babel/core": "^7.24.1",
75
+ "@babel/preset-typescript": "^7.24.1",
76
76
  "@commitlint/cli": "^17.1.2",
77
77
  "@commitlint/config-conventional": "^17.1.0",
78
78
  "@types/react": "^18.0.0",