x-star-editor 0.6.2 → 0.6.4

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";
@@ -1787,6 +1787,9 @@ body {
1787
1787
  .x-star-editor-md-editor > :last-child {
1788
1788
  margin-bottom: 0.5em;
1789
1789
  }
1790
+ .x-star-editor-md-editor.x-star-editor-empty {
1791
+ /* 文本为空时显示提示 */
1792
+ }
1790
1793
  .x-star-editor-md-editor.x-star-editor-empty::before {
1791
1794
  content: attr(placeholder);
1792
1795
  position: absolute;
@@ -1830,6 +1833,9 @@ body {
1830
1833
  .x-star-editor-md-viewer tr:nth-child(even) td {
1831
1834
  background-color: rgba(0, 0, 0, 0.04);
1832
1835
  }
1836
+ .x-star-editor-md-viewer img {
1837
+ max-width: 100%;
1838
+ }
1833
1839
 
1834
1840
  .x-star-editor-slide-viewer {
1835
1841
  position: relative;
@@ -1849,19 +1855,14 @@ body {
1849
1855
  .x-star-editor-slide-viewer .x-star-editor-slide {
1850
1856
  width: 1280px;
1851
1857
  height: 720px;
1852
- padding: 0 32px;
1858
+ padding: 78.5px;
1853
1859
  display: flex;
1854
1860
  flex-direction: column;
1855
1861
  justify-content: center;
1862
+ font-size: 29px;
1856
1863
  background-color: #fff;
1857
1864
  transform-origin: top left;
1858
1865
  }
1859
- .x-star-editor-slide-viewer .x-star-editor-slide > :first-child {
1860
- margin-top: 0; /* 防止垂直居中时出现的视觉上的不居中现象 */
1861
- }
1862
- .x-star-editor-slide-viewer .x-star-editor-slide > :last-child {
1863
- margin-bottom: 0; /* 防止垂直居中时出现的视觉上的不居中现象 */
1864
- }
1865
1866
  .x-star-editor-slide-viewer .x-star-editor-slide h1,
1866
1867
  .x-star-editor-slide-viewer .x-star-editor-slide h2,
1867
1868
  .x-star-editor-slide-viewer .x-star-editor-slide h3,
@@ -1871,12 +1872,12 @@ body {
1871
1872
  font-weight: bold;
1872
1873
  }
1873
1874
  .x-star-editor-slide-viewer .x-star-editor-slide table {
1874
- margin: 16px 0;
1875
+ margin: 1em 0;
1875
1876
  border-collapse: collapse;
1876
1877
  }
1877
1878
  .x-star-editor-slide-viewer .x-star-editor-slide th,
1878
1879
  .x-star-editor-slide-viewer .x-star-editor-slide td {
1879
- padding: 8px;
1880
+ padding: 0.5em;
1880
1881
  border: 1px solid #dedede;
1881
1882
  }
1882
1883
  .x-star-editor-slide-viewer .x-star-editor-slide th {
@@ -1886,12 +1887,14 @@ body {
1886
1887
  .x-star-editor-slide-viewer .x-star-editor-slide tr:nth-child(even) td {
1887
1888
  background-color: rgba(0, 0, 0, 0.04);
1888
1889
  }
1889
- .x-star-editor-slide-viewer .x-star-editor-slide pre {
1890
- width: 70%;
1890
+ .x-star-editor-slide-viewer .x-star-editor-slide img {
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 > :first-child {
1894
+ margin-top: 0; /* 防止垂直居中时出现视觉上不居中的现象 */
1895
+ }
1896
+ .x-star-editor-slide-viewer .x-star-editor-slide > :last-child {
1897
+ margin-bottom: 0; /* 防止垂直居中时出现视觉上不居中的现象 */
1895
1898
  }
1896
1899
  .x-star-editor-slide-viewer .x-star-editor-custom-cursor-pencil {
1897
1900
  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.4",
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",