suneditor
Version:
Pure JavaScript based WYSIWYG web editor
134 lines (108 loc) • 4.13 kB
JavaScript
/*
* wysiwyg web editor
*
* suneditor.js
* Copyright 2017 JiHong Lee.
* MIT license.
*/
'use strict';
export default {
name: 'paragraphStyle',
display: 'submenu',
add: function (core, targetElement) {
const context = core.context;
context.paragraphStyle = {
_classList: null
};
/** set submenu */
let listDiv = this.setSubmenu.call(core);
/** add event listeners */
listDiv.querySelector('ul').addEventListener('click', this.pickUp.bind(core));
context.paragraphStyle._classList = listDiv.querySelectorAll('li button');
/** append target button menu */
core.initMenuTarget(this.name, targetElement, listDiv);
/** empty memory */
listDiv = null;
},
setSubmenu: function () {
const option = this.context.option;
const listDiv = this.util.createElement('DIV');
listDiv.className = 'se-submenu se-list-layer';
const menuLang = this.lang.menu;
const defaultList = {
spaced: {
name: menuLang.spaced,
class: '__se__p-spaced',
_class: ''
},
bordered: {
name: menuLang.bordered,
class: '__se__p-bordered',
_class: ''
},
neon: {
name: menuLang.neon,
class: '__se__p-neon',
_class: ''
}
};
const paragraphStyles = !option.paragraphStyles || option.paragraphStyles.length === 0 ? ['spaced', 'bordered', 'neon'] : option.paragraphStyles;
let list = '<div class="se-list-inner"><ul class="se-list-basic se-list-format">';
for (let i = 0, len = paragraphStyles.length, p, name, attrs, _class; i < len; i++) {
p = paragraphStyles[i];
if (typeof p === 'string') {
const defaultStyle = defaultList[p.toLowerCase()];
if (!defaultStyle) continue;
p = defaultStyle;
}
name = p.name;
attrs = p.class ? ' class="' + p.class + '"' : '';
_class = p._class;
list += '<li>' +
'<button type="button" class="se-btn-list' + (_class ? ' ' + _class: '') + '" data-value="' + p.class + '" title="' + name + '">' +
'<div' + attrs + '>' + name + '</div>' +
'</button></li>';
}
list += '</ul></div>';
listDiv.innerHTML = list;
return listDiv;
},
/**
* @overriding submenu
*/
on: function () {
const paragraphContext = this.context.paragraphStyle;
const paragraphList = paragraphContext._classList;
const currentFormat = this.util.getFormatElement(this.getSelectionNode());
for (let i = 0, len = paragraphList.length; i < len; i++) {
if (this.util.hasClass(currentFormat, paragraphList[i].getAttribute('data-value'))) {
this.util.addClass(paragraphList[i], 'active');
} else {
this.util.removeClass(paragraphList[i], 'active');
}
}
},
pickUp: function (e) {
e.preventDefault();
e.stopPropagation();
let target = e.target;
let value = null;
while (!/^UL$/i.test(target.tagName)) {
value = target.getAttribute('data-value');
if (value) break;
target = target.parentNode;
}
if (!value) return;
let selectedFormsts = this.getSelectedElements();
if (selectedFormsts.length === 0) return;
// change format class
const toggleClass = this.util.hasClass(target, 'active') ? this.util.removeClass.bind(this.util) : this.util.addClass.bind(this.util);
selectedFormsts = this.getSelectedElements();
for (let i = 0, len = selectedFormsts.length; i < len; i++) {
toggleClass(selectedFormsts[i], value);
}
this.submenuOff();
// history stack
this.history.push(false);
}
};