root / trunk / web / dojo / dijit / _editor / plugins / EnterKeyHandling.js
History | View | Annotate | Download (10.3 KB)
1 |
/*
|
---|---|
2 |
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
3 |
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
4 |
see: http://dojotoolkit.org/license for details
|
5 |
*/
|
6 |
|
7 |
|
8 |
if(!dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]){ |
9 |
dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]=true; |
10 |
dojo.provide("dijit._editor.plugins.EnterKeyHandling");
|
11 |
dojo.require("dojo.window");
|
12 |
dojo.declare("dijit._editor.plugins.EnterKeyHandling",dijit._editor._Plugin,{blockNodeForEnter:"BR",constructor:function(_1){ |
13 |
if(_1){
|
14 |
dojo.mixin(this,_1);
|
15 |
} |
16 |
},setEditor:function(_2){ |
17 |
this.editor=_2;
|
18 |
if(this.blockNodeForEnter=="BR"){ |
19 |
if(dojo.isIE){
|
20 |
_2.contentDomPreFilters.push(dojo.hitch(this,"regularPsToSingleLinePs")); |
21 |
_2.contentDomPostFilters.push(dojo.hitch(this,"singleLinePsToRegularPs")); |
22 |
_2.onLoadDeferred.addCallback(dojo.hitch(this,"_fixNewLineBehaviorForIE")); |
23 |
}else{
|
24 |
_2.onLoadDeferred.addCallback(dojo.hitch(this,function(d){ |
25 |
try{
|
26 |
this.editor.document.execCommand("insertBrOnReturn",false,true); |
27 |
} |
28 |
catch(e){
|
29 |
} |
30 |
return d;
|
31 |
})); |
32 |
} |
33 |
}else{
|
34 |
if(this.blockNodeForEnter){ |
35 |
dojo["require"]("dijit._editor.range"); |
36 |
var h=dojo.hitch(this,this.handleEnterKey); |
37 |
_2.addKeyHandler(13,0,0,h); |
38 |
_2.addKeyHandler(13,0,1,h); |
39 |
this.connect(this.editor,"onKeyPressed","onKeyPressed"); |
40 |
} |
41 |
} |
42 |
},onKeyPressed:function(e){ |
43 |
if(this._checkListLater){ |
44 |
if(dojo.withGlobal(this.editor.window,"isCollapsed",dijit)){ |
45 |
var _3=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,["LI"]); |
46 |
if(!_3){
|
47 |
dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter); |
48 |
var _4=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]); |
49 |
if(_4){
|
50 |
_4.innerHTML=this.bogusHtmlContent;
|
51 |
if(dojo.isIE){
|
52 |
var r=this.editor.document.selection.createRange(); |
53 |
r.move("character",-1); |
54 |
r.select(); |
55 |
} |
56 |
}else{
|
57 |
console.error("onKeyPressed: Cannot find the new block node");
|
58 |
} |
59 |
}else{
|
60 |
if(dojo.isMoz){
|
61 |
if(_3.parentNode.parentNode.nodeName=="LI"){ |
62 |
_3=_3.parentNode.parentNode; |
63 |
} |
64 |
} |
65 |
var fc=_3.firstChild;
|
66 |
if(fc&&fc.nodeType==1&&(fc.nodeName=="UL"||fc.nodeName=="OL")){ |
67 |
_3.insertBefore(fc.ownerDocument.createTextNode(" "),fc);
|
68 |
var _5=dijit.range.create(this.editor.window); |
69 |
_5.setStart(_3.firstChild,0);
|
70 |
var _6=dijit.range.getSelection(this.editor.window,true); |
71 |
_6.removeAllRanges(); |
72 |
_6.addRange(_5); |
73 |
} |
74 |
} |
75 |
} |
76 |
this._checkListLater=false; |
77 |
} |
78 |
if(this._pressedEnterInBlock){ |
79 |
if(this._pressedEnterInBlock.previousSibling){ |
80 |
this.removeTrailingBr(this._pressedEnterInBlock.previousSibling); |
81 |
} |
82 |
delete this._pressedEnterInBlock; |
83 |
} |
84 |
},bogusHtmlContent:" ",blockNodes:/^(?:P|H1|H2|H3|H4|H5|H6|LI)$/,handleEnterKey:function(e){ |
85 |
var _7,_8,_9,_a=this.editor.document,br; |
86 |
if(e.shiftKey){
|
87 |
var _b=dojo.withGlobal(this.editor.window,"getParentElement",dijit._editor.selection); |
88 |
var _c=dijit.range.getAncestor(_b,this.blockNodes); |
89 |
if(_c){
|
90 |
if(!e.shiftKey&&_c.tagName=="LI"){ |
91 |
return true; |
92 |
} |
93 |
_7=dijit.range.getSelection(this.editor.window);
|
94 |
_8=_7.getRangeAt(0);
|
95 |
if(!_8.collapsed){
|
96 |
_8.deleteContents(); |
97 |
_7=dijit.range.getSelection(this.editor.window);
|
98 |
_8=_7.getRangeAt(0);
|
99 |
} |
100 |
if(dijit.range.atBeginningOfContainer(_c,_8.startContainer,_8.startOffset)){
|
101 |
if(e.shiftKey){
|
102 |
br=_a.createElement("br");
|
103 |
_9=dijit.range.create(this.editor.window);
|
104 |
_c.insertBefore(br,_c.firstChild); |
105 |
_9.setStartBefore(br.nextSibling); |
106 |
_7.removeAllRanges(); |
107 |
_7.addRange(_9); |
108 |
}else{
|
109 |
dojo.place(br,_c,"before");
|
110 |
} |
111 |
}else{
|
112 |
if(dijit.range.atEndOfContainer(_c,_8.startContainer,_8.startOffset)){
|
113 |
_9=dijit.range.create(this.editor.window);
|
114 |
br=_a.createElement("br");
|
115 |
if(e.shiftKey){
|
116 |
_c.appendChild(br); |
117 |
_c.appendChild(_a.createTextNode(" "));
|
118 |
_9.setStart(_c.lastChild,0);
|
119 |
}else{
|
120 |
dojo.place(br,_c,"after");
|
121 |
_9.setStartAfter(_c); |
122 |
} |
123 |
_7.removeAllRanges(); |
124 |
_7.addRange(_9); |
125 |
}else{
|
126 |
return true; |
127 |
} |
128 |
} |
129 |
}else{
|
130 |
dijit._editor.RichText.prototype.execCommand.call(this.editor,"inserthtml","<br>"); |
131 |
} |
132 |
return false; |
133 |
} |
134 |
var _d=true; |
135 |
_7=dijit.range.getSelection(this.editor.window);
|
136 |
_8=_7.getRangeAt(0);
|
137 |
if(!_8.collapsed){
|
138 |
_8.deleteContents(); |
139 |
_7=dijit.range.getSelection(this.editor.window);
|
140 |
_8=_7.getRangeAt(0);
|
141 |
} |
142 |
var _e=dijit.range.getBlockAncestor(_8.endContainer,null,this.editor.editNode); |
143 |
var _f=_e.blockNode;
|
144 |
if((this._checkListLater=(_f&&(_f.nodeName=="LI"||_f.parentNode.nodeName=="LI")))){ |
145 |
if(dojo.isMoz){
|
146 |
this._pressedEnterInBlock=_f;
|
147 |
} |
148 |
if(/^(\s| |\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s| |\xA0)<\/span>)?(<br>)?$/.test(_f.innerHTML)){ |
149 |
_f.innerHTML="";
|
150 |
if(dojo.isWebKit){
|
151 |
_9=dijit.range.create(this.editor.window);
|
152 |
_9.setStart(_f,0);
|
153 |
_7.removeAllRanges(); |
154 |
_7.addRange(_9); |
155 |
} |
156 |
this._checkListLater=false; |
157 |
} |
158 |
return true; |
159 |
} |
160 |
if(!_e.blockNode||_e.blockNode===this.editor.editNode){ |
161 |
try{
|
162 |
dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter); |
163 |
} |
164 |
catch(e2){
|
165 |
} |
166 |
_e={blockNode:dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]),blockContainer:this.editor.editNode}; |
167 |
if(_e.blockNode){
|
168 |
if(_e.blockNode!=this.editor.editNode&&(!(_e.blockNode.textContent||_e.blockNode.innerHTML).replace(/^\s+|\s+$/g,"").length)){ |
169 |
this.removeTrailingBr(_e.blockNode);
|
170 |
return false; |
171 |
} |
172 |
}else{
|
173 |
_e.blockNode=this.editor.editNode;
|
174 |
} |
175 |
_7=dijit.range.getSelection(this.editor.window);
|
176 |
_8=_7.getRangeAt(0);
|
177 |
} |
178 |
var _10=_a.createElement(this.blockNodeForEnter); |
179 |
_10.innerHTML=this.bogusHtmlContent;
|
180 |
this.removeTrailingBr(_e.blockNode);
|
181 |
if(dijit.range.atEndOfContainer(_e.blockNode,_8.endContainer,_8.endOffset)){
|
182 |
if(_e.blockNode===_e.blockContainer){
|
183 |
_e.blockNode.appendChild(_10); |
184 |
}else{
|
185 |
dojo.place(_10,_e.blockNode,"after");
|
186 |
} |
187 |
_d=false;
|
188 |
_9=dijit.range.create(this.editor.window);
|
189 |
_9.setStart(_10,0);
|
190 |
_7.removeAllRanges(); |
191 |
_7.addRange(_9); |
192 |
if(this.editor.height){ |
193 |
dojo.window.scrollIntoView(_10); |
194 |
} |
195 |
}else{
|
196 |
if(dijit.range.atBeginningOfContainer(_e.blockNode,_8.startContainer,_8.startOffset)){
|
197 |
dojo.place(_10,_e.blockNode,_e.blockNode===_e.blockContainer?"first":"before"); |
198 |
if(_10.nextSibling&&this.editor.height){ |
199 |
_9=dijit.range.create(this.editor.window);
|
200 |
_9.setStart(_10.nextSibling,0);
|
201 |
_7.removeAllRanges(); |
202 |
_7.addRange(_9); |
203 |
dojo.window.scrollIntoView(_10.nextSibling); |
204 |
} |
205 |
_d=false;
|
206 |
}else{
|
207 |
if(_e.blockNode===_e.blockContainer){
|
208 |
_e.blockNode.appendChild(_10); |
209 |
}else{
|
210 |
dojo.place(_10,_e.blockNode,"after");
|
211 |
} |
212 |
_d=false;
|
213 |
if(_e.blockNode.style){
|
214 |
if(_10.style){
|
215 |
if(_e.blockNode.style.cssText){
|
216 |
_10.style.cssText=_e.blockNode.style.cssText; |
217 |
} |
218 |
} |
219 |
} |
220 |
var rs=_8.startContainer;
|
221 |
if(rs&&rs.nodeType==3){ |
222 |
var _11,_12;
|
223 |
var txt=rs.nodeValue;
|
224 |
var _13=_a.createTextNode(txt.substring(0,_8.startOffset)); |
225 |
var _14=_a.createTextNode(txt.substring(_8.startOffset,txt.length));
|
226 |
dojo.place(_13,rs,"before");
|
227 |
dojo.place(_14,rs,"after");
|
228 |
dojo.destroy(rs); |
229 |
var _15=_13.parentNode;
|
230 |
while(_15!==_e.blockNode){
|
231 |
var tg=_15.tagName;
|
232 |
var _16=_a.createElement(tg);
|
233 |
if(_15.style){
|
234 |
if(_16.style){
|
235 |
if(_15.style.cssText){
|
236 |
_16.style.cssText=_15.style.cssText; |
237 |
} |
238 |
} |
239 |
} |
240 |
_11=_14; |
241 |
while(_11){
|
242 |
_12=_11.nextSibling; |
243 |
_16.appendChild(_11); |
244 |
_11=_12; |
245 |
} |
246 |
dojo.place(_16,_15,"after");
|
247 |
_13=_15; |
248 |
_14=_16; |
249 |
_15=_15.parentNode; |
250 |
} |
251 |
_11=_14; |
252 |
if(_11.nodeType==1||(_11.nodeType==3&&_11.nodeValue)){ |
253 |
_10.innerHTML="";
|
254 |
} |
255 |
while(_11){
|
256 |
_12=_11.nextSibling; |
257 |
_10.appendChild(_11); |
258 |
_11=_12; |
259 |
} |
260 |
} |
261 |
_9=dijit.range.create(this.editor.window);
|
262 |
_9.setStart(_10,0);
|
263 |
_7.removeAllRanges(); |
264 |
_7.addRange(_9); |
265 |
if(this.editor.height){ |
266 |
dijit.scrollIntoView(_10); |
267 |
} |
268 |
if(dojo.isMoz){
|
269 |
this._pressedEnterInBlock=_e.blockNode;
|
270 |
} |
271 |
} |
272 |
} |
273 |
return _d;
|
274 |
},removeTrailingBr:function(_17){ |
275 |
var _18=/P|DIV|LI/i.test(_17.tagName)?_17:dijit._editor.selection.getParentOfType(_17,["P","DIV","LI"]); |
276 |
if(!_18){
|
277 |
return;
|
278 |
} |
279 |
if(_18.lastChild){
|
280 |
if((_18.childNodes.length>1&&_18.lastChild.nodeType==3&&/^[\s\xAD]*$/.test(_18.lastChild.nodeValue))||_18.lastChild.tagName=="BR"){ |
281 |
dojo.destroy(_18.lastChild); |
282 |
} |
283 |
} |
284 |
if(!_18.childNodes.length){
|
285 |
_18.innerHTML=this.bogusHtmlContent;
|
286 |
} |
287 |
},_fixNewLineBehaviorForIE:function(d){ |
288 |
var doc=this.editor.document; |
289 |
if(doc.__INSERTED_EDITIOR_NEWLINE_CSS===undefined){ |
290 |
var _19=dojo.create("style",{type:"text/css"},doc.getElementsByTagName("head")[0]); |
291 |
_19.styleSheet.cssText="p{margin:0;}";
|
292 |
this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS=true; |
293 |
} |
294 |
return d;
|
295 |
},regularPsToSingleLinePs:function(_1a,_1b){ |
296 |
function _1c(el){ |
297 |
function _1d(_1e){ |
298 |
var _1f=_1e[0].ownerDocument.createElement("p"); |
299 |
_1e[0].parentNode.insertBefore(_1f,_1e[0]); |
300 |
dojo.forEach(_1e,function(_20){
|
301 |
_1f.appendChild(_20); |
302 |
}); |
303 |
}; |
304 |
var _21=0; |
305 |
var _22=[];
|
306 |
var _23;
|
307 |
while(_21<el.childNodes.length){
|
308 |
_23=el.childNodes[_21]; |
309 |
if(_23.nodeType==3||(_23.nodeType==1&&_23.nodeName!="BR"&&dojo.style(_23,"display")!="block")){ |
310 |
_22.push(_23); |
311 |
}else{
|
312 |
var _24=_23.nextSibling;
|
313 |
if(_22.length){
|
314 |
_1d(_22); |
315 |
_21=(_21+1)-_22.length;
|
316 |
if(_23.nodeName=="BR"){ |
317 |
dojo.destroy(_23); |
318 |
} |
319 |
} |
320 |
_22=[]; |
321 |
} |
322 |
_21++; |
323 |
} |
324 |
if(_22.length){
|
325 |
_1d(_22); |
326 |
} |
327 |
}; |
328 |
function _25(el){ |
329 |
var _26=null; |
330 |
var _27=[];
|
331 |
var _28=el.childNodes.length-1; |
332 |
for(var i=_28;i>=0;i--){ |
333 |
_26=el.childNodes[i]; |
334 |
if(_26.nodeName=="BR"){ |
335 |
var _29=_26.ownerDocument.createElement("p"); |
336 |
dojo.place(_29,el,"after");
|
337 |
if(_27.length==0&&i!=_28){ |
338 |
_29.innerHTML=" ";
|
339 |
} |
340 |
dojo.forEach(_27,function(_2a){
|
341 |
_29.appendChild(_2a); |
342 |
}); |
343 |
dojo.destroy(_26); |
344 |
_27=[]; |
345 |
}else{
|
346 |
_27.unshift(_26); |
347 |
} |
348 |
} |
349 |
}; |
350 |
var _2b=[];
|
351 |
var ps=_1a.getElementsByTagName("p"); |
352 |
dojo.forEach(ps,function(p){
|
353 |
_2b.push(p); |
354 |
}); |
355 |
dojo.forEach(_2b,function(p){
|
356 |
var _2c=p.previousSibling;
|
357 |
if((_2c)&&(_2c.nodeType==1)&&(_2c.nodeName=="P"||dojo.style(_2c,"display")!="block")){ |
358 |
var _2d=p.parentNode.insertBefore(this.document.createElement("p"),p); |
359 |
_2d.innerHTML=_1b?"":" "; |
360 |
} |
361 |
_25(p); |
362 |
},this.editor);
|
363 |
_1c(_1a); |
364 |
return _1a;
|
365 |
},singleLinePsToRegularPs:function(_2e){ |
366 |
function _2f(_30){ |
367 |
var ps=_30.getElementsByTagName("p"); |
368 |
var _31=[];
|
369 |
for(var i=0;i<ps.length;i++){ |
370 |
var p=ps[i];
|
371 |
var _32=false; |
372 |
for(var k=0;k<_31.length;k++){ |
373 |
if(_31[k]===p.parentNode){
|
374 |
_32=true;
|
375 |
break;
|
376 |
} |
377 |
} |
378 |
if(!_32){
|
379 |
_31.push(p.parentNode); |
380 |
} |
381 |
} |
382 |
return _31;
|
383 |
}; |
384 |
function _33(_34){ |
385 |
return (!_34.childNodes.length||_34.innerHTML==" "); |
386 |
}; |
387 |
var _35=_2f(_2e);
|
388 |
for(var i=0;i<_35.length;i++){ |
389 |
var _36=_35[i];
|
390 |
var _37=null; |
391 |
var _38=_36.firstChild;
|
392 |
var _39=null; |
393 |
while(_38){
|
394 |
if(_38.nodeType!=1||_38.tagName!="P"||(_38.getAttributeNode("style")||{}).specified){ |
395 |
_37=null;
|
396 |
}else{
|
397 |
if(_33(_38)){
|
398 |
_39=_38; |
399 |
_37=null;
|
400 |
}else{
|
401 |
if(_37==null){ |
402 |
_37=_38; |
403 |
}else{
|
404 |
if((!_37.lastChild||_37.lastChild.nodeName!="BR")&&(_38.firstChild)&&(_38.firstChild.nodeName!="BR")){ |
405 |
_37.appendChild(this.editor.document.createElement("br")); |
406 |
} |
407 |
while(_38.firstChild){
|
408 |
_37.appendChild(_38.firstChild); |
409 |
} |
410 |
_39=_38; |
411 |
} |
412 |
} |
413 |
} |
414 |
_38=_38.nextSibling; |
415 |
if(_39){
|
416 |
dojo.destroy(_39); |
417 |
_39=null;
|
418 |
} |
419 |
} |
420 |
} |
421 |
return _2e;
|
422 |
}}); |
423 |
} |