@seafile/sdoc-editor 2.0.179 → 2.0.181

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.
@@ -25,3 +25,15 @@
25
25
  .sdoc-icon-btn:hover .sdocfont {
26
26
  color: #5a5a5a;
27
27
  }
28
+
29
+ .linked-block-highlight-overlay {
30
+ position: relative;
31
+ }
32
+
33
+ .linked-block-highlight-overlay::after {
34
+ content: '';
35
+ position: absolute;
36
+ inset: 0;
37
+ background: rgba(169, 201, 237, 0.3);
38
+ pointer-events: none;
39
+ }
@@ -63,6 +63,26 @@ var EditableArticle = function EditableArticle(_ref) {
63
63
  eventBus.dispatch(_constants.INTERNAL_EVENT.CANCEL_TABLE_SELECT_RANGE);
64
64
  }
65
65
  }
66
+
67
+ // Remove linked block overlay style when operating
68
+ var _Editor$nodes = _slate.Editor.nodes(editor, {
69
+ at: [],
70
+ match: function match(n) {
71
+ return n.linked_block === true;
72
+ }
73
+ }),
74
+ _Editor$nodes2 = (0, _slicedToArray2["default"])(_Editor$nodes, 1),
75
+ linkedNodeEntry = _Editor$nodes2[0];
76
+ if (linkedNodeEntry) {
77
+ var _linkedNodeEntry = (0, _slicedToArray2["default"])(linkedNodeEntry, 2),
78
+ node = _linkedNodeEntry[0],
79
+ path = _linkedNodeEntry[1];
80
+ var linkedDomNode = _slateReact.ReactEditor.toDOMNode(editor, node);
81
+ linkedDomNode.classList.remove('linked-block-highlight-overlay');
82
+ _slate.Transforms.unsetNodes(editor, ['linked_block'], {
83
+ at: path
84
+ });
85
+ }
66
86
  // eslint-disable-next-line react-hooks/exhaustive-deps
67
87
  }, []);
68
88
  var scrollRef = (0, _useScrollContext.useScrollContext)();
@@ -334,14 +354,14 @@ var EditableArticle = function EditableArticle(_ref) {
334
354
  editor.oldSelection = (0, _objectSpread2["default"])({}, selection);
335
355
 
336
356
  // Do not scroll into view, when focus on image
337
- var _Editor$nodes = _slate.Editor.nodes(editor, {
357
+ var _Editor$nodes3 = _slate.Editor.nodes(editor, {
338
358
  match: function match(n) {
339
359
  return [_constants2.IMAGE, _constants2.IMAGE_BLOCK].includes(n.type);
340
360
  },
341
361
  at: selection
342
362
  }),
343
- _Editor$nodes2 = (0, _slicedToArray2["default"])(_Editor$nodes, 1),
344
- imageNodeEntry = _Editor$nodes2[0];
363
+ _Editor$nodes4 = (0, _slicedToArray2["default"])(_Editor$nodes3, 1),
364
+ imageNodeEntry = _Editor$nodes4[0];
345
365
  if (imageNodeEntry) return;
346
366
  var focusedNode = _slate.Node.get(editor, selection.focus.path);
347
367
  var domNode = _slateReact.ReactEditor.toDOMNode(editor, focusedNode);
@@ -220,7 +220,7 @@ Object.defineProperty(exports, "INLINE_LEVEL_TYPES", {
220
220
  return _elementType.INLINE_LEVEL_TYPES;
221
221
  }
222
222
  });
223
- exports.INSERT_POSITION = exports.INSERT_FILE_DISPLAY_TYPE = void 0;
223
+ exports.INTERNAL_LINKED_TYPE = exports.INSERT_POSITION = exports.INSERT_FILE_DISPLAY_TYPE = void 0;
224
224
  Object.defineProperty(exports, "KEYBOARD", {
225
225
  enumerable: true,
226
226
  get: function get() {
@@ -516,6 +516,7 @@ var LIST_TYPE_ARRAY = exports.LIST_TYPE_ARRAY = [_elementType.UNORDERED_LIST, _e
516
516
  var LIST_ITEM_CORRELATION_TYPE = exports.LIST_ITEM_CORRELATION_TYPE = [_elementType.UNORDERED_LIST, _elementType.ORDERED_LIST, _elementType.LIST_ITEM];
517
517
  var LIST_ITEM_SUPPORTED_TRANSFORMATION = exports.LIST_ITEM_SUPPORTED_TRANSFORMATION = [_elementType.UNORDERED_LIST, _elementType.ORDERED_LIST, 'left', 'center', 'right', _elementType.BLOCKQUOTE];
518
518
  var ADD_POSITION_OFFSET_TYPE = exports.ADD_POSITION_OFFSET_TYPE = [_elementType.PARAGRAPH, _elementType.SUBTITLE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CHECK_LIST_ITEM, _elementType.IMAGE_BLOCK];
519
+ var INTERNAL_LINKED_TYPE = exports.INTERNAL_LINKED_TYPE = [_elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.IMAGE_BLOCK, _elementType.CODE_BLOCK, _elementType.BLOCKQUOTE];
519
520
  var FILE_TYPE = exports.FILE_TYPE = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _elementType.FILE_LINK, 'file'), _elementType.SDOC_LINK, 'sdoc'), _elementType.VIDEO, 'video'), _elementType.WHITEBOARD, 'exdraw');
520
521
  var FILEEXT_TYPE = exports.FILEEXT_TYPE = {
521
522
  VIDEO: ['mp4', 'ogv', 'webm', 'mov'],
@@ -182,7 +182,7 @@ var getImageURL = exports.getImageURL = function getImageURL(data, editor) {
182
182
  var assetsUrl = _context2["default"].getSetting('assetsUrl');
183
183
 
184
184
  // If in sdoc link preview
185
- var docUuid = editor.preview_docUuid;
185
+ var docUuid = editor && editor.preview_docUuid;
186
186
  if (docUuid) {
187
187
  var baseUrl = assetsUrl.split('/');
188
188
  baseUrl[baseUrl.length - 1] = docUuid;
@@ -36,7 +36,8 @@ var Image = function Image(_ref) {
36
36
  attributes = _ref.attributes,
37
37
  children = _ref.children,
38
38
  isSelected = _ref.isSelected,
39
- t = _ref.t;
39
+ t = _ref.t,
40
+ parentImageBlockId = _ref.parentImageBlockId;
40
41
  var data = element.data,
41
42
  _element$border_type = element.border_type,
42
43
  border_type = _element$border_type === void 0 ? _constants3.IMAGE_BORDER_TYPE[0].type : _element$border_type;
@@ -326,6 +327,7 @@ var Image = function Image(_ref) {
326
327
  imageRef: imageRef
327
328
  }), children), !isShowImagePlaceholder && !isCopyImageError && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", Object.assign({
328
329
  "data-id": element.id,
330
+ "data-parent-id": parentImageBlockId,
329
331
  className: (0, _classnames["default"])('sdoc-image-wrapper', className)
330
332
  }, attributes, {
331
333
  contentEditable: canEditable,
@@ -0,0 +1,122 @@
1
+ .select-btn {
2
+ margin-bottom: .575rem;
3
+ display: flex;
4
+ flex-direction: row;
5
+ }
6
+
7
+ .select-btn .link-address-btn,
8
+ .select-btn .link-block-btn {
9
+ font-size: .875rem;
10
+ font-weight: 600;
11
+ padding-bottom: 1px;
12
+ }
13
+
14
+ .select-btn .link-address-btn:hover,
15
+ .select-btn .link-block-btn:hover {
16
+ cursor: pointer;
17
+ }
18
+
19
+ .select-btn .link-address-btn.active,
20
+ .select-btn .link-block-btn.active {
21
+ color: #ff9800;
22
+ border-bottom: 1.5px solid #ff9800;
23
+ }
24
+
25
+ .select-btn .link-address-btn {
26
+ margin-right: 40px;
27
+ }
28
+
29
+ .selected-linked-block-wrapper {
30
+ position: relative;
31
+ }
32
+
33
+ .selected-linked-block-wrapper .form-control {
34
+ display: flex;
35
+ justify-content: space-between;
36
+ cursor: pointer;
37
+ }
38
+
39
+ .selected-linked-block-wrapper .select-block-wrapper.expanded .sdoc-file-icon-toggle,
40
+ .selected-linked-block-wrapper .form-control.expanded .sdoc-file-icon-toggle {
41
+ transform: rotate(90deg);
42
+ }
43
+
44
+ .selected-linked-block-wrapper .sdoc-file-icon-toggle {
45
+ color: #9aa0ac;
46
+ font-size: 12px;
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ }
51
+
52
+ .selected-linked-block-wrapper .selected-linked-block:not(img) {
53
+ width: 95%;
54
+ overflow-y: auto;
55
+ }
56
+
57
+ .selected-linked-block-wrapper .selected-linked-block .linked-block-item {
58
+ margin-bottom: 0 !important;
59
+ }
60
+
61
+ .selected-linked-block-wrapper .linked-block-item:not(img) {
62
+ max-height: 60px;
63
+ overflow-y: auto;
64
+ padding-top: 3px;
65
+ padding-bottom: 3px;
66
+ }
67
+
68
+ .selected-linked-block-wrapper .linked-block-item:has(img) {
69
+ max-height: none !important;
70
+ }
71
+
72
+ .selected-linked-block-wrapper .link-block-wrapper {
73
+ border: 1px solid rgba(0, 40, 100, 0.12);
74
+ max-height: 400px;
75
+ width: 100%;
76
+ height: fit-content;
77
+ padding: 0.75rem;
78
+ margin-top: 3px;
79
+ overflow-y: auto;
80
+ box-sizing: border-box;
81
+ position: absolute;
82
+ background-color: white;
83
+ display: flex;
84
+ flex-direction: column;
85
+ align-items: flex-start;
86
+ }
87
+
88
+ .link-block-wrapper .select-block-wrapper {
89
+ display: flex;
90
+ flex-direction: row;
91
+ align-items: center;
92
+ justify-content: center;
93
+ cursor: pointer;
94
+ }
95
+
96
+ .link-block-wrapper .select-block-wrapper .title {
97
+ margin-left: 5px;
98
+ color: #666;
99
+ font-size: 14px;
100
+ }
101
+
102
+ .link-block-wrapper .link-block-container {
103
+ width: 100%;
104
+ margin: 5px 0;
105
+ }
106
+
107
+ .link-block-wrapper .link-block-container .linked-block-item {
108
+ margin-bottom: 5px !important;
109
+ }
110
+
111
+ .selected-linked-block-wrapper img {
112
+ width: 160px !important;
113
+ height: auto !important;
114
+ }
115
+
116
+ .selected-linked-block-wrapper .link-block-wrapper .linked-block-item:hover {
117
+ background-color: rgb(245, 245, 245);
118
+ }
119
+
120
+ .selected-linked-block-wrapper .link-block-wrapper .dropdown-item {
121
+ padding: 3px 8px;
122
+ }
@@ -6,12 +6,20 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports["default"] = void 0;
9
+ var _regenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/regenerator"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
9
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
10
12
  var _react = _interopRequireWildcard(require("react"));
11
13
  var _reactI18next = require("react-i18next");
12
14
  var _reactstrap = require("reactstrap");
15
+ var _slate = require("@seafile/slate");
16
+ var _classnames = _interopRequireDefault(require("classnames"));
17
+ var _mdToHtml = require("../../../../../slate-convert/md-to-html");
18
+ var _slateToMd = _interopRequireDefault(require("../../../../../slate-convert/slate-to-md"));
19
+ var _constants = require("../../../../constants");
13
20
  var _core = require("../../../../core");
14
21
  var _helpers = require("../../helpers");
22
+ require("./index.css");
15
23
  var AddLinkDialog = function AddLinkDialog(_ref) {
16
24
  var editor = _ref.editor,
17
25
  className = _ref.className,
@@ -36,7 +44,8 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
36
44
  href: ''
37
45
  },
38
46
  oldTitle = _ref2.title,
39
- oldURL = _ref2.href;
47
+ oldURL = _ref2.href,
48
+ linked_id = _ref2.linked_id;
40
49
  var initTitle = (0, _react.useMemo)(function () {
41
50
  return oldTitle ? oldTitle : (0, _core.getEditorString)(editor, editor.selection);
42
51
  }, [editor, oldTitle]);
@@ -44,36 +53,68 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
44
53
  _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
45
54
  title = _useState6[0],
46
55
  setTitle = _useState6[1];
47
- var _useState7 = (0, _react.useState)(oldURL),
56
+ var _useState7 = (0, _react.useState)(linked_id ? '' : oldURL),
48
57
  _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
49
58
  url = _useState8[0],
50
59
  setURL = _useState8[1];
60
+ var _useState9 = (0, _react.useState)(linked_id ? 'block' : 'url'),
61
+ _useState0 = (0, _slicedToArray2["default"])(_useState9, 2),
62
+ activeTab = _useState0[0],
63
+ setActiveTab = _useState0[1];
64
+ var _useState1 = (0, _react.useState)(''),
65
+ _useState10 = (0, _slicedToArray2["default"])(_useState1, 2),
66
+ selectedBlockId = _useState10[0],
67
+ setSelectedBlockId = _useState10[1];
68
+ var _useState11 = (0, _react.useState)(false),
69
+ _useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
70
+ isOpenSelect = _useState12[0],
71
+ setIsOpenSelect = _useState12[1];
72
+ var _useState13 = (0, _react.useState)(false),
73
+ _useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
74
+ isOpenSelectHeader = _useState14[0],
75
+ setIsOpenSelectHeader = _useState14[1];
76
+ var _useState15 = (0, _react.useState)(false),
77
+ _useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
78
+ isOpenSelectImageBlock = _useState16[0],
79
+ setIsOpenSelectImageBlock = _useState16[1];
80
+ var _useState17 = (0, _react.useState)(false),
81
+ _useState18 = (0, _slicedToArray2["default"])(_useState17, 2),
82
+ isOpenSelectCodeBlock = _useState18[0],
83
+ setIsOpenSelectCodeBlock = _useState18[1];
84
+ var _useState19 = (0, _react.useState)(false),
85
+ _useState20 = (0, _slicedToArray2["default"])(_useState19, 2),
86
+ isOpenSelectBlockquote = _useState20[0],
87
+ setIsOpenSelectBlockquote = _useState20[1];
88
+ var _useState21 = (0, _react.useState)(''),
89
+ _useState22 = (0, _slicedToArray2["default"])(_useState21, 2),
90
+ htmlString = _useState22[0],
91
+ setHtmlString = _useState22[1];
51
92
  var submit = (0, _react.useCallback)(function () {
52
93
  setLinkErrorMessage('');
53
94
  setTitleErrorMessage('');
54
- if (!url) {
55
- setLinkErrorMessage(t('The_link_address_is_required'));
95
+ if (!url && !selectedBlockId) {
96
+ setLinkErrorMessage(t('The_link_address_or_link_block_is_required'));
56
97
  return;
57
98
  }
58
99
  if (!title) {
59
100
  setTitleErrorMessage(t('The_link_title_is_required'));
60
101
  return;
61
102
  }
62
- if ((0, _helpers.checkLink)(url)) {
103
+ if (url && (0, _helpers.checkLink)(url)) {
63
104
  setLinkErrorMessage(t('The_link_address_is_invalid'));
64
105
  return;
65
106
  }
66
107
  var isEdit = oldURL || oldTitle;
67
108
  if (isEdit) {
68
- (0, _helpers.updateLink)(editor, title, url);
109
+ (0, _helpers.updateLink)(editor, title, url, selectedBlockId);
69
110
  } else {
70
- (0, _helpers.insertLink)(editor, title, url, insertPosition, slateNode);
111
+ (0, _helpers.insertLink)(editor, title, url, insertPosition, slateNode, selectedBlockId);
71
112
  }
72
113
  handleSubmit && handleSubmit();
73
114
  closeDialog();
74
115
 
75
116
  // eslint-disable-next-line react-hooks/exhaustive-deps
76
- }, [editor, url, title, oldTitle, oldURL, insertPosition]);
117
+ }, [editor, url, title, oldTitle, oldURL, insertPosition, selectedBlockId]);
77
118
  var onKeyDown = (0, _react.useCallback)(function (event) {
78
119
  if (event.keyCode === 13) {
79
120
  event.preventDefault();
@@ -87,6 +128,7 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
87
128
  var value = event.target.value.trim();
88
129
  if (value === url) return;
89
130
  setURL(value);
131
+ setSelectedBlockId('');
90
132
  }, [url]);
91
133
  var handleTitleChange = (0, _react.useCallback)(function (event) {
92
134
  var value = event.target.value;
@@ -102,6 +144,74 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
102
144
  "aria-hidden": "true"
103
145
  }));
104
146
  }, [closeDialog]);
147
+ var handleOnChangeBlock = function handleOnChangeBlock(e) {
148
+ var block = e.target.closest('.linked-block-item');
149
+ if (block) {
150
+ var clone = block.cloneNode(true);
151
+ var displayContainer = document.getElementById('selected-block-display');
152
+ displayContainer.innerHTML = '';
153
+ displayContainer.appendChild(clone);
154
+ var nodeId = block.dataset.id;
155
+ setSelectedBlockId(nodeId);
156
+ setURL('');
157
+ setIsOpenSelect(false);
158
+ }
159
+ };
160
+ (0, _react.useEffect)(function () {
161
+ if (!linked_id) return;
162
+ var timer = setTimeout(function () {
163
+ var displayContainer = document.getElementById('selected-block-display');
164
+ if (!displayContainer) return;
165
+
166
+ // 'data-parent-id' check for linked image block node
167
+ var linkedDomNode = document.querySelector("[data-id=\"".concat(linked_id, "\"]")) || document.querySelector("[data-parent-id=\"".concat(linked_id, "\"]"));
168
+ if (linkedDomNode) {
169
+ var clone = linkedDomNode.cloneNode(true);
170
+ displayContainer.innerHTML = '';
171
+ displayContainer.appendChild(clone);
172
+ }
173
+ }, 0);
174
+ return function () {
175
+ return clearTimeout(timer);
176
+ };
177
+ }, []);
178
+ (0, _react.useEffect)(function () {
179
+ var genHtml = /*#__PURE__*/function () {
180
+ var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee() {
181
+ var list, mdValue, ids, processor, file;
182
+ return (0, _regenerator2["default"])().w(function (_context) {
183
+ while (1) switch (_context.n) {
184
+ case 0:
185
+ list = editor.children.filter(function (node) {
186
+ return _slate.Element.isElement(node) && _constants.INTERNAL_LINKED_TYPE.includes(node.type);
187
+ });
188
+ mdValue = list.map(function (node) {
189
+ return "<!--".concat(node.id, "-->\n").concat((0, _slateToMd["default"])([node]));
190
+ }).join('\n\n');
191
+ ids = list.map(function (n) {
192
+ return n.id;
193
+ });
194
+ processor = (0, _mdToHtml.createProcessor)(ids, 'linked-block-item');
195
+ _context.n = 1;
196
+ return processor.process(mdValue);
197
+ case 1:
198
+ file = _context.v;
199
+ setHtmlString(String(file));
200
+ case 2:
201
+ return _context.a(2);
202
+ }
203
+ }, _callee);
204
+ }));
205
+ return function genHtml() {
206
+ return _ref3.apply(this, arguments);
207
+ };
208
+ }();
209
+ genHtml();
210
+ }, [editor.children]);
211
+ var headersHTML = (0, _helpers.parseHtmlString)(htmlString, 'h1,h2,h3,h4,h5,h6');
212
+ var imagesHTML = (0, _helpers.parseHtmlString)(htmlString, 'img');
213
+ var codeBlockHTML = (0, _helpers.parseHtmlString)(htmlString, 'pre');
214
+ var blockquoteHTML = (0, _helpers.parseHtmlString)(htmlString, 'blockquote');
105
215
  return /*#__PURE__*/_react["default"].createElement(_reactstrap.Modal, {
106
216
  isOpen: true,
107
217
  autoFocus: false,
@@ -113,21 +223,6 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
113
223
  close: close
114
224
  }, t('Insert_link')), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalBody, null, /*#__PURE__*/_react["default"].createElement(_react.Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
115
225
  className: "form-group"
116
- }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Label, {
117
- "for": "addLink"
118
- }, t('Link_address')), /*#__PURE__*/_react["default"].createElement("input", {
119
- onKeyDown: onKeyDown,
120
- autoFocus: true,
121
- type: "url",
122
- className: "form-control",
123
- id: "addLink",
124
- value: url || '',
125
- onChange: handleUrlChange
126
- }), linkErrorMessage && /*#__PURE__*/_react["default"].createElement(_reactstrap.Alert, {
127
- color: "danger",
128
- className: "mt-2"
129
- }, t(linkErrorMessage))), /*#__PURE__*/_react["default"].createElement("div", {
130
- className: "form-group"
131
226
  }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Label, {
132
227
  "for": "addTitle"
133
228
  }, t('Link_title')), /*#__PURE__*/_react["default"].createElement("input", {
@@ -140,7 +235,128 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
140
235
  }), titleErrorMessage && /*#__PURE__*/_react["default"].createElement(_reactstrap.Alert, {
141
236
  color: "danger",
142
237
  className: "mt-2"
143
- }, t(titleErrorMessage))))), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalFooter, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
238
+ }, t(titleErrorMessage))), /*#__PURE__*/_react["default"].createElement("div", {
239
+ className: "select-btn"
240
+ }, /*#__PURE__*/_react["default"].createElement("div", {
241
+ className: (0, _classnames["default"])('link-address-btn', {
242
+ 'active': activeTab === 'url'
243
+ }),
244
+ onClick: function onClick() {
245
+ return setActiveTab('url');
246
+ }
247
+ }, t('Link_address')), /*#__PURE__*/_react["default"].createElement("div", {
248
+ className: (0, _classnames["default"])('link-block-btn', {
249
+ 'active': activeTab === 'block'
250
+ }),
251
+ onClick: function onClick() {
252
+ return setActiveTab('block');
253
+ }
254
+ }, t('Link_block'))), activeTab === 'url' && /*#__PURE__*/_react["default"].createElement("div", {
255
+ className: "form-group"
256
+ }, /*#__PURE__*/_react["default"].createElement("input", {
257
+ onKeyDown: onKeyDown,
258
+ autoFocus: true,
259
+ type: "url",
260
+ className: "form-control",
261
+ id: "addLink",
262
+ value: url || '',
263
+ onChange: handleUrlChange
264
+ }), linkErrorMessage && /*#__PURE__*/_react["default"].createElement(_reactstrap.Alert, {
265
+ color: "danger",
266
+ className: "mt-2"
267
+ }, t(linkErrorMessage))), activeTab === 'block' && /*#__PURE__*/_react["default"].createElement("div", {
268
+ className: "form-group selected-linked-block-wrapper"
269
+ }, /*#__PURE__*/_react["default"].createElement("div", {
270
+ className: (0, _classnames["default"])('form-control', {
271
+ 'expanded': isOpenSelect
272
+ }),
273
+ onClick: function onClick() {
274
+ setIsOpenSelect(!isOpenSelect);
275
+ }
276
+ }, /*#__PURE__*/_react["default"].createElement("span", {
277
+ id: "selected-block-display",
278
+ className: "selected-linked-block"
279
+ }), /*#__PURE__*/_react["default"].createElement("i", {
280
+ className: "sdoc-file-icon sdoc-file-icon-toggle sdocfont sdoc-right-slide"
281
+ })), isOpenSelect && /*#__PURE__*/_react["default"].createElement("div", {
282
+ className: "link-block-wrapper"
283
+ }, headersHTML && /*#__PURE__*/_react["default"].createElement("div", {
284
+ className: (0, _classnames["default"])('select-block-wrapper', {
285
+ 'expanded': isOpenSelectHeader
286
+ }),
287
+ onClick: function onClick(e) {
288
+ return setIsOpenSelectHeader(!isOpenSelectHeader);
289
+ }
290
+ }, /*#__PURE__*/_react["default"].createElement("i", {
291
+ className: "sdoc-file-icon sdoc-file-icon-toggle sdocfont sdoc-right-slide"
292
+ }), /*#__PURE__*/_react["default"].createElement("div", {
293
+ className: "title"
294
+ }, t('Header'))), isOpenSelectHeader && /*#__PURE__*/_react["default"].createElement("div", {
295
+ className: "link-block-container",
296
+ dangerouslySetInnerHTML: {
297
+ __html: headersHTML
298
+ },
299
+ onClick: function onClick(e) {
300
+ return handleOnChangeBlock(e);
301
+ }
302
+ }), imagesHTML && /*#__PURE__*/_react["default"].createElement("div", {
303
+ className: (0, _classnames["default"])('select-block-wrapper', {
304
+ 'expanded': isOpenSelectImageBlock
305
+ }),
306
+ onClick: function onClick(e) {
307
+ return setIsOpenSelectImageBlock(!isOpenSelectImageBlock);
308
+ }
309
+ }, /*#__PURE__*/_react["default"].createElement("i", {
310
+ className: "sdoc-file-icon sdoc-file-icon-toggle sdocfont sdoc-right-slide"
311
+ }), /*#__PURE__*/_react["default"].createElement("div", {
312
+ className: "title"
313
+ }, t('Image'))), isOpenSelectImageBlock && /*#__PURE__*/_react["default"].createElement("div", {
314
+ className: "link-block-container",
315
+ dangerouslySetInnerHTML: {
316
+ __html: imagesHTML
317
+ },
318
+ onClick: function onClick(e) {
319
+ return handleOnChangeBlock(e);
320
+ }
321
+ }), codeBlockHTML && /*#__PURE__*/_react["default"].createElement("div", {
322
+ className: (0, _classnames["default"])('select-block-wrapper', {
323
+ 'expanded': isOpenSelectCodeBlock
324
+ }),
325
+ onClick: function onClick(e) {
326
+ return setIsOpenSelectCodeBlock(!isOpenSelectCodeBlock);
327
+ }
328
+ }, /*#__PURE__*/_react["default"].createElement("i", {
329
+ className: "sdoc-file-icon sdoc-file-icon-toggle sdocfont sdoc-right-slide"
330
+ }), /*#__PURE__*/_react["default"].createElement("div", {
331
+ className: "title"
332
+ }, t('Code_block'))), isOpenSelectCodeBlock && /*#__PURE__*/_react["default"].createElement("div", {
333
+ className: "link-block-container",
334
+ dangerouslySetInnerHTML: {
335
+ __html: codeBlockHTML
336
+ },
337
+ onClick: function onClick(e) {
338
+ return handleOnChangeBlock(e);
339
+ }
340
+ }), blockquoteHTML && /*#__PURE__*/_react["default"].createElement("div", {
341
+ className: (0, _classnames["default"])('select-block-wrapper', {
342
+ 'expanded': isOpenSelectBlockquote
343
+ }),
344
+ onClick: function onClick(e) {
345
+ return setIsOpenSelectBlockquote(!isOpenSelectBlockquote);
346
+ }
347
+ }, /*#__PURE__*/_react["default"].createElement("i", {
348
+ className: "sdoc-file-icon sdoc-file-icon-toggle sdocfont sdoc-right-slide"
349
+ }), /*#__PURE__*/_react["default"].createElement("div", {
350
+ className: "title"
351
+ }, t('Quote'))), isOpenSelectBlockquote && /*#__PURE__*/_react["default"].createElement("div", {
352
+ className: "link-block-container",
353
+ dangerouslySetInnerHTML: {
354
+ __html: blockquoteHTML
355
+ },
356
+ onClick: function onClick(e) {
357
+ return handleOnChangeBlock(e);
358
+ }
359
+ }))))), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalFooter, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
144
360
  color: "secondary",
145
361
  onClick: closeDialog
146
362
  }, t('Cancel')), /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
@@ -4,7 +4,8 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.upsertLinkText = exports.updateLink = exports.unWrapLinkNode = exports.isWeChat = exports.isSdocFile = exports.isMenuDisabled = exports.isLinkToolBarActive = exports.insertLink = exports.getMenuPosition = exports.getLinkType = exports.genLinkNode = exports.checkLink = void 0;
7
+ exports.upsertLinkText = exports.updateLink = exports.unWrapLinkNode = exports.parseHtmlString = exports.isWeChat = exports.isSdocFile = exports.isNodeInCurrentView = exports.isMenuDisabled = exports.isLinkToolBarActive = exports.insertLink = exports.getMenuPosition = exports.getLinkType = exports.genLinkNode = exports.checkLink = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
8
9
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
9
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
10
11
  var _slate = require("@seafile/slate");
@@ -31,12 +32,13 @@ var checkLink = exports.checkLink = function checkLink(url) {
31
32
  }
32
33
  return false;
33
34
  };
34
- var genLinkNode = exports.genLinkNode = function genLinkNode(url, text) {
35
+ var genLinkNode = exports.genLinkNode = function genLinkNode(url, text, nodeId) {
35
36
  var linkNode = {
36
37
  id: _slugid["default"].nice(),
37
38
  type: 'link',
38
39
  href: url,
39
40
  title: text,
41
+ linked_id: nodeId || '',
40
42
  children: [{
41
43
  id: _slugid["default"].nice(),
42
44
  text: text || ''
@@ -61,9 +63,13 @@ var getLinkType = exports.getLinkType = function getLinkType(editor) {
61
63
  var insertLink = exports.insertLink = function insertLink(editor, title, url) {
62
64
  var position = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _constants.INSERT_POSITION.CURRENT;
63
65
  var slateNode = arguments.length > 4 ? arguments[4] : undefined;
66
+ var linkedNodeId = arguments.length > 5 ? arguments[5] : undefined;
64
67
  if (position === _constants.INSERT_POSITION.CURRENT && isMenuDisabled(editor)) return;
65
- if (!title || !url) return;
68
+ if (!title || !url && !linkedNodeId) return;
66
69
  var linkNode = genLinkNode(url, title);
70
+ if (linkedNodeId) {
71
+ linkNode = genLinkNode(url, title, linkedNodeId);
72
+ }
67
73
  if (position === _constants.INSERT_POSITION.AFTER) {
68
74
  var path = _slate.Editor.path(editor, editor.selection);
69
75
  if (slateNode && (slateNode === null || slateNode === void 0 ? void 0 : slateNode.type) === _constants.LIST_ITEM) {
@@ -107,7 +113,7 @@ var insertLink = exports.insertLink = function insertLink(editor, title, url) {
107
113
  edge: 'end'
108
114
  });
109
115
  };
110
- var updateLink = exports.updateLink = function updateLink(editor, newText, newUrl) {
116
+ var updateLink = exports.updateLink = function updateLink(editor, newText, newUrl, linkedNodeId) {
111
117
  // Update children
112
118
  var linkAbove = (0, _core.getAboveNode)(editor, {
113
119
  match: {
@@ -118,10 +124,25 @@ var updateLink = exports.updateLink = function updateLink(editor, newText, newUr
118
124
  var _ref = linkAbove[0] || {},
119
125
  oldUrl = _ref.href,
120
126
  oldText = _ref.title;
121
- if (oldUrl !== newUrl || oldText !== newText) {
127
+ if (linkedNodeId) {
128
+ _slate.Transforms.setNodes(editor, {
129
+ linked_id: linkedNodeId
130
+ }, {
131
+ at: linkAbove[1]
132
+ });
133
+ if (oldText !== newText) {
134
+ _slate.Transforms.setNodes(editor, {
135
+ title: newText
136
+ }, {
137
+ at: linkAbove[1]
138
+ });
139
+ }
140
+ }
141
+ if (!linkedNodeId && (oldUrl !== newUrl || oldText !== newText)) {
122
142
  _slate.Transforms.setNodes(editor, {
123
143
  href: newUrl,
124
- title: newText
144
+ title: newText,
145
+ linked_id: ''
125
146
  }, {
126
147
  at: linkAbove[1]
127
148
  });
@@ -222,4 +243,23 @@ var isLinkToolBarActive = exports.isLinkToolBarActive = function isLinkToolBarAc
222
243
  nodeEntry = _Editor$nodes6[0];
223
244
  if (nodeEntry) return true;
224
245
  return false;
246
+ };
247
+ var isNodeInCurrentView = exports.isNodeInCurrentView = function isNodeInCurrentView(domNode) {
248
+ var rect = domNode.getBoundingClientRect();
249
+ return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth);
250
+ };
251
+ var parseHtmlString = exports.parseHtmlString = function parseHtmlString(htmlString, targetType) {
252
+ var parser = new DOMParser();
253
+ var doc = parser.parseFromString(htmlString, 'text/html');
254
+ var resultHtml;
255
+ if (targetType == 'img') {
256
+ resultHtml = (0, _toConsumableArray2["default"])(doc.querySelectorAll('p:has(img)')).map(function (p) {
257
+ return p.outerHTML;
258
+ }).join('');
259
+ } else {
260
+ resultHtml = (0, _toConsumableArray2["default"])(doc.querySelectorAll(targetType)).map(function (html) {
261
+ return html.outerHTML;
262
+ }).join('');
263
+ }
264
+ return resultHtml;
225
265
  };
@@ -10,6 +10,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
  var _reactDom = require("react-dom");
12
12
  var _reactI18next = require("react-i18next");
13
+ var _slate = require("@seafile/slate");
13
14
  var _slateReact = require("@seafile/slate-react");
14
15
  var _tooltip = _interopRequireDefault(require("../../../../components/tooltip"));
15
16
  var _helpers = require("../helpers");
@@ -23,6 +24,7 @@ var LinkHover = function LinkHover(_ref) {
23
24
  var readOnly = (0, _slateReact.useReadOnly)();
24
25
  var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
25
26
  t = _useTranslation.t;
27
+ var linked_id = element.linked_id;
26
28
  var _useState = (0, _react.useState)(false),
27
29
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
28
30
  isShowTooltip = _useState2[0],
@@ -39,11 +41,43 @@ var LinkHover = function LinkHover(_ref) {
39
41
  location.href = element.href;
40
42
  }
41
43
  }, [element.href]);
44
+ var handleOnClick = (0, _react.useCallback)(function (event) {
45
+ event.stopPropagation();
46
+ if (!linked_id) return;
47
+ var _Editor$nodes = _slate.Editor.nodes(editor, {
48
+ at: [],
49
+ match: function match(n) {
50
+ return n.id === linked_id;
51
+ }
52
+ }),
53
+ _Editor$nodes2 = (0, _slicedToArray2["default"])(_Editor$nodes, 1),
54
+ linkedNodeEntry = _Editor$nodes2[0];
55
+ if (linkedNodeEntry) {
56
+ var _linkedNodeEntry = (0, _slicedToArray2["default"])(linkedNodeEntry, 2),
57
+ node = _linkedNodeEntry[0],
58
+ path = _linkedNodeEntry[1];
59
+ var linkedDomNode = _slateReact.ReactEditor.toDOMNode(editor, node);
60
+ linkedDomNode.classList.add('linked-block-highlight-overlay');
61
+ _slate.Transforms.setNodes(editor, {
62
+ linked_block: true
63
+ }, {
64
+ at: path
65
+ });
66
+
67
+ // Scroll linked node to view if not in current view
68
+ if (!(0, _helpers.isNodeInCurrentView)(linkedDomNode)) {
69
+ linkedDomNode.scrollIntoView();
70
+ }
71
+ }
72
+ }, [linked_id]);
42
73
  return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/(0, _reactDom.createPortal)(/*#__PURE__*/_react["default"].createElement("div", {
43
74
  id: "link-op-menu",
44
75
  className: "link-op-menu",
45
76
  style: menuPosition
46
- }, /*#__PURE__*/_react["default"].createElement("span", {
77
+ }, linked_id ? /*#__PURE__*/_react["default"].createElement("span", {
78
+ className: "link-op-menu-link",
79
+ onClick: handleOnClick
80
+ }, t('Go_to_link')) : /*#__PURE__*/_react["default"].createElement("span", {
47
81
  target: "_blank",
48
82
  rel: "noopener noreferrer",
49
83
  className: "link-op-menu-link",
@@ -39,18 +39,18 @@ var withLink = function withLink(editor) {
39
39
  };
40
40
  newEditor.insertData = /*#__PURE__*/function () {
41
41
  var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee(data) {
42
- var text, res, fileName, fileUuid, link, _link, _link2, _Editor$next, _Editor$next2, focusPath, focusPoint, _t;
42
+ var text, res, fileName, fileUuid, url, linkedNodeId, title, params, link, _link, _link2, _Editor$next, _Editor$next2, focusPath, focusPoint, _t;
43
43
  return (0, _regenerator2["default"])().w(function (_context) {
44
44
  while (1) switch (_context.p = _context.n) {
45
45
  case 0:
46
46
  // Paste link content
47
47
  text = data.getData('text/plain'); // Internal link, insert sdoc file link
48
48
  if (!((0, _isUrl["default"])(text) && !(0, _utils.isImage)(text))) {
49
- _context.n = 7;
49
+ _context.n = 10;
50
50
  break;
51
51
  }
52
52
  if (!(0, _utils.isSameDomain)(text, _context2["default"].getSetting('serviceUrl'))) {
53
- _context.n = 5;
53
+ _context.n = 8;
54
54
  break;
55
55
  }
56
56
  _context.p = 1;
@@ -58,39 +58,59 @@ var withLink = function withLink(editor) {
58
58
  return _context2["default"].getLinkFilesInfo([text]);
59
59
  case 2:
60
60
  res = _context.v;
61
- if ((0, _helpers2.isSdocFile)(res, text)) {
62
- fileName = res.data.files_info[text].name;
63
- fileUuid = res.data.files_info[text].file_uuid;
64
- (0, _helpers.insertSdocFileLink)(editor, fileName, fileUuid);
61
+ if (!(0, _helpers2.isSdocFile)(res, text)) {
62
+ _context.n = 3;
63
+ break;
64
+ }
65
+ fileName = res.data.files_info[text].name;
66
+ fileUuid = res.data.files_info[text].file_uuid;
67
+ (0, _helpers.insertSdocFileLink)(editor, fileName, fileUuid);
68
+ _context.n = 5;
69
+ break;
70
+ case 3:
71
+ url = new URL(text);
72
+ linkedNodeId = url.hash.replace(/^#/, '');
73
+ if (!(editor.selection && !_slate.Range.isCollapsed(editor.selection))) {
74
+ _context.n = 4;
75
+ break;
76
+ }
77
+ title = (0, _core.getEditorString)(editor, editor.selection);
78
+ (0, _helpers2.insertLink)(editor, title, text, _constants2.INSERT_POSITION.CURRENT, null, linkedNodeId);
79
+ return _context.a(2);
80
+ case 4:
81
+ params = new URLSearchParams(url.search);
82
+ if (params.get('from') === 'copy-block') {
83
+ link = (0, _helpers2.genLinkNode)(text, text, linkedNodeId);
65
84
  } else {
66
85
  link = (0, _helpers2.genLinkNode)(text, text);
67
- _slate.Transforms.insertNodes(newEditor, link);
68
86
  }
69
- _context.n = 4;
87
+ _slate.Transforms.insertNodes(newEditor, link);
88
+ case 5:
89
+ _context.n = 7;
70
90
  break;
71
- case 3:
72
- _context.p = 3;
91
+ case 6:
92
+ _context.p = 6;
73
93
  _t = _context.v;
74
94
  _link = (0, _helpers2.genLinkNode)(text, text);
75
95
  _slate.Transforms.insertNodes(newEditor, _link);
76
- case 4:
77
- _context.n = 6;
96
+ case 7:
97
+ _context.n = 9;
78
98
  break;
79
- case 5:
99
+ case 8:
80
100
  _link2 = (0, _helpers2.genLinkNode)(text, text);
81
101
  _slate.Transforms.insertNodes(newEditor, _link2);
82
- case 6:
102
+ case 9:
83
103
  // Void merging text from link
84
104
  _Editor$next = _slate.Editor.next(newEditor), _Editor$next2 = (0, _slicedToArray2["default"])(_Editor$next, 2), focusPath = _Editor$next2[1];
85
105
  focusPoint = _slate.Editor.start(newEditor, focusPath);
86
106
  _slate.Transforms.select(newEditor, focusPoint);
87
107
  return _context.a(2);
88
- case 7:
108
+ case 10:
89
109
  insertData(data);
90
- case 8:
110
+ case 11:
91
111
  return _context.a(2);
92
112
  }
93
- }, _callee, null, [[1, 3]]);
113
+ }, _callee, null, [[1, 6]]);
94
114
  }));
95
115
  return function (_x) {
96
116
  return _ref.apply(this, arguments);
@@ -119,6 +119,10 @@ var CustomRenderElement = function CustomRenderElement(props) {
119
119
  {
120
120
  var _editor$element_comme;
121
121
  var _parentNode = (0, _core.getParentNode)(editor.children, element.id);
122
+ var parentImageBlockId = '';
123
+ if (_parentNode.type === _constants2.IMAGE_BLOCK) {
124
+ parentImageBlockId = _parentNode.id;
125
+ }
122
126
  var comments = ((_editor$element_comme = editor.element_comments_map) === null || _editor$element_comme === void 0 ? void 0 : _editor$element_comme[_parentNode.id]) || [];
123
127
  var unresolvedComments = comments && comments.filter(function (item) {
124
128
  return !item.resolved;
@@ -130,7 +134,8 @@ var CustomRenderElement = function CustomRenderElement(props) {
130
134
  var _ImagePlugin$renderEl = (0, _slicedToArray2["default"])(_plugins.ImagePlugin.renderElements, 1),
131
135
  renderImage = _ImagePlugin$renderEl[0];
132
136
  return renderImage((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, props), {}, {
133
- leaf: leaf
137
+ leaf: leaf,
138
+ parentImageBlockId: parentImageBlockId
134
139
  }), editor);
135
140
  }
136
141
  case _constants2.IMAGE_BLOCK:
@@ -74,10 +74,10 @@ var SideMenu = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
74
74
  (0, _helpers.onDeleteNode)(editor, slateNode);
75
75
  onReset();
76
76
  }, [editor, onReset, slateNode]);
77
- var onCopyHeaderLink = (0, _react.useCallback)(function () {
77
+ var onCopyBlockLink = (0, _react.useCallback)(function () {
78
78
  var serviceUrl = _context["default"].getSetting('serviceUrl');
79
79
  var sdocUuid = _context["default"].getSetting('docUuid');
80
- var href = serviceUrl + "/smart-link/".concat(sdocUuid, "/#").concat(slateNode.id);
80
+ var href = serviceUrl + "/smart-link/".concat(sdocUuid, "/?from=copy-block#").concat(slateNode.id);
81
81
  (0, _copyToClipboard["default"])(href);
82
82
  _toast["default"].success(t('Copied'), {
83
83
  hasCloseButton: false,
@@ -227,12 +227,12 @@ var SideMenu = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
227
227
  slateNode: slateNode
228
228
  })), !insertBelowMenuSearchMap['searching'] && /*#__PURE__*/_react["default"].createElement("div", {
229
229
  className: "sdoc-dropdown-menu-divider"
230
- }), [_constants.HEADER1, _constants.HEADER2, _constants.HEADER3].includes(slateNode === null || slateNode === void 0 ? void 0 : slateNode.type) && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
230
+ }), _constants.INTERNAL_LINKED_TYPE.includes(slateNode === null || slateNode === void 0 ? void 0 : slateNode.type) && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
231
231
  menuConfig: {
232
232
  text: 'Copy_link_of_section',
233
233
  iconClass: 'sdocfont sdoc-link'
234
234
  },
235
- onClick: onCopyHeaderLink,
235
+ onClick: onCopyBlockLink,
236
236
  isHidden: !otherOperatonsMenuSearchMap['COPY_LINK_OF_SECTION']
237
237
  }), !otherOperatonsMenuSearchMap['searching'] && /*#__PURE__*/_react["default"].createElement("div", {
238
238
  className: "sdoc-dropdown-menu-divider"
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.rehypeAddDataId = void 0;
7
+ var _unistUtilVisit = require("unist-util-visit");
8
+ var _helpers = require("../../extension/plugins/image/helpers");
9
+ var rehypeAddDataId = exports.rehypeAddDataId = function rehypeAddDataId() {
10
+ var ids = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
11
+ var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
12
+ return function (tree) {
13
+ var index = 0;
14
+ (0, _unistUtilVisit.visit)(tree, 'element', function (node, _, parent) {
15
+ var _node$properties;
16
+ if (parent.type === 'root' && ids[index]) {
17
+ node.properties['data-id'] = ids[index];
18
+ node.properties.className = className;
19
+ index++;
20
+ }
21
+ if (node.tagName === 'img' && (_node$properties = node.properties) !== null && _node$properties !== void 0 && _node$properties.src) {
22
+ var oldSrc = node.properties.src;
23
+ node.properties.src = (0, _helpers.getImageURL)({
24
+ src: oldSrc
25
+ });
26
+ }
27
+ });
28
+ };
29
+ };
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports["default"] = void 0;
7
+ exports["default"] = exports.createProcessor = void 0;
8
8
  var _rehypeFormat = _interopRequireDefault(require("rehype-format"));
9
9
  var _browser = _interopRequireDefault(require("rehype-mathjax/browser"));
10
10
  var _rehypeRaw = _interopRequireDefault(require("rehype-raw"));
@@ -17,37 +17,48 @@ var _remarkMath = _interopRequireDefault(require("remark-math"));
17
17
  var _remarkParse = _interopRequireDefault(require("remark-parse"));
18
18
  var _remarkRehype = _interopRequireDefault(require("remark-rehype"));
19
19
  var _unified = require("unified");
20
+ var _helper = require("./helper");
20
21
  var _sanitizeSchema = _interopRequireDefault(require("./sanitize-schema"));
21
22
  // mdString -> mdast -> html ast -> html
22
- var processor = (0, _unified.unified)()
23
- // Handles markdown basic syntax
24
- // https://github.com/remarkjs/remark/tree/main
25
- .use(_remarkParse["default"])
26
- // Handle markdown extension syntax
27
- // https://github.com/remarkjs/remark-gfm
28
- .use(_remarkGfm["default"])
29
- // https://github.com/remarkjs/remark-math
30
- .use(_remarkMath["default"])
31
- // https://github.com/remarkjs/remark-breaks
32
- .use(_remarkBreaks["default"]).use(_remarkRehype["default"], {
33
- allowDangerousHtml: true
34
- }) // convert mdast -> hast
35
- // https://www.npmjs.com/package/rehype-mathjax
36
- .use(_browser["default"], {
37
- displayMath: ['$$', '$$']
38
- })
39
- // https://www.npmjs.com/package/rehype-raw
40
- .use(_rehypeRaw["default"])
41
- // https://www.npmjs.com/package/rehype-format
42
- .use(_rehypeFormat["default"], {
43
- blanks: ['pre', 'code']
44
- })
45
- // https://github.com/rehypejs/rehype-slug
46
- .use(_rehypeSlug["default"])
47
- // https://github.com/rehypejs/rehype-sanitize
48
- .use(_rehypeSanitize["default"], _sanitizeSchema["default"])
49
- // https://github.com/rehypejs/rehype/tree/main/packages/rehype-stringify
50
- .use(_rehypeStringify["default"]);
23
+ var createProcessor = exports.createProcessor = function createProcessor() {
24
+ var nodeIds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
25
+ var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
26
+ var p = (0, _unified.unified)()
27
+ // Handles markdown basic syntax
28
+ // https://github.com/remarkjs/remark/tree/main
29
+ .use(_remarkParse["default"])
30
+ // Handle markdown extension syntax
31
+ // https://github.com/remarkjs/remark-gfm
32
+ .use(_remarkGfm["default"])
33
+ // https://github.com/remarkjs/remark-math
34
+ .use(_remarkMath["default"])
35
+ // https://github.com/remarkjs/remark-breaks
36
+ .use(_remarkBreaks["default"]).use(_remarkRehype["default"], {
37
+ allowDangerousHtml: true
38
+ }) // convert mdast -> hast
39
+ // https://www.npmjs.com/package/rehype-mathjax
40
+ .use(_browser["default"], {
41
+ displayMath: ['$$', '$$']
42
+ })
43
+ // https://www.npmjs.com/package/rehype-raw
44
+ .use(_rehypeRaw["default"])
45
+ // https://www.npmjs.com/package/rehype-format
46
+ .use(_rehypeFormat["default"], {
47
+ blanks: ['pre', 'code']
48
+ })
49
+ // https://github.com/rehypejs/rehype-slug
50
+ .use(_rehypeSlug["default"])
51
+ // https://github.com/rehypejs/rehype-sanitize
52
+ .use(_rehypeSanitize["default"], _sanitizeSchema["default"])
53
+ // https://github.com/rehypejs/rehype/tree/main/packages/rehype-stringify
54
+ .use(_rehypeStringify["default"]);
55
+ if (nodeIds) {
56
+ p.use(_helper.rehypeAddDataId, nodeIds, className);
57
+ }
58
+ return p;
59
+ };
51
60
 
52
61
  // transform rules: https://github.com/syntax-tree/mdast-util-to-hast
62
+
63
+ var processor = createProcessor();
53
64
  var _default = exports["default"] = processor;
@@ -156,7 +156,7 @@ var DiffText = /*#__PURE__*/(0, _createClass2["default"])(function DiffText(oldV
156
156
  var newPos = basePath.newPos;
157
157
  var oldPos = newPos - diagonalPath;
158
158
  var commonCount = 0;
159
- while (newPos + 1 < newLen && oldPos + 1 < oldLen && _this.equals(newString[newPos + 1], oldString[oldPos + 1])) {
159
+ while (newPos + 1 < newLen && oldPos + 1 < oldLen && _this.equals(newString[newPos + 1] || '', oldString[oldPos + 1] || '')) {
160
160
  newPos++;
161
161
  oldPos++;
162
162
  commonCount++;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "2.0.179",
3
+ "version": "2.0.181",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -71,5 +71,5 @@
71
71
  "publishConfig": {
72
72
  "access": "public"
73
73
  },
74
- "gitHead": "91e347e5bec343490b0bf168242eea7e6d84a90c"
74
+ "gitHead": "faef2945890ccfadb4d665b3f4b924f8dbe348ce"
75
75
  }