123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /**
- * 清除格式
- * @file
- * @since 1.2.6.1
- */
- /**
- * 清除文字样式
- * @command removeformat
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @param {String} tags 以逗号隔开的标签。如:strong
- * @param {String} style 样式如:color
- * @param {String} attrs 属性如:width
- * @example
- * ```javascript
- * editor.execCommand( 'removeformat', 'strong','color','width' );
- * ```
- */
- UE.plugins["removeformat"] = function() {
- var me = this;
- me.setOpt({
- removeFormatTags:
- "b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var",
- removeFormatAttributes: "class,style,lang,width,height,align,hspace,valign"
- });
- me.commands["removeformat"] = {
- execCommand: function(cmdName, tags, style, attrs, notIncludeA) {
- var tagReg = new RegExp(
- "^(?:" +
- (tags || this.options.removeFormatTags).replace(/,/g, "|") +
- ")$",
- "i"
- ),
- removeFormatAttributes = style
- ? []
- : (attrs || this.options.removeFormatAttributes).split(","),
- range = new dom.Range(this.document),
- bookmark,
- node,
- parent,
- filter = function(node) {
- return node.nodeType == 1;
- };
- function isRedundantSpan(node) {
- if (node.nodeType == 3 || node.tagName.toLowerCase() != "span") {
- return 0;
- }
- if (browser.ie) {
- //ie 下判断实效,所以只能简单用style来判断
- //return node.style.cssText == '' ? 1 : 0;
- var attrs = node.attributes;
- if (attrs.length) {
- for (var i = 0, l = attrs.length; i < l; i++) {
- if (attrs[i].specified) {
- return 0;
- }
- }
- return 1;
- }
- }
- return !node.attributes.length;
- }
- function doRemove(range) {
- var bookmark1 = range.createBookmark();
- if (range.collapsed) {
- range.enlarge(true);
- }
- //不能把a标签切了
- if (!notIncludeA) {
- var aNode = domUtils.findParentByTagName(
- range.startContainer,
- "a",
- true
- );
- if (aNode) {
- range.setStartBefore(aNode);
- }
- aNode = domUtils.findParentByTagName(range.endContainer, "a", true);
- if (aNode) {
- range.setEndAfter(aNode);
- }
- }
- bookmark = range.createBookmark();
- node = bookmark.start;
- //切开始
- while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) {
- domUtils.breakParent(node, parent);
- domUtils.clearEmptySibling(node);
- }
- if (bookmark.end) {
- //切结束
- node = bookmark.end;
- while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) {
- domUtils.breakParent(node, parent);
- domUtils.clearEmptySibling(node);
- }
- //开始去除样式
- var current = domUtils.getNextDomNode(bookmark.start, false, filter),
- next;
- while (current) {
- if (current == bookmark.end) {
- break;
- }
- next = domUtils.getNextDomNode(current, true, filter);
- if (
- !dtd.$empty[current.tagName.toLowerCase()] &&
- !domUtils.isBookmarkNode(current)
- ) {
- if (tagReg.test(current.tagName)) {
- if (style) {
- domUtils.removeStyle(current, style);
- if (isRedundantSpan(current) && style != "text-decoration") {
- domUtils.remove(current, true);
- }
- } else {
- domUtils.remove(current, true);
- }
- } else {
- //trace:939 不能把list上的样式去掉
- if (
- !dtd.$tableContent[current.tagName] &&
- !dtd.$list[current.tagName]
- ) {
- domUtils.removeAttributes(current, removeFormatAttributes);
- if (isRedundantSpan(current)) {
- domUtils.remove(current, true);
- }
- }
- }
- }
- current = next;
- }
- }
- //trace:1035
- //trace:1096 不能把td上的样式去掉,比如边框
- var pN = bookmark.start.parentNode;
- if (
- domUtils.isBlockElm(pN) &&
- !dtd.$tableContent[pN.tagName] &&
- !dtd.$list[pN.tagName]
- ) {
- domUtils.removeAttributes(pN, removeFormatAttributes);
- }
- pN = bookmark.end.parentNode;
- if (
- bookmark.end &&
- domUtils.isBlockElm(pN) &&
- !dtd.$tableContent[pN.tagName] &&
- !dtd.$list[pN.tagName]
- ) {
- domUtils.removeAttributes(pN, removeFormatAttributes);
- }
- range.moveToBookmark(bookmark).moveToBookmark(bookmark1);
- //清除冗余的代码 <b><bookmark></b>
- var node = range.startContainer,
- tmp,
- collapsed = range.collapsed;
- while (
- node.nodeType == 1 &&
- domUtils.isEmptyNode(node) &&
- dtd.$removeEmpty[node.tagName]
- ) {
- tmp = node.parentNode;
- range.setStartBefore(node);
- //trace:937
- //更新结束边界
- if (range.startContainer === range.endContainer) {
- range.endOffset--;
- }
- domUtils.remove(node);
- node = tmp;
- }
- if (!collapsed) {
- node = range.endContainer;
- while (
- node.nodeType == 1 &&
- domUtils.isEmptyNode(node) &&
- dtd.$removeEmpty[node.tagName]
- ) {
- tmp = node.parentNode;
- range.setEndBefore(node);
- domUtils.remove(node);
- node = tmp;
- }
- }
- }
- range = this.selection.getRange();
- doRemove(range);
- range.select();
- }
- };
- };
|