Changeset 963


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

#1150 synchronize "Remove Format" between browsers

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/examples/testbed.html

    r962 r963  
    153153        </style> 
    154154      </head> 
    155       <body> 
     155      <body><span style="color:purple"> 
    156156      <img src="../images/xinha_logo.gif" usemap="#m1"> 
    157157      <map name="m1"> 
     
    163163        Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis 
    164164        velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique 
    165         ante elementum turpis. Aliquam nisl. Nulla posuere neque non 
    166         tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis 
     165        ante elementum turpis.  <span style="color:green">Aliquam </span> nisl. Nulla posuere neque non 
     166        tellus. Morbi vel nibh. <font face="Arial"><font color="#009933">Cum  sociis natoque</font></font> penatibus et magnis dis 
    167167        parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi. 
    168168        Curabitur pharetra bibendum lectus. 
     
    170170 
    171171      <ul> 
    172         <li> Phasellus et massa sed diam viverra semper.  </li> 
     172        <li style="color:green"> Phasellus et massa sed diam viverra semper.  </li> 
    173173        <li> Mauris tincidunt felis in odio.              </li> 
    174174        <li> Nulla placerat nunc ut pede.                 </li> 
     
    177177        <li> Nunc sit amet metus in tortor semper mattis. </li> 
    178178      </ul> 
    179       </body> 
     179      </span></body> 
    180180      </html> 
    181181    </textarea> 
  • 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 
  • trunk/plugins/GenericPlugin/generic-plugin.js

    r962 r963  
    4343GenericPlugin.prototype.onExecCommand = function ( cmdID, UI, param ) 
    4444{ 
    45         if (cmdID != 'removeformat') return false; 
    46  
    47         var editor = this.editor; 
    48         var sel = editor.getSelection(); 
    49         var range = editor.createRange(sel); 
    50  
    51         var els = editor._doc.getElementsByTagName('*'); 
    52          
    53         var start = ( range.startContainer.nodeType == 1 ) ? range.startContainer : range.startContainer.parentNode; 
    54         var end = ( range.endContainer.nodeType == 1 ) ? range.endContainer : range.endContainer.parentNode; 
    55          
    56         function clean(node) 
    57         { 
    58                 node.removeAttribute('style'); 
    59         } 
    60          
    61         for (var i=0; i<els.length;i++) 
    62         { 
    63                 if (els[i] == start) 
    64                 { 
    65                         console.log({el : els[i], 'cmp' : 'start'}); 
    66                 }  
    67                 else if (els[i] == end) 
    68                 { 
    69                         console.log({el : els[i], 'cmp' : 'end'}); 
    70                 } 
    71                 else 
    72                 { 
    73                         clean(els[i]); 
    74                         console.log({el : els[i], 'cmp' : range.isPointInRange( els[i], 0 )}); 
    75                 } 
    76                  
    77         } 
    78         return true; 
     45        return false; 
    7946} 
    8047 
  • trunk/release-notes.txt

    r950 r963  
    77Xinha 0.95 (due soon) 
    88Bugs Fixed 
     9 * fixed #1040 htmlRemoveTags doesn't work in IE  
     10 * fixed #645 IE Save as function only saves the original html  
     11 * fixed #1136 FF3 Linux select boxes in toolbar are too small  
    912 * fixed #1100 Extended File Manager - Error after opening window 
    1013 * fixed #1103 [TransformInnerHTML] IE breaks singlet attributes starting with "no" 
     
    2326 * fixed #1015 Mozilla shows scrollbars on click in Stylist  
    2427 * #918 removed mozParaHandler dirty as it had been broken for a long time 
     28 * fixed #1015 Mozilla shows scrollbars on click in Stylist  
     29 * fixed #1148 HTML entities break when cursor is inside when switching from HTML to WYSIWYG  
    2530  
    2631Enhancements 
     32 * #1143  add Safari support 
     33 * #1138 added API functions Xinha.getEditor(), Xinha.prototype.getPluginInstance(), Xinha.addOnloadHandler()  
     34 * #1137 [Equation] FF3 fixes & improved way of avoiding formula changes in editor 
     35 * #1150 synchronize "Remove Format" between browsers 
    2736 * added plugin PreserveScripts for enhanced editing of pages containing PHP and/or JavaScript () 
    2837 * Loading message facelift 
     
    3645 * #442 removed alert "Your Document is not well formed..." 
    3746 * #1119 disabled Firefox 2 spell check when ContextMenu is enabled  
     47 * added a plugin "GenericPlugin" as a democase for plugin event handlers 
    3848 
    3949I18n 
Note: See TracChangeset for help on using the changeset viewer.