jodit
Version:
Jodit is awesome and usefully wysiwyg editor with filebrowser
205 lines (182 loc) • 5.07 kB
text/typescript
/*!
* Jodit Editor (https://xdsoft.net/jodit/)
* Licensed under GNU General Public License version 2 or later or a commercial license or MIT;
* For GPL see LICENSE-GPL.txt in the project root for license information.
* For MIT see LICENSE-MIT.txt in the project root for license information.
* For commercial licenses see https://xdsoft.net/jodit/commercial/
* Copyright (c) 2013-2019 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
*/
import { Config } from '../Config';
import * as consts from '../constants';
import { Dom } from '../modules/Dom';
import { HTMLTagNames, IJodit, markerInfo } from '../types';
import { IControlType } from '../types/toolbar';
Config.prototype.controls.paragraph = {
command: 'formatBlock',
getLabel: (editor: IJodit, btn, button): boolean => {
const current: Node | false = editor.selection.current();
if (current && editor.options.textIcons) {
const currentBox: HTMLElement =
(Dom.closest(
current,
node => Dom.isBlock(node, editor.editorWindow),
editor.editor
) as HTMLElement) || editor.editor,
currentValue: string = currentBox.nodeName.toLowerCase(),
list = (btn.list as any);
if (
button &&
btn.data &&
btn.data.currentValue !== currentValue &&
btn.list &&
list[currentValue]
) {
button.textBox.innerHTML = `<span>${
editor.i18n(list[currentValue])
}</span>`;
(button.textBox.firstChild as HTMLElement).classList.add(
'jodit_icon'
);
btn.data.currentValue = currentValue;
}
}
return false;
},
exec: (editor: IJodit, event, control: IControlType) => {
editor.execCommand(
control.command as string,
false,
control.args ? control.args[0] : undefined
);
},
data: {
currentValue: 'left'
},
list: {
p: 'Normal',
h1: 'Heading 1',
h2: 'Heading 2',
h3: 'Heading 3',
h4: 'Heading 4',
blockquote: 'Quote'
},
isActiveChild: (editor: IJodit, control: IControlType): boolean => {
const current: Node | false = editor.selection.current();
if (current) {
const currentBox: HTMLElement = Dom.closest(
current,
node => Dom.isBlock(node, editor.editorWindow),
editor.editor
) as HTMLElement;
return (
currentBox &&
currentBox !== editor.editor &&
control.args !== undefined &&
currentBox.nodeName.toLowerCase() === control.args[0]
);
}
return false;
},
isActive: (editor: IJodit, control: IControlType): boolean => {
const current: Node | false = editor.selection.current();
if (current) {
const currentBpx: HTMLElement = Dom.closest(
current,
node => Dom.isBlock(node, editor.editorWindow),
editor.editor
) as HTMLElement;
return (
currentBpx &&
currentBpx !== editor.editor &&
control.list !== undefined &&
currentBpx.nodeName.toLowerCase() !== 'p' &&
((control.list as any)[
currentBpx.nodeName.toLowerCase()
] as any) !== undefined
);
}
return false;
},
template: (editor: IJodit, key: string, value: string) => {
return (
'<' +
key +
' class="jodit_list_element"><span>' +
editor.i18n(value) +
'</span></' +
key +
'></li>'
);
},
tooltip: 'Insert format block'
} as IControlType;
/**
* Process command - `formatblock`
*
* @param {Jodit} editor
*/
export function formatBlock(editor: IJodit) {
editor.registerCommand(
'formatblock',
(command: string, second: string, third: string): false | void => {
editor.selection.focus();
let work: boolean = false;
editor.selection.eachSelection((current: Node) => {
const selectionInfo: markerInfo[] = editor.selection.save();
let currentBox: HTMLElement | false = current
? (Dom.up(
current,
node => Dom.isBlock(node, editor.editorWindow),
editor.editor
) as HTMLElement)
: false;
if ((!currentBox || currentBox.nodeName === 'LI') && current) {
currentBox = Dom.wrapInline(
current,
editor.options.enter,
editor
);
}
if (!currentBox) {
editor.selection.restore(selectionInfo);
return;
}
if (!currentBox.tagName.match(/TD|TH|TBODY|TABLE|THEAD/i)) {
if (
third === editor.options.enterBlock.toLowerCase() &&
currentBox.parentNode &&
currentBox.parentNode.nodeName === 'LI'
) {
Dom.unwrap(currentBox);
} else {
Dom.replace(
currentBox,
third,
true,
false,
editor.editorDocument
);
}
} else {
if (!editor.selection.isCollapsed()) {
editor.selection.applyCSS({}, <HTMLTagNames>third);
} else {
Dom.wrapInline(current, <HTMLTagNames>third, editor);
}
}
work = true;
editor.selection.restore(selectionInfo);
});
if (!work) {
const currentBox: HTMLElement = editor.editorDocument.createElement(
third
);
currentBox.innerHTML = consts.INVISIBLE_SPACE;
editor.selection.insertNode(currentBox, false);
editor.selection.setCursorIn(currentBox);
}
editor.setEditorValue();
return false;
}
);
}