@seafile/sdoc-editor 3.0.251 → 3.0.253

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.
@@ -192,8 +192,11 @@
192
192
  left: 0;
193
193
  }
194
194
 
195
- .sdoc-comment-drawer .sdoc-comment-list-container .comment-collapse-wrapper {
195
+ .sdoc-comment-drawer .sdoc-comment-list-container .comment-ui-container.comment-collapse-wrapper {
196
196
  cursor: pointer;
197
+ margin: 8px;
198
+ padding: 8px;
199
+ border-radius: 4px;
197
200
  }
198
201
 
199
202
  .sdoc-comment-drawer .sdoc-comment-list-container .comment-ui-container {
@@ -205,7 +208,7 @@
205
208
  }
206
209
 
207
210
  .sdoc-comment-drawer .sdoc-comment-list-container .comment-ui-container:hover {
208
- background-color: #f5f5f5;
211
+ background-color: rgba(0, 0, 0, 0.04);
209
212
  }
210
213
 
211
214
  .sdoc-comment-drawer .sdoc-comment-list-container .comment-ui-container.active .comment-item:hover {
@@ -222,12 +225,20 @@
222
225
  border-radius: 50%;
223
226
  }
224
227
 
228
+ .sdoc-comment-drawer .sdoc-comment-list-container .comment-header .comment-author__info .time .comment-success-resolved {
229
+ font-size: 12px;
230
+ }
231
+
225
232
  .sdoc-comment-drawer .sdoc-comment-list-container .comment-item .comment-content {
226
233
  margin-left: 35px;
227
234
  display: flex;
228
235
  align-items: center;
229
236
  }
230
237
 
238
+ .sdoc-comment-drawer .sdoc-comment-list-container .comment-content blockquote {
239
+ padding-left: 16px;
240
+ }
241
+
231
242
  .sdoc-comment-drawer .sdoc-comment-list-container .comment-item .comment-footer .comments-count {
232
243
  display: flex;
233
244
  align-items: center;
@@ -240,7 +251,7 @@
240
251
  }
241
252
 
242
253
  .sdoc-comment-drawer .sdoc-comment-list-container .comment-item .comment-footer .comment-author {
243
- margin-left: 20px;
254
+ margin-left: 24px;
244
255
  align-items: unset;
245
256
  }
246
257
 
@@ -260,7 +271,7 @@
260
271
  }
261
272
 
262
273
  .sdoc-comment-drawer .sdoc-comment-list-container .comment-item .comment-footer .comment-author__latest-reply {
263
- margin-left: 8px;
274
+ margin-left: 4px;
264
275
  }
265
276
 
266
277
  .sdoc-comment-drawer .sdoc-comment-list-container .comment-item .comment-footer .comment-author__latest-reply p {
@@ -283,6 +294,10 @@
283
294
  overflow: hidden;
284
295
  }
285
296
 
297
+ .sdoc-comment-drawer .sdoc-comment-list-container .comment-item-selected-text-container .comment-item-selected-text {
298
+ color: #666;
299
+ }
300
+
286
301
  .sdoc-comment-drawer .sdoc-comment-list-container .detail-context-comment {
287
302
  align-items: start !important;
288
303
  }
@@ -9,6 +9,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm
9
9
  var _slate = require("@seafile/slate");
10
10
  var _slateReact = require("@seafile/slate-react");
11
11
  var _slugid = _interopRequireDefault(require("slugid"));
12
+ var _urlUtils = require("../../../utils/url-utils");
12
13
  var _constants = require("../../constants");
13
14
  var _elementType = require("../../constants/element-type");
14
15
  var _core = require("../../core");
@@ -46,7 +47,8 @@ var isInsertEmbedLinkDisabled = exports.isInsertEmbedLinkDisabled = function isI
46
47
  return false;
47
48
  };
48
49
  var getEmbedLinkType = exports.getEmbedLinkType = function getEmbedLinkType(text) {
49
- var link = text.trim();
50
+ var link = (0, _urlUtils.normalizeWebUrl)(text);
51
+ if (!link) return null;
50
52
  try {
51
53
  var url = new URL(link);
52
54
  var host = url.hostname.toLowerCase();
@@ -66,7 +68,8 @@ var getEmbedLinkType = exports.getEmbedLinkType = function getEmbedLinkType(text
66
68
  }
67
69
  };
68
70
  var normalizeFigmaEmbedLink = exports.normalizeFigmaEmbedLink = function normalizeFigmaEmbedLink(text) {
69
- var link = text.trim();
71
+ var link = (0, _urlUtils.normalizeWebUrl)(text);
72
+ if (!link) return null;
70
73
  try {
71
74
  var url = new URL(link);
72
75
  var host = url.hostname.toLowerCase();
@@ -88,7 +91,7 @@ var generateEmbedLinkNode = exports.generateEmbedLinkNode = function generateEmb
88
91
  var embedLinkNode = {
89
92
  id: _slugid["default"].nice(),
90
93
  type: _elementType.EMBED_LINK,
91
- link: link,
94
+ link: (0, _urlUtils.normalizeWebUrl)(link),
92
95
  link_type: type,
93
96
  children: [{
94
97
  id: _slugid["default"].nice(),
@@ -100,7 +103,7 @@ var generateEmbedLinkNode = exports.generateEmbedLinkNode = function generateEmb
100
103
  var insertEmbedLink = exports.insertEmbedLink = function insertEmbedLink(editor, link, type) {
101
104
  var _editor$selection;
102
105
  if (isInsertEmbedLinkDisabled(editor)) return;
103
- if (editor.selection == null) return;
106
+ if (editor.selection == null || !(0, _urlUtils.normalizeWebUrl)(link)) return;
104
107
  var embedLinkNode = generateEmbedLinkNode(link, type);
105
108
  var path = (_editor$selection = editor.selection) === null || _editor$selection === void 0 ? void 0 : _editor$selection.anchor.path;
106
109
 
@@ -15,8 +15,8 @@ var _reactI18next = require("react-i18next");
15
15
  var _slate = require("@seafile/slate");
16
16
  var _slateReact = require("@seafile/slate-react");
17
17
  var _classnames = _interopRequireDefault(require("classnames"));
18
- var _isUrl = _interopRequireDefault(require("is-url"));
19
18
  var _useScrollContext = require("../../../hooks/use-scroll-context");
19
+ var _urlUtils = require("../../../utils/url-utils");
20
20
  var _core = require("../../core");
21
21
  var _utils = require("../../utils");
22
22
  var _constants = require("./constants");
@@ -59,13 +59,10 @@ var EmbedLink = function EmbedLink(_ref) {
59
59
  setIsResizing = _useState8[1];
60
60
  var originalLink = element.link,
61
61
  link_type = element.link_type;
62
- var link = originalLink;
63
- if (link_type === _constants.EMBED_LINK_SOURCE.FIGMA) {
64
- link = (0, _helper.normalizeFigmaEmbedLink)(originalLink);
65
- }
66
- var isValidUrl = (0, _react.useMemo)(function () {
67
- return (0, _isUrl["default"])(link);
68
- }, [link]);
62
+ var link = (0, _react.useMemo)(function () {
63
+ return (0, _urlUtils.normalizeWebUrl)(link_type === _constants.EMBED_LINK_SOURCE.FIGMA ? (0, _helper.normalizeFigmaEmbedLink)(originalLink) : originalLink);
64
+ }, [originalLink, link_type]);
65
+ var isValidUrl = Boolean(link);
69
66
  var registerEvent = (0, _react.useCallback)(function (eventList) {
70
67
  eventList.forEach(function (element) {
71
68
  document.addEventListener(element.eventName, element.event);
@@ -147,7 +144,7 @@ var EmbedLink = function EmbedLink(_ref) {
147
144
  var handleDoubleClick = function handleDoubleClick(event) {
148
145
  event.preventDefault();
149
146
  if (!isValidUrl) return;
150
- window.open(link, '_blank');
147
+ window.open(link, '_blank', 'noopener,noreferrer');
151
148
  return;
152
149
  };
153
150
  var handleScroll = (0, _react.useCallback)(function (e) {
@@ -248,7 +245,7 @@ var EmbedLink = function EmbedLink(_ref) {
248
245
  onOpen: handleDoubleClick,
249
246
  openFullscreen: openFullscreen,
250
247
  onDeleteEmbedLink: onDeleteEmbedLink
251
- }), isShowZoomOut && (/*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement("div", {
248
+ }), isShowZoomOut && isValidUrl && (/*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement("div", {
252
249
  className: "embed-link-zoom-out-container",
253
250
  onClick: function onClick() {
254
251
  return setIsShowZoomOut(false);
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports["default"] = void 0;
8
8
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
9
9
  var _slugid = _interopRequireDefault(require("slugid"));
10
+ var _urlUtils = require("../../../../utils/url-utils");
10
11
  var _constants = require("../../../constants");
11
12
  var _linkHelpers = require("../../image/link-helpers");
12
13
  var linkRule = function linkRule(element, parseChild) {
@@ -22,14 +23,14 @@ var linkRule = function linkRule(element, parseChild) {
22
23
  id: _slugid["default"].nice(),
23
24
  text: ''
24
25
  };
25
- var href = (0, _linkHelpers.normalizeWebUrl)(element.getAttribute('href'));
26
+ var _href = (0, _urlUtils.normalizeWebUrl)(element.getAttribute('href'));
26
27
  return {
27
28
  id: _slugid["default"].nice(),
28
29
  type: _constants.IMAGE,
29
30
  data: (0, _objectSpread2["default"])({
30
31
  src: src
31
- }, href && {
32
- href: href
32
+ }, _href && {
33
+ href: _href
33
34
  }),
34
35
  children: [{
35
36
  text: '',
@@ -38,12 +39,12 @@ var linkRule = function linkRule(element, parseChild) {
38
39
  };
39
40
  }
40
41
  if (element.querySelector('img')) {
41
- var _href = (0, _linkHelpers.normalizeWebUrl)(element.getAttribute('href'));
42
+ var _href2 = (0, _urlUtils.normalizeWebUrl)(element.getAttribute('href'));
42
43
  return parseChild(element.childNodes).map(function (child) {
43
- if (!_href) return child;
44
+ if (!_href2) return child;
44
45
  if (child.type === _constants.IMAGE) return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, child), {}, {
45
46
  data: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, child.data), {}, {
46
- href: _href
47
+ href: _href2
47
48
  })
48
49
  });
49
50
  if (typeof child.text === 'string') {
@@ -51,7 +52,7 @@ var linkRule = function linkRule(element, parseChild) {
51
52
  return {
52
53
  id: _slugid["default"].nice(),
53
54
  type: _constants.LINK,
54
- href: _href,
55
+ href: _href2,
55
56
  title: element.getAttribute('title'),
56
57
  children: [child]
57
58
  };
@@ -63,10 +64,15 @@ var linkRule = function linkRule(element, parseChild) {
63
64
  id: _slugid["default"].nice(),
64
65
  text: ''
65
66
  };
67
+ var href = (0, _urlUtils.normalizeWebUrl)(element.getAttribute('href'));
68
+ if (!href) return {
69
+ id: _slugid["default"].nice(),
70
+ text: content
71
+ };
66
72
  return {
67
73
  id: _slugid["default"].nice(),
68
74
  type: _constants.LINK,
69
- href: element.getAttribute('href'),
75
+ href: href,
70
76
  title: element.getAttribute('title'),
71
77
  children: [{
72
78
  id: _slugid["default"].nice(),
@@ -4,28 +4,25 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.normalizeWebUrl = exports.isValidWebUrl = exports.isInternalWebUrl = exports.isCurrentServerUrl = exports.getOnlyImageChild = exports.getImageWikiPageUrl = void 0;
7
+ exports.isInternalWebUrl = exports.isCurrentServerUrl = exports.getOnlyImageChild = exports.getImageWikiPageUrl = void 0;
8
+ Object.defineProperty(exports, "isValidWebUrl", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _urlUtils.isValidWebUrl;
12
+ }
13
+ });
14
+ Object.defineProperty(exports, "normalizeWebUrl", {
15
+ enumerable: true,
16
+ get: function get() {
17
+ return _urlUtils.normalizeWebUrl;
18
+ }
19
+ });
8
20
  var _context = _interopRequireDefault(require("../../../context"));
21
+ var _urlUtils = require("../../../utils/url-utils");
9
22
  var _helpers = require("../wiki-link/helpers");
10
- var normalizeWebUrl = exports.normalizeWebUrl = function normalizeWebUrl() {
11
- var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
12
- if (typeof value !== 'string') return '';
13
- var url = value.trim();
14
- if (!/^https?:\/\//i.test(url)) return '';
15
- try {
16
- var parsedUrl = new URL(url);
17
- return ['http:', 'https:'].includes(parsedUrl.protocol) && parsedUrl.hostname ? url : '';
18
- } catch (error) {
19
- return '';
20
- }
21
- };
22
- var isValidWebUrl = exports.isValidWebUrl = function isValidWebUrl() {
23
- var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
24
- return Boolean(normalizeWebUrl(value));
25
- };
26
23
  var isInternalWebUrl = exports.isInternalWebUrl = function isInternalWebUrl() {
27
24
  var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
28
- var url = normalizeWebUrl(value);
25
+ var url = (0, _urlUtils.normalizeWebUrl)(value);
29
26
  var serviceUrl = _context["default"].getSetting('serviceUrl');
30
27
  if (!url || !serviceUrl) return false;
31
28
  try {
@@ -12,6 +12,7 @@ var _slate = require("@seafile/slate");
12
12
  var _slateReact = require("@seafile/slate-react");
13
13
  var _slugid = _interopRequireDefault(require("slugid"));
14
14
  var _constants = require("../../../constants");
15
+ var _urlUtils = require("../../../utils/url-utils");
15
16
  var _constants2 = require("../../constants");
16
17
  var _core = require("../../core");
17
18
  var isMenuDisabled = exports.isMenuDisabled = function isMenuDisabled(editor, readonly) {
@@ -28,16 +29,13 @@ var isMenuDisabled = exports.isMenuDisabled = function isMenuDisabled(editor, re
28
29
  return false; // enable
29
30
  };
30
31
  var checkLink = exports.checkLink = function checkLink(url) {
31
- if (url.indexOf('http') !== 0) {
32
- return true;
33
- }
34
- return false;
32
+ return !(0, _urlUtils.isValidWebUrl)(url);
35
33
  };
36
34
  var genLinkNode = exports.genLinkNode = function genLinkNode(url, text, nodeId, pageId) {
37
35
  var linkNode = {
38
36
  id: _slugid["default"].nice(),
39
37
  type: 'link',
40
- href: url || '',
38
+ href: (0, _urlUtils.normalizeWebUrl)(url),
41
39
  title: text,
42
40
  linked_id: nodeId || '',
43
41
  linked_wiki_page_id: pageId || '',
@@ -78,7 +76,7 @@ var insertLink = exports.insertLink = function insertLink(editor, title, url) {
78
76
  return;
79
77
  }
80
78
  if (position === _constants2.INSERT_POSITION.CURRENT && isMenuDisabled(editor)) return;
81
- if (!title || !url && !linkedNodeId && !selectedPageId) return;
79
+ if (!title || !(0, _urlUtils.normalizeWebUrl)(url) && !linkedNodeId && !selectedPageId) return;
82
80
  var linkNode = genLinkNode(url, title);
83
81
  if (linkedNodeId) {
84
82
  linkNode = genLinkNode(url, title, linkedNodeId);
@@ -129,6 +127,9 @@ var insertLink = exports.insertLink = function insertLink(editor, title, url) {
129
127
  });
130
128
  };
131
129
  var updateLink = exports.updateLink = function updateLink(editor, newText, newUrl, linkedNodeId, linkedPageId) {
130
+ var href = (0, _urlUtils.normalizeWebUrl)(newUrl);
131
+ if (!href && !linkedNodeId && !linkedPageId) return false;
132
+
132
133
  // Update children
133
134
  var linkAbove = (0, _core.getAboveNode)(editor, {
134
135
  match: {
@@ -177,10 +178,10 @@ var updateLink = exports.updateLink = function updateLink(editor, newText, newUr
177
178
  });
178
179
  }
179
180
  }
180
- if (!linkedNodeId && !linkedPageId && (oldUrl !== newUrl || oldText !== newText)) {
181
+ if (!linkedNodeId && !linkedPageId && (oldUrl !== href || oldText !== newText)) {
181
182
  if (editor.editorType === _constants.WIKI_EDITOR) {
182
183
  _slate.Transforms.setNodes(editor, {
183
- href: newUrl,
184
+ href: href,
184
185
  title: newText,
185
186
  linked_id: '',
186
187
  linked_wiki_page_id: ''
@@ -189,7 +190,7 @@ var updateLink = exports.updateLink = function updateLink(editor, newText, newUr
189
190
  });
190
191
  } else {
191
192
  _slate.Transforms.setNodes(editor, {
192
- href: newUrl,
193
+ href: href,
193
194
  title: newText,
194
195
  linked_id: ''
195
196
  }, {
@@ -12,10 +12,10 @@ var _reactDom = require("react-dom");
12
12
  var _reactI18next = require("react-i18next");
13
13
  var _slate = require("@seafile/slate");
14
14
  var _slateReact = require("@seafile/slate-react");
15
- var _isUrl = _interopRequireDefault(require("is-url"));
16
15
  var _toast = _interopRequireDefault(require("../../../../components/toast"));
17
16
  var _tooltip = _interopRequireDefault(require("../../../../components/tooltip"));
18
17
  var _eventBus = _interopRequireDefault(require("../../../../utils/event-bus"));
18
+ var _urlUtils = require("../../../../utils/url-utils");
19
19
  var _helpers = require("../helpers");
20
20
  require("./index.css");
21
21
  var LinkHover = function LinkHover(_ref) {
@@ -37,15 +37,15 @@ var LinkHover = function LinkHover(_ref) {
37
37
  setIsShowTooltip(true);
38
38
  }, []);
39
39
  var onMouseDown = (0, _react.useCallback)(function (event) {
40
- var href = (0, _helpers.getElementHref)(element);
41
- if (!(0, _isUrl["default"])(href)) {
40
+ var href = (0, _urlUtils.normalizeWebUrl)((0, _helpers.getElementHref)(element));
41
+ if (!href) {
42
42
  event.preventDefault();
43
43
  _toast["default"].danger(t('The_link_is_invalid'));
44
44
  return;
45
45
  }
46
46
  event.stopPropagation();
47
47
  if (!(0, _helpers.isWeChat)()) {
48
- window.open(href);
48
+ window.open(href, '_blank', 'noopener,noreferrer');
49
49
  } else {
50
50
  // eslint-disable-next-line no-restricted-globals
51
51
  location.href = href;
@@ -12,10 +12,10 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm
12
12
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
13
13
  var _slate = require("@seafile/slate");
14
14
  var _isHotkey = _interopRequireDefault(require("is-hotkey"));
15
- var _isUrl = _interopRequireDefault(require("is-url"));
16
15
  var _constants = require("../../../constants");
17
16
  var _context2 = _interopRequireDefault(require("../../../context"));
18
17
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
18
+ var _urlUtils = require("../../../utils/url-utils");
19
19
  var _constants2 = require("../../constants");
20
20
  var _core = require("../../core");
21
21
  var _utils = require("../../utils");
@@ -44,12 +44,13 @@ var withLink = function withLink(editor) {
44
44
  };
45
45
  newEditor.insertData = /*#__PURE__*/function () {
46
46
  var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee(data) {
47
- var text, selectedElems, isCodeContext, res, fileInfo, fileName, fileUuid, _fileName, fileParentPath, filePath, repoId, _fileName2, _fileUuid, url, pathname, _context$getSetting, parts, wikiPageId, title, wikiPageList, page, linkedNodeId, _title, params, link, _link, embedLinkType, _link2, _Editor$next, _Editor$next2, focusPath, focusPoint, _t;
47
+ var pastedText, text, selectedElems, isCodeContext, res, fileInfo, fileName, fileUuid, _fileName, fileParentPath, filePath, repoId, _fileName2, _fileUuid, url, pathname, _context$getSetting, parts, wikiPageId, title, wikiPageList, page, linkedNodeId, _title, params, link, _link, embedLinkType, _link2, _Editor$next, _Editor$next2, focusPath, focusPoint, _t;
48
48
  return (0, _regenerator2["default"])().w(function (_context) {
49
49
  while (1) switch (_context.p = _context.n) {
50
50
  case 0:
51
51
  // Paste link content
52
- text = data.getData('text/plain');
52
+ pastedText = data.getData('text/plain');
53
+ text = (0, _urlUtils.normalizeWebUrl)(pastedText);
53
54
  selectedElems = (0, _core.getSelectedElems)(newEditor);
54
55
  isCodeContext = selectedElems.some(function (elem) {
55
56
  return [_constants2.CODE_BLOCK, _constants2.CODE_LINE].includes(elem === null || elem === void 0 ? void 0 : elem.type);
@@ -60,7 +61,7 @@ var withLink = function withLink(editor) {
60
61
  }
61
62
  return _context.a(2, insertData(data));
62
63
  case 1:
63
- if (!((0, _isUrl["default"])(text) && !(0, _utils.isImage)(text))) {
64
+ if (!(text && !(0, _utils.isImage)(text))) {
64
65
  _context.n = 16;
65
66
  break;
66
67
  }
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
4
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
@@ -16,13 +15,12 @@ var _react = _interopRequireDefault(require("react"));
16
15
  var _reactI18next = require("react-i18next");
17
16
  var _slate = require("@seafile/slate");
18
17
  var _classnames = _interopRequireDefault(require("classnames"));
19
- var _isUrl = _interopRequireDefault(require("is-url"));
20
- var _propTypes = _interopRequireWildcard(require("prop-types"));
21
18
  var _toast = _interopRequireDefault(require("../../../components/toast"));
22
19
  var _constants = require("../../../constants");
23
20
  var _useScrollContext = require("../../../hooks/use-scroll-context");
24
21
  var _commonUtils = require("../../../utils/common-utils");
25
22
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
23
+ var _urlUtils = require("../../../utils/url-utils");
26
24
  var _InlineBugFixWrapper = _interopRequireDefault(require("../../commons/Inline-bug-fix-wrapper"));
27
25
  var _constants2 = require("../../constants");
28
26
  var _helpers = require("./helpers");
@@ -86,22 +84,21 @@ var Link = /*#__PURE__*/function (_React$Component) {
86
84
  });
87
85
  (0, _defineProperty2["default"])(_this, "onLinkClick", function (e) {
88
86
  var isModClick = (0, _commonUtils.isMac)() ? e.metaKey : e.ctrlKey;
89
- var _this$props$element = _this.props.element,
90
- linked_id = _this$props$element.linked_id,
91
- linked_wiki_page_id = _this$props$element.linked_wiki_page_id;
92
- var href = (0, _helpers.getElementHref)(_propTypes.element);
87
+ var element = _this.props.element;
88
+ var linked_id = element.linked_id,
89
+ linked_wiki_page_id = element.linked_wiki_page_id;
93
90
  // mod + click
94
91
  if (isModClick && !linked_id && !linked_wiki_page_id) {
95
- window.open(href, '_blank', 'noreferrer');
92
+ _this.onOpenLink(e);
96
93
  return;
97
94
  }
98
95
  // mod + click on linked wiki page
99
96
  if (isModClick && linked_wiki_page_id) {
100
- var _href = window.location.href;
101
- var parts = _href.split('/');
97
+ var href = window.location.href;
98
+ var parts = href.split('/');
102
99
  parts[parts.length - 2] = linked_wiki_page_id;
103
- var newHref = parts.join('/');
104
- window.open(newHref, '_blank', 'noreferrer');
100
+ var newHref = (0, _urlUtils.normalizeWebUrl)(parts.join('/'));
101
+ if (newHref) window.open(newHref, '_blank', 'noopener,noreferrer');
105
102
  return;
106
103
  }
107
104
  _this.setPosition(e.target);
@@ -122,8 +119,8 @@ var Link = /*#__PURE__*/function (_React$Component) {
122
119
  var _this$props = _this.props,
123
120
  element = _this$props.element,
124
121
  t = _this$props.t;
125
- var href = (0, _helpers.getElementHref)(element);
126
- if (!(0, _isUrl["default"])(href)) {
122
+ var href = (0, _urlUtils.normalizeWebUrl)((0, _helpers.getElementHref)(element));
123
+ if (!href) {
127
124
  _toast["default"].danger(t('The_link_is_invalid'));
128
125
  return;
129
126
  }
@@ -172,15 +169,16 @@ var Link = /*#__PURE__*/function (_React$Component) {
172
169
  var className = isShowLinkMenu ? 'seafile-ed-hovermenu-mouseclick' : null;
173
170
  var linkText = _slate.Node.string(element);
174
171
  if (readonly) {
172
+ var href = (0, _urlUtils.normalizeWebUrl)((0, _helpers.getElementHref)(element));
175
173
  return /*#__PURE__*/_react["default"].createElement("span", Object.assign({
176
174
  className: (0, _classnames["default"])(className, 'virtual-link')
177
- }, attributes), /*#__PURE__*/_react["default"].createElement("a", {
178
- href: (0, _helpers.getElementHref)(element),
175
+ }, attributes), href ? /*#__PURE__*/_react["default"].createElement("a", {
176
+ href: href,
179
177
  title: linkText,
180
178
  onClick: this.onOpenLink,
181
179
  target: "_blank",
182
- rel: "noreferrer"
183
- }, children));
180
+ rel: "noopener noreferrer"
181
+ }, children) : children);
184
182
  }
185
183
  return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", Object.assign({
186
184
  className: className
@@ -11,11 +11,11 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm
11
11
  var _slate = require("@seafile/slate");
12
12
  var _slateReact = require("@seafile/slate-react");
13
13
  var _isHotkey = _interopRequireDefault(require("is-hotkey"));
14
- var _isUrl = _interopRequireDefault(require("is-url"));
15
14
  var _constants = require("../../../constants");
16
15
  var _helpers = require("../../../node-id/helpers");
17
16
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
18
17
  var _objectUtils = _interopRequireDefault(require("../../../utils/object-utils"));
18
+ var _urlUtils = require("../../../utils/url-utils");
19
19
  var _constants2 = require("../../constants");
20
20
  var _core = require("../../core");
21
21
  var _utils = require("../../utils");
@@ -442,7 +442,7 @@ var withTable = function withTable(editor) {
442
442
  if (!text) return;
443
443
 
444
444
  // Keep URL paste behavior consistent with normal text while preserving multi-cell paste behavior.
445
- if ((0, _isUrl["default"])(text) && !(0, _utils.isImage)(text) && (0, _helpers2.isInTableSameCell)(newEditor)) {
445
+ if ((0, _urlUtils.isValidWebUrl)(text) && !(0, _utils.isImage)(text) && (0, _helpers2.isInTableSameCell)(newEditor)) {
446
446
  return insertData(data);
447
447
  }
448
448
  return _slate.Editor.insertText(newEditor, text);
@@ -14,11 +14,11 @@ var _reactI18next = require("react-i18next");
14
14
  var _slate = require("@seafile/slate");
15
15
  var _slateReact = require("@seafile/slate-react");
16
16
  var _classnames = _interopRequireDefault(require("classnames"));
17
- var _isUrl = _interopRequireDefault(require("is-url"));
18
17
  var _constants = require("../../../constants");
19
18
  var _context = _interopRequireDefault(require("../../../context"));
20
19
  var _useScrollContext = require("../../../hooks/use-scroll-context");
21
20
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
21
+ var _urlUtils = require("../../../utils/url-utils");
22
22
  var _core = require("../../core");
23
23
  var _utils = require("../../utils");
24
24
  var _hoverMenu = _interopRequireDefault(require("./hover-menu"));
@@ -29,7 +29,7 @@ var Whiteboard = function Whiteboard(_ref) {
29
29
  var file_path = element.file_path,
30
30
  repo_id = element.repo_id,
31
31
  title = element.title,
32
- link = element.link;
32
+ originalLink = element.link;
33
33
  var whiteboardRef = (0, _react.useRef)();
34
34
  var fullscreenRef = (0, _react.useRef)();
35
35
  var scrollRef = (0, _useScrollContext.useScrollContext)();
@@ -48,9 +48,10 @@ var Whiteboard = function Whiteboard(_ref) {
48
48
  _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
49
49
  isShowZoomOut = _useState4[0],
50
50
  setIsShowZoomOut = _useState4[1];
51
- var isValidUrl = (0, _react.useMemo)(function () {
52
- return (0, _isUrl["default"])(link);
53
- }, [link]);
51
+ var link = (0, _react.useMemo)(function () {
52
+ return (0, _urlUtils.normalizeWebUrl)(originalLink);
53
+ }, [originalLink]);
54
+ var isValidUrl = Boolean(link);
54
55
  (0, _react.useEffect)(function () {
55
56
  if (!isValidUrl) return;
56
57
  var handleMessage = function handleMessage(event) {
@@ -200,7 +201,7 @@ var Whiteboard = function Whiteboard(_ref) {
200
201
  onOpen: handleDoubleClick,
201
202
  openFullscreen: openFullscreen,
202
203
  onDeleteWhiteboard: onDeleteWhiteboard
203
- }), isShowZoomOut && (/*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement("div", {
204
+ }), isShowZoomOut && isValidUrl && (/*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement("div", {
204
205
  className: "whiteboard-zoom-out-container",
205
206
  onClick: function onClick() {
206
207
  return setIsShowZoomOut(false);
@@ -1,21 +1,23 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.onHandleOverflowScroll = exports.isSameDomain = exports.isOverflowPortByDirection = exports.isImage = exports.getMenuPosition = exports.IMAGE_TYPES = void 0;
8
- var _isUrl = _interopRequireDefault(require("is-url"));
7
+ var _urlUtils = require("../../utils/url-utils");
9
8
  var IMAGE_TYPES = exports.IMAGE_TYPES = ['png', 'jpg', 'gif'];
10
9
  var isImage = exports.isImage = function isImage(url) {
11
10
  if (!url) return false;
12
- if (!(0, _isUrl["default"])(url)) return false;
11
+ if (!(0, _urlUtils.isValidWebUrl)(url)) return false;
13
12
  var suffix = url.split('.')[1]; // http://xx/mm/*.png
14
13
  if (!suffix) return false;
15
14
  return IMAGE_TYPES.includes(suffix.toLowerCase());
16
15
  };
17
16
  var isSameDomain = exports.isSameDomain = function isSameDomain(currentUrl, targetUrl) {
18
- return String(currentUrl).split('/')[2] === String(targetUrl).split('/')[2];
17
+ var current = (0, _urlUtils.normalizeWebUrl)(currentUrl);
18
+ var target = (0, _urlUtils.normalizeWebUrl)(targetUrl);
19
+ if (!current || !target) return false;
20
+ return new URL(current).origin === new URL(target).origin;
19
21
  };
20
22
  var isOverflowPortByDirection = exports.isOverflowPortByDirection = function isOverflowPortByDirection(targetDom, direction) {
21
23
  var viewWidth = window.innerWidth || document.documentElement.clientWidth;
@@ -8,6 +8,7 @@ exports["default"] = void 0;
8
8
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
9
9
  var _slugid = _interopRequireDefault(require("slugid"));
10
10
  var _linkHelpers = require("../../../extension/plugins/image/link-helpers");
11
+ var _urlUtils = require("../../../utils/url-utils");
11
12
  var _constants = require("../constants");
12
13
  var linkRule = function linkRule(element, parseChild) {
13
14
  var nodeName = element.nodeName;
@@ -22,14 +23,14 @@ var linkRule = function linkRule(element, parseChild) {
22
23
  id: _slugid["default"].nice(),
23
24
  text: ''
24
25
  };
25
- var href = (0, _linkHelpers.normalizeWebUrl)(element.getAttribute('href'));
26
+ var _href = (0, _urlUtils.normalizeWebUrl)(element.getAttribute('href'));
26
27
  return {
27
28
  id: _slugid["default"].nice(),
28
29
  type: _constants.IMAGE,
29
30
  data: (0, _objectSpread2["default"])({
30
31
  src: src
31
- }, href && {
32
- href: href
32
+ }, _href && {
33
+ href: _href
33
34
  }),
34
35
  children: [{
35
36
  text: '',
@@ -38,12 +39,12 @@ var linkRule = function linkRule(element, parseChild) {
38
39
  };
39
40
  }
40
41
  if (element.querySelector('img')) {
41
- var _href = (0, _linkHelpers.normalizeWebUrl)(element.getAttribute('href'));
42
+ var _href2 = (0, _urlUtils.normalizeWebUrl)(element.getAttribute('href'));
42
43
  return parseChild(element.childNodes).map(function (child) {
43
- if (!_href) return child;
44
+ if (!_href2) return child;
44
45
  if (child.type === _constants.IMAGE) return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, child), {}, {
45
46
  data: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, child.data), {}, {
46
- href: _href
47
+ href: _href2
47
48
  })
48
49
  });
49
50
  if (typeof child.text === 'string') {
@@ -51,7 +52,7 @@ var linkRule = function linkRule(element, parseChild) {
51
52
  return {
52
53
  id: _slugid["default"].nice(),
53
54
  type: _constants.LINK,
54
- href: _href,
55
+ href: _href2,
55
56
  title: element.getAttribute('title'),
56
57
  children: [child]
57
58
  };
@@ -63,10 +64,15 @@ var linkRule = function linkRule(element, parseChild) {
63
64
  id: _slugid["default"].nice(),
64
65
  text: ''
65
66
  };
67
+ var href = (0, _urlUtils.normalizeWebUrl)(element.getAttribute('href'));
68
+ if (!href) return {
69
+ id: _slugid["default"].nice(),
70
+ text: content
71
+ };
66
72
  return {
67
73
  id: _slugid["default"].nice(),
68
74
  type: _constants.LINK,
69
- href: element.getAttribute('href'),
75
+ href: href,
70
76
  title: element.getAttribute('title'),
71
77
  children: [{
72
78
  id: _slugid["default"].nice(),
@@ -11,7 +11,7 @@ var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/esm/
11
11
  var _slugid = _interopRequireDefault(require("slugid"));
12
12
  var _elementType = require("../../extension/constants/element-type");
13
13
  var _core = require("../../extension/core");
14
- var _linkHelpers = require("../../extension/plugins/image/link-helpers");
14
+ var _urlUtils = require("../../utils/url-utils");
15
15
  var _htmlToSlate = _interopRequireDefault(require("../html-to-slate"));
16
16
  var INLINE_KEY_MAP = {
17
17
  strong: 'bold',
@@ -52,7 +52,7 @@ var _applyMarkForInlineItem = function applyMarkForInlineItem(result, item) {
52
52
  value: ''
53
53
  } : children[0];
54
54
  if (child.type === _elementType.IMAGE) {
55
- var href = (0, _linkHelpers.normalizeWebUrl)(item.url);
55
+ var href = (0, _urlUtils.normalizeWebUrl)(item.url);
56
56
  var image = {
57
57
  id: _slugid["default"].nice(),
58
58
  type: _elementType.IMAGE,
@@ -8,8 +8,8 @@ exports.formatSlateToMd = void 0;
8
8
  var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createForOfIteratorHelper"));
9
9
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
10
10
  var _slate = require("@seafile/slate");
11
- var _linkHelpers = require("../../extension/plugins/image/link-helpers");
12
11
  var _isPunctuationMark = _interopRequireDefault(require("../../utils/is-punctuation-mark"));
12
+ var _urlUtils = require("../../utils/url-utils");
13
13
  var escapeHtmlAttribute = function escapeHtmlAttribute(value) {
14
14
  return String(value).replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
15
15
  };
@@ -80,7 +80,7 @@ var transformInlineChildren = function transformInlineChildren(result, item) {
80
80
  value: "<img src=\"".concat(escapeHtmlAttribute(data.src), "\" alt=\"").concat(escapeHtmlAttribute(data.alt), "\" title=\"").concat(escapeHtmlAttribute(data.title), "\" width=\"").concat(escapeHtmlAttribute(data.width), "\" height=\"").concat(escapeHtmlAttribute(data.height), "\" />")
81
81
  };
82
82
  }
83
- var imageLinkUrl = (0, _linkHelpers.normalizeWebUrl)(data.href);
83
+ var imageLinkUrl = (0, _urlUtils.normalizeWebUrl)(data.href);
84
84
  if (imageLinkUrl) {
85
85
  image = image.type === 'html' ? {
86
86
  type: 'html',
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.normalizeWebUrl = exports.isValidWebUrl = void 0;
7
+ // Only absolute HTTP(S) URLs may be opened or embedded in the editor.
8
+ var normalizeWebUrl = exports.normalizeWebUrl = function normalizeWebUrl() {
9
+ var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
10
+ if (typeof value !== 'string') return '';
11
+ var input = value.trim();
12
+ if (!/^https?:\/\//i.test(input)) return '';
13
+ try {
14
+ var url = new URL(input);
15
+ if (!['http:', 'https:'].includes(url.protocol) || !url.hostname) return '';
16
+ return url.href;
17
+ } catch (error) {
18
+ return '';
19
+ }
20
+ };
21
+ var isValidWebUrl = exports.isValidWebUrl = function isValidWebUrl() {
22
+ var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
23
+ return Boolean(normalizeWebUrl(value));
24
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "3.0.251",
3
+ "version": "3.0.253",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -30,7 +30,6 @@
30
30
  "dayjs": "1.10.7",
31
31
  "deep-copy": "1.4.2",
32
32
  "is-hotkey": "0.2.0",
33
- "is-url": "^1.2.4",
34
33
  "lodash.throttle": "4.1.1",
35
34
  "prismjs": "^1.30.0",
36
35
  "randomcolor": "0.6.2",
@@ -71,5 +70,5 @@
71
70
  "publishConfig": {
72
71
  "access": "public"
73
72
  },
74
- "gitHead": "fff8d3dc8f019c7a0f0168e906ed6091e11ad0ab"
73
+ "gitHead": "c611c7584955e57fc785a18198584f10bbdb0425"
75
74
  }