423 lines
10 KiB
JavaScript
423 lines
10 KiB
JavaScript
/*
|
||
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
see: http://dojotoolkit.org/license for details
|
||
*/
|
||
|
||
|
||
if(!dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]){
|
||
dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]=true;
|
||
dojo.provide("dijit._editor.plugins.EnterKeyHandling");
|
||
dojo.require("dojo.window");
|
||
dojo.declare("dijit._editor.plugins.EnterKeyHandling",dijit._editor._Plugin,{blockNodeForEnter:"BR",constructor:function(_1){
|
||
if(_1){
|
||
dojo.mixin(this,_1);
|
||
}
|
||
},setEditor:function(_2){
|
||
this.editor=_2;
|
||
if(this.blockNodeForEnter=="BR"){
|
||
if(dojo.isIE){
|
||
_2.contentDomPreFilters.push(dojo.hitch(this,"regularPsToSingleLinePs"));
|
||
_2.contentDomPostFilters.push(dojo.hitch(this,"singleLinePsToRegularPs"));
|
||
_2.onLoadDeferred.addCallback(dojo.hitch(this,"_fixNewLineBehaviorForIE"));
|
||
}else{
|
||
_2.onLoadDeferred.addCallback(dojo.hitch(this,function(d){
|
||
try{
|
||
this.editor.document.execCommand("insertBrOnReturn",false,true);
|
||
}
|
||
catch(e){
|
||
}
|
||
return d;
|
||
}));
|
||
}
|
||
}else{
|
||
if(this.blockNodeForEnter){
|
||
dojo["require"]("dijit._editor.range");
|
||
var h=dojo.hitch(this,this.handleEnterKey);
|
||
_2.addKeyHandler(13,0,0,h);
|
||
_2.addKeyHandler(13,0,1,h);
|
||
this.connect(this.editor,"onKeyPressed","onKeyPressed");
|
||
}
|
||
}
|
||
},onKeyPressed:function(e){
|
||
if(this._checkListLater){
|
||
if(dojo.withGlobal(this.editor.window,"isCollapsed",dijit)){
|
||
var _3=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,["LI"]);
|
||
if(!_3){
|
||
dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);
|
||
var _4=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]);
|
||
if(_4){
|
||
_4.innerHTML=this.bogusHtmlContent;
|
||
if(dojo.isIE){
|
||
var r=this.editor.document.selection.createRange();
|
||
r.move("character",-1);
|
||
r.select();
|
||
}
|
||
}else{
|
||
console.error("onKeyPressed: Cannot find the new block node");
|
||
}
|
||
}else{
|
||
if(dojo.isMoz){
|
||
if(_3.parentNode.parentNode.nodeName=="LI"){
|
||
_3=_3.parentNode.parentNode;
|
||
}
|
||
}
|
||
var fc=_3.firstChild;
|
||
if(fc&&fc.nodeType==1&&(fc.nodeName=="UL"||fc.nodeName=="OL")){
|
||
_3.insertBefore(fc.ownerDocument.createTextNode(" "),fc);
|
||
var _5=dijit.range.create(this.editor.window);
|
||
_5.setStart(_3.firstChild,0);
|
||
var _6=dijit.range.getSelection(this.editor.window,true);
|
||
_6.removeAllRanges();
|
||
_6.addRange(_5);
|
||
}
|
||
}
|
||
}
|
||
this._checkListLater=false;
|
||
}
|
||
if(this._pressedEnterInBlock){
|
||
if(this._pressedEnterInBlock.previousSibling){
|
||
this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);
|
||
}
|
||
delete this._pressedEnterInBlock;
|
||
}
|
||
},bogusHtmlContent:" ",blockNodes:/^(?:P|H1|H2|H3|H4|H5|H6|LI)$/,handleEnterKey:function(e){
|
||
var _7,_8,_9,_a=this.editor.document,br;
|
||
if(e.shiftKey){
|
||
var _b=dojo.withGlobal(this.editor.window,"getParentElement",dijit._editor.selection);
|
||
var _c=dijit.range.getAncestor(_b,this.blockNodes);
|
||
if(_c){
|
||
if(!e.shiftKey&&_c.tagName=="LI"){
|
||
return true;
|
||
}
|
||
_7=dijit.range.getSelection(this.editor.window);
|
||
_8=_7.getRangeAt(0);
|
||
if(!_8.collapsed){
|
||
_8.deleteContents();
|
||
_7=dijit.range.getSelection(this.editor.window);
|
||
_8=_7.getRangeAt(0);
|
||
}
|
||
if(dijit.range.atBeginningOfContainer(_c,_8.startContainer,_8.startOffset)){
|
||
if(e.shiftKey){
|
||
br=_a.createElement("br");
|
||
_9=dijit.range.create(this.editor.window);
|
||
_c.insertBefore(br,_c.firstChild);
|
||
_9.setStartBefore(br.nextSibling);
|
||
_7.removeAllRanges();
|
||
_7.addRange(_9);
|
||
}else{
|
||
dojo.place(br,_c,"before");
|
||
}
|
||
}else{
|
||
if(dijit.range.atEndOfContainer(_c,_8.startContainer,_8.startOffset)){
|
||
_9=dijit.range.create(this.editor.window);
|
||
br=_a.createElement("br");
|
||
if(e.shiftKey){
|
||
_c.appendChild(br);
|
||
_c.appendChild(_a.createTextNode(" "));
|
||
_9.setStart(_c.lastChild,0);
|
||
}else{
|
||
dojo.place(br,_c,"after");
|
||
_9.setStartAfter(_c);
|
||
}
|
||
_7.removeAllRanges();
|
||
_7.addRange(_9);
|
||
}else{
|
||
return true;
|
||
}
|
||
}
|
||
}else{
|
||
dijit._editor.RichText.prototype.execCommand.call(this.editor,"inserthtml","<br>");
|
||
}
|
||
return false;
|
||
}
|
||
var _d=true;
|
||
_7=dijit.range.getSelection(this.editor.window);
|
||
_8=_7.getRangeAt(0);
|
||
if(!_8.collapsed){
|
||
_8.deleteContents();
|
||
_7=dijit.range.getSelection(this.editor.window);
|
||
_8=_7.getRangeAt(0);
|
||
}
|
||
var _e=dijit.range.getBlockAncestor(_8.endContainer,null,this.editor.editNode);
|
||
var _f=_e.blockNode;
|
||
if((this._checkListLater=(_f&&(_f.nodeName=="LI"||_f.parentNode.nodeName=="LI")))){
|
||
if(dojo.isMoz){
|
||
this._pressedEnterInBlock=_f;
|
||
}
|
||
if(/^(\s| |\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s| |\xA0)<\/span>)?(<br>)?$/.test(_f.innerHTML)){
|
||
_f.innerHTML="";
|
||
if(dojo.isWebKit){
|
||
_9=dijit.range.create(this.editor.window);
|
||
_9.setStart(_f,0);
|
||
_7.removeAllRanges();
|
||
_7.addRange(_9);
|
||
}
|
||
this._checkListLater=false;
|
||
}
|
||
return true;
|
||
}
|
||
if(!_e.blockNode||_e.blockNode===this.editor.editNode){
|
||
try{
|
||
dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);
|
||
}
|
||
catch(e2){
|
||
}
|
||
_e={blockNode:dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]),blockContainer:this.editor.editNode};
|
||
if(_e.blockNode){
|
||
if(_e.blockNode!=this.editor.editNode&&(!(_e.blockNode.textContent||_e.blockNode.innerHTML).replace(/^\s+|\s+$/g,"").length)){
|
||
this.removeTrailingBr(_e.blockNode);
|
||
return false;
|
||
}
|
||
}else{
|
||
_e.blockNode=this.editor.editNode;
|
||
}
|
||
_7=dijit.range.getSelection(this.editor.window);
|
||
_8=_7.getRangeAt(0);
|
||
}
|
||
var _10=_a.createElement(this.blockNodeForEnter);
|
||
_10.innerHTML=this.bogusHtmlContent;
|
||
this.removeTrailingBr(_e.blockNode);
|
||
if(dijit.range.atEndOfContainer(_e.blockNode,_8.endContainer,_8.endOffset)){
|
||
if(_e.blockNode===_e.blockContainer){
|
||
_e.blockNode.appendChild(_10);
|
||
}else{
|
||
dojo.place(_10,_e.blockNode,"after");
|
||
}
|
||
_d=false;
|
||
_9=dijit.range.create(this.editor.window);
|
||
_9.setStart(_10,0);
|
||
_7.removeAllRanges();
|
||
_7.addRange(_9);
|
||
if(this.editor.height){
|
||
dojo.window.scrollIntoView(_10);
|
||
}
|
||
}else{
|
||
if(dijit.range.atBeginningOfContainer(_e.blockNode,_8.startContainer,_8.startOffset)){
|
||
dojo.place(_10,_e.blockNode,_e.blockNode===_e.blockContainer?"first":"before");
|
||
if(_10.nextSibling&&this.editor.height){
|
||
_9=dijit.range.create(this.editor.window);
|
||
_9.setStart(_10.nextSibling,0);
|
||
_7.removeAllRanges();
|
||
_7.addRange(_9);
|
||
dojo.window.scrollIntoView(_10.nextSibling);
|
||
}
|
||
_d=false;
|
||
}else{
|
||
if(_e.blockNode===_e.blockContainer){
|
||
_e.blockNode.appendChild(_10);
|
||
}else{
|
||
dojo.place(_10,_e.blockNode,"after");
|
||
}
|
||
_d=false;
|
||
if(_e.blockNode.style){
|
||
if(_10.style){
|
||
if(_e.blockNode.style.cssText){
|
||
_10.style.cssText=_e.blockNode.style.cssText;
|
||
}
|
||
}
|
||
}
|
||
var rs=_8.startContainer;
|
||
if(rs&&rs.nodeType==3){
|
||
var _11,_12;
|
||
var txt=rs.nodeValue;
|
||
var _13=_a.createTextNode(txt.substring(0,_8.startOffset));
|
||
var _14=_a.createTextNode(txt.substring(_8.startOffset,txt.length));
|
||
dojo.place(_13,rs,"before");
|
||
dojo.place(_14,rs,"after");
|
||
dojo.destroy(rs);
|
||
var _15=_13.parentNode;
|
||
while(_15!==_e.blockNode){
|
||
var tg=_15.tagName;
|
||
var _16=_a.createElement(tg);
|
||
if(_15.style){
|
||
if(_16.style){
|
||
if(_15.style.cssText){
|
||
_16.style.cssText=_15.style.cssText;
|
||
}
|
||
}
|
||
}
|
||
_11=_14;
|
||
while(_11){
|
||
_12=_11.nextSibling;
|
||
_16.appendChild(_11);
|
||
_11=_12;
|
||
}
|
||
dojo.place(_16,_15,"after");
|
||
_13=_15;
|
||
_14=_16;
|
||
_15=_15.parentNode;
|
||
}
|
||
_11=_14;
|
||
if(_11.nodeType==1||(_11.nodeType==3&&_11.nodeValue)){
|
||
_10.innerHTML="";
|
||
}
|
||
while(_11){
|
||
_12=_11.nextSibling;
|
||
_10.appendChild(_11);
|
||
_11=_12;
|
||
}
|
||
}
|
||
_9=dijit.range.create(this.editor.window);
|
||
_9.setStart(_10,0);
|
||
_7.removeAllRanges();
|
||
_7.addRange(_9);
|
||
if(this.editor.height){
|
||
dijit.scrollIntoView(_10);
|
||
}
|
||
if(dojo.isMoz){
|
||
this._pressedEnterInBlock=_e.blockNode;
|
||
}
|
||
}
|
||
}
|
||
return _d;
|
||
},removeTrailingBr:function(_17){
|
||
var _18=/P|DIV|LI/i.test(_17.tagName)?_17:dijit._editor.selection.getParentOfType(_17,["P","DIV","LI"]);
|
||
if(!_18){
|
||
return;
|
||
}
|
||
if(_18.lastChild){
|
||
if((_18.childNodes.length>1&&_18.lastChild.nodeType==3&&/^[\s\xAD]*$/.test(_18.lastChild.nodeValue))||_18.lastChild.tagName=="BR"){
|
||
dojo.destroy(_18.lastChild);
|
||
}
|
||
}
|
||
if(!_18.childNodes.length){
|
||
_18.innerHTML=this.bogusHtmlContent;
|
||
}
|
||
},_fixNewLineBehaviorForIE:function(d){
|
||
var doc=this.editor.document;
|
||
if(doc.__INSERTED_EDITIOR_NEWLINE_CSS===undefined){
|
||
var _19=dojo.create("style",{type:"text/css"},doc.getElementsByTagName("head")[0]);
|
||
_19.styleSheet.cssText="p{margin:0;}";
|
||
this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS=true;
|
||
}
|
||
return d;
|
||
},regularPsToSingleLinePs:function(_1a,_1b){
|
||
function _1c(el){
|
||
function _1d(_1e){
|
||
var _1f=_1e[0].ownerDocument.createElement("p");
|
||
_1e[0].parentNode.insertBefore(_1f,_1e[0]);
|
||
dojo.forEach(_1e,function(_20){
|
||
_1f.appendChild(_20);
|
||
});
|
||
};
|
||
var _21=0;
|
||
var _22=[];
|
||
var _23;
|
||
while(_21<el.childNodes.length){
|
||
_23=el.childNodes[_21];
|
||
if(_23.nodeType==3||(_23.nodeType==1&&_23.nodeName!="BR"&&dojo.style(_23,"display")!="block")){
|
||
_22.push(_23);
|
||
}else{
|
||
var _24=_23.nextSibling;
|
||
if(_22.length){
|
||
_1d(_22);
|
||
_21=(_21+1)-_22.length;
|
||
if(_23.nodeName=="BR"){
|
||
dojo.destroy(_23);
|
||
}
|
||
}
|
||
_22=[];
|
||
}
|
||
_21++;
|
||
}
|
||
if(_22.length){
|
||
_1d(_22);
|
||
}
|
||
};
|
||
function _25(el){
|
||
var _26=null;
|
||
var _27=[];
|
||
var _28=el.childNodes.length-1;
|
||
for(var i=_28;i>=0;i--){
|
||
_26=el.childNodes[i];
|
||
if(_26.nodeName=="BR"){
|
||
var _29=_26.ownerDocument.createElement("p");
|
||
dojo.place(_29,el,"after");
|
||
if(_27.length==0&&i!=_28){
|
||
_29.innerHTML=" ";
|
||
}
|
||
dojo.forEach(_27,function(_2a){
|
||
_29.appendChild(_2a);
|
||
});
|
||
dojo.destroy(_26);
|
||
_27=[];
|
||
}else{
|
||
_27.unshift(_26);
|
||
}
|
||
}
|
||
};
|
||
var _2b=[];
|
||
var ps=_1a.getElementsByTagName("p");
|
||
dojo.forEach(ps,function(p){
|
||
_2b.push(p);
|
||
});
|
||
dojo.forEach(_2b,function(p){
|
||
var _2c=p.previousSibling;
|
||
if((_2c)&&(_2c.nodeType==1)&&(_2c.nodeName=="P"||dojo.style(_2c,"display")!="block")){
|
||
var _2d=p.parentNode.insertBefore(this.document.createElement("p"),p);
|
||
_2d.innerHTML=_1b?"":" ";
|
||
}
|
||
_25(p);
|
||
},this.editor);
|
||
_1c(_1a);
|
||
return _1a;
|
||
},singleLinePsToRegularPs:function(_2e){
|
||
function _2f(_30){
|
||
var ps=_30.getElementsByTagName("p");
|
||
var _31=[];
|
||
for(var i=0;i<ps.length;i++){
|
||
var p=ps[i];
|
||
var _32=false;
|
||
for(var k=0;k<_31.length;k++){
|
||
if(_31[k]===p.parentNode){
|
||
_32=true;
|
||
break;
|
||
}
|
||
}
|
||
if(!_32){
|
||
_31.push(p.parentNode);
|
||
}
|
||
}
|
||
return _31;
|
||
};
|
||
function _33(_34){
|
||
return (!_34.childNodes.length||_34.innerHTML==" ");
|
||
};
|
||
var _35=_2f(_2e);
|
||
for(var i=0;i<_35.length;i++){
|
||
var _36=_35[i];
|
||
var _37=null;
|
||
var _38=_36.firstChild;
|
||
var _39=null;
|
||
while(_38){
|
||
if(_38.nodeType!=1||_38.tagName!="P"||(_38.getAttributeNode("style")||{}).specified){
|
||
_37=null;
|
||
}else{
|
||
if(_33(_38)){
|
||
_39=_38;
|
||
_37=null;
|
||
}else{
|
||
if(_37==null){
|
||
_37=_38;
|
||
}else{
|
||
if((!_37.lastChild||_37.lastChild.nodeName!="BR")&&(_38.firstChild)&&(_38.firstChild.nodeName!="BR")){
|
||
_37.appendChild(this.editor.document.createElement("br"));
|
||
}
|
||
while(_38.firstChild){
|
||
_37.appendChild(_38.firstChild);
|
||
}
|
||
_39=_38;
|
||
}
|
||
}
|
||
}
|
||
_38=_38.nextSibling;
|
||
if(_39){
|
||
dojo.destroy(_39);
|
||
_39=null;
|
||
}
|
||
}
|
||
}
|
||
return _2e;
|
||
}});
|
||
}
|