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,122 +1,123 @@
|
|
|
1
|
-
import EditorInjector from '../../editorInjector';
|
|
2
|
-
import { dom } from '../../helper';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @class
|
|
6
|
-
* @description List Plugin (OL, UL)
|
|
7
|
-
*/
|
|
8
|
-
class List extends EditorInjector {
|
|
9
|
-
static key = 'list';
|
|
10
|
-
static type = 'dropdown';
|
|
11
|
-
static className = 'se-icon-flip-rtl';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @constructor
|
|
15
|
-
* @param {__se__EditorCore} editor - The root editor instance
|
|
16
|
-
*/
|
|
17
|
-
constructor(editor) {
|
|
18
|
-
// plugin bisic properties
|
|
19
|
-
super(editor);
|
|
20
|
-
this.title = this.lang.list;
|
|
21
|
-
this.icon = 'list_numbered';
|
|
22
|
-
|
|
23
|
-
// create HTML
|
|
24
|
-
const menu = CreateHTML(editor);
|
|
25
|
-
|
|
26
|
-
// members
|
|
27
|
-
this.listItems = menu.querySelectorAll('li button');
|
|
28
|
-
this.icons = {
|
|
29
|
-
bulleted: editor.icons.list_bulleted,
|
|
30
|
-
numbered: editor.icons.list_numbered
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// init
|
|
34
|
-
this.menu.initDropdownTarget(List, menu);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* @editorMethod Editor.EventManager
|
|
39
|
-
* @description Executes the method that is called whenever the cursor position changes.
|
|
40
|
-
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
41
|
-
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
42
|
-
* @returns {boolean} - Whether the plugin is active
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
dom.utils.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
* @
|
|
71
|
-
* @
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
* @
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { dom } from '../../helper';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @class
|
|
6
|
+
* @description List Plugin (OL, UL)
|
|
7
|
+
*/
|
|
8
|
+
class List extends EditorInjector {
|
|
9
|
+
static key = 'list';
|
|
10
|
+
static type = 'dropdown';
|
|
11
|
+
static className = 'se-icon-flip-rtl';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @constructor
|
|
15
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
16
|
+
*/
|
|
17
|
+
constructor(editor) {
|
|
18
|
+
// plugin bisic properties
|
|
19
|
+
super(editor);
|
|
20
|
+
this.title = this.lang.list;
|
|
21
|
+
this.icon = 'list_numbered';
|
|
22
|
+
|
|
23
|
+
// create HTML
|
|
24
|
+
const menu = CreateHTML(editor);
|
|
25
|
+
|
|
26
|
+
// members
|
|
27
|
+
this.listItems = menu.querySelectorAll('li button');
|
|
28
|
+
this.icons = {
|
|
29
|
+
bulleted: editor.icons.list_bulleted,
|
|
30
|
+
numbered: editor.icons.list_numbered
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// init
|
|
34
|
+
this.menu.initDropdownTarget(List, menu);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @editorMethod Editor.EventManager
|
|
39
|
+
* @description Executes the method that is called whenever the cursor position changes.
|
|
40
|
+
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
41
|
+
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
42
|
+
* @returns {boolean} - Whether the plugin is active
|
|
43
|
+
* - If it returns "undefined", it will no longer be called in this scope.
|
|
44
|
+
*/
|
|
45
|
+
active(element, target) {
|
|
46
|
+
const icon = target.firstElementChild;
|
|
47
|
+
|
|
48
|
+
if (dom.check.isList(element)) {
|
|
49
|
+
const nodeName = element.nodeName.toLowerCase();
|
|
50
|
+
target.setAttribute('data-focus', nodeName);
|
|
51
|
+
dom.utils.addClass(target, 'active');
|
|
52
|
+
|
|
53
|
+
if (/^ul$/.test(nodeName)) {
|
|
54
|
+
dom.utils.changeElement(icon, this.icons.bulleted);
|
|
55
|
+
} else {
|
|
56
|
+
dom.utils.changeElement(icon, this.icons.numbered);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
target.removeAttribute('data-focus');
|
|
63
|
+
dom.utils.changeElement(icon, this.icons.number);
|
|
64
|
+
dom.utils.removeClass(target, 'active');
|
|
65
|
+
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @editorMethod Modules.Dropdown
|
|
71
|
+
* @description Executes the method that is called when a plugin's dropdown menu is opened.
|
|
72
|
+
* @param {HTMLElement} target Line element at the current cursor position
|
|
73
|
+
*/
|
|
74
|
+
on(target) {
|
|
75
|
+
const currentList = target.getAttribute('data-focus') || '';
|
|
76
|
+
const list = this.listItems;
|
|
77
|
+
for (let i = 0, len = list.length; i < len; i++) {
|
|
78
|
+
if (currentList === list[i].getAttribute('data-command')) {
|
|
79
|
+
dom.utils.addClass(list[i], 'active');
|
|
80
|
+
} else {
|
|
81
|
+
dom.utils.removeClass(list[i], 'active');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @editorMethod Editor.core
|
|
88
|
+
* @description Executes the main execution method of the plugin.
|
|
89
|
+
* - Called when an item in the "dropdown" menu is clicked.
|
|
90
|
+
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
91
|
+
*/
|
|
92
|
+
action(target) {
|
|
93
|
+
const command = target.getAttribute('data-command');
|
|
94
|
+
const type = target.getAttribute('data-value') || '';
|
|
95
|
+
const range = this.format.applyList(`${command}:${type}`, null, false);
|
|
96
|
+
if (range) this.selection.setRange(range.sc, range.so, range.ec, range.eo);
|
|
97
|
+
|
|
98
|
+
this.menu.dropdownOff();
|
|
99
|
+
this.history.push(false);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function CreateHTML({ lang, icons }) {
|
|
104
|
+
const html = /*html*/ `
|
|
105
|
+
<div class="se-list-inner">
|
|
106
|
+
<ul class="se-list-basic">
|
|
107
|
+
<li>
|
|
108
|
+
<button type="button" class="se-btn se-btn-list se-tooltip se-icon-flip-rtl" data-command="ol" title="${lang.numberedList}" aria-label="${lang.numberedList}">
|
|
109
|
+
${icons.list_numbered}
|
|
110
|
+
</button>
|
|
111
|
+
</li>
|
|
112
|
+
<li>
|
|
113
|
+
<button type="button" class="se-btn se-btn-list se-tooltip se-icon-flip-rtl" data-command="ul" title="${lang.bulletedList}" aria-label="${lang.bulletedList}">
|
|
114
|
+
${icons.list_bulleted}
|
|
115
|
+
</button>
|
|
116
|
+
</li>
|
|
117
|
+
</ul>
|
|
118
|
+
</div>`;
|
|
119
|
+
|
|
120
|
+
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, html);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export default List;
|
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
import EditorInjector from '../../editorInjector';
|
|
2
|
-
import { dom } from '../../helper';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @class
|
|
6
|
-
* @description A plugin to style lines using classes.
|
|
7
|
-
*/
|
|
8
|
-
class ParagraphStyle extends EditorInjector {
|
|
9
|
-
static key = 'paragraphStyle';
|
|
10
|
-
static type = 'dropdown';
|
|
11
|
-
static className = '';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @constructor
|
|
15
|
-
* @param {__se__EditorCore} editor - The root editor instance
|
|
16
|
-
* @param {Object} pluginOptions
|
|
17
|
-
* @param {Array<string|{name: string, class: string, _class: string}>} pluginOptions.items - Paragraph item list
|
|
18
|
-
* @example
|
|
19
|
-
* use default paragraph styles
|
|
20
|
-
* ['spaced', 'bordered', 'neon']
|
|
21
|
-
* custom paragraph styles
|
|
22
|
-
[
|
|
23
|
-
{ name: 'spaced', class: '__se__p-spaced', _class: '' },
|
|
24
|
-
{ name: 'bordered', class: '__se__p-bordered', _class: '' },
|
|
25
|
-
{ name: 'neon', class: '__se__p-neon', _class: ''}
|
|
26
|
-
]
|
|
27
|
-
*/
|
|
28
|
-
constructor(editor, pluginOptions) {
|
|
29
|
-
// plugin bisic properties
|
|
30
|
-
super(editor);
|
|
31
|
-
this.title = this.lang.paragraphStyle;
|
|
32
|
-
this.icon = 'paragraph_style';
|
|
33
|
-
|
|
34
|
-
// create HTML
|
|
35
|
-
const menu = CreateHTML(editor, pluginOptions.items);
|
|
36
|
-
|
|
37
|
-
// members
|
|
38
|
-
this.classList = menu.querySelectorAll('li button');
|
|
39
|
-
|
|
40
|
-
// init
|
|
41
|
-
this.menu.initDropdownTarget(ParagraphStyle, menu);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* @editorMethod Modules.Dropdown
|
|
46
|
-
* @description Executes the method that is called when a plugin's dropdown menu is opened.
|
|
47
|
-
*/
|
|
48
|
-
on() {
|
|
49
|
-
const paragraphList = this.classList;
|
|
50
|
-
const currentFormat = this.format.getLine(this.selection.getNode());
|
|
51
|
-
|
|
52
|
-
for (let i = 0, len = paragraphList.length; i < len; i++) {
|
|
53
|
-
if (dom.utils.hasClass(currentFormat, paragraphList[i].getAttribute('data-command'))) {
|
|
54
|
-
dom.utils.addClass(paragraphList[i], 'active');
|
|
55
|
-
} else {
|
|
56
|
-
dom.utils.removeClass(paragraphList[i], 'active');
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* @editorMethod Editor.core
|
|
63
|
-
* @description Executes the main execution method of the plugin.
|
|
64
|
-
* - Called when an item in the "dropdown" menu is clicked.
|
|
65
|
-
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
66
|
-
*/
|
|
67
|
-
action(target) {
|
|
68
|
-
const value = target.getAttribute('data-command');
|
|
69
|
-
let selectedFormsts = this.format.getLines();
|
|
70
|
-
if (selectedFormsts.length === 0) {
|
|
71
|
-
this.selection.getRangeAndAddLine(this.selection.getRange(), null);
|
|
72
|
-
selectedFormsts = this.format.getLines();
|
|
73
|
-
if (selectedFormsts.length === 0) return;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// change format class
|
|
77
|
-
const toggleClass = dom.utils.hasClass(target, 'active') ? dom.utils.removeClass : dom.utils.addClass;
|
|
78
|
-
for (let i = 0, len = selectedFormsts.length; i < len; i++) {
|
|
79
|
-
toggleClass(selectedFormsts[i], value);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
this.menu.dropdownOff();
|
|
83
|
-
this.history.push(false);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function CreateHTML({ lang }, items) {
|
|
88
|
-
const defaultList = {
|
|
89
|
-
spaced: {
|
|
90
|
-
name: lang.menu_spaced,
|
|
91
|
-
class: '__se__p-spaced',
|
|
92
|
-
_class: ''
|
|
93
|
-
},
|
|
94
|
-
bordered: {
|
|
95
|
-
name: lang.menu_bordered,
|
|
96
|
-
class: '__se__p-bordered',
|
|
97
|
-
_class: ''
|
|
98
|
-
},
|
|
99
|
-
neon: {
|
|
100
|
-
name: lang.menu_neon,
|
|
101
|
-
class: '__se__p-neon',
|
|
102
|
-
_class: ''
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
const paragraphStyles = !items || items.length === 0 ? ['spaced', 'bordered', 'neon'] : items;
|
|
106
|
-
|
|
107
|
-
let list = /*html*/ `
|
|
108
|
-
<div class="se-list-inner">
|
|
109
|
-
<ul class="se-list-basic">`;
|
|
110
|
-
|
|
111
|
-
for (let i = 0, len = paragraphStyles.length, p, name, attrs, _class; i < len; i++) {
|
|
112
|
-
p = paragraphStyles[i];
|
|
113
|
-
|
|
114
|
-
if (typeof p === 'string') {
|
|
115
|
-
const cssText = defaultList[p.toLowerCase()];
|
|
116
|
-
if (!cssText) continue;
|
|
117
|
-
p = cssText;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
name = p.name;
|
|
121
|
-
attrs = p.class ? ` class="${p.class}"` : '';
|
|
122
|
-
_class = p._class;
|
|
123
|
-
|
|
124
|
-
list += /*html*/ `
|
|
125
|
-
<li>
|
|
126
|
-
<button type="button" class="se-btn se-btn-list${_class ? ' ' + _class : ''}" data-command="${p.class}" title="${name}" aria-label="${name}">
|
|
127
|
-
<div${attrs}>${name}</div>
|
|
128
|
-
</button>
|
|
129
|
-
</li>`;
|
|
130
|
-
}
|
|
131
|
-
list += /*html*/ `
|
|
132
|
-
</ul>
|
|
133
|
-
</div>`;
|
|
134
|
-
|
|
135
|
-
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export default ParagraphStyle;
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { dom } from '../../helper';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @class
|
|
6
|
+
* @description A plugin to style lines using classes.
|
|
7
|
+
*/
|
|
8
|
+
class ParagraphStyle extends EditorInjector {
|
|
9
|
+
static key = 'paragraphStyle';
|
|
10
|
+
static type = 'dropdown';
|
|
11
|
+
static className = '';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @constructor
|
|
15
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
16
|
+
* @param {Object} pluginOptions
|
|
17
|
+
* @param {Array<string|{name: string, class: string, _class: string}>} pluginOptions.items - Paragraph item list
|
|
18
|
+
* @example
|
|
19
|
+
* use default paragraph styles
|
|
20
|
+
* ['spaced', 'bordered', 'neon']
|
|
21
|
+
* custom paragraph styles
|
|
22
|
+
[
|
|
23
|
+
{ name: 'spaced', class: '__se__p-spaced', _class: '' },
|
|
24
|
+
{ name: 'bordered', class: '__se__p-bordered', _class: '' },
|
|
25
|
+
{ name: 'neon', class: '__se__p-neon', _class: ''}
|
|
26
|
+
]
|
|
27
|
+
*/
|
|
28
|
+
constructor(editor, pluginOptions) {
|
|
29
|
+
// plugin bisic properties
|
|
30
|
+
super(editor);
|
|
31
|
+
this.title = this.lang.paragraphStyle;
|
|
32
|
+
this.icon = 'paragraph_style';
|
|
33
|
+
|
|
34
|
+
// create HTML
|
|
35
|
+
const menu = CreateHTML(editor, pluginOptions.items);
|
|
36
|
+
|
|
37
|
+
// members
|
|
38
|
+
this.classList = menu.querySelectorAll('li button');
|
|
39
|
+
|
|
40
|
+
// init
|
|
41
|
+
this.menu.initDropdownTarget(ParagraphStyle, menu);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @editorMethod Modules.Dropdown
|
|
46
|
+
* @description Executes the method that is called when a plugin's dropdown menu is opened.
|
|
47
|
+
*/
|
|
48
|
+
on() {
|
|
49
|
+
const paragraphList = this.classList;
|
|
50
|
+
const currentFormat = this.format.getLine(this.selection.getNode());
|
|
51
|
+
|
|
52
|
+
for (let i = 0, len = paragraphList.length; i < len; i++) {
|
|
53
|
+
if (dom.utils.hasClass(currentFormat, paragraphList[i].getAttribute('data-command'))) {
|
|
54
|
+
dom.utils.addClass(paragraphList[i], 'active');
|
|
55
|
+
} else {
|
|
56
|
+
dom.utils.removeClass(paragraphList[i], 'active');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @editorMethod Editor.core
|
|
63
|
+
* @description Executes the main execution method of the plugin.
|
|
64
|
+
* - Called when an item in the "dropdown" menu is clicked.
|
|
65
|
+
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
66
|
+
*/
|
|
67
|
+
action(target) {
|
|
68
|
+
const value = target.getAttribute('data-command');
|
|
69
|
+
let selectedFormsts = this.format.getLines();
|
|
70
|
+
if (selectedFormsts.length === 0) {
|
|
71
|
+
this.selection.getRangeAndAddLine(this.selection.getRange(), null);
|
|
72
|
+
selectedFormsts = this.format.getLines();
|
|
73
|
+
if (selectedFormsts.length === 0) return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// change format class
|
|
77
|
+
const toggleClass = dom.utils.hasClass(target, 'active') ? dom.utils.removeClass : dom.utils.addClass;
|
|
78
|
+
for (let i = 0, len = selectedFormsts.length; i < len; i++) {
|
|
79
|
+
toggleClass(selectedFormsts[i], value);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
this.menu.dropdownOff();
|
|
83
|
+
this.history.push(false);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function CreateHTML({ lang }, items) {
|
|
88
|
+
const defaultList = {
|
|
89
|
+
spaced: {
|
|
90
|
+
name: lang.menu_spaced,
|
|
91
|
+
class: '__se__p-spaced',
|
|
92
|
+
_class: ''
|
|
93
|
+
},
|
|
94
|
+
bordered: {
|
|
95
|
+
name: lang.menu_bordered,
|
|
96
|
+
class: '__se__p-bordered',
|
|
97
|
+
_class: ''
|
|
98
|
+
},
|
|
99
|
+
neon: {
|
|
100
|
+
name: lang.menu_neon,
|
|
101
|
+
class: '__se__p-neon',
|
|
102
|
+
_class: ''
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const paragraphStyles = !items || items.length === 0 ? ['spaced', 'bordered', 'neon'] : items;
|
|
106
|
+
|
|
107
|
+
let list = /*html*/ `
|
|
108
|
+
<div class="se-list-inner">
|
|
109
|
+
<ul class="se-list-basic">`;
|
|
110
|
+
|
|
111
|
+
for (let i = 0, len = paragraphStyles.length, p, name, attrs, _class; i < len; i++) {
|
|
112
|
+
p = paragraphStyles[i];
|
|
113
|
+
|
|
114
|
+
if (typeof p === 'string') {
|
|
115
|
+
const cssText = defaultList[p.toLowerCase()];
|
|
116
|
+
if (!cssText) continue;
|
|
117
|
+
p = cssText;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
name = p.name;
|
|
121
|
+
attrs = p.class ? ` class="${p.class}"` : '';
|
|
122
|
+
_class = p._class;
|
|
123
|
+
|
|
124
|
+
list += /*html*/ `
|
|
125
|
+
<li>
|
|
126
|
+
<button type="button" class="se-btn se-btn-list${_class ? ' ' + _class : ''}" data-command="${p.class}" title="${name}" aria-label="${name}">
|
|
127
|
+
<div${attrs}>${name}</div>
|
|
128
|
+
</button>
|
|
129
|
+
</li>`;
|
|
130
|
+
}
|
|
131
|
+
list += /*html*/ `
|
|
132
|
+
</ul>
|
|
133
|
+
</div>`;
|
|
134
|
+
|
|
135
|
+
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export default ParagraphStyle;
|