X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Fstyles%2Fplugin.js;h=5eee1855aa4ec1e4db913c820a6e37af48f05acb;hb=039a051ccf3901311661022a30afd60fc38130c9;hp=3c6fedb59c908f2db5cb3121ea66d04efb89d777;hpb=e371ddf8abcb89013e20e6d0dd746adec344d0e5;p=ckeditor.git diff --git a/_source/plugins/styles/plugin.js b/_source/plugins/styles/plugin.js index 3c6fedb..5eee185 100644 --- a/_source/plugins/styles/plugin.js +++ b/_source/plugins/styles/plugin.js @@ -137,6 +137,8 @@ CKEDITOR.STYLE_OBJECT = 3; return ( this.removeFromRange = this.type == CKEDITOR.STYLE_INLINE ? removeInlineStyle + : this.type == CKEDITOR.STYLE_OBJECT ? + removeObjectStyle : null ).call( this, range ); }, @@ -404,7 +406,7 @@ CKEDITOR.STYLE_OBJECT = 3; var nodeType = currentNode.type; var nodeName = nodeType == CKEDITOR.NODE_ELEMENT ? currentNode.getName() : null; - if ( nodeName && currentNode.getAttribute( '_fck_bookmark' ) ) + if ( nodeName && currentNode.getAttribute( '_cke_bookmark' ) ) { currentNode = currentNode.getNextSourceNode( true ); continue; @@ -476,39 +478,64 @@ CKEDITOR.STYLE_OBJECT = 3; if ( applyStyle && styleRange && !styleRange.collapsed ) { // Build the style element, based on the style object definition. - var styleNode = getElement( this, document ); + var styleNode = getElement( this, document ), + styleHasAttrs = styleNode.hasAttributes(); // Get the element that holds the entire range. var parent = styleRange.getCommonAncestor(); + var removeList = { + styles : {}, + attrs : {}, + // Styles cannot be removed. + blockedStyles : {}, + // Attrs cannot be removed. + blockedAttrs : {} + }; + + var attName, styleName, value; + // Loop through the parents, removing the redundant attributes // from the element to be applied. while ( styleNode && parent ) { if ( parent.getName() == elementName ) { - for ( var attName in def.attributes ) + for ( attName in def.attributes ) { - if ( styleNode.getAttribute( attName ) == parent.getAttribute( attName ) ) - styleNode.removeAttribute( attName ); - } + if ( removeList.blockedAttrs[ attName ] || !( value = parent.getAttribute( styleName ) ) ) + continue; - for ( var styleName in def.styles ) - { - if ( styleNode.getStyle( styleName ) == parent.getStyle( styleName ) ) - styleNode.removeStyle( styleName ); + if ( styleNode.getAttribute( attName ) == value ) + removeList.attrs[ attName ] = 1; + else + removeList.blockedAttrs[ attName ] = 1; } - if ( !styleNode.hasAttributes() ) + for ( styleName in def.styles ) { - styleNode = null; - break; + if ( removeList.blockedStyles[ styleName ] || !( value = parent.getStyle( styleName ) ) ) + continue; + + if ( styleNode.getStyle( styleName ) == value ) + removeList.styles[ styleName ] = 1; + else + removeList.blockedStyles[ styleName ] = 1; } } parent = parent.getParent(); } + for ( attName in removeList.attrs ) + styleNode.removeAttribute( attName ); + + for ( styleName in removeList.styles ) + styleNode.removeStyle( styleName ); + + if ( styleHasAttrs && !styleNode.hasAttributes() ) + styleNode = null; + if ( styleNode ) { // Move the contents of the range to the style element. @@ -534,6 +561,15 @@ CKEDITOR.STYLE_OBJECT = 3; if ( !CKEDITOR.env.ie ) styleNode.$.normalize(); } + // Style already inherit from parents, left just to clear up any internal overrides. (#5931) + else + { + styleNode = new CKEDITOR.dom.element( 'span' ); + styleRange.extractContents().appendTo( styleNode ); + styleRange.insertNode( styleNode ); + removeFromInsideElement( this, styleNode ); + styleNode.remove( true ); + } // Style applied, let's release the range, so it gets // re-initialization in the next loop. @@ -719,6 +755,41 @@ CKEDITOR.STYLE_OBJECT = 3; element && setupElement( element, this ); } + function removeObjectStyle( range ) + { + var root = range.getCommonAncestor( true, true ), + element = root.getAscendant( this.element, true ); + + if ( !element ) + return; + + var style = this; + var def = style._.definition; + var attributes = def.attributes; + var styles = CKEDITOR.style.getStyleText( def ); + + // Remove all defined attributes. + if ( attributes ) + { + for ( var att in attributes ) + { + element.removeAttribute( att, attributes[ att ] ); + } + } + + // Assign all defined styles. + if ( def.styles ) + { + for ( var i in def.styles ) + { + if ( !def.styles.hasOwnProperty( i ) ) + continue; + + element.removeStyle( i ); + } + } + } + function applyBlockStyle( range ) { // Serializible bookmarks is needed here since @@ -738,7 +809,7 @@ CKEDITOR.STYLE_OBJECT = 3; while ( ( block = iterator.getNextParagraph() ) ) // Only one = { - var newBlock = getElement( this, doc ); + var newBlock = getElement( this, doc, block ); replaceBlock( block, newBlock ); } @@ -812,7 +883,7 @@ CKEDITOR.STYLE_OBJECT = 3; { // Exclude the ones at header OR at tail, // and ignore bookmark content between them. - var duoBrRegex = /(\S\s*)\n(?:\s|(]+_fck_bookmark.*?\/span>))*\n(?!$)/gi, + var duoBrRegex = /(\S\s*)\n(?:\s|(]+_cke_bookmark.*?\/span>))*\n(?!$)/gi, blockName = preBlock.getName(), splitedHtml = replace( preBlock.getOuterHtml(), duoBrRegex, @@ -834,7 +905,7 @@ CKEDITOR.STYLE_OBJECT = 3; var headBookmark = '', tailBookmark = ''; - str = str.replace( /(^]+_fck_bookmark.*?\/span>)|(]+_fck_bookmark.*?\/span>$)/gi, + str = str.replace( /(^]+_cke_bookmark.*?\/span>)|(]+_cke_bookmark.*?\/span>$)/gi, function( str, m1, m2 ){ m1 && ( headBookmark = m1 ); m2 && ( tailBookmark = m2 ); @@ -1046,7 +1117,7 @@ CKEDITOR.STYLE_OBJECT = 3; } } - function getElement( style, targetDocument ) + function getElement( style, targetDocument, element ) { var el; @@ -1061,6 +1132,10 @@ CKEDITOR.STYLE_OBJECT = 3; // Create the element. el = new CKEDITOR.dom.element( elementName, targetDocument ); + // #6226: attributes should be copied before the new ones are applied + if ( element ) + element.copyAttributes( el ); + return setupElement( el, style ); } @@ -1080,7 +1155,7 @@ CKEDITOR.STYLE_OBJECT = 3; } // Assign all defined styles. - if ( styles ) + if( styles ) el.setAttribute( 'style', styles ); return el; @@ -1231,7 +1306,11 @@ CKEDITOR.STYLE_OBJECT = 3; // Compensate tail semi-colon. return styleText.replace( /\s*([;:])\s*/, '$1' ) .replace( /([^\s;])$/, '$1;') - .replace( /,\s+/g, ',' ) // Trimming spaces after comma (e.g. font-family name)(#4107). + // Trimming spaces after comma(#4107), + // remove quotations(#6403), + // mostly for differences on "font-family". + .replace( /,\s+/g, ',' ) + .replace( /\"/g,'' ) .toLowerCase(); } @@ -1275,8 +1354,8 @@ CKEDITOR.STYLE_OBJECT = 3; { var selection = document.getSelection(), // Bookmark the range so we can re-select it after processing. - bookmarks = selection.createBookmarks(), - ranges = selection.getRanges( true ), + bookmarks = selection.createBookmarks( 1 ), + ranges = selection.getRanges( 1 ), func = remove ? this.removeFromRange : this.applyToRange, range; @@ -1287,7 +1366,7 @@ CKEDITOR.STYLE_OBJECT = 3; if ( bookmarks.length == 1 && bookmarks[0].collapsed ) { selection.selectRanges( ranges ); - bookmarks[0].startNode.remove(); + document.getById( bookmarks[ 0 ].startNode ).remove(); } else selection.selectBookmarks( bookmarks );