X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Fdomiterator%2Fplugin.js;h=9fc5fd5400ea537d853c3a93ce1243066a1edbb7;hb=039a051ccf3901311661022a30afd60fc38130c9;hp=a7a8e4d4ad3f170e4425ba0add66b522b67e1495;hpb=ea7e3453c7b0f023b050aca6d9f83ab372860d91;p=ckeditor.git diff --git a/_source/plugins/domiterator/plugin.js b/_source/plugins/domiterator/plugin.js index a7a8e4d..9fc5fd5 100644 --- a/_source/plugins/domiterator/plugin.js +++ b/_source/plugins/domiterator/plugin.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ @@ -11,23 +11,26 @@ CKEDITOR.plugins.add( 'domiterator' ); (function() { - - var iterator = function( range ) + /** + * @name CKEDITOR.dom.iterator + */ + function iterator( range ) { if ( arguments.length < 1 ) return; this.range = range; - this.forceBrBreak = false; + this.forceBrBreak = 0; // Whether include
s into the enlarged range.(#3730). - this.enlargeBr = true; - this.enforceRealBlocks = false; + this.enlargeBr = 1; + this.enforceRealBlocks = 0; this._ || ( this._ = {} ); - }, - beginWhitespaceRegex = /^[\r\n\t ]+$/; + } + var beginWhitespaceRegex = /^[\r\n\t ]+$/, + isBookmark = CKEDITOR.dom.walker.bookmark(); iterator.prototype = { getNextParagraph : function( blockTag ) @@ -41,6 +44,9 @@ CKEDITOR.plugins.add( 'domiterator' ); // Indicats that the current element in the loop is the last one. var isLast; + // Indicate at least one of the range boundaries is inside a preformat block. + var touchPre; + // Instructs to cleanup remaining BRs. var removePreviousBr, removeLastBr; @@ -48,7 +54,14 @@ CKEDITOR.plugins.add( 'domiterator' ); if ( !this._.lastNode ) { range = this.range.clone(); - range.enlarge( this.forceBrBreak || !this.enlargeBr ? + + // Shrink the range to exclude harmful "noises" (#4087, #4450, #5435). + range.shrink( CKEDITOR.NODE_ELEMENT, true ); + + touchPre = range.endContainer.hasAscendant( 'pre', true ) + || range.startContainer.hasAscendant( 'pre', true ); + + range.enlarge( this.forceBrBreak && !touchPre || !this.enlargeBr ? CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS : CKEDITOR.ENLARGE_BLOCK_CONTENTS ); var walker = new CKEDITOR.dom.walker( range ), @@ -67,7 +80,7 @@ CKEDITOR.plugins.add( 'domiterator' ); // next block.(#3887) if ( this._.lastNode && this._.lastNode.type == CKEDITOR.NODE_TEXT && - !CKEDITOR.tools.trim( this._.lastNode.getText( ) ) && + !CKEDITOR.tools.trim( this._.lastNode.getText() ) && this._.lastNode.getParent().isBlockBoundary() ) { var testRange = new CKEDITOR.dom.range( range.document ); @@ -99,12 +112,13 @@ CKEDITOR.plugins.add( 'domiterator' ); { // closeRange indicates that a paragraph boundary has been found, // so the range can be closed. - var closeRange = false; + var closeRange = 0, + parentPre = currentNode.hasAscendant( 'pre' ); // includeNode indicates that the current node is good to be part // of the range. By default, any non-element node is ok for it. var includeNode = ( currentNode.type != CKEDITOR.NODE_ELEMENT ), - continueFromSibling = false; + continueFromSibling = 0; // If it is an element node, let's check if it can be part of the // range. @@ -112,12 +126,13 @@ CKEDITOR.plugins.add( 'domiterator' ); { var nodeName = currentNode.getName(); - if ( currentNode.isBlockBoundary( this.forceBrBreak && { br : 1 } ) ) + if ( currentNode.isBlockBoundary( this.forceBrBreak && + !parentPre && { br : 1 } ) ) { //
boundaries must be part of the range. It will // happen only if ForceBrBreak. if ( nodeName == 'br' ) - includeNode = true; + includeNode = 1; else if ( !range && !currentNode.getChildCount() && nodeName != 'hr' ) { // If we have found an empty block, and haven't started @@ -139,7 +154,7 @@ CKEDITOR.plugins.add( 'domiterator' ); this._.nextNode = currentNode; } - closeRange = true; + closeRange = 1; } else { @@ -156,7 +171,7 @@ CKEDITOR.plugins.add( 'domiterator' ); currentNode = currentNode.getFirst(); continue; } - includeNode = true; + includeNode = 1; } } else if ( currentNode.type == CKEDITOR.NODE_TEXT ) @@ -164,7 +179,7 @@ CKEDITOR.plugins.add( 'domiterator' ); // Ignore normal whitespaces (i.e. not including   or // other unicode whitespaces) before/after a block node. if ( beginWhitespaceRegex.test( currentNode.getText() ) ) - includeNode = false; + includeNode = 0; } // The current node is good to be part of the range and we are @@ -186,17 +201,18 @@ CKEDITOR.plugins.add( 'domiterator' ); { var parentNode = currentNode.getParent(); - if ( parentNode.isBlockBoundary( this.forceBrBreak && { br : 1 } ) ) + if ( parentNode.isBlockBoundary( this.forceBrBreak + && !parentPre && { br : 1 } ) ) { - closeRange = true; + closeRange = 1; isLast = isLast || ( parentNode.equals( lastNode) ); break; } currentNode = parentNode; - includeNode = true; + includeNode = 1; isLast = ( currentNode.equals( lastNode ) ); - continueFromSibling = true; + continueFromSibling = 1; } } @@ -209,28 +225,8 @@ CKEDITOR.plugins.add( 'domiterator' ); // We have found a block boundary. Let's close the range and move out of the // loop. - if ( ( closeRange || isLast ) && range ) - { - var boundaryNodes = range.getBoundaryNodes(), - startPath = new CKEDITOR.dom.elementPath( range.startContainer ), - endPath = new CKEDITOR.dom.elementPath( range.endContainer ); - - // Drop the range if it only contains bookmark nodes.(#4087) - if ( boundaryNodes.startNode.equals( boundaryNodes.endNode ) - && boundaryNodes.startNode.getParent().equals( startPath.blockLimit ) - && boundaryNodes.startNode.type == CKEDITOR.NODE_ELEMENT - && boundaryNodes.startNode.getAttribute( '_fck_bookmark' ) ) - { - range = null; - this._.nextNode = null; - } - else + if ( isLast || ( closeRange && range ) ) break; - } - - if ( isLast ) - break; - } // Now, based on the processed range, look for (or create) the block to be returned. @@ -244,7 +240,7 @@ CKEDITOR.plugins.add( 'domiterator' ); return null; } - startPath = new CKEDITOR.dom.elementPath( range.startContainer ); + var startPath = new CKEDITOR.dom.elementPath( range.startContainer ); var startBlockLimit = startPath.blockLimit, checkLimits = { div : 1, th : 1, td : 1 }; block = startPath.block; @@ -306,6 +302,9 @@ CKEDITOR.plugins.add( 'domiterator' ); } } + // Ignore bookmark nodes.(#3783) + var bookmarkGuard = CKEDITOR.dom.walker.bookmark( false, true ); + if ( removePreviousBr ) { var previousSibling = block.getPrevious(); @@ -320,9 +319,6 @@ CKEDITOR.plugins.add( 'domiterator' ); if ( removeLastBr ) { - // Ignore bookmark nodes.(#3783) - var bookmarkGuard = CKEDITOR.dom.walker.bookmark( false, true ); - var lastChild = block.getLast(); if ( lastChild && lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.getName() == 'br' ) { @@ -343,6 +339,12 @@ CKEDITOR.plugins.add( 'domiterator' ); block.getNextSourceNode( true, null, lastNode ); } + if ( !bookmarkGuard( this._.nextNode ) ) + { + this._.nextNode = this._.nextNode.getNextSourceNode( true, null, function( node ) + { return !node.equals( lastNode ) && bookmarkGuard( node ); } ); + } + return block; } };