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,447 @@
1
+ import CoreInjector from '../editorInjector/_core';
2
+ import { domUtils, env } from '../helper';
3
+
4
+ const MENU_MIN_HEIGHT = 38;
5
+
6
+ /**
7
+ *
8
+ * @param {*} inst
9
+ * @param {object} params { checkList: boolean, position: "[left|right]-[middle|top|bottom] | [top|bottom]-[center|left|right]", dir?: "rtl" | "ltr" }
10
+ */
11
+ const SelectMenu = function (inst, params) {
12
+ // plugin bisic properties
13
+ CoreInjector.call(this, inst.editor);
14
+
15
+ // members
16
+ this.kink = inst.constructor.key || inst.constructor.name;
17
+ this.inst = inst;
18
+ const positionItems = params.position.split('-');
19
+ this.form = null;
20
+ this.items = [];
21
+ this.menus = [];
22
+ this.menuLen = 0;
23
+ this.index = -1;
24
+ this.item = null;
25
+ this.isOpen = false;
26
+ this.checkList = !!params.checkList;
27
+ this.position = positionItems[0];
28
+ this.subPosition = positionItems[1];
29
+ this._dirPosition = /^(left|right)$/.test(this.position) ? (this.position === 'left' ? 'right' : 'left') : this.position;
30
+ this._dirSubPosition = /^(left|right)$/.test(this.subPosition) ? (this.subPosition === 'left' ? 'right' : 'left') : this.subPosition;
31
+ this._textDirDiff = params.dir === 'ltr' ? false : params.dir === 'rtl' ? true : null;
32
+ this.splitNum = params.splitNum || 0;
33
+ this.horizontal = !!this.splitNum;
34
+ this.openMethod = params.openMethod;
35
+ this.closeMethod = params.closeMethod;
36
+ this._refer = null;
37
+ this._keydownTarget = null;
38
+ this._selectMethod = null;
39
+ this._bindClose_key = null;
40
+ this._bindClose_mousedown = null;
41
+ this._bindClose_click = null;
42
+ this._closeSignal = false;
43
+ this.__events = [];
44
+ this.__eventHandlers = {
45
+ mousedown: OnMousedown_list.bind(this.eventManager),
46
+ mousemove: OnMouseMove_list.bind(this),
47
+ click: OnClick_list.bind(this),
48
+ keydown: OnKeyDown_refer.bind(this)
49
+ };
50
+ this.__globalEventHandlers = { keydown: CloseListener_key.bind(this), mousedown: CloseListener_mousedown.bind(this), click: CloseListener_click.bind(this) };
51
+ };
52
+
53
+ SelectMenu.prototype = {
54
+ create(items, menus) {
55
+ this.form.firstElementChild.innerHTML = '';
56
+ menus = menus || items;
57
+ let html = '';
58
+ for (let i = 0, len = menus.length; i < len; i++) {
59
+ if (i > 0 && i % this.splitNum === 0) {
60
+ this._createFormat(html);
61
+ html = '';
62
+ }
63
+ html += `<li class="se-select-item" data-index="${i}">${typeof menus[i] === 'string' ? menus[i] : menus[i].outerHTML}</li>`;
64
+ }
65
+ this._createFormat(html);
66
+
67
+ this.items = items;
68
+ this.menus = this.form.querySelectorAll('li');
69
+ this.menuLen = this.menus.length;
70
+ },
71
+
72
+ on(referElement, selectMethod, attr) {
73
+ if (!attr) attr = {};
74
+ this._refer = referElement;
75
+ this._keydownTarget = domUtils.isInputElement(referElement) ? referElement : this._w;
76
+ this._selectMethod = selectMethod;
77
+ this.form = domUtils.createElement(
78
+ 'DIV',
79
+ {
80
+ class: 'se-select-menu' + (attr.class ? ' ' + attr.class : ''),
81
+ style: attr.style || ''
82
+ },
83
+ '<div class="se-list-inner"></div>'
84
+ );
85
+ referElement.parentNode.insertBefore(this.form, referElement);
86
+ },
87
+
88
+ /**
89
+ * @description Select menu open
90
+ * @param {string|null|undefined} position "[left|right]-[middle|top|bottom] | [top|bottom]-[center|left|right]"
91
+ * @param {string|null|undefined} onItemQuerySelector The querySelector string of the menu to be activated
92
+ */
93
+ open(position, onItemQuerySelector) {
94
+ this.editor.selectMenuOn = true;
95
+ if (typeof this.openMethod === 'function') this.openMethod();
96
+ this.__addEvents();
97
+ this.__addGlobalEvent();
98
+ const positionItems = position ? position.split('-') : [];
99
+ const mainPosition = positionItems[0] || (this._textDirDiff !== null && this._textDirDiff !== this.options.get('_rtl') ? this._dirPosition : this.position);
100
+ const subPosition = positionItems[1] || (this._textDirDiff !== null && this._textDirDiff !== this.options.get('_rtl') ? this._dirSubPosition : this.subPosition);
101
+ this._setPosition(mainPosition, subPosition, onItemQuerySelector);
102
+ this.isOpen = true;
103
+ },
104
+
105
+ close() {
106
+ this.editor.selectMenuOn = false;
107
+ domUtils.removeClass(this._refer, 'on');
108
+ this._init();
109
+ if (this.form) this.form.style.cssText = '';
110
+ this.isOpen = false;
111
+ if (typeof this.closeMethod === 'function') this.closeMethod();
112
+ },
113
+
114
+ getItem(index) {
115
+ return this.items[index];
116
+ },
117
+
118
+ setItem(index) {
119
+ this._selectItem(index);
120
+ },
121
+
122
+ _createFormat(html) {
123
+ this.form.firstElementChild.innerHTML += `<ul class="se-list-basic se-list-checked${this.horizontal ? ' se-list-horizontal' : ''}">${html}</ul>`;
124
+ },
125
+
126
+ _init() {
127
+ this.__removeEvents();
128
+ this.__removeGlobalEvent();
129
+ this.index = -1;
130
+ this.item = null;
131
+ if (this._onItem) {
132
+ domUtils.removeClass(this._onItem, 'se-select-on');
133
+ this._onItem = null;
134
+ }
135
+ },
136
+
137
+ _moveItem(num) {
138
+ num = this.index + num;
139
+ const len = this.menuLen;
140
+ const selectIndex = (this.index = num >= len ? 0 : num < 0 ? len - 1 : num);
141
+
142
+ this._selectItem(selectIndex);
143
+ },
144
+
145
+ _selectItem(selectIndex) {
146
+ domUtils.removeClass(this.form, 'se-select-menu-mouse-move');
147
+
148
+ const len = this.menuLen;
149
+ for (let i = 0; i < len; i++) {
150
+ if (i === selectIndex) {
151
+ domUtils.addClass(this.menus[i], 'active');
152
+ } else {
153
+ domUtils.removeClass(this.menus[i], 'active');
154
+ }
155
+ }
156
+
157
+ this.index = selectIndex;
158
+ this.item = this.items[selectIndex];
159
+ },
160
+
161
+ /**
162
+ * @description Menu open
163
+ * @param {["left"|"right"] | ["top"|"bottom"]} position Menu position
164
+ * @param {["middle"|"top"|"bottom"] | ["center"|"left"|"right"]} subPosition Sub position
165
+ * @private
166
+ */
167
+ _setPosition(position, subPosition, onItemQuerySelector, _re) {
168
+ const originP = position;
169
+ const form = this.form;
170
+ const target = this._refer;
171
+ form.style.visibility = 'hidden';
172
+ form.style.display = 'block';
173
+ domUtils.removeClass(form, 'se-select-menu-scroll');
174
+ domUtils.addClass(target, 'on');
175
+
176
+ const formW = form.offsetWidth;
177
+ const targetW = target.offsetWidth;
178
+ const targetL = target.offsetLeft;
179
+ let side = false;
180
+ let l = 0,
181
+ t = 0;
182
+
183
+ if (position === 'left') {
184
+ l = targetL - formW - 1;
185
+ position = subPosition;
186
+ side = true;
187
+ } else if (position === 'right') {
188
+ l = targetL + targetW + 1;
189
+ position = subPosition;
190
+ side = true;
191
+ }
192
+
193
+ // set top position
194
+ const globalTarget = this.editor.offset.get(target);
195
+ const targetOffsetTop = target.offsetTop;
196
+ const targetGlobalTop = globalTarget.top;
197
+ const targetHeight = target.offsetHeight;
198
+ const wbottom = domUtils.getClientSize().h - (targetGlobalTop - this._w.scrollY + targetHeight);
199
+ const sideAddH = side ? targetHeight : 0;
200
+ let overH = 10000;
201
+ switch (position) {
202
+ case 'middle': {
203
+ let h = form.offsetHeight;
204
+ const th = targetHeight / 2;
205
+ t = targetOffsetTop - h / 2 + th;
206
+ // over top
207
+ if (targetGlobalTop < h / 2) {
208
+ t += h / 2 - targetGlobalTop - th + 4;
209
+ form.style.top = t + 'px';
210
+ }
211
+ // over bottom
212
+ let formT = this.editor.offset.getGlobal(form).top;
213
+ const modH = h - (targetGlobalTop - formT) - wbottom - targetHeight;
214
+ if (modH > 0) {
215
+ t -= modH + 4;
216
+ form.style.top = t + 'px';
217
+ }
218
+ // over height
219
+ formT = this.editor.offset.getGlobal(form).top;
220
+ if (formT < 0) {
221
+ h += formT - 4;
222
+ t -= formT - 4;
223
+ }
224
+ form.style.height = h + 'px';
225
+ break;
226
+ }
227
+ case 'top':
228
+ if (targetGlobalTop < form.offsetHeight - sideAddH) {
229
+ if (!_re) {
230
+ overH = 0;
231
+ break;
232
+ }
233
+ overH = targetGlobalTop - 4 + sideAddH;
234
+ if (overH >= MENU_MIN_HEIGHT) form.style.height = overH + 'px';
235
+ }
236
+ t = targetOffsetTop - form.offsetHeight + sideAddH;
237
+ break;
238
+ case 'bottom':
239
+ if (wbottom < form.offsetHeight + sideAddH) {
240
+ if (!_re) {
241
+ overH = 0;
242
+ break;
243
+ }
244
+ overH = wbottom - 4 + sideAddH;
245
+ if (overH >= MENU_MIN_HEIGHT) form.style.height = overH + 'px';
246
+ }
247
+ t = targetOffsetTop + (side ? 0 : targetHeight);
248
+ break;
249
+ }
250
+
251
+ if (overH < MENU_MIN_HEIGHT && !_re && position !== 'middle') {
252
+ this._setPosition(position === 'top' ? 'bottpm' : 'top', subPosition, onItemQuerySelector, true);
253
+ return;
254
+ }
255
+
256
+ if (!side) {
257
+ switch (subPosition) {
258
+ case 'center':
259
+ l = targetL + targetW / 2 - formW / 2;
260
+ break;
261
+ case 'left':
262
+ l = targetL;
263
+ break;
264
+ case 'right':
265
+ l = targetL - (formW - targetW);
266
+ break;
267
+ }
268
+ }
269
+
270
+ form.style.left = l + 'px';
271
+ const fl = this.editor.offset.getGlobal(form).left;
272
+ let overW = 0;
273
+ switch (side + '-' + (side ? originP : subPosition)) {
274
+ case 'true-left':
275
+ overW = globalTarget.left - this._w.scrollX + fl;
276
+ if (overW < 0) l = l = targetL + targetW + 1;
277
+ break;
278
+ case 'true-right':
279
+ overW = this._w.innerWidth - (fl + formW);
280
+ if (overW < 0) l = targetL - formW - 1;
281
+ break;
282
+ case 'false-center': {
283
+ overW = this._w.innerWidth - (fl + formW);
284
+ if (overW < 0) l += overW - 4;
285
+ form.style.left = l + 'px';
286
+ const centerfl = this.editor.offset.getGlobal(form).left;
287
+ if (centerfl < 0) l -= centerfl - 4;
288
+ break;
289
+ }
290
+ case 'false-left':
291
+ overW = this._w.innerWidth - (globalTarget.left - this._w.scrollX + formW);
292
+ if (overW < 0) l += overW - 4;
293
+ break;
294
+ case 'false-right':
295
+ if (fl < 0) l -= fl - 4;
296
+ break;
297
+ }
298
+
299
+ if (onItemQuerySelector) {
300
+ const item = form.firstElementChild.querySelector(onItemQuerySelector);
301
+ if (item) {
302
+ this._onItem = item;
303
+ domUtils.addClass(item, 'se-select-on');
304
+ }
305
+ }
306
+
307
+ form.style.left = l + 'px';
308
+ form.style.top = t + 'px';
309
+ form.style.visibility = '';
310
+ },
311
+
312
+ _select(index) {
313
+ if (this.checkList) domUtils.toggleClass(this.menus[index], 'se-checked');
314
+ this._selectMethod(this.getItem(index));
315
+ },
316
+
317
+ __addEvents() {
318
+ this.__removeEvents();
319
+ this.__events = this.__eventHandlers;
320
+ this.form.addEventListener('mousedown', this.__events.mousedown);
321
+ this.form.addEventListener('mousemove', this.__events.mousemove);
322
+ this.form.addEventListener('click', this.__events.click);
323
+ this._keydownTarget.addEventListener('keydown', this.__events.keydown);
324
+ },
325
+
326
+ __removeEvents() {
327
+ if (this.__events.length === 0) return;
328
+ this.form.removeEventListener('mousedown', this.__events.mousedown);
329
+ this.form.removeEventListener('mousemove', this.__events.mousemove);
330
+ this.form.removeEventListener('click', this.__events.click);
331
+ this._keydownTarget.removeEventListener('keydown', this.__events.keydown);
332
+ this.__events = [];
333
+ },
334
+
335
+ __addGlobalEvent() {
336
+ this.__removeGlobalEvent();
337
+ this._bindClose_key = this.eventManager.addGlobalEvent('keydown', this.__globalEventHandlers.keydown, true);
338
+ this._bindClose_mousedown = this.eventManager.addGlobalEvent('mousedown', this.__globalEventHandlers.mousedown, true);
339
+ },
340
+
341
+ __removeGlobalEvent() {
342
+ if (this._bindClose_key) this._bindClose_key = this.eventManager.removeGlobalEvent(this._bindClose_key);
343
+ if (this._bindClose_mousedown) this._bindClose_mousedown = this.eventManager.removeGlobalEvent(this._bindClose_mousedown);
344
+ if (this._bindClose_click) this._bindClose_click = this.eventManager.removeGlobalEvent(this._bindClose_click);
345
+ },
346
+
347
+ constructor: SelectMenu
348
+ };
349
+
350
+ function OnKeyDown_refer(e) {
351
+ let moveIndex;
352
+ switch (e.keyCode) {
353
+ case 38: // up
354
+ e.preventDefault();
355
+ e.stopPropagation();
356
+ if (this.horizontal && this.index > -1) {
357
+ const num = this.splitNum;
358
+ moveIndex = this.index - num < 0 ? num : -num;
359
+ } else {
360
+ moveIndex = -1;
361
+ }
362
+ break;
363
+ case 40: // down
364
+ e.preventDefault();
365
+ e.stopPropagation();
366
+ if (this.horizontal && this.index > -1) {
367
+ const num = this.splitNum;
368
+ moveIndex = this.index + num > this.menuLen ? -num : num;
369
+ } else {
370
+ moveIndex = 1;
371
+ }
372
+ break;
373
+ case 37: // left
374
+ e.preventDefault();
375
+ e.stopPropagation();
376
+ moveIndex = -1;
377
+ break;
378
+ case 39: //right
379
+ e.preventDefault();
380
+ e.stopPropagation();
381
+ moveIndex = 1;
382
+ break;
383
+ case 13:
384
+ case 32: // enter, space
385
+ if (this.index > -1) {
386
+ e.preventDefault();
387
+ e.stopPropagation();
388
+ this._select(this.index);
389
+ } else {
390
+ this.close();
391
+ }
392
+ break;
393
+ }
394
+
395
+ if (moveIndex) this._moveItem(moveIndex);
396
+ }
397
+
398
+ function OnMousedown_list(e) {
399
+ if (env.isGecko) {
400
+ const target = domUtils.getParentElement(e.target, '.se-select-item');
401
+ if (target) this._injectActiveEvent(target);
402
+ }
403
+ }
404
+
405
+ function OnMouseMove_list(e) {
406
+ domUtils.addClass(this.form, 'se-select-menu-mouse-move');
407
+ const index = e.target.getAttribute('data-index');
408
+ if (!index) return;
409
+ this.index = index * 1;
410
+ }
411
+
412
+ function OnClick_list(e) {
413
+ let target = e.target;
414
+ let index = null;
415
+
416
+ while (!index && !/UL/i.test(target.tagName) && !domUtils.hasClass(target, 'se-select-menu')) {
417
+ index = target.getAttribute('data-index');
418
+ target = target.parentNode;
419
+ }
420
+
421
+ if (!index) return;
422
+ this._select(index * 1);
423
+ }
424
+
425
+ function CloseListener_key(e) {
426
+ if (!/27/.test(e.keyCode)) return;
427
+ this.close();
428
+ }
429
+
430
+ function CloseListener_mousedown(e) {
431
+ if (this.form.contains(e.target)) return;
432
+ if (e.target !== this._refer) {
433
+ this.close();
434
+ } else if (!domUtils.isInputElement(e.target)) {
435
+ this._bindClose_click = this.eventManager.addGlobalEvent('click', this.__globalEventHandlers.click, true);
436
+ }
437
+ }
438
+
439
+ function CloseListener_click(e) {
440
+ this._bindClose_click = this.eventManager.removeGlobalEvent(this._bindClose_click);
441
+ if (e.target === this._refer) {
442
+ e.stopPropagation();
443
+ this.close();
444
+ }
445
+ }
446
+
447
+ export default SelectMenu;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @module _DragHandle
3
+ * @description A module that handles drag and drop events.
4
+ * this module is initialize in the `classes/component.js`.
5
+ */
6
+ export const _DragHandle = new Map([
7
+ ['__figureInst', null],
8
+ ['__dragInst', null],
9
+ ['__dragHandler', null],
10
+ ['__dragContainer', null],
11
+ ['__dragCover', null],
12
+ ['__dragMove', null],
13
+ ['__overInfo', null]
14
+ ]);
15
+
16
+ export default _DragHandle;
@@ -0,0 +1,14 @@
1
+ import _DragHandle from './_DragHandle';
2
+ import ApiManager from './ApiManager';
3
+ import ColorPicker from './ColorPicker';
4
+ import Controller from './Controller';
5
+ import Figure from './Figure';
6
+ import FileBrowser from './FileBrowser';
7
+ import FileManager from './FileManager';
8
+ import HueSlider from './HueSlider';
9
+ import Modal from './Modal';
10
+ import ModalAnchorEditor from './ModalAnchorEditor';
11
+ import SelectMenu from './SelectMenu';
12
+
13
+ export { _DragHandle, ApiManager, ColorPicker, Controller, FileBrowser, FileManager, HueSlider, Figure, Modal, ModalAnchorEditor, SelectMenu };
14
+ export default { _DragHandle, ApiManager, ColorPicker, Controller, FileBrowser, FileManager, HueSlider, Figure, Modal, ModalAnchorEditor, SelectMenu };
@@ -1,47 +1,47 @@
1
- /*
2
- * wysiwyg web editor
3
- *
4
- * suneditor.js
5
- * Copyright 2017 JiHong Lee.
6
- * MIT license.
7
- */
8
- 'use strict';
9
-
10
- export default {
11
- name: 'blockquote',
12
- display: 'command',
13
- add: function (core, targetElement) {
14
- const context = core.context;
15
- context.blockquote = {
16
- targetButton: targetElement,
17
- tag: core.util.createElement('BLOCKQUOTE')
18
- };
19
- },
20
-
21
- /**
22
- * @Override core
23
- */
24
- active: function (element) {
25
- if (!element) {
26
- this.util.removeClass(this.context.blockquote.targetButton, 'active');
27
- } else if (/blockquote/i.test(element.nodeName)) {
28
- this.util.addClass(this.context.blockquote.targetButton, 'active');
29
- return true;
30
- }
31
-
32
- return false;
33
- },
34
-
35
- /**
36
- * @Override core
37
- */
38
- action: function () {
39
- const currentBlockquote = this.util.getParentElement(this.getSelectionNode(), 'blockquote');
40
-
41
- if (currentBlockquote) {
42
- this.detachRangeFormatElement(currentBlockquote, null, null, false, false);
43
- } else {
44
- this.applyRangeFormatElement(this.context.blockquote.tag.cloneNode(false));
45
- }
46
- }
47
- };
1
+ import EditorInjector from '../../editorInjector';
2
+ import { domUtils } from '../../helper';
3
+
4
+ const Blockquote = function (editor) {
5
+ EditorInjector.call(this, editor);
6
+ // plugin basic properties
7
+ this.title = this.lang.tag_blockquote;
8
+ this.icon = 'blockquote';
9
+
10
+ // members
11
+ this.quoteTag = domUtils.createElement('BLOCKQUOTE');
12
+ };
13
+
14
+ Blockquote.key = 'blockquote';
15
+ Blockquote.type = 'command';
16
+ Blockquote.className = '';
17
+ Blockquote.prototype = {
18
+ /**
19
+ * @override core
20
+ */
21
+ active(element, target) {
22
+ if (/blockquote/i.test(element?.nodeName)) {
23
+ domUtils.addClass(target, 'active');
24
+ return true;
25
+ }
26
+
27
+ domUtils.removeClass(target, 'active');
28
+ return false;
29
+ },
30
+
31
+ /**
32
+ * @override core
33
+ */
34
+ action() {
35
+ const currentBlockquote = domUtils.getParentElement(this.selection.getNode(), 'blockquote');
36
+
37
+ if (currentBlockquote) {
38
+ this.format.removeBlock(currentBlockquote, null, null, false, false);
39
+ } else {
40
+ this.format.applyBlock(this.quoteTag.cloneNode(false));
41
+ }
42
+ },
43
+
44
+ constructor: Blockquote
45
+ };
46
+
47
+ export default Blockquote;