Ticket #1355: 1355.patch

File 1355.patch, 2.4 kB (added by martinkou, 5 months ago)

Proposed patch for fixing #1355.

  • editor/_source/classes/fckstyle.js

     
    769769                        // Move everything from the current node to the new one. 
    770770                        FCKDomTools.MoveChildren( block, newBlock ) ; 
    771771 
     772                        // If we're in a non-IE browser, and the newBlock is <pre>, and the old block is not <pre>, 
     773                        // then we need to clear linebreaks and compress ANSI whitespaces so that we don't get disrupted 
     774                        // output in <pre> mode. (Bug #1355) 
     775                        if ( !FCKBrowserInfo.IsIE && newBlock.nodeName.IEquals( 'pre' ) && !block.nodeName.IEquals( 'pre' ) ) 
     776                        { 
     777                                // If the newBlock's first child is a text node, left-trim it since any ANSI whitespace  
     778                                // after a non-pre block is meaningless. 
     779                                if ( newBlock.firstChild && newBlock.firstChild.nodeType == 3 ) 
     780                                        newBlock.firstChild.nodeValue = newBlock.firstChild.nodeValue.LTrim() ; 
     781 
     782                                // Ditto for the last child. 
     783                                if ( newBlock.lastChild && newBlock.lastChild.nodeType == 3 ) 
     784                                        newBlock.lastChild.nodeValue = newBlock.lastChild.nodeValue.RTrim() ; 
     785 
     786                                // DFS walk the newBlock to compress ANSI whitespaces and delete excessive linebreaks. 
     787                                var currentNode = newBlock ; 
     788                                while ( currentNode ) 
     789                                { 
     790                                        currentNode = FCKDomTools.GetNextSourceNode( currentNode, false, 3, newBlock.parentNode ) ; 
     791                                        if ( currentNode ) 
     792                                        { 
     793                                                // If the text node ends with a line break, and its next sibling is a <BR>, 
     794                                                // then right-trim the text node. 
     795                                                if ( currentNode.nodeValue.charAt( currentNode.nodeValue.length - 1 ) == '\n' 
     796                                                                && currentNode.nextSibling  
     797                                                                && currentNode.nextSibling.nodeName.IEquals( 'br' ) ) 
     798                                                        currentNode.nodeValue = currentNode.nodeValue.RTrim() ; 
     799                                                // If the text node begins with a line break, and its next sibling is a <BR>, 
     800                                                // then left-trim the text node. 
     801                                                if ( currentNode.nodeValue.charAt( 0 ) == '\n' 
     802                                                                && currentNode.previousSibling  
     803                                                                && currentNode.previousSibling.nodeName.IEquals( 'br' ) ) 
     804                                                        currentNode.nodeValue = currentNode.nodeValue.LTrim() ; 
     805                                                // Compress any ANSI whitespaces left. 
     806                                                currentNode.nodeValue = currentNode.nodeValue.replace( /[\r\n\t ]+/g, ' ' ) ; 
     807                                        } 
     808                                } 
     809                        } 
     810 
    772811                        // Delete the current node. 
    773812                        FCKDomTools.RemoveNode( block ) ; 
    774813                }