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 +1 -1
- package/dist/index.js +1 -1
- package/dist/styles/index.css +6 -6
- package/dist/utils/handler.d.ts +2 -1
- package/dist/utils/handler.js +54 -19
- package/dist/utils/history.d.ts +8 -1
- package/dist/utils/history.js +69 -42
- package/package.json +4 -4
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";
|
package/dist/styles/index.css
CHANGED
|
@@ -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:
|
|
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;
|
package/dist/utils/handler.d.ts
CHANGED
|
@@ -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;
|
package/dist/utils/handler.js
CHANGED
|
@@ -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
|
|
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 (
|
|
48
|
-
var 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 (
|
|
56
|
-
var 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 (
|
|
64
|
-
var 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 (
|
|
73
|
-
var 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 (
|
|
82
|
-
var 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 (
|
|
102
|
-
var sourceCode =
|
|
103
|
-
selection =
|
|
104
|
-
dispatch =
|
|
105
|
-
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: '
|
|
145
|
+
type: 'indent',
|
|
111
146
|
payload: {
|
|
112
|
-
|
|
147
|
+
indent: false
|
|
113
148
|
},
|
|
114
149
|
selection: selection
|
|
115
150
|
});
|
package/dist/utils/history.d.ts
CHANGED
|
@@ -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
|
*/
|
package/dist/utils/history.js
CHANGED
|
@@ -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
|
|
57
|
-
lines[
|
|
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
|
-
|
|
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
|
|
136
|
+
var _text2 = _lines.join('\n');
|
|
127
137
|
return {
|
|
128
|
-
sourceCode: "".concat(lineBefore).concat(
|
|
129
|
-
selection: createSelection(lineStartOffset +
|
|
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
|
-
|
|
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(
|
|
141
|
-
selection: createSelection(startOffset + url.length + description.length + 4 + (
|
|
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
|
-
|
|
148
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
75
|
-
"@babel/preset-typescript": "^7.
|
|
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",
|