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.
- package/CONTRIBUTING.md +186 -184
- package/LICENSE +21 -21
- package/README.md +157 -180
- package/dist/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +1 -1
- package/package.json +126 -123
- package/src/assets/design/color.css +131 -121
- package/src/assets/design/index.css +3 -3
- package/src/assets/design/size.css +37 -35
- package/src/assets/design/typography.css +37 -37
- package/src/assets/icons/defaultIcons.js +247 -232
- package/src/assets/suneditor-contents.css +779 -778
- package/src/assets/suneditor.css +43 -35
- package/src/core/base/eventHandlers/handler_toolbar.js +135 -135
- package/src/core/base/eventHandlers/handler_ww_clipboard.js +56 -56
- package/src/core/base/eventHandlers/handler_ww_dragDrop.js +115 -113
- package/src/core/base/eventHandlers/handler_ww_key_input.js +1200 -1200
- package/src/core/base/eventHandlers/handler_ww_mouse.js +194 -194
- package/src/core/base/eventManager.js +1550 -1484
- package/src/core/base/history.js +355 -355
- package/src/core/class/char.js +163 -162
- package/src/core/class/component.js +856 -842
- package/src/core/class/format.js +3433 -3422
- package/src/core/class/html.js +1927 -1890
- package/src/core/class/menu.js +357 -346
- package/src/core/class/nodeTransform.js +424 -424
- package/src/core/class/offset.js +858 -891
- package/src/core/class/selection.js +710 -620
- package/src/core/class/shortcuts.js +98 -98
- package/src/core/class/toolbar.js +438 -430
- package/src/core/class/ui.js +424 -422
- package/src/core/class/viewer.js +750 -750
- package/src/core/editor.js +1810 -1708
- package/src/core/section/actives.js +268 -241
- package/src/core/section/constructor.js +1348 -1661
- package/src/core/section/context.js +102 -102
- package/src/core/section/documentType.js +582 -561
- package/src/core/section/options.js +367 -0
- package/src/core/util/instanceCheck.js +59 -0
- package/src/editorInjector/_classes.js +36 -36
- package/src/editorInjector/_core.js +92 -92
- package/src/editorInjector/index.js +75 -75
- package/src/events.js +634 -622
- package/src/helper/clipboard.js +59 -59
- package/src/helper/converter.js +586 -564
- package/src/helper/dom/domCheck.js +304 -304
- package/src/helper/dom/domQuery.js +677 -669
- package/src/helper/dom/domUtils.js +618 -557
- package/src/helper/dom/index.js +12 -12
- package/src/helper/env.js +249 -240
- package/src/helper/index.js +25 -25
- package/src/helper/keyCodeMap.js +183 -183
- package/src/helper/numbers.js +72 -72
- package/src/helper/unicode.js +47 -47
- package/src/langs/ckb.js +231 -231
- package/src/langs/cs.js +231 -231
- package/src/langs/da.js +231 -231
- package/src/langs/de.js +231 -231
- package/src/langs/en.js +230 -230
- package/src/langs/es.js +231 -231
- package/src/langs/fa.js +231 -231
- package/src/langs/fr.js +231 -231
- package/src/langs/he.js +231 -231
- package/src/langs/hu.js +230 -230
- package/src/langs/index.js +28 -28
- package/src/langs/it.js +231 -231
- package/src/langs/ja.js +230 -230
- package/src/langs/km.js +230 -230
- package/src/langs/ko.js +230 -230
- package/src/langs/lv.js +231 -231
- package/src/langs/nl.js +231 -231
- package/src/langs/pl.js +231 -231
- package/src/langs/pt_br.js +231 -231
- package/src/langs/ro.js +231 -231
- package/src/langs/ru.js +231 -231
- package/src/langs/se.js +231 -231
- package/src/langs/tr.js +231 -231
- package/src/langs/uk.js +231 -231
- package/src/langs/ur.js +231 -231
- package/src/langs/zh_cn.js +231 -231
- package/src/modules/ApiManager.js +191 -191
- package/src/modules/Browser.js +669 -667
- package/src/modules/ColorPicker.js +364 -362
- package/src/modules/Controller.js +474 -454
- package/src/modules/Figure.js +1620 -1617
- package/src/modules/FileManager.js +359 -359
- package/src/modules/HueSlider.js +577 -565
- package/src/modules/Modal.js +346 -346
- package/src/modules/ModalAnchorEditor.js +643 -643
- package/src/modules/SelectMenu.js +549 -549
- package/src/modules/_DragHandle.js +17 -17
- package/src/modules/index.js +14 -14
- package/src/plugins/browser/audioGallery.js +83 -83
- package/src/plugins/browser/fileBrowser.js +103 -103
- package/src/plugins/browser/fileGallery.js +83 -83
- package/src/plugins/browser/imageGallery.js +81 -81
- package/src/plugins/browser/videoGallery.js +103 -103
- package/src/plugins/command/blockquote.js +61 -60
- package/src/plugins/command/exportPDF.js +134 -134
- package/src/plugins/command/fileUpload.js +456 -456
- package/src/plugins/command/list_bulleted.js +149 -148
- package/src/plugins/command/list_numbered.js +152 -151
- package/src/plugins/dropdown/align.js +157 -155
- package/src/plugins/dropdown/backgroundColor.js +108 -104
- package/src/plugins/dropdown/font.js +141 -137
- package/src/plugins/dropdown/fontColor.js +109 -105
- package/src/plugins/dropdown/formatBlock.js +170 -178
- package/src/plugins/dropdown/hr.js +152 -152
- package/src/plugins/dropdown/layout.js +83 -83
- package/src/plugins/dropdown/lineHeight.js +131 -130
- package/src/plugins/dropdown/list.js +123 -122
- package/src/plugins/dropdown/paragraphStyle.js +138 -138
- package/src/plugins/dropdown/table.js +4110 -4000
- package/src/plugins/dropdown/template.js +83 -83
- package/src/plugins/dropdown/textStyle.js +149 -149
- package/src/plugins/field/mention.js +242 -242
- package/src/plugins/index.js +120 -120
- package/src/plugins/input/fontSize.js +414 -410
- package/src/plugins/input/pageNavigator.js +71 -70
- package/src/plugins/modal/audio.js +677 -677
- package/src/plugins/modal/drawing.js +537 -531
- package/src/plugins/modal/embed.js +886 -886
- package/src/plugins/modal/image.js +1377 -1376
- package/src/plugins/modal/link.js +248 -240
- package/src/plugins/modal/math.js +563 -563
- package/src/plugins/modal/video.js +1226 -1226
- package/src/plugins/popup/anchor.js +224 -222
- package/src/suneditor.js +114 -107
- package/src/themes/dark.css +132 -122
- package/src/typedef.js +132 -130
- package/types/assets/icons/defaultIcons.d.ts +8 -0
- package/types/core/base/eventManager.d.ts +29 -4
- package/types/core/class/char.d.ts +2 -1
- package/types/core/class/component.d.ts +1 -2
- package/types/core/class/format.d.ts +8 -1
- package/types/core/class/html.d.ts +8 -0
- package/types/core/class/menu.d.ts +8 -0
- package/types/core/class/offset.d.ts +24 -26
- package/types/core/class/selection.d.ts +2 -0
- package/types/core/class/toolbar.d.ts +6 -0
- package/types/core/class/ui.d.ts +1 -1
- package/types/core/editor.d.ts +34 -12
- package/types/core/section/constructor.d.ts +5 -638
- package/types/core/section/documentType.d.ts +12 -2
- package/types/core/section/options.d.ts +740 -0
- package/types/core/util/instanceCheck.d.ts +50 -0
- package/types/editorInjector/_core.d.ts +5 -5
- package/types/editorInjector/index.d.ts +2 -2
- package/types/events.d.ts +2 -0
- package/types/helper/converter.d.ts +9 -0
- package/types/helper/dom/domQuery.d.ts +5 -5
- package/types/helper/dom/domUtils.d.ts +8 -0
- package/types/helper/env.d.ts +6 -1
- package/types/helper/index.d.ts +4 -1
- package/types/index.d.ts +122 -120
- package/types/langs/_Lang.d.ts +194 -194
- package/types/modules/ColorPicker.d.ts +5 -1
- package/types/modules/Controller.d.ts +8 -4
- package/types/modules/Figure.d.ts +2 -1
- package/types/modules/HueSlider.d.ts +4 -1
- package/types/modules/SelectMenu.d.ts +1 -1
- package/types/plugins/command/blockquote.d.ts +1 -0
- package/types/plugins/command/list_bulleted.d.ts +1 -0
- package/types/plugins/command/list_numbered.d.ts +1 -0
- package/types/plugins/dropdown/align.d.ts +1 -0
- package/types/plugins/dropdown/backgroundColor.d.ts +1 -0
- package/types/plugins/dropdown/font.d.ts +1 -0
- package/types/plugins/dropdown/fontColor.d.ts +1 -0
- package/types/plugins/dropdown/formatBlock.d.ts +3 -2
- package/types/plugins/dropdown/lineHeight.d.ts +1 -0
- package/types/plugins/dropdown/list.d.ts +1 -0
- package/types/plugins/dropdown/table.d.ts +6 -0
- package/types/plugins/input/fontSize.d.ts +1 -0
- package/types/plugins/modal/drawing.d.ts +4 -0
- package/types/plugins/modal/link.d.ts +32 -15
- package/types/suneditor.d.ts +13 -9
- package/types/typedef.d.ts +8 -0
|
@@ -1,178 +1,170 @@
|
|
|
1
|
-
import EditorInjector from '../../editorInjector';
|
|
2
|
-
import { dom } from '../../helper';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
list += /*html*/ `
|
|
172
|
-
</ul>
|
|
173
|
-
</div>`;
|
|
174
|
-
|
|
175
|
-
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
export default FormatBlock;
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { dom } from '../../helper';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @class
|
|
6
|
+
* @description FormatBlock Plugin (P, BLOCKQUOTE, PRE, H1, H2...)
|
|
7
|
+
*/
|
|
8
|
+
class FormatBlock extends EditorInjector {
|
|
9
|
+
static key = 'formatBlock';
|
|
10
|
+
static type = 'dropdown';
|
|
11
|
+
static className = 'se-btn-select se-btn-tool-format';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @constructor
|
|
15
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
16
|
+
* @param {Object} pluginOptions
|
|
17
|
+
* @param {Array<string>} pluginOptions.items - Format list
|
|
18
|
+
*/
|
|
19
|
+
constructor(editor, pluginOptions) {
|
|
20
|
+
super(editor);
|
|
21
|
+
// plugin basic properties
|
|
22
|
+
this.title = this.lang.formats;
|
|
23
|
+
this.inner = '<span class="se-txt">' + this.lang.formats + '</span>' + this.icons.arrow_down;
|
|
24
|
+
|
|
25
|
+
// create HTML
|
|
26
|
+
const menu = CreateHTML(editor, pluginOptions.items);
|
|
27
|
+
|
|
28
|
+
// members
|
|
29
|
+
this.formatList = menu.querySelectorAll('li button');
|
|
30
|
+
this.currentFormat = '';
|
|
31
|
+
|
|
32
|
+
// init
|
|
33
|
+
this.menu.initDropdownTarget(FormatBlock, menu);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @editorMethod Editor.EventManager
|
|
38
|
+
* @description Executes the method that is called whenever the cursor position changes.
|
|
39
|
+
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
40
|
+
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
41
|
+
* @returns {boolean} - Whether the plugin is active
|
|
42
|
+
* - If it returns "undefined", it will no longer be called in this scope.
|
|
43
|
+
*/
|
|
44
|
+
active(element, target) {
|
|
45
|
+
let formatTitle = this.lang.formats;
|
|
46
|
+
const targetText = target.querySelector('.se-txt');
|
|
47
|
+
|
|
48
|
+
if (!element) {
|
|
49
|
+
dom.utils.changeTxt(targetText, formatTitle);
|
|
50
|
+
} else if (this.format.isLine(element)) {
|
|
51
|
+
const formatList = this.formatList;
|
|
52
|
+
const nodeName = element.nodeName.toLowerCase();
|
|
53
|
+
const className = (element.className.match(/(\s|^)__se__format__[^\s]+/) || [''])[0].trim();
|
|
54
|
+
|
|
55
|
+
for (let i = 0, len = formatList.length, f; i < len; i++) {
|
|
56
|
+
f = /** @type {HTMLButtonElement} */ (formatList[i]);
|
|
57
|
+
if (nodeName === f.getAttribute('data-value') && className === f.getAttribute('data-class')) {
|
|
58
|
+
formatTitle = f.title;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
dom.utils.changeTxt(targetText, formatTitle);
|
|
64
|
+
targetText.setAttribute('data-value', nodeName);
|
|
65
|
+
targetText.setAttribute('data-class', className);
|
|
66
|
+
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @editorMethod Modules.Dropdown
|
|
75
|
+
* @description Executes the method that is called when a plugin's dropdown menu is opened.
|
|
76
|
+
* @param {HTMLElement} target Line element at the current cursor position
|
|
77
|
+
*/
|
|
78
|
+
on(target) {
|
|
79
|
+
const formatList = this.formatList;
|
|
80
|
+
const targetText = target.querySelector('.se-txt');
|
|
81
|
+
const currentFormat = (targetText.getAttribute('data-value') || '') + (targetText.getAttribute('data-class') || '');
|
|
82
|
+
|
|
83
|
+
if (currentFormat !== this.currentFormat) {
|
|
84
|
+
for (let i = 0, len = formatList.length, f; i < len; i++) {
|
|
85
|
+
f = formatList[i];
|
|
86
|
+
if (currentFormat === f.getAttribute('data-value') + f.getAttribute('data-class')) {
|
|
87
|
+
dom.utils.addClass(f, 'active');
|
|
88
|
+
} else {
|
|
89
|
+
dom.utils.removeClass(f, 'active');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
this.currentFormat = currentFormat;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @editorMethod Editor.core
|
|
99
|
+
* @description Executes the main execution method of the plugin.
|
|
100
|
+
* - Called when an item in the "dropdown" menu is clicked.
|
|
101
|
+
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
102
|
+
*/
|
|
103
|
+
action(target) {
|
|
104
|
+
// "line"|"br-line"|"block"
|
|
105
|
+
const command = target.getAttribute('data-command');
|
|
106
|
+
const tag = target.firstElementChild;
|
|
107
|
+
if (command === 'block') {
|
|
108
|
+
this.format.applyBlock(tag);
|
|
109
|
+
} else if (command === 'br-line') {
|
|
110
|
+
this.format.setBrLine(tag);
|
|
111
|
+
} else {
|
|
112
|
+
this.format.setLine(tag);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
this.menu.dropdownOff();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @description Create a header tag, call by "shortcut" class
|
|
120
|
+
* - (e.g. shortcuts._h1: ['c+s+49+$~formatBlock.applyHeaderByShortcut', ''])
|
|
121
|
+
* @param {__se__PluginShortcutInfo} params - Information of the "shortcut" plugin
|
|
122
|
+
*/
|
|
123
|
+
applyHeaderByShortcut({ keyCode }) {
|
|
124
|
+
const headerNum = keyCode.match(/\d+$/)?.[0];
|
|
125
|
+
const tag = dom.utils.createElement(`H${headerNum}`);
|
|
126
|
+
this.format.setLine(tag);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function CreateHTML({ lang }, items) {
|
|
131
|
+
const defaultFormats = ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
|
|
132
|
+
const formatList = !items || items.length === 0 ? defaultFormats : items;
|
|
133
|
+
|
|
134
|
+
let list = /*html*/ `
|
|
135
|
+
<div class="se-list-inner">
|
|
136
|
+
<ul class="se-list-basic">`;
|
|
137
|
+
|
|
138
|
+
for (let i = 0, len = formatList.length, format, tagName, command, name, h, attrs, className; i < len; i++) {
|
|
139
|
+
format = formatList[i];
|
|
140
|
+
|
|
141
|
+
if (typeof format === 'string' && defaultFormats.includes(format)) {
|
|
142
|
+
tagName = format.toLowerCase();
|
|
143
|
+
command = tagName === 'blockquote' ? 'block' : tagName === 'pre' ? 'br-line' : 'line';
|
|
144
|
+
h = /^h/.test(tagName) ? tagName.match(/\d+/)[0] : '';
|
|
145
|
+
name = lang['tag_' + (h ? 'h' : tagName)] + h;
|
|
146
|
+
className = '';
|
|
147
|
+
attrs = '';
|
|
148
|
+
} else {
|
|
149
|
+
tagName = format.tag.toLowerCase();
|
|
150
|
+
command = format.command;
|
|
151
|
+
name = format.name || tagName;
|
|
152
|
+
className = format.class;
|
|
153
|
+
attrs = className ? ' class="' + className + '"' : '';
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
list += /*html*/ `
|
|
157
|
+
<li>
|
|
158
|
+
<button type="button" class="se-btn se-btn-list" data-command="${command}" data-value="${tagName}" data-class="${className}" title="${name}" aria-label="${name}">
|
|
159
|
+
<${tagName}${attrs}>${name}</${tagName}>
|
|
160
|
+
</button>
|
|
161
|
+
</li>`;
|
|
162
|
+
}
|
|
163
|
+
list += /*html*/ `
|
|
164
|
+
</ul>
|
|
165
|
+
</div>`;
|
|
166
|
+
|
|
167
|
+
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export default FormatBlock;
|
|
@@ -1,152 +1,152 @@
|
|
|
1
|
-
import EditorInjector from '../../editorInjector';
|
|
2
|
-
import { dom } from '../../helper';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @class
|
|
6
|
-
* @description HR Plugin
|
|
7
|
-
*/
|
|
8
|
-
class HR extends EditorInjector {
|
|
9
|
-
static key = 'hr';
|
|
10
|
-
static type = 'dropdown';
|
|
11
|
-
static className = '';
|
|
12
|
-
/**
|
|
13
|
-
* @this {HR}
|
|
14
|
-
* @param {HTMLElement} node - The node to check.
|
|
15
|
-
* @returns {HTMLElement|null} Returns a node if the node is a valid component.
|
|
16
|
-
*/
|
|
17
|
-
static component(node) {
|
|
18
|
-
return /^hr$/i.test(node?.nodeName) ? node : null;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* @constructor
|
|
23
|
-
* @param {__se__EditorCore} editor - The root editor instance
|
|
24
|
-
* @param {Object} pluginOptions
|
|
25
|
-
* @param {Array<{name: string, class: string}>} pluginOptions.items - HR list
|
|
26
|
-
*/
|
|
27
|
-
constructor(editor, pluginOptions) {
|
|
28
|
-
// plugin bisic properties
|
|
29
|
-
super(editor);
|
|
30
|
-
this.title = this.lang.horizontalLine;
|
|
31
|
-
this.icon = 'horizontal_line';
|
|
32
|
-
|
|
33
|
-
// create HTML
|
|
34
|
-
const HRMenus = CreateHTML(editor, pluginOptions.items);
|
|
35
|
-
|
|
36
|
-
// members
|
|
37
|
-
this.list = HRMenus.querySelectorAll('button');
|
|
38
|
-
|
|
39
|
-
// init
|
|
40
|
-
this.menu.initDropdownTarget(HR, HRMenus);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* @editorMethod Editor.Component
|
|
45
|
-
* @description Executes the method that is called when a component of a plugin is selected.
|
|
46
|
-
* @param {HTMLElement} target Target component element
|
|
47
|
-
*/
|
|
48
|
-
select(target) {
|
|
49
|
-
dom.utils.addClass(target, 'on');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* @editorMethod Editor.Component
|
|
54
|
-
* @description Called when a container is deselected.
|
|
55
|
-
* @param {HTMLElement} element Target element
|
|
56
|
-
*/
|
|
57
|
-
deselect(element) {
|
|
58
|
-
dom.utils.removeClass(element, 'on');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* @editorMethod Editor.Component
|
|
63
|
-
* @description Method to delete a component of a plugin, called by the "FileManager", "Controller" module.
|
|
64
|
-
* @param {HTMLElement} target Target element
|
|
65
|
-
*/
|
|
66
|
-
destroy(target) {
|
|
67
|
-
if (!target) return;
|
|
68
|
-
|
|
69
|
-
const focusEl = target.previousElementSibling || target.nextElementSibling;
|
|
70
|
-
dom.utils.removeItem(target);
|
|
71
|
-
|
|
72
|
-
// focus
|
|
73
|
-
this.editor.focusEdge(focusEl);
|
|
74
|
-
this.history.push(false);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* @editorMethod Editor.core
|
|
79
|
-
* @description Executes the main execution method of the plugin.
|
|
80
|
-
* - Called when an item in the "dropdown" menu is clicked.
|
|
81
|
-
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
82
|
-
*/
|
|
83
|
-
action(target) {
|
|
84
|
-
const hr = this.submit(target.firstElementChild.className);
|
|
85
|
-
const line = this.format.addLine(hr);
|
|
86
|
-
this.selection.setRange(line, 1, line, 1);
|
|
87
|
-
this.menu.dropdownOff();
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* @editorMethod Editor.core
|
|
92
|
-
* @description Executes methods called by shortcut keys.
|
|
93
|
-
* @param {__se__PluginShortcutInfo} params - Information of the "shortcut" plugin
|
|
94
|
-
*/
|
|
95
|
-
shortcut({ line, range }) {
|
|
96
|
-
const newLine = this.nodeTransform.split(range.endContainer, range.endOffset, 0);
|
|
97
|
-
this.submit('__se__solid');
|
|
98
|
-
dom.utils.removeItem(line);
|
|
99
|
-
this.selection.setRange(newLine, 0, newLine, 0);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* @description Add a hr element
|
|
104
|
-
* @param {string} className HR class name
|
|
105
|
-
*/
|
|
106
|
-
submit(className) {
|
|
107
|
-
const hr = dom.utils.createElement('hr', { class: className });
|
|
108
|
-
this.editor.focus();
|
|
109
|
-
this.component.insert(hr, { skipCharCount: false, skipSelection: true, skipHistory: false });
|
|
110
|
-
return hr;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function CreateHTML({ lang }, HRItems) {
|
|
115
|
-
const items = HRItems || [
|
|
116
|
-
{
|
|
117
|
-
name: lang.hr_solid,
|
|
118
|
-
class: '__se__solid'
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
name: lang.hr_dashed,
|
|
122
|
-
class: '__se__dashed'
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
name: lang.hr_dotted,
|
|
126
|
-
class: '__se__dotted'
|
|
127
|
-
}
|
|
128
|
-
];
|
|
129
|
-
|
|
130
|
-
let list = '';
|
|
131
|
-
for (let i = 0, len = items.length; i < len; i++) {
|
|
132
|
-
list += /*html*/ `
|
|
133
|
-
<li>
|
|
134
|
-
<button type="button" class="se-btn se-btn-list" data-command="hr" title="${items[i].name}" aria-label="${items[i].name}">
|
|
135
|
-
<hr${items[i].class ? ` class="${items[i].class}"` : ''}${items[i].style ? ` style="${items[i].style}"` : ''}/>
|
|
136
|
-
</button>
|
|
137
|
-
</li>`;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return dom.utils.createElement(
|
|
141
|
-
'DIV',
|
|
142
|
-
{
|
|
143
|
-
class: 'se-dropdown se-list-layer se-list-line'
|
|
144
|
-
},
|
|
145
|
-
/*html*/ `
|
|
146
|
-
<div class="se-list-inner">
|
|
147
|
-
<ul class="se-list-basic">${list}</ul>
|
|
148
|
-
</div>`
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export default HR;
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { dom } from '../../helper';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @class
|
|
6
|
+
* @description HR Plugin
|
|
7
|
+
*/
|
|
8
|
+
class HR extends EditorInjector {
|
|
9
|
+
static key = 'hr';
|
|
10
|
+
static type = 'dropdown';
|
|
11
|
+
static className = '';
|
|
12
|
+
/**
|
|
13
|
+
* @this {HR}
|
|
14
|
+
* @param {HTMLElement} node - The node to check.
|
|
15
|
+
* @returns {HTMLElement|null} Returns a node if the node is a valid component.
|
|
16
|
+
*/
|
|
17
|
+
static component(node) {
|
|
18
|
+
return /^hr$/i.test(node?.nodeName) ? node : null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @constructor
|
|
23
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
24
|
+
* @param {Object} pluginOptions
|
|
25
|
+
* @param {Array<{name: string, class: string}>} pluginOptions.items - HR list
|
|
26
|
+
*/
|
|
27
|
+
constructor(editor, pluginOptions) {
|
|
28
|
+
// plugin bisic properties
|
|
29
|
+
super(editor);
|
|
30
|
+
this.title = this.lang.horizontalLine;
|
|
31
|
+
this.icon = 'horizontal_line';
|
|
32
|
+
|
|
33
|
+
// create HTML
|
|
34
|
+
const HRMenus = CreateHTML(editor, pluginOptions.items);
|
|
35
|
+
|
|
36
|
+
// members
|
|
37
|
+
this.list = HRMenus.querySelectorAll('button');
|
|
38
|
+
|
|
39
|
+
// init
|
|
40
|
+
this.menu.initDropdownTarget(HR, HRMenus);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @editorMethod Editor.Component
|
|
45
|
+
* @description Executes the method that is called when a component of a plugin is selected.
|
|
46
|
+
* @param {HTMLElement} target Target component element
|
|
47
|
+
*/
|
|
48
|
+
select(target) {
|
|
49
|
+
dom.utils.addClass(target, 'on');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @editorMethod Editor.Component
|
|
54
|
+
* @description Called when a container is deselected.
|
|
55
|
+
* @param {HTMLElement} element Target element
|
|
56
|
+
*/
|
|
57
|
+
deselect(element) {
|
|
58
|
+
dom.utils.removeClass(element, 'on');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @editorMethod Editor.Component
|
|
63
|
+
* @description Method to delete a component of a plugin, called by the "FileManager", "Controller" module.
|
|
64
|
+
* @param {HTMLElement} target Target element
|
|
65
|
+
*/
|
|
66
|
+
destroy(target) {
|
|
67
|
+
if (!target) return;
|
|
68
|
+
|
|
69
|
+
const focusEl = target.previousElementSibling || target.nextElementSibling;
|
|
70
|
+
dom.utils.removeItem(target);
|
|
71
|
+
|
|
72
|
+
// focus
|
|
73
|
+
this.editor.focusEdge(focusEl);
|
|
74
|
+
this.history.push(false);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @editorMethod Editor.core
|
|
79
|
+
* @description Executes the main execution method of the plugin.
|
|
80
|
+
* - Called when an item in the "dropdown" menu is clicked.
|
|
81
|
+
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
82
|
+
*/
|
|
83
|
+
action(target) {
|
|
84
|
+
const hr = this.submit(target.firstElementChild.className);
|
|
85
|
+
const line = this.format.addLine(hr);
|
|
86
|
+
this.selection.setRange(line, 1, line, 1);
|
|
87
|
+
this.menu.dropdownOff();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* @editorMethod Editor.core
|
|
92
|
+
* @description Executes methods called by shortcut keys.
|
|
93
|
+
* @param {__se__PluginShortcutInfo} params - Information of the "shortcut" plugin
|
|
94
|
+
*/
|
|
95
|
+
shortcut({ line, range }) {
|
|
96
|
+
const newLine = this.nodeTransform.split(range.endContainer, range.endOffset, 0);
|
|
97
|
+
this.submit('__se__solid');
|
|
98
|
+
dom.utils.removeItem(line);
|
|
99
|
+
this.selection.setRange(newLine, 0, newLine, 0);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @description Add a hr element
|
|
104
|
+
* @param {string} className HR class name
|
|
105
|
+
*/
|
|
106
|
+
submit(className) {
|
|
107
|
+
const hr = dom.utils.createElement('hr', { class: className });
|
|
108
|
+
this.editor.focus();
|
|
109
|
+
this.component.insert(hr, { skipCharCount: false, skipSelection: true, skipHistory: false });
|
|
110
|
+
return hr;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function CreateHTML({ lang }, HRItems) {
|
|
115
|
+
const items = HRItems || [
|
|
116
|
+
{
|
|
117
|
+
name: lang.hr_solid,
|
|
118
|
+
class: '__se__solid'
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: lang.hr_dashed,
|
|
122
|
+
class: '__se__dashed'
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: lang.hr_dotted,
|
|
126
|
+
class: '__se__dotted'
|
|
127
|
+
}
|
|
128
|
+
];
|
|
129
|
+
|
|
130
|
+
let list = '';
|
|
131
|
+
for (let i = 0, len = items.length; i < len; i++) {
|
|
132
|
+
list += /*html*/ `
|
|
133
|
+
<li>
|
|
134
|
+
<button type="button" class="se-btn se-btn-list" data-command="hr" title="${items[i].name}" aria-label="${items[i].name}">
|
|
135
|
+
<hr${items[i].class ? ` class="${items[i].class}"` : ''}${items[i].style ? ` style="${items[i].style}"` : ''}/>
|
|
136
|
+
</button>
|
|
137
|
+
</li>`;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return dom.utils.createElement(
|
|
141
|
+
'DIV',
|
|
142
|
+
{
|
|
143
|
+
class: 'se-dropdown se-list-layer se-list-line'
|
|
144
|
+
},
|
|
145
|
+
/*html*/ `
|
|
146
|
+
<div class="se-list-inner">
|
|
147
|
+
<ul class="se-list-basic">${list}</ul>
|
|
148
|
+
</div>`
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export default HR;
|