X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=_source%2Fplugins%2Fhtmldataprocessor%2Fplugin.js;h=ad6fa470b9ea54988e0016e3002e80aaeeed6858;hb=4e70ea24db840898be8cc21c950363a52a2a6aba;hp=c431c03a5259fd9a9e9c77b6cb304cae05cc1ef5;hpb=c9fdde67e6384bd5a66adc2b3bba5c4ce9db56c7;p=ckeditor.git
diff --git a/_source/plugins/htmldataprocessor/plugin.js b/_source/plugins/htmldataprocessor/plugin.js
index c431c03..ad6fa47 100644
--- a/_source/plugins/htmldataprocessor/plugin.js
+++ b/_source/plugins/htmldataprocessor/plugin.js
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or http://ckeditor.com/license
*/
@@ -38,40 +38,51 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
}
}
- function blockNeedsExtension( block )
+ function blockNeedsExtension( block, fromSource, extendEmptyBlock )
{
+ if( !fromSource && ( !extendEmptyBlock ||
+ typeof extendEmptyBlock == 'function' && ( extendEmptyBlock( block ) === false ) ) )
+ return false;
+
+ // 1. For IE version >=8, empty blocks are displayed correctly themself in wysiwiyg;
+ // 2. For the rest, at least table cell and list item need no filler space.
+ // (#6248)
+ if ( fromSource && CKEDITOR.env.ie &&
+ ( document.documentMode > 7
+ || block.name in CKEDITOR.dtd.tr
+ || block.name in CKEDITOR.dtd.$listItem ) )
+ return false;
+
var lastChild = lastNoneSpaceChild( block );
- return !lastChild
- || lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br'
- // Some of the controls in form needs extension too,
- // to move cursor at the end of the form. (#4791)
- || block.name == 'form' && lastChild.name == 'input';
+ return !lastChild || lastChild &&
+ ( lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br'
+ // Some of the controls in form needs extension too,
+ // to move cursor at the end of the form. (#4791)
+ || block.name == 'form' && lastChild.name == 'input' );
}
- function extendBlockForDisplay( block )
+ function getBlockExtension( isOutput, emptyBlockFiller )
{
- trimFillers( block, true );
-
- if ( blockNeedsExtension( block ) )
+ return function( node )
{
- if ( CKEDITOR.env.ie )
- block.add( new CKEDITOR.htmlParser.text( '\xa0' ) );
- else
- block.add( new CKEDITOR.htmlParser.element( 'br', {} ) );
- }
- }
+ trimFillers( node, !isOutput );
- function extendBlockForOutput( block )
- {
- trimFillers( block );
-
- if ( blockNeedsExtension( block ) )
- block.add( new CKEDITOR.htmlParser.text( '\xa0' ) );
+ if ( blockNeedsExtension( node, !isOutput, emptyBlockFiller ) )
+ {
+ if ( isOutput || CKEDITOR.env.ie )
+ node.add( new CKEDITOR.htmlParser.text( '\xa0' ) );
+ else
+ node.add( new CKEDITOR.htmlParser.element( 'br', {} ) );
+ }
+ };
}
var dtd = CKEDITOR.dtd;
+ // Define orders of table elements.
+ var tableOrder = [ 'caption', 'colgroup', 'col', 'thead', 'tfoot', 'tbody' ];
+
// Find out the list of block-like tags that can contain
.
var blockLikeTags = CKEDITOR.tools.extend( {}, dtd.$block, dtd.$listItem, dtd.$tableContent );
for ( var i in blockLikeTags )
@@ -89,14 +100,14 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
[
// Event attributes (onXYZ) must not be directly set. They can become
// active in the editing area (IE|WebKit).
- [ ( /^on/ ), '_cke_pa_on' ]
+ [ ( /^on/ ), 'data-cke-pa-on' ]
]
};
var defaultDataBlockFilterRules = { elements : {} };
for ( i in blockLikeTags )
- defaultDataBlockFilterRules.elements[ i ] = extendBlockForDisplay;
+ defaultDataBlockFilterRules.elements[ i ] = getBlockExtension();
var defaultHtmlFilterRules =
{
@@ -112,10 +123,10 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
attributeNames :
[
// Attributes saved for changes and protected attributes.
- [ ( /^_cke_(saved|pa)_/ ), '' ],
+ [ ( /^data-cke-(saved|pa)-/ ), '' ],
- // All "_cke" attributes are to be ignored.
- [ ( /^_cke.*/ ), '' ],
+ // All "data-cke-" attributes are to be ignored.
+ [ ( /^data-cke-.*/ ), '' ],
[ 'hidefocus', '' ]
],
@@ -129,7 +140,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
if ( attribs )
{
// Elements marked as temporary are to be ignored.
- if ( attribs.cke_temp )
+ if ( attribs[ 'data-cke-temp' ] )
return false;
// Remove duplicated attributes - #3789.
@@ -137,7 +148,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
savedAttributeName;
for ( var i = 0 ; i < attributeNames.length ; i++ )
{
- savedAttributeName = '_cke_saved_' + attributeNames[ i ];
+ savedAttributeName = 'data-cke-saved-' + attributeNames[ i ];
savedAttributeName in attribs && ( delete attribs[ attributeNames[ i ] ] );
}
}
@@ -145,6 +156,17 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
return element;
},
+ // The contents of table should be in correct order (#4809).
+ table : function( element )
+ {
+ var children = element.children;
+ children.sort( function ( node1, node2 )
+ {
+ return node1.type == CKEDITOR.NODE_ELEMENT && node2.type == node1.type ?
+ CKEDITOR.tools.indexOf( tableOrder, node1.name ) > CKEDITOR.tools.indexOf( tableOrder, node2.name ) ? 1 : -1 : 0;
+ } );
+ },
+
embed : function( element )
{
var parent = element.parent;
@@ -172,12 +194,22 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
{
if ( !( element.children.length ||
element.attributes.name ||
- element.attributes._cke_saved_name ) )
+ element.attributes[ 'data-cke-saved-name' ] ) )
{
return false;
}
},
+ // Remove dummy span in webkit.
+ span: function( element )
+ {
+ if ( element.attributes[ 'class' ] == 'Apple-style-span' )
+ delete element.name;
+ },
+
+ // Empty
in IE is reported with filler node ( ). + pre : function( element ) { CKEDITOR.env.ie && trimFillers( element ); }, + html : function( element ) { delete element.attributes.contenteditable; @@ -202,7 +234,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license title : function( element ) { var titleText = element.children[ 0 ]; - titleText && ( titleText.value = element.attributes[ '_cke_title' ] || '' ); + titleText && ( titleText.value = element.attributes[ 'data-cke-title' ] || '' ); } }, @@ -213,48 +245,41 @@ For licensing, see LICENSE.html or http://ckeditor.com/license // Remove all class names starting with "cke_". return CKEDITOR.tools.ltrim( value.replace( /(?:^|\s+)cke_[^\s]*/g, '' ) ) || false; } - }, - - comment : function( contents ) - { - // If this is a comment for protected source. - if ( contents.substr( 0, protectedSourceMarker.length ) == protectedSourceMarker ) - { - // Remove the extra marker for real comments from it. - if ( contents.substr( protectedSourceMarker.length, 3 ) == '{C}' ) - contents = contents.substr( protectedSourceMarker.length + 3 ); - else - contents = contents.substr( protectedSourceMarker.length ); - - return new CKEDITOR.htmlParser.cdata( decodeURIComponent( contents ) ); - } - - return contents; } }; - var defaultHtmlBlockFilterRules = { elements : {} }; - - for ( i in blockLikeTags ) - defaultHtmlBlockFilterRules.elements[ i ] = extendBlockForOutput; - if ( CKEDITOR.env.ie ) { // IE outputs style attribute in capital letters. We should convert - // them back to lower case. + // them back to lower case, while not hurting the values (#5930) defaultHtmlFilterRules.attributes.style = function( value, element ) { - return value.toLowerCase(); + return value.replace( /(^|;)([^\:]+)/g, function( match ) + { + return match.toLowerCase(); + }); }; } function protectReadOnly( element ) { - element.attributes.contenteditable = "false"; + var attrs = element.attributes; + + // We should flag that the element was locked by our code so + // it'll be editable by the editor functions (#6046). + if ( attrs.contenteditable != "false" ) + attrs[ 'data-cke-editable' ] = attrs.contenteditable ? 'true' : 1; + + attrs.contenteditable = "false"; } function unprotectReadyOnly( element ) { - delete element.attributes.contenteditable; + var attrs = element.attributes; + switch( attrs[ 'data-cke-editable' ] ) + { + case 'true': attrs.contenteditable = 'true'; break; + case '1': delete attrs.contenteditable; break; + } } // Disable form elements editing mode provided by some browers. (#5746) for ( i in { input : 1, textarea : 1 } ) @@ -263,8 +288,8 @@ For licensing, see LICENSE.html or http://ckeditor.com/license defaultHtmlFilterRules.elements[ i ] = unprotectReadyOnly; } - var protectAttributeRegex = /<((?:a|area|img|input)[\s\S]*?\s)((href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+)))([^>]*)>/gi, - findSavedSrcRegex = /\s_cke_saved_src\s*=/; + var protectElementRegex = /<(a|area|img|input)\b([^>]*)>/gi, + protectAttributeRegex = /\b(href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi; var protectElementsRegex = /(?: