suneditor 2.46.2 → 3.0.0-alpha.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.
Files changed (289) hide show
  1. package/.eslintignore +7 -0
  2. package/.eslintrc.json +64 -0
  3. package/CONTRIBUTING.md +36 -0
  4. package/LICENSE.txt +1 -1
  5. package/README.md +11 -1560
  6. package/package.json +94 -70
  7. package/src/assets/icons/_default.js +194 -0
  8. package/src/assets/suneditor-content.css +642 -0
  9. package/src/assets/suneditor.css +3378 -0
  10. package/src/core/base/eventHandlers/handler_toolbar.js +114 -0
  11. package/src/core/base/eventHandlers/handler_ww_clipboard.js +31 -0
  12. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +69 -0
  13. package/src/core/base/eventHandlers/handler_ww_key_input.js +978 -0
  14. package/src/core/base/eventHandlers/handler_ww_mouse.js +118 -0
  15. package/src/core/base/eventManager.js +1129 -0
  16. package/src/core/base/events.js +320 -0
  17. package/src/core/base/history.js +301 -0
  18. package/src/core/class/char.js +146 -0
  19. package/src/core/class/component.js +624 -0
  20. package/src/core/class/format.js +3255 -0
  21. package/src/core/class/html.js +1621 -0
  22. package/src/core/class/menu.js +260 -0
  23. package/src/core/class/nodeTransform.js +379 -0
  24. package/src/core/class/notice.js +42 -0
  25. package/src/core/class/offset.js +578 -0
  26. package/src/core/class/selection.js +508 -0
  27. package/src/core/class/shortcuts.js +38 -0
  28. package/src/core/class/toolbar.js +440 -0
  29. package/src/core/class/viewer.js +646 -0
  30. package/src/core/editor.js +1588 -0
  31. package/src/core/section/actives.js +107 -0
  32. package/src/core/section/constructor.js +1237 -0
  33. package/src/core/section/context.js +97 -0
  34. package/src/editorInjector/_classes.js +22 -0
  35. package/src/editorInjector/_core.js +28 -0
  36. package/src/editorInjector/index.js +13 -0
  37. package/src/helper/converter.js +313 -0
  38. package/src/helper/domUtils.js +1177 -0
  39. package/src/helper/env.js +250 -0
  40. package/src/helper/index.js +19 -0
  41. package/src/helper/numbers.js +68 -0
  42. package/src/helper/unicode.js +43 -0
  43. package/src/langs/ckb.js +161 -0
  44. package/src/langs/cs.js +161 -0
  45. package/src/langs/da.js +161 -0
  46. package/src/langs/de.js +162 -0
  47. package/src/langs/en.js +199 -0
  48. package/src/langs/es.js +162 -0
  49. package/src/langs/fa.js +159 -0
  50. package/src/langs/fr.js +161 -0
  51. package/src/langs/he.js +162 -0
  52. package/src/{lang → langs}/index.js +0 -2
  53. package/src/langs/it.js +162 -0
  54. package/src/langs/ja.js +162 -0
  55. package/src/langs/ko.js +162 -0
  56. package/src/langs/lv.js +162 -0
  57. package/src/langs/nl.js +162 -0
  58. package/src/langs/pl.js +162 -0
  59. package/src/langs/pt_br.js +162 -0
  60. package/src/langs/ro.js +162 -0
  61. package/src/langs/ru.js +162 -0
  62. package/src/langs/se.js +162 -0
  63. package/src/langs/tr.js +159 -0
  64. package/src/langs/ua.js +162 -0
  65. package/src/langs/ur.js +162 -0
  66. package/src/langs/zh_cn.js +162 -0
  67. package/src/modules/ApiManager.js +168 -0
  68. package/src/modules/ColorPicker.js +302 -0
  69. package/src/modules/Controller.js +315 -0
  70. package/src/modules/Figure.js +1174 -0
  71. package/src/modules/FileBrowser.js +271 -0
  72. package/src/modules/FileManager.js +290 -0
  73. package/src/modules/HueSlider.js +513 -0
  74. package/src/modules/Modal.js +177 -0
  75. package/src/modules/ModalAnchorEditor.js +494 -0
  76. package/src/modules/SelectMenu.js +447 -0
  77. package/src/modules/_DragHandle.js +16 -0
  78. package/src/modules/index.js +14 -0
  79. package/src/plugins/command/blockquote.js +47 -47
  80. package/src/plugins/command/exportPdf.js +168 -0
  81. package/src/plugins/command/fileUpload.js +389 -0
  82. package/src/plugins/command/list_bulleted.js +112 -0
  83. package/src/plugins/command/list_numbered.js +115 -0
  84. package/src/plugins/dropdown/align.js +143 -0
  85. package/src/plugins/dropdown/backgroundColor.js +73 -0
  86. package/src/plugins/dropdown/font.js +113 -0
  87. package/src/plugins/dropdown/fontColor.js +73 -0
  88. package/src/plugins/dropdown/formatBlock.js +141 -0
  89. package/src/plugins/dropdown/hr.js +111 -0
  90. package/src/plugins/dropdown/layout.js +72 -0
  91. package/src/plugins/dropdown/lineHeight.js +114 -0
  92. package/src/plugins/dropdown/list.js +107 -0
  93. package/src/plugins/dropdown/paragraphStyle.js +117 -0
  94. package/src/plugins/dropdown/table.js +2810 -0
  95. package/src/plugins/dropdown/template.js +71 -0
  96. package/src/plugins/dropdown/textStyle.js +137 -0
  97. package/src/plugins/field/mention.js +172 -0
  98. package/src/plugins/fileBrowser/imageGallery.js +76 -59
  99. package/src/plugins/index.js +86 -24
  100. package/src/plugins/input/fontSize.js +357 -0
  101. package/src/plugins/modal/audio.js +492 -0
  102. package/src/plugins/modal/image.js +1062 -0
  103. package/src/plugins/modal/link.js +211 -0
  104. package/src/plugins/modal/math.js +347 -0
  105. package/src/plugins/modal/video.js +870 -0
  106. package/src/suneditor.js +62 -67
  107. package/src/themes/test.css +61 -0
  108. package/typings/CommandPlugin.d.ts +8 -0
  109. package/typings/DialogPlugin.d.ts +20 -0
  110. package/typings/FileBrowserPlugin.d.ts +30 -0
  111. package/typings/Lang.d.ts +124 -0
  112. package/typings/Module.d.ts +15 -0
  113. package/typings/Plugin.d.ts +42 -0
  114. package/typings/SubmenuPlugin.d.ts +8 -0
  115. package/typings/_classes.d.ts +17 -0
  116. package/typings/_colorPicker.d.ts +60 -0
  117. package/typings/_core.d.ts +55 -0
  118. package/typings/align.d.ts +5 -0
  119. package/{src/plugins/dialog → typings}/audio.d.ts +1 -1
  120. package/typings/backgroundColor.d.ts +5 -0
  121. package/{src/plugins/command → typings}/blockquote.d.ts +1 -1
  122. package/typings/char.d.ts +39 -0
  123. package/typings/component.d.ts +38 -0
  124. package/typings/context.d.ts +39 -0
  125. package/typings/converter.d.ts +33 -0
  126. package/typings/dialog.d.ts +28 -0
  127. package/typings/domUtils.d.ts +361 -0
  128. package/typings/editor.d.ts +7 -0
  129. package/typings/editor.ts +542 -0
  130. package/typings/env.d.ts +70 -0
  131. package/typings/eventManager.d.ts +37 -0
  132. package/typings/events.d.ts +262 -0
  133. package/typings/fileBrowser.d.ts +42 -0
  134. package/typings/fileManager.d.ts +67 -0
  135. package/typings/font.d.ts +5 -0
  136. package/typings/fontColor.d.ts +5 -0
  137. package/typings/fontSize.d.ts +5 -0
  138. package/typings/format.d.ts +191 -0
  139. package/typings/formatBlock.d.ts +5 -0
  140. package/typings/history.d.ts +48 -0
  141. package/typings/horizontalRule.d.ts +5 -0
  142. package/{src/plugins/dialog → typings}/image.d.ts +1 -1
  143. package/{src/plugins/fileBrowser → typings}/imageGallery.d.ts +1 -1
  144. package/typings/index.d.ts +21 -0
  145. package/{src/plugins/modules/index.d.ts → typings/index.modules.d.ts} +3 -3
  146. package/typings/index.plugins.d.ts +58 -0
  147. package/typings/lineHeight.d.ts +5 -0
  148. package/{src/plugins/dialog → typings}/link.d.ts +1 -1
  149. package/typings/list.d.ts +5 -0
  150. package/{src/plugins/dialog → typings}/math.d.ts +1 -1
  151. package/typings/mediaContainer.d.ts +25 -0
  152. package/typings/node.d.ts +57 -0
  153. package/typings/notice.d.ts +16 -0
  154. package/typings/numbers.d.ts +29 -0
  155. package/typings/offset.d.ts +24 -0
  156. package/typings/options.d.ts +589 -0
  157. package/typings/paragraphStyle.d.ts +5 -0
  158. package/typings/resizing.d.ts +141 -0
  159. package/typings/selection.d.ts +94 -0
  160. package/typings/shortcuts.d.ts +13 -0
  161. package/typings/suneditor.d.ts +9 -0
  162. package/typings/table.d.ts +5 -0
  163. package/typings/template.d.ts +5 -0
  164. package/typings/textStyle.d.ts +5 -0
  165. package/typings/toolbar.d.ts +32 -0
  166. package/typings/unicode.d.ts +25 -0
  167. package/{src/plugins/dialog → typings}/video.d.ts +1 -1
  168. package/dist/css/suneditor.min.css +0 -1
  169. package/dist/suneditor.min.js +0 -2
  170. package/src/assets/css/suneditor-contents.css +0 -562
  171. package/src/assets/css/suneditor.css +0 -566
  172. package/src/assets/defaultIcons.js +0 -103
  173. package/src/lang/Lang.d.ts +0 -144
  174. package/src/lang/ckb.d.ts +0 -5
  175. package/src/lang/ckb.js +0 -188
  176. package/src/lang/cs.d.ts +0 -5
  177. package/src/lang/cs.js +0 -188
  178. package/src/lang/da.d.ts +0 -5
  179. package/src/lang/da.js +0 -191
  180. package/src/lang/de.d.ts +0 -5
  181. package/src/lang/de.js +0 -188
  182. package/src/lang/en.d.ts +0 -5
  183. package/src/lang/en.js +0 -188
  184. package/src/lang/es.d.ts +0 -5
  185. package/src/lang/es.js +0 -188
  186. package/src/lang/fa.d.ts +0 -5
  187. package/src/lang/fa.js +0 -188
  188. package/src/lang/fr.d.ts +0 -5
  189. package/src/lang/fr.js +0 -188
  190. package/src/lang/he.d.ts +0 -5
  191. package/src/lang/he.js +0 -188
  192. package/src/lang/index.d.ts +0 -23
  193. package/src/lang/it.d.ts +0 -5
  194. package/src/lang/it.js +0 -188
  195. package/src/lang/ja.d.ts +0 -5
  196. package/src/lang/ja.js +0 -188
  197. package/src/lang/ko.d.ts +0 -5
  198. package/src/lang/ko.js +0 -188
  199. package/src/lang/lv.d.ts +0 -5
  200. package/src/lang/lv.js +0 -188
  201. package/src/lang/nl.d.ts +0 -5
  202. package/src/lang/nl.js +0 -188
  203. package/src/lang/pl.d.ts +0 -5
  204. package/src/lang/pl.js +0 -188
  205. package/src/lang/pt_br.d.ts +0 -5
  206. package/src/lang/pt_br.js +0 -189
  207. package/src/lang/ro.d.ts +0 -5
  208. package/src/lang/ro.js +0 -188
  209. package/src/lang/ru.d.ts +0 -5
  210. package/src/lang/ru.js +0 -188
  211. package/src/lang/se.d.ts +0 -5
  212. package/src/lang/se.js +0 -191
  213. package/src/lang/tr.d.ts +0 -5
  214. package/src/lang/tr.js +0 -191
  215. package/src/lang/ua.d.ts +0 -5
  216. package/src/lang/ua.js +0 -188
  217. package/src/lang/ur.d.ts +0 -5
  218. package/src/lang/ur.js +0 -188
  219. package/src/lang/zh_cn.d.ts +0 -5
  220. package/src/lang/zh_cn.js +0 -187
  221. package/src/lib/constructor.js +0 -954
  222. package/src/lib/context.d.ts +0 -42
  223. package/src/lib/context.js +0 -71
  224. package/src/lib/core.d.ts +0 -1135
  225. package/src/lib/core.js +0 -9395
  226. package/src/lib/history.d.ts +0 -48
  227. package/src/lib/history.js +0 -219
  228. package/src/lib/util.d.ts +0 -678
  229. package/src/lib/util.js +0 -2131
  230. package/src/options.d.ts +0 -608
  231. package/src/plugins/CommandPlugin.d.ts +0 -8
  232. package/src/plugins/DialogPlugin.d.ts +0 -20
  233. package/src/plugins/FileBrowserPlugin.d.ts +0 -30
  234. package/src/plugins/Module.d.ts +0 -15
  235. package/src/plugins/Plugin.d.ts +0 -42
  236. package/src/plugins/SubmenuPlugin.d.ts +0 -8
  237. package/src/plugins/dialog/audio.js +0 -559
  238. package/src/plugins/dialog/image.js +0 -1126
  239. package/src/plugins/dialog/link.js +0 -223
  240. package/src/plugins/dialog/math.js +0 -295
  241. package/src/plugins/dialog/mention.js +0 -242
  242. package/src/plugins/dialog/video.js +0 -979
  243. package/src/plugins/index.d.ts +0 -79
  244. package/src/plugins/modules/_anchor.js +0 -461
  245. package/src/plugins/modules/_colorPicker.d.ts +0 -60
  246. package/src/plugins/modules/_colorPicker.js +0 -201
  247. package/src/plugins/modules/_notice.d.ts +0 -21
  248. package/src/plugins/modules/_notice.js +0 -72
  249. package/src/plugins/modules/_selectMenu.js +0 -119
  250. package/src/plugins/modules/component.d.ts +0 -25
  251. package/src/plugins/modules/component.js +0 -81
  252. package/src/plugins/modules/dialog.d.ts +0 -28
  253. package/src/plugins/modules/dialog.js +0 -175
  254. package/src/plugins/modules/fileBrowser.d.ts +0 -42
  255. package/src/plugins/modules/fileBrowser.js +0 -374
  256. package/src/plugins/modules/fileManager.d.ts +0 -67
  257. package/src/plugins/modules/fileManager.js +0 -326
  258. package/src/plugins/modules/index.js +0 -9
  259. package/src/plugins/modules/resizing.d.ts +0 -154
  260. package/src/plugins/modules/resizing.js +0 -903
  261. package/src/plugins/submenu/align.d.ts +0 -5
  262. package/src/plugins/submenu/align.js +0 -160
  263. package/src/plugins/submenu/font.d.ts +0 -5
  264. package/src/plugins/submenu/font.js +0 -123
  265. package/src/plugins/submenu/fontColor.d.ts +0 -5
  266. package/src/plugins/submenu/fontColor.js +0 -101
  267. package/src/plugins/submenu/fontSize.d.ts +0 -5
  268. package/src/plugins/submenu/fontSize.js +0 -112
  269. package/src/plugins/submenu/formatBlock.d.ts +0 -5
  270. package/src/plugins/submenu/formatBlock.js +0 -273
  271. package/src/plugins/submenu/hiliteColor.d.ts +0 -5
  272. package/src/plugins/submenu/hiliteColor.js +0 -102
  273. package/src/plugins/submenu/horizontalRule.d.ts +0 -5
  274. package/src/plugins/submenu/horizontalRule.js +0 -98
  275. package/src/plugins/submenu/lineHeight.d.ts +0 -5
  276. package/src/plugins/submenu/lineHeight.js +0 -104
  277. package/src/plugins/submenu/list.d.ts +0 -5
  278. package/src/plugins/submenu/list.js +0 -456
  279. package/src/plugins/submenu/paragraphStyle.d.ts +0 -5
  280. package/src/plugins/submenu/paragraphStyle.js +0 -135
  281. package/src/plugins/submenu/table.d.ts +0 -5
  282. package/src/plugins/submenu/table.js +0 -1431
  283. package/src/plugins/submenu/template.d.ts +0 -5
  284. package/src/plugins/submenu/template.js +0 -72
  285. package/src/plugins/submenu/textStyle.d.ts +0 -5
  286. package/src/plugins/submenu/textStyle.js +0 -167
  287. package/src/suneditor.d.ts +0 -9
  288. package/src/suneditor_build.js +0 -18
  289. /package/{src/plugins/dialog → typings}/mention.d.ts +0 -0
@@ -0,0 +1,646 @@
1
+ /**
2
+ * @fileoverview Viewer class
3
+ */
4
+
5
+ import CoreInjector from '../../editorInjector/_core';
6
+ import { domUtils, env, converter, numbers } from '../../helper';
7
+
8
+ const Viewer = function (editor) {
9
+ CoreInjector.call(this, editor);
10
+
11
+ // members
12
+ this.bodyOverflow = '';
13
+ this.editorAreaOriginCssText = '';
14
+ this.wysiwygOriginCssText = '';
15
+ this.codeWrapperOriginCssText = '';
16
+ this.codeOriginCssText = '';
17
+ this.codeNumberOriginCssText = '';
18
+ this.toolbarOriginCssText = '';
19
+ this.arrowOriginCssText = '';
20
+ this.fullScreenInnerHeight = 0;
21
+ this.fullScreenSticky = false;
22
+ this.fullScreenBalloon = false;
23
+ this.fullScreenInline = false;
24
+ this.toolbarParent = null;
25
+ };
26
+
27
+ Viewer.prototype = {
28
+ /**
29
+ * @description Changes to code view or wysiwyg view
30
+ * @param {boolean|undefined} value true/false, If undefined toggle the codeView mode.
31
+ */
32
+ codeView(value) {
33
+ const fc = this.editor.frameContext;
34
+ if (value === undefined) value = !fc.get('isCodeView');
35
+ if (value === fc.get('isCodeView')) return;
36
+
37
+ fc.set('isCodeView', value);
38
+ this.editor._offCurrentController();
39
+ this.editor._offCurrentModal();
40
+
41
+ const codeWrapper = fc.get('codeWrapper');
42
+ const codeFrame = fc.get('code');
43
+ const wysiwygFrame = fc.get('wysiwygFrame');
44
+
45
+ if (value) {
46
+ this._setEditorDataToCodeView();
47
+ codeWrapper.style.setProperty('display', 'flex', 'important');
48
+ wysiwygFrame.style.display = 'none';
49
+
50
+ if (fc.get('isFullScreen')) {
51
+ codeFrame.style.height = '100%';
52
+ } else if (this.editor.frameOptions.get('height') === 'auto' && !this.options.get('hasCodeMirror')) {
53
+ codeFrame.style.height = codeFrame.scrollHeight > 0 ? codeFrame.scrollHeight + 'px' : 'auto';
54
+ }
55
+
56
+ if (this.options.get('hasCodeMirror')) {
57
+ this._codeMirrorEditor('refresh', null, null);
58
+ }
59
+
60
+ if (!fc.get('isFullScreen')) {
61
+ this.editor._notHideToolbar = true;
62
+ if (this.editor.isBalloon) {
63
+ this.context.get('toolbar._arrow').style.display = 'none';
64
+ this.context.get('toolbar.main').style.left = '';
65
+ this.editor.isInline = this.toolbar._isInline = true;
66
+ this.editor.isBalloon = this.toolbar._isBalloon = false;
67
+ this.toolbar._showInline();
68
+ }
69
+ }
70
+
71
+ if (this.editor.isSubBalloon) {
72
+ this.subToolbar.hide();
73
+ }
74
+
75
+ CreateLineNumbers(fc);
76
+
77
+ this.status._range = null;
78
+ codeFrame.focus();
79
+ domUtils.addClass(this.editor.commandTargets.get('codeView'), 'active');
80
+ } else {
81
+ if (!domUtils.isNonEditable(wysiwygFrame)) this._setCodeDataToEditor();
82
+ wysiwygFrame.scrollTop = 0;
83
+ codeWrapper.style.setProperty('display', 'none', 'important');
84
+ wysiwygFrame.style.display = 'block';
85
+
86
+ if (this.editor.frameOptions.get('height') === 'auto' && !this.options.get('hasCodeMirror')) fc.get('code').style.height = '0px';
87
+
88
+ if (!fc.get('isFullScreen')) {
89
+ this.editor._notHideToolbar = false;
90
+ if (/balloon/.test(this.options.get('mode'))) {
91
+ this.context.get('toolbar._arrow').style.display = '';
92
+ this.editor.isInline = this.toolbar._isInline = false;
93
+ this.editor.isBalloon = this.toolbar._isBalloon = true;
94
+ this.eventManager._hideToolbar();
95
+ }
96
+ }
97
+
98
+ this.editor._nativeFocus();
99
+ domUtils.removeClass(this.editor.commandTargets.get('codeView'), 'active');
100
+
101
+ if (!domUtils.isNonEditable(wysiwygFrame)) {
102
+ this.history.push(false);
103
+ this.history.resetButtons(fc.get('key'), null);
104
+ }
105
+ }
106
+
107
+ this.editor._checkPlaceholder();
108
+ domUtils.setDisabled(this.editor._codeViewDisabledButtons, value);
109
+
110
+ // user event
111
+ this.triggerEvent('onToggleCodeView', { frameContext: fc, is: fc.get('isCodeView') });
112
+ },
113
+
114
+ /**
115
+ * @description Changes to full screen or default screen
116
+ * @param {boolean|undefined} value true/false, If undefined toggle the codeView mode.
117
+ */
118
+ fullScreen(value) {
119
+ const fc = this.editor.frameContext;
120
+ if (value === undefined) value = !fc.get('isFullScreen');
121
+ if (value === fc.get('isFullScreen')) return;
122
+
123
+ fc.set('isFullScreen', value);
124
+ const topArea = fc.get('topArea');
125
+ const toolbar = this.context.get('toolbar.main');
126
+ const editorArea = fc.get('wrapper');
127
+ const wysiwygFrame = fc.get('wysiwygFrame');
128
+ const codeWrapper = fc.get('codeWrapper');
129
+ const code = fc.get('code');
130
+ const codeNumbers = fc.get('codeNumbers');
131
+ const isCodeView = this.editor.frameContext.get('isCodeView');
132
+ const arrow = this.context.get('toolbar._arrow');
133
+
134
+ this.editor._offCurrentController();
135
+ const wasToolbarHidden = toolbar.style.display === 'none' || (this.editor.isInline && !this.editor.toolbar._inlineToolbarAttr.isShow);
136
+
137
+ if (value) {
138
+ this._originCssText = topArea.style.cssText;
139
+ this.editorAreaOriginCssText = editorArea.style.cssText;
140
+ this.wysiwygOriginCssText = wysiwygFrame.style.cssText;
141
+ this.codeWrapperOriginCssText = codeWrapper.style.cssText;
142
+ this.codeOriginCssText = code.style.cssText;
143
+ this.codeNumberOriginCssText = codeNumbers?.style.cssText;
144
+ this.toolbarOriginCssText = toolbar.style.cssText;
145
+ if (arrow) this.arrowOriginCssText = arrow.style.cssText;
146
+
147
+ if (this.editor.isBalloon || this.editor.isInline) {
148
+ if (arrow) arrow.style.display = 'none';
149
+ this.fullScreenInline = this.editor.isInline;
150
+ this.fullScreenBalloon = this.editor.isBalloon;
151
+ this.editor.isInline = this.toolbar._isInline = false;
152
+ this.editor.isBalloon = this.toolbar._isBalloon = false;
153
+ }
154
+
155
+ if (this.options.get('toolbar_container')) {
156
+ this.toolbarParent = toolbar.parentElement;
157
+ fc.get('container').insertBefore(toolbar, editorArea);
158
+ }
159
+
160
+ topArea.style.position = 'fixed';
161
+ topArea.style.top = '0';
162
+ topArea.style.left = '0';
163
+ topArea.style.width = '100%';
164
+ topArea.style.maxWidth = '100%';
165
+ topArea.style.height = '100%';
166
+ topArea.style.zIndex = '2147483646';
167
+
168
+ if (fc.get('_stickyDummy').style.display !== 'none' && fc.get('_stickyDummy').style.display !== '') {
169
+ this.fullScreenSticky = true;
170
+ fc.get('_stickyDummy').style.display = 'none';
171
+ domUtils.removeClass(toolbar, 'se-toolbar-sticky');
172
+ }
173
+
174
+ this.bodyOverflow = this._d.body.style.overflow;
175
+ this._d.body.style.overflow = 'hidden';
176
+
177
+ // frame
178
+ editorArea.style.cssText = toolbar.style.cssText = '';
179
+ wysiwygFrame.style.cssText = (wysiwygFrame.style.cssText.match(/\s?display(\s+)?:(\s+)?[a-zA-Z]+;/) || [''])[0] + this.editor.frameOptions.get('_defaultStyles').editor + (isCodeView ? 'display: none;' : '');
180
+
181
+ // code wrapper
182
+ codeWrapper.style.cssText = (codeWrapper.style.cssText.match(/\s?display(\s+)?:(\s+)?[a-zA-Z]+;/) || [''])[0] + `display: ${!isCodeView ? 'none' : 'flex'} !important;`;
183
+ codeWrapper.style.overflow = 'auto';
184
+ codeWrapper.style.height = '100%';
185
+
186
+ // code
187
+ code.style.height = '';
188
+
189
+ // toolbar, editor area
190
+ toolbar.style.width = wysiwygFrame.style.height = '100%';
191
+ toolbar.style.position = 'relative';
192
+ toolbar.style.display = 'block';
193
+
194
+ this.fullScreenInnerHeight = this._w.innerHeight - toolbar.offsetHeight;
195
+ editorArea.style.height = this.fullScreenInnerHeight - (fc.has('statusbar') ? fc.get('statusbar').offsetHeight : 0) - this.options.get('fullScreenOffset') + 'px';
196
+
197
+ if (this.editor.frameOptions.get('iframe') && this.editor.frameOptions.get('height') === 'auto') {
198
+ editorArea.style.overflow = 'auto';
199
+ this.editor._iframeAutoHeight(fc);
200
+ }
201
+
202
+ fc.get('topArea').style.marginTop = this.options.get('fullScreenOffset') + 'px';
203
+
204
+ const reductionIcon = this.icons.reduction;
205
+ this.editor.applyCommandTargets('fullScreen', (e) => {
206
+ domUtils.changeElement(e.firstElementChild, reductionIcon);
207
+ domUtils.addClass(e, 'active');
208
+ });
209
+ } else {
210
+ // frame
211
+ wysiwygFrame.style.cssText = this.wysiwygOriginCssText.replace(/\s?display(\s+)?:(\s+)?[a-zA-Z]+;/, '') + (isCodeView ? 'display: none;' : '');
212
+
213
+ // code wrapper
214
+ codeWrapper.style.cssText = this.codeWrapperOriginCssText.replace(/\s?display(\s+)?:(\s+)?[a-zA-Z]+;/, '') + `display: ${!isCodeView ? 'none' : 'flex'} !important;`;
215
+
216
+ // code
217
+ code.style.cssText = this.codeOriginCssText;
218
+ if (codeNumbers) codeNumbers.style.cssText = this.codeNumberOriginCssText;
219
+
220
+ // toolbar, editor area
221
+ toolbar.style.cssText = this.toolbarOriginCssText;
222
+ editorArea.style.cssText = this.editorAreaOriginCssText;
223
+ topArea.style.cssText = this._originCssText;
224
+ if (arrow) arrow.style.cssText = this.arrowOriginCssText;
225
+ this._d.body.style.overflow = this.bodyOverflow;
226
+
227
+ if (this.editor.frameOptions.get('height') === 'auto' && !this.options.get('hasCodeMirror')) this._codeViewAutoHeight(fc);
228
+
229
+ if (this.toolbarParent) {
230
+ this.toolbarParent.appendChild(toolbar);
231
+ this.toolbarParent = null;
232
+ }
233
+
234
+ if (this.options.get('toolbar_sticky') > -1) {
235
+ domUtils.removeClass(toolbar, 'se-toolbar-sticky');
236
+ }
237
+
238
+ if (this.fullScreenSticky && !this.options.get('toolbar_container')) {
239
+ this.fullScreenSticky = false;
240
+ fc.get('_stickyDummy').style.display = 'block';
241
+ domUtils.addClass(toolbar, 'se-toolbar-sticky');
242
+ }
243
+
244
+ this.editor.isInline = this.toolbar._isInline = this.fullScreenInline;
245
+ this.editor.isBalloon = this.toolbar._isBalloon = this.fullScreenBalloon;
246
+ if (!fc.get('isCodeView')) {
247
+ if (this.editor.isInline) this.editor.toolbar._showInline();
248
+ else if (this.editor.isBalloon) this.editor.toolbar._showBalloon();
249
+ }
250
+
251
+ this.editor.toolbar._resetSticky();
252
+ fc.get('topArea').style.marginTop = '';
253
+
254
+ const expansionIcon = this.icons.expansion;
255
+ this.editor.applyCommandTargets('fullScreen', (e) => {
256
+ domUtils.changeElement(e.firstElementChild, expansionIcon);
257
+ domUtils.removeClass(e, 'active');
258
+ });
259
+ }
260
+
261
+ if (wasToolbarHidden && !fc.get('isCodeView')) this.editor.toolbar.hide();
262
+
263
+ // user event
264
+ this.triggerEvent('onToggleFullScreen', { frameContext: fc, is: fc.get('isFullScreen') });
265
+ },
266
+
267
+ /**
268
+ * @description Add or remove the class name of "body" so that the code block is visible
269
+ * @param {boolean|undefined} value true/false, If undefined toggle the codeView mode.
270
+ */
271
+ showBlocks(value) {
272
+ const fc = this.editor.frameContext;
273
+ if (value === undefined) value = !fc.get('isShowBlocks');
274
+ fc.set('isShowBlocks', !!value);
275
+
276
+ if (value) {
277
+ domUtils.addClass(fc.get('wysiwyg'), 'se-show-block');
278
+ domUtils.addClass(this.editor.commandTargets.get('showBlocks'), 'active');
279
+ } else {
280
+ domUtils.removeClass(fc.get('wysiwyg'), 'se-show-block');
281
+ domUtils.removeClass(this.editor.commandTargets.get('showBlocks'), 'active');
282
+ }
283
+
284
+ this.editor._resourcesStateChange(fc);
285
+ },
286
+
287
+ _setButtonsActive() {
288
+ const fc = this.editor.frameContext;
289
+
290
+ // codeView
291
+ if (fc.get('isCodeView')) {
292
+ domUtils.addClass(this.editor.commandTargets.get('codeView'), 'active');
293
+ } else {
294
+ domUtils.removeClass(this.editor.commandTargets.get('codeView'), 'active');
295
+ }
296
+
297
+ // fullScreen
298
+ if (fc.get('isFullScreen')) {
299
+ const reductionIcon = this.icons.reduction;
300
+ this.editor.applyCommandTargets('fullScreen', (e) => {
301
+ domUtils.changeElement(e.firstElementChild, reductionIcon);
302
+ domUtils.addClass(e, 'active');
303
+ });
304
+ } else {
305
+ const expansionIcon = this.icons.expansion;
306
+ this.editor.applyCommandTargets('fullScreen', (e) => {
307
+ domUtils.changeElement(e.firstElementChild, expansionIcon);
308
+ domUtils.removeClass(e, 'active');
309
+ });
310
+ }
311
+
312
+ // showBlocks
313
+ if (fc.get('isShowBlocks')) {
314
+ domUtils.addClass(this.editor.commandTargets.get('showBlocks'), 'active');
315
+ } else {
316
+ domUtils.removeClass(this.editor.commandTargets.get('showBlocks'), 'active');
317
+ }
318
+ },
319
+
320
+ /**
321
+ * @description Prints the current content of the editor.
322
+ */
323
+ print() {
324
+ const iframe = domUtils.createElement('IFRAME', { style: 'display: none;' });
325
+ this._d.body.appendChild(iframe);
326
+
327
+ const contentHTML = this.options.get('printTemplate') ? this.options.get('printTemplate').replace(/\{\s*content\s*\}/i, this.html.get(true)) : this.html.get(true);
328
+ const printDocument = domUtils.getIframeDocument(iframe);
329
+ const wDoc = this.editor.frameContext.get('_wd');
330
+
331
+ if (this.editor.frameOptions.get('iframe')) {
332
+ const arrts = this.options.get('printClass')
333
+ ? 'class="' + this.options.get('printClass') + '"'
334
+ : this.editor.frameOptions.get('iframe_fullPage')
335
+ ? domUtils.getAttributesToString(wDoc.body, ['contenteditable'])
336
+ : 'class="' + this.options.get('_editableClass') + '"';
337
+
338
+ printDocument.write('' + '<!DOCTYPE html><html>' + '<head>' + wDoc.head.innerHTML + '</head>' + '<body ' + arrts + '>' + contentHTML + '</body>' + '</html>');
339
+ } else {
340
+ const links = this._d.head.getElementsByTagName('link');
341
+ const styles = this._d.head.getElementsByTagName('style');
342
+ let linkHTML = '';
343
+ for (let i = 0, len = links.length; i < len; i++) {
344
+ linkHTML += links[i].outerHTML;
345
+ }
346
+ for (let i = 0, len = styles.length; i < len; i++) {
347
+ linkHTML += styles[i].outerHTML;
348
+ }
349
+
350
+ printDocument.write(/*html*/ `<!DOCTYPE html>
351
+ <html>
352
+ <head>
353
+ ${linkHTML}
354
+ </head>
355
+ <body class="${this.options.get('printClass') ? this.options.get('printClass') : this.options.get('_editableClass')}">
356
+ ${contentHTML}
357
+ </body>
358
+ </html>`);
359
+ }
360
+
361
+ this.editor.showLoading();
362
+ this._w.setTimeout(() => {
363
+ try {
364
+ iframe.focus();
365
+ // Edge, Chromium
366
+ if (env.isEdge || env.isChromium || this._d.documentMode || this._w.StyleMedia) {
367
+ try {
368
+ iframe.contentWindow.document.execCommand('print', false, null);
369
+ } catch (e) {
370
+ console.warn('[SUNEDITOR.print.warn]', e);
371
+ iframe.contentWindow.print();
372
+ }
373
+ } else {
374
+ // Other browsers
375
+ iframe.contentWindow.print();
376
+ }
377
+ } catch (error) {
378
+ throw Error(`[SUNEDITOR.print.fail] error: ${error.message}`);
379
+ } finally {
380
+ this.editor.hideLoading();
381
+ domUtils.removeItem(iframe);
382
+ }
383
+ }, 1000);
384
+ },
385
+
386
+ /**
387
+ * @description Open the preview window.
388
+ */
389
+ preview() {
390
+ this.menu.dropdownOff();
391
+ this.menu.containerOff();
392
+ this.editor._offCurrentController();
393
+ this.editor._offCurrentModal();
394
+
395
+ const contentHTML = this.options.get('previewTemplate') ? this.options.get('previewTemplate').replace(/\{\s*content\s*\}/i, this.html.get(true)) : this.html.get(true);
396
+ const windowObject = this._w.open('', '_blank');
397
+ windowObject.mimeType = 'text/html';
398
+ const wDoc = this.editor.frameContext.get('_wd');
399
+
400
+ if (this.editor.frameOptions.get('iframe')) {
401
+ const arrts = this.options.get('printClass')
402
+ ? 'class="' + this.options.get('printClass') + '"'
403
+ : this.editor.frameOptions.get('iframe_fullPage')
404
+ ? domUtils.getAttributesToString(wDoc.body, ['contenteditable'])
405
+ : 'class="' + this.options.get('_editableClass') + '"';
406
+
407
+ windowObject.document.write(/*html*/ `<!DOCTYPE html>
408
+ <html>
409
+ <head>
410
+ ${wDoc.head.innerHTML}
411
+ <style>
412
+ body {overflow:auto !important; margin: 10px auto !important; height:auto !important; outline:1px dashed #ccc;}
413
+ </style>
414
+ </head>
415
+ <body ${arrts}>
416
+ ${contentHTML}
417
+ </body>
418
+ </html>`);
419
+ } else {
420
+ const links = this._d.head.getElementsByTagName('link');
421
+ const styles = this._d.head.getElementsByTagName('style');
422
+ let linkHTML = '';
423
+ for (let i = 0, len = links.length; i < len; i++) {
424
+ linkHTML += links[i].outerHTML;
425
+ }
426
+ for (let i = 0, len = styles.length; i < len; i++) {
427
+ linkHTML += styles[i].outerHTML;
428
+ }
429
+
430
+ windowObject.document.write(/*html*/ `<!DOCTYPE html>
431
+ <html>
432
+ <head>
433
+ <meta charset="utf-8" />
434
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
435
+ <title>${this.lang.preview}</title>
436
+ ${linkHTML}
437
+ </head>
438
+ <body class="${this.options.get('printClass') ? this.options.get('printClass') : this.options.get('_editableClass')}" style="margin:10px auto !important; height:auto !important; outline:1px dashed #ccc;">
439
+ ${contentHTML}
440
+ </body>
441
+ </html>`);
442
+ }
443
+ },
444
+
445
+ _resetFullScreenHeight() {
446
+ if (this.editor.frameContext.get('isFullScreen')) {
447
+ this.fullScreenInnerHeight +=
448
+ this._w.innerHeight - this.context.get('toolbar.main').offsetHeight - (this.editor.frameContext.has('statusbar') ? this.editor.frameContext.get('statusbar').offsetHeight : 0) - this.fullScreenInnerHeight;
449
+ this.editor.frameContext.get('wrapper').style.height = this.fullScreenInnerHeight + 'px';
450
+ return true;
451
+ }
452
+ },
453
+
454
+ /**
455
+ * @description Run CodeMirror Editor
456
+ * @param {"set"|"get"|"readonly"|"refresh"} key method key
457
+ * @param {any} value params
458
+ * @param {string|undefined} rootKey Root key
459
+ * @returns
460
+ * @private
461
+ */
462
+ _codeMirrorEditor(key, value, rootKey) {
463
+ const fo = rootKey ? this.frameRoots.get(rootKey).get('options') : this.editor.frameOptions;
464
+ switch (key) {
465
+ case 'set':
466
+ if (fo.has('codeMirror5Editor')) {
467
+ fo.get('codeMirror5Editor').getDoc().setValue(value);
468
+ } else if (fo.has('codeMirror6Editor')) {
469
+ fo.get('codeMirror6Editor').dispatch({
470
+ changes: { from: 0, to: fo.get('codeMirror6Editor').state.doc.length, insert: value }
471
+ });
472
+ }
473
+ break;
474
+ case 'get':
475
+ if (fo.has('codeMirror5Editor')) {
476
+ return fo.get('codeMirror5Editor').getDoc().getValue();
477
+ } else if (fo.has('codeMirror6Editor')) {
478
+ return fo.get('codeMirror6Editor').state.doc.toString();
479
+ }
480
+ break;
481
+ case 'readonly':
482
+ if (fo.has('codeMirror5Editor')) {
483
+ fo.get('codeMirror5Editor').setOption('readOnly', value);
484
+ } else if (fo.has('codeMirror6Editor')) {
485
+ if (!value) fo.get('codeMirror6Editor').contentDOM.setAttribute('contenteditable', true);
486
+ else fo.get('codeMirror6Editor').contentDOM.removeAttribute('contenteditable');
487
+ }
488
+ break;
489
+ case 'refresh':
490
+ if (fo.has('codeMirror5Editor')) {
491
+ fo.get('codeMirror5Editor').refresh();
492
+ }
493
+ break;
494
+ }
495
+ },
496
+
497
+ /**
498
+ * @description Set method in the code view area
499
+ * @param {string} value HTML string
500
+ * @private
501
+ */
502
+ _setCodeView(value) {
503
+ if (this.options.get('hasCodeMirror')) {
504
+ this._codeMirrorEditor('set', value, null);
505
+ } else {
506
+ this.editor.frameContext.get('code').value = value;
507
+ }
508
+ },
509
+
510
+ /**
511
+ * @description Get method in the code view area
512
+ * @private
513
+ */
514
+ _getCodeView() {
515
+ if (this.options.get('hasCodeMirror')) {
516
+ return this._codeMirrorEditor('get', null, null);
517
+ } else {
518
+ return this.editor.frameContext.get('code').value;
519
+ }
520
+ },
521
+
522
+ /**
523
+ * @description Convert the data of the code view and put it in the WYSIWYG area.
524
+ * @private
525
+ */
526
+ _setCodeDataToEditor() {
527
+ const code_html = this._getCodeView();
528
+
529
+ if (this.editor.frameOptions.get('iframe_fullPage')) {
530
+ const wDoc = this.editor.frameContext.get('_wd');
531
+ const parseDocument = new DOMParser().parseFromString(code_html, 'text/html');
532
+
533
+ if (!this.options.get('__allowedScriptTag')) {
534
+ const headChildren = parseDocument.head.children;
535
+ for (let i = 0, len = headChildren.length; i < len; i++) {
536
+ if (/^script$/i.test(headChildren[i].tagName)) {
537
+ parseDocument.head.removeChild(headChildren[i]);
538
+ i--;
539
+ len--;
540
+ }
541
+ }
542
+ }
543
+
544
+ let headers = parseDocument.head.innerHTML;
545
+ if (!parseDocument.head.querySelector('link[rel="stylesheet"]') || (this.editor.frameOptions.get('height') === 'auto' && !parseDocument.head.querySelector('style'))) {
546
+ headers += converter._setIframeStyleLinks(this.editor.frameOptions.get('iframe_cssFileName')) + converter._setAutoHeightStyle(this.editor.frameOptions.get('height'));
547
+ }
548
+
549
+ wDoc.head.innerHTML = headers;
550
+ wDoc.body.innerHTML = this.html.clean(parseDocument.body.innerHTML, true, null, null);
551
+
552
+ const attrs = parseDocument.body.attributes;
553
+ for (let i = 0, len = attrs.length; i < len; i++) {
554
+ if (attrs[i].name === 'contenteditable') continue;
555
+ wDoc.body.setAttribute(attrs[i].name, attrs[i].value);
556
+ }
557
+ if (!domUtils.hasClass(wDoc.body, 'sun-editor-editable')) {
558
+ const editableClasses = this.options.get('_editableClass').split(' ');
559
+ for (let i = 0; i < editableClasses.length; i++) {
560
+ domUtils.addClass(wDoc.body, this.options.get('_editableClass')[i]);
561
+ }
562
+ }
563
+ } else {
564
+ this.editor.frameContext.get('wysiwyg').innerHTML = code_html.length > 0 ? this.html.clean(code_html, true, null, null) : '<' + this.options.get('defaultLine') + '><br></' + this.options.get('defaultLine') + '>';
565
+ }
566
+ },
567
+
568
+ /**
569
+ * @description Convert the data of the WYSIWYG area and put it in the code view area.
570
+ * @private
571
+ */
572
+ _setEditorDataToCodeView() {
573
+ const codeContent = this.html._convertToCode(this.editor.frameContext.get('wysiwyg'), false);
574
+ let codeValue = '';
575
+
576
+ if (this.editor.frameOptions.get('iframe_fullPage')) {
577
+ const attrs = domUtils.getAttributesToString(this.editor.frameContext.get('_wd').body, null);
578
+ codeValue = '<!DOCTYPE html>\n<html>\n' + this.editor.frameContext.get('_wd').head.outerHTML.replace(/>(?!\n)/g, '>\n') + '<body ' + attrs + '>\n' + codeContent + '</body>\n</html>';
579
+ } else {
580
+ codeValue = codeContent;
581
+ }
582
+
583
+ this._setCodeView(codeValue);
584
+ },
585
+
586
+ _codeViewAutoHeight(code, codeNumbers, isAuto) {
587
+ if (isAuto) code.style.height = code.scrollHeight + 'px';
588
+ this._updateLineNumbers(codeNumbers, code);
589
+ },
590
+
591
+ _updateLineNumbers(lineNumbers, code) {
592
+ if (!lineNumbers) return;
593
+
594
+ const lineHeight = GetLineHeight(lineNumbers);
595
+ const numberOfLinesNeeded = Math.ceil(code.scrollHeight / lineHeight);
596
+
597
+ const currentLineCount = (lineNumbers.value.match(/\n/g) || []).length;
598
+ if (numberOfLinesNeeded > currentLineCount) {
599
+ let n = '';
600
+ for (let i = currentLineCount + 1; i <= numberOfLinesNeeded; i++) {
601
+ n += `${i}\n`;
602
+ }
603
+ lineNumbers.value += n;
604
+ }
605
+ },
606
+
607
+ _scrollLineNumbers(codeNumbers) {
608
+ codeNumbers.scrollTop = this.scrollTop;
609
+ codeNumbers.scrollLeft = this.scrollLeft;
610
+ },
611
+
612
+ constructor: Viewer
613
+ };
614
+
615
+ function CreateLineNumbers(fc) {
616
+ const codeNumbers = fc.get('codeNumbers');
617
+ if (!codeNumbers) return;
618
+
619
+ const lineHeight = GetLineHeight(codeNumbers);
620
+ const numberOfLines = fc.get('code').scrollHeight / lineHeight;
621
+
622
+ let n = '';
623
+ for (let i = 1; i <= numberOfLines; i++) {
624
+ n += `${i}\n`;
625
+ }
626
+
627
+ const { padding, margin } = env._w.getComputedStyle(fc.get('code'));
628
+ codeNumbers.value = n;
629
+ codeNumbers.style.padding = padding || '';
630
+ codeNumbers.style.margin = margin || '';
631
+ }
632
+
633
+ function GetLineHeight(textarea) {
634
+ let lineHeight = env._w.getComputedStyle(textarea).lineHeight;
635
+
636
+ if (!numbers.is(lineHeight)) {
637
+ const fontSize = env._w.getComputedStyle(textarea).fontSize;
638
+ lineHeight = numbers.get(fontSize) * 1.2;
639
+ } else {
640
+ lineHeight = numbers.get(lineHeight);
641
+ }
642
+
643
+ return lineHeight;
644
+ }
645
+
646
+ export default Viewer;