@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.
- package/dist/extension/plugins/embed-link/helper.js +7 -4
- package/dist/extension/plugins/embed-link/render-elem.js +7 -10
- package/dist/extension/plugins/html/rules/link.js +14 -8
- package/dist/extension/plugins/image/link-helpers.js +15 -18
- package/dist/extension/plugins/link/helpers.js +10 -9
- package/dist/extension/plugins/link/hover/index.js +4 -4
- package/dist/extension/plugins/link/plugin.js +5 -4
- package/dist/extension/plugins/link/render-elem.js +16 -18
- package/dist/extension/plugins/table/plugin.js +2 -2
- package/dist/extension/plugins/whiteboard/render-elem.js +7 -6
- package/dist/extension/toolbar/side-toolbar/index.js +34 -22
- package/dist/extension/utils/index.js +6 -4
- package/dist/slate-convert/html-to-slate/rules/link.js +14 -8
- package/dist/slate-convert/md-to-slate/transform.js +2 -2
- package/dist/slate-convert/slate-to-md/transform.js +2 -2
- package/dist/utils/url-utils.js +24 -0
- package/package.json +2 -3
|
@@ -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 =
|
|
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 =
|
|
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 =
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
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
|
-
},
|
|
32
|
-
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
|
|
42
|
+
var _href2 = (0, _urlUtils.normalizeWebUrl)(element.getAttribute('href'));
|
|
42
43
|
return parseChild(element.childNodes).map(function (child) {
|
|
43
|
-
if (!
|
|
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:
|
|
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:
|
|
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:
|
|
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.
|
|
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
|
-
|
|
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 !==
|
|
181
|
+
if (!linkedNodeId && !linkedPageId && (oldUrl !== href || oldText !== newText)) {
|
|
181
182
|
if (editor.editorType === _constants.WIKI_EDITOR) {
|
|
182
183
|
_slate.Transforms.setNodes(editor, {
|
|
183
|
-
href:
|
|
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:
|
|
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 (!
|
|
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
|
-
|
|
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 (!(
|
|
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
|
|
90
|
-
|
|
91
|
-
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
|
-
|
|
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
|
|
101
|
-
var parts =
|
|
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 (!
|
|
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:
|
|
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,
|
|
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
|
-
|
|
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
|
|
52
|
-
return (0,
|
|
53
|
-
}, [
|
|
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
|
-
|
|
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()
|
|
913
|
+
if (!isEditorDrag()) return;
|
|
896
914
|
|
|
897
|
-
//
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
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
|
-
//
|
|
920
|
-
//
|
|
921
|
-
editorContainer.
|
|
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
|
-
|
|
937
|
+
dragEventTarget.addEventListener('drop', handleDropCapture, true);
|
|
925
938
|
return function () {
|
|
926
|
-
|
|
939
|
+
dragEventTarget.removeEventListener('dragover', handleDragover, true);
|
|
927
940
|
editorContainer.removeEventListener('dragend', handleDragEnd, true);
|
|
928
941
|
editorContainer.removeEventListener('dragleave', handleDragLeave, true);
|
|
929
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
-
},
|
|
32
|
-
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
|
|
42
|
+
var _href2 = (0, _urlUtils.normalizeWebUrl)(element.getAttribute('href'));
|
|
42
43
|
return parseChild(element.childNodes).map(function (child) {
|
|
43
|
-
if (!
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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,
|
|
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, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
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,
|
|
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.
|
|
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": "
|
|
73
|
+
"gitHead": "d555e51c2e28eb62c1d77b6a83ec76b0f6b2cdfd"
|
|
75
74
|
}
|