Changeset 1559


Ignore:
Timestamp:
02/19/2008 09:23:57 AM (7 years ago)
Author:
martinkou
Message:

Fixed #1355 : Linebreaks and spaces are now conserved when converting to and from the "Formatted" format.

Location:
FCKeditor/trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • FCKeditor/trunk/_whatsnew.html

    r1558 r1559  
    103103                        which occurs in the Find/Replace dialog when the user presses "Find" or "Replace" after the "No 
    104104                        match found" message has appeared.</li> 
     105                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1355">#1355</a>] Linebreaks and spaces are now 
     106                        conserved when converting to and from the "Formatted" format.</li> 
    105107        </ul> 
    106108        <p> 
  • FCKeditor/trunk/editor/_source/classes/fckstyle.js

    r1399 r1559  
    748748 
    749749        /** 
     750         * Converting from a PRE block to a non-PRE block in formatting operations. 
     751         */ 
     752        _FromPre : function( doc, block, newBlock ) 
     753        { 
     754                var innerHTML = block.innerHTML ; 
     755 
     756                // Trim the first and last linebreaks immediately after and before <pre>, </pre>, 
     757                // if they exist. 
     758                // This is done because the linebreaks are not rendered. 
     759                innerHTML = innerHTML.replace( /(\r\n|\r)/g, '\n' ) ; 
     760                innerHTML = innerHTML.replace( /^[ \t]*\n/, '' ) ; 
     761                innerHTML = innerHTML.replace( /\n$/, '' ) ; 
     762 
     763                // 1. Convert spaces or tabs at the beginning or at the end to &nbsp; 
     764                innerHTML = innerHTML.replace( /^[ \t]+|[ \t]+$/g, function( match, offset, s ) 
     765                                { 
     766                                        if ( match.length == 1 )        // one space, preserve it 
     767                                                return '&nbsp;' ; 
     768                                        else if ( offset == 0 )         // beginning of block 
     769                                                return new Array( match.length ).join( '&nbsp;' ) + ' ' ; 
     770                                        else                            // end of block 
     771                                                return ' ' + new Array( match.length ).join( '&nbsp;' ) ; 
     772                                } ) ; 
     773 
     774                // 2. Convert \n to <BR>. 
     775                // 3. Convert contiguous (i.e. non-singular) spaces or tabs to &nbsp; 
     776                var htmlIterator = new FCKHtmlIterator( innerHTML ) ; 
     777                var results = [] ; 
     778                htmlIterator.Each( function( isTag, value ) 
     779                        { 
     780                                if ( !isTag ) 
     781                                { 
     782                                        value = value.replace( /\n/g, '<BR>' ) ; 
     783                                        value = value.replace( /[ \t]{2,}/g,  
     784                                                        function ( match ) 
     785                                                        { 
     786                                                                return new Array( match.length ).join( '&nbsp;' ) + ' ' ; 
     787                                                        } ) ; 
     788                                } 
     789                                results.push( value ) ; 
     790                        } ) ; 
     791                newBlock.innerHTML = results.join( '' ) ; 
     792                return newBlock ; 
     793        }, 
     794 
     795        /** 
     796         * Converting from a non-PRE block to a PRE block in formatting operations. 
     797         */ 
     798        _ToPre : function( doc, block, newBlock ) 
     799        { 
     800                // Handle converting from a regular block to a <pre> block. 
     801                var innerHTML = block.innerHTML.Trim() ; 
     802 
     803                // 1. Delete ANSI whitespaces immediately before and after <BR> because they are not visible. 
     804                // 2. Mark down any <BR /> nodes here so they can be turned into \n in the next step and avoid being compressed. 
     805                innerHTML = innerHTML.replace( /[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi, '<BR />' ) ; 
     806 
     807                // 3. Compress other ANSI whitespaces since they're only visible as one single space previously. 
     808                // 4. Convert &nbsp; to spaces since &nbsp; is no longer needed in <PRE>. 
     809                // 5. Convert any <BR /> to \n. This must not be done earlier because the \n would then get compressed. 
     810                var htmlIterator = new FCKHtmlIterator( innerHTML ) ; 
     811                var results = [] ; 
     812                htmlIterator.Each( function( isTag, value ) 
     813                        { 
     814                                if ( !isTag ) 
     815                                        value = value.replace( /([ \t\n\r]+|&nbsp;)/g, ' ' ) ; 
     816                                else if ( isTag && value == '<BR />' ) 
     817                                        value = '\n' ; 
     818                                results.push( value ) ; 
     819                        } ) ; 
     820 
     821                // Assigning innerHTML to <PRE> in IE causes all linebreaks to be reduced to spaces. 
     822                // Assigning outerHTML to <PRE> in IE doesn't work if the <PRE> isn't contained in another node 
     823                // since the node reference is changed after outerHTML assignment. 
     824                // So, we need some hacks to workaround IE bugs here. 
     825                if ( FCKBrowserInfo.IsIE ) 
     826                { 
     827                        var temp = doc.createElement( 'div' ) ; 
     828                        temp.appendChild( newBlock ) ; 
     829                        newBlock.outerHTML = '<PRE>\n' + results.join( '' ) + '</PRE>' ; 
     830                        newBlock = temp.removeChild( temp.firstChild ) ; 
     831                } 
     832                else 
     833                        newBlock.innerHTML = results.join( '' ) ; 
     834                return newBlock ; 
     835        }, 
     836 
     837        /** 
    750838         * Apply an inline style to a FCKDomRange. 
    751839         * 
     
    760848 
    761849                if ( selectIt ) 
    762                         bookmark = range.CreateBookmark( true ) ; 
     850                        bookmark = range.CreateBookmark() ; 
    763851 
    764852                var iterator = new FCKDomRangeIterator( range ) ; 
     
    766854 
    767855                var block ; 
     856                var doc = range.Window.document ; 
     857 
    768858                while( ( block = iterator.GetNextParagraph() ) )                // Only one = 
    769859                { 
    770860                        // Create the new node right before the current one. 
    771                         var newBlock = block.parentNode.insertBefore( this.BuildElement( range.Window.document ), block ) ; 
     861                        var newBlock = this.BuildElement( doc ) ; 
    772862 
    773863                        // Move everything from the current node to the new one. 
    774                         FCKDomTools.MoveChildren( block, newBlock ) ; 
    775  
    776                         // Delete the current node. 
     864                        var newBlockIsPre = newBlock.nodeName.IEquals( 'pre' ) ; 
     865                        var blockIsPre = block.nodeName.IEquals( 'pre' ) ; 
     866                        if ( newBlockIsPre && !blockIsPre ) 
     867                                newBlock = this._ToPre( doc, block, newBlock ) ; 
     868                        else if ( !newBlockIsPre && blockIsPre ) 
     869                                newBlock = this._FromPre( doc, block, newBlock ) ; 
     870                        else    // Convering from a regular block to another regular block. 
     871                                FCKDomTools.MoveChildren( block, newBlock ) ; 
     872 
     873                        // Replace the current block. 
     874                        block.parentNode.insertBefore( newBlock, block ) ; 
    777875                        FCKDomTools.RemoveNode( block ) ; 
    778876                } 
     
    783881 
    784882                if ( updateRange ) 
    785                         range.MoveToBookmark( range ) ; 
     883                        range.MoveToBookmark( bookmark ) ; 
    786884        }, 
    787885 
  • FCKeditor/trunk/editor/_source/internals/fckregexlib.js

    r1062 r1559  
    9494StyleVariableAttName : /#\(\s*("|')(.+?)\1[^\)]*\s*\)/g, 
    9595 
    96 RegExp : /^\/(.*)\/([gim]*)$/ 
     96RegExp : /^\/(.*)\/([gim]*)$/, 
     97 
     98HtmlTag : /<[^\s<>](?:"[^"]*"|'[^']*'|[^<])*>/ 
    9799} ; 
  • FCKeditor/trunk/editor/fckeditor.html

    r1398 r1559  
    187187LoadScript( '_source/classes/fckcontextmenu.js' ) ; 
    188188LoadScript( '_source/internals/fck_contextmenu.js' ) ; 
     189LoadScript( '_source/classes/fckhtmliterator.js' ) ; 
    189190LoadScript( '_source/classes/fckplugin.js' ) ; 
    190191LoadScript( '_source/internals/fckplugins.js' ) ; 
  • FCKeditor/trunk/fckpackager.xml

    r1398 r1559  
    158158                <File path="editor/_source/classes/fckcontextmenu.js" /> 
    159159                <File path="editor/_source/internals/fck_contextmenu.js" /> 
     160                <File path="editor/_source/class/fckhtmliterator.js" /> 
    160161 
    161162                <File path="editor/_source/classes/fckplugin.js" /> 
     
    253254                <File path="editor/_source/classes/fckcontextmenu.js" /> 
    254255                <File path="editor/_source/internals/fck_contextmenu.js" /> 
     256                <File path="editor/_source/class/fckhtmliterator.js" /> 
    255257 
    256258                <File path="editor/_source/classes/fckplugin.js" /> 
Note: See TracChangeset for help on using the changeset viewer.
© 2003 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy