removeformat.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /**
  2. * 清除格式
  3. * @file
  4. * @since 1.2.6.1
  5. */
  6. /**
  7. * 清除文字样式
  8. * @command removeformat
  9. * @method execCommand
  10. * @param { String } cmd 命令字符串
  11. * @param {String} tags 以逗号隔开的标签。如:strong
  12. * @param {String} style 样式如:color
  13. * @param {String} attrs 属性如:width
  14. * @example
  15. * ```javascript
  16. * editor.execCommand( 'removeformat', 'strong','color','width' );
  17. * ```
  18. */
  19. UE.plugins['removeformat'] = function(){
  20. var me = this;
  21. me.setOpt({
  22. 'removeFormatTags': 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var',
  23. 'removeFormatAttributes':'class,style,lang,width,height,align,hspace,valign'
  24. });
  25. me.commands['removeformat'] = {
  26. execCommand : function( cmdName, tags, style, attrs,notIncludeA ) {
  27. var tagReg = new RegExp( '^(?:' + (tags || this.options.removeFormatTags).replace( /,/g, '|' ) + ')$', 'i' ) ,
  28. removeFormatAttributes = style ? [] : (attrs || this.options.removeFormatAttributes).split( ',' ),
  29. range = new dom.Range( this.document ),
  30. bookmark,node,parent,
  31. filter = function( node ) {
  32. return node.nodeType == 1;
  33. };
  34. function isRedundantSpan (node) {
  35. if (node.nodeType == 3 || node.tagName.toLowerCase() != 'span'){
  36. return 0;
  37. }
  38. if (browser.ie) {
  39. //ie 下判断实效,所以只能简单用style来判断
  40. //return node.style.cssText == '' ? 1 : 0;
  41. var attrs = node.attributes;
  42. if ( attrs.length ) {
  43. for ( var i = 0,l = attrs.length; i<l; i++ ) {
  44. if ( attrs[i].specified ) {
  45. return 0;
  46. }
  47. }
  48. return 1;
  49. }
  50. }
  51. return !node.attributes.length;
  52. }
  53. function doRemove( range ) {
  54. var bookmark1 = range.createBookmark();
  55. if ( range.collapsed ) {
  56. range.enlarge( true );
  57. }
  58. //不能把a标签切了
  59. if(!notIncludeA){
  60. var aNode = domUtils.findParentByTagName(range.startContainer,'a',true);
  61. if(aNode){
  62. range.setStartBefore(aNode);
  63. }
  64. aNode = domUtils.findParentByTagName(range.endContainer,'a',true);
  65. if(aNode){
  66. range.setEndAfter(aNode);
  67. }
  68. }
  69. bookmark = range.createBookmark();
  70. node = bookmark.start;
  71. //切开始
  72. while ( (parent = node.parentNode) && !domUtils.isBlockElm( parent ) ) {
  73. domUtils.breakParent( node, parent );
  74. domUtils.clearEmptySibling( node );
  75. }
  76. if ( bookmark.end ) {
  77. //切结束
  78. node = bookmark.end;
  79. while ( (parent = node.parentNode) && !domUtils.isBlockElm( parent ) ) {
  80. domUtils.breakParent( node, parent );
  81. domUtils.clearEmptySibling( node );
  82. }
  83. //开始去除样式
  84. var current = domUtils.getNextDomNode( bookmark.start, false, filter ),
  85. next;
  86. while ( current ) {
  87. if ( current == bookmark.end ) {
  88. break;
  89. }
  90. next = domUtils.getNextDomNode( current, true, filter );
  91. if ( !dtd.$empty[current.tagName.toLowerCase()] && !domUtils.isBookmarkNode( current ) ) {
  92. if ( tagReg.test( current.tagName ) ) {
  93. if ( style ) {
  94. domUtils.removeStyle( current, style );
  95. if ( isRedundantSpan( current ) && style != 'text-decoration'){
  96. domUtils.remove( current, true );
  97. }
  98. } else {
  99. domUtils.remove( current, true );
  100. }
  101. } else {
  102. //trace:939 不能把list上的样式去掉
  103. if(!dtd.$tableContent[current.tagName] && !dtd.$list[current.tagName]){
  104. domUtils.removeAttributes( current, removeFormatAttributes );
  105. if ( isRedundantSpan( current ) ){
  106. domUtils.remove( current, true );
  107. }
  108. }
  109. }
  110. }
  111. current = next;
  112. }
  113. }
  114. //trace:1035
  115. //trace:1096 不能把td上的样式去掉,比如边框
  116. var pN = bookmark.start.parentNode;
  117. if(domUtils.isBlockElm(pN) && !dtd.$tableContent[pN.tagName] && !dtd.$list[pN.tagName]){
  118. domUtils.removeAttributes( pN,removeFormatAttributes );
  119. }
  120. pN = bookmark.end.parentNode;
  121. if(bookmark.end && domUtils.isBlockElm(pN) && !dtd.$tableContent[pN.tagName]&& !dtd.$list[pN.tagName]){
  122. domUtils.removeAttributes( pN,removeFormatAttributes );
  123. }
  124. range.moveToBookmark( bookmark ).moveToBookmark(bookmark1);
  125. //清除冗余的代码 <b><bookmark></b>
  126. var node = range.startContainer,
  127. tmp,
  128. collapsed = range.collapsed;
  129. while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){
  130. tmp = node.parentNode;
  131. range.setStartBefore(node);
  132. //trace:937
  133. //更新结束边界
  134. if(range.startContainer === range.endContainer){
  135. range.endOffset--;
  136. }
  137. domUtils.remove(node);
  138. node = tmp;
  139. }
  140. if(!collapsed){
  141. node = range.endContainer;
  142. while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){
  143. tmp = node.parentNode;
  144. range.setEndBefore(node);
  145. domUtils.remove(node);
  146. node = tmp;
  147. }
  148. }
  149. }
  150. range = this.selection.getRange();
  151. doRemove( range );
  152. range.select();
  153. }
  154. };
  155. };