Changeset 963 for trunk/modules


Ignore:
Timestamp:
02/04/08 17:23:41 (11 years ago)
Author:
ray
Message:

#1150 synchronize "Remove Format" between browsers

Location:
trunk/modules
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/Gecko/Gecko.js

    r962 r963  
    366366      return true; // Indicate paste is done, stop command being issued to browser by Xinha.prototype.execCommand 
    367367    } 
     368    break; 
     369    case 'removeformat': 
     370      var editor = this.editor; 
     371      var sel = editor.getSelection(); 
     372      var selSave = editor.saveSelection(sel); 
     373      var range = editor.createRange(sel); 
     374 
     375      var els = editor._doc.body.getElementsByTagName('*'); 
     376 
     377      var start = ( range.startContainer.nodeType == 1 ) ? range.startContainer : range.startContainer.parentNode; 
     378      var i, el; 
     379      if (sel.isCollapsed) range.selectNodeContents(editor._doc.body); 
     380       
     381      for (i=0; i<els.length;i++) 
     382      { 
     383        el = els[i]; 
     384        if ( range.isPointInRange(el, 0) || (els[i] == start && range.startOffset == 0)) 
     385        { 
     386          el.removeAttribute('style'); 
     387        } 
     388      } 
     389      this.editor._doc.execCommand(cmdID, UI, param); 
     390      editor.restoreSelection(selSave); 
     391      return true; 
     392    break; 
    368393  } 
    369394   
  • trunk/modules/InternetExplorer/InternetExplorer.js

    r962 r963  
    164164    // #645 IE only saves the initial content of the iframe, so we create a temporary iframe with the current editor contents 
    165165    case 'saveas': 
    166     { 
    167166        var doc = null; 
    168167        var editor = this.editor; 
     
    248247        document.body.removeChild(iframe); 
    249248      return true; 
    250     } 
     249    break; 
     250    case 'removeformat': 
     251      var editor = this.editor; 
     252      var sel = editor.getSelection(); 
     253      var selSave = editor.saveSelection(sel); 
     254 
     255      var i, el, els; 
     256 
     257      function clean (el) 
     258      { 
     259        if (el.nodeType != 1) return; 
     260        el.removeAttribute('style'); 
     261        for (var j=0; j<el.childNodes.length;j++) 
     262        { 
     263          clean(el.childNodes[j]); 
     264        } 
     265        if ( (el.tagName.toLowerCase() == 'span' && !el.attributes.length ) || el.tagName.toLowerCase() == 'font') 
     266        { 
     267          el.outerHTML = el.innerHTML; 
     268        } 
     269      } 
     270      if ( editor.selectionEmpty(sel) ) 
     271      { 
     272        els = editor._doc.body.childNodes; 
     273        for (i = 0; i < els.length; i++)  
     274        { 
     275          el = els[i]; 
     276          if (el.nodeType != 1) continue; 
     277          if (el.tagName.toLowerCase() == 'span') 
     278          { 
     279            newNode = editor.convertNode(el, 'div'); 
     280            el.parentNode.replaceChild(newNode, el); 
     281            el = newNode; 
     282          } 
     283          clean(el); 
     284        } 
     285      }  
     286      editor._doc.execCommand(cmdID, UI, param); 
     287 
     288      editor.restoreSelection(selSave); 
     289      return true; 
     290    break; 
    251291  } 
    252292   
     
    393433Xinha.prototype.saveSelection = function() 
    394434{ 
    395   return this.createRange(this._getSelection()) 
     435  return this.createRange(this.getSelection()) 
    396436} 
    397437/**  
     
    489529Xinha.prototype.createRange = function(sel) 
    490530{ 
     531  if (!sel) sel = this.getSelection(); 
    491532  return sel.createRange(); 
    492533}; 
  • trunk/modules/WebKit/WebKit.js

    r962 r963  
    327327      return true; // Indicate paste is done, stop command being issued to browser by Xinha.prototype.execCommand 
    328328    break; 
     329    case 'removeformat': 
     330      var editor = this.editor; 
     331      var sel = editor.getSelection(); 
     332      var selSave = editor.saveSelection(sel); 
     333      var range = editor.createRange(sel); 
     334 
     335      var els = editor._doc.getElementsByTagName('*'); 
     336      els = Xinha.collectionToArray(els); 
     337      var start = ( range.startContainer.nodeType == 1 ) ? range.startContainer : range.startContainer.parentNode; 
     338      var i,el,newNode, fragment, child,r2 = editor._doc.createRange(); 
     339 
     340      function clean (el) 
     341      { 
     342        if (el.nodeType != 1) return; 
     343        el.removeAttribute('style'); 
     344        for (var j=0; j<el.childNodes.length;j++) 
     345        { 
     346          clean(el.childNodes[j]); 
     347        } 
     348        if ( (el.tagName.toLowerCase() == 'span' && !el.attributes.length ) || el.tagName.toLowerCase() == 'font') 
     349        { 
     350          r2.selectNodeContents(el); 
     351          fragment = r2.extractContents(); 
     352          while (fragment.firstChild) 
     353          { 
     354            child = fragment.removeChild(fragment.firstChild); 
     355            el.parentNode.insertBefore(child, el); 
     356          } 
     357          el.parentNode.removeChild(el); 
     358        } 
     359      } 
     360      if (sel.isCollapsed) 
     361      { 
     362        els = editor._doc.body.childNodes; 
     363        for (i = 0; i < els.length; i++)  
     364        { 
     365          el = els[i]; 
     366          if (el.nodeType != 1) continue; 
     367          if (el.tagName.toLowerCase() == 'span') 
     368          { 
     369            newNode = editor.convertNode(el, 'div'); 
     370            el.parentNode.replaceChild(newNode, el); 
     371            el = newNode; 
     372          } 
     373          clean(el); 
     374        } 
     375      }  
     376      else 
     377      { 
     378        for (i=0; i<els.length;i++) 
     379        { 
     380          el = els[i]; 
     381          if ( range.isPointInRange(el, 0) || (els[i] == start && range.startOffset == 0)) 
     382          { 
     383            clean(el); 
     384          } 
     385        } 
     386      } 
     387 
     388      r2.detach(); 
     389      editor.restoreSelection(selSave); 
     390      return true; 
     391    break; 
    329392  } 
    330393 
Note: See TracChangeset for help on using the changeset viewer.