@seafile/seafile-editor 0.4.8 → 1.0.0
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/.babelrc +5 -0
- package/.eslintignore +19 -0
- package/.eslintrc.json +52 -0
- package/.github/workflows/nodejs.yml +25 -0
- package/.vscode/settings.json +5 -0
- package/config/config.common.js +157 -0
- package/config/config.dev.js +53 -0
- package/config/jest/cssTransform.js +16 -0
- package/config/jest/fileTransform.js +40 -0
- package/config/utils/theme.css.js +103 -0
- package/config.js +61 -0
- package/dev-server.js +145 -0
- package/jest.config.js +16 -0
- package/package.json +81 -131
- package/public/locales/en/seafile-editor.json +145 -148
- package/public/locales/zh-CN/seafile-editor.json +123 -135
- package/public/media/seafile-ui.css +6 -11166
- package/scripts/ejs.js +16 -0
- package/site/_i18n/index.js +35 -0
- package/site/api/index.js +212 -0
- package/site/app.js +21 -0
- package/site/assets/css/app.css +47 -0
- package/site/assets/css/seafile-editor.css +33 -0
- package/site/commons/loading/index.js +14 -0
- package/site/commons/loading/style.css +49 -0
- package/site/commons/switch/index.css +14 -0
- package/site/commons/switch/index.js +37 -0
- package/site/commons/toast/alert.js +106 -0
- package/site/commons/toast/index.js +5 -0
- package/site/commons/toast/toast.js +195 -0
- package/site/commons/toast/toastManager.js +138 -0
- package/site/commons/toast/toaster.js +64 -0
- package/site/index.html +23 -0
- package/site/index.js +21 -0
- package/site/pages/home.js +21 -0
- package/site/pages/plain-markdown-view.js +6 -0
- package/site/pages/rich-seafile-editor.js +72 -0
- package/site/pages/seafile-editor.js +39 -0
- package/site/pages/seafile-viewer.js +45 -0
- package/site/pages/simple-editor.js +44 -0
- package/site/pages/wiki-viewer.js +7 -0
- package/site/setting.js +36 -0
- package/site/setting.local.dist.js +23 -0
- package/src/assets/css/slate-editor.css +57 -0
- package/src/constants/event-types.js +11 -0
- package/src/constants/hot-keys.js +47 -0
- package/src/containers/article-info/index.js +49 -0
- package/src/containers/article-info/style.css +52 -0
- package/src/containers/custom/get-event-transfer.js +28 -0
- package/{dist → src}/containers/custom/set-event-transfer.js +13 -11
- package/src/containers/hotkeys-helper/classify-hotkeys.js +30 -0
- package/src/containers/hotkeys-helper/index.js +43 -0
- package/{dist/assets/css/user-help.css → src/containers/hotkeys-helper/style.css} +37 -29
- package/src/containers/loading/index.js +14 -0
- package/src/containers/loading/style.css +49 -0
- package/src/containers/outline/index.js +75 -0
- package/src/containers/outline/outline-item.js +28 -0
- package/src/containers/outline/style.css +45 -0
- package/src/editors/plain-markdown-editor/code-mirror.css +8 -0
- package/src/editors/plain-markdown-editor/code-mirror.js +73 -0
- package/src/editors/plain-markdown-editor/index.js +136 -0
- package/{dist/assets/editor/plain-editor.css → src/editors/plain-markdown-editor/style.css} +12 -4
- package/src/editors/simple-slate-editor /index.js +71 -0
- package/src/editors/simple-slate-editor /with-props-editor.js +15 -0
- package/src/editors/slate-editor/editor-help/index.js +46 -0
- package/src/editors/slate-editor/editor-help/style.css +15 -0
- package/src/editors/slate-editor/index.js +77 -0
- package/src/editors/slate-editor/with-props-editor.js +15 -0
- package/src/editors/slate-viewer/index.js +35 -0
- package/src/editors/slate-viewer/style.css +40 -0
- package/src/extension/commons/element-popover/index.js +52 -0
- package/src/extension/commons/index.js +10 -0
- package/src/extension/commons/menu/index.js +9 -0
- package/src/extension/commons/menu/menu-drop-down.js +110 -0
- package/src/extension/commons/menu/menu-group.js +20 -0
- package/src/extension/commons/menu/menu-item.js +60 -0
- package/src/extension/commons/menu/menu.css +120 -0
- package/src/extension/commons/tooltip/index.css +21 -0
- package/src/extension/commons/tooltip/index.js +26 -0
- package/src/extension/constants/element-types.js +23 -0
- package/src/extension/constants/index.js +37 -0
- package/src/extension/constants/keyboard.js +29 -0
- package/src/extension/constants/menus-config.js +149 -0
- package/src/extension/core/index.js +3 -0
- package/src/extension/core/queries/index.js +410 -0
- package/src/extension/core/transforms/focus-editor.js +12 -0
- package/src/extension/core/transforms/index.js +4 -0
- package/src/extension/core/transforms/move-children.js +23 -0
- package/src/extension/core/transforms/remove-node-children.js +8 -0
- package/src/extension/core/transforms/replace-node-children.js +14 -0
- package/src/extension/core/utils/index.js +76 -0
- package/src/extension/editor.js +14 -0
- package/src/extension/index.js +15 -0
- package/src/extension/plugins/blockquote/helpers.js +65 -0
- package/src/extension/plugins/blockquote/index.js +13 -0
- package/src/extension/plugins/blockquote/menu/index.js +31 -0
- package/src/extension/plugins/blockquote/plugin.js +64 -0
- package/src/extension/plugins/blockquote/render-elem.js +9 -0
- package/src/extension/plugins/check-list/helper.js +34 -0
- package/src/extension/plugins/check-list/index.js +14 -0
- package/src/extension/plugins/check-list/menu/index.js +44 -0
- package/src/extension/plugins/check-list/plugin.js +46 -0
- package/src/extension/plugins/check-list/render-elem.js +23 -0
- package/src/extension/plugins/clear-format/helpers.js +48 -0
- package/src/extension/plugins/clear-format/menu/index.js +39 -0
- package/src/extension/plugins/code-block/helpers.js +107 -0
- package/src/extension/plugins/code-block/index.js +14 -0
- package/src/extension/plugins/code-block/menu/index.js +40 -0
- package/src/extension/plugins/code-block/plugin.js +210 -0
- package/src/extension/plugins/code-block/render-elem/constant.js +17 -0
- package/src/extension/plugins/code-block/render-elem/index.js +55 -0
- package/src/extension/plugins/code-block/render-elem/language-selector.js +38 -0
- package/src/extension/plugins/code-block/render-elem/style.css +27 -0
- package/src/extension/plugins/formula/formula.css +22 -0
- package/src/extension/plugins/formula/helper.js +68 -0
- package/src/extension/plugins/formula/index.js +14 -0
- package/src/extension/plugins/formula/menu/formula-modal.js +73 -0
- package/src/extension/plugins/formula/menu/index.js +63 -0
- package/src/extension/plugins/formula/plugin.js +18 -0
- package/src/extension/plugins/formula/render-elem.js +40 -0
- package/src/extension/plugins/header/helper.js +47 -0
- package/src/extension/plugins/header/index.js +14 -0
- package/src/extension/plugins/header/menu/index.js +114 -0
- package/src/extension/plugins/header/menu/style.css +115 -0
- package/src/extension/plugins/header/plugin.js +134 -0
- package/src/extension/plugins/header/render-elem.js +31 -0
- package/src/extension/plugins/image/helper.js +50 -0
- package/src/extension/plugins/image/index.js +14 -0
- package/src/extension/plugins/image/menu/image-menu-dialog.js +68 -0
- package/src/extension/plugins/image/menu/image-menu-popover.js +76 -0
- package/src/extension/plugins/image/menu/index.js +61 -0
- package/src/extension/plugins/image/menu/style.css +36 -0
- package/src/extension/plugins/image/plugin.js +23 -0
- package/src/extension/plugins/image/render-element/image-previewer.js +71 -0
- package/src/extension/plugins/image/render-element/index.js +94 -0
- package/src/extension/plugins/image/render-element/style.css +60 -0
- package/src/extension/plugins/index.js +47 -0
- package/src/extension/plugins/link/helper.js +161 -0
- package/src/extension/plugins/link/index.js +14 -0
- package/src/extension/plugins/link/menu/index.js +82 -0
- package/src/extension/plugins/link/menu/link-modal.js +135 -0
- package/src/extension/plugins/link/plugin.js +85 -0
- package/src/extension/plugins/link/render-elem/index.js +69 -0
- package/src/extension/plugins/link/render-elem/link-popover.js +79 -0
- package/src/extension/plugins/link/render-elem/style.css +60 -0
- package/src/extension/plugins/list/constant.js +3 -0
- package/src/extension/plugins/list/helpers.js +53 -0
- package/src/extension/plugins/list/index.js +14 -0
- package/src/extension/plugins/list/menu/index.js +48 -0
- package/src/extension/plugins/list/plugin/index.js +48 -0
- package/src/extension/plugins/list/plugin/insert-break-list.js +25 -0
- package/src/extension/plugins/list/plugin/insert-fragment-list.js +162 -0
- package/src/extension/plugins/list/plugin/normalize-list.js +64 -0
- package/src/extension/plugins/list/plugin/on-tab-handle.js +34 -0
- package/src/extension/plugins/list/queries/index.js +39 -0
- package/src/extension/plugins/list/render-elem/index.js +26 -0
- package/src/extension/plugins/list/render-elem/style.css +6 -0
- package/src/extension/plugins/list/transforms/index.js +23 -0
- package/src/extension/plugins/list/transforms/insert-list-item.js +65 -0
- package/src/extension/plugins/list/transforms/move-list-item-down.js +40 -0
- package/src/extension/plugins/list/transforms/move-list-item-up.js +105 -0
- package/src/extension/plugins/list/transforms/move-list-items-to-list.js +58 -0
- package/src/extension/plugins/list/transforms/move-list-items.js +76 -0
- package/src/extension/plugins/list/transforms/normalize-list-item.js +92 -0
- package/src/extension/plugins/list/transforms/normalize-nested-list.js +31 -0
- package/src/extension/plugins/list/transforms/remove-first-list-item.js +11 -0
- package/src/extension/plugins/list/transforms/transforms-to-list.js +91 -0
- package/src/extension/plugins/list/transforms/unwrap-list.js +44 -0
- package/src/extension/plugins/node-id/constants.js +18 -0
- package/src/extension/plugins/node-id/helpers.js +61 -0
- package/src/extension/plugins/node-id/index.js +7 -0
- package/src/extension/plugins/node-id/with-node-id.js +37 -0
- package/src/extension/plugins/paragraph/helper.js +9 -0
- package/src/extension/plugins/paragraph/index.js +12 -0
- package/src/extension/plugins/paragraph/plugin.js +40 -0
- package/src/extension/plugins/paragraph/render-elem.js +11 -0
- package/src/extension/plugins/table/constant.js +3 -0
- package/src/extension/plugins/table/helper.js +175 -0
- package/src/extension/plugins/table/index.js +15 -0
- package/src/extension/plugins/table/menu/index.js +69 -0
- package/src/extension/plugins/table/menu/style.css +32 -0
- package/src/extension/plugins/table/menu/table-operator.js +101 -0
- package/src/extension/plugins/table/menu/table-size-selector.js +71 -0
- package/src/extension/plugins/table/model.js +69 -0
- package/src/extension/plugins/table/plugin.js +159 -0
- package/src/extension/plugins/table/render-elem/context-menu.js +78 -0
- package/src/extension/plugins/table/render-elem/index.js +157 -0
- package/src/extension/plugins/table/render-elem/style.css +94 -0
- package/src/extension/plugins/table/table-operations.js +162 -0
- package/src/extension/plugins/text-style/helpers.js +38 -0
- package/src/extension/plugins/text-style/index.js +12 -0
- package/src/extension/plugins/text-style/menu/index.js +41 -0
- package/src/extension/plugins/text-style/plugin.js +37 -0
- package/src/extension/plugins/text-style/render-elem.js +45 -0
- package/src/extension/render/render-element.js +82 -0
- package/src/extension/render/render-leaf.js +16 -0
- package/src/extension/toolbar/header-toolbar/index.js +129 -0
- package/src/extension/toolbar/header-toolbar/style.css +41 -0
- package/src/extension/toolbar/index.js +5 -0
- package/src/extension/toolbar/user-help/shortcut-dialog.js +144 -0
- package/src/hooks/use-mathjax.js +44 -0
- package/src/hooks/use-scroll-context.js +14 -0
- package/src/hooks/use-selection-update.js +14 -0
- package/src/index.js +22 -0
- package/src/pages/markdown-editor.js +53 -0
- package/src/pages/markdown-view.js +36 -0
- package/src/pages/rich-markdown-editor.js +95 -0
- package/src/pages/simple-editor.js +52 -0
- package/src/slate-convert/html-to-slate/constants.js +54 -0
- package/src/slate-convert/html-to-slate/helper.js +22 -0
- package/src/slate-convert/html-to-slate/index.js +144 -0
- package/src/slate-convert/html-to-slate/rules/blockquote.js +16 -0
- package/src/slate-convert/html-to-slate/rules/check-list.js +22 -0
- package/src/slate-convert/html-to-slate/rules/code-block.js +91 -0
- package/src/slate-convert/html-to-slate/rules/header.js +18 -0
- package/src/slate-convert/html-to-slate/rules/image.js +18 -0
- package/src/slate-convert/html-to-slate/rules/index.js +23 -0
- package/src/slate-convert/html-to-slate/rules/link.js +24 -0
- package/src/slate-convert/html-to-slate/rules/list.js +52 -0
- package/src/slate-convert/html-to-slate/rules/paragraph.js +16 -0
- package/src/slate-convert/html-to-slate/rules/table.js +37 -0
- package/src/slate-convert/html-to-slate/rules/text.js +63 -0
- package/src/slate-convert/index.js +11 -0
- package/src/slate-convert/md-to-html/index.js +44 -0
- package/src/slate-convert/md-to-html/sanitize-schema.js +41 -0
- package/src/slate-convert/md-to-slate/index.js +42 -0
- package/src/slate-convert/md-to-slate/transform.js +336 -0
- package/src/slate-convert/slate-to-md/index.js +44 -0
- package/src/slate-convert/slate-to-md/transform.js +248 -0
- package/src/utils/common.js +30 -0
- package/src/utils/deserialize-html.js +174 -0
- package/src/utils/dom-utils.js +45 -0
- package/src/utils/event-bus.js +37 -0
- package/src/utils/event-handler.js +36 -0
- package/src/utils/object-utils.js +51 -0
- package/tests/core/constants/index.js +54 -0
- package/tests/core/index.js +11 -0
- package/tests/core/jsx/index.js +9 -0
- package/tests/core/stub-editor/index.js +26 -0
- package/tests/core/utils.js +58 -0
- package/tests/extension/plugins/list/insert-block.test.js +40 -0
- package/tests/extension/plugins/list/insert-fragment-list.test.js +392 -0
- package/tests/extension/plugins/list/toggle-list.test.js +160 -0
- package/tests/extension/plugins/text/text.test.js +29 -0
- package/tests/extension/plugins/text-style/toggle-text-style.test.js +148 -0
- package/tests/slate-convert/html-to-slate/blockquote.test.js +107 -0
- package/tests/slate-convert/html-to-slate/code-block.test.js +32 -0
- package/tests/slate-convert/html-to-slate/header.test.js +56 -0
- package/tests/slate-convert/html-to-slate/link.test.js +77 -0
- package/tests/slate-convert/html-to-slate/list.test.js +190 -0
- package/tests/slate-convert/html-to-slate/paragraph.test.js +40 -0
- package/tests/slate-convert/html-to-slate/text.test.js +131 -0
- package/tests/slate-convert/md-to-html/blockquote.test.js +110 -0
- package/tests/slate-convert/md-to-html/check-list.test.js +19 -0
- package/tests/slate-convert/md-to-html/code-block.test.js +19 -0
- package/tests/slate-convert/md-to-html/header.test.js +20 -0
- package/tests/slate-convert/md-to-html/image.test.js +17 -0
- package/tests/slate-convert/md-to-html/image_reference.test.js +17 -0
- package/tests/slate-convert/md-to-html/link.test.js +15 -0
- package/tests/slate-convert/md-to-html/link_reference.test.js +15 -0
- package/tests/slate-convert/md-to-html/list-ordered.test.js +22 -0
- package/tests/slate-convert/md-to-html/list-unordered.test.js +22 -0
- package/tests/slate-convert/md-to-html/paragraph.test.js +15 -0
- package/tests/slate-convert/md-to-html/table.test.js +29 -0
- package/tests/slate-convert/md-to-html/text_base.test.js +14 -0
- package/tests/slate-convert/md-to-html/text_bold.test.js +14 -0
- package/tests/slate-convert/md-to-html/text_bold_italic.test.js +15 -0
- package/tests/slate-convert/md-to-html/text_code.test.js +14 -0
- package/tests/slate-convert/md-to-html/text_code_bold.test.js +14 -0
- package/tests/slate-convert/md-to-html/text_code_bold_italic.test.js +14 -0
- package/tests/slate-convert/md-to-html/text_code_italic.test.js +14 -0
- package/tests/slate-convert/md-to-html/text_italic.test.js +14 -0
- package/tests/slate-convert/md-to-slate/blockquote.test.js +200 -0
- package/tests/slate-convert/md-to-slate/check-list.test.js +34 -0
- package/tests/slate-convert/md-to-slate/code-block.test.js +32 -0
- package/tests/slate-convert/md-to-slate/header.test.js +49 -0
- package/tests/slate-convert/md-to-slate/image.test.js +31 -0
- package/tests/slate-convert/md-to-slate/link.test.js +30 -0
- package/tests/slate-convert/md-to-slate/list-ordered.test.js +42 -0
- package/tests/slate-convert/md-to-slate/list-unordered.test.js +42 -0
- package/tests/slate-convert/md-to-slate/paragraph.test.js +19 -0
- package/tests/slate-convert/md-to-slate/table.test.js +34 -0
- package/tests/slate-convert/md-to-slate/text_base.test.js +19 -0
- package/tests/slate-convert/md-to-slate/text_bold.test.js +22 -0
- package/tests/slate-convert/md-to-slate/text_bold_italic.test.js +23 -0
- package/tests/slate-convert/md-to-slate/text_code.test.js +22 -0
- package/tests/slate-convert/md-to-slate/text_code_bold.test.js +23 -0
- package/tests/slate-convert/md-to-slate/text_code_bold_italic.test.js +24 -0
- package/tests/slate-convert/md-to-slate/text_code_italic.test.js +23 -0
- package/tests/slate-convert/md-to-slate/text_italic.test.js +22 -0
- package/tests/slate-convert/slate-to-md/blockquote.test.js +416 -0
- package/tests/slate-convert/slate-to-md/check-list.test.js +96 -0
- package/tests/slate-convert/slate-to-md/code-block.test.js +35 -0
- package/tests/slate-convert/slate-to-md/formula.test.js +26 -0
- package/tests/slate-convert/slate-to-md/header.test.js +109 -0
- package/tests/slate-convert/slate-to-md/image.test.js +98 -0
- package/tests/slate-convert/slate-to-md/link.test.js +52 -0
- package/tests/slate-convert/slate-to-md/list-ordered.test.js +87 -0
- package/tests/slate-convert/slate-to-md/list-unordered.test.js +81 -0
- package/tests/slate-convert/slate-to-md/paragraph.test.js +28 -0
- package/tests/slate-convert/slate-to-md/table.test.js +56 -0
- package/tests/slate-convert/slate-to-md/text_base.test.js +28 -0
- package/tests/slate-convert/slate-to-md/text_bold.test.js +36 -0
- package/tests/slate-convert/slate-to-md/text_bold_italic.test.js +42 -0
- package/tests/slate-convert/slate-to-md/text_code.test.js +31 -0
- package/tests/slate-convert/slate-to-md/text_code_bold.test.js +37 -0
- package/tests/slate-convert/slate-to-md/text_code_bold_italic.test.js +43 -0
- package/tests/slate-convert/slate-to-md/text_code_italic.test.js +37 -0
- package/tests/slate-convert/slate-to-md/text_italic.test.js +36 -0
- package/README.md +0 -52
- package/TODO.md +0 -55
- package/dist/assets/css/diff-viewer.css +0 -105
- package/dist/assets/css/formula.css +0 -19
- package/dist/assets/css/history-viewer.css +0 -104
- package/dist/assets/css/image.css +0 -134
- package/dist/assets/css/link.css +0 -7
- package/dist/assets/css/markdown-editor.css +0 -12
- package/dist/assets/css/markdown-viewer.css +0 -69
- package/dist/assets/css/navbar-imgbutton.css +0 -83
- package/dist/assets/css/outline.css +0 -29
- package/dist/assets/css/table.css +0 -57
- package/dist/assets/css/textlink-hovermenu.css +0 -47
- package/dist/assets/css/topbar.css +0 -350
- package/dist/assets/css/tree-view.css +0 -67
- package/dist/assets/editor/seatable-editor.css +0 -77
- package/dist/assets/editor/simple-editor.css +0 -77
- package/dist/components/click-outside.js +0 -46
- package/dist/components/context-menu.js +0 -97
- package/dist/components/dialogs/add-formula-dialog.js +0 -116
- package/dist/components/dialogs/add-image-dialog.js +0 -69
- package/dist/components/dialogs/add-link-dialog.js +0 -133
- package/dist/components/dialogs/shortcut-dialog.js +0 -131
- package/dist/components/error-boundary.js +0 -28
- package/dist/components/load-script/index.js +0 -69
- package/dist/components/loading.js +0 -25
- package/dist/components/menu/index.js +0 -4
- package/dist/components/menu/item.js +0 -49
- package/dist/components/menu/menu.js +0 -38
- package/dist/components/menu/style.css +0 -42
- package/dist/components/modal-portal.js +0 -38
- package/dist/components/outline/index.js +0 -92
- package/dist/components/outline/outline-item.js +0 -58
- package/dist/components/select/_option.js +0 -44
- package/dist/components/select/field-setting.js +0 -106
- package/dist/components/select/index.js +0 -149
- package/dist/components/select/style.css +0 -144
- package/dist/components/svg-icons/check-mark-icon.js +0 -14
- package/dist/components/svg-icons/column-icon.js +0 -17
- package/dist/components/svg-icons/text-icon.js +0 -34
- package/dist/components/text-link-hover-menu/index.js +0 -123
- package/dist/components/toast/alert.js +0 -138
- package/dist/components/toast/index.js +0 -3
- package/dist/components/toast/toast.js +0 -159
- package/dist/components/toast/toastManager.js +0 -139
- package/dist/components/toast/toaster.js +0 -65
- package/dist/components/toolbar/header-list.js +0 -114
- package/dist/components/toolbar/help-group.js +0 -33
- package/dist/components/toolbar/index.js +0 -4
- package/dist/components/toolbar/insert-image.js +0 -106
- package/dist/components/toolbar/insert-table.js +0 -136
- package/dist/components/toolbar/table-group.js +0 -74
- package/dist/components/toolbar/toolbar.js +0 -317
- package/dist/components/toolbar/widgets/button-group.js +0 -24
- package/dist/components/toolbar/widgets/button-item.js +0 -129
- package/dist/components/toolbar/widgets/drop-list.js +0 -88
- package/dist/components/user-help/index.js +0 -179
- package/dist/config.js +0 -15
- package/dist/constants/cell-types.js +0 -29
- package/dist/constants/column.js +0 -4
- package/dist/containers/code-highlight-package.js +0 -14
- package/dist/containers/controller/block-element-controller.js +0 -375
- package/dist/containers/controller/index.js +0 -5
- package/dist/containers/controller/inline-element-controller.js +0 -134
- package/dist/containers/controller/normalize-controller.js +0 -95
- package/dist/containers/controller/shortcut-controller.js +0 -385
- package/dist/containers/controller/void-element-controller.js +0 -9
- package/dist/containers/custom/custom.js +0 -18
- package/dist/containers/custom/get-event-transfer.js +0 -33
- package/dist/containers/custom/getNodesByTypeAtRange.js +0 -57
- package/dist/containers/custom/insertNodes.js +0 -120
- package/dist/containers/custom/is-empty-paragraph.js +0 -9
- package/dist/containers/custom/split-nodes-at-point.js +0 -136
- package/dist/containers/custom/unwrap-node-by-type-at-range.js +0 -70
- package/dist/containers/editor-context.js +0 -85
- package/dist/containers/editor-utils/block-element-utils/blockquote-utils.js +0 -80
- package/dist/containers/editor-utils/block-element-utils/code-utils.js +0 -145
- package/dist/containers/editor-utils/block-element-utils/formula-utils.js +0 -51
- package/dist/containers/editor-utils/block-element-utils/index.js +0 -31
- package/dist/containers/editor-utils/block-element-utils/list-utils.js +0 -395
- package/dist/containers/editor-utils/block-element-utils/table-utils.js +0 -412
- package/dist/containers/editor-utils/clear-format-utils.js +0 -84
- package/dist/containers/editor-utils/common-editor-utils.js +0 -492
- package/dist/containers/editor-utils/inline-element-utils/index.js +0 -95
- package/dist/containers/editor-utils/mark-utils.js +0 -20
- package/dist/containers/editor-utils/range-utils.js +0 -7
- package/dist/containers/editor-utils/selection-utils.js +0 -30
- package/dist/containers/editor-utils/text-utils.js +0 -117
- package/dist/containers/editor-widgets/check-list-item.js +0 -53
- package/dist/containers/editor-widgets/code-block.js +0 -128
- package/dist/containers/editor-widgets/column.js +0 -100
- package/dist/containers/editor-widgets/formula.js +0 -67
- package/dist/containers/editor-widgets/image.js +0 -237
- package/dist/containers/editor-widgets/link.js +0 -9
- package/dist/containers/editor-widgets/table.js +0 -144
- package/dist/containers/element-model/blockquote.js +0 -13
- package/dist/containers/element-model/column.js +0 -19
- package/dist/containers/element-model/image.js +0 -16
- package/dist/containers/element-model/link.js +0 -16
- package/dist/containers/element-model/table.js +0 -57
- package/dist/containers/element-model/text.js +0 -10
- package/dist/containers/render-utils/common-utils.js +0 -80
- package/dist/containers/render-utils/editor-utils.js +0 -133
- package/dist/containers/render-utils/viewer-utils.js +0 -198
- package/dist/containers/viewer-widgets/viewer-formula/index.js +0 -54
- package/dist/containers/viewer-widgets/viewer-image/index.js +0 -70
- package/dist/containers/viewer-widgets/viewer-image/viewer-image.css +0 -3
- package/dist/editors/index.js +0 -78
- package/dist/editors/markdown-editor.js +0 -206
- package/dist/editors/plain-markdown-editor.js +0 -285
- package/dist/editors/seatable-editor.js +0 -210
- package/dist/editors/simple-editor.js +0 -200
- package/dist/index.js +0 -11
- package/dist/setting.local.js +0 -14
- package/dist/utils/deserialize-html.js +0 -260
- package/dist/utils/diff/compare-strings.js +0 -35
- package/dist/utils/diff/diff.js +0 -769
- package/dist/utils/diff/index.js +0 -2
- package/dist/utils/seafile-markdown2html.js +0 -52
- package/dist/utils/slate2markdown/deserialize.js +0 -588
- package/dist/utils/slate2markdown/index.js +0 -3
- package/dist/utils/slate2markdown/serialize.js +0 -366
- package/dist/utils/utils.js +0 -68
- package/dist/viewer/diff-viewer.js +0 -85
- package/dist/viewer/index.js +0 -4
- package/dist/viewer/markdown-viewer.js +0 -121
- package/dist/viewer/seatable-viewer.js +0 -63
- package/dist/viewer/slate-viewer.js +0 -71
- package/public/index.html +0 -45
- package/public/manifest.json +0 -15
- package/public/media/seafile-logo.png +0 -0
- /package/{dist/assets/css/keyboard-shortcuts.css → src/extension/toolbar/user-help/style.css} +0 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
const generateDefaultText = () => {
|
|
2
|
+
return {
|
|
3
|
+
type: 'text',
|
|
4
|
+
value: '',
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
const transformTextNode = (textNode) => {
|
|
9
|
+
let mdNode = { type: 'text', value: textNode.text };
|
|
10
|
+
|
|
11
|
+
// code = true, override text type
|
|
12
|
+
if (textNode['code']) {
|
|
13
|
+
mdNode = { ...mdNode, type: 'inlineCode' };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// blob = true, add strong parent
|
|
17
|
+
if (textNode['bold']) {
|
|
18
|
+
mdNode = { type: 'strong', children: [mdNode] };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// italic = true, add emphasis parent
|
|
22
|
+
if (textNode['italic']) {
|
|
23
|
+
mdNode = { type: 'emphasis', children: [mdNode] };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return mdNode;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const transformInlineChildren = (result, item) => {
|
|
30
|
+
// image
|
|
31
|
+
if (item.type && item.type === 'image') {
|
|
32
|
+
const { data } = item;
|
|
33
|
+
let image = {
|
|
34
|
+
type: 'image',
|
|
35
|
+
url: data.src,
|
|
36
|
+
alt: data.alt || null,
|
|
37
|
+
title: data.title || null,
|
|
38
|
+
};
|
|
39
|
+
if (data.height || data.width) {
|
|
40
|
+
image = {
|
|
41
|
+
type: 'html',
|
|
42
|
+
value: `<img src="${data.src}" alt="${data.alt}" title="${data.title}" width="${data.width}" height="${data.height}" />`
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
result.push(image);
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// link
|
|
50
|
+
if (item.type && item.type === 'link') {
|
|
51
|
+
const link = {
|
|
52
|
+
type: 'link',
|
|
53
|
+
url: item.url,
|
|
54
|
+
title: item.title || null,
|
|
55
|
+
children: [transformTextNode(item.children[0])],
|
|
56
|
+
};
|
|
57
|
+
result.push(link);
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// text
|
|
62
|
+
const nodes = transformTextNode(item);
|
|
63
|
+
result.push(nodes);
|
|
64
|
+
return result;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const transformNodeWithInlineChildren = (node) => {
|
|
68
|
+
const { children } = node;
|
|
69
|
+
const defaultChildren = [generateDefaultText()];
|
|
70
|
+
if (!children || !Array.isArray(children) || children.length === 0) {
|
|
71
|
+
return defaultChildren;
|
|
72
|
+
}
|
|
73
|
+
const result = [];
|
|
74
|
+
children.forEach(item => transformInlineChildren(result, item));
|
|
75
|
+
return result.flat();
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const transformHeader = (node) => {
|
|
79
|
+
const level = node.type.replace('header', '');
|
|
80
|
+
return {
|
|
81
|
+
type: 'heading',
|
|
82
|
+
depth: parseInt(level),
|
|
83
|
+
children: transformNodeWithInlineChildren(node)
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const transformParagraph = (node) => {
|
|
88
|
+
return {
|
|
89
|
+
type: 'paragraph',
|
|
90
|
+
children: transformNodeWithInlineChildren(node)
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const transformBlockquote = (node) => {
|
|
95
|
+
const { children } = node;
|
|
96
|
+
return {
|
|
97
|
+
type: 'blockquote',
|
|
98
|
+
children: children.map(child => {
|
|
99
|
+
const handler = elementHandlers[child.type];
|
|
100
|
+
return handler(child);
|
|
101
|
+
}).flat(), // flat
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const transformCheckList = (node) => {
|
|
106
|
+
return {
|
|
107
|
+
type: 'list',
|
|
108
|
+
ordered: false,
|
|
109
|
+
start: null,
|
|
110
|
+
spread: false,
|
|
111
|
+
children: [
|
|
112
|
+
{
|
|
113
|
+
type: 'listItem',
|
|
114
|
+
spread: false,
|
|
115
|
+
checked: node.checked,
|
|
116
|
+
children: [
|
|
117
|
+
transformParagraph(node),
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const transformListContent = (node) => {
|
|
125
|
+
return transformParagraph(node);
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const transformListItem = (node) => {
|
|
129
|
+
let loose = false;
|
|
130
|
+
const { children } = node;
|
|
131
|
+
// eslint-disable-next-line array-callback-return
|
|
132
|
+
const newChildren = children.map(child => {
|
|
133
|
+
if (child.type === 'paragraph') {
|
|
134
|
+
return transformListContent(child);
|
|
135
|
+
}
|
|
136
|
+
if (child.type === 'unordered_list' || child.type === 'ordered_list') {
|
|
137
|
+
return transformList(child);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
if (newChildren.length === 1) {
|
|
141
|
+
loose = false;
|
|
142
|
+
} else if (newChildren.length === 2 && newChildren[1].type === 'list') {
|
|
143
|
+
loose = true;
|
|
144
|
+
} else {
|
|
145
|
+
loose = true;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return {
|
|
149
|
+
type: 'listItem',
|
|
150
|
+
loose: loose,
|
|
151
|
+
checked: null,
|
|
152
|
+
children: newChildren
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const transformList = (node) => {
|
|
157
|
+
const { children } = node;
|
|
158
|
+
const newChildren = children.map(child => transformListItem(child));
|
|
159
|
+
let loose = false;
|
|
160
|
+
for (let node of newChildren) {
|
|
161
|
+
if (node.loose === true) {
|
|
162
|
+
loose = true;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
type: 'list',
|
|
168
|
+
ordered: node.type === 'ordered_list', // ordered_list | unordered_list
|
|
169
|
+
start: 1,
|
|
170
|
+
loose: loose,
|
|
171
|
+
children: newChildren,
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const transformTableCell = (cell) => {
|
|
176
|
+
return {
|
|
177
|
+
type: 'tableCell',
|
|
178
|
+
children: transformNodeWithInlineChildren(cell),
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
const transformTableRow = (row) => {
|
|
183
|
+
const { children: cells } = row;
|
|
184
|
+
return {
|
|
185
|
+
type: 'tableRow',
|
|
186
|
+
children: cells.map(cell => transformTableCell(cell)),
|
|
187
|
+
};
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const transformTable = (node) => {
|
|
191
|
+
const { children: rows } = node;
|
|
192
|
+
const align = rows.map(row => {
|
|
193
|
+
const { children: cells } = row;
|
|
194
|
+
return cells[0]?.align || null;
|
|
195
|
+
});
|
|
196
|
+
return {
|
|
197
|
+
type: 'table',
|
|
198
|
+
align: align,
|
|
199
|
+
children: rows.map(row => transformTableRow(row)),
|
|
200
|
+
};
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
const transformCodeLine = (node) => {
|
|
204
|
+
const text = node.children[0]?.text || '';
|
|
205
|
+
return text;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const transformCodeBlock = (node) => {
|
|
209
|
+
const { children } = node;
|
|
210
|
+
return {
|
|
211
|
+
type: 'code',
|
|
212
|
+
lang: node.lang ? node.lang : null,
|
|
213
|
+
value: children.map(child => transformCodeLine(child)).join('\n'),
|
|
214
|
+
};
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
const transformFormula = (node) => {
|
|
218
|
+
const data = node.data;
|
|
219
|
+
return {
|
|
220
|
+
type: 'math',
|
|
221
|
+
value: data.formula,
|
|
222
|
+
};
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
const elementHandlers = {
|
|
226
|
+
'paragraph': transformParagraph,
|
|
227
|
+
'header1': transformHeader,
|
|
228
|
+
'header2': transformHeader,
|
|
229
|
+
'header3': transformHeader,
|
|
230
|
+
'header4': transformHeader,
|
|
231
|
+
'header5': transformHeader,
|
|
232
|
+
'header6': transformHeader,
|
|
233
|
+
'blockquote': transformBlockquote,
|
|
234
|
+
'table': transformTable,
|
|
235
|
+
'check_list_item': transformCheckList,
|
|
236
|
+
'ordered_list': transformList,
|
|
237
|
+
'unordered_list': transformList,
|
|
238
|
+
'code_block': transformCodeBlock,
|
|
239
|
+
'formula': transformFormula,
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
export const formatSlateToMd = (children) => {
|
|
243
|
+
const validChildren = children.filter(child => elementHandlers[child.type]);
|
|
244
|
+
return validChildren.map(child => {
|
|
245
|
+
const handler = elementHandlers[child.type];
|
|
246
|
+
return handler(child);
|
|
247
|
+
}).flat();
|
|
248
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import checkIsUrl from 'is-url';
|
|
2
|
+
|
|
3
|
+
export const isMac = () => {
|
|
4
|
+
const platform = navigator.platform;
|
|
5
|
+
return (platform === 'Mac68K') || (platform === 'MacPPC') || (platform === 'Macintosh') || (platform === 'MacIntel');
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const IMAGE_TYPES = [
|
|
9
|
+
'png',
|
|
10
|
+
'jpg',
|
|
11
|
+
'gif',
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
export const isImage = (url) => {
|
|
15
|
+
if (!url) return false;
|
|
16
|
+
|
|
17
|
+
if (!isUrl(url)) return false;
|
|
18
|
+
|
|
19
|
+
const suffix = url.split('.')[1]; // http://xx/mm/*.png
|
|
20
|
+
if (!suffix) return false;
|
|
21
|
+
|
|
22
|
+
return IMAGE_TYPES.includes(suffix.toLowerCase());
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const isUrl = (url) => {
|
|
26
|
+
if (!url) return false;
|
|
27
|
+
if (!url.startsWith('http')) return false;
|
|
28
|
+
if (!checkIsUrl(url)) return false;
|
|
29
|
+
return true;
|
|
30
|
+
};
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { jsx } from 'slate-hyperscript';
|
|
2
|
+
import {
|
|
3
|
+
BLOCKQUOTE,
|
|
4
|
+
HEADER1,
|
|
5
|
+
HEADER2,
|
|
6
|
+
HEADER3,
|
|
7
|
+
HEADER4,
|
|
8
|
+
HEADER5,
|
|
9
|
+
HEADER6,
|
|
10
|
+
IMAGE,
|
|
11
|
+
LINK,
|
|
12
|
+
LIST_ITEM,
|
|
13
|
+
ORDERED_LIST,
|
|
14
|
+
PARAGRAPH,
|
|
15
|
+
TABLE,
|
|
16
|
+
UNORDERED_LIST,
|
|
17
|
+
} from '../extension/constants/element-types';
|
|
18
|
+
import { generateTableCell, generateTableRow } from '../extension/plugins/table/model';
|
|
19
|
+
import { generateElement } from '../extension/core';
|
|
20
|
+
|
|
21
|
+
const ELEMENT_TAGS = {
|
|
22
|
+
A: el => ({ type: LINK, data: { href: el.getAttribute('href') } }),
|
|
23
|
+
BLOCKQUOTE: () => ({ type: BLOCKQUOTE }),
|
|
24
|
+
H1: () => ({ type: HEADER1 }),
|
|
25
|
+
H2: () => ({ type: HEADER2 }),
|
|
26
|
+
H3: () => ({ type: HEADER3 }),
|
|
27
|
+
H4: () => ({ type: HEADER4 }),
|
|
28
|
+
H5: () => ({ type: HEADER5 }),
|
|
29
|
+
H6: () => ({ type: HEADER6 }),
|
|
30
|
+
IMG: el => ({ type: IMAGE, children: [{ text: '' }], data: { src: el.getAttribute('src') } }),
|
|
31
|
+
LI: () => ({ type: LIST_ITEM, data: {} }),
|
|
32
|
+
OL: () => ({ type: ORDERED_LIST }),
|
|
33
|
+
P: () => ({ type: PARAGRAPH }),
|
|
34
|
+
UL: () => ({ type: UNORDERED_LIST }),
|
|
35
|
+
TABLE: () => ({ type: TABLE }),
|
|
36
|
+
BR: () => ({ text: '' })
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const HEADER_LIST = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];
|
|
40
|
+
|
|
41
|
+
const TEXT_TAGS = {
|
|
42
|
+
CODE: () => ({ CODE: true }),
|
|
43
|
+
DEL: () => ({ DELETE: true }),
|
|
44
|
+
EM: () => ({ ITALIC: true }),
|
|
45
|
+
I: () => ({ ITALIC: true }),
|
|
46
|
+
STRONG: () => ({ BOLD: true }),
|
|
47
|
+
INS: () => ({ INS: true })
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const parseTable = (el) => {
|
|
51
|
+
|
|
52
|
+
if (el.parentNode.nodeName !== 'BODY') {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let tableWidth = 0;
|
|
57
|
+
Array.from(el.rows[0].childNodes).forEach((cell, index) => {
|
|
58
|
+
if (cell.nodeName === 'TD' || cell.nodeName === 'TH') {
|
|
59
|
+
tableWidth += (Number(cell.getAttribute('colspan')) || 1);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
let rowList = [];
|
|
64
|
+
for (let rowIndex = 0; rowIndex < el.rows.length; rowIndex++) {
|
|
65
|
+
let cells = el.rows[rowIndex].cells;
|
|
66
|
+
const cellsList = [];
|
|
67
|
+
for (let columnIndex = 0; columnIndex < cells.length; columnIndex++) {
|
|
68
|
+
const cell = cells[columnIndex];
|
|
69
|
+
cellsList.push(generateTableCell({ childrenOrText: [generateElement(PARAGRAPH, { childrenOrText: cell.textContent })] }));
|
|
70
|
+
}
|
|
71
|
+
if (cellsList.length < tableWidth) {
|
|
72
|
+
let count = tableWidth - cellsList.length;
|
|
73
|
+
for (let i = 0; i < count; i++) {
|
|
74
|
+
cellsList.push(generateTableCell({ childrenOrText: [generateElement(PARAGRAPH)] }));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
rowList.push(generateTableRow({ childrenOrText: cellsList }));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return rowList;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const deserializeHtml = el => {
|
|
84
|
+
if (el.nodeType === 3) {
|
|
85
|
+
// remove \n character
|
|
86
|
+
if (el.textContent === '\n' || el.textContent === '\r') {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
if (el.parentElement.nodeName === 'BODY') {
|
|
90
|
+
let text = el.textContent.replace(/(\n|\r\n)/g, '');
|
|
91
|
+
if (text.length === 0) return null;
|
|
92
|
+
return { type: PARAGRAPH, children: [{ text }] };
|
|
93
|
+
}
|
|
94
|
+
return el.textContent;
|
|
95
|
+
} else if (el.nodeType !== 1) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const { nodeName } = el;
|
|
100
|
+
let parent = el;
|
|
101
|
+
|
|
102
|
+
let children = Array.from(parent.childNodes)
|
|
103
|
+
.map(deserializeHtml)
|
|
104
|
+
.flat();
|
|
105
|
+
|
|
106
|
+
// deserialize task list
|
|
107
|
+
if (nodeName === 'LI') {
|
|
108
|
+
if (el.className && el.className.indexOf('task-list-item') >= 0) {
|
|
109
|
+
return jsx('element', { data: { checked: false }, type: 'list_item' }, children);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (
|
|
114
|
+
nodeName === 'PRE' &&
|
|
115
|
+
el.childNodes[0] &&
|
|
116
|
+
el.childNodes[0].nodeName === 'CODE'
|
|
117
|
+
) {
|
|
118
|
+
// deserialize code block
|
|
119
|
+
const code = el.childNodes[0];
|
|
120
|
+
const codeChildren = [];
|
|
121
|
+
code.childNodes.forEach((codeLine, index) => {
|
|
122
|
+
if (codeLine.innerText) {
|
|
123
|
+
codeChildren.push({
|
|
124
|
+
type: 'code_line',
|
|
125
|
+
children: [{ text: codeLine.innerText }]
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
data: { syntax: null },
|
|
132
|
+
children: codeChildren,
|
|
133
|
+
type: 'code_block'
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (el.nodeName === 'BODY') {
|
|
138
|
+
return jsx('fragment', {}, children);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (ELEMENT_TAGS[nodeName]) {
|
|
142
|
+
const attrs = ELEMENT_TAGS[nodeName](el);
|
|
143
|
+
if (nodeName === 'IMG') {
|
|
144
|
+
return jsx('element', attrs, [{ text: '' }]);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// modify BR into an empty text node
|
|
148
|
+
if (nodeName === 'BR') {
|
|
149
|
+
return '';
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (nodeName === 'TABLE') {
|
|
153
|
+
return jsx('element', attrs, parseTable(el));
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (nodeName === 'A' || HEADER_LIST.includes(nodeName)) {
|
|
157
|
+
return jsx('element', attrs, [{ text: el.textContent }]);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return jsx('element', attrs, children);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (TEXT_TAGS[nodeName]) {
|
|
164
|
+
const attrs = TEXT_TAGS[nodeName](el);
|
|
165
|
+
return children.map(child => jsx('text', attrs, child));
|
|
166
|
+
}
|
|
167
|
+
return children;
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
export const htmlDeserializer = (html) => {
|
|
172
|
+
const parsed = new DOMParser().parseFromString(html, 'text/html');
|
|
173
|
+
return deserializeHtml(parsed.body);
|
|
174
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export const getDomHeight = (dom) => {
|
|
2
|
+
const styles = window.getComputedStyle(dom);
|
|
3
|
+
const rect = dom.getBoundingClientRect();
|
|
4
|
+
const marginTop = styles['marginTop'];
|
|
5
|
+
// margin-bottom overlaps margin-top
|
|
6
|
+
// const marginBottom = styles['marginBottom'];
|
|
7
|
+
const { height } = rect;
|
|
8
|
+
|
|
9
|
+
return height + parseInt(marginTop);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const getDomMarginTop = (dom) => {
|
|
13
|
+
const styles = window.getComputedStyle(dom);
|
|
14
|
+
const marginTop = styles['marginTop'];
|
|
15
|
+
return parseInt(marginTop);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const getSelectionRange = () => {
|
|
19
|
+
if (window.getSelection) {
|
|
20
|
+
const sel = window.getSelection();
|
|
21
|
+
if (sel.getRangeAt && sel.rangeCount) {
|
|
22
|
+
return sel.getRangeAt(0);
|
|
23
|
+
}
|
|
24
|
+
} else if (document.selection && document.selection.createRange) {
|
|
25
|
+
return document.selection.createRange();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return null;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const getCursorPosition = (isScrollUp = true) => {
|
|
32
|
+
let x = 0, y = 0;
|
|
33
|
+
let range = getSelectionRange();
|
|
34
|
+
if (range) {
|
|
35
|
+
const rect = range.getBoundingClientRect();
|
|
36
|
+
const headerHeight = 100;
|
|
37
|
+
x = rect.x || 0;
|
|
38
|
+
if (isScrollUp) {
|
|
39
|
+
y = rect.y - headerHeight;
|
|
40
|
+
} else {
|
|
41
|
+
y = rect.y - headerHeight + rect.height;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { x: x, y: y };
|
|
45
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
class EventBus {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.instance = null;
|
|
4
|
+
this.subscribers = {};
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
static getInstance() {
|
|
8
|
+
if (this.instance) return this.instance;
|
|
9
|
+
this.instance = new EventBus();
|
|
10
|
+
return this.instance;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
subscribe(type, handler) {
|
|
14
|
+
if (!this.subscribers[type]) {
|
|
15
|
+
this.subscribers[type] = [];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const handlers = this.subscribers[type];
|
|
19
|
+
handlers.push(handler);
|
|
20
|
+
|
|
21
|
+
return () => {
|
|
22
|
+
const index = handlers.indexOf(handler);
|
|
23
|
+
if (index > -1) {
|
|
24
|
+
handlers.splice(index, 1);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
dispatch(type, ...data) {
|
|
30
|
+
const handlers = this.subscribers[type];
|
|
31
|
+
if (Array.isArray(handlers)) {
|
|
32
|
+
handlers.forEach(handler => handler(...data));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export default EventBus;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import isHotkey from 'is-hotkey';
|
|
2
|
+
|
|
3
|
+
class EventProxy {
|
|
4
|
+
|
|
5
|
+
constructor(editor) {
|
|
6
|
+
this.editor = editor;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
onKeyDown = (event) => {
|
|
10
|
+
const editor = this.editor;
|
|
11
|
+
if (editor.onHotKeyDown) {
|
|
12
|
+
const isHandled = editor.onHotKeyDown(event);
|
|
13
|
+
if (isHandled) return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Disable the default 'save page'
|
|
17
|
+
if (isHotkey('mod+s', event)) {
|
|
18
|
+
event.preventDefault();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Disable default 'tab' behavior
|
|
22
|
+
if (isHotkey('tab', event)) {
|
|
23
|
+
event.preventDefault();
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
onCopy = (event) => {
|
|
28
|
+
const editor = this.editor;
|
|
29
|
+
if (editor.onCopy) {
|
|
30
|
+
const isHandled = editor.onCopy(event);
|
|
31
|
+
if (isHandled) return;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export default EventProxy;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
class ObjectUtils {
|
|
2
|
+
|
|
3
|
+
static getDataType(data){
|
|
4
|
+
let type = typeof data;
|
|
5
|
+
if (type !== 'object') {
|
|
6
|
+
return type;
|
|
7
|
+
}
|
|
8
|
+
return Object.prototype.toString.call(data).replace(/^\[object (\S+)\]$/, '$1');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
static isObject = (data) => {
|
|
12
|
+
return this.getDataType(data) === 'Object';
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
static iterable(data){
|
|
16
|
+
return ['Object', 'Array'].includes(this.getDataType(data));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
static isObjectChanged(source, comparison, notIncludeKeys) {
|
|
20
|
+
if (!this.iterable(source)) {
|
|
21
|
+
throw new Error(`source should be a Object or Array , but got ${this.getDataType(source)}`);
|
|
22
|
+
}
|
|
23
|
+
if (this.getDataType(source) !== this.getDataType(comparison)) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
const sourceKeys = Object.keys(source);
|
|
27
|
+
const comparisonKeys = Object.keys({ ...source, ...comparison }).filter(key => !notIncludeKeys.includes(key));
|
|
28
|
+
if (sourceKeys.length !== comparisonKeys.length) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return comparisonKeys.some(key => {
|
|
32
|
+
if (this.iterable(source[key])) {
|
|
33
|
+
return this.isObjectChanged(source[key], comparison[key], notIncludeKeys);
|
|
34
|
+
} else {
|
|
35
|
+
return source[key] !== comparison[key];
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static isSameObject(source, comparison, notIncludeKeys = []) {
|
|
41
|
+
if (!source || !comparison) return false;
|
|
42
|
+
return !this.isObjectChanged(source, comparison, notIncludeKeys);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static hasProperty = (obj, prop) => {
|
|
46
|
+
if (!obj) return false;
|
|
47
|
+
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export default ObjectUtils;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// extension plugin
|
|
2
|
+
export const BLOCKQUOTE = 'blockquote';
|
|
3
|
+
export const HEADER = 'header';
|
|
4
|
+
export const HEADER1 = 'header1';
|
|
5
|
+
export const HEADER2 = 'header2';
|
|
6
|
+
export const HEADER3 = 'header3';
|
|
7
|
+
export const HEADER4 = 'header4';
|
|
8
|
+
export const HEADER5 = 'header5';
|
|
9
|
+
export const HEADER6 = 'header6';
|
|
10
|
+
export const ORDERED_LIST = 'ordered_list';
|
|
11
|
+
export const UNORDERED_LIST = 'unordered_list';
|
|
12
|
+
export const LIST_ITEM = 'list_item';
|
|
13
|
+
export const LIST_LIC = 'list_lic'; // placeholder
|
|
14
|
+
export const CHECK_LIST_ITEM = 'check_list_item';
|
|
15
|
+
export const PARAGRAPH = 'paragraph';
|
|
16
|
+
export const CODE_BLOCK = 'code_block';
|
|
17
|
+
export const CODE_LINE = 'code_line';
|
|
18
|
+
export const TABLE = 'table';
|
|
19
|
+
export const TABLE_CELL = 'table_cell';
|
|
20
|
+
export const TABLE_ROW = 'table_row';
|
|
21
|
+
export const TABLE_TH = 'table_th';
|
|
22
|
+
export const TABLE_TD = 'table_td';
|
|
23
|
+
export const TABLE_TR = 'table_tr';
|
|
24
|
+
export const LINK = 'link';
|
|
25
|
+
export const IMAGE = 'image';
|
|
26
|
+
export const FORMULA = 'formula';
|
|
27
|
+
export const COLUMN = 'column';
|
|
28
|
+
|
|
29
|
+
export const voidChildren = [{ text: '' }];
|
|
30
|
+
|
|
31
|
+
export const ELEMENTS = {
|
|
32
|
+
ha: { type: LINK },
|
|
33
|
+
hblockquote: { type: BLOCKQUOTE },
|
|
34
|
+
hcodeblock: { type: CODE_BLOCK },
|
|
35
|
+
hcodeline: { type: CODE_LINE },
|
|
36
|
+
hdefault: { type: PARAGRAPH },
|
|
37
|
+
hh1: { type: HEADER1 },
|
|
38
|
+
hh2: { type: HEADER2 },
|
|
39
|
+
hh3: { type: HEADER3 },
|
|
40
|
+
hh4: { type: HEADER4 },
|
|
41
|
+
hh5: { type: HEADER5 },
|
|
42
|
+
hh6: { type: HEADER6 },
|
|
43
|
+
himg: { type: IMAGE, children: voidChildren },
|
|
44
|
+
hli: { type: LIST_ITEM },
|
|
45
|
+
hlic: { type: LIST_LIC },
|
|
46
|
+
hol: { type: ORDERED_LIST },
|
|
47
|
+
hp: { type: PARAGRAPH },
|
|
48
|
+
htable: { type: TABLE },
|
|
49
|
+
htd: { type: TABLE_TD },
|
|
50
|
+
hth: { type: TABLE_TH },
|
|
51
|
+
htodoli: { type: CHECK_LIST_ITEM },
|
|
52
|
+
htr: { type: TABLE_TR },
|
|
53
|
+
hul: { type: UNORDERED_LIST }
|
|
54
|
+
};
|