mediawiki-extensions-Visual.../modules/ve/ui/ve.ui.TriggerRegistry.js
Ed Sanders 20063995b2 Add shortcut commands for underline & sub/superscript.
Underline is particularly important as CE will apply underline
formatting automatically when you press Ctrl+U but the
SurfaceObserver will not notice it, leading to inconsistency
between the view and the model.

For sub/superscript I've used the Google Docs key mappings as these
appear to have the fewest conflicts with existing browser shortcuts
and there isn't much consistency between desktop clients anyway
(Word and Open/LibreOffice use completely different shortcuts).

Bonus: reordered command lists to be consistent with UI layout.
Change-Id: I92998e42f9bcfb932d44e8f483811efd538e5981
2013-11-08 13:55:08 +00:00

124 lines
4.1 KiB
JavaScript

/*!
* VisualEditor UserInterface TriggerRegistry class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* Trigger registry.
*
* @class
* @extends OO.Registry
* @constructor
*/
ve.ui.TriggerRegistry = function VeUiTriggerRegistry() {
// Parent constructor
OO.Registry.call( this );
};
/* Inheritance */
OO.inheritClass( ve.ui.TriggerRegistry, OO.Registry );
/* Methods */
/**
* Register a constructor with the factory.
*
* The only supported platforms are 'mac' and 'pc'. All platforms not identified as 'mac' will be
* considered to be 'pc', including 'win', 'linux', 'solaris', etc.
*
* @method
* @param {string|string[]} name Symbolic name or list of symbolic names
* @param {ve.ui.Trigger|Object} trigger Trigger object, or map of trigger objects keyed by
* platform name e.g. 'mac' or 'pc'
*/
ve.ui.TriggerRegistry.prototype.register = function ( name, trigger ) {
var platform = ve.init.platform.getSystemPlatform(),
platformKey = platform === 'mac' ? 'mac' : 'pc';
// Validate arguments
if ( !( trigger instanceof ve.ui.Trigger ) && !ve.isPlainObject( trigger ) ) {
throw new Error(
'trigger must be an instance of ve.ui.Trigger or an object containing instances of ' +
've.ui.Trigger, cannot be a ' + typeof trigger
);
}
// Check for platform-specific trigger
if ( ve.isPlainObject( trigger ) ) {
// Only register if the current platform is supported
if ( platformKey in trigger ) {
OO.Registry.prototype.register.call( this, name, trigger[platformKey] );
}
} else {
OO.Registry.prototype.register.call( this, name, trigger );
}
};
/* Initialization */
ve.ui.triggerRegistry = new ve.ui.TriggerRegistry();
/* Registrations */
ve.ui.triggerRegistry.register(
'undo', { 'mac': new ve.ui.Trigger( 'cmd+z' ), 'pc': new ve.ui.Trigger( 'ctrl+z' ) }
);
ve.ui.triggerRegistry.register(
'redo', { 'mac': new ve.ui.Trigger( 'cmd+shift+z' ), 'pc': new ve.ui.Trigger( 'ctrl+shift+z' ) }
);
ve.ui.triggerRegistry.register(
'bold', { 'mac': new ve.ui.Trigger( 'cmd+b' ), 'pc': new ve.ui.Trigger( 'ctrl+b' ) }
);
ve.ui.triggerRegistry.register(
'italic', { 'mac': new ve.ui.Trigger( 'cmd+i' ), 'pc': new ve.ui.Trigger( 'ctrl+i' ) }
);
ve.ui.triggerRegistry.register(
'link', { 'mac': new ve.ui.Trigger( 'cmd+k' ), 'pc': new ve.ui.Trigger( 'ctrl+k' ) }
);
ve.ui.triggerRegistry.register(
'clear', { 'mac': new ve.ui.Trigger( 'cmd+\\' ), 'pc': new ve.ui.Trigger( 'ctrl+\\' ) }
);
ve.ui.triggerRegistry.register(
'underline', { 'mac': new ve.ui.Trigger( 'cmd+u' ), 'pc': new ve.ui.Trigger( 'ctrl+u' ) }
);
ve.ui.triggerRegistry.register(
'subscript', { 'mac': new ve.ui.Trigger( 'cmd+,' ), 'pc': new ve.ui.Trigger( 'ctrl+,' ) }
);
ve.ui.triggerRegistry.register(
'superscript', { 'mac': new ve.ui.Trigger( 'cmd+.' ), 'pc': new ve.ui.Trigger( 'ctrl+.' ) }
);
ve.ui.triggerRegistry.register(
'indent', new ve.ui.Trigger( 'tab' )
);
ve.ui.triggerRegistry.register(
'outdent', new ve.ui.Trigger( 'shift+tab' )
);
// Ctrl+0-7 below are not mapped to Cmd+0-7 on Mac because Chrome reserves those for switching tabs
ve.ui.triggerRegistry.register(
'paragraph', { 'mac': new ve.ui.Trigger( 'ctrl+0' ), 'pc': new ve.ui.Trigger ( 'ctrl+0' ) }
);
ve.ui.triggerRegistry.register(
'heading1', { 'mac': new ve.ui.Trigger( 'ctrl+1' ), 'pc': new ve.ui.Trigger ( 'ctrl+1' ) }
);
ve.ui.triggerRegistry.register(
'heading2', { 'mac': new ve.ui.Trigger( 'ctrl+2' ), 'pc': new ve.ui.Trigger ( 'ctrl+2' ) }
);
ve.ui.triggerRegistry.register(
'heading3', { 'mac': new ve.ui.Trigger( 'ctrl+3' ), 'pc': new ve.ui.Trigger ( 'ctrl+3' ) }
);
ve.ui.triggerRegistry.register(
'heading4', { 'mac': new ve.ui.Trigger( 'ctrl+4' ), 'pc': new ve.ui.Trigger ( 'ctrl+4' ) }
);
ve.ui.triggerRegistry.register(
'heading5', { 'mac': new ve.ui.Trigger( 'ctrl+5' ), 'pc': new ve.ui.Trigger ( 'ctrl+5' ) }
);
ve.ui.triggerRegistry.register(
'heading6', { 'mac': new ve.ui.Trigger( 'ctrl+6' ), 'pc': new ve.ui.Trigger ( 'ctrl+6' ) }
);
ve.ui.triggerRegistry.register(
'preformatted', { 'mac': new ve.ui.Trigger( 'ctrl+7' ), 'pc': new ve.ui.Trigger ( 'ctrl+7' ) }
);