X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Fhtmldataprocessor%2Fplugin.js;h=677d8f3cbdb58cb9397cd0d252f6a2d48a889d4d;hb=refs%2Ftags%2Fv3.5.3;hp=47bdb7c5bf1122b0130643bc4375a88bbd10b56c;hpb=941b0a9ba4e673e292510d80a5a86806994b8ea6;p=ckeditor.git
diff --git a/_source/plugins/htmldataprocessor/plugin.js b/_source/plugins/htmldataprocessor/plugin.js
index 47bdb7c..677d8f3 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
*/
@@ -16,7 +16,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
{
var lastIndex = block.children.length,
last = block.children[ lastIndex - 1 ];
- while( last && last.type == CKEDITOR.NODE_TEXT && !CKEDITOR.tools.trim( last.value ) )
+ while ( last && last.type == CKEDITOR.NODE_TEXT && !CKEDITOR.tools.trim( last.value ) )
last = block.children[ --lastIndex ];
return last;
}
@@ -38,35 +38,51 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
}
}
- function blockNeedsExtension( block )
+ function blockNeedsExtension( block, fromSource, extendEmptyBlock )
{
- var lastChild = lastNoneSpaceChild( block );
- return !lastChild || lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br';
- }
+ 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;
- function extendBlockForDisplay( block )
- {
- trimFillers( block, true );
+ var lastChild = lastNoneSpaceChild( block );
- if ( blockNeedsExtension( block ) )
- {
- if ( CKEDITOR.env.ie )
- block.add( new CKEDITOR.htmlParser.text( '\xa0' ) );
- else
- block.add( new CKEDITOR.htmlParser.element( 'br', {} ) );
- }
+ 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 extendBlockForOutput( block )
+ function getBlockExtension( isOutput, emptyBlockFiller )
{
- trimFillers( block );
+ return function( node )
+ {
+ trimFillers( node, !isOutput );
- 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 )
@@ -79,18 +95,26 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
delete blockLikeTags.pre;
var defaultDataFilterRules =
{
+ elements : {
+ a : function( element )
+ {
+ var attrs = element.attributes;
+ if ( attrs && attrs[ 'data-cke-saved-name' ] )
+ attrs[ 'class' ] = ( attrs[ 'class' ] ? attrs[ 'class' ] + ' ' : '' ) + 'cke_anchor';
+ }
+ },
attributeNames :
[
// 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 =
{
@@ -106,10 +130,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', '' ]
],
@@ -123,7 +147,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.
@@ -131,7 +155,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 ] ] );
}
}
@@ -139,6 +163,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;
@@ -166,12 +201,28 @@ 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; + delete element.attributes[ 'class' ]; + }, + body : function( element ) { delete element.attributes.spellcheck; @@ -185,6 +236,12 @@ For licensing, see LICENSE.html or http://ckeditor.com/license if ( !element.attributes.type ) element.attributes.type = 'text/css'; + }, + + title : function( element ) + { + var titleText = element.children[ 0 ]; + titleText && ( titleText.value = element.attributes[ 'data-cke-title' ] || '' ); } }, @@ -195,42 +252,51 @@ 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(); + }); }; } - var protectAttributeRegex = /<(?:a|area|img|input)[\s\S]*?\s((?:href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+)))/gi; + function protectReadOnly( element ) + { + 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 ) + { + 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 } ) + { + defaultDataFilterRules.elements[ i ] = protectReadOnly; + defaultHtmlFilterRules.elements[ i ] = unprotectReadyOnly; + } + + var protectElementRegex = /<(a|area|img|input)\b([^>]*)>/gi, + protectAttributeRegex = /\b(href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi; var protectElementsRegex = /(?: