From 81bea17aefb26859f825b9293c7c99192874806e Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 8 Nov 2011 20:40:44 +0400 Subject: upgrade Dojo to 1.6.1 --- lib/dijit/_editor/range.js | 950 +++++++++++++++++++++++++-------------------- 1 file changed, 519 insertions(+), 431 deletions(-) (limited to 'lib/dijit/_editor/range.js') diff --git a/lib/dijit/_editor/range.js b/lib/dijit/_editor/range.js index 2b1bd81e3..2e5074583 100644 --- a/lib/dijit/_editor/range.js +++ b/lib/dijit/_editor/range.js @@ -1,453 +1,541 @@ /* - Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved. + Copyright (c) 2004-2011, 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.range"]){ -dojo._hasResource["dijit._editor.range"]=true; +if(!dojo._hasResource["dijit._editor.range"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dijit._editor.range"] = true; dojo.provide("dijit._editor.range"); + + dijit.range={}; -dijit.range.getIndex=function(_1,_2){ -var _3=[],_4=[]; -var _5=_2; -var _6=_1; -var _7,n; -while(_1!=_5){ -var i=0; -_7=_1.parentNode; -while((n=_7.childNodes[i++])){ -if(n===_1){ ---i; -break; -} -} -_3.unshift(i); -_4.unshift(i-_7.childNodes.length); -_1=_7; -} -if(_3.length>0&&_6.nodeType==3){ -n=_6.previousSibling; -while(n&&n.nodeType==3){ -_3[_3.length-1]--; -n=n.previousSibling; -} -n=_6.nextSibling; -while(n&&n.nodeType==3){ -_4[_4.length-1]++; -n=n.nextSibling; -} -} -return {o:_3,r:_4}; -}; -dijit.range.getNode=function(_8,_9){ -if(!dojo.isArray(_8)||_8.length==0){ -return _9; -} -var _a=_9; -dojo.every(_8,function(i){ -if(i>=0&&i<_a.childNodes.length){ -_a=_a.childNodes[i]; -}else{ -_a=null; -return false; -} -return true; -}); -return _a; -}; -dijit.range.getCommonAncestor=function(n1,n2,_b){ -_b=_b||n1.ownerDocument.body; -var _c=function(n){ -var as=[]; -while(n){ -as.unshift(n); -if(n!==_b){ -n=n.parentNode; -}else{ -break; -} -} -return as; -}; -var _d=_c(n1); -var _e=_c(n2); -var m=Math.min(_d.length,_e.length); -var _f=_d[0]; -for(var i=1;i=pnode.childNodes.length){ + //dojo.debug("Error finding index of a node in dijit.range.getIndex"); + //} + ret.unshift(i); + retR.unshift(i-pnode.childNodes.length); + node = pnode; + } + + //normalized() can not be called so often to prevent + //invalidating selection/range, so we have to detect + //here that any text nodes in a row + if(ret.length > 0 && onode.nodeType == 3){ + n = onode.previousSibling; + while(n && n.nodeType == 3){ + ret[ret.length-1]--; + n = n.previousSibling; + } + n = onode.nextSibling; + while(n && n.nodeType == 3){ + retR[retR.length-1]++; + n = n.nextSibling; + } + } +// dojo.profile.end("dijit.range.getIndex"); + return {o: ret, r:retR}; } + +dijit.range.getNode = function(/*Array*/index, /*DomNode*/parent){ + if(!dojo.isArray(index) || index.length == 0){ + return parent; + } + var node = parent; +// if(!node)debugger + dojo.every(index, function(i){ + if(i >= 0 && i < node.childNodes.length){ + node = node.childNodes[i]; + }else{ + node = null; + //console.debug('Error: can not find node with index',index,'under parent node',parent ); + return false; //terminate dojo.every + } + return true; //carry on the every loop + }); + + return node; } -if(_24){ -var _25=_21; -_23=true; -while(_25&&_25!==_20){ -if(_25.nextSibling){ -_23=false; -break; + +dijit.range.getCommonAncestor = function(n1,n2,root){ + root = root||n1.ownerDocument.body; + var getAncestors = function(n){ + var as=[]; + while(n){ + as.unshift(n); + if(n !== root){ + n = n.parentNode; + }else{ + break; + } + } + return as; + }; + var n1as = getAncestors(n1); + var n2as = getAncestors(n2); + + var m = Math.min(n1as.length,n2as.length); + var com = n1as[0]; //at least, one element should be in the array: the root (BODY by default) + for(var i=1;i0){ -dojo.every(_38.childNodes,function(_3c,i){ -var _3d; -if(_3c.nodeType!=3){ -_36.moveToElementText(_3c); -if(_36.compareEndPoints(_37,_35)>0){ -if(_3b&&_3b.nodeType==3){ -_39=_3b; -_3d=true; -}else{ -_39=_38; -_3a=i; -return false; -} -}else{ -if(i==_38.childNodes.length-1){ -_39=_38; -_3a=_38.childNodes.length; -return false; -} -} -}else{ -if(i==_38.childNodes.length-1){ -_39=_3c; -_3d=true; -} -} -if(_3d&&_39){ -var _3e=dijit.range.adjacentNoneTextNode(_39)[0]; -if(_3e){ -_39=_3e.nextSibling; -}else{ -_39=_38.firstChild; -} -var _3f=dijit.range.adjacentNoneTextNode(_39); -_3e=_3f[0]; -var _40=_3f[1]; -if(_3e){ -_36.moveToElementText(_3e); -_36.collapse(false); -}else{ -_36.moveToElementText(_38); -} -_36.setEndPoint(_37,_35); -_3a=_36.text.length-_40; -return false; + dijit.range.ie={ + cachedSelection: {}, + selection: function(win){ + this._ranges = []; + this.addRange = function(r, /*boolean*/internal){ + this._ranges.push(r); + if(!internal){ + r._select(); + } + this.rangeCount = this._ranges.length; + }; + this.removeAllRanges = function(){ + //don't detach, the range may be used later +// for(var i=0;i0){ + dojo.every(parentNode.childNodes, function(node,i){ + var calOffset; + if(node.nodeType != 3){ + atmrange.moveToElementText(node); + + if(atmrange.compareEndPoints(cmpstr,range) > 0){ + //startnode = node.previousSibling; + if(lastNode && lastNode.nodeType == 3){ + //where shall we put the start? in the text node or after? + startnode = lastNode; + calOffset = true; + }else{ + startnode = parentNode; + startOffset = i; + return false; + } + }else{ + if(i == parentNode.childNodes.length-1){ + startnode = parentNode; + startOffset = parentNode.childNodes.length; + return false; + } + } + }else{ + if(i == parentNode.childNodes.length-1){//at the end of this node + startnode = node; + calOffset = true; + } + } + // try{ + if(calOffset && startnode){ + var prevnode = dijit.range.adjacentNoneTextNode(startnode)[0]; + if(prevnode){ + startnode = prevnode.nextSibling; + }else{ + startnode = parentNode.firstChild; //firstChild must be a text node + } + var prevnodeobj = dijit.range.adjacentNoneTextNode(startnode); + prevnode = prevnodeobj[0]; + var lenoffset = prevnodeobj[1]; + if(prevnode){ + atmrange.moveToElementText(prevnode); + atmrange.collapse(false); + }else{ + atmrange.moveToElementText(parentNode); + } + atmrange.setEndPoint(cmpstr, range); + startOffset = atmrange.text.length-lenoffset; + + return false; + } + // }catch(e){ debugger } + lastNode = node; + return true; + }); + }else{ + startnode = parentNode; + startOffset = 0; + } + + //if at the end of startnode and we are dealing with start container, then + //move the startnode to nextSibling if it is a text node + //TODO: do this for end container? + if(!end && startnode.nodeType == 1 && startOffset == startnode.childNodes.length){ + var nextnode=startnode.nextSibling; + if(nextnode && nextnode.nodeType == 3){ + startnode = nextnode; + startOffset = 0; + } + } + return [startnode, startOffset]; + }, + setEndPoint: function(range, container, offset){ + //text node + var atmrange = range.duplicate(), node, len; + if(container.nodeType!=3){ //normal node + if(offset > 0){ + node = container.childNodes[offset-1]; + if(node){ + if(node.nodeType == 3){ + container = node; + offset = node.length; + //pass through + }else{ + if(node.nextSibling && node.nextSibling.nodeType == 3){ + container=node.nextSibling; + offset=0; + //pass through + }else{ + atmrange.moveToElementText(node.nextSibling?node:container); + var parent = node.parentNode; + var tempNode = parent.insertBefore(node.ownerDocument.createTextNode(' '), node.nextSibling); + atmrange.collapse(false); + parent.removeChild(tempNode); + } + } + } + }else{ + atmrange.moveToElementText(container); + atmrange.collapse(true); + } + } + if(container.nodeType == 3){ + var prevnodeobj = dijit.range.adjacentNoneTextNode(container); + var prevnode = prevnodeobj[0]; + len = prevnodeobj[1]; + if(prevnode){ + atmrange.moveToElementText(prevnode); + atmrange.collapse(false); + //if contentEditable is not inherit, the above collapse won't make the end point + //in the correctly position: it always has a -1 offset, so compensate it + if(prevnode.contentEditable!='inherit'){ + len++; + } + }else{ + atmrange.moveToElementText(container.parentNode); + atmrange.collapse(true); + } + + offset += len; + if(offset>0){ + if(atmrange.move('character',offset) != offset){ + console.error('Error when moving!'); + } + } + } + + return atmrange; + }, + decomposeTextRange: function(range){ + var tmpary = dijit.range.ie.getEndPoint(range); + var startContainer = tmpary[0], startOffset = tmpary[1]; + var endContainer = tmpary[0], endOffset = tmpary[1]; + + if(range.htmlText.length){ + if(range.htmlText == range.text){ //in the same text node + endOffset = startOffset+range.text.length; + }else{ + tmpary = dijit.range.ie.getEndPoint(range,true); + endContainer = tmpary[0], endOffset = tmpary[1]; +// if(startContainer.tagName == "BODY"){ +// startContainer = startContainer.firstChild; +// } + } + } + return [startContainer, startOffset, endContainer, endOffset]; + }, + setRange: function(range, startContainer, + startOffset, endContainer, endOffset, collapsed){ + var start=dijit.range.ie.setEndPoint(range, startContainer, startOffset); + + range.setEndPoint('StartToStart',start); + if(!collapsed){ + var end=dijit.range.ie.setEndPoint(range, endContainer, endOffset); + } + range.setEndPoint('EndToEnd',end || start); + + return range; + } + } + +dojo.declare("dijit.range.W3CRange",null, { + constructor: function(){ + if(arguments.length>0){ + this.setStart(arguments[0][0],arguments[0][1]); + this.setEnd(arguments[0][2],arguments[0][3]); + }else{ + this.commonAncestorContainer = null; + this.startContainer = null; + this.startOffset = 0; + this.endContainer = null; + this.endOffset = 0; + this.collapsed = true; + } + }, + _updateInternal: function(){ + if(this.startContainer !== this.endContainer){ + this.commonAncestorContainer = dijit.range.getCommonAncestor(this.startContainer, this.endContainer); + }else{ + this.commonAncestorContainer = this.startContainer; + } + this.collapsed = (this.startContainer === this.endContainer) && (this.startOffset == this.endOffset); + }, + setStart: function(node, offset){ + offset=parseInt(offset); + if(this.startContainer === node && this.startOffset == offset){ + return; + } + delete this._cachedBookmark; + + this.startContainer = node; + this.startOffset = offset; + if(!this.endContainer){ + this.setEnd(node, offset); + }else{ + this._updateInternal(); + } + }, + setEnd: function(node, offset){ + offset=parseInt(offset); + if(this.endContainer === node && this.endOffset == offset){ + return; + } + delete this._cachedBookmark; + + this.endContainer = node; + this.endOffset = offset; + if(!this.startContainer){ + this.setStart(node, offset); + }else{ + this._updateInternal(); + } + }, + setStartAfter: function(node, offset){ + this._setPoint('setStart', node, offset, 1); + }, + setStartBefore: function(node, offset){ + this._setPoint('setStart', node, offset, 0); + }, + setEndAfter: function(node, offset){ + this._setPoint('setEnd', node, offset, 1); + }, + setEndBefore: function(node, offset){ + this._setPoint('setEnd', node, offset, 0); + }, + _setPoint: function(what, node, offset, ext){ + var index = dijit.range.getIndex(node, node.parentNode).o; + this[what](node.parentNode, index.pop()+ext); + }, + _getIERange: function(){ + var r = (this._body || this.endContainer.ownerDocument.body).createTextRange(); + dijit.range.ie.setRange(r, this.startContainer, this.startOffset, this.endContainer, this.endOffset, this.collapsed); + return r; + }, + getBookmark: function(body){ + this._getIERange(); + return this._cachedBookmark; + }, + _select: function(){ + var r = this._getIERange(); + r.select(); + }, + deleteContents: function(){ + var r = this._getIERange(); + r.pasteHTML(''); + this.endContainer = this.startContainer; + this.endOffset = this.startOffset; + this.collapsed = true; + }, + cloneRange: function(){ + var r = new dijit.range.W3CRange([this.startContainer,this.startOffset, + this.endContainer,this.endOffset]); + r._body = this._body; + return r; + }, + detach: function(){ + this._body = null; + this.commonAncestorContainer = null; + this.startContainer = null; + this.startOffset = 0; + this.endContainer = null; + this.endOffset = 0; + this.collapsed = true; } -_3b=_3c; -return true; }); -}else{ -_39=_38; -_3a=0; -} -if(!end&&_39.nodeType==1&&_3a==_39.childNodes.length){ -var _41=_39.nextSibling; -if(_41&&_41.nodeType==3){ -_39=_41; -_3a=0; -} -} -return [_39,_3a]; -},setEndPoint:function(_42,_43,_44){ -var _45=_42.duplicate(),_46,len; -if(_43.nodeType!=3){ -if(_44>0){ -_46=_43.childNodes[_44-1]; -if(_46){ -if(_46.nodeType==3){ -_43=_46; -_44=_46.length; -}else{ -if(_46.nextSibling&&_46.nextSibling.nodeType==3){ -_43=_46.nextSibling; -_44=0; -}else{ -_45.moveToElementText(_46.nextSibling?_46:_43); -var _47=_46.parentNode; -var _48=_47.insertBefore(_46.ownerDocument.createTextNode(" "),_46.nextSibling); -_45.collapse(false); -_47.removeChild(_48); -} -} -} -}else{ -_45.moveToElementText(_43); -_45.collapse(true); -} -} -if(_43.nodeType==3){ -var _49=dijit.range.adjacentNoneTextNode(_43); -var _4a=_49[0]; -len=_49[1]; -if(_4a){ -_45.moveToElementText(_4a); -_45.collapse(false); -if(_4a.contentEditable!="inherit"){ -len++; -} -}else{ -_45.moveToElementText(_43.parentNode); -_45.collapse(true); -} -_44+=len; -if(_44>0){ -if(_45.move("character",_44)!=_44){ -console.error("Error when moving!"); -} -} -} -return _45; -},decomposeTextRange:function(_4b){ -var _4c=dijit.range.ie.getEndPoint(_4b); -var _4d=_4c[0],_4e=_4c[1]; -var _4f=_4c[0],_50=_4c[1]; -if(_4b.htmlText.length){ -if(_4b.htmlText==_4b.text){ -_50=_4e+_4b.text.length; -}else{ -_4c=dijit.range.ie.getEndPoint(_4b,true); -_4f=_4c[0],_50=_4c[1]; -} -} -return [_4d,_4e,_4f,_50]; -},setRange:function(_51,_52,_53,_54,_55,_56){ -var _57=dijit.range.ie.setEndPoint(_51,_52,_53); -_51.setEndPoint("StartToStart",_57); -if(!_56){ -var end=dijit.range.ie.setEndPoint(_51,_54,_55); -} -_51.setEndPoint("EndToEnd",end||_57); -return _51; -}}; -dojo.declare("dijit.range.W3CRange",null,{constructor:function(){ -if(arguments.length>0){ -this.setStart(arguments[0][0],arguments[0][1]); -this.setEnd(arguments[0][2],arguments[0][3]); -}else{ -this.commonAncestorContainer=null; -this.startContainer=null; -this.startOffset=0; -this.endContainer=null; -this.endOffset=0; -this.collapsed=true; -} -},_updateInternal:function(){ -if(this.startContainer!==this.endContainer){ -this.commonAncestorContainer=dijit.range.getCommonAncestor(this.startContainer,this.endContainer); -}else{ -this.commonAncestorContainer=this.startContainer; -} -this.collapsed=(this.startContainer===this.endContainer)&&(this.startOffset==this.endOffset); -},setStart:function(_58,_59){ -_59=parseInt(_59); -if(this.startContainer===_58&&this.startOffset==_59){ -return; -} -delete this._cachedBookmark; -this.startContainer=_58; -this.startOffset=_59; -if(!this.endContainer){ -this.setEnd(_58,_59); -}else{ -this._updateInternal(); -} -},setEnd:function(_5a,_5b){ -_5b=parseInt(_5b); -if(this.endContainer===_5a&&this.endOffset==_5b){ -return; -} -delete this._cachedBookmark; -this.endContainer=_5a; -this.endOffset=_5b; -if(!this.startContainer){ -this.setStart(_5a,_5b); -}else{ -this._updateInternal(); -} -},setStartAfter:function(_5c,_5d){ -this._setPoint("setStart",_5c,_5d,1); -},setStartBefore:function(_5e,_5f){ -this._setPoint("setStart",_5e,_5f,0); -},setEndAfter:function(_60,_61){ -this._setPoint("setEnd",_60,_61,1); -},setEndBefore:function(_62,_63){ -this._setPoint("setEnd",_62,_63,0); -},_setPoint:function(_64,_65,_66,ext){ -var _67=dijit.range.getIndex(_65,_65.parentNode).o; -this[_64](_65.parentNode,_67.pop()+ext); -},_getIERange:function(){ -var r=(this._body||this.endContainer.ownerDocument.body).createTextRange(); -dijit.range.ie.setRange(r,this.startContainer,this.startOffset,this.endContainer,this.endOffset,this.collapsed); -return r; -},getBookmark:function(_68){ -this._getIERange(); -return this._cachedBookmark; -},_select:function(){ -var r=this._getIERange(); -r.select(); -},deleteContents:function(){ -var r=this._getIERange(); -r.pasteHTML(""); -this.endContainer=this.startContainer; -this.endOffset=this.startOffset; -this.collapsed=true; -},cloneRange:function(){ -var r=new dijit.range.W3CRange([this.startContainer,this.startOffset,this.endContainer,this.endOffset]); -r._body=this._body; -return r; -},detach:function(){ -this._body=null; -this.commonAncestorContainer=null; -this.startContainer=null; -this.startOffset=0; -this.endContainer=null; -this.endOffset=0; -this.collapsed=true; -}}); -} +} //if(!dijit.range._w3c) + } -- cgit v1.2.3