suneditor 3.0.0-beta.9 → 3.0.0-rc.2
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/README.md +65 -57
- package/dist/suneditor-contents.min.css +1 -0
- package/dist/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +1 -1
- package/package.json +110 -61
- package/src/assets/design/color.css +36 -17
- package/src/assets/design/size.css +2 -0
- package/src/assets/icons/defaultIcons.js +17 -2
- package/src/assets/suneditor-contents.css +51 -16
- package/src/assets/suneditor.css +116 -43
- package/src/core/config/contextProvider.js +288 -0
- package/src/core/config/eventManager.js +188 -0
- package/src/core/config/instanceCheck.js +59 -0
- package/src/core/config/optionProvider.js +452 -0
- package/src/core/editor.js +166 -1637
- package/src/core/event/actions/index.js +229 -0
- package/src/core/event/effects/common.registry.js +74 -0
- package/src/core/event/effects/keydown.registry.js +573 -0
- package/src/core/event/effects/ruleHelpers.js +148 -0
- package/src/core/event/eventOrchestrator.js +944 -0
- package/src/core/event/executor.js +27 -0
- package/src/core/{base/eventHandlers → event/handlers}/handler_toolbar.js +27 -28
- package/src/core/{base/eventHandlers → event/handlers}/handler_ww_clipboard.js +10 -8
- package/src/core/{base/eventHandlers → event/handlers}/handler_ww_dragDrop.js +22 -23
- package/src/core/event/handlers/handler_ww_input.js +75 -0
- package/src/core/event/handlers/handler_ww_key.js +228 -0
- package/src/core/event/handlers/handler_ww_mouse.js +166 -0
- package/src/core/event/ports.js +211 -0
- package/src/core/event/reducers/keydown.reducer.js +97 -0
- package/src/core/event/rules/keydown.rule.arrow.js +63 -0
- package/src/core/event/rules/keydown.rule.backspace.js +208 -0
- package/src/core/event/rules/keydown.rule.delete.js +132 -0
- package/src/core/event/rules/keydown.rule.enter.js +150 -0
- package/src/core/event/rules/keydown.rule.tab.js +35 -0
- package/src/core/event/support/defaultLineManager.js +136 -0
- package/src/core/event/support/selectionState.js +204 -0
- package/src/core/kernel/coreKernel.js +320 -0
- package/src/core/kernel/kernelInjector.js +19 -0
- package/src/core/kernel/store.js +173 -0
- package/src/core/{class → logic/dom}/char.js +42 -45
- package/src/core/logic/dom/format.js +1075 -0
- package/src/core/{class → logic/dom}/html.js +743 -624
- package/src/core/logic/dom/inline.js +1847 -0
- package/src/core/logic/dom/listFormat.js +601 -0
- package/src/core/{class → logic/dom}/nodeTransform.js +92 -72
- package/src/core/{class → logic/dom}/offset.js +254 -317
- package/src/core/logic/dom/selection.js +754 -0
- package/src/core/logic/panel/menu.js +389 -0
- package/src/core/logic/panel/toolbar.js +449 -0
- package/src/core/logic/panel/viewer.js +761 -0
- package/src/core/logic/shell/_commandExecutor.js +380 -0
- package/src/core/logic/shell/commandDispatcher.js +241 -0
- package/src/core/logic/shell/component.js +970 -0
- package/src/core/logic/shell/focusManager.js +110 -0
- package/src/core/{base → logic/shell}/history.js +110 -60
- package/src/core/logic/shell/pluginManager.js +363 -0
- package/src/core/logic/shell/shortcuts.js +130 -0
- package/src/core/logic/shell/ui.js +904 -0
- package/src/core/schema/context.js +66 -0
- package/src/core/schema/frameContext.js +160 -0
- package/src/core/schema/options.js +628 -0
- package/src/core/section/constructor.js +194 -500
- package/src/core/section/documentType.js +297 -222
- package/src/events.js +808 -543
- package/src/helper/clipboard.js +27 -16
- package/src/helper/converter.js +100 -78
- package/src/helper/dom/domCheck.js +56 -30
- package/src/helper/dom/domQuery.js +159 -89
- package/src/helper/dom/domUtils.js +114 -49
- package/src/helper/dom/index.js +5 -1
- package/src/helper/env.js +26 -26
- package/src/helper/index.js +1 -1
- package/src/helper/keyCodeMap.js +25 -28
- package/src/helper/numbers.js +4 -8
- package/src/helper/unicode.js +4 -8
- package/src/hooks/base.js +307 -0
- package/src/hooks/params.js +130 -0
- package/src/interfaces/contracts.js +227 -0
- package/src/interfaces/index.js +7 -0
- package/src/interfaces/plugins.js +239 -0
- package/src/langs/ckb.js +4 -4
- package/src/langs/cs.js +4 -4
- package/src/langs/da.js +4 -4
- package/src/langs/de.js +4 -4
- package/src/langs/en.js +4 -4
- package/src/langs/es.js +4 -4
- package/src/langs/fa.js +4 -4
- package/src/langs/fr.js +4 -4
- package/src/langs/he.js +4 -4
- package/src/langs/hu.js +4 -4
- package/src/langs/it.js +4 -4
- package/src/langs/ja.js +4 -4
- package/src/langs/km.js +4 -4
- package/src/langs/ko.js +4 -4
- package/src/langs/lv.js +4 -4
- package/src/langs/nl.js +4 -4
- package/src/langs/pl.js +4 -4
- package/src/langs/pt_br.js +13 -13
- package/src/langs/ro.js +4 -4
- package/src/langs/ru.js +4 -4
- package/src/langs/se.js +4 -4
- package/src/langs/tr.js +4 -4
- package/src/langs/uk.js +4 -4
- package/src/langs/ur.js +4 -4
- package/src/langs/zh_cn.js +4 -4
- package/src/modules/{Browser.js → contract/Browser.js} +119 -128
- package/src/modules/{ColorPicker.js → contract/ColorPicker.js} +132 -142
- package/src/modules/contract/Controller.js +589 -0
- package/src/modules/{Figure.js → contract/Figure.js} +591 -411
- package/src/modules/{HueSlider.js → contract/HueSlider.js} +125 -86
- package/src/modules/contract/Modal.js +357 -0
- package/src/modules/contract/index.js +9 -0
- package/src/modules/manager/ApiManager.js +197 -0
- package/src/modules/{FileManager.js → manager/FileManager.js} +128 -160
- package/src/modules/manager/index.js +5 -0
- package/src/modules/{ModalAnchorEditor.js → ui/ModalAnchorEditor.js} +108 -138
- package/src/modules/{SelectMenu.js → ui/SelectMenu.js} +119 -120
- package/src/modules/{_DragHandle.js → ui/_DragHandle.js} +1 -1
- package/src/modules/ui/index.js +6 -0
- package/src/plugins/browser/audioGallery.js +23 -26
- package/src/plugins/browser/fileBrowser.js +25 -28
- package/src/plugins/browser/fileGallery.js +20 -23
- package/src/plugins/browser/imageGallery.js +24 -23
- package/src/plugins/browser/videoGallery.js +27 -29
- package/src/plugins/command/blockquote.js +11 -17
- package/src/plugins/command/exportPDF.js +26 -26
- package/src/plugins/command/fileUpload.js +138 -133
- package/src/plugins/command/list_bulleted.js +48 -44
- package/src/plugins/command/list_numbered.js +48 -44
- package/src/plugins/dropdown/align.js +64 -50
- package/src/plugins/dropdown/backgroundColor.js +34 -35
- package/src/plugins/dropdown/{formatBlock.js → blockStyle.js} +43 -37
- package/src/plugins/dropdown/font.js +50 -36
- package/src/plugins/dropdown/fontColor.js +34 -35
- package/src/plugins/dropdown/hr.js +55 -50
- package/src/plugins/dropdown/layout.js +20 -15
- package/src/plugins/dropdown/lineHeight.js +46 -30
- package/src/plugins/dropdown/list.js +32 -33
- package/src/plugins/dropdown/paragraphStyle.js +40 -34
- package/src/plugins/dropdown/table/index.js +915 -0
- package/src/plugins/dropdown/table/render/table.html.js +308 -0
- package/src/plugins/dropdown/table/render/table.menu.js +121 -0
- package/src/plugins/dropdown/table/services/table.cell.js +465 -0
- package/src/plugins/dropdown/table/services/table.clipboard.js +414 -0
- package/src/plugins/dropdown/table/services/table.grid.js +504 -0
- package/src/plugins/dropdown/table/services/table.resize.js +463 -0
- package/src/plugins/dropdown/table/services/table.selection.js +466 -0
- package/src/plugins/dropdown/table/services/table.style.js +844 -0
- package/src/plugins/dropdown/table/shared/table.constants.js +109 -0
- package/src/plugins/dropdown/table/shared/table.utils.js +219 -0
- package/src/plugins/dropdown/template.js +20 -15
- package/src/plugins/dropdown/textStyle.js +28 -22
- package/src/plugins/field/mention.js +54 -49
- package/src/plugins/index.js +5 -5
- package/src/plugins/input/fontSize.js +100 -97
- package/src/plugins/input/pageNavigator.js +13 -10
- package/src/plugins/modal/audio.js +208 -219
- package/src/plugins/modal/drawing.js +99 -104
- package/src/plugins/modal/embed.js +323 -312
- package/src/plugins/modal/image/index.js +942 -0
- package/src/plugins/modal/image/render/image.html.js +150 -0
- package/src/plugins/modal/image/services/image.size.js +198 -0
- package/src/plugins/modal/image/services/image.upload.js +216 -0
- package/src/plugins/modal/image/shared/image.constants.js +20 -0
- package/src/plugins/modal/link.js +74 -54
- package/src/plugins/modal/math.js +126 -119
- package/src/plugins/modal/video/index.js +858 -0
- package/src/plugins/modal/video/render/video.html.js +131 -0
- package/src/plugins/modal/video/services/video.size.js +281 -0
- package/src/plugins/modal/video/services/video.upload.js +92 -0
- package/src/plugins/popup/anchor.js +57 -49
- package/src/suneditor.js +73 -61
- package/src/themes/cobalt.css +155 -0
- package/src/themes/dark.css +143 -120
- package/src/typedef.js +214 -63
- package/types/assets/icons/defaultIcons.d.ts +8 -0
- package/types/assets/suneditor-contents.css.d.ts +1 -0
- package/types/assets/suneditor.css.d.ts +1 -0
- package/types/core/config/contextProvider.d.ts +148 -0
- package/types/core/config/eventManager.d.ts +68 -0
- package/types/core/config/instanceCheck.d.ts +33 -0
- package/types/core/config/optionProvider.d.ts +147 -0
- package/types/core/editor.d.ts +27 -586
- package/types/core/event/actions/index.d.ts +50 -0
- package/types/core/event/effects/common.registry.d.ts +56 -0
- package/types/core/event/effects/keydown.registry.d.ts +80 -0
- package/types/core/event/effects/ruleHelpers.d.ts +36 -0
- package/types/core/event/eventOrchestrator.d.ts +191 -0
- package/types/core/event/executor.d.ts +13 -0
- package/types/core/event/handlers/handler_toolbar.d.ts +38 -0
- package/types/core/event/handlers/handler_ww_clipboard.d.ts +36 -0
- package/types/core/event/handlers/handler_ww_dragDrop.d.ts +26 -0
- package/types/core/event/handlers/handler_ww_input.d.ts +38 -0
- package/types/core/event/handlers/handler_ww_key.d.ts +40 -0
- package/types/core/event/handlers/handler_ww_mouse.d.ts +47 -0
- package/types/core/event/ports.d.ts +256 -0
- package/types/core/event/reducers/keydown.reducer.d.ts +84 -0
- package/types/core/event/rules/keydown.rule.arrow.d.ts +19 -0
- package/types/core/event/rules/keydown.rule.backspace.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.delete.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.enter.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.tab.d.ts +18 -0
- package/types/core/event/support/defaultLineManager.d.ts +22 -0
- package/types/core/event/support/selectionState.d.ts +29 -0
- package/types/core/kernel/coreKernel.d.ts +219 -0
- package/types/core/kernel/kernelInjector.d.ts +16 -0
- package/types/core/kernel/store.d.ts +170 -0
- package/types/core/logic/dom/char.d.ts +46 -0
- package/types/core/logic/dom/format.d.ts +234 -0
- package/types/core/logic/dom/html.d.ts +290 -0
- package/types/core/logic/dom/inline.d.ts +93 -0
- package/types/core/logic/dom/listFormat.d.ts +101 -0
- package/types/core/logic/dom/nodeTransform.d.ts +110 -0
- package/types/core/logic/dom/offset.d.ts +335 -0
- package/types/core/logic/dom/selection.d.ts +165 -0
- package/types/core/logic/panel/menu.d.ts +93 -0
- package/types/core/logic/panel/toolbar.d.ts +128 -0
- package/types/core/logic/panel/viewer.d.ts +89 -0
- package/types/core/logic/shell/_commandExecutor.d.ts +18 -0
- package/types/core/logic/shell/commandDispatcher.d.ts +65 -0
- package/types/core/logic/shell/component.d.ts +182 -0
- package/types/core/logic/shell/focusManager.d.ts +31 -0
- package/types/core/{base → logic/shell}/history.d.ts +13 -12
- package/types/core/logic/shell/pluginManager.d.ts +115 -0
- package/types/core/logic/shell/shortcuts.d.ts +131 -0
- package/types/core/logic/shell/ui.d.ts +261 -0
- package/types/core/schema/context.d.ts +104 -0
- package/types/core/schema/frameContext.d.ts +320 -0
- package/types/core/schema/options.d.ts +1241 -0
- package/types/core/section/constructor.d.ts +117 -652
- package/types/core/section/documentType.d.ts +43 -61
- package/types/events.d.ts +796 -65
- package/types/helper/clipboard.d.ts +5 -4
- package/types/helper/converter.d.ts +55 -43
- package/types/helper/dom/domCheck.d.ts +27 -19
- package/types/helper/dom/domQuery.d.ts +76 -57
- package/types/helper/dom/domUtils.d.ts +62 -39
- package/types/helper/dom/index.d.ts +87 -1
- package/types/helper/env.d.ts +16 -13
- package/types/helper/index.d.ts +8 -2
- package/types/helper/keyCodeMap.d.ts +24 -23
- package/types/helper/numbers.d.ts +4 -6
- package/types/helper/unicode.d.ts +4 -3
- package/types/hooks/base.d.ts +239 -0
- package/types/hooks/params.d.ts +65 -0
- package/types/index.d.ts +20 -117
- package/types/interfaces/contracts.d.ts +183 -0
- package/types/interfaces/index.d.ts +3 -0
- package/types/interfaces/plugins.d.ts +168 -0
- package/types/langs/_Lang.d.ts +2 -2
- package/types/langs/index.d.ts +2 -2
- package/types/modules/contract/Browser.d.ts +262 -0
- package/types/modules/contract/ColorPicker.d.ts +99 -0
- package/types/modules/contract/Controller.d.ts +204 -0
- package/types/modules/contract/Figure.d.ts +529 -0
- package/types/modules/{HueSlider.d.ts → contract/HueSlider.d.ts} +39 -28
- package/types/modules/contract/Modal.d.ts +62 -0
- package/types/modules/contract/index.d.ts +7 -0
- package/types/modules/manager/ApiManager.d.ts +106 -0
- package/types/modules/manager/FileManager.d.ts +124 -0
- package/types/modules/manager/index.d.ts +3 -0
- package/types/modules/ui/ModalAnchorEditor.d.ts +152 -0
- package/types/modules/ui/SelectMenu.d.ts +107 -0
- package/types/modules/{_DragHandle.d.ts → ui/_DragHandle.d.ts} +1 -0
- package/types/modules/ui/index.d.ts +4 -0
- package/types/plugins/browser/audioGallery.d.ts +33 -41
- package/types/plugins/browser/fileBrowser.d.ts +42 -50
- package/types/plugins/browser/fileGallery.d.ts +33 -41
- package/types/plugins/browser/imageGallery.d.ts +30 -37
- package/types/plugins/browser/videoGallery.d.ts +33 -41
- package/types/plugins/command/blockquote.d.ts +4 -21
- package/types/plugins/command/exportPDF.d.ts +23 -33
- package/types/plugins/command/fileUpload.d.ts +80 -100
- package/types/plugins/command/list_bulleted.d.ts +9 -35
- package/types/plugins/command/list_numbered.d.ts +9 -35
- package/types/plugins/dropdown/align.d.ts +23 -46
- package/types/plugins/dropdown/backgroundColor.d.ts +35 -53
- package/types/plugins/dropdown/blockStyle.d.ts +45 -0
- package/types/plugins/dropdown/font.d.ts +18 -41
- package/types/plugins/dropdown/fontColor.d.ts +35 -53
- package/types/plugins/dropdown/hr.d.ts +26 -52
- package/types/plugins/dropdown/layout.d.ts +19 -25
- package/types/plugins/dropdown/lineHeight.d.ts +21 -39
- package/types/plugins/dropdown/list.d.ts +6 -34
- package/types/plugins/dropdown/paragraphStyle.d.ts +34 -45
- package/types/plugins/dropdown/table/index.d.ts +158 -0
- package/types/plugins/dropdown/table/render/table.html.d.ts +71 -0
- package/types/plugins/dropdown/table/render/table.menu.d.ts +59 -0
- package/types/plugins/dropdown/table/services/table.cell.d.ts +76 -0
- package/types/plugins/dropdown/table/services/table.clipboard.d.ts +26 -0
- package/types/plugins/dropdown/table/services/table.grid.d.ts +77 -0
- package/types/plugins/dropdown/table/services/table.resize.d.ts +72 -0
- package/types/plugins/dropdown/table/services/table.selection.d.ts +59 -0
- package/types/plugins/dropdown/table/services/table.style.d.ts +162 -0
- package/types/plugins/dropdown/table/shared/table.constants.d.ts +134 -0
- package/types/plugins/dropdown/table/shared/table.utils.d.ts +91 -0
- package/types/plugins/dropdown/template.d.ts +19 -25
- package/types/plugins/dropdown/textStyle.d.ts +23 -30
- package/types/plugins/field/mention.d.ts +66 -72
- package/types/plugins/index.d.ts +41 -40
- package/types/plugins/input/fontSize.d.ts +57 -96
- package/types/plugins/input/pageNavigator.d.ts +5 -8
- package/types/plugins/modal/audio.d.ts +60 -153
- package/types/plugins/modal/drawing.d.ts +16 -118
- package/types/plugins/modal/embed.d.ts +46 -166
- package/types/plugins/modal/image/index.d.ts +281 -0
- package/types/plugins/modal/image/render/image.html.d.ts +45 -0
- package/types/plugins/modal/image/services/image.size.d.ts +55 -0
- package/types/plugins/modal/image/services/image.upload.d.ts +24 -0
- package/types/plugins/modal/image/shared/image.constants.d.ts +17 -0
- package/types/plugins/modal/link.d.ts +46 -66
- package/types/plugins/modal/math.d.ts +17 -86
- package/types/plugins/modal/{video.d.ts → video/index.d.ts} +89 -221
- package/types/plugins/modal/video/render/video.html.d.ts +37 -0
- package/types/plugins/modal/video/services/video.size.d.ts +74 -0
- package/types/plugins/modal/video/services/video.upload.d.ts +19 -0
- package/types/plugins/popup/anchor.d.ts +8 -38
- package/types/suneditor.d.ts +55 -24
- package/types/typedef.d.ts +344 -228
- package/CONTRIBUTING.md +0 -186
- package/src/core/base/eventHandlers/handler_ww_key_input.js +0 -1200
- package/src/core/base/eventHandlers/handler_ww_mouse.js +0 -194
- package/src/core/base/eventManager.js +0 -1523
- package/src/core/class/component.js +0 -856
- package/src/core/class/format.js +0 -3433
- package/src/core/class/menu.js +0 -346
- package/src/core/class/selection.js +0 -610
- package/src/core/class/shortcuts.js +0 -98
- package/src/core/class/toolbar.js +0 -431
- package/src/core/class/ui.js +0 -424
- package/src/core/class/viewer.js +0 -750
- package/src/core/section/actives.js +0 -266
- package/src/core/section/context.js +0 -102
- package/src/editorInjector/_classes.js +0 -36
- package/src/editorInjector/_core.js +0 -87
- package/src/editorInjector/index.js +0 -73
- package/src/modules/ApiManager.js +0 -191
- package/src/modules/Controller.js +0 -474
- package/src/modules/Modal.js +0 -346
- package/src/modules/index.js +0 -14
- package/src/plugins/dropdown/table.js +0 -4034
- package/src/plugins/modal/image.js +0 -1376
- package/src/plugins/modal/video.js +0 -1226
- package/types/core/base/eventHandlers/handler_toolbar.d.ts +0 -41
- package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +0 -40
- package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +0 -35
- package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +0 -45
- package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +0 -39
- package/types/core/base/eventManager.d.ts +0 -401
- package/types/core/class/char.d.ts +0 -61
- package/types/core/class/component.d.ts +0 -213
- package/types/core/class/format.d.ts +0 -623
- package/types/core/class/html.d.ts +0 -430
- package/types/core/class/menu.d.ts +0 -126
- package/types/core/class/nodeTransform.d.ts +0 -93
- package/types/core/class/offset.d.ts +0 -522
- package/types/core/class/selection.d.ts +0 -188
- package/types/core/class/shortcuts.d.ts +0 -142
- package/types/core/class/toolbar.d.ts +0 -189
- package/types/core/class/ui.d.ts +0 -164
- package/types/core/class/viewer.d.ts +0 -140
- package/types/core/section/actives.d.ts +0 -46
- package/types/core/section/context.d.ts +0 -45
- package/types/editorInjector/_classes.d.ts +0 -41
- package/types/editorInjector/_core.d.ts +0 -87
- package/types/editorInjector/index.d.ts +0 -69
- package/types/modules/ApiManager.d.ts +0 -125
- package/types/modules/Browser.d.ts +0 -326
- package/types/modules/ColorPicker.d.ts +0 -135
- package/types/modules/Controller.d.ts +0 -251
- package/types/modules/Figure.d.ts +0 -517
- package/types/modules/FileManager.d.ts +0 -202
- package/types/modules/Modal.d.ts +0 -111
- package/types/modules/ModalAnchorEditor.d.ts +0 -236
- package/types/modules/SelectMenu.d.ts +0 -194
- package/types/modules/index.d.ts +0 -26
- package/types/plugins/dropdown/formatBlock.d.ts +0 -55
- package/types/plugins/dropdown/table.d.ts +0 -627
- package/types/plugins/modal/image.d.ts +0 -451
- /package/{LICENSE → LICENSE.txt} +0 -0
|
@@ -1,53 +1,56 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { PluginDropdown } from '../../interfaces';
|
|
2
2
|
import { dom } from '../../helper';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {{tag: string, command: "line"|"br-line"|"block", name?: string, class?: string}} BlockStyleItem
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {Object} BlockStylePluginOptions
|
|
10
|
+
* @property {Array<"p"|"div"|"blockquote"|"pre"|"h1"|"h2"|"h3"|"h4"|"h5"|"h6"|string|BlockStyleItem>} [items] - Format list
|
|
11
|
+
*/
|
|
12
|
+
|
|
4
13
|
/**
|
|
5
14
|
* @class
|
|
6
|
-
* @description
|
|
15
|
+
* @description BlockStyle Plugin (`P`, `BLOCKQUOTE`, `PRE`, `H1`, `H2`...)
|
|
7
16
|
*/
|
|
8
|
-
class
|
|
9
|
-
static key = '
|
|
10
|
-
static type = 'dropdown';
|
|
17
|
+
class BlockStyle extends PluginDropdown {
|
|
18
|
+
static key = 'blockStyle';
|
|
11
19
|
static className = 'se-btn-select se-btn-tool-format';
|
|
12
20
|
|
|
13
21
|
/**
|
|
14
22
|
* @constructor
|
|
15
|
-
* @param {
|
|
16
|
-
* @param {
|
|
17
|
-
* @param {Array<string>} pluginOptions.items - Format list
|
|
23
|
+
* @param {SunEditor.Kernel} editor - The core kernel
|
|
24
|
+
* @param {BlockStylePluginOptions} pluginOptions - Plugin options
|
|
18
25
|
*/
|
|
19
26
|
constructor(editor, pluginOptions) {
|
|
20
27
|
super(editor);
|
|
21
28
|
// plugin basic properties
|
|
22
|
-
this.title = this
|
|
23
|
-
this.inner = '<span class="se-txt">' + this
|
|
29
|
+
this.title = this.$.lang.formats;
|
|
30
|
+
this.inner = '<span class="se-txt">' + this.$.lang.formats + '</span>' + this.$.icons.arrow_down;
|
|
24
31
|
|
|
25
32
|
// create HTML
|
|
26
|
-
const menu = CreateHTML(
|
|
33
|
+
const menu = CreateHTML(this.$, pluginOptions.items);
|
|
27
34
|
|
|
28
35
|
// members
|
|
29
36
|
this.formatList = menu.querySelectorAll('li button');
|
|
30
37
|
this.currentFormat = '';
|
|
31
38
|
|
|
32
39
|
// init
|
|
33
|
-
this
|
|
40
|
+
this.$.menu.initDropdownTarget(BlockStyle, menu);
|
|
34
41
|
}
|
|
35
42
|
|
|
36
43
|
/**
|
|
37
|
-
* @
|
|
38
|
-
* @
|
|
39
|
-
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
40
|
-
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
41
|
-
* @returns {boolean} - Whether the plugin is active
|
|
42
|
-
* - If it returns "undefined", it will no longer be called in this scope.
|
|
44
|
+
* @hook Editor.EventManager
|
|
45
|
+
* @type {SunEditor.Hook.Event.Active}
|
|
43
46
|
*/
|
|
44
47
|
active(element, target) {
|
|
45
|
-
let formatTitle = this
|
|
48
|
+
let formatTitle = this.$.lang.formats;
|
|
46
49
|
const targetText = target.querySelector('.se-txt');
|
|
47
50
|
|
|
48
51
|
if (!element) {
|
|
49
52
|
dom.utils.changeTxt(targetText, formatTitle);
|
|
50
|
-
} else if (this
|
|
53
|
+
} else if (this.$.format.isLine(element)) {
|
|
51
54
|
const formatList = this.formatList;
|
|
52
55
|
const nodeName = element.nodeName.toLowerCase();
|
|
53
56
|
const className = (element.className.match(/(\s|^)__se__format__[^\s]+/) || [''])[0].trim();
|
|
@@ -71,9 +74,8 @@ class FormatBlock extends EditorInjector {
|
|
|
71
74
|
}
|
|
72
75
|
|
|
73
76
|
/**
|
|
74
|
-
* @
|
|
75
|
-
* @
|
|
76
|
-
* @param {HTMLElement} target Line element at the current cursor position
|
|
77
|
+
* @override
|
|
78
|
+
* @type {PluginDropdown['on']}
|
|
77
79
|
*/
|
|
78
80
|
on(target) {
|
|
79
81
|
const formatList = this.formatList;
|
|
@@ -95,38 +97,41 @@ class FormatBlock extends EditorInjector {
|
|
|
95
97
|
}
|
|
96
98
|
|
|
97
99
|
/**
|
|
98
|
-
* @
|
|
99
|
-
* @
|
|
100
|
-
* - Called when an item in the "dropdown" menu is clicked.
|
|
101
|
-
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
100
|
+
* @override
|
|
101
|
+
* @type {PluginDropdown['action']}
|
|
102
102
|
*/
|
|
103
103
|
action(target) {
|
|
104
104
|
// "line"|"br-line"|"block"
|
|
105
105
|
const command = target.getAttribute('data-command');
|
|
106
106
|
const tag = target.firstElementChild;
|
|
107
107
|
if (command === 'block') {
|
|
108
|
-
this
|
|
108
|
+
this.$.format.applyBlock(tag);
|
|
109
109
|
} else if (command === 'br-line') {
|
|
110
|
-
this
|
|
110
|
+
this.$.format.setBrLine(tag);
|
|
111
111
|
} else {
|
|
112
|
-
this
|
|
112
|
+
this.$.format.setLine(tag);
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
this
|
|
115
|
+
this.$.menu.dropdownOff();
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/**
|
|
119
|
-
* @description Create a header tag, call by
|
|
120
|
-
* - (e.g. shortcuts._h1: ['c+s+49+$~
|
|
121
|
-
* @param {
|
|
119
|
+
* @description Create a header tag, call by `shortcut` class
|
|
120
|
+
* - (e.g. shortcuts._h1: ['c+s+49+$~blockStyle.applyHeaderByShortcut', ''])
|
|
121
|
+
* @param {SunEditor.HookParams.Shortcut} params - Information of the `shortcut` plugin
|
|
122
122
|
*/
|
|
123
123
|
applyHeaderByShortcut({ keyCode }) {
|
|
124
124
|
const headerNum = keyCode.match(/\d+$/)?.[0];
|
|
125
125
|
const tag = dom.utils.createElement(`H${headerNum}`);
|
|
126
|
-
this
|
|
126
|
+
this.$.format.setLine(tag);
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
+
/**
|
|
131
|
+
* @param {SunEditor.Deps} $ - Kernel dependencies
|
|
132
|
+
* @param {Array<string|BlockStyleItem>} [items] - Block style items
|
|
133
|
+
* @returns {HTMLElement}
|
|
134
|
+
*/
|
|
130
135
|
function CreateHTML({ lang }, items) {
|
|
131
136
|
const defaultFormats = ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
|
|
132
137
|
const formatList = !items || items.length === 0 ? defaultFormats : items;
|
|
@@ -138,7 +143,8 @@ function CreateHTML({ lang }, items) {
|
|
|
138
143
|
for (let i = 0, len = formatList.length, format, tagName, command, name, h, attrs, className; i < len; i++) {
|
|
139
144
|
format = formatList[i];
|
|
140
145
|
|
|
141
|
-
if (typeof format === 'string'
|
|
146
|
+
if (typeof format === 'string') {
|
|
147
|
+
if (!defaultFormats.includes(format)) continue;
|
|
142
148
|
tagName = format.toLowerCase();
|
|
143
149
|
command = tagName === 'blockquote' ? 'block' : tagName === 'pre' ? 'br-line' : 'line';
|
|
144
150
|
h = /^h/.test(tagName) ? tagName.match(/\d+/)[0] : '';
|
|
@@ -167,4 +173,4 @@ function CreateHTML({ lang }, items) {
|
|
|
167
173
|
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
|
|
168
174
|
}
|
|
169
175
|
|
|
170
|
-
export default
|
|
176
|
+
export default BlockStyle;
|
|
@@ -1,49 +1,50 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { PluginDropdown } from '../../interfaces';
|
|
2
2
|
import { dom } from '../../helper';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {Object} FontPluginOptions
|
|
6
|
+
* @property {Array<string>} [items] - Font list
|
|
7
|
+
*/
|
|
8
|
+
|
|
4
9
|
/**
|
|
5
10
|
* @class
|
|
6
11
|
* @description Text font plugin
|
|
7
12
|
*/
|
|
8
|
-
class Font extends
|
|
13
|
+
class Font extends PluginDropdown {
|
|
9
14
|
static key = 'font';
|
|
10
|
-
static type = 'dropdown';
|
|
11
15
|
static className = 'se-btn-select se-btn-tool-font';
|
|
12
16
|
|
|
17
|
+
#defaultValue;
|
|
18
|
+
|
|
13
19
|
/**
|
|
14
20
|
* @constructor
|
|
15
|
-
* @param {
|
|
16
|
-
* @param {
|
|
17
|
-
* @param {Array<string>} pluginOptions.items - Font list
|
|
18
|
-
* @param {number} pluginOptions.splitNum - Number of colors per line
|
|
19
|
-
* @param {boolean} pluginOptions.disableHEXInput - Disable HEX input
|
|
21
|
+
* @param {SunEditor.Kernel} editor - The core kernel
|
|
22
|
+
* @param {FontPluginOptions} pluginOptions - plugin options
|
|
20
23
|
*/
|
|
21
24
|
constructor(editor, pluginOptions) {
|
|
22
25
|
super(editor);
|
|
23
26
|
// plugin basic properties
|
|
24
|
-
this.title = this
|
|
25
|
-
this.inner = '<span class="se-txt">' + this
|
|
27
|
+
this.title = this.$.lang.font;
|
|
28
|
+
this.inner = '<span class="se-txt">' + this.$.lang.font + '</span>' + this.$.icons.arrow_down;
|
|
26
29
|
|
|
27
30
|
// create HTML
|
|
28
31
|
const fontList = pluginOptions.items || ['Arial', 'Comic Sans MS', 'Courier New', 'Impact', 'Georgia', 'tahoma', 'Trebuchet MS', 'Verdana'];
|
|
29
|
-
const menu = CreateHTML(
|
|
32
|
+
const menu = CreateHTML(this.$, fontList);
|
|
30
33
|
|
|
31
34
|
// members
|
|
32
35
|
this.currentFont = '';
|
|
33
36
|
this.fontList = menu.querySelectorAll('ul li button');
|
|
34
37
|
this.fontArray = fontList;
|
|
35
38
|
|
|
39
|
+
this.#defaultValue = /** @type {HTMLSpanElement} */ (menu.querySelector('.se-sub-list span'));
|
|
40
|
+
|
|
36
41
|
// init
|
|
37
|
-
this
|
|
42
|
+
this.$.menu.initDropdownTarget(Font, menu);
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
/**
|
|
41
|
-
* @
|
|
42
|
-
* @
|
|
43
|
-
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
44
|
-
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
45
|
-
* @returns {boolean} - Whether the plugin is active
|
|
46
|
-
* - If it returns "undefined", it will no longer be called in this scope.
|
|
46
|
+
* @hook Editor.EventManager
|
|
47
|
+
* @type {SunEditor.Hook.Event.Active}
|
|
47
48
|
*/
|
|
48
49
|
active(element, target) {
|
|
49
50
|
const targetText = target.querySelector('.se-txt');
|
|
@@ -51,15 +52,15 @@ class Font extends EditorInjector {
|
|
|
51
52
|
|
|
52
53
|
let fontFamily = '';
|
|
53
54
|
if (!element) {
|
|
54
|
-
const font = this.
|
|
55
|
+
const font = this.$.store.get('hasFocus') ? this.$.frameContext.get('wwComputedStyle').fontFamily : this.$.lang.font;
|
|
55
56
|
dom.utils.changeTxt(targetText, font);
|
|
56
|
-
dom.utils.changeTxt(tooltip, this.
|
|
57
|
-
} else if (this
|
|
57
|
+
dom.utils.changeTxt(tooltip, this.$.store.get('hasFocus') ? this.$.lang.font + (font ? ' (' + font + ')' : '') : font);
|
|
58
|
+
} else if (this.$.format.isLine(element)) {
|
|
58
59
|
return undefined;
|
|
59
60
|
} else if ((fontFamily = dom.utils.getStyle(element, 'fontFamily'))) {
|
|
60
61
|
const selectFont = fontFamily.replace(/["']/g, '');
|
|
61
62
|
dom.utils.changeTxt(targetText, selectFont);
|
|
62
|
-
dom.utils.changeTxt(tooltip, this
|
|
63
|
+
dom.utils.changeTxt(tooltip, this.$.lang.font + ' (' + selectFont + ')');
|
|
63
64
|
return true;
|
|
64
65
|
}
|
|
65
66
|
|
|
@@ -67,33 +68,38 @@ class Font extends EditorInjector {
|
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
/**
|
|
70
|
-
* @
|
|
71
|
-
* @
|
|
72
|
-
* @param {HTMLElement} target Line element at the current cursor position
|
|
71
|
+
* @override
|
|
72
|
+
* @type {PluginDropdown['on']}
|
|
73
73
|
*/
|
|
74
74
|
on(target) {
|
|
75
75
|
const fontList = this.fontList;
|
|
76
76
|
const currentFont = target.querySelector('.se-txt').textContent;
|
|
77
77
|
|
|
78
78
|
if (currentFont !== this.currentFont) {
|
|
79
|
+
let found = false;
|
|
79
80
|
for (let i = 0, len = fontList.length; i < len; i++) {
|
|
80
81
|
if (currentFont === (fontList[i].getAttribute('data-command') || '').replace(/'|"/g, '')) {
|
|
81
82
|
dom.utils.addClass(fontList[i], 'active');
|
|
83
|
+
found = true;
|
|
82
84
|
} else {
|
|
83
85
|
dom.utils.removeClass(fontList[i], 'active');
|
|
84
86
|
}
|
|
85
87
|
}
|
|
86
88
|
|
|
87
89
|
this.currentFont = currentFont;
|
|
90
|
+
|
|
91
|
+
if (!found) {
|
|
92
|
+
this.#defaultValue.textContent = currentFont;
|
|
93
|
+
this.#defaultValue.style.display = 'block';
|
|
94
|
+
} else {
|
|
95
|
+
this.#defaultValue.style.display = 'none';
|
|
96
|
+
}
|
|
88
97
|
}
|
|
89
98
|
}
|
|
90
99
|
|
|
91
100
|
/**
|
|
92
|
-
* @
|
|
93
|
-
* @
|
|
94
|
-
* - Called when an item in the "dropdown" menu is clicked.
|
|
95
|
-
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
96
|
-
* @returns {Promise<void>}
|
|
101
|
+
* @override
|
|
102
|
+
* @type {PluginDropdown['action']}
|
|
97
103
|
*/
|
|
98
104
|
async action(target) {
|
|
99
105
|
let value = target.getAttribute('data-command');
|
|
@@ -103,25 +109,33 @@ class Font extends EditorInjector {
|
|
|
103
109
|
}
|
|
104
110
|
|
|
105
111
|
// before event
|
|
106
|
-
if ((await this.triggerEvent('onFontActionBefore', { value })) === false) return;
|
|
112
|
+
if ((await this.$.eventManager.triggerEvent('onFontActionBefore', { value })) === false) return;
|
|
107
113
|
|
|
108
114
|
const newNode = dom.utils.createElement('SPAN', { style: 'font-family: ' + value + ';' });
|
|
109
|
-
this.
|
|
115
|
+
this.$.inline.apply(newNode, { stylesToModify: ['font-family'], nodesToRemove: null, strictRemove: null });
|
|
110
116
|
} else {
|
|
111
|
-
this.
|
|
117
|
+
this.$.inline.apply(null, { stylesToModify: ['font-family'], nodesToRemove: ['span'], strictRemove: true });
|
|
112
118
|
}
|
|
113
119
|
|
|
114
|
-
this
|
|
120
|
+
this.$.menu.dropdownOff();
|
|
115
121
|
}
|
|
116
122
|
}
|
|
117
123
|
|
|
124
|
+
/**
|
|
125
|
+
* @param {SunEditor.Deps} $ - Kernel dependencies
|
|
126
|
+
* @param {string[]} fontList - Font name list
|
|
127
|
+
* @returns {HTMLElement}
|
|
128
|
+
*/
|
|
118
129
|
function CreateHTML({ lang }, fontList) {
|
|
119
130
|
let list = /*html*/ `
|
|
120
131
|
<div class="se-list-inner">
|
|
121
132
|
<ul class="se-list-basic">
|
|
122
133
|
<li>
|
|
123
|
-
<button type="button" class="se-btn se-btn-list default_value" data-command="" title="${lang.default}" aria-label="${lang.default}">
|
|
124
|
-
|
|
134
|
+
<button type="button" class="se-btn se-btn-list default_value" data-command="" title="${lang.default}" aria-label="${lang.default}">
|
|
135
|
+
${lang.default}
|
|
136
|
+
</button>
|
|
137
|
+
</li>
|
|
138
|
+
<li class="se-btn-list se-sub-list"><span></span></li>`;
|
|
125
139
|
|
|
126
140
|
for (let i = 0, len = fontList.length, font, text; i < len; i++) {
|
|
127
141
|
font = fontList[i];
|
|
@@ -1,53 +1,52 @@
|
|
|
1
|
-
import
|
|
2
|
-
import ColorPicker from '../../modules/
|
|
1
|
+
import { PluginDropdownFree } from '../../interfaces';
|
|
2
|
+
import { ColorPicker } from '../../modules/contract';
|
|
3
3
|
import { dom } from '../../helper';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {Object} FontColorPluginOptions
|
|
7
|
+
* @property {Array<string|{value: string, name: string}>} [items] - Color list
|
|
8
|
+
* @property {number} [splitNum] - Number of colors per line
|
|
9
|
+
* @property {boolean} [disableHEXInput] - Disable HEX input
|
|
10
|
+
*/
|
|
11
|
+
|
|
5
12
|
/**
|
|
6
13
|
* @class
|
|
7
14
|
* @description Font color plugin
|
|
8
15
|
*/
|
|
9
|
-
class FontColor extends
|
|
16
|
+
class FontColor extends PluginDropdownFree {
|
|
10
17
|
static key = 'fontColor';
|
|
11
|
-
static type = 'dropdown-free';
|
|
12
18
|
static className = '';
|
|
13
19
|
|
|
14
20
|
/**
|
|
15
21
|
* @constructor
|
|
16
|
-
* @param {
|
|
17
|
-
* @param {
|
|
18
|
-
* @param {Array<string|{value: string, name: string}>} pluginOptions.items - Color list
|
|
19
|
-
* @param {number} pluginOptions.splitNum - Number of colors per line
|
|
20
|
-
* @param {boolean} pluginOptions.disableHEXInput - Disable HEX input
|
|
22
|
+
* @param {SunEditor.Kernel} editor - The core kernel
|
|
23
|
+
* @param {FontColorPluginOptions} pluginOptions - Plugin options
|
|
21
24
|
*/
|
|
22
25
|
constructor(editor, pluginOptions) {
|
|
23
26
|
super(editor);
|
|
24
27
|
// plugin basic properties
|
|
25
|
-
this.title = this
|
|
28
|
+
this.title = this.$.lang.fontColor;
|
|
26
29
|
this.icon = 'font_color';
|
|
27
30
|
|
|
28
31
|
// create HTML
|
|
29
32
|
const menu = CreateHTML();
|
|
30
33
|
|
|
31
34
|
// members
|
|
32
|
-
this.colorPicker = new ColorPicker(this, 'color', {
|
|
35
|
+
this.colorPicker = new ColorPicker(this, this.$, 'color', {
|
|
36
|
+
form: menu,
|
|
33
37
|
colorList: pluginOptions.items,
|
|
34
38
|
splitNum: pluginOptions.splitNum,
|
|
35
39
|
disableHEXInput: pluginOptions.disableHEXInput,
|
|
36
|
-
hueSliderOptions: { controllerOptions: {
|
|
40
|
+
hueSliderOptions: { controllerOptions: { isOutsideForm: true } },
|
|
37
41
|
});
|
|
38
42
|
|
|
39
|
-
//
|
|
40
|
-
menu.
|
|
41
|
-
this.menu.initDropdownTarget(FontColor, menu);
|
|
43
|
+
// init
|
|
44
|
+
this.$.menu.initDropdownTarget(FontColor, menu);
|
|
42
45
|
}
|
|
43
46
|
|
|
44
47
|
/**
|
|
45
|
-
* @
|
|
46
|
-
* @
|
|
47
|
-
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
48
|
-
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
49
|
-
* @returns {boolean} - Whether the plugin is active
|
|
50
|
-
* - If it returns "undefined", it will no longer be called in this scope.
|
|
48
|
+
* @hook Editor.EventManager
|
|
49
|
+
* @type {SunEditor.Hook.Event.Active}
|
|
51
50
|
*/
|
|
52
51
|
active(element, target) {
|
|
53
52
|
/** @type {HTMLElement} */
|
|
@@ -57,7 +56,7 @@ class FontColor extends EditorInjector {
|
|
|
57
56
|
let color = '';
|
|
58
57
|
if (!element) {
|
|
59
58
|
colorHelper.style.color = color;
|
|
60
|
-
} else if (this
|
|
59
|
+
} else if (this.$.format.isLine(element)) {
|
|
61
60
|
return undefined;
|
|
62
61
|
} else if ((color = dom.utils.getStyle(element, 'color'))) {
|
|
63
62
|
colorHelper.style.color = color;
|
|
@@ -68,40 +67,40 @@ class FontColor extends EditorInjector {
|
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
/**
|
|
71
|
-
* @
|
|
72
|
-
* @
|
|
73
|
-
* @param {HTMLElement} target Line element at the current cursor position
|
|
70
|
+
* @override
|
|
71
|
+
* @type {PluginDropdownFree['on']}
|
|
74
72
|
*/
|
|
75
73
|
on(target) {
|
|
76
|
-
this.colorPicker.init(this
|
|
74
|
+
this.colorPicker.init(this.$.selection.getNode(), target, (current) => this.$.format.isLine(current));
|
|
77
75
|
}
|
|
78
76
|
|
|
79
77
|
/**
|
|
80
|
-
* @
|
|
81
|
-
* @
|
|
78
|
+
* @override
|
|
79
|
+
* @type {PluginDropdownFree['off']}
|
|
82
80
|
*/
|
|
83
81
|
off() {
|
|
84
82
|
this.colorPicker.hueSliderClose();
|
|
85
83
|
}
|
|
86
84
|
|
|
87
85
|
/**
|
|
88
|
-
* @
|
|
89
|
-
* @
|
|
90
|
-
* - This plugin is by applying the "ColorPicker" module globally to the "dropdown" menu, the default "action" method is not called.
|
|
91
|
-
* @param {string} color - Color code (hex)
|
|
86
|
+
* @hook Modules.ColorPicker
|
|
87
|
+
* @type {SunEditor.Hook.ColorPicker.Action}
|
|
92
88
|
*/
|
|
93
89
|
colorPickerAction(color) {
|
|
94
90
|
if (color) {
|
|
95
91
|
const newNode = dom.utils.createElement('SPAN', { style: 'color: ' + color + ';' });
|
|
96
|
-
this.
|
|
92
|
+
this.$.inline.apply(newNode, { stylesToModify: ['color'], nodesToRemove: null, strictRemove: null });
|
|
97
93
|
} else {
|
|
98
|
-
this.
|
|
94
|
+
this.$.inline.apply(null, { stylesToModify: ['color'], nodesToRemove: ['span'], strictRemove: true });
|
|
99
95
|
}
|
|
100
96
|
|
|
101
|
-
this
|
|
97
|
+
this.$.menu.dropdownOff();
|
|
102
98
|
}
|
|
103
99
|
}
|
|
104
100
|
|
|
101
|
+
/**
|
|
102
|
+
* @returns {HTMLElement}
|
|
103
|
+
*/
|
|
105
104
|
function CreateHTML() {
|
|
106
105
|
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, null);
|
|
107
106
|
}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { PluginDropdown } from '../../interfaces';
|
|
2
2
|
import { dom } from '../../helper';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {Object} HRPluginOptions
|
|
6
|
+
* @property {Array<{name: string, class: string, style?: string}>} [items] - HR list
|
|
7
|
+
*/
|
|
8
|
+
|
|
4
9
|
/**
|
|
5
10
|
* @class
|
|
6
11
|
* @description HR Plugin
|
|
7
12
|
*/
|
|
8
|
-
class HR extends
|
|
13
|
+
class HR extends PluginDropdown {
|
|
9
14
|
static key = 'hr';
|
|
10
|
-
static type = 'dropdown';
|
|
11
15
|
static className = '';
|
|
16
|
+
|
|
12
17
|
/**
|
|
13
|
-
* @this {HR}
|
|
14
18
|
* @param {HTMLElement} node - The node to check.
|
|
15
19
|
* @returns {HTMLElement|null} Returns a node if the node is a valid component.
|
|
16
20
|
*/
|
|
@@ -20,111 +24,112 @@ class HR extends EditorInjector {
|
|
|
20
24
|
|
|
21
25
|
/**
|
|
22
26
|
* @constructor
|
|
23
|
-
* @param {
|
|
24
|
-
* @param {
|
|
25
|
-
* @param {Array<{name: string, class: string}>} pluginOptions.items - HR list
|
|
27
|
+
* @param {SunEditor.Kernel} editor - The core kernel
|
|
28
|
+
* @param {HRPluginOptions} pluginOptions - Plugin options
|
|
26
29
|
*/
|
|
27
30
|
constructor(editor, pluginOptions) {
|
|
28
31
|
// plugin bisic properties
|
|
29
32
|
super(editor);
|
|
30
|
-
this.title = this
|
|
33
|
+
this.title = this.$.lang.horizontalLine;
|
|
31
34
|
this.icon = 'horizontal_line';
|
|
32
35
|
|
|
33
36
|
// create HTML
|
|
34
|
-
const HRMenus = CreateHTML(
|
|
37
|
+
const HRMenus = CreateHTML(this.$, pluginOptions.items);
|
|
35
38
|
|
|
36
39
|
// members
|
|
37
40
|
this.list = HRMenus.querySelectorAll('button');
|
|
38
41
|
|
|
39
42
|
// init
|
|
40
|
-
this
|
|
43
|
+
this.$.menu.initDropdownTarget(HR, HRMenus);
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
/**
|
|
44
|
-
* @
|
|
45
|
-
* @
|
|
46
|
-
* @param {HTMLElement} target Target component element
|
|
47
|
+
* @hook Editor.Component
|
|
48
|
+
* @type {SunEditor.Hook.Component.Select}
|
|
47
49
|
*/
|
|
48
|
-
|
|
50
|
+
componentSelect(target) {
|
|
49
51
|
dom.utils.addClass(target, 'on');
|
|
50
52
|
}
|
|
51
53
|
|
|
52
54
|
/**
|
|
53
|
-
* @
|
|
54
|
-
* @
|
|
55
|
-
* @param {HTMLElement} element Target element
|
|
55
|
+
* @hook Editor.Component
|
|
56
|
+
* @type {SunEditor.Hook.Component.Deselect}
|
|
56
57
|
*/
|
|
57
|
-
|
|
58
|
+
componentDeselect(element) {
|
|
58
59
|
dom.utils.removeClass(element, 'on');
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
/**
|
|
62
|
-
* @
|
|
63
|
-
* @
|
|
64
|
-
* @param {HTMLElement} target Target element
|
|
63
|
+
* @hook Editor.Component
|
|
64
|
+
* @type {SunEditor.Hook.Component.Destroy}
|
|
65
65
|
*/
|
|
66
|
-
|
|
66
|
+
componentDestroy(target) {
|
|
67
67
|
if (!target) return;
|
|
68
68
|
|
|
69
69
|
const focusEl = target.previousElementSibling || target.nextElementSibling;
|
|
70
70
|
dom.utils.removeItem(target);
|
|
71
71
|
|
|
72
72
|
// focus
|
|
73
|
-
this.
|
|
74
|
-
this
|
|
73
|
+
this.$.focusManager.focusEdge(focusEl);
|
|
74
|
+
this.$.history.push(false);
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
/**
|
|
78
|
-
* @
|
|
79
|
-
* @
|
|
80
|
-
* - Called when an item in the "dropdown" menu is clicked.
|
|
81
|
-
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
78
|
+
* @hook Editor.Core
|
|
79
|
+
* @type {SunEditor.Hook.Core.Shortcut}
|
|
82
80
|
*/
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
this.
|
|
81
|
+
shortcut({ line, range }) {
|
|
82
|
+
const newLine = this.$.nodeTransform.split(range.endContainer, range.endOffset, 0);
|
|
83
|
+
this.submit('__se__solid');
|
|
84
|
+
dom.utils.removeItem(line);
|
|
85
|
+
this.$.selection.setRange(newLine, 0, newLine, 0);
|
|
88
86
|
}
|
|
89
87
|
|
|
90
88
|
/**
|
|
91
|
-
* @
|
|
92
|
-
* @
|
|
93
|
-
* @param {__se__PluginShortcutInfo} params - Information of the "shortcut" plugin
|
|
89
|
+
* @override
|
|
90
|
+
* @type {PluginDropdown['action']}
|
|
94
91
|
*/
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
this.
|
|
98
|
-
|
|
99
|
-
this.
|
|
92
|
+
action(target) {
|
|
93
|
+
const hr = this.submit(target.firstElementChild.className);
|
|
94
|
+
const line = this.$.format.addLine(hr);
|
|
95
|
+
this.$.selection.setRange(line, 1, line, 1);
|
|
96
|
+
this.$.menu.dropdownOff();
|
|
100
97
|
}
|
|
101
98
|
|
|
102
99
|
/**
|
|
103
|
-
* @description Add a hr element
|
|
100
|
+
* @description Add a `hr` element
|
|
104
101
|
* @param {string} className HR class name
|
|
105
102
|
*/
|
|
106
103
|
submit(className) {
|
|
107
104
|
const hr = dom.utils.createElement('hr', { class: className });
|
|
108
|
-
this.
|
|
109
|
-
this
|
|
105
|
+
this.$.focusManager.focus();
|
|
106
|
+
this.$.component.insert(hr, { insertBehavior: 'line' });
|
|
110
107
|
return hr;
|
|
111
108
|
}
|
|
112
109
|
}
|
|
113
110
|
|
|
111
|
+
/**
|
|
112
|
+
* @param {SunEditor.Deps} $ - Kernel dependencies
|
|
113
|
+
* @param {Array<{name: string, class: string, style?: string}>} [HRItems] - HR style items
|
|
114
|
+
* @returns {HTMLElement}
|
|
115
|
+
*/
|
|
114
116
|
function CreateHTML({ lang }, HRItems) {
|
|
115
117
|
const items = HRItems || [
|
|
116
118
|
{
|
|
117
119
|
name: lang.hr_solid,
|
|
118
|
-
class: '__se__solid'
|
|
120
|
+
class: '__se__solid',
|
|
121
|
+
style: null,
|
|
119
122
|
},
|
|
120
123
|
{
|
|
121
124
|
name: lang.hr_dashed,
|
|
122
|
-
class: '__se__dashed'
|
|
125
|
+
class: '__se__dashed',
|
|
126
|
+
style: null,
|
|
123
127
|
},
|
|
124
128
|
{
|
|
125
129
|
name: lang.hr_dotted,
|
|
126
|
-
class: '__se__dotted'
|
|
127
|
-
|
|
130
|
+
class: '__se__dotted',
|
|
131
|
+
style: null,
|
|
132
|
+
},
|
|
128
133
|
];
|
|
129
134
|
|
|
130
135
|
let list = '';
|
|
@@ -140,12 +145,12 @@ function CreateHTML({ lang }, HRItems) {
|
|
|
140
145
|
return dom.utils.createElement(
|
|
141
146
|
'DIV',
|
|
142
147
|
{
|
|
143
|
-
class: 'se-dropdown se-list-layer se-list-line'
|
|
148
|
+
class: 'se-dropdown se-list-layer se-list-line',
|
|
144
149
|
},
|
|
145
150
|
/*html*/ `
|
|
146
151
|
<div class="se-list-inner">
|
|
147
152
|
<ul class="se-list-basic">${list}</ul>
|
|
148
|
-
</div
|
|
153
|
+
</div>`,
|
|
149
154
|
);
|
|
150
155
|
}
|
|
151
156
|
|