editor-para.js revision 11472e48d0b0591b8f3753193304070c6a13cb05
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass * Plugin for Editor to paragraph auto wrapping and correction.
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass * @class Plugin.EditorPara
11472e48d0b0591b8f3753193304070c6a13cb05Dav Glass * @extends Plugin.EditorParaBase
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass * @constructor
09c638a157dd9d2ed9027215d9e254badfa019b8Dav Glass * @module editor
09c638a157dd9d2ed9027215d9e254badfa019b8Dav Glass * @submodule editor-para
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass var EditorPara = function() {
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass EditorPara.superclass.constructor.apply(this, arguments);
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass }, HOST = 'host', BODY = 'body', NODE_CHANGE = 'nodeChange', PARENT_NODE = 'parentNode',
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass FIRST_P = BODY + ' > p', P = 'p', BR = '<br>', FC = 'firstChild', LI = 'li';
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass * nodeChange handler to handle fixing an empty document.
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass * @method _onNodeChange
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass _onNodeChange: function(e) {
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass var host = this.get(HOST), inst = host.getInstance(),
029cb6cc7c47ef456b545670a3ec835dc57e8859Dav Glass html, txt, par , d, sel, btag = inst.EditorSelection.DEFAULT_BLOCK_TAG,
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass inHTML, txt2, childs, aNode, index, node2, top, n, sib,
0db84e0da684308b0fd9ea9b5906c11bafa7a246Dav Glass ps, br, item, p, imgs, t, LAST_CHILD = ':last-child';
0db84e0da684308b0fd9ea9b5906c11bafa7a246Dav Glass case 'enter-up':
0db84e0da684308b0fd9ea9b5906c11bafa7a246Dav Glass var para = ((this._lastPara) ? this._lastPara : e.changedNode),
0db84e0da684308b0fd9ea9b5906c11bafa7a246Dav Glass var prev = para.previous(), lc, lc2, found = false;
162527ab925c04aa8d6bbf78d0484a133a8076f1Dav Glass case 'enter':
162527ab925c04aa8d6bbf78d0484a133a8076f1Dav Glass //Webkit doesn't support shift+enter as a BR, this fixes that.
029cb6cc7c47ef456b545670a3ec835dc57e8859Dav Glass html = inst.EditorSelection.getText(e.changedNode);
029cb6cc7c47ef456b545670a3ec835dc57e8859Dav Glass par = e.changedNode.ancestor(inst.EditorSelection.BLOCKS);
029cb6cc7c47ef456b545670a3ec835dc57e8859Dav Glass d = inst.Node.create('<p' + dir + '>' + inst.EditorSelection.CURSOR + '</p>');
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass //TODO Move this to a GECKO MODULE - Can't for the moment, requires no change to metadata (YMAIL)
162527ab925c04aa8d6bbf78d0484a133a8076f1Dav Glass if (Y.UA.gecko && host.get('defaultblock') !== 'p') {
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass d = inst.Node.create('<' + btag + '></' + btag + '>');
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass txt = inst.one(inst.config.doc.createTextNode(inHTML.substr(0, sel.anchorOffset)));
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass txt2 = inst.one(inst.config.doc.createTextNode(inHTML.substr(sel.anchorOffset)));
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass //Get children..
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass var start = false;
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass if (c === aNode) {
677d6ad6503f3daaaaf9800c58eec9e00fee4cddDav Glass case 'keyup':
ab50004ba7a3beba13652a757f1dc7de82bc7516Dav Glass if (inst.config.doc && inst.config.doc.body && inst.config.doc.body.innerHTML.length < 20) {
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass case 'backspace-up':
0523d0a8daaa474f0214203f8cbb0bc4a88e2964Dav Glass case 'backspace-down':
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass case 'delete-up':
5432371fbb6d790a76159481f0dd16e806812153Dav Glass //God this is horrible..
5432371fbb6d790a76159481f0dd16e806812153Dav Glass if (!p && host._lastPara && host._lastPara.inDoc()) {
162527ab925c04aa8d6bbf78d0484a133a8076f1Dav Glass if (p && !p.test(P)) {
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass if (!p.previous() && p.get(PARENT_NODE) && p.get(PARENT_NODE).test(BODY)) {
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass Y.log('Stopping the backspace event', 'warn', 'editor-para');
5228a37b2eb62b9c769d7478a495fec98a1ae8cdDav Glass //All backspace calls in Webkit need a preventDefault to
5228a37b2eb62b9c769d7478a495fec98a1ae8cdDav Glass //stop history navigation #2531299
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass if (item.test('li') && (!item.previous() && !item.next())) {
6dbc2e0b2c23ae7763959af9762fc50c84dbd937Dav Glass item.get(PARENT_NODE).replace(inst.Node.create(BR));
96c1e6aab172b57cf3566abee931c26676990044Dav Glass * This forced FF to redraw the content on backspace.
96c1e6aab172b57cf3566abee931c26676990044Dav Glass * On some occasions FF will leave a cursor residue after content has been deleted.
96c1e6aab172b57cf3566abee931c26676990044Dav Glass * Dropping in the empty textnode and then removing it causes FF to redraw and
96c1e6aab172b57cf3566abee931c26676990044Dav Glass * remove the "ghost cursors"
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass initializer: function() {
0db84e0da684308b0fd9ea9b5906c11bafa7a246Dav Glass Y.error('Can not plug EditorPara and EditorBR at the same time.');
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass host.on(NODE_CHANGE, Y.bind(this._onNodeChange, this));
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass * editorPara
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass * @property NAME
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass * editorPara
d2a5a45ff58ab15a8ee0339edcd03f0243373d59Dav Glass * @property NS