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,148 +1,149 @@
|
|
|
1
|
-
import EditorInjector from '../../editorInjector';
|
|
2
|
-
import { dom } from '../../helper';
|
|
3
|
-
|
|
4
|
-
const DEFAULT_TYPE = 'disc';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @class
|
|
8
|
-
* @description List bulleted plugin, Several types of lists are provided.
|
|
9
|
-
*/
|
|
10
|
-
class List_bulleted extends EditorInjector {
|
|
11
|
-
static key = 'list_bulleted';
|
|
12
|
-
static type = 'command';
|
|
13
|
-
static className = 'se-icon-flip-rtl';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @constructor
|
|
17
|
-
* @param {__se__EditorCore} editor - The root editor instance
|
|
18
|
-
*/
|
|
19
|
-
constructor(editor) {
|
|
20
|
-
// plugin bisic properties
|
|
21
|
-
super(editor);
|
|
22
|
-
this.title = this.lang.bulletedList;
|
|
23
|
-
this.icon = 'list_bulleted';
|
|
24
|
-
this.afterItem = dom.utils.createElement(
|
|
25
|
-
'button',
|
|
26
|
-
{ class: 'se-btn se-tooltip se-sub-arrow-btn', 'data-command': List_bulleted.key, 'data-type': 'dropdown' },
|
|
27
|
-
`${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.bulletedList}</span></span>`
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
// create HTML
|
|
31
|
-
const menu = CreateHTML();
|
|
32
|
-
|
|
33
|
-
// members
|
|
34
|
-
this.listItems = menu.querySelectorAll('li button ul');
|
|
35
|
-
|
|
36
|
-
// init
|
|
37
|
-
this.menu.initDropdownTarget({ key: List_bulleted.key, type: 'dropdown' }, menu);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* @editorMethod Editor.EventManager
|
|
42
|
-
* @description Executes the method that is called whenever the cursor position changes.
|
|
43
|
-
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
44
|
-
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
45
|
-
* @returns {boolean} - Whether the plugin is active
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
* @
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
* @
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
* @
|
|
98
|
-
* @
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
startContainer.textContent
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
* @
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
this.
|
|
117
|
-
this.
|
|
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
|
-
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { dom } from '../../helper';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_TYPE = 'disc';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @class
|
|
8
|
+
* @description List bulleted plugin, Several types of lists are provided.
|
|
9
|
+
*/
|
|
10
|
+
class List_bulleted extends EditorInjector {
|
|
11
|
+
static key = 'list_bulleted';
|
|
12
|
+
static type = 'command';
|
|
13
|
+
static className = 'se-icon-flip-rtl';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @constructor
|
|
17
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
18
|
+
*/
|
|
19
|
+
constructor(editor) {
|
|
20
|
+
// plugin bisic properties
|
|
21
|
+
super(editor);
|
|
22
|
+
this.title = this.lang.bulletedList;
|
|
23
|
+
this.icon = 'list_bulleted';
|
|
24
|
+
this.afterItem = dom.utils.createElement(
|
|
25
|
+
'button',
|
|
26
|
+
{ class: 'se-btn se-tooltip se-sub-arrow-btn', 'data-command': List_bulleted.key, 'data-type': 'dropdown' },
|
|
27
|
+
`${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.bulletedList}</span></span>`
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// create HTML
|
|
31
|
+
const menu = CreateHTML();
|
|
32
|
+
|
|
33
|
+
// members
|
|
34
|
+
this.listItems = menu.querySelectorAll('li button ul');
|
|
35
|
+
|
|
36
|
+
// init
|
|
37
|
+
this.menu.initDropdownTarget({ key: List_bulleted.key, type: 'dropdown' }, menu);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @editorMethod Editor.EventManager
|
|
42
|
+
* @description Executes the method that is called whenever the cursor position changes.
|
|
43
|
+
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
44
|
+
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
45
|
+
* @returns {boolean} - Whether the plugin is active
|
|
46
|
+
* - If it returns "undefined", it will no longer be called in this scope.
|
|
47
|
+
*/
|
|
48
|
+
active(element, target) {
|
|
49
|
+
if (dom.check.isListCell(element) && /^UL$/i.test(element.parentElement.nodeName)) {
|
|
50
|
+
dom.utils.addClass(target, 'active');
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
dom.utils.removeClass(target, 'active');
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @editorMethod Modules.Dropdown
|
|
60
|
+
* @description Executes the method that is called when a plugin's dropdown menu is opened.
|
|
61
|
+
*/
|
|
62
|
+
on() {
|
|
63
|
+
const list = this.listItems;
|
|
64
|
+
const el = this.format.getBlock(this.selection.getNode());
|
|
65
|
+
const type = el?.style ? el.style.listStyleType || DEFAULT_TYPE : '';
|
|
66
|
+
|
|
67
|
+
for (let i = 0, len = list.length, l; i < len; i++) {
|
|
68
|
+
l = /** @type {HTMLElement} */ (list[i]);
|
|
69
|
+
if (type === l.style.listStyleType) {
|
|
70
|
+
dom.utils.addClass(l.parentElement, 'active');
|
|
71
|
+
} else {
|
|
72
|
+
dom.utils.removeClass(l.parentElement, 'active');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
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 el = this.format.getBlock(this.selection.getNode());
|
|
85
|
+
const type = target?.querySelector('ul')?.style.listStyleType;
|
|
86
|
+
|
|
87
|
+
if (dom.check.isList(el) && type) {
|
|
88
|
+
el.style.listStyleType = type;
|
|
89
|
+
} else {
|
|
90
|
+
this.submit(type);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
this.menu.dropdownOff();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @editorMethod Editor.core
|
|
98
|
+
* @description Executes methods called by shortcut keys.
|
|
99
|
+
* @param {__se__PluginShortcutInfo} params - Information of the "shortcut" plugin
|
|
100
|
+
*/
|
|
101
|
+
shortcut({ range, info }) {
|
|
102
|
+
const { startContainer } = range;
|
|
103
|
+
if (dom.check.isText(startContainer)) {
|
|
104
|
+
const newText = startContainer.substringData(info.key.length, startContainer.textContent.length - 1);
|
|
105
|
+
startContainer.textContent = newText;
|
|
106
|
+
}
|
|
107
|
+
this.submit();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @description Add a bulleted list
|
|
112
|
+
* @param {string} [type=""] List type
|
|
113
|
+
*/
|
|
114
|
+
submit(type) {
|
|
115
|
+
const range = this.format.applyList(`ul:${type || ''}`, null, false);
|
|
116
|
+
if (range) this.selection.setRange(range.sc, range.so, range.ec, range.eo);
|
|
117
|
+
this.editor.focus();
|
|
118
|
+
this.history.push(false);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function CreateHTML() {
|
|
123
|
+
const html = /*html*/ `
|
|
124
|
+
<div class="se-list-inner">
|
|
125
|
+
<ul class="se-list-basic se-list-horizontal se-list-carrier">
|
|
126
|
+
${_CreateLI(['disc', 'circle', 'square'])}
|
|
127
|
+
</ul>
|
|
128
|
+
</div>`;
|
|
129
|
+
|
|
130
|
+
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, html);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function _CreateLI(types) {
|
|
134
|
+
return types
|
|
135
|
+
.map((v) => {
|
|
136
|
+
return /*html*/ `
|
|
137
|
+
<li>
|
|
138
|
+
<button type="button" class="se-btn se-btn-list se-icon-flip-rtl" data-command="${v}" title="${v}" aria-label="${v}">
|
|
139
|
+
<ul style="list-style-type: ${v};">
|
|
140
|
+
<li></li><li></li><li></li>
|
|
141
|
+
</ul>
|
|
142
|
+
</button>
|
|
143
|
+
</li>
|
|
144
|
+
`;
|
|
145
|
+
})
|
|
146
|
+
.join('');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export default List_bulleted;
|
|
@@ -1,151 +1,152 @@
|
|
|
1
|
-
import EditorInjector from '../../editorInjector';
|
|
2
|
-
import { dom } from '../../helper';
|
|
3
|
-
|
|
4
|
-
const DEFAULT_TYPE = 'decimal';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @class
|
|
8
|
-
* @description List numbered plugin, Several types of lists are provided.
|
|
9
|
-
*/
|
|
10
|
-
class List_numbered extends EditorInjector {
|
|
11
|
-
static key = 'list_numbered';
|
|
12
|
-
static type = 'command';
|
|
13
|
-
static className = 'se-icon-flip-rtl';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @constructor
|
|
17
|
-
* @param {__se__EditorCore} editor - The root editor instance
|
|
18
|
-
*/
|
|
19
|
-
constructor(editor) {
|
|
20
|
-
// plugin bisic properties
|
|
21
|
-
super(editor);
|
|
22
|
-
this.title = this.lang.numberedList;
|
|
23
|
-
this.icon = 'list_numbered';
|
|
24
|
-
this.afterItem = dom.utils.createElement(
|
|
25
|
-
'button',
|
|
26
|
-
{ class: 'se-btn se-tooltip se-sub-arrow-btn', 'data-command': List_numbered.key, 'data-type': 'dropdown' },
|
|
27
|
-
`${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.numberedList}</span></span>`
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
// create HTML
|
|
31
|
-
const menu = CreateHTML();
|
|
32
|
-
|
|
33
|
-
// members
|
|
34
|
-
this.listItems = menu.querySelectorAll('li button ol');
|
|
35
|
-
|
|
36
|
-
// init
|
|
37
|
-
this.menu.initDropdownTarget({ key: List_numbered.key, type: 'dropdown' }, menu);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* @editorMethod Editor.EventManager
|
|
42
|
-
* @description Executes the method that is called whenever the cursor position changes.
|
|
43
|
-
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
44
|
-
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
45
|
-
* @returns {boolean} - Whether the plugin is active
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
* @
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
* @
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
* @
|
|
98
|
-
* @
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
startContainer.textContent
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
* @
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
this.
|
|
117
|
-
this.
|
|
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
|
-
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { dom } from '../../helper';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_TYPE = 'decimal';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @class
|
|
8
|
+
* @description List numbered plugin, Several types of lists are provided.
|
|
9
|
+
*/
|
|
10
|
+
class List_numbered extends EditorInjector {
|
|
11
|
+
static key = 'list_numbered';
|
|
12
|
+
static type = 'command';
|
|
13
|
+
static className = 'se-icon-flip-rtl';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @constructor
|
|
17
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
18
|
+
*/
|
|
19
|
+
constructor(editor) {
|
|
20
|
+
// plugin bisic properties
|
|
21
|
+
super(editor);
|
|
22
|
+
this.title = this.lang.numberedList;
|
|
23
|
+
this.icon = 'list_numbered';
|
|
24
|
+
this.afterItem = dom.utils.createElement(
|
|
25
|
+
'button',
|
|
26
|
+
{ class: 'se-btn se-tooltip se-sub-arrow-btn', 'data-command': List_numbered.key, 'data-type': 'dropdown' },
|
|
27
|
+
`${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.numberedList}</span></span>`
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// create HTML
|
|
31
|
+
const menu = CreateHTML();
|
|
32
|
+
|
|
33
|
+
// members
|
|
34
|
+
this.listItems = menu.querySelectorAll('li button ol');
|
|
35
|
+
|
|
36
|
+
// init
|
|
37
|
+
this.menu.initDropdownTarget({ key: List_numbered.key, type: 'dropdown' }, menu);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @editorMethod Editor.EventManager
|
|
42
|
+
* @description Executes the method that is called whenever the cursor position changes.
|
|
43
|
+
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
44
|
+
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
45
|
+
* @returns {boolean} - Whether the plugin is active
|
|
46
|
+
* - If it returns "undefined", it will no longer be called in this scope.
|
|
47
|
+
*/
|
|
48
|
+
active(element, target) {
|
|
49
|
+
if (dom.check.isListCell(element) && /^OL$/i.test(element.parentElement.nodeName)) {
|
|
50
|
+
dom.utils.addClass(target, 'active');
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
dom.utils.removeClass(target, 'active');
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @editorMethod Modules.Dropdown
|
|
60
|
+
* @description Executes the method that is called when a plugin's dropdown menu is opened.
|
|
61
|
+
*/
|
|
62
|
+
on() {
|
|
63
|
+
const list = this.listItems;
|
|
64
|
+
const el = this.format.getBlock(this.selection.getNode());
|
|
65
|
+
const type = el?.style ? el.style.listStyleType || DEFAULT_TYPE : '';
|
|
66
|
+
|
|
67
|
+
for (let i = 0, len = list.length, l; i < len; i++) {
|
|
68
|
+
l = /** @type {HTMLElement} */ (list[i]);
|
|
69
|
+
if (type === l.style.listStyleType) {
|
|
70
|
+
dom.utils.addClass(l.parentElement, 'active');
|
|
71
|
+
} else {
|
|
72
|
+
dom.utils.removeClass(l.parentElement, 'active');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
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 el = this.format.getBlock(this.selection.getNode());
|
|
85
|
+
const type = target?.querySelector('ol')?.style.listStyleType;
|
|
86
|
+
|
|
87
|
+
if (dom.check.isList(el) && type) {
|
|
88
|
+
el.style.listStyleType = type;
|
|
89
|
+
} else {
|
|
90
|
+
this.submit(type);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
this.menu.dropdownOff();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @editorMethod Editor.core
|
|
98
|
+
* @description Executes methods called by shortcut keys.
|
|
99
|
+
* @param {__se__PluginShortcutInfo} params - Information of the "shortcut" plugin
|
|
100
|
+
*/
|
|
101
|
+
shortcut({ range, info }) {
|
|
102
|
+
const { startContainer } = range;
|
|
103
|
+
if (dom.check.isText(startContainer)) {
|
|
104
|
+
const newText = startContainer.substringData(info.key.length, startContainer.textContent.length - 1);
|
|
105
|
+
startContainer.textContent = newText;
|
|
106
|
+
}
|
|
107
|
+
this.submit();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @description Add a numbered list
|
|
112
|
+
* @param {string} [type=""] List type
|
|
113
|
+
*/
|
|
114
|
+
submit(type) {
|
|
115
|
+
const range = this.format.applyList(`ol:${type || ''}`, null, false);
|
|
116
|
+
if (range) this.selection.setRange(range.sc, range.so, range.ec, range.eo);
|
|
117
|
+
this.editor.focus();
|
|
118
|
+
this.history.push(false);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function CreateHTML() {
|
|
123
|
+
const html = /*html*/ `
|
|
124
|
+
<div class="se-list-inner">
|
|
125
|
+
<ul class="se-list-basic se-list-horizontal se-list-carrier">
|
|
126
|
+
${_CreateLI(['decimal', 'upper-roman', 'lower-roman'])}
|
|
127
|
+
</ul>
|
|
128
|
+
<ul class="se-list-basic se-list-horizontal se-list-carrier">
|
|
129
|
+
${_CreateLI(['lower-latin', 'upper-latin', 'lower-greek'])}
|
|
130
|
+
</ul>
|
|
131
|
+
</div>`;
|
|
132
|
+
|
|
133
|
+
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, html);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function _CreateLI(types) {
|
|
137
|
+
return types
|
|
138
|
+
.map((v) => {
|
|
139
|
+
return /*html*/ `
|
|
140
|
+
<li>
|
|
141
|
+
<button type="button" class="se-btn se-btn-list se-icon-flip-rtl" data-command="${v}" title="${v}" aria-label="${v}">
|
|
142
|
+
<ol style="list-style-type: ${v};">
|
|
143
|
+
<li></li><li></li><li></li>
|
|
144
|
+
</ol>
|
|
145
|
+
</button>
|
|
146
|
+
</li>
|
|
147
|
+
`;
|
|
148
|
+
})
|
|
149
|
+
.join('');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export default List_numbered;
|