root / trunk / web / dojo / dijit / _editor / plugins / EnterKeyHandling.js
History | View | Annotate | Download (10.3 KB)
1 | 9 | andrej.cim | /*
|
---|---|---|---|
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 | } |