@seafile/sdoc-editor 0.1.54 → 0.1.56

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.
@@ -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,6 @@
1
+ import withHtml from './plugin';
2
+ var HtmlPlugin = {
3
+ type: 'html',
4
+ editorPlugin: withHtml
5
+ };
6
+ export default HtmlPlugin;
@@ -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
- var Plugins = [MarkDownPlugin, HeaderPlugin, LinkPlugin, BlockquotePlugin, ListPlugin, CheckListPlugin, TextPlugin, CodeBlockPlugin, ImagePlugin, TablePlugin];
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, TextPlugin, CodeBlockPlugin, ImagePlugin, TablePlugin };
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 res = deleteHandler(newEditor);
263
- if (res) return;
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,6 +1,7 @@
1
1
  import withTextStyle from './plugin';
2
- import renderText from "./render-elem";
2
+ import renderText from './render-elem';
3
3
  var TextPlugin = {
4
+ type: 'text',
4
5
  editorPlugin: withTextStyle,
5
6
  renderElements: [renderText]
6
7
  };
@@ -1,8 +1,5 @@
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
- import React from 'react';
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { useEffect, useState } from 'react';
6
3
  import { ORDERED_LIST, UNORDERED_LIST } from '../constants';
7
4
  import { MenuGroup } from '../menu';
8
5
  import QuoteMenu from '../plugins/blockquote/menu';
@@ -15,47 +12,50 @@ import TextStyleMenuList from '../plugins/text-style/menu';
15
12
  import CodeBlockMenu from '../plugins/code-block/menu';
16
13
  import HistoryMenu from './redo-undo';
17
14
  import { TableMenu, ActiveTableMenu } from '../plugins/table/menu';
18
- var Toolbar = /*#__PURE__*/function (_React$Component) {
19
- _inherits(Toolbar, _React$Component);
20
- var _super = _createSuper(Toolbar);
21
- function Toolbar() {
22
- _classCallCheck(this, Toolbar);
23
- return _super.apply(this, arguments);
24
- }
25
- _createClass(Toolbar, [{
26
- key: "render",
27
- value: function render() {
28
- return /*#__PURE__*/React.createElement("div", {
29
- className: "sdoc-editor-toolbar"
30
- }, /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(HistoryMenu, {
31
- editor: this.props.editor
32
- })), /*#__PURE__*/React.createElement(HeaderMenu, {
33
- editor: this.props.editor
34
- }), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(TextStyleMenuList, {
35
- editor: this.props.editor
36
- }), /*#__PURE__*/React.createElement(LinkMenu, {
37
- editor: this.props.editor
38
- })), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(QuoteMenu, {
39
- editor: this.props.editor
40
- }), /*#__PURE__*/React.createElement(ListMenu, {
41
- editor: this.props.editor,
42
- type: UNORDERED_LIST
43
- }), /*#__PURE__*/React.createElement(ListMenu, {
44
- editor: this.props.editor,
45
- type: ORDERED_LIST
46
- }), /*#__PURE__*/React.createElement(CheckListMenu, {
47
- editor: this.props.editor
48
- })), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(CodeBlockMenu, {
49
- editor: this.props.editor
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);
15
+ import EventBus from '../../utils/event-bus';
16
+ var Toolbar = function Toolbar(_ref) {
17
+ var editor = _ref.editor;
18
+ var _useState = useState({}),
19
+ _useState2 = _slicedToArray(_useState, 2),
20
+ update = _useState2[1];
21
+ useEffect(function () {
22
+ var onChange = function onChange() {
23
+ return update({});
24
+ };
25
+ var eventBus = EventBus.getInstance();
26
+ var unsubscribe = eventBus.subscribe('change', onChange);
27
+ return function () {
28
+ unsubscribe();
29
+ };
30
+ }, []);
31
+ return /*#__PURE__*/React.createElement("div", {
32
+ className: "sdoc-editor-toolbar"
33
+ }, /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(HistoryMenu, {
34
+ editor: editor
35
+ })), /*#__PURE__*/React.createElement(HeaderMenu, {
36
+ editor: editor
37
+ }), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(TextStyleMenuList, {
38
+ editor: editor
39
+ }), /*#__PURE__*/React.createElement(LinkMenu, {
40
+ editor: editor
41
+ })), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(QuoteMenu, {
42
+ editor: editor
43
+ }), /*#__PURE__*/React.createElement(ListMenu, {
44
+ editor: editor,
45
+ type: UNORDERED_LIST
46
+ }), /*#__PURE__*/React.createElement(ListMenu, {
47
+ editor: editor,
48
+ type: ORDERED_LIST
49
+ }), /*#__PURE__*/React.createElement(CheckListMenu, {
50
+ editor: editor
51
+ })), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(CodeBlockMenu, {
52
+ editor: editor
53
+ }), /*#__PURE__*/React.createElement(TableMenu, {
54
+ editor: editor
55
+ })), /*#__PURE__*/React.createElement(ActiveTableMenu, {
56
+ editor: editor
57
+ }), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(ImageMenu, {
58
+ editor: editor
59
+ })));
60
+ };
61
61
  export default Toolbar;
@@ -1,5 +1,6 @@
1
1
  var _this = this;
2
2
  import { generateCursorData } from '../cursor/helper';
3
+ import EventBus from '../utils/event-bus';
3
4
  import SocketManager from './socket-manager';
4
5
  var withSocketIO = function withSocketIO(editor, options) {
5
6
  var onChange = editor.onChange;
@@ -33,6 +34,10 @@ var withSocketIO = function withSocketIO(editor, options) {
33
34
  }
34
35
  _socketManager.sendCursorLocation(editor.selection);
35
36
  }
37
+
38
+ // dispatch editor change event
39
+ var eventBus = EventBus.getInstance();
40
+ eventBus.dispatch('change');
36
41
  onChange();
37
42
  };
38
43
  return newEditor;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "0.1.54",
3
+ "version": "0.1.56",
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"