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
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import type {} from '../../../typedef';
|
|
2
|
+
export default HTML;
|
|
3
|
+
/**
|
|
4
|
+
* @description All HTML related classes involved in the editing area
|
|
5
|
+
*/
|
|
6
|
+
declare class HTML {
|
|
7
|
+
/**
|
|
8
|
+
* @constructor
|
|
9
|
+
* @param {SunEditor.Kernel} kernel
|
|
10
|
+
*/
|
|
11
|
+
constructor(kernel: SunEditor.Kernel);
|
|
12
|
+
/**
|
|
13
|
+
* @description Filters an HTML string based on allowed and disallowed tags, with optional custom validation.
|
|
14
|
+
* - Removes blacklisted tags and keeps only whitelisted tags.
|
|
15
|
+
* - Allows custom validation functions to replace, modify, or remove elements.
|
|
16
|
+
* @param {string} html - The HTML string to be filtered.
|
|
17
|
+
* @param {Object} params - Filtering parameters.
|
|
18
|
+
* @param {string} [params.tagWhitelist] - Allowed tags, specified as a string with tags separated by `'|'`. (e.g. `"div|p|span"`).
|
|
19
|
+
* @param {string} [params.tagBlacklist] - Disallowed tags, specified as a string with tags separated by `'|'`. (e.g. `"script|iframe"`).
|
|
20
|
+
* @param {(node: Node) => Node | string | null} [params.validate] - Function to validate and modify individual nodes.
|
|
21
|
+
* - Return `null` to remove the node.
|
|
22
|
+
* - Return a `Node` to replace the current node.
|
|
23
|
+
* - Return a `string` to replace the node's `outerHTML`.
|
|
24
|
+
* @param {boolean} [params.validateAll] - Whether to apply validation to all nodes.
|
|
25
|
+
* @returns {string} - The filtered HTML string.
|
|
26
|
+
* @example
|
|
27
|
+
* // Remove script and iframe tags using blacklist
|
|
28
|
+
* const filtered = editor.html.filter('<div>Content<script>alert("xss")</script></div>', {
|
|
29
|
+
* tagBlacklist: 'script|iframe'
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* // Keep only specific tags using whitelist
|
|
33
|
+
* const filtered = editor.html.filter('<div><span>Text</span><img src="x"></div>', {
|
|
34
|
+
* tagWhitelist: 'div|span'
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // Custom validation to modify nodes
|
|
38
|
+
* const filtered = editor.html.filter('<div class="test"><a href="#">Link</a></div>', {
|
|
39
|
+
* validate: (node) => {
|
|
40
|
+
* if (node.tagName === 'A') {
|
|
41
|
+
* node.setAttribute('target', '_blank');
|
|
42
|
+
* return node;
|
|
43
|
+
* }
|
|
44
|
+
* }
|
|
45
|
+
* });
|
|
46
|
+
*/
|
|
47
|
+
filter(
|
|
48
|
+
html: string,
|
|
49
|
+
{
|
|
50
|
+
tagWhitelist,
|
|
51
|
+
tagBlacklist,
|
|
52
|
+
validate,
|
|
53
|
+
validateAll,
|
|
54
|
+
}: {
|
|
55
|
+
tagWhitelist?: string;
|
|
56
|
+
tagBlacklist?: string;
|
|
57
|
+
validate?: (node: Node) => Node | string | null;
|
|
58
|
+
validateAll?: boolean;
|
|
59
|
+
},
|
|
60
|
+
): string;
|
|
61
|
+
/**
|
|
62
|
+
* @description Cleans and compresses HTML code to suit the editor format.
|
|
63
|
+
* @param {string} html HTML string to clean and compress
|
|
64
|
+
* @param {Object} [options] Cleaning options
|
|
65
|
+
* @param {boolean} [options.forceFormat=false] If `true`, wraps text nodes without a format node in the format tag.
|
|
66
|
+
* @param {?(string|RegExp)} [options.whitelist] Regular expression of allowed tags.
|
|
67
|
+
* Create RegExp object using `helper.converter.createElementWhitelist` method.
|
|
68
|
+
* @param {?(string|RegExp)} [options.blacklist] Regular expression of disallowed tags.
|
|
69
|
+
* Create RegExp object using `helper.converter.createElementBlacklist` method.
|
|
70
|
+
* @param {boolean} [options._freeCodeViewMode=false] If `true`, the free code view mode is enabled.
|
|
71
|
+
* @returns {string} Cleaned and compressed HTML string
|
|
72
|
+
* @example
|
|
73
|
+
* // Basic cleaning
|
|
74
|
+
* const cleaned = editor.html.clean('<div> <p>Hello</p> </div>');
|
|
75
|
+
*
|
|
76
|
+
* // Clean with format wrapping
|
|
77
|
+
* const cleaned = editor.html.clean('Plain text content', { forceFormat: true });
|
|
78
|
+
*
|
|
79
|
+
* // Clean with blacklist to remove specific tags
|
|
80
|
+
* const cleaned = editor.html.clean('<div><script>alert(1)</script>Content</div>', {
|
|
81
|
+
* blacklist: 'script|style'
|
|
82
|
+
* });
|
|
83
|
+
*/
|
|
84
|
+
clean(
|
|
85
|
+
html: string,
|
|
86
|
+
{
|
|
87
|
+
forceFormat,
|
|
88
|
+
whitelist,
|
|
89
|
+
blacklist,
|
|
90
|
+
_freeCodeViewMode,
|
|
91
|
+
}?: {
|
|
92
|
+
forceFormat?: boolean;
|
|
93
|
+
whitelist?: (string | RegExp) | null;
|
|
94
|
+
blacklist?: (string | RegExp) | null;
|
|
95
|
+
_freeCodeViewMode?: boolean;
|
|
96
|
+
},
|
|
97
|
+
): string;
|
|
98
|
+
/**
|
|
99
|
+
* @description Inserts an (HTML element / HTML string / plain string) at the selection range.
|
|
100
|
+
* - If `frameOptions.get('charCounter_max')` is exceeded when `html` is added, `null` is returned without addition.
|
|
101
|
+
* @param {Node|string} html HTML Element or HTML string or plain string
|
|
102
|
+
* @param {Object} [options] Options
|
|
103
|
+
* @param {boolean} [options.selectInserted=false] If `true`, selects the range of the inserted node.
|
|
104
|
+
* @param {boolean} [options.skipCharCount=false] If `true`, inserts even if `frameOptions.get('charCounter_max')` is exceeded.
|
|
105
|
+
* @param {boolean} [options.skipCleaning=false] If `true`, inserts the HTML string without refining it with `html.clean`.
|
|
106
|
+
* @returns {HTMLElement|null} The inserted element or `null` if insertion failed
|
|
107
|
+
* @example
|
|
108
|
+
* // Insert HTML string at cursor
|
|
109
|
+
* editor.html.insert('<strong>Bold text</strong>');
|
|
110
|
+
*
|
|
111
|
+
* // Insert and select the inserted content
|
|
112
|
+
* editor.html.insert('<p>New paragraph</p>', { selectInserted: true });
|
|
113
|
+
*
|
|
114
|
+
* // Insert raw HTML without cleaning
|
|
115
|
+
* editor.html.insert('<div class="custom">Content</div>', { skipCleaning: true });
|
|
116
|
+
*/
|
|
117
|
+
insert(
|
|
118
|
+
html: Node | string,
|
|
119
|
+
{
|
|
120
|
+
selectInserted,
|
|
121
|
+
skipCharCount,
|
|
122
|
+
skipCleaning,
|
|
123
|
+
}?: {
|
|
124
|
+
selectInserted?: boolean;
|
|
125
|
+
skipCharCount?: boolean;
|
|
126
|
+
skipCleaning?: boolean;
|
|
127
|
+
},
|
|
128
|
+
): HTMLElement | null;
|
|
129
|
+
/**
|
|
130
|
+
* @description Delete selected node and insert argument value node and return.
|
|
131
|
+
* - If the `afterNode` exists, it is inserted after the `afterNode`
|
|
132
|
+
* - Inserting a text node merges with both text nodes on both sides and returns a new `{ container, startOffset, endOffset }`.
|
|
133
|
+
* @param {Node} oNode Node to be inserted
|
|
134
|
+
* @param {Object} [options] Options
|
|
135
|
+
* @param {Node} [options.afterNode=null] If the node exists, it is inserted after the node
|
|
136
|
+
* @param {boolean} [options.skipCharCount=null] If `true`, it will be inserted even if `frameOptions.get('charCounter_max')` is exceeded.
|
|
137
|
+
* @returns {Object|Node|null}
|
|
138
|
+
* @example
|
|
139
|
+
* // Insert node at current selection
|
|
140
|
+
* const strongNode = document.createElement('strong');
|
|
141
|
+
* strongNode.textContent = 'Bold';
|
|
142
|
+
* editor.html.insertNode(strongNode);
|
|
143
|
+
*
|
|
144
|
+
* // Insert node after a specific element
|
|
145
|
+
* const paragraph = editor.html.getNode();
|
|
146
|
+
* const newSpan = document.createElement('span');
|
|
147
|
+
* editor.html.insertNode(newSpan, { afterNode: paragraph });
|
|
148
|
+
*
|
|
149
|
+
* // Insert bypassing character count limit
|
|
150
|
+
* editor.html.insertNode(largeContentNode, { skipCharCount: true });
|
|
151
|
+
*/
|
|
152
|
+
insertNode(
|
|
153
|
+
oNode: Node,
|
|
154
|
+
{
|
|
155
|
+
afterNode,
|
|
156
|
+
skipCharCount,
|
|
157
|
+
}?: {
|
|
158
|
+
afterNode?: Node;
|
|
159
|
+
skipCharCount?: boolean;
|
|
160
|
+
},
|
|
161
|
+
): any | Node | null;
|
|
162
|
+
/**
|
|
163
|
+
* @description Delete the selected range.
|
|
164
|
+
* @returns {{container: Node, offset: number, commonCon?: ?Node, prevContainer?: ?Node}}
|
|
165
|
+
* - `container`: the last element after deletion
|
|
166
|
+
* - `offset`: offset
|
|
167
|
+
* - `commonCon`: `commonAncestorContainer`
|
|
168
|
+
* - `prevContainer`: `previousElementSibling` of the deleted area
|
|
169
|
+
*/
|
|
170
|
+
remove(): {
|
|
171
|
+
container: Node;
|
|
172
|
+
offset: number;
|
|
173
|
+
commonCon?: Node | null;
|
|
174
|
+
prevContainer?: Node | null;
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* @description Gets the current content
|
|
178
|
+
* @param {Object} [options] Options
|
|
179
|
+
* @param {boolean} [options.withFrame=false] Gets the current content with containing parent `div.sun-editor-editable` (`<div class="sun-editor-editable">{content}</div>`).
|
|
180
|
+
* Ignored for `targetOptions.get('iframe_fullPage')` is `true`.
|
|
181
|
+
* @param {boolean} [options.includeFullPage=false] Return only the content of the body without headers when the `iframe_fullPage` option is `true`
|
|
182
|
+
* @param {number|Array<number>} [options.rootKey=null] Root index
|
|
183
|
+
* @returns {string|Object<*, string>}
|
|
184
|
+
*/
|
|
185
|
+
get({ withFrame, includeFullPage, rootKey }?: { withFrame?: boolean; includeFullPage?: boolean; rootKey?: number | Array<number> }): string | any;
|
|
186
|
+
/**
|
|
187
|
+
* @description Sets the HTML string to the editor content
|
|
188
|
+
* @param {string} html HTML string
|
|
189
|
+
* @param {Object} [options] Options
|
|
190
|
+
* @param {number|Array<number>} [options.rootKey=null] Root index
|
|
191
|
+
*/
|
|
192
|
+
set(
|
|
193
|
+
html: string,
|
|
194
|
+
{
|
|
195
|
+
rootKey,
|
|
196
|
+
}?: {
|
|
197
|
+
rootKey?: number | Array<number>;
|
|
198
|
+
},
|
|
199
|
+
): void;
|
|
200
|
+
/**
|
|
201
|
+
* @description Add content to the end of content.
|
|
202
|
+
* @param {string} html Content to Input
|
|
203
|
+
* @param {Object} [options] Options
|
|
204
|
+
* @param {number|Array<number>} [options.rootKey=null] Root index
|
|
205
|
+
*/
|
|
206
|
+
add(
|
|
207
|
+
html: string,
|
|
208
|
+
{
|
|
209
|
+
rootKey,
|
|
210
|
+
}?: {
|
|
211
|
+
rootKey?: number | Array<number>;
|
|
212
|
+
},
|
|
213
|
+
): void;
|
|
214
|
+
/**
|
|
215
|
+
* @description Gets the current content to JSON data
|
|
216
|
+
* @param {Object} [options] Options
|
|
217
|
+
* @param {boolean} [options.withFrame=false] Gets the current content with containing parent `div.sun-editor-editable` (`<div class="sun-editor-editable">{content}</div>`).
|
|
218
|
+
* @param {number|Array<number>} [options.rootKey=null] Root index
|
|
219
|
+
* @returns {Object<string, *>} JSON data
|
|
220
|
+
*/
|
|
221
|
+
getJson({ withFrame, rootKey }?: { withFrame?: boolean; rootKey?: number | Array<number> }): {
|
|
222
|
+
[x: string]: any;
|
|
223
|
+
};
|
|
224
|
+
/**
|
|
225
|
+
* @description Sets the JSON data to the editor content
|
|
226
|
+
* @param {Object<string, *>} jsdonData HTML string
|
|
227
|
+
* @param {Object} [options] Options
|
|
228
|
+
* @param {number|Array<number>} [options.rootKey=null] Root index
|
|
229
|
+
*/
|
|
230
|
+
setJson(
|
|
231
|
+
jsdonData: {
|
|
232
|
+
[x: string]: any;
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
rootKey,
|
|
236
|
+
}?: {
|
|
237
|
+
rootKey?: number | Array<number>;
|
|
238
|
+
},
|
|
239
|
+
): void;
|
|
240
|
+
/**
|
|
241
|
+
* @description Call `clipboard.write` to copy the contents and display a success/failure toast message.
|
|
242
|
+
* @param {Node|Element|Text|string} content Content to be copied to the clipboard
|
|
243
|
+
* @returns {Promise<boolean>} Success or failure
|
|
244
|
+
*/
|
|
245
|
+
copy(content: Node | Element | Text | string): Promise<boolean>;
|
|
246
|
+
/**
|
|
247
|
+
* @description Sets the content of the iframe's head tag and body tag when using the `iframe` or `iframe_fullPage` option.
|
|
248
|
+
* @param {{head: string, body: string}} ctx { head: HTML string, body: HTML string}
|
|
249
|
+
* @param {Object} [options] Options
|
|
250
|
+
* @param {number|Array<number>} [options.rootKey=null] Root index
|
|
251
|
+
*/
|
|
252
|
+
setFullPage(
|
|
253
|
+
ctx: {
|
|
254
|
+
head: string;
|
|
255
|
+
body: string;
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
rootKey,
|
|
259
|
+
}?: {
|
|
260
|
+
rootKey?: number | Array<number>;
|
|
261
|
+
},
|
|
262
|
+
): boolean;
|
|
263
|
+
/**
|
|
264
|
+
* @description HTML code compression
|
|
265
|
+
* @param {string} html HTML string
|
|
266
|
+
* @returns {string} HTML string
|
|
267
|
+
*/
|
|
268
|
+
compress(html: string): string;
|
|
269
|
+
/**
|
|
270
|
+
* @internal
|
|
271
|
+
* @description construct wysiwyg area element to html string
|
|
272
|
+
* @param {Node|string} html WYSIWYG element (this.#frameContext.get('wysiwyg')) or HTML string.
|
|
273
|
+
* @param {boolean} comp If `true`, does not line break and indentation of tags.
|
|
274
|
+
* @returns {string}
|
|
275
|
+
*/
|
|
276
|
+
_convertToCode(html: Node | string, comp: boolean): string;
|
|
277
|
+
/**
|
|
278
|
+
* @internal
|
|
279
|
+
* @description Reset autoStyleify options.
|
|
280
|
+
* @param {Array.<string>} autoStyleify Styles applied automatically on text input.
|
|
281
|
+
* - ex `["bold", "underline", "italic", "strike"]`
|
|
282
|
+
*/
|
|
283
|
+
__resetAutoStyleify(autoStyleify: Array<string>): void;
|
|
284
|
+
/**
|
|
285
|
+
* @internal
|
|
286
|
+
* @description Destroy the HTML instance and release memory
|
|
287
|
+
*/
|
|
288
|
+
_destroy(): void;
|
|
289
|
+
#private;
|
|
290
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type {} from '../../../typedef';
|
|
2
|
+
export default Inline;
|
|
3
|
+
export type NodeStyleContainerType = {
|
|
4
|
+
ancestor?: Node | null;
|
|
5
|
+
offset?: number | null;
|
|
6
|
+
container?: Node | null;
|
|
7
|
+
endContainer?: Node | null;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {Object} NodeStyleContainerType
|
|
11
|
+
* @property {?Node} [ancestor]
|
|
12
|
+
* @property {?number} [offset]
|
|
13
|
+
* @property {?Node} [container]
|
|
14
|
+
* @property {?Node} [endContainer]
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* @description Classes related to editor inline formats such as style node like strong, span, etc.
|
|
18
|
+
*/
|
|
19
|
+
declare class Inline {
|
|
20
|
+
/**
|
|
21
|
+
* @constructor
|
|
22
|
+
* @param {SunEditor.Kernel} kernel
|
|
23
|
+
*/
|
|
24
|
+
constructor(kernel: SunEditor.Kernel);
|
|
25
|
+
/**
|
|
26
|
+
* @description Adds, updates, or deletes style nodes from selected text (a, span, strong, etc.).
|
|
27
|
+
* - 1. If `styleNode` is provided, a node with the same tags and attributes is added to the selected text.
|
|
28
|
+
* - 2. If the same tag already exists, only its attributes are updated.
|
|
29
|
+
* - 3. If `styleNode` is `null`, existing nodes are updated or removed without adding new ones.
|
|
30
|
+
* - 4. Styles matching those in `stylesToModify` are removed. (Use CSS attribute names, e.g., `background-color`)
|
|
31
|
+
* - 5. Classes matching those in `stylesToModify` (prefixed with `"."`) are removed.
|
|
32
|
+
* - 6. `stylesToModify` is used to avoid duplicate property values from `styleNode`.
|
|
33
|
+
* - 7. Nodes with all styles and classes removed are deleted if they match `styleNode`, are in `nodesToRemove`, or if `styleNode` is `null`.
|
|
34
|
+
* - 8. Tags matching names in `nodesToRemove` are deleted regardless of their style and class.
|
|
35
|
+
* - 9. If `strictRemove` is `true`, nodes in `nodesToRemove` are only removed if all their styles and classes are removed.
|
|
36
|
+
* - 10. The function won't modify nodes if the parent has the same class and style values.
|
|
37
|
+
* - However, if `nodesToRemove` has values, it will work and separate text nodes even if there's no node to replace.
|
|
38
|
+
* @param {?Node} styleNode The element to be added to the selection. If `null`, only existing nodes are modified or removed.
|
|
39
|
+
* @param {Object} [options] Options
|
|
40
|
+
* @param {Array<string>} [options.stylesToModify=null] Array of style or class names to check and modify.
|
|
41
|
+
* (e.g., ['font-size'], ['.className'], ['font-family', 'color', '.className'])
|
|
42
|
+
* @param {Array<string>} [options.nodesToRemove=null] Array of node names to remove.
|
|
43
|
+
* If empty array or `null` when `styleNode` is `null`, all formats are removed.
|
|
44
|
+
* (e.g., ['span'], ['strong', 'em'])
|
|
45
|
+
* @param {boolean} [options.strictRemove=false] If `true`, only removes nodes from `nodesToRemove` if all styles and classes are removed.
|
|
46
|
+
* @returns {HTMLElement} The element that was added to or modified in the selection.
|
|
47
|
+
* @example
|
|
48
|
+
* // Apply bold formatting
|
|
49
|
+
* const bold = dom.utils.createElement('STRONG');
|
|
50
|
+
* editor.inline.apply(bold);
|
|
51
|
+
*
|
|
52
|
+
* // Remove specific styles
|
|
53
|
+
* editor.inline.apply(null, { stylesToModify: ['font-size'] });
|
|
54
|
+
*
|
|
55
|
+
* // Remove specific tags
|
|
56
|
+
* editor.inline.apply(null, { nodesToRemove: ['span'] });
|
|
57
|
+
*/
|
|
58
|
+
apply(
|
|
59
|
+
styleNode: Node | null,
|
|
60
|
+
{
|
|
61
|
+
stylesToModify,
|
|
62
|
+
nodesToRemove,
|
|
63
|
+
strictRemove,
|
|
64
|
+
}?: {
|
|
65
|
+
stylesToModify?: Array<string>;
|
|
66
|
+
nodesToRemove?: Array<string>;
|
|
67
|
+
strictRemove?: boolean;
|
|
68
|
+
},
|
|
69
|
+
): HTMLElement;
|
|
70
|
+
/**
|
|
71
|
+
* @description Remove all inline formats (styles and tags) from the currently selected text.
|
|
72
|
+
* - This is a convenience method that calls `apply()` with `null` parameters to strip all formatting.
|
|
73
|
+
* - Removes all inline style nodes (span, strong, em, a, etc.)
|
|
74
|
+
* - Preserves only the plain text content
|
|
75
|
+
* - Works on the current selection or collapsed cursor position
|
|
76
|
+
*/
|
|
77
|
+
remove(): void;
|
|
78
|
+
/**
|
|
79
|
+
* @internal
|
|
80
|
+
* @description Nodes that must remain undetached when changing text nodes (A, Label, Code, Span:font-size)
|
|
81
|
+
* @param {Node|string} element Element to check
|
|
82
|
+
* @returns {boolean}
|
|
83
|
+
*/
|
|
84
|
+
_isNonSplitNode(element: Node | string): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* @internal
|
|
87
|
+
* @description Nodes that need to be added without modification when changing text nodes
|
|
88
|
+
* @param {Node} element Element to check
|
|
89
|
+
* @returns {boolean}
|
|
90
|
+
*/
|
|
91
|
+
_isIgnoreNodeChange(element: Node): boolean;
|
|
92
|
+
#private;
|
|
93
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type {} from '../../../typedef';
|
|
2
|
+
export default ListFormat;
|
|
3
|
+
/**
|
|
4
|
+
* @description Classes related to editor formats such as `list` (ol, ul, li)
|
|
5
|
+
* - `list` is a special `line`, `block` format.
|
|
6
|
+
*/
|
|
7
|
+
declare class ListFormat {
|
|
8
|
+
/**
|
|
9
|
+
* @constructor
|
|
10
|
+
* @param {SunEditor.Kernel} kernel
|
|
11
|
+
*/
|
|
12
|
+
constructor(kernel: SunEditor.Kernel);
|
|
13
|
+
/**
|
|
14
|
+
* @description Append all selected `line` element to the list and insert.
|
|
15
|
+
* @param {string} type List type. (ol | ul):[listStyleType]
|
|
16
|
+
* @param {Array<Node>} selectedCells `line` elements or list cells.
|
|
17
|
+
* @param {boolean} nested If `true`, indenting existing list cells.
|
|
18
|
+
* @example
|
|
19
|
+
* // Create ordered list from selected lines
|
|
20
|
+
* const lines = editor.format.getLines();
|
|
21
|
+
* editor.listFormat.apply('ol', lines, false);
|
|
22
|
+
*
|
|
23
|
+
* // Create unordered list with custom style
|
|
24
|
+
* editor.listFormat.apply('ul:circle', selectedElements, false);
|
|
25
|
+
*
|
|
26
|
+
* // Indent existing list items
|
|
27
|
+
* const listItems = [li1, li2, li3];
|
|
28
|
+
* editor.listFormat.apply('ul', listItems, true);
|
|
29
|
+
*/
|
|
30
|
+
apply(
|
|
31
|
+
type: string,
|
|
32
|
+
selectedCells: Array<Node>,
|
|
33
|
+
nested: boolean,
|
|
34
|
+
): {
|
|
35
|
+
sc: Node;
|
|
36
|
+
so: number;
|
|
37
|
+
ec: Node;
|
|
38
|
+
eo: number;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* @description `selectedCells` array are detached from the list element.
|
|
42
|
+
* - The return value is applied when the first and last lines of `selectedFormats` are `LI` respectively.
|
|
43
|
+
* @param {Array<Node>} selectedCells Array of [`line`, `li`] elements(LI, P...) to remove.
|
|
44
|
+
* @param {boolean} shouldDelete If `true`, It does not just remove the list, it deletes the content.
|
|
45
|
+
* @returns {{sc: Node, ec: Node}} Node information after deletion
|
|
46
|
+
* - sc: Start container node
|
|
47
|
+
* - ec: End container node
|
|
48
|
+
*/
|
|
49
|
+
remove(
|
|
50
|
+
selectedCells: Array<Node>,
|
|
51
|
+
shouldDelete: boolean,
|
|
52
|
+
): {
|
|
53
|
+
sc: Node;
|
|
54
|
+
ec: Node;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* @description Nest list cells or cancel nested cells.
|
|
58
|
+
* @param {Array<HTMLElement>} selectedCells List cells.
|
|
59
|
+
* @param {boolean} nested Nested or cancel nested.
|
|
60
|
+
* @example
|
|
61
|
+
* // Indent list items (increase nesting)
|
|
62
|
+
* const selectedItems = [liElement1, liElement2];
|
|
63
|
+
* editor.listFormat.applyNested(selectedItems, true);
|
|
64
|
+
*
|
|
65
|
+
* // Outdent list items (decrease nesting)
|
|
66
|
+
* editor.listFormat.applyNested(selectedItems, false);
|
|
67
|
+
*
|
|
68
|
+
* // Get current list cells and nest them
|
|
69
|
+
* const cells = editor.format.getLines().filter(el => el.tagName === 'LI');
|
|
70
|
+
* editor.listFormat.applyNested(cells, true);
|
|
71
|
+
*/
|
|
72
|
+
applyNested(
|
|
73
|
+
selectedCells: Array<HTMLElement>,
|
|
74
|
+
nested: boolean,
|
|
75
|
+
): {
|
|
76
|
+
sc: Node;
|
|
77
|
+
so: number;
|
|
78
|
+
ec: Node;
|
|
79
|
+
eo: number;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* @description Detach Nested all nested lists under the `baseNode`.
|
|
83
|
+
* - Returns a list with nested removed.
|
|
84
|
+
* @param {HTMLElement} baseNode Element on which to base.
|
|
85
|
+
* @param {boolean} all If `true`, it also detach all nested lists of a returned list.
|
|
86
|
+
* @returns {Node} Result element
|
|
87
|
+
* @example
|
|
88
|
+
* // Remove first level of nesting
|
|
89
|
+
* const listItem = document.querySelector('li');
|
|
90
|
+
* editor.listFormat.removeNested(listItem, false);
|
|
91
|
+
*
|
|
92
|
+
* // Flatten all nested lists completely
|
|
93
|
+
* editor.listFormat.removeNested(listItem, true);
|
|
94
|
+
*
|
|
95
|
+
* // Remove nesting and get result
|
|
96
|
+
* const result = editor.listFormat.removeNested(nestedLi, false);
|
|
97
|
+
* console.log(result); // parent list element
|
|
98
|
+
*/
|
|
99
|
+
removeNested(baseNode: HTMLElement, all: boolean): Node;
|
|
100
|
+
#private;
|
|
101
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type {} from '../../../typedef';
|
|
2
|
+
export default NodeTransform;
|
|
3
|
+
/**
|
|
4
|
+
* @description Node utility class. split, merge, etc.
|
|
5
|
+
*/
|
|
6
|
+
declare class NodeTransform {
|
|
7
|
+
/**
|
|
8
|
+
* @constructor
|
|
9
|
+
* @param {SunEditor.Kernel} kernel
|
|
10
|
+
*/
|
|
11
|
+
constructor(kernel: SunEditor.Kernel);
|
|
12
|
+
/**
|
|
13
|
+
* @template {HTMLElement} T
|
|
14
|
+
* @description Split all tags based on `baseNode`
|
|
15
|
+
* @param {Node} baseNode Element or text node on which to base
|
|
16
|
+
* @param {?(number|Node)} offset Text offset of `baseNode` (Only valid when `baseNode` is a text node)
|
|
17
|
+
* @param {number} [depth=0] The nesting depth of the element being split. (default: 0)
|
|
18
|
+
* @returns {T} The last element of the splited tag.
|
|
19
|
+
* @example
|
|
20
|
+
* // Split at text offset
|
|
21
|
+
* const textNode = editor.selection.getNode();
|
|
22
|
+
* const newElement = editor.nodeTransform.split(textNode, 5, 0);
|
|
23
|
+
*
|
|
24
|
+
* // Split at specific depth to preserve parent structure
|
|
25
|
+
* const paragraph = editor.selection.getNode().closest('p');
|
|
26
|
+
* editor.nodeTransform.split(textNode, 10, 2);
|
|
27
|
+
*
|
|
28
|
+
* // Split by node reference
|
|
29
|
+
* const splitResult = editor.nodeTransform.split(parentNode, childNode, 1);
|
|
30
|
+
*/
|
|
31
|
+
split<T extends HTMLElement>(baseNode: Node, offset: (number | Node) | null, depth?: number): T;
|
|
32
|
+
/**
|
|
33
|
+
* @description Use with `npdePath` (dom-query-GetNodePath) to merge the same attributes and tags if they are present and modify the nodepath.
|
|
34
|
+
* - If `offset` has been changed, it will return as much `offset` as it has been modified.
|
|
35
|
+
* - An array containing change offsets is returned in the order of the `nodePathArray` array.
|
|
36
|
+
* @param {Node} element Element
|
|
37
|
+
* @param {?number[][]} [nodePathArray] Array of `NodePath` object ([dom-query-GetNodePath(), ..])
|
|
38
|
+
* @param {?boolean} [onlyText] If `true`, non-text nodes like `span`, `strong`.. are ignored.
|
|
39
|
+
* @returns {Array<number>} [offset, ..]
|
|
40
|
+
* @example
|
|
41
|
+
* // Merge adjacent tags with same attributes
|
|
42
|
+
* const container = editor.selection.getNode().closest('div');
|
|
43
|
+
* editor.nodeTransform.mergeSameTags(container, null, false);
|
|
44
|
+
*
|
|
45
|
+
* // Merge with path tracking
|
|
46
|
+
* const startPath = [0, 1, 2];
|
|
47
|
+
* const endPath = [0, 2, 1];
|
|
48
|
+
* const offsets = editor.nodeTransform.mergeSameTags(element, [startPath, endPath], false);
|
|
49
|
+
*
|
|
50
|
+
* // Merge only text nodes
|
|
51
|
+
* editor.nodeTransform.mergeSameTags(paragraph, null, true);
|
|
52
|
+
*/
|
|
53
|
+
mergeSameTags(element: Node, nodePathArray?: number[][] | null, onlyText?: boolean | null): Array<number>;
|
|
54
|
+
/**
|
|
55
|
+
* @description Remove nested tags without other child nodes.
|
|
56
|
+
* @param {Node} element Element object
|
|
57
|
+
* @param {?(((current: Node) => boolean)|string)} [validation] Validation function / String(`tag1|tag2..`) / If `null`, all tags are applicable.
|
|
58
|
+
*/
|
|
59
|
+
mergeNestedTags(element: Node, validation?: (((current: Node) => boolean) | string) | null): void;
|
|
60
|
+
/**
|
|
61
|
+
* @description Delete itself and all parent nodes that match the condition.
|
|
62
|
+
* - Returns an {sc: previousSibling, ec: nextSibling}(the deleted node reference) or `null`.
|
|
63
|
+
* @param {Node} item Node to be remove
|
|
64
|
+
* @param {?(current: Node) => boolean} [validation] Validation function. default(Deleted if it only have `breakLine` and blanks)
|
|
65
|
+
* @param {?Node} [stopParent] Stop when the parent node reaches `stopParent`
|
|
66
|
+
* @returns {{sc: Node|null, ec: Node|null}|null} {sc: previousSibling, ec: nextSibling} (the deleted node reference) or `null`.
|
|
67
|
+
* @example
|
|
68
|
+
* // Remove empty parent elements recursively
|
|
69
|
+
* const emptySpan = document.querySelector('span:empty');
|
|
70
|
+
* const result = editor.nodeTransform.removeAllParents(emptySpan, null, null);
|
|
71
|
+
*
|
|
72
|
+
* // Remove with custom validation
|
|
73
|
+
* editor.nodeTransform.removeAllParents(node, (current) => {
|
|
74
|
+
* return current.textContent.trim().length === 0;
|
|
75
|
+
* }, null);
|
|
76
|
+
*
|
|
77
|
+
* // Remove up to specific parent
|
|
78
|
+
* const stopAt = editor.selection.getNode().closest('.container');
|
|
79
|
+
* editor.nodeTransform.removeAllParents(childNode, null, stopAt);
|
|
80
|
+
*/
|
|
81
|
+
removeAllParents(
|
|
82
|
+
item: Node,
|
|
83
|
+
validation?: ((current: Node) => boolean) | null,
|
|
84
|
+
stopParent?: Node | null,
|
|
85
|
+
): {
|
|
86
|
+
sc: Node | null;
|
|
87
|
+
ec: Node | null;
|
|
88
|
+
} | null;
|
|
89
|
+
/**
|
|
90
|
+
* @description Delete a empty child node of argument element
|
|
91
|
+
* @param {Node} element Element node
|
|
92
|
+
* @param {?Node} notRemoveNode Do not remove node
|
|
93
|
+
* @param {boolean} forceDelete When all child nodes are deleted, the parent node is also deleted.
|
|
94
|
+
*/
|
|
95
|
+
removeEmptyNode(element: Node, notRemoveNode: Node | null, forceDelete: boolean): void;
|
|
96
|
+
/**
|
|
97
|
+
* @description Creates a nested node structure from the given array of nodes.
|
|
98
|
+
* @param {SunEditor.NodeCollection} nodeArray An array of nodes to clone. The first node in the array will be the top-level parent.
|
|
99
|
+
* @param {?(current: Node) => boolean} [validate] A validate function.
|
|
100
|
+
* @returns {{ parent: Node, inner: Node }} An object containing the top-level parent node and the innermost child node.
|
|
101
|
+
*/
|
|
102
|
+
createNestedNode(
|
|
103
|
+
nodeArray: SunEditor.NodeCollection,
|
|
104
|
+
validate?: ((current: Node) => boolean) | null,
|
|
105
|
+
): {
|
|
106
|
+
parent: Node;
|
|
107
|
+
inner: Node;
|
|
108
|
+
};
|
|
109
|
+
#private;
|
|
110
|
+
}
|