Ticket #1355: 1355.patch

File 1355.patch, 2.4 KB (added by Martin Kou, 16 years 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                }
© 2003 – 2022, CKSource sp. z o.o. sp.k. All rights reserved. | Terms of use | Privacy policy