@seafile/sdoc-editor 0.1.54 → 0.1.55
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/basic-sdk/editor.js +11 -2
- package/dist/basic-sdk/extension/plugins/html/helper.js +135 -0
- package/dist/basic-sdk/extension/plugins/html/index.js +6 -0
- package/dist/basic-sdk/extension/plugins/html/plugin.js +16 -0
- package/dist/basic-sdk/extension/plugins/html/rules/blockquote.js +16 -0
- package/dist/basic-sdk/extension/plugins/html/rules/check-list.js +20 -0
- package/dist/basic-sdk/extension/plugins/html/rules/code-block.js +28 -0
- package/dist/basic-sdk/extension/plugins/html/rules/header.js +24 -0
- package/dist/basic-sdk/extension/plugins/html/rules/image.js +21 -0
- package/dist/basic-sdk/extension/plugins/html/rules/index.js +11 -0
- package/dist/basic-sdk/extension/plugins/html/rules/link.js +22 -0
- package/dist/basic-sdk/extension/plugins/html/rules/list.js +53 -0
- package/dist/basic-sdk/extension/plugins/html/rules/paragraph.js +16 -0
- package/dist/basic-sdk/extension/plugins/html/rules/table.js +35 -0
- package/dist/basic-sdk/extension/plugins/html/rules/text.js +61 -0
- package/dist/basic-sdk/extension/plugins/index.js +3 -2
- package/dist/basic-sdk/extension/plugins/table/plugin.js +3 -2
- package/dist/basic-sdk/extension/plugins/text-style/index.js +2 -1
- package/dist/basic-sdk/extension/toolbar/index.js +32 -47
- package/package.json +3 -2
package/dist/basic-sdk/editor.js
CHANGED
|
@@ -42,6 +42,10 @@ var SDocEditor = function SDocEditor(_ref) {
|
|
|
42
42
|
setMenuPosition = _useState6[1];
|
|
43
43
|
var _useCursors = useCursors(editor),
|
|
44
44
|
cursors = _useCursors.cursors;
|
|
45
|
+
var _useState7 = useState({}),
|
|
46
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
47
|
+
forceUpdateValue = _useState8[0],
|
|
48
|
+
setForceUpdateValue = _useState8[1];
|
|
45
49
|
|
|
46
50
|
// init eventHandler
|
|
47
51
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -90,10 +94,14 @@ var SDocEditor = function SDocEditor(_ref) {
|
|
|
90
94
|
}
|
|
91
95
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
92
96
|
}, []);
|
|
97
|
+
var onSelect = useCallback(function () {
|
|
98
|
+
setForceUpdateValue({});
|
|
99
|
+
}, []);
|
|
93
100
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
94
101
|
className: "sdoc-editor-container"
|
|
95
102
|
}, /*#__PURE__*/React.createElement(Toolbar, {
|
|
96
|
-
editor: editor
|
|
103
|
+
editor: editor,
|
|
104
|
+
forceUpdateValue: forceUpdateValue
|
|
97
105
|
}), /*#__PURE__*/React.createElement("div", {
|
|
98
106
|
className: "sdoc-editor-content"
|
|
99
107
|
}, /*#__PURE__*/React.createElement(SDocOutline, {
|
|
@@ -113,7 +121,8 @@ var SDocEditor = function SDocEditor(_ref) {
|
|
|
113
121
|
onKeyDown: eventProxy.onKeyDown,
|
|
114
122
|
cursors: cursors,
|
|
115
123
|
onContextMenu: onContextMenu,
|
|
116
|
-
onMouseDown: onMouseDown
|
|
124
|
+
onMouseDown: onMouseDown,
|
|
125
|
+
onSelect: onSelect
|
|
117
126
|
})))))), isShowContextMenu && /*#__PURE__*/React.createElement(ContextMenu, {
|
|
118
127
|
editor: editor,
|
|
119
128
|
contextMenuPosition: menuPosition
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
import typeOf from 'type-of';
|
|
3
|
+
import { LIST_ITEM, PARAGRAPH, UNORDERED_LIST } from '../../constants';
|
|
4
|
+
import rules from './rules';
|
|
5
|
+
var cruftNewline = function cruftNewline(element) {
|
|
6
|
+
return !(element.nodeName === '#text' && element.nodeValue === '\n');
|
|
7
|
+
};
|
|
8
|
+
var deserializeElement = function deserializeElement(element) {
|
|
9
|
+
var node;
|
|
10
|
+
var next = function next(elements) {
|
|
11
|
+
if (Object.prototype.toString.call(elements) === '[object NodeList]') {
|
|
12
|
+
elements = Array.from(elements);
|
|
13
|
+
}
|
|
14
|
+
switch (typeOf(elements)) {
|
|
15
|
+
case 'array':
|
|
16
|
+
return deserializeElements(elements);
|
|
17
|
+
case 'object':
|
|
18
|
+
return deserializeElement(elements);
|
|
19
|
+
case 'null':
|
|
20
|
+
case 'undefined':
|
|
21
|
+
return;
|
|
22
|
+
default:
|
|
23
|
+
throw new Error("The `next` argument was called with invalid children: \"".concat(elements, "\"."));
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
for (var i = 0; i < rules.length; i++) {
|
|
27
|
+
var rule = rules[i];
|
|
28
|
+
if (!rule) continue;
|
|
29
|
+
var ret = rule(element, next);
|
|
30
|
+
var type = typeOf(ret);
|
|
31
|
+
if (type !== 'array' && type !== 'object' && type !== 'null' && type !== 'undefined') {
|
|
32
|
+
throw new Error("A rule returned an invalid deserialized representation: \"".concat(node, "\"."));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Not eligible for current component processing
|
|
36
|
+
if (ret === undefined) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Empty tags will be discarded and not converted accordingly
|
|
41
|
+
if (ret === null) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Assign the final processing result to node
|
|
46
|
+
node = ret;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// If node is undefined, it means that the label is not processed, and continue to process the child nodes of the element
|
|
51
|
+
return node || next(element.childNodes);
|
|
52
|
+
};
|
|
53
|
+
var deserializeElements = function deserializeElements() {
|
|
54
|
+
var elements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
55
|
+
var isTopLevel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
56
|
+
var nodes = [];
|
|
57
|
+
elements.filter(cruftNewline).forEach(function (element) {
|
|
58
|
+
var node = deserializeElement(element);
|
|
59
|
+
switch (typeOf(node)) {
|
|
60
|
+
case 'array':
|
|
61
|
+
var formatNode = isTopLevel ? formatElementNodes(node, true) : node;
|
|
62
|
+
nodes = nodes.concat(formatNode);
|
|
63
|
+
break;
|
|
64
|
+
case 'object':
|
|
65
|
+
nodes.push(node);
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
// nothing todo
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
return nodes;
|
|
73
|
+
};
|
|
74
|
+
var formatElementNodes = function formatElementNodes(nodes) {
|
|
75
|
+
var isMergeForward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
76
|
+
if (nodes.length === 0) return nodes;
|
|
77
|
+
nodes = nodes.reduce(function (memo, node) {
|
|
78
|
+
if (node.level === 'level1') {
|
|
79
|
+
memo.push(node);
|
|
80
|
+
}
|
|
81
|
+
if (node.level === 'level2') {
|
|
82
|
+
if (node.type === LIST_ITEM) {
|
|
83
|
+
var newNode = {
|
|
84
|
+
level: 'level1',
|
|
85
|
+
id: slugid.nice(),
|
|
86
|
+
type: UNORDERED_LIST,
|
|
87
|
+
children: [node]
|
|
88
|
+
};
|
|
89
|
+
memo.push(newNode);
|
|
90
|
+
return memo;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (node.level === 'level3') {
|
|
94
|
+
var prevNode = memo[memo.length - 1];
|
|
95
|
+
if (prevNode && prevNode.type === PARAGRAPH && isMergeForward) {
|
|
96
|
+
prevNode.children.push(node);
|
|
97
|
+
return memo;
|
|
98
|
+
}
|
|
99
|
+
var _newNode = {
|
|
100
|
+
level: 'level1',
|
|
101
|
+
id: slugid.nice(),
|
|
102
|
+
type: PARAGRAPH,
|
|
103
|
+
children: [node]
|
|
104
|
+
};
|
|
105
|
+
memo.push(_newNode);
|
|
106
|
+
return memo;
|
|
107
|
+
}
|
|
108
|
+
return memo;
|
|
109
|
+
}, []);
|
|
110
|
+
return nodes;
|
|
111
|
+
};
|
|
112
|
+
var parseHtml = function parseHtml(html) {
|
|
113
|
+
var parsed = new DOMParser().parseFromString(html, 'text/html');
|
|
114
|
+
var body = parsed.body;
|
|
115
|
+
return body;
|
|
116
|
+
};
|
|
117
|
+
export var deserializeHtml = function deserializeHtml(html) {
|
|
118
|
+
var fragment = parseHtml(html);
|
|
119
|
+
var children = Array.from(fragment.childNodes);
|
|
120
|
+
var nodes = [];
|
|
121
|
+
nodes = deserializeElements(children, true);
|
|
122
|
+
nodes = formatElementNodes(nodes);
|
|
123
|
+
if (nodes.length === 0) {
|
|
124
|
+
nodes = [{
|
|
125
|
+
level: 'level1',
|
|
126
|
+
id: slugid.nice(),
|
|
127
|
+
type: PARAGRAPH,
|
|
128
|
+
children: [{
|
|
129
|
+
text: '',
|
|
130
|
+
id: slugid.nice()
|
|
131
|
+
}]
|
|
132
|
+
}];
|
|
133
|
+
}
|
|
134
|
+
return nodes;
|
|
135
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { deserializeHtml } from './helper';
|
|
2
|
+
var withHtml = function withHtml(editor) {
|
|
3
|
+
var insertData = editor.insertData;
|
|
4
|
+
var newEditor = editor;
|
|
5
|
+
newEditor.insertData = function (data) {
|
|
6
|
+
var htmlContent = data.getData('text/html') || '';
|
|
7
|
+
if (htmlContent) {
|
|
8
|
+
var content = deserializeHtml(htmlContent);
|
|
9
|
+
editor.insertFragment(content);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
insertData(data);
|
|
13
|
+
};
|
|
14
|
+
return newEditor;
|
|
15
|
+
};
|
|
16
|
+
export default withHtml;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
import { BLOCKQUOTE } from '../../../constants';
|
|
3
|
+
var blockquoteRule = function blockquoteRule(element, parseChild) {
|
|
4
|
+
var nodeName = element.nodeName,
|
|
5
|
+
childNodes = element.childNodes;
|
|
6
|
+
if (nodeName === 'BLOCKQUOTE') {
|
|
7
|
+
return {
|
|
8
|
+
level: 'level1',
|
|
9
|
+
id: slugid.nice(),
|
|
10
|
+
type: BLOCKQUOTE,
|
|
11
|
+
children: parseChild(childNodes)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return;
|
|
15
|
+
};
|
|
16
|
+
export default blockquoteRule;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
import { CHECK_LIST_ITEM } from '../../../constants';
|
|
3
|
+
var checkListRule = function checkListRule(element, parseChild) {
|
|
4
|
+
var nodeName = element.nodeName;
|
|
5
|
+
if (nodeName === 'INPUT' && element.getAttribute('type') === 'checkbox') {
|
|
6
|
+
return {
|
|
7
|
+
level: 'level1',
|
|
8
|
+
id: slugid.nice(),
|
|
9
|
+
type: CHECK_LIST_ITEM,
|
|
10
|
+
checked: element.getAttribute('checked') !== null,
|
|
11
|
+
children: [{
|
|
12
|
+
level: 'level3',
|
|
13
|
+
id: slugid.nice(),
|
|
14
|
+
text: ''
|
|
15
|
+
}]
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return;
|
|
19
|
+
};
|
|
20
|
+
export default checkListRule;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
import { CODE_BLOCK, CODE_LINE } from '../../../constants';
|
|
3
|
+
var codeBlockRule = function codeBlockRule(element, parseChild) {
|
|
4
|
+
var nodeName = element.nodeName,
|
|
5
|
+
childNodes = element.childNodes;
|
|
6
|
+
if (nodeName === 'PRE') {
|
|
7
|
+
return {
|
|
8
|
+
level: 'level1',
|
|
9
|
+
id: slugid.nice(),
|
|
10
|
+
type: CODE_BLOCK,
|
|
11
|
+
children: parseChild(childNodes)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
if (nodeName === 'CODE' && element.parentElement.nodeName === 'PRE') {
|
|
15
|
+
return {
|
|
16
|
+
level: 'level2',
|
|
17
|
+
id: slugid.nice(),
|
|
18
|
+
type: CODE_LINE,
|
|
19
|
+
children: [{
|
|
20
|
+
level: 'level3',
|
|
21
|
+
id: slugid.nice(),
|
|
22
|
+
text: element.textContent
|
|
23
|
+
}]
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return;
|
|
27
|
+
};
|
|
28
|
+
export default codeBlockRule;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
var HEADER_LIST = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];
|
|
3
|
+
var HEADER_TYPE_MAP = {
|
|
4
|
+
H1: 'header1',
|
|
5
|
+
H2: 'header2',
|
|
6
|
+
H3: 'header3',
|
|
7
|
+
H4: 'header4',
|
|
8
|
+
H5: 'header5',
|
|
9
|
+
H6: 'header6'
|
|
10
|
+
};
|
|
11
|
+
var headerRule = function headerRule(element, parseChild) {
|
|
12
|
+
var nodeName = element.nodeName,
|
|
13
|
+
childNodes = element.childNodes;
|
|
14
|
+
if (nodeName && HEADER_LIST.includes(nodeName)) {
|
|
15
|
+
return {
|
|
16
|
+
level: 'level1',
|
|
17
|
+
id: slugid.nice(),
|
|
18
|
+
type: HEADER_TYPE_MAP[nodeName],
|
|
19
|
+
children: parseChild(childNodes)
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return;
|
|
23
|
+
};
|
|
24
|
+
export default headerRule;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
import { IMAGE } from '../../../constants';
|
|
3
|
+
var imageRule = function imageRule(element, parseChild) {
|
|
4
|
+
var nodeName = element.nodeName;
|
|
5
|
+
if (nodeName === 'IMG') {
|
|
6
|
+
return {
|
|
7
|
+
level: 'level3',
|
|
8
|
+
id: slugid.nice(),
|
|
9
|
+
type: IMAGE,
|
|
10
|
+
data: {
|
|
11
|
+
src: element.getAttribute('src')
|
|
12
|
+
},
|
|
13
|
+
children: [{
|
|
14
|
+
text: '',
|
|
15
|
+
id: slugid.nice()
|
|
16
|
+
}]
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return;
|
|
20
|
+
};
|
|
21
|
+
export default imageRule;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import blockquoteRule from './blockquote';
|
|
2
|
+
import codeBlockRule from './code-block';
|
|
3
|
+
import headerRule from './header';
|
|
4
|
+
import imageRule from './image';
|
|
5
|
+
import linkRule from './link';
|
|
6
|
+
import listRule from './list';
|
|
7
|
+
import paragraphRule from './paragraph';
|
|
8
|
+
import tableRule from './table';
|
|
9
|
+
import textRule from './text';
|
|
10
|
+
var rules = [blockquoteRule, codeBlockRule, headerRule, imageRule, linkRule, listRule, tableRule, paragraphRule, textRule];
|
|
11
|
+
export default rules;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
import { LINK } from '../../../constants';
|
|
3
|
+
var linkRule = function linkRule(element, parseChild) {
|
|
4
|
+
var nodeName = element.nodeName;
|
|
5
|
+
var content = element.textContent || element.getAttribute('title') || element.getAttribute('href');
|
|
6
|
+
if (nodeName === 'A') {
|
|
7
|
+
return {
|
|
8
|
+
level: 'level3',
|
|
9
|
+
id: slugid.nice(),
|
|
10
|
+
type: LINK,
|
|
11
|
+
href: element.getAttribute('href'),
|
|
12
|
+
title: element.getAttribute('title'),
|
|
13
|
+
children: [{
|
|
14
|
+
level: 'level3',
|
|
15
|
+
id: slugid.nice(),
|
|
16
|
+
text: content
|
|
17
|
+
}]
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return;
|
|
21
|
+
};
|
|
22
|
+
export default linkRule;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
import { LIST_ITEM, LIST_LIC, ORDERED_LIST, UNORDERED_LIST } from '../../../constants';
|
|
3
|
+
var PARAGRAPH_TAGS = ['DIV', 'P'];
|
|
4
|
+
var listRule = function listRule(element, parseChild) {
|
|
5
|
+
var nodeName = element.nodeName,
|
|
6
|
+
childNodes = element.childNodes;
|
|
7
|
+
if (nodeName === 'UL') {
|
|
8
|
+
return {
|
|
9
|
+
level: 'level1',
|
|
10
|
+
id: slugid.nice(),
|
|
11
|
+
type: UNORDERED_LIST,
|
|
12
|
+
children: parseChild(childNodes)
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
if (nodeName === 'OL') {
|
|
16
|
+
return {
|
|
17
|
+
level: 'level1',
|
|
18
|
+
id: slugid.nice(),
|
|
19
|
+
type: ORDERED_LIST,
|
|
20
|
+
children: parseChild(childNodes)
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (nodeName === 'LI' && PARAGRAPH_TAGS.includes(element.firstChild.nodeName)) {
|
|
24
|
+
return {
|
|
25
|
+
level: 'level2',
|
|
26
|
+
id: slugid.nice(),
|
|
27
|
+
type: LIST_ITEM,
|
|
28
|
+
children: parseChild(childNodes)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (nodeName === 'LI' && !PARAGRAPH_TAGS.includes(element.firstChild.nodeName)) {
|
|
32
|
+
return {
|
|
33
|
+
level: 'level2',
|
|
34
|
+
id: slugid.nice(),
|
|
35
|
+
type: LIST_ITEM,
|
|
36
|
+
children: [{
|
|
37
|
+
level: 'level3',
|
|
38
|
+
type: LIST_LIC,
|
|
39
|
+
children: parseChild(childNodes)
|
|
40
|
+
}]
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (PARAGRAPH_TAGS.includes(nodeName) && element.parentElement.nodeName === 'LI') {
|
|
44
|
+
return {
|
|
45
|
+
level: 'level3',
|
|
46
|
+
id: slugid.nice(),
|
|
47
|
+
type: LIST_LIC,
|
|
48
|
+
children: parseChild(childNodes)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
};
|
|
53
|
+
export default listRule;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
import { PARAGRAPH } from '../../../constants';
|
|
3
|
+
var paragraphRule = function paragraphRule(element, parseChild) {
|
|
4
|
+
var nodeName = element.nodeName,
|
|
5
|
+
childNodes = element.childNodes;
|
|
6
|
+
if (nodeName === 'P' && element.parentElement.nodeName !== 'LI') {
|
|
7
|
+
return {
|
|
8
|
+
level: 'level1',
|
|
9
|
+
id: slugid.nice(),
|
|
10
|
+
type: PARAGRAPH,
|
|
11
|
+
children: parseChild(childNodes)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return;
|
|
15
|
+
};
|
|
16
|
+
export default paragraphRule;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
import { TABLE, TABLE_CELL, TABLE_ROW } from '../../../constants';
|
|
3
|
+
var tableRule = function tableRule(element, parseChild) {
|
|
4
|
+
var nodeName = element.nodeName,
|
|
5
|
+
childNodes = element.childNodes;
|
|
6
|
+
if (nodeName === 'TABLE') {
|
|
7
|
+
return {
|
|
8
|
+
level: 'level1',
|
|
9
|
+
id: slugid.nice(),
|
|
10
|
+
type: TABLE,
|
|
11
|
+
children: parseChild(childNodes)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
if (nodeName === 'THEAD' || nodeName === 'TBODY') {
|
|
15
|
+
return parseChild(childNodes);
|
|
16
|
+
}
|
|
17
|
+
if (nodeName === 'TR') {
|
|
18
|
+
return {
|
|
19
|
+
level: 'level2',
|
|
20
|
+
id: slugid.nice(),
|
|
21
|
+
type: TABLE_ROW,
|
|
22
|
+
children: parseChild(childNodes)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (nodeName === 'TH' || nodeName === 'TD') {
|
|
26
|
+
return {
|
|
27
|
+
level: 'level3',
|
|
28
|
+
id: slugid.nice(),
|
|
29
|
+
type: TABLE_CELL,
|
|
30
|
+
children: parseChild(childNodes)
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
};
|
|
35
|
+
export default tableRule;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import slugid from 'slugid';
|
|
2
|
+
var textRule = function textRule(element, parseChild) {
|
|
3
|
+
var nodeName = element.nodeName,
|
|
4
|
+
nodeType = element.nodeType;
|
|
5
|
+
if (nodeName === 'SPAN') {
|
|
6
|
+
return {
|
|
7
|
+
level: 'level3',
|
|
8
|
+
id: slugid.nice(),
|
|
9
|
+
text: element.textContent
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
if (nodeName === 'STRONG' || nodeName === 'B') {
|
|
13
|
+
return {
|
|
14
|
+
level: 'level3',
|
|
15
|
+
id: slugid.nice(),
|
|
16
|
+
BOLD: true,
|
|
17
|
+
text: element.textContent
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (nodeName === 'CODE' && element.parentElement.nodeName !== 'PRE') {
|
|
21
|
+
return {
|
|
22
|
+
level: 'level3',
|
|
23
|
+
id: slugid.nice(),
|
|
24
|
+
CODE: true,
|
|
25
|
+
text: element.textContent
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (nodeName === 'DEL') {
|
|
29
|
+
return {
|
|
30
|
+
level: 'level3',
|
|
31
|
+
id: slugid.nice(),
|
|
32
|
+
DELETE: true,
|
|
33
|
+
text: element.textContent
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (nodeName === 'I') {
|
|
37
|
+
return {
|
|
38
|
+
level: 'level3',
|
|
39
|
+
id: slugid.nice(),
|
|
40
|
+
ITALIC: true,
|
|
41
|
+
text: element.textContent
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (nodeName === 'INS') {
|
|
45
|
+
return {
|
|
46
|
+
level: 'level3',
|
|
47
|
+
id: slugid.nice(),
|
|
48
|
+
ADD: true,
|
|
49
|
+
text: element.textContent
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (nodeType === 3) {
|
|
53
|
+
return {
|
|
54
|
+
level: 'level3',
|
|
55
|
+
id: slugid.nice(),
|
|
56
|
+
text: element.textContent
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return;
|
|
60
|
+
};
|
|
61
|
+
export default textRule;
|
|
@@ -8,6 +8,7 @@ import TextPlugin from './text-style';
|
|
|
8
8
|
import CodeBlockPlugin from './code-block';
|
|
9
9
|
import ImagePlugin from './image';
|
|
10
10
|
import TablePlugin from './table';
|
|
11
|
-
|
|
11
|
+
import HtmlPlugin from './html';
|
|
12
|
+
var Plugins = [MarkDownPlugin, HeaderPlugin, LinkPlugin, BlockquotePlugin, ListPlugin, CheckListPlugin, CodeBlockPlugin, ImagePlugin, TablePlugin, TextPlugin, HtmlPlugin];
|
|
12
13
|
export default Plugins;
|
|
13
|
-
export { MarkDownPlugin, HeaderPlugin, LinkPlugin, BlockquotePlugin, ListPlugin, CheckListPlugin,
|
|
14
|
+
export { MarkDownPlugin, HeaderPlugin, LinkPlugin, BlockquotePlugin, ListPlugin, CheckListPlugin, CodeBlockPlugin, ImagePlugin, TablePlugin, TextPlugin, HtmlPlugin };
|
|
@@ -259,8 +259,9 @@ var withTable = function withTable(editor) {
|
|
|
259
259
|
deleteBackward(unit);
|
|
260
260
|
};
|
|
261
261
|
newEditor.deleteForward = function (unit) {
|
|
262
|
-
var
|
|
263
|
-
|
|
262
|
+
var nextNode = Editor.next(newEditor);
|
|
263
|
+
var newNodeParent = getParentNode(newEditor.children, nextNode[0].id);
|
|
264
|
+
if (newNodeParent.type === ELEMENT_TYPE.TABLE_CELL) return;
|
|
264
265
|
deleteForward(unit);
|
|
265
266
|
};
|
|
266
267
|
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
2
|
-
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
3
|
-
import _inherits from "@babel/runtime/helpers/esm/inherits";
|
|
4
|
-
import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
|
5
1
|
import React from 'react';
|
|
6
2
|
import { ORDERED_LIST, UNORDERED_LIST } from '../constants';
|
|
7
3
|
import { MenuGroup } from '../menu';
|
|
@@ -15,47 +11,36 @@ import TextStyleMenuList from '../plugins/text-style/menu';
|
|
|
15
11
|
import CodeBlockMenu from '../plugins/code-block/menu';
|
|
16
12
|
import HistoryMenu from './redo-undo';
|
|
17
13
|
import { TableMenu, ActiveTableMenu } from '../plugins/table/menu';
|
|
18
|
-
var Toolbar =
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}), /*#__PURE__*/React.createElement(TableMenu, {
|
|
51
|
-
editor: this.props.editor
|
|
52
|
-
})), /*#__PURE__*/React.createElement(ActiveTableMenu, {
|
|
53
|
-
editor: this.props.editor
|
|
54
|
-
}), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(ImageMenu, {
|
|
55
|
-
editor: this.props.editor
|
|
56
|
-
})));
|
|
57
|
-
}
|
|
58
|
-
}]);
|
|
59
|
-
return Toolbar;
|
|
60
|
-
}(React.Component);
|
|
14
|
+
var Toolbar = function Toolbar(_ref) {
|
|
15
|
+
var editor = _ref.editor;
|
|
16
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
17
|
+
className: "sdoc-editor-toolbar"
|
|
18
|
+
}, /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(HistoryMenu, {
|
|
19
|
+
editor: editor
|
|
20
|
+
})), /*#__PURE__*/React.createElement(HeaderMenu, {
|
|
21
|
+
editor: editor
|
|
22
|
+
}), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(TextStyleMenuList, {
|
|
23
|
+
editor: editor
|
|
24
|
+
}), /*#__PURE__*/React.createElement(LinkMenu, {
|
|
25
|
+
editor: editor
|
|
26
|
+
})), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(QuoteMenu, {
|
|
27
|
+
editor: editor
|
|
28
|
+
}), /*#__PURE__*/React.createElement(ListMenu, {
|
|
29
|
+
editor: editor,
|
|
30
|
+
type: UNORDERED_LIST
|
|
31
|
+
}), /*#__PURE__*/React.createElement(ListMenu, {
|
|
32
|
+
editor: editor,
|
|
33
|
+
type: ORDERED_LIST
|
|
34
|
+
}), /*#__PURE__*/React.createElement(CheckListMenu, {
|
|
35
|
+
editor: editor
|
|
36
|
+
})), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(CodeBlockMenu, {
|
|
37
|
+
editor: editor
|
|
38
|
+
}), /*#__PURE__*/React.createElement(TableMenu, {
|
|
39
|
+
editor: editor
|
|
40
|
+
})), /*#__PURE__*/React.createElement(ActiveTableMenu, {
|
|
41
|
+
editor: editor
|
|
42
|
+
}), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(ImageMenu, {
|
|
43
|
+
editor: editor
|
|
44
|
+
})));
|
|
45
|
+
};
|
|
61
46
|
export default Toolbar;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.55",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "This is a sdoc editor",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -13,14 +13,15 @@
|
|
|
13
13
|
"ahooks": "3.7.7",
|
|
14
14
|
"classnames": "2.3.2",
|
|
15
15
|
"deep-copy": "1.4.2",
|
|
16
|
-
"lodash.throttle": "4.1.1",
|
|
17
16
|
"is-hotkey": "0.2.0",
|
|
18
17
|
"is-url": "^1.2.4",
|
|
18
|
+
"lodash.throttle": "4.1.1",
|
|
19
19
|
"randomcolor": "0.6.2",
|
|
20
20
|
"react-cookies": "0.1.1",
|
|
21
21
|
"reactstrap": "8.9.0",
|
|
22
22
|
"slugid": "3.2.0",
|
|
23
23
|
"socket.io-client": "4.6.1",
|
|
24
|
+
"type-of": "2.0.1",
|
|
24
25
|
"url-join": "4.0.1",
|
|
25
26
|
"url-parse": "1.5.10",
|
|
26
27
|
"uuid": "9.0.0"
|