suneditor 3.0.0-beta.2 → 3.0.0-beta.20

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 (177) hide show
  1. package/CONTRIBUTING.md +186 -184
  2. package/LICENSE +21 -21
  3. package/README.md +157 -180
  4. package/dist/suneditor.min.css +1 -1
  5. package/dist/suneditor.min.js +1 -1
  6. package/package.json +126 -123
  7. package/src/assets/design/color.css +131 -121
  8. package/src/assets/design/index.css +3 -3
  9. package/src/assets/design/size.css +37 -35
  10. package/src/assets/design/typography.css +37 -37
  11. package/src/assets/icons/defaultIcons.js +247 -232
  12. package/src/assets/suneditor-contents.css +779 -778
  13. package/src/assets/suneditor.css +43 -35
  14. package/src/core/base/eventHandlers/handler_toolbar.js +135 -135
  15. package/src/core/base/eventHandlers/handler_ww_clipboard.js +56 -56
  16. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +115 -113
  17. package/src/core/base/eventHandlers/handler_ww_key_input.js +1200 -1200
  18. package/src/core/base/eventHandlers/handler_ww_mouse.js +194 -194
  19. package/src/core/base/eventManager.js +1550 -1484
  20. package/src/core/base/history.js +355 -355
  21. package/src/core/class/char.js +163 -162
  22. package/src/core/class/component.js +856 -842
  23. package/src/core/class/format.js +3433 -3422
  24. package/src/core/class/html.js +1927 -1890
  25. package/src/core/class/menu.js +357 -346
  26. package/src/core/class/nodeTransform.js +424 -424
  27. package/src/core/class/offset.js +858 -891
  28. package/src/core/class/selection.js +710 -620
  29. package/src/core/class/shortcuts.js +98 -98
  30. package/src/core/class/toolbar.js +438 -430
  31. package/src/core/class/ui.js +424 -422
  32. package/src/core/class/viewer.js +750 -750
  33. package/src/core/editor.js +1810 -1708
  34. package/src/core/section/actives.js +268 -241
  35. package/src/core/section/constructor.js +1348 -1661
  36. package/src/core/section/context.js +102 -102
  37. package/src/core/section/documentType.js +582 -561
  38. package/src/core/section/options.js +367 -0
  39. package/src/core/util/instanceCheck.js +59 -0
  40. package/src/editorInjector/_classes.js +36 -36
  41. package/src/editorInjector/_core.js +92 -92
  42. package/src/editorInjector/index.js +75 -75
  43. package/src/events.js +634 -622
  44. package/src/helper/clipboard.js +59 -59
  45. package/src/helper/converter.js +586 -564
  46. package/src/helper/dom/domCheck.js +304 -304
  47. package/src/helper/dom/domQuery.js +677 -669
  48. package/src/helper/dom/domUtils.js +618 -557
  49. package/src/helper/dom/index.js +12 -12
  50. package/src/helper/env.js +249 -240
  51. package/src/helper/index.js +25 -25
  52. package/src/helper/keyCodeMap.js +183 -183
  53. package/src/helper/numbers.js +72 -72
  54. package/src/helper/unicode.js +47 -47
  55. package/src/langs/ckb.js +231 -231
  56. package/src/langs/cs.js +231 -231
  57. package/src/langs/da.js +231 -231
  58. package/src/langs/de.js +231 -231
  59. package/src/langs/en.js +230 -230
  60. package/src/langs/es.js +231 -231
  61. package/src/langs/fa.js +231 -231
  62. package/src/langs/fr.js +231 -231
  63. package/src/langs/he.js +231 -231
  64. package/src/langs/hu.js +230 -230
  65. package/src/langs/index.js +28 -28
  66. package/src/langs/it.js +231 -231
  67. package/src/langs/ja.js +230 -230
  68. package/src/langs/km.js +230 -230
  69. package/src/langs/ko.js +230 -230
  70. package/src/langs/lv.js +231 -231
  71. package/src/langs/nl.js +231 -231
  72. package/src/langs/pl.js +231 -231
  73. package/src/langs/pt_br.js +231 -231
  74. package/src/langs/ro.js +231 -231
  75. package/src/langs/ru.js +231 -231
  76. package/src/langs/se.js +231 -231
  77. package/src/langs/tr.js +231 -231
  78. package/src/langs/uk.js +231 -231
  79. package/src/langs/ur.js +231 -231
  80. package/src/langs/zh_cn.js +231 -231
  81. package/src/modules/ApiManager.js +191 -191
  82. package/src/modules/Browser.js +669 -667
  83. package/src/modules/ColorPicker.js +364 -362
  84. package/src/modules/Controller.js +474 -454
  85. package/src/modules/Figure.js +1620 -1617
  86. package/src/modules/FileManager.js +359 -359
  87. package/src/modules/HueSlider.js +577 -565
  88. package/src/modules/Modal.js +346 -346
  89. package/src/modules/ModalAnchorEditor.js +643 -643
  90. package/src/modules/SelectMenu.js +549 -549
  91. package/src/modules/_DragHandle.js +17 -17
  92. package/src/modules/index.js +14 -14
  93. package/src/plugins/browser/audioGallery.js +83 -83
  94. package/src/plugins/browser/fileBrowser.js +103 -103
  95. package/src/plugins/browser/fileGallery.js +83 -83
  96. package/src/plugins/browser/imageGallery.js +81 -81
  97. package/src/plugins/browser/videoGallery.js +103 -103
  98. package/src/plugins/command/blockquote.js +61 -60
  99. package/src/plugins/command/exportPDF.js +134 -134
  100. package/src/plugins/command/fileUpload.js +456 -456
  101. package/src/plugins/command/list_bulleted.js +149 -148
  102. package/src/plugins/command/list_numbered.js +152 -151
  103. package/src/plugins/dropdown/align.js +157 -155
  104. package/src/plugins/dropdown/backgroundColor.js +108 -104
  105. package/src/plugins/dropdown/font.js +141 -137
  106. package/src/plugins/dropdown/fontColor.js +109 -105
  107. package/src/plugins/dropdown/formatBlock.js +170 -178
  108. package/src/plugins/dropdown/hr.js +152 -152
  109. package/src/plugins/dropdown/layout.js +83 -83
  110. package/src/plugins/dropdown/lineHeight.js +131 -130
  111. package/src/plugins/dropdown/list.js +123 -122
  112. package/src/plugins/dropdown/paragraphStyle.js +138 -138
  113. package/src/plugins/dropdown/table.js +4110 -4000
  114. package/src/plugins/dropdown/template.js +83 -83
  115. package/src/plugins/dropdown/textStyle.js +149 -149
  116. package/src/plugins/field/mention.js +242 -242
  117. package/src/plugins/index.js +120 -120
  118. package/src/plugins/input/fontSize.js +414 -410
  119. package/src/plugins/input/pageNavigator.js +71 -70
  120. package/src/plugins/modal/audio.js +677 -677
  121. package/src/plugins/modal/drawing.js +537 -531
  122. package/src/plugins/modal/embed.js +886 -886
  123. package/src/plugins/modal/image.js +1377 -1376
  124. package/src/plugins/modal/link.js +248 -240
  125. package/src/plugins/modal/math.js +563 -563
  126. package/src/plugins/modal/video.js +1226 -1226
  127. package/src/plugins/popup/anchor.js +224 -222
  128. package/src/suneditor.js +114 -107
  129. package/src/themes/dark.css +132 -122
  130. package/src/typedef.js +132 -130
  131. package/types/assets/icons/defaultIcons.d.ts +8 -0
  132. package/types/core/base/eventManager.d.ts +29 -4
  133. package/types/core/class/char.d.ts +2 -1
  134. package/types/core/class/component.d.ts +1 -2
  135. package/types/core/class/format.d.ts +8 -1
  136. package/types/core/class/html.d.ts +8 -0
  137. package/types/core/class/menu.d.ts +8 -0
  138. package/types/core/class/offset.d.ts +24 -26
  139. package/types/core/class/selection.d.ts +2 -0
  140. package/types/core/class/toolbar.d.ts +6 -0
  141. package/types/core/class/ui.d.ts +1 -1
  142. package/types/core/editor.d.ts +34 -12
  143. package/types/core/section/constructor.d.ts +5 -638
  144. package/types/core/section/documentType.d.ts +12 -2
  145. package/types/core/section/options.d.ts +740 -0
  146. package/types/core/util/instanceCheck.d.ts +50 -0
  147. package/types/editorInjector/_core.d.ts +5 -5
  148. package/types/editorInjector/index.d.ts +2 -2
  149. package/types/events.d.ts +2 -0
  150. package/types/helper/converter.d.ts +9 -0
  151. package/types/helper/dom/domQuery.d.ts +5 -5
  152. package/types/helper/dom/domUtils.d.ts +8 -0
  153. package/types/helper/env.d.ts +6 -1
  154. package/types/helper/index.d.ts +4 -1
  155. package/types/index.d.ts +122 -120
  156. package/types/langs/_Lang.d.ts +194 -194
  157. package/types/modules/ColorPicker.d.ts +5 -1
  158. package/types/modules/Controller.d.ts +8 -4
  159. package/types/modules/Figure.d.ts +2 -1
  160. package/types/modules/HueSlider.d.ts +4 -1
  161. package/types/modules/SelectMenu.d.ts +1 -1
  162. package/types/plugins/command/blockquote.d.ts +1 -0
  163. package/types/plugins/command/list_bulleted.d.ts +1 -0
  164. package/types/plugins/command/list_numbered.d.ts +1 -0
  165. package/types/plugins/dropdown/align.d.ts +1 -0
  166. package/types/plugins/dropdown/backgroundColor.d.ts +1 -0
  167. package/types/plugins/dropdown/font.d.ts +1 -0
  168. package/types/plugins/dropdown/fontColor.d.ts +1 -0
  169. package/types/plugins/dropdown/formatBlock.d.ts +3 -2
  170. package/types/plugins/dropdown/lineHeight.d.ts +1 -0
  171. package/types/plugins/dropdown/list.d.ts +1 -0
  172. package/types/plugins/dropdown/table.d.ts +6 -0
  173. package/types/plugins/input/fontSize.d.ts +1 -0
  174. package/types/plugins/modal/drawing.d.ts +4 -0
  175. package/types/plugins/modal/link.d.ts +32 -15
  176. package/types/suneditor.d.ts +13 -9
  177. package/types/typedef.d.ts +8 -0
