@seafile/sdoc-editor 2.0.115 → 2.0.116
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.
|
@@ -4,7 +4,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.removeMarks = exports.markdownTableRenderer = exports.insertHtmlTransferredNodes = void 0;
|
|
7
|
+
exports.validateNestedStructure = exports.removeMarks = exports.markdownTableRenderer = exports.isRangeOverlapping = exports.insertHtmlTransferredNodes = exports.handleSelectElements = exports.getSelectedChildren = exports.findValidLists = exports.findInsertableLists = void 0;
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
9
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
|
|
10
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
|
|
11
|
+
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createForOfIteratorHelper"));
|
|
8
12
|
var _react = _interopRequireDefault(require("react"));
|
|
9
13
|
var _slate = require("@seafile/slate");
|
|
10
14
|
var _constants = require("../../../constants");
|
|
@@ -38,6 +42,204 @@ var markdownTableRenderer = exports.markdownTableRenderer = function markdownTab
|
|
|
38
42
|
}
|
|
39
43
|
});
|
|
40
44
|
};
|
|
45
|
+
var isRangeOverlapping = exports.isRangeOverlapping = function isRangeOverlapping(rangeA, rangeB) {
|
|
46
|
+
var aStart = _slate.Range.start(rangeA);
|
|
47
|
+
var aEnd = _slate.Range.end(rangeA);
|
|
48
|
+
var bStart = _slate.Range.start(rangeB);
|
|
49
|
+
var bEnd = _slate.Range.end(rangeB);
|
|
50
|
+
|
|
51
|
+
// The starting or ending point of A is within the range of B
|
|
52
|
+
var aStartInB = (_slate.Path.isBefore(bStart.path, aStart.path) || _slate.Path.equals(bStart.path, aStart.path)) && (_slate.Path.isBefore(aStart.path, bEnd.path) || _slate.Path.equals(aStart.path, bEnd.path));
|
|
53
|
+
var aEndInB = (_slate.Path.isBefore(bStart.path, aEnd.path) || _slate.Path.equals(bStart.path, aEnd.path)) && (_slate.Path.isBefore(aEnd.path, bEnd.path) || _slate.Path.equals(aEnd.path, bEnd.path));
|
|
54
|
+
|
|
55
|
+
// B is included by A
|
|
56
|
+
var bWithinA = (_slate.Path.isBefore(aStart.path, bStart.path) || _slate.Path.equals(aStart.path, bStart.path)) && (_slate.Path.isBefore(bEnd.path, aEnd.path) || _slate.Path.equals(bEnd.path, aEnd.path));
|
|
57
|
+
return aStartInB || aEndInB || bWithinA;
|
|
58
|
+
};
|
|
59
|
+
var _validateNestedStructure = exports.validateNestedStructure = function validateNestedStructure(nodes) {
|
|
60
|
+
var validateNode = function validateNode(node) {
|
|
61
|
+
if (!Array.isArray(node.children) || node.children.length !== 1) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
return _validateNestedStructure(node.children);
|
|
65
|
+
};
|
|
66
|
+
var _iterator = (0, _createForOfIteratorHelper2["default"])(nodes),
|
|
67
|
+
_step;
|
|
68
|
+
try {
|
|
69
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
70
|
+
var node = _step.value;
|
|
71
|
+
if (!node.type) continue;
|
|
72
|
+
if ([_constants.UNORDERED_LIST, _constants.ORDERED_LIST, _constants.BLOCKQUOTE, _constants.LIST_ITEM].includes(node.type)) {
|
|
73
|
+
if (!validateNode(node)) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
} catch (err) {
|
|
79
|
+
_iterator.e(err);
|
|
80
|
+
} finally {
|
|
81
|
+
_iterator.f();
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
};
|
|
85
|
+
var _getSelectedChildren = exports.getSelectedChildren = function getSelectedChildren(editor, parentNode, parentPath) {
|
|
86
|
+
var selection = editor.selection;
|
|
87
|
+
var selectedItems = [];
|
|
88
|
+
parentNode.children.forEach(function (childNode, index) {
|
|
89
|
+
var childPath = [].concat((0, _toConsumableArray2["default"])(parentPath), [index]);
|
|
90
|
+
var childRange = {
|
|
91
|
+
anchor: _slate.Editor.start(editor, childPath),
|
|
92
|
+
focus: _slate.Editor.end(editor, childPath)
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Determine whether a child node has been selected
|
|
96
|
+
if (isRangeOverlapping(selection, childRange)) {
|
|
97
|
+
// If it is a list node, recursively process its nested sub lists
|
|
98
|
+
var newChildNode = (0, _objectSpread2["default"])({}, childNode);
|
|
99
|
+
if (childNode.type === _constants.LIST_ITEM || childNode.type === _constants.ORDERED_LIST || childNode.type === _constants.UNORDERED_LIST) {
|
|
100
|
+
var nestedSelectedItems = _getSelectedChildren(editor, childNode, childPath);
|
|
101
|
+
// If there are selected items in the nested list, keep the current list structure
|
|
102
|
+
// Keep only selected nested sub items
|
|
103
|
+
if (nestedSelectedItems.length > 0) {
|
|
104
|
+
selectedItems.push((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, newChildNode), {}, {
|
|
105
|
+
children: nestedSelectedItems
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
} else {
|
|
109
|
+
// non list nodes
|
|
110
|
+
if (childNode.children) {
|
|
111
|
+
var _nestedSelectedItems = _getSelectedChildren(editor, childNode, childPath);
|
|
112
|
+
if (_nestedSelectedItems.length > 0) {
|
|
113
|
+
selectedItems.push((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, newChildNode), {}, {
|
|
114
|
+
children: _nestedSelectedItems
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// Add non children nodes directly
|
|
120
|
+
selectedItems.push(childNode);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return selectedItems;
|
|
125
|
+
};
|
|
126
|
+
var handleSelectElements = exports.handleSelectElements = function handleSelectElements(editor) {
|
|
127
|
+
var selection = editor.selection;
|
|
128
|
+
var selectedElements = [];
|
|
129
|
+
var blockNodes = _slate.Editor.nodes(editor, {
|
|
130
|
+
at: selection,
|
|
131
|
+
match: function match(n) {
|
|
132
|
+
return _slate.Element.isElement(n) && _slate.Editor.isBlock(editor, n);
|
|
133
|
+
},
|
|
134
|
+
mode: 'highest'
|
|
135
|
+
});
|
|
136
|
+
var _iterator2 = (0, _createForOfIteratorHelper2["default"])(blockNodes),
|
|
137
|
+
_step2;
|
|
138
|
+
try {
|
|
139
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
140
|
+
var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
|
|
141
|
+
node = _step2$value[0],
|
|
142
|
+
path = _step2$value[1];
|
|
143
|
+
var selectedItems = _getSelectedChildren(editor, node, path);
|
|
144
|
+
// Keep only selected items
|
|
145
|
+
if (selectedItems.length > 0) {
|
|
146
|
+
selectedElements.push([(0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, node), {}, {
|
|
147
|
+
children: selectedItems
|
|
148
|
+
}), path]);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
} catch (err) {
|
|
152
|
+
_iterator2.e(err);
|
|
153
|
+
} finally {
|
|
154
|
+
_iterator2.f();
|
|
155
|
+
}
|
|
156
|
+
selectedElements[0].forEach(function (childNode, index) {
|
|
157
|
+
if (childNode.type === _constants.UNORDERED_LIST || childNode.type === _constants.ORDERED_LIST) {
|
|
158
|
+
selectedElements[0][index] = findValidLists(childNode)[0];
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
return selectedElements;
|
|
162
|
+
};
|
|
163
|
+
var hasValidListItem = function hasValidListItem(list) {
|
|
164
|
+
if (![_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(list.type)) return false;
|
|
165
|
+
return list.children.some(function (item) {
|
|
166
|
+
if (item.type !== _constants.LIST_ITEM) return false;
|
|
167
|
+
var paragraph = item.children.find(function (child) {
|
|
168
|
+
return child.type === _constants.PARAGRAPH;
|
|
169
|
+
});
|
|
170
|
+
if (!paragraph) return false;
|
|
171
|
+
var textNode = paragraph.children.find(function (child) {
|
|
172
|
+
return 'text' in child;
|
|
173
|
+
});
|
|
174
|
+
return textNode !== undefined;
|
|
175
|
+
});
|
|
176
|
+
};
|
|
177
|
+
var isListCompletelyValid = function isListCompletelyValid(list) {
|
|
178
|
+
if (![_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(list.type)) return false;
|
|
179
|
+
return list.children.every(function (item) {
|
|
180
|
+
if (item.type !== _constants.LIST_ITEM) return false;
|
|
181
|
+
var paragraph = item.children.find(function (child) {
|
|
182
|
+
return child.type === _constants.PARAGRAPH;
|
|
183
|
+
});
|
|
184
|
+
if (!paragraph) return false;
|
|
185
|
+
var textNode = paragraph.children.find(function (child) {
|
|
186
|
+
return 'text' in child;
|
|
187
|
+
});
|
|
188
|
+
return textNode !== undefined;
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
var findValidLists = exports.findValidLists = function findValidLists(node) {
|
|
192
|
+
var result = [];
|
|
193
|
+
var _traverse = function traverse(currentNode) {
|
|
194
|
+
if (!currentNode) return;
|
|
195
|
+
// Check if the current node meets the criteria
|
|
196
|
+
if ([_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(currentNode.type) && hasValidListItem(currentNode)) {
|
|
197
|
+
result.push(currentNode);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
// Recursive traversal of child nodes
|
|
201
|
+
if (currentNode.children && Array.isArray(currentNode.children)) {
|
|
202
|
+
currentNode.children.forEach(_traverse);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
_traverse(node);
|
|
206
|
+
return result;
|
|
207
|
+
};
|
|
208
|
+
var findInsertableLists = exports.findInsertableLists = function findInsertableLists(node) {
|
|
209
|
+
var result = [];
|
|
210
|
+
if ([_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(node.type) && isListCompletelyValid(node)) {
|
|
211
|
+
result.push(node);
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
var isValidListItem = function isValidListItem(item) {
|
|
215
|
+
if (item.type !== _constants.LIST_ITEM) return false;
|
|
216
|
+
var paragraph = item.children.find(function (child) {
|
|
217
|
+
return child.type === _constants.PARAGRAPH;
|
|
218
|
+
});
|
|
219
|
+
if (!paragraph) return false;
|
|
220
|
+
var textNode = paragraph.children.find(function (child) {
|
|
221
|
+
return 'text' in child;
|
|
222
|
+
});
|
|
223
|
+
return !!textNode;
|
|
224
|
+
};
|
|
225
|
+
var _traverse2 = function traverse(currentNode) {
|
|
226
|
+
if (!currentNode) return;
|
|
227
|
+
if ([_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(currentNode.type)) {
|
|
228
|
+
var validChildren = currentNode.children.filter(isValidListItem);
|
|
229
|
+
if (validChildren.length > 0) {
|
|
230
|
+
var newList = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, currentNode), {}, {
|
|
231
|
+
children: validChildren
|
|
232
|
+
});
|
|
233
|
+
result.push(newList);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (currentNode.children && Array.isArray(currentNode.children)) {
|
|
237
|
+
currentNode.children.forEach(_traverse2);
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
_traverse2(node);
|
|
241
|
+
return result;
|
|
242
|
+
};
|
|
41
243
|
var insertHtmlTransferredNodes = exports.insertHtmlTransferredNodes = function insertHtmlTransferredNodes(slateNodeList, nextPath, editor) {
|
|
42
244
|
slateNodeList.forEach(function (childNode) {
|
|
43
245
|
// Insert paragraph nodes
|
|
@@ -62,9 +264,17 @@ var insertHtmlTransferredNodes = exports.insertHtmlTransferredNodes = function i
|
|
|
62
264
|
|
|
63
265
|
// Insert non-paragraph nodes
|
|
64
266
|
if (childNode.type !== _constants.PARAGRAPH) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
267
|
+
// unordered_list or ordered_list
|
|
268
|
+
if (childNode.type === _constants.UNORDERED_LIST || childNode.type === _constants.ORDERED_LIST) {
|
|
269
|
+
var insertSlateElement = findInsertableLists(childNode);
|
|
270
|
+
_slate.Transforms.insertNodes(editor, insertSlateElement, {
|
|
271
|
+
at: nextPath
|
|
272
|
+
});
|
|
273
|
+
} else {
|
|
274
|
+
_slate.Transforms.insertNodes(editor, childNode, {
|
|
275
|
+
at: nextPath
|
|
276
|
+
});
|
|
277
|
+
}
|
|
68
278
|
nextPath = _slate.Path.next(nextPath);
|
|
69
279
|
}
|
|
70
280
|
});
|
|
@@ -19,6 +19,7 @@ var _toast = _interopRequireDefault(require("../../../../components/toast"));
|
|
|
19
19
|
var _context2 = _interopRequireDefault(require("../../../../context"));
|
|
20
20
|
var _mdToHtml = _interopRequireDefault(require("../../../../slate-convert/md-to-html"));
|
|
21
21
|
var _mdToSlate = _interopRequireDefault(require("../../../../slate-convert/md-to-slate"));
|
|
22
|
+
var _slateToMd = _interopRequireDefault(require("../../../../slate-convert/slate-to-md"));
|
|
22
23
|
var _commons = require("../../../commons");
|
|
23
24
|
var _dropdownMenuItem = _interopRequireDefault(require("../../../commons/dropdown-menu-item"));
|
|
24
25
|
var _constants = require("../../../constants");
|
|
@@ -83,8 +84,17 @@ function AIModule(_ref) {
|
|
|
83
84
|
scrollTop = _scrollRef$current.scrollTop,
|
|
84
85
|
scrollHeight = _scrollRef$current.scrollHeight;
|
|
85
86
|
if (!element) {
|
|
86
|
-
var
|
|
87
|
-
|
|
87
|
+
var selectElements = (0, _helpers.handleSelectElements)(editor);
|
|
88
|
+
var _content = '';
|
|
89
|
+
if (selectElements) {
|
|
90
|
+
if ((0, _helpers.validateNestedStructure)(selectElements[0])) {
|
|
91
|
+
// list.length === 1
|
|
92
|
+
_content = window.getSelection().toString();
|
|
93
|
+
} else {
|
|
94
|
+
selectElements.forEach(function (item) {
|
|
95
|
+
_content += (0, _slateToMd["default"])(item);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
88
98
|
setSelectedValue(_content);
|
|
89
99
|
}
|
|
90
100
|
var domSelection = window.getSelection();
|
package/dist/index.js
CHANGED
|
@@ -112,6 +112,12 @@ Object.defineProperty(exports, "SDocWikiViewer", {
|
|
|
112
112
|
return _views.SDocWikiViewer;
|
|
113
113
|
}
|
|
114
114
|
});
|
|
115
|
+
Object.defineProperty(exports, "SocketManager", {
|
|
116
|
+
enumerable: true,
|
|
117
|
+
get: function get() {
|
|
118
|
+
return _socket.SocketManager;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
115
121
|
Object.defineProperty(exports, "Tooltip", {
|
|
116
122
|
enumerable: true,
|
|
117
123
|
get: function get() {
|
|
@@ -81,6 +81,18 @@ var SocketClient = /*#__PURE__*/(0, _createClass2["default"])(function SocketCli
|
|
|
81
81
|
callback && callback(result);
|
|
82
82
|
});
|
|
83
83
|
});
|
|
84
|
+
(0, _defineProperty2["default"])(this, "sendUserUpdated", function (name) {
|
|
85
|
+
(0, _debug.clientDebug)('send user change event: %s', name);
|
|
86
|
+
var _this$config2 = _this.config,
|
|
87
|
+
user = _this$config2.user,
|
|
88
|
+
docUuid = _this$config2.docUuid;
|
|
89
|
+
_this.socket.emit('user-updated', {
|
|
90
|
+
user: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, user), {}, {
|
|
91
|
+
name: name
|
|
92
|
+
}),
|
|
93
|
+
doc_uuid: docUuid
|
|
94
|
+
});
|
|
95
|
+
});
|
|
84
96
|
(0, _defineProperty2["default"])(this, "onJoinRoom", function (userInfo) {
|
|
85
97
|
(0, _debug.serverDebug)('%s joined room success.', userInfo.username);
|
|
86
98
|
var socketManager = _socketManager["default"].getInstance();
|
|
@@ -91,6 +103,11 @@ var SocketClient = /*#__PURE__*/(0, _createClass2["default"])(function SocketCli
|
|
|
91
103
|
var socketManager = _socketManager["default"].getInstance();
|
|
92
104
|
socketManager.dispatchConnectState('leave-room', username);
|
|
93
105
|
});
|
|
106
|
+
(0, _defineProperty2["default"])(this, "onUserUpdated", function (userInfo) {
|
|
107
|
+
(0, _debug.serverDebug)('%s name updated: %s', userInfo.username, userInfo.name);
|
|
108
|
+
var socketManager = _socketManager["default"].getInstance();
|
|
109
|
+
socketManager.dispatchConnectState('user-updated', userInfo);
|
|
110
|
+
});
|
|
94
111
|
/**
|
|
95
112
|
* receive remote broadcast operations
|
|
96
113
|
* @param {*} params {operations, version}
|
|
@@ -179,6 +196,7 @@ var SocketClient = /*#__PURE__*/(0, _createClass2["default"])(function SocketCli
|
|
|
179
196
|
this.socket.on('connect_error', this.onConnectError);
|
|
180
197
|
this.socket.on('join-room', this.onJoinRoom);
|
|
181
198
|
this.socket.on('leave-room', this.onLeaveRoom);
|
|
199
|
+
this.socket.on('user-updated', this.onUserUpdated);
|
|
182
200
|
this.socket.on('update-document', this.onReceiveRemoteOperations);
|
|
183
201
|
|
|
184
202
|
// doc replaced
|
|
@@ -58,6 +58,9 @@ var SocketManager = /*#__PURE__*/(0, _createClass2["default"])(function SocketMa
|
|
|
58
58
|
(0, _defineProperty2["default"])(this, "receiveNewNotification", function (notification) {
|
|
59
59
|
_this.eventBus.dispatch(_constants.INTERNAL_EVENT.NEW_NOTIFICATION, notification);
|
|
60
60
|
});
|
|
61
|
+
(0, _defineProperty2["default"])(this, "sendUserUpdated", function (name) {
|
|
62
|
+
_this.socketClient.sendUserUpdated(name);
|
|
63
|
+
});
|
|
61
64
|
(0, _defineProperty2["default"])(this, "onReceiveLocalOperations", function (operations) {
|
|
62
65
|
if (_this.editor.readonly) return;
|
|
63
66
|
_this.pendingOperationList.push(operations);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.116",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "jest",
|
|
@@ -70,5 +70,5 @@
|
|
|
70
70
|
"publishConfig": {
|
|
71
71
|
"access": "public"
|
|
72
72
|
},
|
|
73
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "d5d10d54c29fa8ba70624108d8f26462597f6485"
|
|
74
74
|
}
|