@seafile/sdoc-editor 3.0.250 → 3.0.252

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.
@@ -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);
@@ -26,7 +26,8 @@ var _event = require("./event");
26
26
  var _helpers2 = require("./helpers");
27
27
  var _sideMenu = _interopRequireDefault(require("./side-menu"));
28
28
  require("./index.css");
29
- var HORIZONTAL_DROP_ZONE_WIDTH = 48;
29
+ // Keep the visual drop indicator narrow, but make the invisible hit area easier to reach.
30
+ var HORIZONTAL_DROP_ZONE_WIDTH = 72;
30
31
  var getSafeNodeEntry = function getSafeNodeEntry(editor, element) {
31
32
  try {
32
33
  return (0, _helpers2.getNodeEntry)(editor, element);
@@ -278,6 +279,7 @@ var SideToolbar = function SideToolbar() {
278
279
  event.stopPropagation();
279
280
  sourceElementRef.current = null;
280
281
  isDraggingEditorElementRef.current = true;
282
+ event.dataTransfer.effectAllowed = 'move';
281
283
  // Create the preview container when dragging more than one listNodes
282
284
  var noDrag = _slate.Path.equals(editor.selection.focus.path, editor.selection.anchor.path);
283
285
  if (showSelectedNodesRef.current && showSelectedNodesRef.current.length > 1 && !noDrag) {
@@ -645,9 +647,8 @@ var SideToolbar = function SideToolbar() {
645
647
  isDraggingEditorElementRef.current = false;
646
648
  }, [clearAllDragStyles]);
647
649
  var handleDragover = (0, _react.useCallback)(function (event) {
648
- var _target;
650
+ var _event$target, _event$target$closest, _target;
649
651
  if (!isEditorDrag()) return;
650
- event.preventDefault();
651
652
  var _getSafeNodeEntry7 = getSafeNodeEntry(editor, sourceElementRef.current),
652
653
  _getSafeNodeEntry8 = (0, _slicedToArray2["default"])(_getSafeNodeEntry7, 2),
653
654
  sourceNode = _getSafeNodeEntry8[0],
@@ -677,6 +678,11 @@ var SideToolbar = function SideToolbar() {
677
678
  clearAllDragStyles();
678
679
  return;
679
680
  }
681
+ var eventEditorContainer = (_event$target = event.target) === null || _event$target === void 0 ? void 0 : (_event$target$closest = _event$target.closest) === null || _event$target$closest === void 0 ? void 0 : _event$target$closest.call(_event$target, '.sdoc-article-container');
682
+ if (eventEditorContainer && eventEditorContainer !== editorContainer) {
683
+ clearAllDragStyles();
684
+ return;
685
+ }
680
686
  var containerRect = editorContainer.getBoundingClientRect();
681
687
 
682
688
  // Current visible area of editor container
@@ -769,6 +775,9 @@ var SideToolbar = function SideToolbar() {
769
775
  previousRect = rect;
770
776
  });
771
777
  if (activeColumn) {
778
+ event.preventDefault();
779
+ event.stopPropagation();
780
+ event.dataTransfer.dropEffect = 'move';
772
781
  activeColumn.classList.add("sdoc-dragging-".concat(activeDirection));
773
782
  activeDragElRef.current = activeColumn;
774
783
  pendingSideDropRef.current = {
@@ -806,11 +815,20 @@ var SideToolbar = function SideToolbar() {
806
815
  };
807
816
  } else {
808
817
  clearAllDragStyles();
818
+ return;
809
819
  }
820
+ event.preventDefault();
821
+ event.stopPropagation();
822
+ event.dataTransfer.dropEffect = 'move';
810
823
  }, [clearAllDragStyles, editor, getEditorContainer, isEditorDrag]);
811
824
  var handleDragLeave = (0, _react.useCallback)(function (event) {
825
+ var _pendingSideDropRef$c;
812
826
  var editorContainer = event.currentTarget;
813
827
  var relatedTarget = event.relatedTarget;
828
+ var pendingDropElement = (_pendingSideDropRef$c = pendingSideDropRef.current) === null || _pendingSideDropRef$c === void 0 ? void 0 : _pendingSideDropRef$c.element;
829
+
830
+ // Preserve a pending move within this editor until drop or dragend.
831
+ if (pendingDropElement && editorContainer.contains(pendingDropElement)) return;
814
832
 
815
833
  // Ignore dragleave events from descendants. Some browsers report a null
816
834
  // relatedTarget when moving between block elements, so clearing here
@@ -892,20 +910,14 @@ var SideToolbar = function SideToolbar() {
892
910
  return true;
893
911
  }, [editor]);
894
912
  var handleDropCapture = (0, _react.useCallback)(function (event) {
895
- if (!isEditorDrag() || !pendingSideDropRef.current) return;
913
+ if (!isEditorDrag()) return;
896
914
 
897
- // Stop the normal block drop before mutating Slate. The actual target and
898
- // direction were recorded during dragover, so this path does not depend
899
- // on the final drop event target or on a final dragover being delivered.
900
- event.preventDefault();
901
- event.stopPropagation();
902
- var handled = handleDrop();
903
- if (!handled) {
904
- resetDragState();
905
- return;
906
- }
915
+ // Recheck the final position and stop the normal block drop for side hits.
916
+ handleDragover(event);
917
+ if (!pendingSideDropRef.current) return;
918
+ handleDrop();
907
919
  resetDragState();
908
- }, [handleDrop, isEditorDrag, resetDragState]);
920
+ }, [handleDragover, handleDrop, isEditorDrag, resetDragState]);
909
921
  var handleDragEnd = (0, _react.useCallback)(function () {
910
922
  // dragend also fires when the user cancels a drag or releases outside the
911
923
  // editor. Only a confirmed drop event may mutate the Slate document.
@@ -916,17 +928,18 @@ var SideToolbar = function SideToolbar() {
916
928
  var editorContainer = getEditorContainer();
917
929
  if (!editorContainer) return undefined;
918
930
 
919
- // Keep drag events scoped to the current editor container. Capture phase
920
- // still lets this handler run before block-level handlers in the editor.
921
- editorContainer.addEventListener('dragover', handleDragover, true);
931
+ // Side hit areas can extend outside the editor container. Accept them at
932
+ // document level, while the handlers still validate this editor's drag.
933
+ var dragEventTarget = editorContainer.ownerDocument;
934
+ dragEventTarget.addEventListener('dragover', handleDragover, true);
922
935
  editorContainer.addEventListener('dragend', handleDragEnd, true);
923
936
  editorContainer.addEventListener('dragleave', handleDragLeave, true);
924
- editorContainer.addEventListener('drop', handleDropCapture, true);
937
+ dragEventTarget.addEventListener('drop', handleDropCapture, true);
925
938
  return function () {
926
- editorContainer.removeEventListener('dragover', handleDragover, true);
939
+ dragEventTarget.removeEventListener('dragover', handleDragover, true);
927
940
  editorContainer.removeEventListener('dragend', handleDragEnd, true);
928
941
  editorContainer.removeEventListener('dragleave', handleDragLeave, true);
929
- editorContainer.removeEventListener('drop', handleDropCapture, true);
942
+ dragEventTarget.removeEventListener('drop', handleDropCapture, true);
930
943
  };
931
944
  }, [getEditorContainer, handleDragEnd, handleDragLeave, handleDragover, handleDropCapture]);
932
945
  return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !_commonUtils.isMobile && /*#__PURE__*/_react["default"].createElement("div", {
@@ -943,7 +956,6 @@ var SideToolbar = function SideToolbar() {
943
956
  onMouseDown: onMouseDown,
944
957
  draggable: true,
945
958
  onDragStart: dragStart,
946
- onDragEnd: handleDragEnd,
947
959
  className: "sdoc-side-op-icon",
948
960
  onClick: onShowSideMenuToggle,
949
961
  onMouseEnter: onMouseEnter,
@@ -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.250",
3
+ "version": "3.0.252",
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": "9c4af0de615f973e844f37e346f7f0d7aeeaf41f"
73
+ "gitHead": "d555e51c2e28eb62c1d77b6a83ec76b0f6b2cdfd"
75
74
  }