/*\r
-Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.\r
For licensing, see LICENSE.html or http://ckeditor.com/license\r
*/\r
\r
{\r
return ( ( !movingOut || !limitLTR.equals( node ) )\r
&& ( !blockerLTR || !node.equals( blockerLTR ) )\r
- && ( node.type != CKEDITOR.NODE_ELEMENT || node.getName() != 'body' ) );\r
+ && ( node.type != CKEDITOR.NODE_ELEMENT || !movingOut || node.getName() != 'body' ) );\r
};\r
}\r
\r
{\r
return ( ( !movingOut || !limitRTL.equals( node ) )\r
&& ( !blockerRTL || !node.equals( blockerRTL ) )\r
- && ( node.type != CKEDITOR.NODE_ELEMENT || node.getName() != 'body' ) );\r
+ && ( node.type != CKEDITOR.NODE_ELEMENT || !movingOut || node.getName() != 'body' ) );\r
};\r
}\r
\r
if ( stopGuard( node, movingOut ) === false )\r
return false;\r
\r
- return userGuard( node );\r
+ return userGuard( node, movingOut );\r
};\r
}\r
else\r
node = null;\r
}\r
else\r
- node = ( guard ( node ) === false ) ?\r
+ node = ( guard ( node, true ) === false ) ?\r
null : node.getPreviousSourceNode( true, type, guard );\r
}\r
else\r
node = null;\r
}\r
else\r
- node = ( guard ( range.startContainer ) === false ) ?\r
+ node = ( guard ( range.startContainer, true ) === false ) ?\r
null : range.startContainer.getNextSourceNode( true, type, guard ) ;\r
}\r
}\r
{\r
return this.blockBoundary( { br : 1 } );\r
};\r
- /**\r
- * Whether the node is a bookmark node's inner text node.\r
- */\r
- CKEDITOR.dom.walker.bookmarkContents = function( node )\r
- {\r
- },\r
\r
/**\r
* Whether the to-be-evaluated node is a bookmark node OR bookmark node\r
{\r
return ( node && node.getName\r
&& node.getName() == 'span'\r
- && node.hasAttribute('_fck_bookmark') );\r
+ && node.hasAttribute('_cke_bookmark') );\r
}\r
\r
return function( node )\r
};\r
\r
/**\r
- * Whether the node contains only white-spaces characters.\r
+ * Whether the node is a text node containing only whitespaces characters.\r
* @param isReject\r
*/\r
CKEDITOR.dom.walker.whitespaces = function( isReject )\r
return isReject ^ isWhitespace;\r
};\r
};\r
+\r
+ /**\r
+ * Whether the node is invisible in wysiwyg mode.\r
+ * @param isReject\r
+ */\r
+ CKEDITOR.dom.walker.invisible = function( isReject )\r
+ {\r
+ var whitespace = CKEDITOR.dom.walker.whitespaces();\r
+ return function( node )\r
+ {\r
+ // Nodes that take no spaces in wysiwyg:\r
+ // 1. White-spaces but not including NBSP;\r
+ // 2. Empty inline elements, e.g. <b></b> we're checking here\r
+ // 'offsetHeight' instead of 'offsetWidth' for properly excluding\r
+ // all sorts of empty paragraph, e.g. <br />.\r
+ var isInvisible = whitespace( node ) || node.is && !node.$.offsetHeight;\r
+ return isReject ^ isInvisible;\r
+ };\r
+ };\r
+\r
+ var tailNbspRegex = /^[\t\r\n ]*(?: |\xa0)$/,\r
+ isNotWhitespaces = CKEDITOR.dom.walker.whitespaces( true ),\r
+ isNotBookmark = CKEDITOR.dom.walker.bookmark( false, true ),\r
+ fillerEvaluator = function( element )\r
+ {\r
+ return isNotBookmark( element ) && isNotWhitespaces( element );\r
+ };\r
+\r
+ // Check if there's a filler node at the end of an element, and return it.\r
+ CKEDITOR.dom.element.prototype.getBogus = function ()\r
+ {\r
+ var tail = this.getLast( fillerEvaluator );\r
+ if ( tail && ( !CKEDITOR.env.ie ? tail.is && tail.is( 'br' )\r
+ : tail.getText && tailNbspRegex.test( tail.getText() ) ) )\r
+ {\r
+ return tail;\r
+ }\r
+ return false;\r
+ };\r
+\r
})();\r