exec-command.js revision e57824e27f47a76dae7b14c6ff1c7ed1186d16c1
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Plugin for the frame module to handle execCommands for Editor
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @module editor
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @submodule exec-command
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Plugin for the frame module to handle execCommands for Editor
daeb6d531149c45a2ceb543ae2cf1e56e5235bbeDav Glass * @class Plugin.ExecCommand
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @extends Base
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @constructor
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass var ExecCommand = function() {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass ExecCommand.superclass.constructor.apply(this, arguments);
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * An internal reference to the keyCode of the last key that was pressed.
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @property _lastKey
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * An internal reference to the instance of the frame plugged into.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @property _inst
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Execute a command on the frame's document.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method command
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} action The action to perform (bold, italic, fontname)
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} value The optional value (helvetica)
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {Node/NodeList} Should return the Node/Nodelist affected
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass Y.log('execCommand(' + action + '): "' + value + '"', 'info', 'exec-command');
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * The private version of execCommand that doesn't filter for overrides.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method _command
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} action The action to perform (bold, italic, fontname)
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} value The optional value (helvetica)
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass inst.config.doc.execCommand('styleWithCSS', null, 1);
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass } catch (e1) {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass } catch (e2) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass Y.log('Internal execCommand(' + action + '): "' + value + '"', 'info', 'exec-command');
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass } catch (e) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Get's the instance of YUI bound to the parent frame
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method getInstance
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {YUI} The YUI instance bound to the parent frame
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass getInstance: function() {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass if (!this._inst) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return this._inst;
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass initializer: function() {
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass this.get('host').on('dom:keypress', Y.bind(function(e) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * execCommand
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @property NAME
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @property NS
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Static object literal of execCommand overrides
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @property COMMANDS
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Wraps the content with a new element of type (tag)
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method COMMANDS.wrap
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cmd The command executed: wrap
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} tag The tag to wrap the selection with
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {NodeList} NodeList of the items touched by this command.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Inserts the provided HTML at the cursor, should be a single element.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method COMMANDS.inserthtml
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cmd The command executed: inserthtml
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} html The html to insert
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {Node} Node instance of the item touched by this command.
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass return (new inst.Selection()).insertContent(html);
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * Inserts the provided HTML at the cursor, and focuses the cursor afterwards.
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @method COMMANDS.insertandfocus
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} cmd The command executed: insertandfocus
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} html The html to insert
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @return {Node} Node instance of the item touched by this command.
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass * Inserts a BR at the current cursor position
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass * @method COMMANDS.insertbr
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass * @param {String} cmd The command executed: insertbr
0db84e0da684308b0fd9ea9b5906c11bafa7a246Dav Glass return ((cur && cur.previous) ? cur.previous() : null);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Inserts an image at the cursor position
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method COMMANDS.insertimage
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cmd The command executed: insertimage
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} img The url of the image to be inserted
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {Node} Node instance of the item touched by this command.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return this.command('inserthtml', '<img src="' + img + '">');
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Add a class to all of the elements in the selection
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method COMMANDS.addclass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cmd The command executed: addclass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cls The className to add
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {NodeList} NodeList of the items touched by this command.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return (new inst.Selection()).getSelected().addClass(cls);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Remove a class from all of the elements in the selection
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method COMMANDS.removeclass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cmd The command executed: removeclass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cls The className to remove
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {NodeList} NodeList of the items touched by this command.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return (new inst.Selection()).getSelected().removeClass(cls);
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * Adds a forecolor to the current selection, or creates a new element and applies it
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @method COMMANDS.forecolor
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @param {String} cmd The command executed: forecolor
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} val The color value to apply
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @return {NodeList} NodeList of the items touched by this command.
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass if (sel.anchorNode && (sel.anchorNode.get('innerHTML') === ' ')) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass n = this.command('inserthtml', '<span style="color: ' + val + '">' + inst.Selection.CURSOR + '</span>');
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * Adds a background color to the current selection, or creates a new element and applies it
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @method COMMANDS.backcolor
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @param {String} cmd The command executed: backcolor
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @param {String} val The color value to apply
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @return {NodeList} NodeList of the items touched by this command.
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass if (sel.anchorNode && (sel.anchorNode.get('innerHTML') === ' ')) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass n = this.command('inserthtml', '<span style="background-color: ' + val + '">' + inst.Selection.CURSOR + '</span>');
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * Sugar method, calles backcolor
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @method COMMANDS.hilitecolor
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} cmd The command executed: backcolor
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} val The color value to apply
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @return {NodeList} NodeList of the items touched by this command.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass hilitecolor: function() {
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass return ExecCommand.COMMANDS.backcolor.apply(this, arguments);
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * Adds a font name to the current selection, or creates a new element and applies it
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.fontname2
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @deprecated
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} cmd The command executed: fontname
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} val The font name to apply
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @return {NodeList} NodeList of the items touched by this command.
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * Adds a fontsize to the current selection, or creates a new element and applies it
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.fontsize2
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @deprecated
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} cmd The command executed: fontsize
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} val The font size to apply
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @return {NodeList} NodeList of the items touched by this command.
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass if (sel.isCollapsed && sel.anchorNode && (this._lastKey != 32)) {
96c1e6aab172b57cf3566abee931c26676990044Dav Glass var p = sel.anchorNode.ancestor(inst.Selection.DEFAULT_BLOCK_TAG);
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Overload for COMMANDS.list
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.insertorderedlist
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} cmd The command executed: list, ul
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Overload for COMMANDS.list
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.insertunorderedlist
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} cmd The command executed: list, ol
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Noramlizes lists creation/destruction for IE. All others pass through to native calls
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.list
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} cmd The command executed: list (not used)
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} tag The tag to deal with
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass cmd = 'insert' + ((tag === 'ul') ? 'un' : '') + 'orderedlist';
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass var elm = range.item ? range.item(0) : range.parentElement();
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass var el = inst.config.doc.getElementById('ie-list');
e57824e27f47a76dae7b14c6ff1c7ed1186d16c1Dav Glass var l = inst.Node.create(Y.Lang.sub('<{tag}><li></li></{tag}>', { tag: tag }));
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Noramlizes alignment for Webkit Browsers
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.justify
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} cmd The command executed: justify (not used)
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} val The actual command from the justify{center,all,left,right} stubs
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass var html = '<span>' + sel.anchorNode.get('innerHTML') + '</span>';
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass sel.anchorNode.one('span').setStyle('backgroundColor', bgColor);
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Override method for COMMANDS.justify
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.justifycenter
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Override method for COMMANDS.justify
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.justifyleft
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Override method for COMMANDS.justify
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.justifyright
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Override method for COMMANDS.justify
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.justifyfull
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * This method is meant to normalize IE's in ability to exec the proper command on elements with CSS styling.
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * @method fixIETags
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * @protected
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * @param {String} cmd The command to execute
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * @param {String} tag The tag to create
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * @param {String} rule The rule that we are looking for.
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass html = html.replace(rule + ';', '').replace(rule, '');
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass Y.each(c, function(f) {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass fixIETags.call(this, 'bold', 'b', 'FONT-WEIGHT: bold');
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass fixIETags.call(this, 'italic', 'i', 'FONT-STYLE: italic');
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass fixIETags.call(this, 'underline', 'u', 'TEXT-DECORATION: underline');