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,83 +1,83 @@
|
|
|
1
|
-
import EditorInjector from '../../editorInjector';
|
|
2
|
-
import { dom } from '../../helper';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @class
|
|
6
|
-
* @description Template Plugin, Apply a template to the selection.
|
|
7
|
-
*/
|
|
8
|
-
class Template extends EditorInjector {
|
|
9
|
-
static key = 'template';
|
|
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<{name: string, html: string}>} pluginOptions.items - Template list
|
|
18
|
-
*/
|
|
19
|
-
constructor(editor, pluginOptions) {
|
|
20
|
-
// plugin bisic properties
|
|
21
|
-
super(editor);
|
|
22
|
-
this.title = this.lang.template;
|
|
23
|
-
this.icon = 'template';
|
|
24
|
-
|
|
25
|
-
// members
|
|
26
|
-
this.selectedIndex = -1;
|
|
27
|
-
this.items = pluginOptions.items;
|
|
28
|
-
|
|
29
|
-
// create HTML
|
|
30
|
-
const menu = CreateHTML(this.items);
|
|
31
|
-
|
|
32
|
-
// init
|
|
33
|
-
this.menu.initDropdownTarget(Template, menu);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* @editorMethod Editor.core
|
|
38
|
-
* @description Executes the main execution method of the plugin.
|
|
39
|
-
* - Called when an item in the "dropdown" menu is clicked.
|
|
40
|
-
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
41
|
-
*/
|
|
42
|
-
action(target) {
|
|
43
|
-
const index = Number(target.getAttribute('data-value'));
|
|
44
|
-
const temp = this.items[(this.selectedIndex = index)];
|
|
45
|
-
|
|
46
|
-
if (temp.html) {
|
|
47
|
-
this.html.insert(temp.html, { selectInserted: false, skipCharCount: false, skipCleaning: false });
|
|
48
|
-
} else {
|
|
49
|
-
this.menu.dropdownOff();
|
|
50
|
-
throw Error('[SUNEDITOR.template.fail] cause : "templates[i].html not found"');
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
this.menu.dropdownOff();
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function CreateHTML(templateList) {
|
|
58
|
-
if (!templateList || templateList.length === 0) {
|
|
59
|
-
console.warn('[SUNEDITOR.plugins.template.warn] To use the "template" plugin, please define the "templates" option.');
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
let list = '<div class="se-dropdown se-list-inner"><ul class="se-list-basic">';
|
|
63
|
-
for (let i = 0, len = (templateList || []).length, t; i < len; i++) {
|
|
64
|
-
t = templateList[i];
|
|
65
|
-
list += /*html*/ `
|
|
66
|
-
<li>
|
|
67
|
-
<button
|
|
68
|
-
type="button"
|
|
69
|
-
class="se-btn se-btn-list"
|
|
70
|
-
data-value="${i}"
|
|
71
|
-
title="${t.name}"
|
|
72
|
-
aria-label="${t.name}"
|
|
73
|
-
>
|
|
74
|
-
${t.name}
|
|
75
|
-
</button>
|
|
76
|
-
</li>`;
|
|
77
|
-
}
|
|
78
|
-
list += '</ul></div>';
|
|
79
|
-
|
|
80
|
-
return dom.utils.createElement('DIV', { class: 'se-list-layer' }, list);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export default Template;
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { dom } from '../../helper';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @class
|
|
6
|
+
* @description Template Plugin, Apply a template to the selection.
|
|
7
|
+
*/
|
|
8
|
+
class Template extends EditorInjector {
|
|
9
|
+
static key = 'template';
|
|
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<{name: string, html: string}>} pluginOptions.items - Template list
|
|
18
|
+
*/
|
|
19
|
+
constructor(editor, pluginOptions) {
|
|
20
|
+
// plugin bisic properties
|
|
21
|
+
super(editor);
|
|
22
|
+
this.title = this.lang.template;
|
|
23
|
+
this.icon = 'template';
|
|
24
|
+
|
|
25
|
+
// members
|
|
26
|
+
this.selectedIndex = -1;
|
|
27
|
+
this.items = pluginOptions.items;
|
|
28
|
+
|
|
29
|
+
// create HTML
|
|
30
|
+
const menu = CreateHTML(this.items);
|
|
31
|
+
|
|
32
|
+
// init
|
|
33
|
+
this.menu.initDropdownTarget(Template, menu);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @editorMethod Editor.core
|
|
38
|
+
* @description Executes the main execution method of the plugin.
|
|
39
|
+
* - Called when an item in the "dropdown" menu is clicked.
|
|
40
|
+
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
41
|
+
*/
|
|
42
|
+
action(target) {
|
|
43
|
+
const index = Number(target.getAttribute('data-value'));
|
|
44
|
+
const temp = this.items[(this.selectedIndex = index)];
|
|
45
|
+
|
|
46
|
+
if (temp.html) {
|
|
47
|
+
this.html.insert(temp.html, { selectInserted: false, skipCharCount: false, skipCleaning: false });
|
|
48
|
+
} else {
|
|
49
|
+
this.menu.dropdownOff();
|
|
50
|
+
throw Error('[SUNEDITOR.template.fail] cause : "templates[i].html not found"');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
this.menu.dropdownOff();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function CreateHTML(templateList) {
|
|
58
|
+
if (!templateList || templateList.length === 0) {
|
|
59
|
+
console.warn('[SUNEDITOR.plugins.template.warn] To use the "template" plugin, please define the "templates" option.');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let list = '<div class="se-dropdown se-list-inner"><ul class="se-list-basic">';
|
|
63
|
+
for (let i = 0, len = (templateList || []).length, t; i < len; i++) {
|
|
64
|
+
t = templateList[i];
|
|
65
|
+
list += /*html*/ `
|
|
66
|
+
<li>
|
|
67
|
+
<button
|
|
68
|
+
type="button"
|
|
69
|
+
class="se-btn se-btn-list"
|
|
70
|
+
data-value="${i}"
|
|
71
|
+
title="${t.name}"
|
|
72
|
+
aria-label="${t.name}"
|
|
73
|
+
>
|
|
74
|
+
${t.name}
|
|
75
|
+
</button>
|
|
76
|
+
</li>`;
|
|
77
|
+
}
|
|
78
|
+
list += '</ul></div>';
|
|
79
|
+
|
|
80
|
+
return dom.utils.createElement('DIV', { class: 'se-list-layer' }, list);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export default Template;
|
|
@@ -1,149 +1,149 @@
|
|
|
1
|
-
import EditorInjector from '../../editorInjector';
|
|
2
|
-
import { dom } from '../../helper';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @class
|
|
6
|
-
* @description Text style Plugin, Applies a tag that specifies text styles to a selection.
|
|
7
|
-
*/
|
|
8
|
-
class TextStyle extends EditorInjector {
|
|
9
|
-
static key = 'textStyle';
|
|
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<{name: string, html: string}>} pluginOptions.items - Template list
|
|
18
|
-
*/
|
|
19
|
-
constructor(editor, pluginOptions) {
|
|
20
|
-
// plugin bisic properties
|
|
21
|
-
super(editor);
|
|
22
|
-
this.title = this.lang.textStyle;
|
|
23
|
-
this.icon = 'text_style';
|
|
24
|
-
|
|
25
|
-
// create HTML
|
|
26
|
-
const menu = CreateHTML(editor, pluginOptions.items);
|
|
27
|
-
|
|
28
|
-
// members
|
|
29
|
-
this.styleList = menu.querySelectorAll('li button');
|
|
30
|
-
|
|
31
|
-
// init
|
|
32
|
-
this.menu.initDropdownTarget(TextStyle, menu);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* @editorMethod Modules.Dropdown
|
|
37
|
-
* @description Executes the method that is called when a plugin's dropdown menu is opened.
|
|
38
|
-
*/
|
|
39
|
-
on() {
|
|
40
|
-
const styleButtonList = this.styleList;
|
|
41
|
-
const selectionNode = this.selection.getNode();
|
|
42
|
-
|
|
43
|
-
for (let i = 0, len = styleButtonList.length, btn, data, active; i < len; i++) {
|
|
44
|
-
btn = styleButtonList[i];
|
|
45
|
-
data = btn.getAttribute('data-value').split(',');
|
|
46
|
-
|
|
47
|
-
for (let v = 0, node, value; v < data.length; v++) {
|
|
48
|
-
node = selectionNode;
|
|
49
|
-
active = false;
|
|
50
|
-
|
|
51
|
-
while (node && !this.format.isLine(node) && !this.component.is(node)) {
|
|
52
|
-
if (node.nodeName.toLowerCase() === btn.getAttribute('data-command').toLowerCase()) {
|
|
53
|
-
value = data[v];
|
|
54
|
-
if (/^\./.test(value) ? dom.utils.hasClass(node, value.replace(/^\./, '')) : /** @type {HTMLElement} */ (node).style[value]) {
|
|
55
|
-
active = true;
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
node = node.parentNode;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (!active) break;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
active ? dom.utils.addClass(btn, 'active') : dom.utils.removeClass(btn, 'active');
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* @editorMethod Editor.core
|
|
71
|
-
* @description Executes the main execution method of the plugin.
|
|
72
|
-
* - Called when an item in the "dropdown" menu is clicked.
|
|
73
|
-
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
74
|
-
*/
|
|
75
|
-
action(target) {
|
|
76
|
-
const tempElement = /** @type {HTMLElement} */ (target.firstElementChild);
|
|
77
|
-
const checkStyles = tempElement.style.cssText.replace(/:.+(;|$)/g, ',').split(',');
|
|
78
|
-
checkStyles.pop();
|
|
79
|
-
|
|
80
|
-
const classes = tempElement.classList;
|
|
81
|
-
for (let i = 0, len = classes.length; i < len; i++) {
|
|
82
|
-
checkStyles.push('.' + classes[i]);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const newNode = dom.utils.hasClass(target, 'active') ? null : tempElement.cloneNode(false);
|
|
86
|
-
const removeNodes = newNode ? null : [tempElement.nodeName];
|
|
87
|
-
this.format.applyInlineElement(newNode, { stylesToModify: checkStyles, nodesToRemove: removeNodes, strictRemove: true });
|
|
88
|
-
|
|
89
|
-
this.menu.dropdownOff();
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function CreateHTML({ lang }, items) {
|
|
94
|
-
const defaultList = {
|
|
95
|
-
code: {
|
|
96
|
-
name: lang.menu_code,
|
|
97
|
-
class: '__se__t-code',
|
|
98
|
-
tag: 'code'
|
|
99
|
-
},
|
|
100
|
-
shadow: {
|
|
101
|
-
name: lang.menu_shadow,
|
|
102
|
-
class: '__se__t-shadow',
|
|
103
|
-
tag: 'span'
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
const styleList = items || Object.keys(defaultList);
|
|
107
|
-
|
|
108
|
-
let list = '<div class="se-list-inner"><ul class="se-list-basic">';
|
|
109
|
-
for (let i = 0, len = styleList.length, t, tag, name, attrs, command, value; i < len; i++) {
|
|
110
|
-
t = styleList[i];
|
|
111
|
-
attrs = '';
|
|
112
|
-
value = '';
|
|
113
|
-
command = [];
|
|
114
|
-
|
|
115
|
-
if (typeof t === 'string') {
|
|
116
|
-
const cssText = defaultList[t.toLowerCase()];
|
|
117
|
-
if (!cssText) continue;
|
|
118
|
-
t = cssText;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
name = t.name;
|
|
122
|
-
tag = t.tag || 'span';
|
|
123
|
-
|
|
124
|
-
attrs += ` class="${t.class}"`;
|
|
125
|
-
value += `.${t.class.trim().replace(/\s+/g, ',.')}`;
|
|
126
|
-
command.push('class');
|
|
127
|
-
|
|
128
|
-
value = value.replace(/,$/, '');
|
|
129
|
-
|
|
130
|
-
list += `
|
|
131
|
-
<li>
|
|
132
|
-
<button
|
|
133
|
-
type="button"
|
|
134
|
-
class="se-btn se-btn-list"
|
|
135
|
-
data-command="${tag}"
|
|
136
|
-
data-value="${value}"
|
|
137
|
-
title="${name}"
|
|
138
|
-
aria-label="${name}"
|
|
139
|
-
>
|
|
140
|
-
<${tag}${attrs}>${name}</${tag}>
|
|
141
|
-
</button>
|
|
142
|
-
</li>`;
|
|
143
|
-
}
|
|
144
|
-
list += '</ul></div>';
|
|
145
|
-
|
|
146
|
-
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export default TextStyle;
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { dom } from '../../helper';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @class
|
|
6
|
+
* @description Text style Plugin, Applies a tag that specifies text styles to a selection.
|
|
7
|
+
*/
|
|
8
|
+
class TextStyle extends EditorInjector {
|
|
9
|
+
static key = 'textStyle';
|
|
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<{name: string, html: string}>} pluginOptions.items - Template list
|
|
18
|
+
*/
|
|
19
|
+
constructor(editor, pluginOptions) {
|
|
20
|
+
// plugin bisic properties
|
|
21
|
+
super(editor);
|
|
22
|
+
this.title = this.lang.textStyle;
|
|
23
|
+
this.icon = 'text_style';
|
|
24
|
+
|
|
25
|
+
// create HTML
|
|
26
|
+
const menu = CreateHTML(editor, pluginOptions.items);
|
|
27
|
+
|
|
28
|
+
// members
|
|
29
|
+
this.styleList = menu.querySelectorAll('li button');
|
|
30
|
+
|
|
31
|
+
// init
|
|
32
|
+
this.menu.initDropdownTarget(TextStyle, menu);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @editorMethod Modules.Dropdown
|
|
37
|
+
* @description Executes the method that is called when a plugin's dropdown menu is opened.
|
|
38
|
+
*/
|
|
39
|
+
on() {
|
|
40
|
+
const styleButtonList = this.styleList;
|
|
41
|
+
const selectionNode = this.selection.getNode();
|
|
42
|
+
|
|
43
|
+
for (let i = 0, len = styleButtonList.length, btn, data, active; i < len; i++) {
|
|
44
|
+
btn = styleButtonList[i];
|
|
45
|
+
data = btn.getAttribute('data-value').split(',');
|
|
46
|
+
|
|
47
|
+
for (let v = 0, node, value; v < data.length; v++) {
|
|
48
|
+
node = selectionNode;
|
|
49
|
+
active = false;
|
|
50
|
+
|
|
51
|
+
while (node && !this.format.isLine(node) && !this.component.is(node)) {
|
|
52
|
+
if (node.nodeName.toLowerCase() === btn.getAttribute('data-command').toLowerCase()) {
|
|
53
|
+
value = data[v];
|
|
54
|
+
if (/^\./.test(value) ? dom.utils.hasClass(node, value.replace(/^\./, '')) : /** @type {HTMLElement} */ (node).style[value]) {
|
|
55
|
+
active = true;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
node = node.parentNode;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (!active) break;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
active ? dom.utils.addClass(btn, 'active') : dom.utils.removeClass(btn, 'active');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @editorMethod Editor.core
|
|
71
|
+
* @description Executes the main execution method of the plugin.
|
|
72
|
+
* - Called when an item in the "dropdown" menu is clicked.
|
|
73
|
+
* @param {HTMLElement} target - The plugin's toolbar button element
|
|
74
|
+
*/
|
|
75
|
+
action(target) {
|
|
76
|
+
const tempElement = /** @type {HTMLElement} */ (target.firstElementChild);
|
|
77
|
+
const checkStyles = tempElement.style.cssText.replace(/:.+(;|$)/g, ',').split(',');
|
|
78
|
+
checkStyles.pop();
|
|
79
|
+
|
|
80
|
+
const classes = tempElement.classList;
|
|
81
|
+
for (let i = 0, len = classes.length; i < len; i++) {
|
|
82
|
+
checkStyles.push('.' + classes[i]);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const newNode = dom.utils.hasClass(target, 'active') ? null : tempElement.cloneNode(false);
|
|
86
|
+
const removeNodes = newNode ? null : [tempElement.nodeName];
|
|
87
|
+
this.format.applyInlineElement(newNode, { stylesToModify: checkStyles, nodesToRemove: removeNodes, strictRemove: true });
|
|
88
|
+
|
|
89
|
+
this.menu.dropdownOff();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function CreateHTML({ lang }, items) {
|
|
94
|
+
const defaultList = {
|
|
95
|
+
code: {
|
|
96
|
+
name: lang.menu_code,
|
|
97
|
+
class: '__se__t-code',
|
|
98
|
+
tag: 'code'
|
|
99
|
+
},
|
|
100
|
+
shadow: {
|
|
101
|
+
name: lang.menu_shadow,
|
|
102
|
+
class: '__se__t-shadow',
|
|
103
|
+
tag: 'span'
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const styleList = items || Object.keys(defaultList);
|
|
107
|
+
|
|
108
|
+
let list = '<div class="se-list-inner"><ul class="se-list-basic">';
|
|
109
|
+
for (let i = 0, len = styleList.length, t, tag, name, attrs, command, value; i < len; i++) {
|
|
110
|
+
t = styleList[i];
|
|
111
|
+
attrs = '';
|
|
112
|
+
value = '';
|
|
113
|
+
command = [];
|
|
114
|
+
|
|
115
|
+
if (typeof t === 'string') {
|
|
116
|
+
const cssText = defaultList[t.toLowerCase()];
|
|
117
|
+
if (!cssText) continue;
|
|
118
|
+
t = cssText;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
name = t.name;
|
|
122
|
+
tag = t.tag || 'span';
|
|
123
|
+
|
|
124
|
+
attrs += ` class="${t.class}"`;
|
|
125
|
+
value += `.${t.class.trim().replace(/\s+/g, ',.')}`;
|
|
126
|
+
command.push('class');
|
|
127
|
+
|
|
128
|
+
value = value.replace(/,$/, '');
|
|
129
|
+
|
|
130
|
+
list += `
|
|
131
|
+
<li>
|
|
132
|
+
<button
|
|
133
|
+
type="button"
|
|
134
|
+
class="se-btn se-btn-list"
|
|
135
|
+
data-command="${tag}"
|
|
136
|
+
data-value="${value}"
|
|
137
|
+
title="${name}"
|
|
138
|
+
aria-label="${name}"
|
|
139
|
+
>
|
|
140
|
+
<${tag}${attrs}>${name}</${tag}>
|
|
141
|
+
</button>
|
|
142
|
+
</li>`;
|
|
143
|
+
}
|
|
144
|
+
list += '</ul></div>';
|
|
145
|
+
|
|
146
|
+
return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export default TextStyle;
|