Ticket #5567: 5567_3.patch
File 5567_3.patch, 5.3 KB (added by , 14 years ago) |
---|
-
_source/plugins/styles/plugin.js
550 550 styleRange.insertNode( styleNode ); 551 551 552 552 // Let's merge our new style with its neighbors, if possible. 553 mergeSiblings( styleNode);553 styleNode.mergeSiblings(); 554 554 555 555 // As the style system breaks text nodes constantly, let's normalize 556 556 // things for performance. … … 624 624 * no difference that they're separate entities in the DOM tree. So, merge 625 625 * them before removal. 626 626 */ 627 mergeSiblings( element);627 element.mergeSiblings(); 628 628 removeFromElement( this, element ); 629 629 630 630 } … … 1057 1057 if ( firstChild ) 1058 1058 { 1059 1059 // Check the cached nodes for merging. 1060 mergeSiblings( firstChild);1060 firstChild.type == CKEDITOR.NODE_ELEMENT && firstChild.mergeSiblings(); 1061 1061 1062 if ( lastChild && !firstChild.equals( lastChild ) ) 1063 mergeSiblings( lastChild ); 1062 if ( lastChild && !firstChild.equals( lastChild ) 1063 && lastChild.type == CKEDITOR.NODE_ELEMENT ) 1064 lastChild.mergeSiblings(); 1064 1065 } 1065 1066 } 1066 1067 } 1067 1068 1068 function mergeSiblings( element )1069 {1070 if ( !element || element.type != CKEDITOR.NODE_ELEMENT || !CKEDITOR.dtd.$removeEmpty[ element.getName() ] )1071 return;1072 1073 mergeElements( element, element.getNext(), true );1074 mergeElements( element, element.getPrevious() );1075 }1076 1077 function mergeElements( element, sibling, isNext )1078 {1079 if ( sibling && sibling.type == CKEDITOR.NODE_ELEMENT )1080 {1081 var hasBookmark = sibling.getAttribute( '_fck_bookmark' );1082 1083 if ( hasBookmark )1084 sibling = isNext ? sibling.getNext() : sibling.getPrevious();1085 1086 if ( sibling && sibling.type == CKEDITOR.NODE_ELEMENT && element.isIdentical( sibling ) )1087 {1088 // Save the last child to be checked too, to merge things like1089 // <b><i></i></b><b><i></i></b> => <b><i></i></b>1090 var innerSibling = isNext ? element.getLast() : element.getFirst();1091 1092 if ( hasBookmark )1093 ( isNext ? sibling.getPrevious() : sibling.getNext() ).move( element, !isNext );1094 1095 sibling.moveChildren( element, !isNext );1096 sibling.remove();1097 1098 // Now check the last inner child (see two comments above).1099 if ( innerSibling )1100 mergeSiblings( innerSibling );1101 }1102 }1103 }1104 1105 1069 function getElement( style, targetDocument ) 1106 1070 { 1107 1071 var el; -
_source/core/dom/element.js
777 777 }, 778 778 779 779 /** 780 * Whether it's an empty inline elements which has no visual impact when removed. 781 */ 782 isEmptyInlineRemoveable : function() 783 { 784 if ( !CKEDITOR.dtd.$removeEmpty[ this.getName() ] ) 785 return false; 786 787 var children = this.getChildren(); 788 for ( var i = 0, count = children.count(); i < count; i++ ) 789 { 790 var child = children.getItem( i ); 791 792 if ( child.type == CKEDITOR.NODE_ELEMENT && child.getAttribute( '_fck_bookmark' ) ) 793 continue; 794 795 if ( child.type == CKEDITOR.NODE_ELEMENT && !child.isEmptyInlineRemoveable() 796 || child.type == CKEDITOR.NODE_TEXT && CKEDITOR.tools.trim( child.getText() ) ) 797 { 798 return false; 799 } 800 } 801 return true; 802 }, 803 804 /** 780 805 * Indicates that the element has defined attributes. 781 806 * @returns {Boolean} True if the element has attributes. 782 807 * @example … … 874 899 } 875 900 }, 876 901 902 mergeSiblings : ( function() 903 { 904 function mergeElements( element, sibling, isNext ) 905 { 906 if ( sibling && sibling.type == CKEDITOR.NODE_ELEMENT ) 907 { 908 // Jumping over bookmark nodes and empty inline elements, e.g. <b><i></i></b>, 909 // queuing them to be moved later. (#5567) 910 var pendingNodes = []; 911 912 while ( sibling.getAttribute( '_fck_bookmark' ) 913 || sibling.isEmptyInlineRemoveable() ) 914 { 915 pendingNodes.push( sibling ); 916 sibling = isNext ? sibling.getNext() : sibling.getPrevious(); 917 if ( !sibling || sibling.type != CKEDITOR.NODE_ELEMENT ) 918 return; 919 } 920 921 if ( element.isIdentical( sibling ) ) 922 { 923 // Save the last child to be checked too, to merge things like 924 // <b><i></i></b><b><i></i></b> => <b><i></i></b> 925 var innerSibling = isNext ? element.getLast() : element.getFirst(); 926 927 // Move pending nodes first into the target element. 928 while( pendingNodes.length ) 929 pendingNodes.shift().move( element, !isNext ); 930 931 sibling.moveChildren( element, !isNext ); 932 sibling.remove(); 933 934 // Now check the last inner child (see two comments above). 935 if ( innerSibling && innerSibling.type == CKEDITOR.NODE_ELEMENT ) 936 innerSibling.mergeSiblings(); 937 } 938 } 939 } 940 941 return function() 942 { 943 // Merge empty links and anchors also. (#5567) 944 if ( !( CKEDITOR.dtd.$removeEmpty[ this.getName() ] || this.is( 'a' ) ) ) 945 return; 946 947 mergeElements( this, this.getNext(), true ); 948 mergeElements( this, this.getPrevious() ); 949 } 950 } )(), 951 877 952 /** 878 953 * Shows this element (display it). 879 954 * @example