@seafile/sdoc-editor 0.1.5 → 0.1.7
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/api/sdoc-server-api.js +53 -0
- package/dist/assets/css/custom-editor.css +28 -0
- package/dist/basic-sdk/assets/css/code-block.css +22 -0
- package/dist/{assets/css/sdoc-editor.css → basic-sdk/assets/css/layout.css} +4 -4
- package/dist/basic-sdk/assets/css/sdoc-editor-plugins.css +10 -0
- package/dist/{assets → basic-sdk/assets}/css/sdoc-editor-toolbar.css +1 -1
- package/dist/{editor.js → basic-sdk/editor.js} +15 -7
- package/dist/{extension → basic-sdk/extension}/constants/index.js +18 -2
- package/dist/{extension → basic-sdk/extension}/core/queries/index.js +13 -0
- package/dist/{extension → basic-sdk/extension}/menu/menu-item.js +1 -1
- package/dist/{extension → basic-sdk/extension}/plugins/check-list/helpers.js +1 -1
- package/dist/basic-sdk/extension/plugins/code-block/helpers.js +106 -0
- package/dist/basic-sdk/extension/plugins/code-block/index.js +12 -0
- package/dist/basic-sdk/extension/plugins/code-block/menu/index.js +65 -0
- package/dist/basic-sdk/extension/plugins/code-block/plugin.js +89 -0
- package/dist/basic-sdk/extension/plugins/code-block/render-elem.js +107 -0
- package/dist/{extension → basic-sdk/extension}/plugins/header/helpers.js +3 -3
- package/dist/{extension → basic-sdk/extension}/plugins/index.js +3 -2
- package/dist/{extension → basic-sdk/extension}/plugins/link/helpers.js +1 -1
- package/dist/{extension → basic-sdk/extension}/plugins/list/helpers.js +1 -1
- package/dist/{extension → basic-sdk/extension}/plugins/list/render-elem.js +1 -1
- package/dist/basic-sdk/extension/plugins/text-style/helpers.js +52 -0
- package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +81 -0
- package/dist/basic-sdk/extension/plugins/text-style/model.js +11 -0
- package/dist/{extension → basic-sdk/extension}/render/render-element.js +8 -2
- package/dist/{extension → basic-sdk/extension}/toolbar/index.js +8 -2
- package/dist/basic-sdk/index.js +3 -0
- package/dist/{socket → basic-sdk/socket}/socket-client.js +9 -3
- package/dist/{socket → basic-sdk/socket}/socket-manager.js +6 -1
- package/dist/{viewer.js → basic-sdk/viewer.js} +8 -5
- package/dist/components/loading/index.js +26 -0
- package/dist/components/loading/style.css +49 -0
- package/dist/context.js +162 -0
- package/dist/index.js +4 -3
- package/dist/layout/content.js +30 -0
- package/dist/layout/header.js +30 -0
- package/dist/layout/index.js +6 -0
- package/dist/layout/layout.css +33 -0
- package/dist/layout/layout.js +30 -0
- package/dist/pages/simple-editor.js +123 -0
- package/dist/pages/simple-viewer.js +106 -0
- package/dist/utils/index.js +21 -0
- package/package.json +3 -1
- /package/dist/{assets → basic-sdk/assets}/css/textlink-hovermenu.css +0 -0
- /package/dist/{extension → basic-sdk/extension}/core/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/core/transforms/focus-editor.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/core/transforms/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/core/transforms/move-children.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/core/transforms/remove-node-children.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/core/utils/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/menu/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/menu/menu-group.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/menu/menu.css +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/blockquote/helpers.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/blockquote/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/blockquote/menu/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/blockquote/model.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/blockquote/plugin.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/blockquote/render-elem.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/check-list/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/check-list/menu/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/check-list/model.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/check-list/plugin.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/check-list/render-elem.js +0 -0
- /package/dist/{extension/plugins/text-style → basic-sdk/extension/plugins/code-block}/model.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/header/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/header/menu/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/header/plugin.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/header/render-elem.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/link/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/link/menu/add-link-dialog.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/link/menu/hover-link-dialog.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/link/menu/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/link/model.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/link/plugin.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/link/render-elem.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/menu/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/model.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/plugin/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/plugin/insert-break-list.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/plugin/normalize-list.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/plugin/on-tab-handle.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/queries/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/insert-list-item.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/move-list-item-down.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/move-list-item-up.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/move-list-items-to-list.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/move-list-items.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/normalize-list-item.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/normalize-nested-list.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/remove-first-list-item.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/toggle-list.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/list/transforms/unwrap-list.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/text-style/index.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/plugins/text-style/render-elem.js +0 -0
- /package/dist/{extension → basic-sdk/extension}/render/render-leaf.js +0 -0
- /package/dist/{node-id → basic-sdk/node-id}/constants.js +0 -0
- /package/dist/{node-id → basic-sdk/node-id}/helpers.js +0 -0
- /package/dist/{node-id → basic-sdk/node-id}/index.js +0 -0
- /package/dist/{socket → basic-sdk/socket}/helpers.js +0 -0
- /package/dist/{socket → basic-sdk/socket}/index.js +0 -0
- /package/dist/{socket → basic-sdk/socket}/with-socket-io.js +0 -0
- /package/dist/{utils → basic-sdk/utils}/debug.js +0 -0
- /package/dist/{utils → basic-sdk/utils}/event-bus.js +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
2
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
3
|
+
import axios from 'axios';
|
|
4
|
+
var SDocServerApi = /*#__PURE__*/function () {
|
|
5
|
+
function SDocServerApi(options) {
|
|
6
|
+
_classCallCheck(this, SDocServerApi);
|
|
7
|
+
if (!options.docUuid) {
|
|
8
|
+
throw new Error('settings has no docUuid');
|
|
9
|
+
}
|
|
10
|
+
if (!options.sdocServer) {
|
|
11
|
+
throw new Error('settings has no sdocServer');
|
|
12
|
+
}
|
|
13
|
+
if (!options.accessToken) {
|
|
14
|
+
throw new Error('settings has no accessToken');
|
|
15
|
+
}
|
|
16
|
+
this.server = options.sdocServer;
|
|
17
|
+
this.docUuid = options.docUuid;
|
|
18
|
+
this.accessToken = options.accessToken;
|
|
19
|
+
}
|
|
20
|
+
_createClass(SDocServerApi, [{
|
|
21
|
+
key: "getDocContent",
|
|
22
|
+
value: function getDocContent(docPath, docName) {
|
|
23
|
+
var server = this.server,
|
|
24
|
+
docUuid = this.docUuid,
|
|
25
|
+
accessToken = this.accessToken;
|
|
26
|
+
var url = "".concat(server, "/api/v1/docs/").concat(docUuid, "/?doc_path=").concat(encodeURIComponent(docPath), "&doc_name=").concat(encodeURIComponent(docName));
|
|
27
|
+
return axios.get(url, {
|
|
28
|
+
headers: {
|
|
29
|
+
Authorization: "Token ".concat(accessToken)
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}, {
|
|
34
|
+
key: "saveDocContent",
|
|
35
|
+
value: function saveDocContent(docPath, docName, content) {
|
|
36
|
+
var server = this.server,
|
|
37
|
+
docUuid = this.docUuid,
|
|
38
|
+
accessToken = this.accessToken;
|
|
39
|
+
var url = "".concat(server, "/api/v1/docs/").concat(docUuid, "/");
|
|
40
|
+
var formData = new FormData();
|
|
41
|
+
formData.append('doc_path', docPath);
|
|
42
|
+
formData.append('doc_name', docName);
|
|
43
|
+
formData.append('doc_content', content);
|
|
44
|
+
return axios.post(url, formData, {
|
|
45
|
+
headers: {
|
|
46
|
+
Authorization: "Token ".concat(accessToken)
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}]);
|
|
51
|
+
return SDocServerApi;
|
|
52
|
+
}();
|
|
53
|
+
export default SDocServerApi;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
html, body {
|
|
2
|
+
height: 100%;
|
|
3
|
+
width: 100%;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
#root {
|
|
7
|
+
height: 100%;
|
|
8
|
+
width: 100%;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.markdown-wrapper {
|
|
12
|
+
flex: 1;
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
min-height: 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.markdown-header {
|
|
19
|
+
display: flex;
|
|
20
|
+
justify-content: flex-end;
|
|
21
|
+
padding: 0 1rem;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.markdown-content {
|
|
25
|
+
flex: 1;
|
|
26
|
+
min-height: 0;
|
|
27
|
+
display: flex;
|
|
28
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
.code-block-container {
|
|
2
|
+
position: relative;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.language-type {
|
|
6
|
+
font-size: 12px;
|
|
7
|
+
position: absolute;
|
|
8
|
+
right: 0;
|
|
9
|
+
top: 0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.language-type select {
|
|
13
|
+
background-color: #eeeeee;
|
|
14
|
+
cursor: pointer;
|
|
15
|
+
appearance: none;
|
|
16
|
+
outline: none;
|
|
17
|
+
-moz-appearance: none;
|
|
18
|
+
-webkit-appearance: none;
|
|
19
|
+
border: none;
|
|
20
|
+
border-radius: 4px;
|
|
21
|
+
padding: 0 5px;
|
|
22
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
padding-inline-start: 24px;
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
-
.
|
|
6
|
+
.sdoc-editor-container {
|
|
7
7
|
flex: 1;
|
|
8
8
|
display: flex;
|
|
9
9
|
flex-direction: column;
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
min-height: 0;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
.
|
|
14
|
+
.sdoc-editor-container .sdoc-editor-toolbar {
|
|
15
15
|
display: flex;
|
|
16
16
|
justify-content: center;
|
|
17
17
|
height: 39px;
|
|
@@ -23,13 +23,13 @@
|
|
|
23
23
|
box-shadow: 0 3px 2px -2px rgb(200 200 200 / 15%)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
.
|
|
26
|
+
.sdoc-editor-container .sdoc-editor-content {
|
|
27
27
|
flex: 1;
|
|
28
28
|
height: 100%;
|
|
29
29
|
overflow: auto;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
.
|
|
32
|
+
.sdoc-editor-container .sdoc-editor-content .article {
|
|
33
33
|
max-width: 950px;
|
|
34
34
|
min-height: calc(100% - 40px);
|
|
35
35
|
margin: 20px auto;
|
|
@@ -8,7 +8,8 @@ import isHotkey from 'is-hotkey';
|
|
|
8
8
|
import editor, { renderLeaf as _renderLeaf, renderElement as _renderElement, Toolbar } from './extension';
|
|
9
9
|
import { SocketManager, withSocketIO } from './socket';
|
|
10
10
|
import withNodeId from './node-id';
|
|
11
|
-
import './assets/css/
|
|
11
|
+
import './assets/css/layout.css';
|
|
12
|
+
import './assets/css/sdoc-editor-plugins.css';
|
|
12
13
|
var SDocEditor = /*#__PURE__*/function (_React$Component) {
|
|
13
14
|
_inherits(SDocEditor, _React$Component);
|
|
14
15
|
var _super = _createSuper(SDocEditor);
|
|
@@ -16,6 +17,9 @@ var SDocEditor = /*#__PURE__*/function (_React$Component) {
|
|
|
16
17
|
var _this;
|
|
17
18
|
_classCallCheck(this, SDocEditor);
|
|
18
19
|
_this = _super.call(this, props);
|
|
20
|
+
_this.getSocketManager = function () {
|
|
21
|
+
return _this.socketManager;
|
|
22
|
+
};
|
|
19
23
|
_this.onChange = function (slateValue) {
|
|
20
24
|
var onValueChanged = _this.props.onValueChanged;
|
|
21
25
|
_this.setState({
|
|
@@ -47,25 +51,29 @@ var SDocEditor = /*#__PURE__*/function (_React$Component) {
|
|
|
47
51
|
this.socketManager = SocketManager.getInstance(this.editor, document, config);
|
|
48
52
|
}
|
|
49
53
|
}
|
|
54
|
+
}, {
|
|
55
|
+
key: "componentWillUnmount",
|
|
56
|
+
value: function componentWillUnmount() {
|
|
57
|
+
this.socketManager.closeSocketConnect();
|
|
58
|
+
this.socketManager = null;
|
|
59
|
+
}
|
|
50
60
|
}, {
|
|
51
61
|
key: "render",
|
|
52
62
|
value: function render() {
|
|
53
63
|
var _this2 = this;
|
|
54
|
-
var
|
|
55
|
-
slateValue = _this$state.slateValue,
|
|
56
|
-
isEditorBlur = _this$state.isEditorBlur;
|
|
64
|
+
var slateValue = this.state.slateValue;
|
|
57
65
|
return /*#__PURE__*/React.createElement("div", {
|
|
58
|
-
className: "
|
|
66
|
+
className: "sdoc-editor-container"
|
|
59
67
|
}, /*#__PURE__*/React.createElement(Toolbar, {
|
|
60
68
|
editor: this.editor
|
|
61
69
|
}), /*#__PURE__*/React.createElement("div", {
|
|
62
|
-
className: "
|
|
70
|
+
className: "sdoc-editor-content"
|
|
63
71
|
}, /*#__PURE__*/React.createElement(Slate, {
|
|
64
72
|
editor: this.editor,
|
|
65
73
|
value: slateValue,
|
|
66
74
|
onChange: this.onChange
|
|
67
75
|
}, /*#__PURE__*/React.createElement("div", {
|
|
68
|
-
className: "
|
|
76
|
+
className: "article"
|
|
69
77
|
}, /*#__PURE__*/React.createElement(Editable, {
|
|
70
78
|
placeholder: "Enter some text...",
|
|
71
79
|
renderElement: function renderElement(props) {
|
|
@@ -2,7 +2,8 @@ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
|
2
2
|
var _MENUS_CONFIG_MAP, _HEADER_TITLE_MAP;
|
|
3
3
|
// extension plugin
|
|
4
4
|
export var BLOCKQUOTE = 'blockquote';
|
|
5
|
-
export var
|
|
5
|
+
export var BOLD = 'blod';
|
|
6
|
+
export var ITALIC = 'italic';
|
|
6
7
|
export var HEADER = 'header';
|
|
7
8
|
export var HEADER1 = 'header1';
|
|
8
9
|
export var HEADER2 = 'header2';
|
|
@@ -27,6 +28,7 @@ export var TABLE_CELL = 'table-cell';
|
|
|
27
28
|
export var TABLE_ROW = 'table-row';
|
|
28
29
|
export var FORMULA = 'formula';
|
|
29
30
|
export var COLUMN = 'column';
|
|
31
|
+
export var TEXTSTYLE = 'text-style';
|
|
30
32
|
|
|
31
33
|
// menus config
|
|
32
34
|
export var MENUS_CONFIG_MAP = (_MENUS_CONFIG_MAP = {}, _defineProperty(_MENUS_CONFIG_MAP, BLOCKQUOTE, {
|
|
@@ -45,9 +47,23 @@ export var MENUS_CONFIG_MAP = (_MENUS_CONFIG_MAP = {}, _defineProperty(_MENUS_CO
|
|
|
45
47
|
id: CHECK_LIST,
|
|
46
48
|
iconClass: 'iconfont icon-check-square',
|
|
47
49
|
text: 'check_list_item'
|
|
50
|
+
}), _defineProperty(_MENUS_CONFIG_MAP, CODE_BLOCK, {
|
|
51
|
+
id: CODE_BLOCK,
|
|
52
|
+
iconClass: 'iconfont icon-code-block',
|
|
53
|
+
text: 'code-block'
|
|
48
54
|
}), _defineProperty(_MENUS_CONFIG_MAP, LINK, {
|
|
49
55
|
id: LINK,
|
|
50
56
|
iconClass: 'iconfont icon-link',
|
|
51
57
|
text: 'link'
|
|
52
|
-
}), _MENUS_CONFIG_MAP
|
|
58
|
+
}), _defineProperty(_MENUS_CONFIG_MAP, TEXTSTYLE, [{
|
|
59
|
+
id: ITALIC,
|
|
60
|
+
iconClass: 'iconfont icon-italic',
|
|
61
|
+
text: 'italic',
|
|
62
|
+
type: 'ITALIC'
|
|
63
|
+
}, {
|
|
64
|
+
id: BOLD,
|
|
65
|
+
iconClass: 'iconfont icon-bold',
|
|
66
|
+
text: 'bold',
|
|
67
|
+
type: 'BOLD'
|
|
68
|
+
}]), _MENUS_CONFIG_MAP);
|
|
53
69
|
export var HEADER_TITLE_MAP = (_HEADER_TITLE_MAP = {}, _defineProperty(_HEADER_TITLE_MAP, HEADER1, 'header_1'), _defineProperty(_HEADER_TITLE_MAP, HEADER2, 'header_2'), _defineProperty(_HEADER_TITLE_MAP, HEADER3, 'header_3'), _defineProperty(_HEADER_TITLE_MAP, HEADER4, 'header_4'), _defineProperty(_HEADER_TITLE_MAP, HEADER5, 'header_5'), _defineProperty(_HEADER_TITLE_MAP, HEADER6, 'header_6'), _defineProperty(_HEADER_TITLE_MAP, PARAGRAPH, 'paragraph'), _HEADER_TITLE_MAP);
|
|
@@ -153,6 +153,14 @@ export var getSelectedElems = function getSelectedElems(editor) {
|
|
|
153
153
|
}
|
|
154
154
|
return elems;
|
|
155
155
|
};
|
|
156
|
+
export var genEmptyParagraph = function genEmptyParagraph() {
|
|
157
|
+
return {
|
|
158
|
+
type: 'paragraph',
|
|
159
|
+
children: [{
|
|
160
|
+
text: ''
|
|
161
|
+
}]
|
|
162
|
+
};
|
|
163
|
+
};
|
|
156
164
|
|
|
157
165
|
// siblings
|
|
158
166
|
export var getNextSiblingNodes = function getNextSiblingNodes(ancestorEntry, path) {
|
|
@@ -324,4 +332,9 @@ export var isSelectionAtBlockStart = function isSelectionAtBlockStart(editor, op
|
|
|
324
332
|
var path = (_getAboveBlockNode2 = getAboveBlockNode(editor, options)) === null || _getAboveBlockNode2 === void 0 ? void 0 : _getAboveBlockNode2[1];
|
|
325
333
|
if (!path) return false;
|
|
326
334
|
return isStartPoint(editor, selection.focus, path) || Range.isExpanded(editor.selection) && isStartPoint(editor, selection.anchor, path);
|
|
335
|
+
};
|
|
336
|
+
export var isLastNode = function isLastNode(editor, node) {
|
|
337
|
+
var editorChildren = editor.children || [];
|
|
338
|
+
var editorChildrenLength = editorChildren.length;
|
|
339
|
+
return editorChildren[editorChildrenLength - 1] === node;
|
|
327
340
|
};
|
|
@@ -13,7 +13,7 @@ var MenuItem = /*#__PURE__*/function (_React$Component) {
|
|
|
13
13
|
_this = _super.call(this, props);
|
|
14
14
|
_this.onMouseDown = function (event) {
|
|
15
15
|
if (_this.props.disabled) return;
|
|
16
|
-
_this.props.onMouseDown(event);
|
|
16
|
+
_this.props.onMouseDown(event, _this.props.type);
|
|
17
17
|
};
|
|
18
18
|
_this.onClick = function (event) {
|
|
19
19
|
event.stopPropagation();
|
|
@@ -26,7 +26,7 @@ export var isMenuDisabled = function isMenuDisabled(editor) {
|
|
|
26
26
|
var notMatch = selectedElements.some(function (element) {
|
|
27
27
|
if (Editor.isVoid(editor, element) && Editor.isBlock(editor, element)) return true;
|
|
28
28
|
var type = element.type;
|
|
29
|
-
if (['
|
|
29
|
+
if (['code-line', 'code-block', 'list-item'].includes(type)) return true;
|
|
30
30
|
return false;
|
|
31
31
|
});
|
|
32
32
|
if (notMatch) return true;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
|
|
3
|
+
import { Transforms, Editor, Node } from '@seafile/slate';
|
|
4
|
+
import { CODE_BLOCK, PARAGRAPH } from '../../constants';
|
|
5
|
+
import { getNodeType, getSelectedNodeByType, getSelectedElems } from '../../core';
|
|
6
|
+
export var isMenuDisabled = function isMenuDisabled(editor) {
|
|
7
|
+
var selection = editor.selection;
|
|
8
|
+
if (selection == null) return true;
|
|
9
|
+
var selectedElems = getSelectedElems(editor);
|
|
10
|
+
var hasVoid = selectedElems.some(function (elem) {
|
|
11
|
+
return editor.isVoid(elem);
|
|
12
|
+
});
|
|
13
|
+
if (hasVoid) return true;
|
|
14
|
+
var isMatch = selectedElems.some(function (elem) {
|
|
15
|
+
var type = getNodeType(elem);
|
|
16
|
+
if (type === CODE_BLOCK || type === PARAGRAPH) return true;
|
|
17
|
+
return false;
|
|
18
|
+
});
|
|
19
|
+
if (isMatch) return false; // enable
|
|
20
|
+
return true; // disable
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export var getSelectCodeElem = function getSelectCodeElem(editor) {
|
|
24
|
+
var codeNode = getSelectedNodeByType(editor, CODE_BLOCK);
|
|
25
|
+
if (codeNode == null) return null;
|
|
26
|
+
return codeNode;
|
|
27
|
+
};
|
|
28
|
+
export var updateLanguageSetting = function updateLanguageSetting(editor, language) {
|
|
29
|
+
Transforms.setNodes(editor, {
|
|
30
|
+
language: language
|
|
31
|
+
}, {
|
|
32
|
+
mode: 'highest'
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
export var changeToCodeBlock = function changeToCodeBlock(editor, language) {
|
|
36
|
+
// Summarizes the strings for the selected highest-level node
|
|
37
|
+
var strArr = [];
|
|
38
|
+
var nodeEntries = Editor.nodes(editor, {
|
|
39
|
+
match: function match(n) {
|
|
40
|
+
return editor.children.includes(n);
|
|
41
|
+
},
|
|
42
|
+
// Matches the selected node at the highest level
|
|
43
|
+
universal: true
|
|
44
|
+
});
|
|
45
|
+
var _iterator = _createForOfIteratorHelper(nodeEntries),
|
|
46
|
+
_step;
|
|
47
|
+
try {
|
|
48
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
49
|
+
var nodeEntry = _step.value;
|
|
50
|
+
var _nodeEntry = _slicedToArray(nodeEntry, 1),
|
|
51
|
+
n = _nodeEntry[0];
|
|
52
|
+
if (n) strArr.push(Node.string(n));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Deletes the selected node at the highest level
|
|
56
|
+
} catch (err) {
|
|
57
|
+
_iterator.e(err);
|
|
58
|
+
} finally {
|
|
59
|
+
_iterator.f();
|
|
60
|
+
}
|
|
61
|
+
Transforms.removeNodes(editor, {
|
|
62
|
+
mode: 'highest'
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// Insert the codeBlockNode node
|
|
66
|
+
var newCodeBlockNode = {
|
|
67
|
+
type: CODE_BLOCK,
|
|
68
|
+
children: [{
|
|
69
|
+
type: 'code-line',
|
|
70
|
+
children: [{
|
|
71
|
+
text: strArr.join('\n')
|
|
72
|
+
} // Select the plain text of the node
|
|
73
|
+
]
|
|
74
|
+
}],
|
|
75
|
+
|
|
76
|
+
language: language
|
|
77
|
+
};
|
|
78
|
+
Transforms.insertNodes(editor, newCodeBlockNode, {
|
|
79
|
+
mode: 'highest'
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
export var changeToPlainText = function changeToPlainText(editor) {
|
|
83
|
+
var elem = getSelectCodeElem(editor);
|
|
84
|
+
if (elem == null) return;
|
|
85
|
+
|
|
86
|
+
// Get code text
|
|
87
|
+
var str = Node.string(elem);
|
|
88
|
+
|
|
89
|
+
// Delete the highest level node, -> "the code-block node"
|
|
90
|
+
Transforms.removeNodes(editor, {
|
|
91
|
+
mode: 'highest'
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// Insert p node
|
|
95
|
+
var pList = str.split('\n').map(function (s) {
|
|
96
|
+
return {
|
|
97
|
+
type: 'paragraph',
|
|
98
|
+
children: [{
|
|
99
|
+
text: s
|
|
100
|
+
}]
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
Transforms.insertNodes(editor, pList, {
|
|
104
|
+
mode: 'highest'
|
|
105
|
+
});
|
|
106
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CODE_BLOCK } from '../../constants';
|
|
2
|
+
import CodeBlockMenu from './menu';
|
|
3
|
+
import withCodeBlock from './plugin';
|
|
4
|
+
import { renderCodeBlock } from './render-elem';
|
|
5
|
+
var CodeBlockPlugin = {
|
|
6
|
+
type: CODE_BLOCK,
|
|
7
|
+
nodeType: 'element',
|
|
8
|
+
editorMenus: [CodeBlockMenu],
|
|
9
|
+
editorPlugin: withCodeBlock,
|
|
10
|
+
renderElements: [renderCodeBlock]
|
|
11
|
+
};
|
|
12
|
+
export default CodeBlockPlugin;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
3
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
4
|
+
import _inherits from "@babel/runtime/helpers/esm/inherits";
|
|
5
|
+
import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import { focusEditor } from '../../../core';
|
|
8
|
+
import { CODE_BLOCK, MENUS_CONFIG_MAP } from '../../../constants';
|
|
9
|
+
import { MenuItem } from '../../../menu';
|
|
10
|
+
import { getSelectCodeElem, isMenuDisabled, changeToCodeBlock, changeToPlainText } from '../helpers';
|
|
11
|
+
var CodeBlockMenu = /*#__PURE__*/function (_React$Component) {
|
|
12
|
+
_inherits(CodeBlockMenu, _React$Component);
|
|
13
|
+
var _super = _createSuper(CodeBlockMenu);
|
|
14
|
+
function CodeBlockMenu() {
|
|
15
|
+
var _this;
|
|
16
|
+
_classCallCheck(this, CodeBlockMenu);
|
|
17
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
18
|
+
args[_key] = arguments[_key];
|
|
19
|
+
}
|
|
20
|
+
_this = _super.call.apply(_super, [this].concat(args));
|
|
21
|
+
_this.isActive = function () {
|
|
22
|
+
var editor = _this.props.editor;
|
|
23
|
+
var elem = getSelectCodeElem(editor);
|
|
24
|
+
return !!elem;
|
|
25
|
+
};
|
|
26
|
+
_this.isDisabled = function () {
|
|
27
|
+
return isMenuDisabled(_this.props.editor);
|
|
28
|
+
};
|
|
29
|
+
_this.onMouseDown = function (e) {
|
|
30
|
+
e.preventDefault();
|
|
31
|
+
e.stopPropagation();
|
|
32
|
+
var editor = _this.props.editor;
|
|
33
|
+
var active = _this.isActive(editor);
|
|
34
|
+
if (active) {
|
|
35
|
+
// It is currently in a code-block and needs to be converted to plain text
|
|
36
|
+
changeToPlainText(editor);
|
|
37
|
+
} else {
|
|
38
|
+
// It is not currently in code-block, so it needs to be converted to code-block
|
|
39
|
+
changeToCodeBlock(editor, 'text');
|
|
40
|
+
}
|
|
41
|
+
focusEditor(editor);
|
|
42
|
+
};
|
|
43
|
+
return _this;
|
|
44
|
+
}
|
|
45
|
+
_createClass(CodeBlockMenu, [{
|
|
46
|
+
key: "render",
|
|
47
|
+
value: function render() {
|
|
48
|
+
var _this$props = this.props,
|
|
49
|
+
isRichEditor = _this$props.isRichEditor,
|
|
50
|
+
className = _this$props.className;
|
|
51
|
+
var menuConfig = MENUS_CONFIG_MAP[CODE_BLOCK];
|
|
52
|
+
var props = _objectSpread(_objectSpread({
|
|
53
|
+
isRichEditor: isRichEditor,
|
|
54
|
+
className: className
|
|
55
|
+
}, menuConfig), {}, {
|
|
56
|
+
disabled: this.isDisabled(),
|
|
57
|
+
isActive: this.isActive(),
|
|
58
|
+
onMouseDown: this.onMouseDown
|
|
59
|
+
});
|
|
60
|
+
return /*#__PURE__*/React.createElement(MenuItem, props);
|
|
61
|
+
}
|
|
62
|
+
}]);
|
|
63
|
+
return CodeBlockMenu;
|
|
64
|
+
}(React.Component);
|
|
65
|
+
export default CodeBlockMenu;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import { Editor, Transforms, Node } from '@seafile/slate';
|
|
3
|
+
import { getSelectedNodeByType, getNodeType, isLastNode, genEmptyParagraph } from '../../core';
|
|
4
|
+
import { CODE_BLOCK } from '../../constants';
|
|
5
|
+
var getLastTextLineBeforeSelection = function getLastTextLineBeforeSelection(codeNode, editor) {
|
|
6
|
+
var selection = editor.selection;
|
|
7
|
+
if (selection == null) return '';
|
|
8
|
+
var codeText = Node.string(codeNode);
|
|
9
|
+
var anchorOffset = selection.anchor.offset;
|
|
10
|
+
var textBeforeAnchor = codeText.slice(0, anchorOffset); // The text before the selection
|
|
11
|
+
var arr = textBeforeAnchor.split('\n'); // text before selection, split by line break
|
|
12
|
+
var length = arr.length;
|
|
13
|
+
if (length === 0) return '';
|
|
14
|
+
return arr[length - 1];
|
|
15
|
+
};
|
|
16
|
+
var withCodeBlock = function withCodeBlock(editor) {
|
|
17
|
+
var insertBreak = editor.insertBreak,
|
|
18
|
+
normalizeNode = editor.normalizeNode,
|
|
19
|
+
insertData = editor.insertData;
|
|
20
|
+
var newEditor = editor;
|
|
21
|
+
|
|
22
|
+
// Rewrite insertBreak
|
|
23
|
+
newEditor.insertBreak = function () {
|
|
24
|
+
var codeNode = getSelectedNodeByType(newEditor, CODE_BLOCK);
|
|
25
|
+
if (codeNode == null) {
|
|
26
|
+
insertBreak(); // Perform the default line feed
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// When press Enter, the space is automatically inserted according to the space in the current line
|
|
31
|
+
var lastLineBeforeSelection = getLastTextLineBeforeSelection(codeNode, newEditor);
|
|
32
|
+
if (lastLineBeforeSelection) {
|
|
33
|
+
var arr = lastLineBeforeSelection.match(/^\s+/); // The space at the beginning of a line
|
|
34
|
+
if (arr != null && arr[0] != null) {
|
|
35
|
+
var spaces = arr[0];
|
|
36
|
+
newEditor.insertText("\n".concat(spaces)); // Insert a space after a newline
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Normal line feed
|
|
42
|
+
newEditor.insertText('\n');
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Rewrite normalizeNode
|
|
46
|
+
newEditor.normalizeNode = function (_ref) {
|
|
47
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
48
|
+
node = _ref2[0],
|
|
49
|
+
path = _ref2[1];
|
|
50
|
+
var type = getNodeType(node);
|
|
51
|
+
if (type === CODE_BLOCK) {
|
|
52
|
+
// code-block is the last node in the editor and needs to be followed by a p node
|
|
53
|
+
var isLast = isLastNode(newEditor, node);
|
|
54
|
+
if (isLast) {
|
|
55
|
+
Transforms.insertNodes(newEditor, genEmptyParagraph(), {
|
|
56
|
+
at: [path[0] + 1]
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// There must be a code node below code-block
|
|
61
|
+
if (getNodeType(node.children[0]) !== 'code-line') {
|
|
62
|
+
Transforms.unwrapNodes(newEditor);
|
|
63
|
+
Transforms.setNodes(newEditor, {
|
|
64
|
+
type: 'paragraph'
|
|
65
|
+
}, {
|
|
66
|
+
mode: 'highest'
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Perform default behavior
|
|
72
|
+
return normalizeNode([node, path]);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Rewrite insertData - Paste text
|
|
76
|
+
newEditor.insertData = function (data) {
|
|
77
|
+
var codeNode = getSelectedNodeByType(newEditor, CODE_BLOCK);
|
|
78
|
+
if (codeNode == null) {
|
|
79
|
+
insertData(data); // Perform default insertData
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Gets the text and inserts it into the code block
|
|
84
|
+
var text = data.getData('text/plain');
|
|
85
|
+
Editor.insertText(newEditor, text);
|
|
86
|
+
};
|
|
87
|
+
return newEditor;
|
|
88
|
+
};
|
|
89
|
+
export default withCodeBlock;
|