You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
4.4 KiB
144 lines
4.4 KiB
/*
|
|
YUI 3.17.2 (build 9c3c78e)
|
|
Copyright 2014 Yahoo! Inc. All rights reserved.
|
|
Licensed under the BSD License.
|
|
http://yuilibrary.com/license/
|
|
*/
|
|
|
|
YUI.add('editor-br', function (Y, NAME) {
|
|
|
|
|
|
|
|
/**
|
|
* Plugin for Editor to normalize BR's.
|
|
* @class Plugin.EditorBR
|
|
* @extends Base
|
|
* @constructor
|
|
* @module editor
|
|
* @submodule editor-br
|
|
*/
|
|
|
|
|
|
var EditorBR = function() {
|
|
EditorBR.superclass.constructor.apply(this, arguments);
|
|
}, HOST = 'host', LI = 'li';
|
|
|
|
|
|
Y.extend(EditorBR, Y.Base, {
|
|
/**
|
|
* Frame keyDown handler that normalizes BR's when pressing ENTER.
|
|
* @private
|
|
* @method _onKeyDown
|
|
*/
|
|
_onKeyDown: function(e) {
|
|
if (e.stopped) {
|
|
e.halt();
|
|
return;
|
|
}
|
|
if (e.keyCode === 13) {
|
|
var host = this.get(HOST), inst = host.getInstance(),
|
|
sel = new inst.EditorSelection();
|
|
|
|
if (sel) {
|
|
if (Y.UA.ie) {
|
|
if (!sel.anchorNode || (!sel.anchorNode.test(LI) && !sel.anchorNode.ancestor(LI))) {
|
|
host.execCommand('inserthtml', inst.EditorSelection.CURSOR);
|
|
e.halt();
|
|
}
|
|
}
|
|
if (Y.UA.webkit) {
|
|
if (!sel.anchorNode || (!sel.anchorNode.test(LI) && !sel.anchorNode.ancestor(LI))) {
|
|
host.frame._execCommand('insertlinebreak', null);
|
|
e.halt();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
/**
|
|
* Adds listeners for keydown in IE and Webkit. Also fires insertbeonreturn for supporting browsers.
|
|
* @private
|
|
* @method _afterEditorReady
|
|
*/
|
|
_afterEditorReady: function() {
|
|
var inst = this.get(HOST).getInstance(),
|
|
container;
|
|
|
|
try {
|
|
inst.config.doc.execCommand('insertbronreturn', null, true);
|
|
} catch (bre) {}
|
|
|
|
if (Y.UA.ie || Y.UA.webkit) {
|
|
container = inst.EditorSelection.ROOT;
|
|
|
|
if (container.test('body')) {
|
|
container = inst.config.doc;
|
|
}
|
|
|
|
inst.on('keydown', Y.bind(this._onKeyDown, this), container);
|
|
}
|
|
},
|
|
/**
|
|
* Adds a nodeChange listener only for FF, in the event of a backspace or delete, it creates an empy textNode
|
|
* inserts it into the DOM after the e.changedNode, then removes it. Causing FF to redraw the content.
|
|
* @private
|
|
* @method _onNodeChange
|
|
* @param {Event} e The nodeChange event.
|
|
*/
|
|
_onNodeChange: function(e) {
|
|
switch (e.changedType) {
|
|
case 'backspace-up':
|
|
case 'backspace-down':
|
|
case 'delete-up':
|
|
/*
|
|
* This forced FF to redraw the content on backspace.
|
|
* On some occasions FF will leave a cursor residue after content has been deleted.
|
|
* Dropping in the empty textnode and then removing it causes FF to redraw and
|
|
* remove the "ghost cursors"
|
|
*/
|
|
var inst = this.get(HOST).getInstance(),
|
|
d = e.changedNode,
|
|
t = inst.config.doc.createTextNode(' ');
|
|
d.appendChild(t);
|
|
d.removeChild(t);
|
|
break;
|
|
}
|
|
},
|
|
initializer: function() {
|
|
var host = this.get(HOST);
|
|
if (host.editorPara) {
|
|
Y.error('Can not plug EditorBR and EditorPara at the same time.');
|
|
return;
|
|
}
|
|
host.after('ready', Y.bind(this._afterEditorReady, this));
|
|
if (Y.UA.gecko) {
|
|
host.on('nodeChange', Y.bind(this._onNodeChange, this));
|
|
}
|
|
}
|
|
}, {
|
|
/**
|
|
* editorBR
|
|
* @static
|
|
* @property NAME
|
|
*/
|
|
NAME: 'editorBR',
|
|
/**
|
|
* editorBR
|
|
* @static
|
|
* @property NS
|
|
*/
|
|
NS: 'editorBR',
|
|
ATTRS: {
|
|
host: {
|
|
value: false
|
|
}
|
|
}
|
|
});
|
|
|
|
Y.namespace('Plugin');
|
|
|
|
Y.Plugin.EditorBR = EditorBR;
|
|
|
|
|
|
|
|
}, '3.17.2', {"requires": ["editor-base"]});
|
|
|