@@ -1,240 +1,248 @@
1
- import EditorInjector from '../../editorInjector';
2
- import { Modal, Controller, ModalAnchorEditor } from '../../modules';
3
- import { dom, numbers } from '../../helper';
4
-
5
- /**
6
- * @typedef {Object} LinkPluginOptions
7
- * @property {boolean} [textToDisplay=true] - Whether to display the link text.
8
- * @property {boolean} [title=true] - Whether to display the link title.
9
- * @property {string} [uploadUrl] - The URL endpoint for file uploads.
10
- * @property {Object<string, string>} [uploadHeaders] - Additional headers for file upload requests.
11
- * @property {number} [uploadSizeLimit] - The total file upload size limit in bytes.
12
- * @property {number} [uploadSingleSizeLimit] - The single file upload size limit in bytes.
13
- * @property {string} [acceptedFormats] - Accepted file formats for link uploads.
14
- */
15
-
16
- /**
17
- * @class
18
- * @description Link plugin.
19
- * - This plugin provides link insertion and editing functionality within the editor.
20
- * - It also supports file uploads if an upload URL is provided.
21
- */
22
- class Link extends EditorInjector {
23
- static key = 'link';
24
- static type = 'modal';
25
- static className = 'se-icon-flip-rtl';
26
-
27
- /**
28
- * @constructor
29
- * @param {__se__EditorCore} editor - The root editor instance
30
- * @param {LinkPluginOptions} pluginOptions
31
- */
32
- constructor(editor, pluginOptions) {
33
- // plugin bisic properties
34
- super(editor);
35
- this.title = this.lang.link;
36
- this.icon = 'link';
37
-
38
- // define plugin options
39
- pluginOptions.textToDisplay = true;
40
- pluginOptions.title = true;
41
-
42
- // create HTML
43
- const modalEl = CreateHTML_modal(editor);
44
- const controllerEl = CreateHTML_controller(editor);
45
-
46
- // members
47
- const uploadUrl = typeof pluginOptions.uploadUrl === 'string' ? pluginOptions.uploadUrl : null;
48
- this.isUpdateState = false;
49
- this.pluginOptions = {
50
- ...pluginOptions,
51
- uploadUrl,
52
- uploadHeaders: pluginOptions.uploadHeaders || null,
53
- uploadSizeLimit: numbers.get(pluginOptions.uploadSizeLimit, 0),
54
- uploadSingleSizeLimit: numbers.get(pluginOptions.uploadSingleSizeLimit, 0),
55
- acceptedFormats: typeof pluginOptions.acceptedFormats === 'string' ? pluginOptions.acceptedFormats.trim() : null,
56
- enableFileUpload: !!uploadUrl
57
- };
58
-
59
- // modules
60
- this.anchor = new ModalAnchorEditor(this, modalEl, this.pluginOptions);
61
- this.modal = new Modal(this, modalEl);
62
- this.controller = new Controller(this, controllerEl, { position: 'bottom', disabled: false });
63
- }
64
-
65
- /**
66
- * @editorMethod Editor.EventManager
67
- * @description Executes the method that is called whenever the cursor position changes.
68
- * @param {?HTMLElement=} element - Node element where the cursor is currently located
69
- * @returns {boolean} - Whether the plugin is active
70
- */
71
- active(element) {
72
- if (dom.check.isAnchor(element) && !element.hasAttribute('data-se-non-link')) {
73
- const tempLink = this.controller.form.querySelector('a');
74
- tempLink.href = element.href;
75
- tempLink.title = element.textContent;
76
- tempLink.textContent = element.textContent;
77
-
78
- dom.utils.addClass(element, 'on');
79
-
80
- this.anchor.set(element);
81
- this.controller.open(element, null, { isWWTarget: false, initMethod: null, addOffset: null });
82
-
83
- return true;
84
- }
85
-
86
- this.controller.close();
87
-
88
- return false;
89
- }
90
-
91
- /**
92
- * @editorMethod Modules.Modal
93
- * @description Executes the method that is called when a "Modal" module's is opened.
94
- */
95
- open() {
96
- this.modal.open();
97
- }
98
-
99
- /**
100
- * @editorMethod Modules.Modal
101
- * @description Executes the method that is called when a plugin's modal is opened.
102
- * @param {boolean} isUpdate "Indicates whether the modal is for editing an existing component (true) or registering a new one (false)."
103
- */
104
- on(isUpdate) {
105
- this.isUpdateState = isUpdate;
106
- this.anchor.on(isUpdate);
107
- }
108
-
109
- /**
110
- * @editorMethod Modules.Modal
111
- * @description This function is called when a form within a modal window is "submit".
112
- * @returns {boolean} Success or failure
113
- */
114
- modalAction() {
115
- const oA = this.anchor.create(false);
116
- if (oA === null) return false;
117
-
118
- if (!this.isUpdateState) {
119
- const selectedFormats = this.format.getLines();
120
- if (selectedFormats.length > 1) {
121
- if (!this.html.insertNode(dom.utils.createElement(selectedFormats[0].nodeName, null, oA), { afterNode: null, skipCharCount: false })) return true;
122
- } else {
123
- if (!this.html.insertNode(oA, { afterNode: null, skipCharCount: false })) return true;
124
- }
125
-
126
- this.selection.setRange(oA.childNodes[0], 0, oA.childNodes[0], oA.textContent.length);
127
- } else {
128
- // set range
129
- const textNode = this.controller.currentTarget.childNodes[0];
130
- this.selection.setRange(textNode, 0, textNode, textNode.textContent.length);
131
- }
132
-
133
- return true;
134
- }
135
-
136
- /**
137
- * @editorMethod Modules.Modal
138
- * @description This function is called before the modal window is opened, but before it is closed.
139
- */
140
- init() {
141
- this.controller.close();
142
- this.anchor.init();
143
- }
144
-
145
- /**
146
- * @editorMethod Modules.Controller
147
- * @description Executes the method that is called when a button is clicked in the "controller".
148
- * @param {HTMLButtonElement} target Target button element
149
- */
150
- controllerAction(target) {
151
- const command = target.getAttribute('data-command');
152
-
153
- if (/update/.test(command)) {
154
- this.modal.open();
155
- } else if (/unlink/.test(command)) {
156
- const sc = dom.query.getEdgeChild(
157
- this.controller.currentTarget,
158
- function (current) {
159
- return current.childNodes.length === 0 || current.nodeType === 3;
160
- },
161
- false
162
- );
163
- const ec = dom.query.getEdgeChild(
164
- this.controller.currentTarget,
165
- function (current) {
166
- return current.childNodes.length === 0 || current.nodeType === 3;
167
- },
168
- true
169
- );
170
- this.selection.setRange(sc, 0, ec, ec.textContent.length);
171
- this.format.applyInlineElement(null, { stylesToModify: null, nodesToRemove: ['A'], strictRemove: false });
172
- } else {
173
- /** delete */
174
- dom.utils.removeItem(this.controller.currentTarget);
175
- this.controller.currentTarget = null;
176
- this.editor.focus();
177
- this.history.push(false);
178
- }
179
- }
180
-
181
- /**
182
- * @editorMethod Modules.Controller
183
- * @description This function is called before the "controller" before it is closed.
184
- */
185
- close() {
186
- dom.utils.removeClass(this.controller.currentTarget, 'on');
187
- }
188
- }
189
-
190
- function CreateHTML_modal({ lang, icons }) {
191
- const html = /*html*/ `
192
- <form>
193
- <div class="se-modal-header">
194
- <button type="button" data-command="close" class="se-btn se-close-btn" title="${lang.close}" aria-label="${lang.close}">
195
- ${icons.cancel}
196
- </button>
197
- <span class="se-modal-title">${lang.link_modal_title}</span>
198
- </div>
199
- <div class="se-anchor-editor"></div>
200
- <div class="se-modal-footer">
201
- <button type="submit" class="se-btn-primary" title="${lang.submitButton}" aria-label="${lang.submitButton}">
202
- <span>${lang.submitButton}</span>
203
- </button>
204
- </div>
205
- </form>`;
206
-
207
- return dom.utils.createElement('DIV', { class: 'se-modal-content' }, html);
208
- }
209
-
210
- function CreateHTML_controller({ lang, icons }) {
211
- const html = /*html*/ `
212
- <div class="se-arrow se-arrow-up"></div>
213
- <div class="link-content">
214
- <span><a target="_blank" href=""></a>&nbsp;</span>
215
- <div class="se-btn-group">
216
- <button type="button" data-command="update" tabindex="-1" class="se-btn se-tooltip">
217
- ${icons.edit}
218
- <span class="se-tooltip-inner">
219
- <span class="se-tooltip-text">${lang.edit}</span>
220
- </span>
221
- </button>
222
- <button type="button" data-command="unlink" tabindex="-1" class="se-btn se-tooltip se-icon-flip-rtl">
223
- ${icons.unlink}
224
- <span class="se-tooltip-inner">
225
- <span class="se-tooltip-text">${lang.unlink}</span>
226
- </span>
227
- </button>
228
- <button type="button" data-command="delete" tabindex="-1" class="se-btn se-tooltip">
229
- ${icons.delete}
230
- <span class="se-tooltip-inner">
231
- <span class="se-tooltip-text">${lang.remove}</span>
232
- </span>
233
- </button>
234
- </div>
235
- </div>`;
236
-
237
- return dom.utils.createElement('DIV', { class: 'se-controller se-controller-link' }, html);
238
- }
239
-
240
- export default Link;
1
+ import EditorInjector from '../../editorInjector';
2
+ import { Modal, Controller, ModalAnchorEditor } from '../../modules';
3
+ import { dom, numbers } from '../../helper';
4
+
5
+ /**
6
+ * @typedef {import('../../modules/ModalAnchorEditor').ModalAnchorEditorParams} ModalAnchorEditorParams
7
+ */
8
+
9
+ /**
10
+ * @typedef {Object} LinkOptions
11
+ * @property {string} [uploadUrl] - The URL endpoint for file uploads.
12
+ * @property {Object<string, string>} [uploadHeaders] - Additional headers for file upload requests.
13
+ * @property {number} [uploadSizeLimit] - The total file upload size limit in bytes.
14
+ * @property {number} [uploadSingleSizeLimit] - The single file upload size limit in bytes.
15
+ * @property {string} [acceptedFormats] - Accepted file formats for link uploads.
16
+ */
17
+
18
+ /**
19
+ * @typedef {Omit<LinkOptions & ModalAnchorEditorParams, ''>} LinkPluginOptions
20
+ */
21
+
22
+ /**
23
+ * @class
24
+ * @description Link plugin.
25
+ * - This plugin provides link insertion and editing functionality within the editor.
26
+ * - It also supports file uploads if an upload URL is provided.
27
+ */
28
+ class Link extends EditorInjector {
29
+ static key = 'link';
30
+ static type = 'modal';
31
+ static className = 'se-icon-flip-rtl';
32
+
33
+ /**
34
+ * @constructor
35
+ * @param {__se__EditorCore} editor - The root editor instance
36
+ * @param {LinkPluginOptions} pluginOptions
37
+ */
38
+ constructor(editor, pluginOptions) {
39
+ // plugin bisic properties
40
+ super(editor);
41
+ this.title = this.lang.link;
42
+ this.icon = 'link';
43
+
44
+ // define plugin options
45
+ pluginOptions.textToDisplay = true;
46
+ pluginOptions.title = true;
47
+
48
+ // create HTML
49
+ const modalEl = CreateHTML_modal(editor);
50
+ const controllerEl = CreateHTML_controller(editor);
51
+
52
+ // members
53
+ const uploadUrl = typeof pluginOptions.uploadUrl === 'string' ? pluginOptions.uploadUrl : null;
54
+ this.isUpdateState = false;
55
+ this.pluginOptions = {
56
+ ...pluginOptions,
57
+ uploadUrl,
58
+ uploadHeaders: pluginOptions.uploadHeaders || null,
59
+ uploadSizeLimit: numbers.get(pluginOptions.uploadSizeLimit, 0),
60
+ uploadSingleSizeLimit: numbers.get(pluginOptions.uploadSingleSizeLimit, 0),
61
+ acceptedFormats: typeof pluginOptions.acceptedFormats === 'string' ? pluginOptions.acceptedFormats.trim() : null,
62
+ enableFileUpload: !!uploadUrl
63
+ };
64
+
65
+ // modules
66
+ this.anchor = new ModalAnchorEditor(this, modalEl, this.pluginOptions);
67
+ this.modal = new Modal(this, modalEl);
68
+ this.controller = new Controller(this, controllerEl, { position: 'bottom', disabled: false });
69
+ }
70
+
71
+ /**
72
+ * @editorMethod Editor.EventManager
73
+ * @description Executes the method that is called whenever the cursor position changes.
74
+ * @param {?HTMLElement=} element - Node element where the cursor is currently located
75
+ * @returns {boolean} - Whether the plugin is active
76
+ * - If it returns "undefined", it will no longer be called in this scope.
77
+ */
78
+ active(element) {
79
+ if (dom.check.isAnchor(element) && !element.hasAttribute('data-se-non-link')) {
80
+ const tempLink = this.controller.form.querySelector('a');
81
+ tempLink.href = element.href;
82
+ tempLink.title = element.textContent;
83
+ tempLink.textContent = element.textContent;
84
+
85
+ dom.utils.addClass(element, 'on');
86
+
87
+ this.anchor.set(element);
88
+ this.controller.open(element, null, { isWWTarget: false, initMethod: null, addOffset: null });
89
+
90
+ return true;
91
+ }
92
+
93
+ this.controller.close();
94
+
95
+ return false;
96
+ }
97
+
98
+ /**
99
+ * @editorMethod Modules.Modal
100
+ * @description Executes the method that is called when a "Modal" module's is opened.
101
+ */
102
+ open() {
103
+ this.modal.open();
104
+ }
105
+
106
+ /**
107
+ * @editorMethod Modules.Modal
108
+ * @description Executes the method that is called when a plugin's modal is opened.
109
+ * @param {boolean} isUpdate "Indicates whether the modal is for editing an existing component (true) or registering a new one (false)."
110
+ */
111
+ on(isUpdate) {
112
+ this.isUpdateState = isUpdate;
113
+ this.anchor.on(isUpdate);
114
+ }
115
+
116
+ /**
117
+ * @editorMethod Modules.Modal
118
+ * @description This function is called when a form within a modal window is "submit".
119
+ * @returns {boolean} Success or failure
120
+ */
121
+ modalAction() {
122
+ const oA = this.anchor.create(false);
123
+ if (oA === null) return false;
124
+
125
+ if (!this.isUpdateState) {
126
+ const selectedFormats = this.format.getLines();
127
+ if (selectedFormats.length > 1) {
128
+ if (!this.html.insertNode(dom.utils.createElement(selectedFormats[0].nodeName, null, oA), { afterNode: null, skipCharCount: false })) return true;
129
+ } else {
130
+ if (!this.html.insertNode(oA, { afterNode: null, skipCharCount: false })) return true;
131
+ }
132
+
133
+ this.selection.setRange(oA.childNodes[0], 0, oA.childNodes[0], oA.textContent.length);
134
+ } else {
135
+ // set range
136
+ const textNode = this.controller.currentTarget.childNodes[0];
137
+ this.selection.setRange(textNode, 0, textNode, textNode.textContent.length);
138
+ }
139
+
140
+ this.history.push(false);
141
+ return true;
142
+ }
143
+
144
+ /**
145
+ * @editorMethod Modules.Modal
146
+ * @description This function is called before the modal window is opened, but before it is closed.
147
+ */
148
+ init() {
149
+ this.controller.close();
150
+ this.anchor.init();
151
+ }
152
+
153
+ /**
154
+ * @editorMethod Modules.Controller
155
+ * @description Executes the method that is called when a button is clicked in the "controller".
156
+ * @param {HTMLButtonElement} target Target button element
157
+ */
158
+ controllerAction(target) {
159
+ const command = target.getAttribute('data-command');
160
+
161
+ if (/update/.test(command)) {
162
+ this.modal.open();
163
+ } else if (/unlink/.test(command)) {
164
+ const sc = dom.query.getEdgeChild(
165
+ this.controller.currentTarget,
166
+ function (current) {
167
+ return current.childNodes.length === 0 || current.nodeType === 3;
168
+ },
169
+ false
170
+ );
171
+ const ec = dom.query.getEdgeChild(
172
+ this.controller.currentTarget,
173
+ function (current) {
174
+ return current.childNodes.length === 0 || current.nodeType === 3;
175
+ },
176
+ true
177
+ );
178
+ this.selection.setRange(sc, 0, ec, ec.textContent.length);
179
+ this.format.applyInlineElement(null, { stylesToModify: null, nodesToRemove: ['A'], strictRemove: false });
180
+ } else {
181
+ /** delete */
182
+ dom.utils.removeItem(this.controller.currentTarget);
183
+ this.controller.currentTarget = null;
184
+ this.editor.focus();
185
+ this.history.push(false);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * @editorMethod Modules.Controller
191
+ * @description This function is called before the "controller" before it is closed.
192
+ */
193
+ close() {
194
+ dom.utils.removeClass(this.controller.currentTarget, 'on');
195
+ }
196
+ }
197
+
198
+ function CreateHTML_modal({ lang, icons }) {
199
+ const html = /*html*/ `
200
+ <form>
201
+ <div class="se-modal-header">
202
+ <button type="button" data-command="close" class="se-btn se-close-btn" title="${lang.close}" aria-label="${lang.close}">
203
+ ${icons.cancel}
204
+ </button>
205
+ <span class="se-modal-title">${lang.link_modal_title}</span>
206
+ </div>
207
+ <div class="se-anchor-editor"></div>
208
+ <div class="se-modal-footer">
209
+ <button type="submit" class="se-btn-primary" title="${lang.submitButton}" aria-label="${lang.submitButton}">
210
+ <span>${lang.submitButton}</span>
211
+ </button>
212
+ </div>
213
+ </form>`;
214
+
215
+ return dom.utils.createElement('DIV', { class: 'se-modal-content' }, html);
216
+ }
217
+
218
+ function CreateHTML_controller({ lang, icons }) {
219
+ const html = /*html*/ `
220
+ <div class="se-arrow se-arrow-up"></div>
221
+ <div class="link-content">
222
+ <span><a target="_blank" href=""></a>&nbsp;</span>
223
+ <div class="se-btn-group">
224
+ <button type="button" data-command="update" tabindex="-1" class="se-btn se-tooltip">
225
+ ${icons.edit}
226
+ <span class="se-tooltip-inner">
227
+ <span class="se-tooltip-text">${lang.edit}</span>
228
+ </span>
229
+ </button>
230
+ <button type="button" data-command="unlink" tabindex="-1" class="se-btn se-tooltip se-icon-flip-rtl">
231
+ ${icons.unlink}
232
+ <span class="se-tooltip-inner">
233
+ <span class="se-tooltip-text">${lang.unlink}</span>
234
+ </span>
235
+ </button>
236
+ <button type="button" data-command="delete" tabindex="-1" class="se-btn se-tooltip">
237
+ ${icons.delete}
238
+ <span class="se-tooltip-inner">
239
+ <span class="se-tooltip-text">${lang.remove}</span>
240
+ </span>
241
+ </button>
242
+ </div>
243
+ </div>`;
244
+
245
+ return dom.utils.createElement('DIV', { class: 'se-controller se-controller-link' }, html);
246
+ }
247
+
248
+ export default Link;