UNPKG

jodit

Version:

Jodit is an awesome and useful wysiwyg editor with filebrowser

145 lines (144 loc) 4.36 kB
/*! * Jodit Editor (https://xdsoft.net/jodit/) * Released under MIT see LICENSE.txt in the project root for license information. * Copyright (c) 2013-2025 Valeriy Chupurnov. All rights reserved. https://xdsoft.net */ import { KEY_ESC } from "../../core/constants.js"; import { pluginSystem } from "../../core/global.js"; import { isArray, isString, keys, normalizeKeyAliases } from "../../core/helpers/index.js"; import { Plugin } from "../../core/plugin/index.js"; import "./config.js"; /** * Allow set hotkey for command or button */ export class hotkeys extends Plugin { constructor() { super(...arguments); this.onKeyPress = (event) => { const special = this.specialKeys[event.which]; const character = (event.key || String.fromCharCode(event.which)).toLowerCase(); const modif = [special || character]; ['alt', 'ctrl', 'shift', 'meta'].forEach(specialKey => { if (event[specialKey + 'Key'] && special !== specialKey) { modif.push(specialKey); } }); return normalizeKeyAliases(modif.join('+')); }; this.specialKeys = { 8: 'backspace', 9: 'tab', 10: 'return', 13: 'return', 16: 'shift', 17: 'ctrl', 18: 'alt', 19: 'pause', 20: 'capslock', 27: 'esc', 32: 'space', 33: 'pageup', 34: 'pagedown', 35: 'end', 36: 'home', 37: 'left', 38: 'up', 39: 'right', 40: 'down', 45: 'insert', 46: 'del', 59: ';', 61: '=', 91: 'meta', 96: '0', 97: '1', 98: '2', 99: '3', 100: '4', 101: '5', 102: '6', 103: '7', 104: '8', 105: '9', 106: '*', 107: '+', 109: '-', 110: '.', 111: '/', 112: 'f1', 113: 'f2', 114: 'f3', 115: 'f4', 116: 'f5', 117: 'f6', 118: 'f7', 119: 'f8', 120: 'f9', 121: 'f10', 122: 'f11', 123: 'f12', 144: 'numlock', 145: 'scroll', 173: '-', 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', 219: '[', 220: '\\', 221: ']', 222: "'" }; } /** @override */ afterInit(editor) { keys(editor.o.commandToHotkeys, false).forEach((commandName) => { const shortcuts = editor.o.commandToHotkeys[commandName]; if (shortcuts && (isArray(shortcuts) || isString(shortcuts))) { editor.registerHotkeyToCommand(shortcuts, commandName); } }); let itIsHotkey = false; editor.e .off('.hotkeys') .on([editor.ow, editor.ew], 'keydown.hotkeys', (e) => { if (e.key === KEY_ESC) { return this.j.e.fire('escape', e); } }) .on('keydown.hotkeys', (event) => { const shortcut = this.onKeyPress(event); const stop = { shouldStop: true }; const resultOfFire = this.j.e.fire(shortcut + '.hotkey', event.type, stop); if (resultOfFire === false) { if (stop.shouldStop) { itIsHotkey = true; editor.e.stopPropagation('keydown'); return false; } else { event.preventDefault(); } } }, { top: true }) .on('keyup.hotkeys', () => { if (itIsHotkey) { itIsHotkey = false; editor.e.stopPropagation('keyup'); return false; } }, { top: true }); } /** @override */ beforeDestruct(jodit) { if (jodit.events) { jodit.e.off('.hotkeys'); } } } pluginSystem.add('hotkeys', hotkeys);