diff --git a/extension.json b/extension.json index 0fc6450e..a3c20fd0 100644 --- a/extension.json +++ b/extension.json @@ -246,6 +246,7 @@ ], "dependencies": [ "mediawiki.cookie", + "jquery.client", "jquery.textSelection", "jquery.ui", "mediawiki.api", diff --git a/modules/jquery.wikiEditor.dialogs.config.js b/modules/jquery.wikiEditor.dialogs.config.js index b535468f..c92eab71 100644 --- a/modules/jquery.wikiEditor.dialogs.config.js +++ b/modules/jquery.wikiEditor.dialogs.config.js @@ -42,7 +42,8 @@ module.exports = { action: { type: 'dialog', module: 'insert-link' - } + }, + hotkey: 75 // K }, file: { label: mw.msg( 'wikieditor-toolbar-tool-file' ), diff --git a/modules/jquery.wikiEditor.toolbar.config.js b/modules/jquery.wikiEditor.toolbar.config.js index ea93f643..aca3335d 100644 --- a/modules/jquery.wikiEditor.toolbar.config.js +++ b/modules/jquery.wikiEditor.toolbar.config.js @@ -45,7 +45,8 @@ toolbarConfig = { peri: mw.msg( 'wikieditor-toolbar-tool-bold-example' ), post: "'''" } - } + }, + hotkey: 66 // B }, italic: { section: 'main', @@ -61,7 +62,8 @@ toolbarConfig = { peri: mw.msg( 'wikieditor-toolbar-tool-italic-example' ), post: "''" } - } + }, + hotkey: 73 // I } } }, @@ -206,7 +208,8 @@ toolbarConfig = { peri: mw.msg( 'wikieditor-toolbar-tool-nowiki-example' ), post: '' } - } + }, + hotkey: 220 // Backslash (\) }, newline: { label: mw.msg( 'wikieditor-toolbar-tool-newline' ), @@ -260,7 +263,8 @@ toolbarConfig = { peri: mw.msg( 'wikieditor-toolbar-tool-superscript-example' ), post: '' } - } + }, + hotkey: 190 // Period (.) }, subscript: { label: mw.msg( 'wikieditor-toolbar-tool-subscript' ), @@ -273,7 +277,8 @@ toolbarConfig = { peri: mw.msg( 'wikieditor-toolbar-tool-subscript-example' ), post: '' } - } + }, + hotkey: 188 // Comma (,) } } }, diff --git a/modules/jquery.wikiEditor.toolbar.js b/modules/jquery.wikiEditor.toolbar.js index 91529426..8d69fc03 100644 --- a/modules/jquery.wikiEditor.toolbar.js +++ b/modules/jquery.wikiEditor.toolbar.js @@ -359,6 +359,9 @@ var toolbarModule = { } } ); } + if ( 'hotkey' in tool ) { + toolbarModule.fn.ctrlShortcuts[ tool.hotkey ] = tool; + } } return $button; case 'select': @@ -786,6 +789,23 @@ var toolbarModule = { // Use hook for attaching new toolbar tools to avoid race conditions mw.hook( 'wikiEditor.toolbarReady' ).fire( context.$textarea ); } ); + toolbarModule.fn.setupShortcuts( context ); + }, + ctrlShortcuts: {}, + setupShortcuts: function ( context ) { + var platform = $.client.profile().platform; + var platformModifier = platform === 'mac' ? 'metaKey' : 'ctrlKey'; + var otherModifier = platform === 'mac' ? 'ctrlKey' : 'metaKey'; + + context.$textarea.on( 'keydown', function ( e ) { + // Check if the primary modifier key is pressed and that others aren't + var target = e[ platformModifier ] && !e[ otherModifier ] && !e.altKey && !e.shiftKey && + toolbarModule.fn.ctrlShortcuts[ e.which ]; + if ( target ) { + e.preventDefault(); + toolbarModule.fn.doAction( context, target.action ); + } + } ); }, handleKeyDown: function ( $element, event, $parent ) { var $currentItem = $element.find( '.wikiEditor-character-highlighted' ),