@seafile/sdoc-editor 3.0.233 → 3.0.235
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/html/helper.js +12 -3
- package/dist/extension/plugins/html/plugin.js +1 -1
- package/dist/extension/plugins/html/rules/code-block.js +11 -2
- package/dist/extension/plugins/html/rules/header.js +5 -1
- package/dist/extension/plugins/html/rules/image.js +6 -1
- package/dist/extension/plugins/html/rules/link.js +14 -2
- package/dist/extension/plugins/html/rules/list.js +21 -0
- package/dist/extension/plugins/html/rules/paragraph.js +5 -1
- package/dist/extension/plugins/html/wechat-paste-normalizer.js +32 -0
- package/dist/extension/plugins/image/helpers.js +1 -0
- package/dist/slate-convert/html-to-slate/rules/code-block.js +11 -2
- package/dist/slate-convert/html-to-slate/rules/header.js +5 -1
- package/dist/slate-convert/html-to-slate/rules/image.js +6 -1
- package/dist/slate-convert/html-to-slate/rules/link.js +14 -2
- package/dist/slate-convert/html-to-slate/rules/list.js +21 -0
- package/dist/slate-convert/html-to-slate/rules/paragraph.js +3 -2
- package/package.json +2 -2
|
@@ -4,11 +4,12 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.deserializeHtml = void 0;
|
|
7
|
+
exports.deserializePastedHtml = exports.deserializeHtml = void 0;
|
|
8
8
|
var _slugid = _interopRequireDefault(require("slugid"));
|
|
9
9
|
var _typeOf = _interopRequireDefault(require("type-of"));
|
|
10
10
|
var _constants = require("../../constants");
|
|
11
11
|
var _rules = _interopRequireDefault(require("./rules"));
|
|
12
|
+
var _wechatPasteNormalizer = require("./wechat-paste-normalizer");
|
|
12
13
|
var cruftNewline = function cruftNewline(element) {
|
|
13
14
|
return !(element.nodeName === '#text' && element.nodeValue === '\n');
|
|
14
15
|
};
|
|
@@ -121,8 +122,7 @@ var parseHtml = function parseHtml(html) {
|
|
|
121
122
|
var body = parsed.body;
|
|
122
123
|
return body;
|
|
123
124
|
};
|
|
124
|
-
var
|
|
125
|
-
var fragment = parseHtml(html);
|
|
125
|
+
var deserializeFragment = function deserializeFragment(fragment) {
|
|
126
126
|
var children = Array.from(fragment.childNodes);
|
|
127
127
|
var nodes = [];
|
|
128
128
|
nodes = deserializeElements(children, true);
|
|
@@ -138,4 +138,13 @@ var deserializeHtml = exports.deserializeHtml = function deserializeHtml(html) {
|
|
|
138
138
|
}];
|
|
139
139
|
}
|
|
140
140
|
return nodes;
|
|
141
|
+
};
|
|
142
|
+
var deserializeHtml = exports.deserializeHtml = function deserializeHtml(html) {
|
|
143
|
+
return deserializeFragment(parseHtml(html));
|
|
144
|
+
};
|
|
145
|
+
var deserializePastedHtml = exports.deserializePastedHtml = function deserializePastedHtml(html) {
|
|
146
|
+
var fragment = parseHtml(html);
|
|
147
|
+
// Normalize WeChat-specific DOM before applying the generic HTML-to-Slate rules.
|
|
148
|
+
(0, _wechatPasteNormalizer.normalizeWechatPastedFragment)(fragment);
|
|
149
|
+
return deserializeFragment(fragment);
|
|
141
150
|
};
|
|
@@ -37,7 +37,7 @@ var withHtml = function withHtml(editor) {
|
|
|
37
37
|
}
|
|
38
38
|
var htmlContent = data.getData('text/html') || '';
|
|
39
39
|
if (htmlContent) {
|
|
40
|
-
var content = (0, _helper.
|
|
40
|
+
var content = (0, _helper.deserializePastedHtml)(htmlContent);
|
|
41
41
|
_localStorageUtils["default"].setItem(_constants.RECENT_COPY_CONTENT, htmlContent);
|
|
42
42
|
editor.insertFragment(content);
|
|
43
43
|
return;
|
|
@@ -16,7 +16,7 @@ var normalizeCodeText = function normalizeCodeText() {
|
|
|
16
16
|
};
|
|
17
17
|
var isFormattingWhitespace = function isFormattingWhitespace() {
|
|
18
18
|
var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
19
|
-
return text !== '' && text.trim() === '';
|
|
19
|
+
return text !== '' && !text.includes("\xA0") && text.trim() === '';
|
|
20
20
|
};
|
|
21
21
|
var appendTextToLines = function appendTextToLines(lines) {
|
|
22
22
|
var text = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
@@ -90,11 +90,20 @@ var buildCodeLines = function buildCodeLines(element) {
|
|
|
90
90
|
};
|
|
91
91
|
});
|
|
92
92
|
};
|
|
93
|
+
var buildWechatMultiLineCodeLines = function buildWechatMultiLineCodeLines(element) {
|
|
94
|
+
var codeChildren = Array.from(element.children);
|
|
95
|
+
var isWechatMultiLineCodeBlock = element.classList.contains('code-snippet__js') && codeChildren.length > 1 && codeChildren.every(function (child) {
|
|
96
|
+
return child.nodeName === 'CODE';
|
|
97
|
+
});
|
|
98
|
+
return isWechatMultiLineCodeBlock ? codeChildren.flatMap(buildCodeLines) : null;
|
|
99
|
+
};
|
|
93
100
|
var codeBlockRule = function codeBlockRule(element, parseChild) {
|
|
94
101
|
var nodeName = element.nodeName,
|
|
95
102
|
childNodes = element.childNodes;
|
|
96
103
|
if (nodeName === 'PRE') {
|
|
97
104
|
var codeChild = element.querySelector('code');
|
|
105
|
+
// Process WeChat multi-line code blocks based on their multiple direct <code> children.
|
|
106
|
+
var wechatMultiLineCodeLines = buildWechatMultiLineCodeLines(element);
|
|
98
107
|
var lang = codeChild === null || codeChild === void 0 ? void 0 : codeChild.getAttribute('lang');
|
|
99
108
|
lang = (0, _prismjs.genCodeLangs)().find(function (item) {
|
|
100
109
|
return item.value === lang;
|
|
@@ -103,7 +112,7 @@ var codeBlockRule = function codeBlockRule(element, parseChild) {
|
|
|
103
112
|
id: _slugid["default"].nice(),
|
|
104
113
|
language: lang,
|
|
105
114
|
type: _constants.CODE_BLOCK,
|
|
106
|
-
children: buildCodeLines(codeChild || element)
|
|
115
|
+
children: wechatMultiLineCodeLines !== null && wechatMultiLineCodeLines !== void 0 ? wechatMultiLineCodeLines : buildCodeLines(codeChild || element)
|
|
107
116
|
};
|
|
108
117
|
}
|
|
109
118
|
if (nodeName === 'CODE' && element.parentElement.nodeName === 'PRE') {
|
|
@@ -19,10 +19,14 @@ var headerRule = function headerRule(element, parseChild) {
|
|
|
19
19
|
var nodeName = element.nodeName,
|
|
20
20
|
childNodes = element.childNodes;
|
|
21
21
|
if (nodeName && HEADER_LIST.includes(nodeName)) {
|
|
22
|
+
var children = parseChild(childNodes);
|
|
22
23
|
return {
|
|
23
24
|
id: _slugid["default"].nice(),
|
|
24
25
|
type: HEADER_TYPE_MAP[nodeName],
|
|
25
|
-
children:
|
|
26
|
+
children: children.length > 0 ? children : [{
|
|
27
|
+
id: _slugid["default"].nice(),
|
|
28
|
+
text: ''
|
|
29
|
+
}]
|
|
26
30
|
};
|
|
27
31
|
}
|
|
28
32
|
return;
|
|
@@ -10,11 +10,16 @@ var _constants = require("../../../constants");
|
|
|
10
10
|
var imageRule = function imageRule(element, parseChild) {
|
|
11
11
|
var nodeName = element.nodeName;
|
|
12
12
|
if (nodeName === 'IMG') {
|
|
13
|
+
var src = element.getAttribute('src');
|
|
14
|
+
if (!src || !src.trim()) return {
|
|
15
|
+
id: _slugid["default"].nice(),
|
|
16
|
+
text: ''
|
|
17
|
+
};
|
|
13
18
|
return {
|
|
14
19
|
id: _slugid["default"].nice(),
|
|
15
20
|
type: _constants.IMAGE,
|
|
16
21
|
data: {
|
|
17
|
-
src:
|
|
22
|
+
src: src
|
|
18
23
|
},
|
|
19
24
|
children: [{
|
|
20
25
|
text: '',
|
|
@@ -11,16 +11,23 @@ var _constants = require("../../../constants");
|
|
|
11
11
|
var _linkHelpers = require("../../image/link-helpers");
|
|
12
12
|
var linkRule = function linkRule(element, parseChild) {
|
|
13
13
|
var nodeName = element.nodeName;
|
|
14
|
-
var content = element.textContent || element.getAttribute('title') || element.getAttribute('href');
|
|
15
14
|
if (nodeName === 'A') {
|
|
15
|
+
var content = [element.textContent, element.getAttribute('title'), element.getAttribute('href')].find(function (value) {
|
|
16
|
+
return value === null || value === void 0 ? void 0 : value.trim();
|
|
17
|
+
});
|
|
16
18
|
var image = (0, _linkHelpers.getOnlyImageChild)(element);
|
|
17
19
|
if (image) {
|
|
20
|
+
var src = image.getAttribute('src');
|
|
21
|
+
if (!src || !src.trim()) return {
|
|
22
|
+
id: _slugid["default"].nice(),
|
|
23
|
+
text: ''
|
|
24
|
+
};
|
|
18
25
|
var href = (0, _linkHelpers.normalizeWebUrl)(element.getAttribute('href'));
|
|
19
26
|
return {
|
|
20
27
|
id: _slugid["default"].nice(),
|
|
21
28
|
type: _constants.IMAGE,
|
|
22
29
|
data: (0, _objectSpread2["default"])({
|
|
23
|
-
src:
|
|
30
|
+
src: src
|
|
24
31
|
}, href && {
|
|
25
32
|
href: href
|
|
26
33
|
}),
|
|
@@ -40,6 +47,7 @@ var linkRule = function linkRule(element, parseChild) {
|
|
|
40
47
|
})
|
|
41
48
|
});
|
|
42
49
|
if (typeof child.text === 'string') {
|
|
50
|
+
if (!child.text) return child;
|
|
43
51
|
return {
|
|
44
52
|
id: _slugid["default"].nice(),
|
|
45
53
|
type: _constants.LINK,
|
|
@@ -51,6 +59,10 @@ var linkRule = function linkRule(element, parseChild) {
|
|
|
51
59
|
return child;
|
|
52
60
|
});
|
|
53
61
|
}
|
|
62
|
+
if (!content) return {
|
|
63
|
+
id: _slugid["default"].nice(),
|
|
64
|
+
text: ''
|
|
65
|
+
};
|
|
54
66
|
return {
|
|
55
67
|
id: _slugid["default"].nice(),
|
|
56
68
|
type: _constants.LINK,
|
|
@@ -59,9 +59,30 @@ var normalizeListItemChildren = function normalizeListItemChildren() {
|
|
|
59
59
|
}
|
|
60
60
|
return nextChildren;
|
|
61
61
|
};
|
|
62
|
+
var isWechatCodeLineIndex = function isWechatCodeLineIndex(element) {
|
|
63
|
+
if (element.nodeName !== 'UL' || !element.classList.contains('code-snippet__line-index') || !element.classList.contains('code-snippet__js')) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
var snippet = element.parentElement;
|
|
67
|
+
var codeBlock = element.nextElementSibling;
|
|
68
|
+
|
|
69
|
+
// Match a complete WeChat code snippet when the clipboard preserves its outer <section> wrapper.
|
|
70
|
+
var isCompleteWechatSnippet = (snippet === null || snippet === void 0 ? void 0 : snippet.nodeName) === 'SECTION' && snippet.classList.contains('code-snippet__fix') && snippet.classList.contains('code-snippet__js');
|
|
71
|
+
|
|
72
|
+
// Match a standalone WeChat code snippet when the clipboard omits the outer wrapper.
|
|
73
|
+
var lineItems = Array.from(element.children);
|
|
74
|
+
var isStandaloneWechatSnippet = (snippet === null || snippet === void 0 ? void 0 : snippet.nodeName) === 'BODY' && lineItems.length > 0 && lineItems.every(function (item) {
|
|
75
|
+
return item.nodeName === 'LI' && item.children.length === 0 && item.textContent.trim() === '';
|
|
76
|
+
});
|
|
77
|
+
return (isCompleteWechatSnippet || isStandaloneWechatSnippet) && (codeBlock === null || codeBlock === void 0 ? void 0 : codeBlock.nodeName) === 'PRE' && codeBlock.classList.contains('code-snippet__js') && codeBlock.parentElement === snippet;
|
|
78
|
+
};
|
|
62
79
|
var listRule = function listRule(element, parseChild) {
|
|
63
80
|
var nodeName = element.nodeName,
|
|
64
81
|
childNodes = element.childNodes;
|
|
82
|
+
// Discard the line-index list from a recognized WeChat code snippet to avoid generating extra list items.
|
|
83
|
+
if (isWechatCodeLineIndex(element)) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
65
86
|
if (nodeName === 'UL') {
|
|
66
87
|
var validChildNodes = Array.from(childNodes).filter(function (item) {
|
|
67
88
|
return item.nodeName === 'LI';
|
|
@@ -11,10 +11,14 @@ var paragraphRule = function paragraphRule(element, parseChild) {
|
|
|
11
11
|
var nodeName = element.nodeName,
|
|
12
12
|
childNodes = element.childNodes;
|
|
13
13
|
if (nodeName === 'P' && element.parentElement.nodeName !== 'LI') {
|
|
14
|
+
var children = parseChild(childNodes);
|
|
14
15
|
return {
|
|
15
16
|
id: _slugid["default"].nice(),
|
|
16
17
|
type: _constants.PARAGRAPH,
|
|
17
|
-
children:
|
|
18
|
+
children: children.length > 0 ? children : [{
|
|
19
|
+
id: _slugid["default"].nice(),
|
|
20
|
+
text: ''
|
|
21
|
+
}]
|
|
18
22
|
};
|
|
19
23
|
}
|
|
20
24
|
return;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.normalizeWechatPastedFragment = void 0;
|
|
7
|
+
var WECHAT_REPLY_BREAK_ATTRIBUTE = 'data-sdoc-wechat-reply-break';
|
|
8
|
+
var WECHAT_REPLY_SELECTOR = 'div.discuss_media.js_reply_item[data-reply-id][data-content-id]';
|
|
9
|
+
var addWechatCommentReplyBreaks = function addWechatCommentReplyBreaks(fragment) {
|
|
10
|
+
var replies = fragment.querySelectorAll(WECHAT_REPLY_SELECTOR);
|
|
11
|
+
replies.forEach(function (reply) {
|
|
12
|
+
var replyId = reply.getAttribute('data-reply-id');
|
|
13
|
+
var contentId = reply.getAttribute('data-content-id');
|
|
14
|
+
var commentItem = reply.closest('li.js_comment_item.discuss_item');
|
|
15
|
+
if (!replyId || !contentId || !commentItem || commentItem.getAttribute('data-content-id') !== contentId) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
var commentParts = Array.from(commentItem.querySelectorAll('.discuss_media[data-content-id]')).filter(function (item) {
|
|
19
|
+
return item.getAttribute('data-content-id') === contentId;
|
|
20
|
+
});
|
|
21
|
+
if (commentParts.indexOf(reply) <= 0) return;
|
|
22
|
+
var previousElement = reply.previousElementSibling;
|
|
23
|
+
if ((previousElement === null || previousElement === void 0 ? void 0 : previousElement.getAttribute(WECHAT_REPLY_BREAK_ATTRIBUTE)) === 'true') return;
|
|
24
|
+
var breakElement = fragment.ownerDocument.createElement('span');
|
|
25
|
+
breakElement.setAttribute(WECHAT_REPLY_BREAK_ATTRIBUTE, 'true');
|
|
26
|
+
breakElement.textContent = '\n';
|
|
27
|
+
reply.before(breakElement);
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
var normalizeWechatPastedFragment = exports.normalizeWechatPastedFragment = function normalizeWechatPastedFragment(fragment) {
|
|
31
|
+
addWechatCommentReplyBreaks(fragment);
|
|
32
|
+
};
|
|
@@ -16,7 +16,7 @@ var normalizeCodeText = function normalizeCodeText() {
|
|
|
16
16
|
};
|
|
17
17
|
var isFormattingWhitespace = function isFormattingWhitespace() {
|
|
18
18
|
var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
19
|
-
return text !== '' && text.trim() === '';
|
|
19
|
+
return text !== '' && !text.includes("\xA0") && text.trim() === '';
|
|
20
20
|
};
|
|
21
21
|
var appendTextToLines = function appendTextToLines(lines) {
|
|
22
22
|
var text = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
@@ -90,11 +90,20 @@ var buildCodeLines = function buildCodeLines(element) {
|
|
|
90
90
|
};
|
|
91
91
|
});
|
|
92
92
|
};
|
|
93
|
+
var buildWechatMultiLineCodeLines = function buildWechatMultiLineCodeLines(element) {
|
|
94
|
+
var codeChildren = Array.from(element.children);
|
|
95
|
+
var isWechatMultiLineCodeBlock = element.classList.contains('code-snippet__js') && codeChildren.length > 1 && codeChildren.every(function (child) {
|
|
96
|
+
return child.nodeName === 'CODE';
|
|
97
|
+
});
|
|
98
|
+
return isWechatMultiLineCodeBlock ? codeChildren.flatMap(buildCodeLines) : null;
|
|
99
|
+
};
|
|
93
100
|
var codeBlockRule = function codeBlockRule(element, parseChild) {
|
|
94
101
|
var nodeName = element.nodeName,
|
|
95
102
|
childNodes = element.childNodes;
|
|
96
103
|
if (nodeName === 'PRE') {
|
|
97
104
|
var codeChild = element.querySelector('code');
|
|
105
|
+
// Process WeChat multi-line code blocks based on their multiple direct <code> children.
|
|
106
|
+
var wechatMultiLineCodeLines = buildWechatMultiLineCodeLines(element);
|
|
98
107
|
var lang = codeChild === null || codeChild === void 0 ? void 0 : codeChild.getAttribute('lang');
|
|
99
108
|
lang = (0, _helper.genCodeLangs)().find(function (item) {
|
|
100
109
|
return item.value === lang;
|
|
@@ -103,7 +112,7 @@ var codeBlockRule = function codeBlockRule(element, parseChild) {
|
|
|
103
112
|
id: _slugid["default"].nice(),
|
|
104
113
|
language: lang,
|
|
105
114
|
type: _constants.CODE_BLOCK,
|
|
106
|
-
children: buildCodeLines(codeChild || element)
|
|
115
|
+
children: wechatMultiLineCodeLines !== null && wechatMultiLineCodeLines !== void 0 ? wechatMultiLineCodeLines : buildCodeLines(codeChild || element)
|
|
107
116
|
};
|
|
108
117
|
}
|
|
109
118
|
if (nodeName === 'CODE' && element.parentElement.nodeName === 'PRE') {
|
|
@@ -11,10 +11,14 @@ var headerRule = function headerRule(element, parseChild) {
|
|
|
11
11
|
var nodeName = element.nodeName,
|
|
12
12
|
childNodes = element.childNodes;
|
|
13
13
|
if (nodeName && _constants.HEADER_LIST.includes(nodeName)) {
|
|
14
|
+
var children = parseChild(childNodes);
|
|
14
15
|
return {
|
|
15
16
|
id: _slugid["default"].nice(),
|
|
16
17
|
type: _constants.HEADER_TYPE_MAP[nodeName],
|
|
17
|
-
children:
|
|
18
|
+
children: children.length > 0 ? children : [{
|
|
19
|
+
id: _slugid["default"].nice(),
|
|
20
|
+
text: ''
|
|
21
|
+
}]
|
|
18
22
|
};
|
|
19
23
|
}
|
|
20
24
|
return;
|
|
@@ -10,11 +10,16 @@ var _constants = require("../constants");
|
|
|
10
10
|
var imageRule = function imageRule(element, parseChild) {
|
|
11
11
|
var nodeName = element.nodeName;
|
|
12
12
|
if (nodeName === 'IMG') {
|
|
13
|
+
var src = element.getAttribute('src');
|
|
14
|
+
if (!src || !src.trim()) return {
|
|
15
|
+
id: _slugid["default"].nice(),
|
|
16
|
+
text: ''
|
|
17
|
+
};
|
|
13
18
|
return {
|
|
14
19
|
id: _slugid["default"].nice(),
|
|
15
20
|
type: _constants.IMAGE,
|
|
16
21
|
data: {
|
|
17
|
-
src:
|
|
22
|
+
src: src
|
|
18
23
|
},
|
|
19
24
|
children: [{
|
|
20
25
|
text: '',
|
|
@@ -11,16 +11,23 @@ var _linkHelpers = require("../../../extension/plugins/image/link-helpers");
|
|
|
11
11
|
var _constants = require("../constants");
|
|
12
12
|
var linkRule = function linkRule(element, parseChild) {
|
|
13
13
|
var nodeName = element.nodeName;
|
|
14
|
-
var content = element.textContent || element.getAttribute('title') || element.getAttribute('href');
|
|
15
14
|
if (nodeName === 'A') {
|
|
15
|
+
var content = [element.textContent, element.getAttribute('title'), element.getAttribute('href')].find(function (value) {
|
|
16
|
+
return value === null || value === void 0 ? void 0 : value.trim();
|
|
17
|
+
});
|
|
16
18
|
var image = (0, _linkHelpers.getOnlyImageChild)(element);
|
|
17
19
|
if (image) {
|
|
20
|
+
var src = image.getAttribute('src');
|
|
21
|
+
if (!src || !src.trim()) return {
|
|
22
|
+
id: _slugid["default"].nice(),
|
|
23
|
+
text: ''
|
|
24
|
+
};
|
|
18
25
|
var href = (0, _linkHelpers.normalizeWebUrl)(element.getAttribute('href'));
|
|
19
26
|
return {
|
|
20
27
|
id: _slugid["default"].nice(),
|
|
21
28
|
type: _constants.IMAGE,
|
|
22
29
|
data: (0, _objectSpread2["default"])({
|
|
23
|
-
src:
|
|
30
|
+
src: src
|
|
24
31
|
}, href && {
|
|
25
32
|
href: href
|
|
26
33
|
}),
|
|
@@ -40,6 +47,7 @@ var linkRule = function linkRule(element, parseChild) {
|
|
|
40
47
|
})
|
|
41
48
|
});
|
|
42
49
|
if (typeof child.text === 'string') {
|
|
50
|
+
if (!child.text) return child;
|
|
43
51
|
return {
|
|
44
52
|
id: _slugid["default"].nice(),
|
|
45
53
|
type: _constants.LINK,
|
|
@@ -51,6 +59,10 @@ var linkRule = function linkRule(element, parseChild) {
|
|
|
51
59
|
return child;
|
|
52
60
|
});
|
|
53
61
|
}
|
|
62
|
+
if (!content) return {
|
|
63
|
+
id: _slugid["default"].nice(),
|
|
64
|
+
text: ''
|
|
65
|
+
};
|
|
54
66
|
return {
|
|
55
67
|
id: _slugid["default"].nice(),
|
|
56
68
|
type: _constants.LINK,
|
|
@@ -59,9 +59,30 @@ var normalizeListItemChildren = function normalizeListItemChildren() {
|
|
|
59
59
|
}
|
|
60
60
|
return nextChildren;
|
|
61
61
|
};
|
|
62
|
+
var isWechatCodeLineIndex = function isWechatCodeLineIndex(element) {
|
|
63
|
+
if (element.nodeName !== 'UL' || !element.classList.contains('code-snippet__line-index') || !element.classList.contains('code-snippet__js')) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
var snippet = element.parentElement;
|
|
67
|
+
var codeBlock = element.nextElementSibling;
|
|
68
|
+
|
|
69
|
+
// Match a complete WeChat code snippet when the clipboard preserves its outer <section> wrapper.
|
|
70
|
+
var isCompleteWechatSnippet = (snippet === null || snippet === void 0 ? void 0 : snippet.nodeName) === 'SECTION' && snippet.classList.contains('code-snippet__fix') && snippet.classList.contains('code-snippet__js');
|
|
71
|
+
|
|
72
|
+
// Match a standalone WeChat code snippet when the clipboard omits the outer wrapper.
|
|
73
|
+
var lineItems = Array.from(element.children);
|
|
74
|
+
var isStandaloneWechatSnippet = (snippet === null || snippet === void 0 ? void 0 : snippet.nodeName) === 'BODY' && lineItems.length > 0 && lineItems.every(function (item) {
|
|
75
|
+
return item.nodeName === 'LI' && item.children.length === 0 && item.textContent.trim() === '';
|
|
76
|
+
});
|
|
77
|
+
return (isCompleteWechatSnippet || isStandaloneWechatSnippet) && (codeBlock === null || codeBlock === void 0 ? void 0 : codeBlock.nodeName) === 'PRE' && codeBlock.classList.contains('code-snippet__js') && codeBlock.parentElement === snippet;
|
|
78
|
+
};
|
|
62
79
|
var listRule = function listRule(element, parseChild) {
|
|
63
80
|
var nodeName = element.nodeName,
|
|
64
81
|
childNodes = element.childNodes;
|
|
82
|
+
// Discard the line-index list from a recognized WeChat code snippet to avoid generating extra list items.
|
|
83
|
+
if (isWechatCodeLineIndex(element)) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
65
86
|
if (nodeName === 'UL') {
|
|
66
87
|
var validChildNodes = Array.from(childNodes).filter(function (item) {
|
|
67
88
|
return item.nodeName === 'LI';
|
|
@@ -11,7 +11,8 @@ var paragraphRule = function paragraphRule(element, parseChild) {
|
|
|
11
11
|
var nodeName = element.nodeName,
|
|
12
12
|
childNodes = element.childNodes;
|
|
13
13
|
if (nodeName === 'P' && element.parentElement.nodeName !== 'LI') {
|
|
14
|
-
|
|
14
|
+
var children = parseChild(childNodes);
|
|
15
|
+
if (children.length === 0) {
|
|
15
16
|
return {
|
|
16
17
|
id: _slugid["default"].nice(),
|
|
17
18
|
type: _constants.PARAGRAPH,
|
|
@@ -24,7 +25,7 @@ var paragraphRule = function paragraphRule(element, parseChild) {
|
|
|
24
25
|
return {
|
|
25
26
|
id: _slugid["default"].nice(),
|
|
26
27
|
type: _constants.PARAGRAPH,
|
|
27
|
-
children:
|
|
28
|
+
children: children
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
31
|
return;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.235",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "jest",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"publishConfig": {
|
|
72
72
|
"access": "public"
|
|
73
73
|
},
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "08327c0c9c2b57a9a9f12a6f88a9c714be29b4f1"
|
|
75
75
|
}
|