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,7 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview DocumentType class
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
1
|
import { dom, numbers, converter, env } from '../../helper';
|
|
6
2
|
|
|
7
3
|
const { _w } = env;
|
|
@@ -13,72 +9,95 @@ const A4_HEIGHT_MM = 297;
|
|
|
13
9
|
const A4_PAGE_HEIGHT = Math.floor(A4_HEIGHT_MM * MM_TO_POINTS * POINTS_TO_PIXELS);
|
|
14
10
|
|
|
15
11
|
/**
|
|
16
|
-
* @constructor
|
|
17
12
|
* @description DocumentType, page, header management class
|
|
18
|
-
* @param {__se__EditorCore} editor - The root editor instance
|
|
19
|
-
* @param {__se__FrameContext} fc - frame context object
|
|
20
13
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const mirrorStyles = _w.getComputedStyle(this._mirror);
|
|
56
|
-
this._paddingTop = numbers.get(mirrorStyles.paddingTop);
|
|
57
|
-
this._paddingBottom = numbers.get(mirrorStyles.paddingBottom);
|
|
58
|
-
|
|
59
|
-
// init header
|
|
60
|
-
if (this.useHeader) {
|
|
61
|
-
const headers = this._getHeaders();
|
|
62
|
-
const inner = (this.inner = this.documentTypeInner.querySelector('.se-document-lines-inner'));
|
|
63
|
-
let headerHTML = '';
|
|
64
|
-
for (let i = 0, len = headers.length, h; i < len; i++) {
|
|
65
|
-
h = headers[i];
|
|
66
|
-
headerHTML += `<div class="se-doc-item se-doc-h${numbers.get(h.nodeName)}" title="${h.textContent}">${h.textContent}</div>`;
|
|
67
|
-
}
|
|
68
|
-
inner.innerHTML = headerHTML;
|
|
69
|
-
this.innerHeaders = inner.querySelectorAll('div');
|
|
14
|
+
class DocumentType {
|
|
15
|
+
#store;
|
|
16
|
+
#context;
|
|
17
|
+
#isScrollable;
|
|
18
|
+
|
|
19
|
+
#offset;
|
|
20
|
+
#selection;
|
|
21
|
+
#toolbar;
|
|
22
|
+
|
|
23
|
+
#fc;
|
|
24
|
+
#ww;
|
|
25
|
+
#wwFrame;
|
|
26
|
+
#documentTypeInner;
|
|
27
|
+
#inner;
|
|
28
|
+
#page;
|
|
29
|
+
#pageNavigator;
|
|
30
|
+
#mirror;
|
|
31
|
+
#paddingTop;
|
|
32
|
+
#paddingBottom;
|
|
33
|
+
|
|
34
|
+
#wwWidth = -1;
|
|
35
|
+
#wwHeight = -1;
|
|
36
|
+
#innerHeaders = null;
|
|
37
|
+
#wwHeaders = null;
|
|
38
|
+
#totalPages = 0;
|
|
39
|
+
#pageNum = 0;
|
|
40
|
+
#pageHeight = -1;
|
|
41
|
+
#pageBreaksCnt = 0;
|
|
42
|
+
#pages = [];
|
|
43
|
+
#pagesLine = null;
|
|
44
|
+
#prevScrollTop = 0;
|
|
45
|
+
#mirrorCache = 0;
|
|
46
|
+
#positionCache = new Map();
|
|
47
|
+
#rePageTimeout = null;
|
|
70
48
|
|
|
71
|
-
|
|
72
|
-
|
|
49
|
+
/**
|
|
50
|
+
* @constructor
|
|
51
|
+
* @param {SunEditor.Kernel} kernel
|
|
52
|
+
* @param {SunEditor.FrameContext} fc - Frame context object
|
|
53
|
+
*/
|
|
54
|
+
constructor(kernel, fc) {
|
|
55
|
+
const $ = kernel.$;
|
|
56
|
+
|
|
57
|
+
this.#store = $.store;
|
|
58
|
+
this.#context = $.context;
|
|
59
|
+
this.#isScrollable = this.#store.get('isScrollable');
|
|
60
|
+
|
|
61
|
+
this.#offset = $.offset;
|
|
62
|
+
this.#selection = $.selection;
|
|
63
|
+
this.#toolbar = $.toolbar;
|
|
64
|
+
|
|
65
|
+
// members
|
|
66
|
+
this.useHeader = $.options.get('_type_options').includes('header');
|
|
67
|
+
this.usePage = $.options.get('_type_options').includes('page');
|
|
68
|
+
|
|
69
|
+
this.#fc = fc;
|
|
70
|
+
this.#ww = fc.get('wysiwyg');
|
|
71
|
+
this.#wwFrame = fc.get('wysiwygFrame');
|
|
72
|
+
this.#documentTypeInner = fc.get('documentTypeInner');
|
|
73
|
+
this.#mirror = fc.get('documentTypePageMirror');
|
|
74
|
+
|
|
75
|
+
const mirrorStyles = _w.getComputedStyle(this.#mirror);
|
|
76
|
+
this.#paddingTop = numbers.get(mirrorStyles.paddingTop);
|
|
77
|
+
this.#paddingBottom = numbers.get(mirrorStyles.paddingBottom);
|
|
78
|
+
|
|
79
|
+
// init header
|
|
80
|
+
if (this.useHeader) {
|
|
81
|
+
const headers = this._getHeaders();
|
|
82
|
+
const inner = (this.#inner = this.#documentTypeInner.querySelector('.se-document-lines-inner'));
|
|
83
|
+
let headerHTML = '';
|
|
84
|
+
for (let i = 0, len = headers.length, h; i < len; i++) {
|
|
85
|
+
h = headers[i];
|
|
86
|
+
headerHTML += `<div class="se-doc-item se-doc-h${numbers.get(h.nodeName)}" title="${h.textContent}">${h.textContent}</div>`;
|
|
87
|
+
}
|
|
88
|
+
inner.innerHTML = headerHTML;
|
|
89
|
+
this.#innerHeaders = inner.querySelectorAll('div');
|
|
90
|
+
|
|
91
|
+
$.eventManager.addEvent(inner, 'click', this.#OnClickHeader.bind(this, this.#ww));
|
|
92
|
+
}
|
|
73
93
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
94
|
+
// init page
|
|
95
|
+
if (this.usePage) {
|
|
96
|
+
this.#page = fc.get('documentTypePage');
|
|
97
|
+
this.#pageNavigator = $.plugins.pageNavigator;
|
|
98
|
+
}
|
|
78
99
|
}
|
|
79
|
-
}
|
|
80
100
|
|
|
81
|
-
DocumentType.prototype = {
|
|
82
101
|
/**
|
|
83
102
|
* @description Refresh the document header area
|
|
84
103
|
*/
|
|
@@ -86,8 +105,8 @@ DocumentType.prototype = {
|
|
|
86
105
|
if (!this.useHeader) return;
|
|
87
106
|
|
|
88
107
|
const headers = this._getHeaders();
|
|
89
|
-
const inner = this
|
|
90
|
-
const innerHeaders = this
|
|
108
|
+
const inner = this.#inner;
|
|
109
|
+
const innerHeaders = this.#innerHeaders;
|
|
91
110
|
|
|
92
111
|
// update or new headers
|
|
93
112
|
for (let i = 0, len = headers.length, h, hClass, innerH; i < len; i++) {
|
|
@@ -115,8 +134,8 @@ DocumentType.prototype = {
|
|
|
115
134
|
}
|
|
116
135
|
}
|
|
117
136
|
|
|
118
|
-
this
|
|
119
|
-
}
|
|
137
|
+
this.#innerHeaders = inner.querySelectorAll('div');
|
|
138
|
+
}
|
|
120
139
|
|
|
121
140
|
/**
|
|
122
141
|
* @description Refresh the document page
|
|
@@ -124,17 +143,20 @@ DocumentType.prototype = {
|
|
|
124
143
|
* @returns {Promise<void>}
|
|
125
144
|
*/
|
|
126
145
|
async rePage(force) {
|
|
127
|
-
if (!this
|
|
128
|
-
if (this
|
|
146
|
+
if (!this.#page) return;
|
|
147
|
+
if (this.#rePageTimeout) _w.clearTimeout(this.#rePageTimeout);
|
|
148
|
+
|
|
149
|
+
// Debounced page re-render — waits for media to load and coalesces rapid calls (cleared on next rePage)
|
|
150
|
+
this.#rePageTimeout = _w.setTimeout(async () => {
|
|
151
|
+
await dom.utils.waitForMediaLoad(this.#mirror, 1500);
|
|
129
152
|
|
|
130
|
-
|
|
131
|
-
|
|
153
|
+
const heightGap = this.#ww.scrollHeight > this.#mirror.scrollHeight ? this.#ww.scrollHeight - this.#mirror.scrollHeight : 0;
|
|
154
|
+
const mirrorHeight = this.#mirror.scrollHeight + heightGap;
|
|
155
|
+
const pageBreaks = /** @type { NodeListOf<HTMLElement>} */ (this.#ww.querySelectorAll('.se-page-break'));
|
|
156
|
+
if (!force && this.#pageHeight === mirrorHeight && this.#pageBreaksCnt === pageBreaks.length) return;
|
|
132
157
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
if (!force && this.pageHeight === mirrorHeight && this.pageBreaksCnt === pageBreaks.length) return;
|
|
136
|
-
this.pageHeight = mirrorHeight;
|
|
137
|
-
this.pageBreaksCnt = pageBreaks.length;
|
|
158
|
+
this.#pageHeight = mirrorHeight;
|
|
159
|
+
this.#pageBreaksCnt = pageBreaks.length;
|
|
138
160
|
|
|
139
161
|
// page break
|
|
140
162
|
let pageBreakHeight = 0;
|
|
@@ -145,119 +167,142 @@ DocumentType.prototype = {
|
|
|
145
167
|
for (let i = 0; i < pageBreaks.length; i++) {
|
|
146
168
|
const breakPosition = pageBreaks[i].offsetTop;
|
|
147
169
|
const sectionHeight = breakPosition - lastBreakPosition;
|
|
148
|
-
|
|
149
|
-
if (sectionHeight % A4_PAGE_HEIGHT !== 0) {
|
|
150
|
-
additionalPages++;
|
|
151
|
-
}
|
|
152
|
-
|
|
170
|
+
if (sectionHeight % A4_PAGE_HEIGHT !== 0) additionalPages++;
|
|
153
171
|
lastBreakPosition = breakPosition;
|
|
154
172
|
}
|
|
155
173
|
|
|
156
174
|
const lastSectionHeight = mirrorHeight - lastBreakPosition;
|
|
157
|
-
if (lastSectionHeight > 0 && lastSectionHeight % A4_PAGE_HEIGHT !== 0)
|
|
158
|
-
additionalPages++;
|
|
159
|
-
}
|
|
175
|
+
if (lastSectionHeight > 0 && lastSectionHeight % A4_PAGE_HEIGHT !== 0) additionalPages++;
|
|
160
176
|
}
|
|
161
177
|
|
|
162
|
-
const scrollTop = this
|
|
178
|
+
const scrollTop = !this.#isScrollable(this.#fc) ? 0 : this._getWWScrollTop();
|
|
163
179
|
const totalPages = Math.ceil(mirrorHeight / A4_PAGE_HEIGHT) + additionalPages;
|
|
164
|
-
const wwWidth = this
|
|
180
|
+
const wwWidth = this.#wwFrame.offsetWidth + 1;
|
|
165
181
|
const pages = [];
|
|
166
182
|
|
|
167
183
|
for (let i = 0; i < pageBreaks.length; i++) {
|
|
168
|
-
pages.push({ number: i, top: pageBreaks[i].offsetTop + pageBreakHeight - scrollTop });
|
|
184
|
+
pages.push({ number: i, top: pageBreaks[i].offsetTop + pageBreakHeight / 2 - scrollTop });
|
|
169
185
|
}
|
|
170
186
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
const
|
|
174
|
-
const mChr = this._mirror.children;
|
|
187
|
+
this.#mirrorCache = 0;
|
|
188
|
+
const chr = this.#ww.children;
|
|
189
|
+
const mChr = this.#mirror.children;
|
|
175
190
|
this._initializeCache(mChr);
|
|
191
|
+
|
|
176
192
|
pages.push({ number: 0, top: 0 });
|
|
177
|
-
for (let i = 1, t = 0; i < totalPages; i++) {
|
|
178
|
-
t += A4_PAGE_HEIGHT + (i === 1 ? this._paddingTop + this._paddingBottom : this._paddingTop);
|
|
179
|
-
if (!pages.some((p) => Math.abs(p.top - t) < 1)) {
|
|
180
|
-
const { ci, cm, ch } = this._getElementAtPosition(t, mChr);
|
|
181
|
-
const el = chr[ci];
|
|
182
|
-
if (!el) break;
|
|
183
|
-
|
|
184
|
-
if (chr[this._mirrorCache]) {
|
|
185
|
-
t += numbers.get(_w.getComputedStyle(chr[this._mirrorCache]).marginBottom);
|
|
186
|
-
}
|
|
187
193
|
|
|
188
|
-
|
|
189
|
-
|
|
194
|
+
for (let i = 1, t = 0; i < totalPages; i++) {
|
|
195
|
+
t += A4_PAGE_HEIGHT + (i === 1 ? this.#paddingTop + this.#paddingBottom : this.#paddingTop);
|
|
196
|
+
if (!pages.some((p) => Math.abs(p.top - t) < 3)) {
|
|
197
|
+
const top = this._calcPageBreakTop(t, chr, mChr);
|
|
198
|
+
if (top === null) break;
|
|
190
199
|
pages.push({ number: i, top });
|
|
191
200
|
}
|
|
192
201
|
}
|
|
193
202
|
|
|
194
203
|
if (pages.length === 0) {
|
|
195
|
-
this
|
|
196
|
-
this
|
|
204
|
+
this.#pagesLine = null;
|
|
205
|
+
this.#totalPages = 1;
|
|
197
206
|
this._displayCurrentPage();
|
|
198
207
|
return;
|
|
199
208
|
}
|
|
200
209
|
|
|
201
210
|
// numbering
|
|
202
211
|
pages.sort((a, b) => a.top - b.top);
|
|
203
|
-
this
|
|
204
|
-
this
|
|
212
|
+
this.#page.innerHTML = '';
|
|
213
|
+
this.#pages = [];
|
|
214
|
+
|
|
205
215
|
for (let i = 0, t; i < totalPages; i++) {
|
|
206
216
|
if (!pages[i]) continue;
|
|
207
217
|
t = pages[i].top;
|
|
208
218
|
if (mirrorHeight < t) break;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
219
|
+
|
|
220
|
+
const pageNumber = dom.utils.createElement(
|
|
221
|
+
'DIV',
|
|
222
|
+
{
|
|
223
|
+
style: `top:${t - scrollTop}px`,
|
|
224
|
+
innerHTML: String(i + 1),
|
|
225
|
+
},
|
|
226
|
+
`<div class="se-document-page-line" style="width: ${wwWidth}px;"></div>${i + 1}`,
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
this.#page.appendChild(pageNumber);
|
|
230
|
+
this.#pages.push(pageNumber);
|
|
212
231
|
}
|
|
213
232
|
|
|
214
|
-
this
|
|
215
|
-
this
|
|
233
|
+
this.#pagesLine = this.#page.querySelectorAll('.se-document-page-line');
|
|
234
|
+
this.#totalPages = this.#pages.length;
|
|
216
235
|
this._displayCurrentPage();
|
|
217
236
|
}, 400);
|
|
218
|
-
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
_getDisplayPage() {
|
|
240
|
+
return /** @type {SunEditor.EventWysiwyg} */ (!this.#isScrollable(this.#fc) ? _w : this.#fc.get('wysiwyg'));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* @internal
|
|
245
|
+
* @description Calculates and compensates for the vertical gap between the rendered content (current page)
|
|
246
|
+
* - and the mirrored preview page due to differences in width and layout.
|
|
247
|
+
* @param {number} t - The initial top position value to be adjusted.
|
|
248
|
+
* @param {HTMLCollection} chr - The elements array in the current (main) page.
|
|
249
|
+
* @param {HTMLCollection} mChr - The elements array in the mirrored page.
|
|
250
|
+
* @returns {number|null} The adjusted top value.
|
|
251
|
+
*/
|
|
252
|
+
_calcPageBreakTop(t, chr, mChr) {
|
|
253
|
+
const { ci } = this._getElementAtPosition(t, mChr);
|
|
254
|
+
const mel = /** @type {HTMLElement} */ (mChr[ci]);
|
|
255
|
+
const el = /** @type {HTMLElement} */ (chr[ci]);
|
|
256
|
+
if (!mel || !el) return null;
|
|
257
|
+
|
|
258
|
+
const offsetDiff = el.offsetTop - mel.offsetTop;
|
|
259
|
+
const heightDiff = el.offsetHeight - mel.offsetHeight;
|
|
260
|
+
|
|
261
|
+
const top = t + offsetDiff + heightDiff / 2;
|
|
262
|
+
return Math.round(top);
|
|
263
|
+
}
|
|
219
264
|
|
|
220
265
|
/**
|
|
221
|
-
* @
|
|
266
|
+
* @internal
|
|
222
267
|
* @description Initializes the cache for document elements.
|
|
223
|
-
* @param {
|
|
268
|
+
* @param {HTMLCollection} mChr - List of mirrored elements.
|
|
224
269
|
*/
|
|
225
270
|
_initializeCache(mChr) {
|
|
226
|
-
this.
|
|
271
|
+
this.#positionCache.clear();
|
|
227
272
|
for (let i = 0, len = mChr.length; i < len; i++) {
|
|
228
|
-
const element = mChr[i];
|
|
273
|
+
const element = /** @type {HTMLElement} */ (mChr[i]);
|
|
229
274
|
const top = element.offsetTop;
|
|
230
275
|
const height = element.offsetHeight;
|
|
231
276
|
const bottom = top + height;
|
|
232
277
|
|
|
233
|
-
this.
|
|
278
|
+
this.#positionCache.set(i, {
|
|
234
279
|
top,
|
|
235
280
|
height,
|
|
236
|
-
bottom: bottom
|
|
281
|
+
bottom: bottom,
|
|
237
282
|
});
|
|
238
283
|
}
|
|
239
|
-
}
|
|
284
|
+
}
|
|
240
285
|
|
|
241
286
|
/**
|
|
242
|
-
* @
|
|
287
|
+
* @internal
|
|
243
288
|
* @description Retrieves the element at a given position.
|
|
244
289
|
* @param {number} pageTop - The vertical position to check.
|
|
245
|
-
* @param {
|
|
290
|
+
* @param {HTMLCollection} mChr - List of mirrored elements.
|
|
246
291
|
* @returns {{ci: number, cm: number, ch: number}} The closest element and its related data.
|
|
247
292
|
* - ci: The index of the closest element.
|
|
248
293
|
* - cm: The distance between the top of the closest element and the given position.
|
|
249
294
|
* - ch: The height of the closest element.
|
|
250
295
|
*/
|
|
251
296
|
_getElementAtPosition(pageTop, mChr) {
|
|
252
|
-
let start = this
|
|
297
|
+
let start = this.#mirrorCache;
|
|
253
298
|
let end = mChr.length - 1;
|
|
254
299
|
|
|
255
300
|
while (start <= end) {
|
|
256
301
|
const mid = Math.floor((start + end) / 2);
|
|
257
|
-
const { top, height, bottom } = this.
|
|
302
|
+
const { top, height, bottom } = this.#positionCache.get(mid);
|
|
258
303
|
|
|
259
304
|
if (pageTop >= top && pageTop <= bottom) {
|
|
260
|
-
this
|
|
305
|
+
this.#mirrorCache = mid;
|
|
261
306
|
return { ci: mid, cm: pageTop - bottom, ch: height };
|
|
262
307
|
}
|
|
263
308
|
|
|
@@ -269,103 +314,103 @@ DocumentType.prototype = {
|
|
|
269
314
|
}
|
|
270
315
|
|
|
271
316
|
const closestIndex = mChr[start] ? start : end;
|
|
272
|
-
this
|
|
273
|
-
const iElement = this.
|
|
317
|
+
this.#mirrorCache = closestIndex;
|
|
318
|
+
const iElement = this.#positionCache.get(closestIndex);
|
|
274
319
|
return { ci: closestIndex, cm: pageTop - iElement.bottom, ch: iElement.height };
|
|
275
|
-
}
|
|
320
|
+
}
|
|
276
321
|
|
|
277
322
|
/**
|
|
278
323
|
* @description Resizes the document page dynamically.
|
|
279
324
|
*/
|
|
280
325
|
resizePage() {
|
|
281
|
-
const wwWidth = this
|
|
282
|
-
const wwHeight = this
|
|
326
|
+
const wwWidth = this.#wwFrame.offsetWidth + 1;
|
|
327
|
+
const wwHeight = this.#wwFrame.offsetHeight + 1;
|
|
283
328
|
let rh = false;
|
|
284
|
-
if (wwWidth === this
|
|
329
|
+
if (wwWidth === this.#wwWidth && (rh = wwHeight === this.#wwHeight)) return;
|
|
285
330
|
|
|
286
331
|
if (wwWidth > 800) {
|
|
287
|
-
dom.utils.removeClass(this
|
|
332
|
+
dom.utils.removeClass(this.#documentTypeInner, 'se-document-responsible');
|
|
288
333
|
} else {
|
|
289
|
-
dom.utils.addClass(this
|
|
334
|
+
dom.utils.addClass(this.#documentTypeInner, 'se-document-responsible');
|
|
290
335
|
}
|
|
291
336
|
|
|
292
|
-
this
|
|
293
|
-
this
|
|
294
|
-
const pages_line = this
|
|
295
|
-
for (let i = 0, len = pages_line
|
|
337
|
+
this.#wwWidth = wwWidth;
|
|
338
|
+
this.#wwHeight = wwHeight;
|
|
339
|
+
const pages_line = this.#pagesLine;
|
|
340
|
+
for (let i = 0, len = pages_line?.length; i < len; i++) {
|
|
296
341
|
pages_line[i].style.width = `${wwWidth}px`;
|
|
297
342
|
}
|
|
298
343
|
|
|
299
344
|
if (!rh) this.rePage(true);
|
|
300
345
|
this._displayCurrentPage();
|
|
301
|
-
}
|
|
346
|
+
}
|
|
302
347
|
|
|
303
348
|
/**
|
|
304
349
|
* @description Scrolls the document page.
|
|
305
350
|
*/
|
|
306
351
|
scrollPage() {
|
|
307
|
-
const prevScrollTop = this
|
|
352
|
+
const prevScrollTop = this.#prevScrollTop;
|
|
308
353
|
const scrollTop = this._getWWScrollTop();
|
|
309
354
|
if (prevScrollTop === scrollTop) return;
|
|
310
355
|
|
|
311
|
-
const pages = this
|
|
356
|
+
const pages = this.#pages;
|
|
312
357
|
for (let i = 0, len = pages.length; i < len; i++) {
|
|
313
358
|
pages[i].style.top = `${numbers.get(pages[i].style.top) - (scrollTop - prevScrollTop)}px`;
|
|
314
359
|
}
|
|
315
360
|
|
|
316
|
-
this
|
|
361
|
+
this.#prevScrollTop = scrollTop;
|
|
317
362
|
this._displayCurrentPage();
|
|
318
|
-
}
|
|
363
|
+
}
|
|
319
364
|
|
|
320
365
|
/**
|
|
321
366
|
* @description Scrolls the window to a specific position.
|
|
322
367
|
*/
|
|
323
368
|
scrollWindow() {
|
|
324
|
-
if (
|
|
369
|
+
if (this.#isScrollable(this.#fc)) return;
|
|
325
370
|
this._displayCurrentPage();
|
|
326
|
-
}
|
|
371
|
+
}
|
|
327
372
|
|
|
328
373
|
/**
|
|
329
374
|
* @description Retrieves the current page number.
|
|
330
375
|
* @returns {number} The current page number.
|
|
331
376
|
*/
|
|
332
377
|
getCurrentPageNumber() {
|
|
333
|
-
if (this
|
|
378
|
+
if (this.#totalPages <= 1) return 1;
|
|
334
379
|
|
|
335
380
|
let targetPosition = 0;
|
|
336
|
-
if (this
|
|
381
|
+
if (!this.#isScrollable(this.#fc)) {
|
|
337
382
|
const globalTop = this._getGlobalTop();
|
|
338
383
|
targetPosition = _w.scrollY - globalTop + A4_PAGE_HEIGHT / 2;
|
|
339
384
|
if (targetPosition <= 0) return 1;
|
|
340
385
|
} else {
|
|
341
|
-
targetPosition = this
|
|
386
|
+
targetPosition = this.#wwHeight / 2;
|
|
342
387
|
}
|
|
343
388
|
|
|
344
|
-
const pages = this
|
|
389
|
+
const pages = this.#pages;
|
|
345
390
|
for (let i = 0, len = pages.length; i < len; i++) {
|
|
346
391
|
if (pages[i].offsetTop >= targetPosition) {
|
|
347
|
-
return (this
|
|
392
|
+
return (this.#pageNum = i);
|
|
348
393
|
}
|
|
349
394
|
}
|
|
350
395
|
|
|
351
|
-
return (this
|
|
352
|
-
}
|
|
396
|
+
return (this.#pageNum = this.#totalPages);
|
|
397
|
+
}
|
|
353
398
|
|
|
354
399
|
/**
|
|
355
400
|
* @description Moves to the previous page.
|
|
356
401
|
*/
|
|
357
402
|
pageUp() {
|
|
358
|
-
const pageNum = this
|
|
403
|
+
const pageNum = this.#pageNum - 1 <= 1 ? 1 : this.#pageNum - 1;
|
|
359
404
|
this._movePage(pageNum, false);
|
|
360
|
-
}
|
|
405
|
+
}
|
|
361
406
|
|
|
362
407
|
/**
|
|
363
408
|
* @description Moves to the next page.
|
|
364
409
|
*/
|
|
365
410
|
pageDown() {
|
|
366
|
-
const pageNum = this
|
|
411
|
+
const pageNum = this.#pageNum + 1 > this.#pages.length ? this.#pages.length : this.#pageNum + 1;
|
|
367
412
|
this._movePage(pageNum, false);
|
|
368
|
-
}
|
|
413
|
+
}
|
|
369
414
|
|
|
370
415
|
/**
|
|
371
416
|
* @description Moves to a specific page.
|
|
@@ -373,14 +418,14 @@ DocumentType.prototype = {
|
|
|
373
418
|
*/
|
|
374
419
|
pageGo(pageNum) {
|
|
375
420
|
if (pageNum < 1) pageNum = 1;
|
|
376
|
-
else if (pageNum > this
|
|
421
|
+
else if (pageNum > this.#pages.length) pageNum = this.#pages.length;
|
|
377
422
|
|
|
378
423
|
this._movePage(pageNum, true);
|
|
379
|
-
}
|
|
424
|
+
}
|
|
380
425
|
|
|
381
426
|
/**
|
|
382
427
|
* @description Highlights the header of the current line.
|
|
383
|
-
* @param {Node} line - The
|
|
428
|
+
* @param {Node} line - The `line` element to be highlighted.
|
|
384
429
|
*/
|
|
385
430
|
on(line) {
|
|
386
431
|
if (!this.useHeader) return;
|
|
@@ -391,9 +436,9 @@ DocumentType.prototype = {
|
|
|
391
436
|
const item = this._findItem(line);
|
|
392
437
|
if (!item) return;
|
|
393
438
|
|
|
394
|
-
dom.utils.removeClass(this
|
|
439
|
+
dom.utils.removeClass(this.#innerHeaders, 'active');
|
|
395
440
|
dom.utils.addClass(item, 'active');
|
|
396
|
-
}
|
|
441
|
+
}
|
|
397
442
|
|
|
398
443
|
/**
|
|
399
444
|
* @description Handles text changes in the document.
|
|
@@ -405,60 +450,64 @@ DocumentType.prototype = {
|
|
|
405
450
|
const item = this._findItem(header);
|
|
406
451
|
if (!item) return;
|
|
407
452
|
item.textContent = header.textContent;
|
|
408
|
-
}
|
|
453
|
+
}
|
|
409
454
|
|
|
410
455
|
/**
|
|
411
|
-
* @
|
|
456
|
+
* @internal
|
|
412
457
|
* @description Displays the current page number.
|
|
413
458
|
*/
|
|
414
459
|
_displayCurrentPage() {
|
|
415
460
|
const pageNum = this.getCurrentPageNumber();
|
|
416
|
-
this
|
|
417
|
-
}
|
|
461
|
+
this.#pageNavigator?.display(pageNum, this.#totalPages);
|
|
462
|
+
}
|
|
418
463
|
|
|
419
464
|
/**
|
|
420
|
-
* @
|
|
465
|
+
* @internal
|
|
421
466
|
* @description Retrieves the scroll position in WYSIWYG mode.
|
|
422
467
|
* @returns {number} The current scroll position.
|
|
423
468
|
*/
|
|
424
469
|
_getWWScrollTop() {
|
|
425
|
-
|
|
426
|
-
|
|
470
|
+
const displayPage = this._getDisplayPage();
|
|
471
|
+
return displayPage.scrollTop || displayPage.scrollY || 0;
|
|
472
|
+
}
|
|
427
473
|
|
|
428
474
|
/**
|
|
429
|
-
* @
|
|
475
|
+
* @internal
|
|
430
476
|
* @description Moves to a specific page and updates the view.
|
|
431
477
|
* @param {number} pageNum - The target page number.
|
|
432
478
|
*/
|
|
433
479
|
_movePage(pageNum, force) {
|
|
434
480
|
const globalTop = this._getGlobalTop();
|
|
435
|
-
const
|
|
436
|
-
const
|
|
481
|
+
const isScrollable = this.#isScrollable(this.#fc);
|
|
482
|
+
const children = converter.nodeListToArray(this.#ww.children);
|
|
483
|
+
const pageTop = this.#page.offsetTop + numbers.get(this.#pages[pageNum - 1].style.top) + (!isScrollable ? 0 : this._getWWScrollTop());
|
|
437
484
|
for (let i = 0, len = children.length, c; i < len; i++) {
|
|
438
485
|
c = children[i];
|
|
439
486
|
if (c.offsetTop >= pageTop) {
|
|
440
|
-
if (!force) this
|
|
441
|
-
const scrollTop = i === 0 &&
|
|
487
|
+
if (!force) this.#selection.setRange(c, 0, c, 0);
|
|
488
|
+
const scrollTop = i === 0 && isScrollable ? 0 : c.offsetTop - this.#page.offsetTop - c.offsetHeight + globalTop;
|
|
442
489
|
this._applyPageScroll(scrollTop, () => {
|
|
443
|
-
if (this
|
|
444
|
-
this.
|
|
490
|
+
if (this.#toolbar.isSticky) {
|
|
491
|
+
this._getDisplayPage().scrollTo({ top: scrollTop - this.#context.get('toolbar_main').offsetHeight, behavior: 'smooth' });
|
|
445
492
|
}
|
|
446
493
|
});
|
|
447
494
|
|
|
448
|
-
this
|
|
495
|
+
this.#pageNum = pageNum;
|
|
449
496
|
break;
|
|
450
497
|
}
|
|
451
498
|
}
|
|
452
|
-
}
|
|
499
|
+
}
|
|
453
500
|
|
|
454
501
|
/**
|
|
455
|
-
* @
|
|
502
|
+
* @internal
|
|
456
503
|
* @description Applies smooth scrolling for page navigation.
|
|
457
504
|
*/
|
|
458
505
|
_applyPageScroll(top, callback) {
|
|
459
|
-
this.
|
|
506
|
+
const displayPage = this._getDisplayPage();
|
|
507
|
+
|
|
508
|
+
displayPage.scrollTo({ top, behavior: 'smooth' });
|
|
460
509
|
const checkScrollEnd = () => {
|
|
461
|
-
if (Math.abs((
|
|
510
|
+
if (Math.abs((displayPage.scrollY ?? displayPage.scrollTop) - top) < 1) {
|
|
462
511
|
callback();
|
|
463
512
|
} else {
|
|
464
513
|
_w.requestAnimationFrame(checkScrollEnd);
|
|
@@ -466,42 +515,42 @@ DocumentType.prototype = {
|
|
|
466
515
|
};
|
|
467
516
|
|
|
468
517
|
_w.requestAnimationFrame(checkScrollEnd);
|
|
469
|
-
}
|
|
518
|
+
}
|
|
470
519
|
|
|
471
520
|
/**
|
|
472
|
-
* @
|
|
521
|
+
* @internal
|
|
473
522
|
* @description Retrieves the global top offset of an element.
|
|
474
523
|
* @returns {number} The top offset of the element.
|
|
475
524
|
*/
|
|
476
525
|
_getGlobalTop() {
|
|
477
|
-
return this
|
|
478
|
-
}
|
|
526
|
+
return !this.#isScrollable(this.#fc) ? this.#offset.getGlobal(this.#wwFrame).top : 0;
|
|
527
|
+
}
|
|
479
528
|
|
|
480
529
|
/**
|
|
481
|
-
* @
|
|
530
|
+
* @internal
|
|
482
531
|
* @description Finds an header element of innerHeaders element.
|
|
483
532
|
* @param {Node} header - H tag element to find.
|
|
484
533
|
* @returns {HTMLElement|null} The found element, or null if not found.
|
|
485
534
|
*/
|
|
486
535
|
_findItem(header) {
|
|
487
|
-
const headers = this
|
|
536
|
+
const headers = this.#wwHeaders;
|
|
488
537
|
const index = Array.prototype.indexOf.call(headers, header);
|
|
489
538
|
|
|
490
|
-
if (index !== -1 && this
|
|
491
|
-
return this
|
|
539
|
+
if (index !== -1 && this.#innerHeaders[index]) {
|
|
540
|
+
return this.#innerHeaders[index];
|
|
492
541
|
}
|
|
493
542
|
|
|
494
543
|
return null;
|
|
495
|
-
}
|
|
544
|
+
}
|
|
496
545
|
|
|
497
546
|
/**
|
|
498
|
-
* @
|
|
547
|
+
* @internal
|
|
499
548
|
* @description Finds the closest header element from a given line.
|
|
500
|
-
* @param {Node} line - The
|
|
549
|
+
* @param {Node} line - The `line` to check.
|
|
501
550
|
* @returns {Node|null} The closest header element, or null if not found.
|
|
502
551
|
*/
|
|
503
552
|
_findLinesHeader(line) {
|
|
504
|
-
while (line && line !== this
|
|
553
|
+
while (line && line !== this.#ww) {
|
|
505
554
|
if (this._is(line)) {
|
|
506
555
|
return line;
|
|
507
556
|
}
|
|
@@ -509,52 +558,78 @@ DocumentType.prototype = {
|
|
|
509
558
|
}
|
|
510
559
|
|
|
511
560
|
return null;
|
|
512
|
-
}
|
|
561
|
+
}
|
|
513
562
|
|
|
514
563
|
/**
|
|
515
|
-
* @
|
|
564
|
+
* @internal
|
|
516
565
|
* @description Checks if an element is a header.
|
|
517
566
|
* @param {Node} element - The element to check.
|
|
518
567
|
* @returns {boolean} True if the element is a header, otherwise false.
|
|
519
568
|
*/
|
|
520
569
|
_is(element) {
|
|
521
570
|
return /^h[1-6]$/i.test(element?.nodeName);
|
|
522
|
-
}
|
|
571
|
+
}
|
|
523
572
|
|
|
524
573
|
/**
|
|
525
|
-
* @
|
|
574
|
+
* @internal
|
|
526
575
|
* @description Retrieves all headers in the document.
|
|
527
|
-
* @returns {
|
|
576
|
+
* @returns {NodeListOf<Element>} An array of header elements.
|
|
528
577
|
*/
|
|
529
578
|
_getHeaders() {
|
|
530
|
-
return (this
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
constructor: DocumentType
|
|
534
|
-
};
|
|
579
|
+
return (this.#wwHeaders = this.#ww.querySelectorAll('h1, h2, h3, h4, h5, h6'));
|
|
580
|
+
}
|
|
535
581
|
|
|
536
|
-
/**
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
582
|
+
/**
|
|
583
|
+
* @param {HTMLElement} ww WYSIWYG element
|
|
584
|
+
* @param {Event} e Event object
|
|
585
|
+
*/
|
|
586
|
+
#OnClickHeader(ww, e) {
|
|
587
|
+
e.preventDefault();
|
|
588
|
+
|
|
589
|
+
try {
|
|
590
|
+
this.#store.set('_preventBlur', true);
|
|
591
|
+
const clickedHeader = dom.query.getEventTarget(e);
|
|
592
|
+
if (dom.utils.hasClass(clickedHeader, 'se-doc-item')) {
|
|
593
|
+
const innerIndex = Array.prototype.indexOf.call(this.#innerHeaders, clickedHeader);
|
|
594
|
+
if (innerIndex === -1) return;
|
|
595
|
+
|
|
596
|
+
const header = this.#wwHeaders[innerIndex];
|
|
597
|
+
if (header) {
|
|
598
|
+
this.#selection.scrollTo(header);
|
|
599
|
+
}
|
|
554
600
|
}
|
|
601
|
+
} finally {
|
|
602
|
+
this.#store.set('_preventBlur', false);
|
|
555
603
|
}
|
|
556
|
-
}
|
|
557
|
-
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* @internal
|
|
608
|
+
* @description Destroy the DocumentType instance and release memory
|
|
609
|
+
*/
|
|
610
|
+
_destroy() {
|
|
611
|
+
if (this.#rePageTimeout) {
|
|
612
|
+
_w.clearTimeout(this.#rePageTimeout);
|
|
613
|
+
this.#rePageTimeout = null;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
if (this.#positionCache) {
|
|
617
|
+
this.#positionCache.clear();
|
|
618
|
+
this.#positionCache = null;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
this.#fc = null;
|
|
622
|
+
this.#ww = null;
|
|
623
|
+
this.#wwFrame = null;
|
|
624
|
+
this.#documentTypeInner = null;
|
|
625
|
+
this.#inner = null;
|
|
626
|
+
this.#page = null;
|
|
627
|
+
this.#pages = null;
|
|
628
|
+
this.#pagesLine = null;
|
|
629
|
+
this.#innerHeaders = null;
|
|
630
|
+
this.#wwHeaders = null;
|
|
631
|
+
this.#pageNavigator = null;
|
|
632
|
+
this.#mirror = null;
|
|
558
633
|
}
|
|
559
634
|
}
|
|
560
635
|
|