exec-command.js revision a2621d519886de7d60c30c5a0850f5c17fd2fb36
145N/AYUI.add('exec-command', function(Y) {
145N/A
145N/A
145N/A /**
145N/A * Plugin for the frame module to handle execCommands for Editor
145N/A * @module editor
145N/A * @submodule exec-command
145N/A */
145N/A /**
145N/A * Plugin for the frame module to handle execCommands for Editor
145N/A * @class Plugin.ExecCommand
145N/A * @extends Base
145N/A * @constructor
145N/A */
145N/A var ExecCommand = function() {
145N/A ExecCommand.superclass.constructor.apply(this, arguments);
145N/A };
145N/A
145N/A Y.extend(ExecCommand, Y.Base, {
145N/A /**
145N/A * An internal reference to the instance of the frame plugged into.
145N/A * @private
145N/A * @property _inst
145N/A */
187N/A _inst: null,
187N/A /**
187N/A * Execute a command on the frame's document.
187N/A * @method command
187N/A * @param {String} action The action to perform (bold, italic, fontname)
145N/A * @param {String} value The optional value (helvetica)
187N/A * @return {Node/NodeList} Should return the Node/Nodelist affected
187N/A */
187N/A command: function(action, value) {
145N/A var fn = ExecCommand.COMMANDS[action];
187N/A
187N/A if (fn) {
187N/A return fn.call(this, action, value);
187N/A } else {
145N/A return this._command(action, value);
145N/A }
145N/A },
145N/A /**
187N/A * The private version of execCommand that doesn't filter for overrides.
187N/A * @private
187N/A * @method _command
187N/A * @param {String} action The action to perform (bold, italic, fontname)
187N/A * @param {String} value The optional value (helvetica)
187N/A */
145N/A _command: function(action, value) {
187N/A var inst = this.getInstance();
187N/A try {
187N/A inst.config.doc.execCommand(action, false, value);
187N/A } catch (e) {
187N/A }
187N/A },
187N/A /**
187N/A * Get's the instance of YUI bound to the parent frame
187N/A * @method getInstance
187N/A * @return {YUI} The YUI instance bound to the parent frame
145N/A */
145N/A getInstance: function() {
145N/A if (!this._inst) {
this._inst = this.get('host').getInstance();
}
return this._inst;
},
initializer: function() {
Y.mix(this.get('host'), {
execCommand: function(action, value) {
return this.exec.command(action, value);
},
_execCommand: function(action, value) {
return this.exec._command(action, value);
}
});
}
}, {
/**
* execCommand
* @property NAME
* @static
*/
NAME: 'execCommand',
/**
* exec
* @property NS
* @static
*/
NS: 'exec',
ATTRS: {
host: {
value: false
}
},
/**
* Static object literal of execCommand overrides
* @property COMMANDS
* @static
*/
COMMANDS: {
/**
* Wraps the content with a new element of type (tag)
* @method COMMANDS.wrap
* @static
* @param {String} cmd The command executed: wrap
* @param {String} tag The tag to wrap the selection with
* @return {NodeList} NodeList of the items touched by this command.
*/
wrap: function(cmd, tag) {
var inst = this.getInstance();
return (new inst.Selection()).wrapContent(tag);
},
/**
* Inserts the provided HTML at the cursor, should be a single element.
* @method COMMANDS.inserthtml
* @static
* @param {String} cmd The command executed: inserthtml
* @param {String} html The html to insert
* @return {Node} Node instance of the item touched by this command.
*/
inserthtml: function(cmd, html) {
var inst = this.getInstance();
return (new inst.Selection()).insertContent(html);
},
/**
* Inserts the provided HTML at the cursor, and focuses the cursor afterwards.
* @method COMMANDS.insertandfocus
* @static
* @param {String} cmd The command executed: insertandfocus
* @param {String} html The html to insert
* @return {Node} Node instance of the item touched by this command.
*/
insertandfocus: function(cmd, html) {
var inst = this.getInstance(), out, sel;
html += inst.Selection.CURSOR;
out = this.command('inserthtml', html);
sel = new inst.Selection();
sel.focusCursor();
return out;
},
/**
* Inserts an image at the cursor position
* @method COMMANDS.insertimage
* @static
* @param {String} cmd The command executed: insertimage
* @param {String} img The url of the image to be inserted
* @return {Node} Node instance of the item touched by this command.
*/
insertimage: function(cmd, img) {
return this.command('inserthtml', '<img src="' + img + '">');
},
/**
* Add a class to all of the elements in the selection
* @method COMMANDS.addclass
* @static
* @param {String} cmd The command executed: addclass
* @param {String} cls The className to add
* @return {NodeList} NodeList of the items touched by this command.
*/
addclass: function(cmd, cls) {
var inst = this.getInstance();
return (new inst.Selection()).getSelected().addClass(cls);
},
/**
* Remove a class from all of the elements in the selection
* @method COMMANDS.removeclass
* @static
* @param {String} cmd The command executed: removeclass
* @param {String} cls The className to remove
* @return {NodeList} NodeList of the items touched by this command.
*/
removeclass: function(cmd, cls) {
var inst = this.getInstance();
return (new inst.Selection()).getSelected().removeClass(cls);
},
/**
* Adds a background color to the current selection, or creates a new element and applies it
* @method COMMANDS.backcolor
* @static
* @param {String} cmd The command executed: backcolor
* @param {String} val The color value to apply
* @return {NodeList} NodeList of the items touched by this command.
*/
backcolor: function(cmd, val) {
var inst = this.getInstance(),
sel = new inst.Selection(), n;
if (Y.UA.gecko || Y.UA.opera) {
cmd = 'hilitecolor';
}
if (!Y.UA.ie) {
this._command('styleWithCSS', 'true');
}
if (sel.isCollapsed) {
n = this.command('inserthtml', '<span style="background-color: ' + val + '"><span>&nbsp;</span>&nbsp;</span>');
inst.Selection.filterBlocks();
sel.selectNode(n.get('firstChild'));
return n;
} else {
return this._command(cmd, val);
}
if (!Y.UA.ie) {
this._command('styleWithCSS', false);
}
},
/**
* Sugar method, calles backcolor
* @method COMMANDS.hilitecolor
* @static
* @param {String} cmd The command executed: backcolor
* @param {String} val The color value to apply
* @return {NodeList} NodeList of the items touched by this command.
*/
hilitecolor: function() {
return ExecCommand.COMMANDS.backcolor.apply(this, arguments);
},
/**
* Adds a font name to the current selection, or creates a new element and applies it
* @method COMMANDS.fontname
* @static
* @param {String} cmd The command executed: fontname
* @param {String} val The font name to apply
* @return {NodeList} NodeList of the items touched by this command.
*/
fontname: function(cmd, val) {
var inst = this.getInstance(),
sel = new inst.Selection(), n;
if (sel.isCollapsed) {
n = this.command('inserthtml', '<span style="font-family: ' + val + '">&nbsp;</span>');
sel.selectNode(n.get('firstChild'), true);
return n;
} else {
return this._command('fontname', val);
}
},
/**
* Adds a fontsize to the current selection, or creates a new element and applies it
* @method COMMANDS.fontsize
* @static
* @param {String} cmd The command executed: fontsize
* @param {String} val The font size to apply
* @return {NodeList} NodeList of the items touched by this command.
*/
fontsize: function(cmd, val) {
var inst = this.getInstance(),
sel = new inst.Selection(), n;
if (sel.isCollapsed) {
n = this.command('inserthtml', '<font size="' + val + '">&nbsp;</font>');
sel.selectNode(n.get('firstChild'), true);
return n;
} else {
return this._command('fontsize', val);
}
}
}
});
Y.namespace('Plugin');
Y.Plugin.ExecCommand = ExecCommand;
}, '@VERSION@' ,{requires:['frame'], skinnable:false});