| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524 | 
							- /**
 
-  * 字体颜色,背景色,字号,字体,下划线,删除线
 
-  * @file
 
-  * @since 1.2.6.1
 
-  */
 
- /**
 
-  * 字体颜色
 
-  * @command forecolor
 
-  * @method execCommand
 
-  * @param { String } cmd 命令字符串
 
-  * @param { String } value 色值(必须十六进制)
 
-  * @example
 
-  * ```javascript
 
-  * editor.execCommand( 'forecolor', '#000' );
 
-  * ```
 
-  */
 
- /**
 
-  * 返回选区字体颜色
 
-  * @command forecolor
 
-  * @method queryCommandValue
 
-  * @param { String } cmd 命令字符串
 
-  * @return { String } 返回字体颜色
 
-  * @example
 
-  * ```javascript
 
-  * editor.queryCommandValue( 'forecolor' );
 
-  * ```
 
-  */
 
- /**
 
-  * 字体背景颜色
 
-  * @command backcolor
 
-  * @method execCommand
 
-  * @param { String } cmd 命令字符串
 
-  * @param { String } value 色值(必须十六进制)
 
-  * @example
 
-  * ```javascript
 
-  * editor.execCommand( 'backcolor', '#000' );
 
-  * ```
 
-  */
 
- /**
 
-  * 返回选区字体颜色
 
-  * @command backcolor
 
-  * @method queryCommandValue
 
-  * @param { String } cmd 命令字符串
 
-  * @return { String } 返回字体背景颜色
 
-  * @example
 
-  * ```javascript
 
-  * editor.queryCommandValue( 'backcolor' );
 
-  * ```
 
-  */
 
- /**
 
-  * 字体大小
 
-  * @command fontsize
 
-  * @method execCommand
 
-  * @param { String } cmd 命令字符串
 
-  * @param { String } value 字体大小
 
-  * @example
 
-  * ```javascript
 
-  * editor.execCommand( 'fontsize', '14px' );
 
-  * ```
 
-  */
 
- /**
 
-  * 返回选区字体大小
 
-  * @command fontsize
 
-  * @method queryCommandValue
 
-  * @param { String } cmd 命令字符串
 
-  * @return { String } 返回字体大小
 
-  * @example
 
-  * ```javascript
 
-  * editor.queryCommandValue( 'fontsize' );
 
-  * ```
 
-  */
 
- /**
 
-  * 字体样式
 
-  * @command fontfamily
 
-  * @method execCommand
 
-  * @param { String } cmd 命令字符串
 
-  * @param { String } value 字体样式
 
-  * @example
 
-  * ```javascript
 
-  * editor.execCommand( 'fontfamily', '微软雅黑' );
 
-  * ```
 
-  */
 
- /**
 
-  * 返回选区字体样式
 
-  * @command fontfamily
 
-  * @method queryCommandValue
 
-  * @param { String } cmd 命令字符串
 
-  * @return { String } 返回字体样式
 
-  * @example
 
-  * ```javascript
 
-  * editor.queryCommandValue( 'fontfamily' );
 
-  * ```
 
-  */
 
- /**
 
-  * 字体下划线,与删除线互斥
 
-  * @command underline
 
-  * @method execCommand
 
-  * @param { String } cmd 命令字符串
 
-  * @example
 
-  * ```javascript
 
-  * editor.execCommand( 'underline' );
 
-  * ```
 
-  */
 
- /**
 
-  * 字体删除线,与下划线互斥
 
-  * @command strikethrough
 
-  * @method execCommand
 
-  * @param { String } cmd 命令字符串
 
-  * @example
 
-  * ```javascript
 
-  * editor.execCommand( 'strikethrough' );
 
-  * ```
 
-  */
 
- /**
 
-  * 字体边框
 
-  * @command fontborder
 
-  * @method execCommand
 
-  * @param { String } cmd 命令字符串
 
-  * @example
 
-  * ```javascript
 
-  * editor.execCommand( 'fontborder' );
 
-  * ```
 
-  */
 
- UE.plugins['font'] = function () {
 
-     var me = this,
 
-         fonts = {
 
-             'forecolor': 'color',
 
-             'backcolor': 'background-color',
 
-             'fontsize': 'font-size',
 
-             'fontfamily': 'font-family',
 
-             'underline': 'text-decoration',
 
-             'strikethrough': 'text-decoration',
 
-             'fontborder': 'border'
 
-         },
 
-         needCmd = {'underline': 1, 'strikethrough': 1, 'fontborder': 1},
 
-         needSetChild = {
 
-             'forecolor': 'color',
 
-             'backcolor': 'background-color',
 
-             'fontsize': 'font-size',
 
-             'fontfamily': 'font-family'
 
-         };
 
-     me.setOpt({
 
-         'fontfamily': [
 
-             { name: 'songti', val: '宋体,SimSun'},
 
-             { name: 'yahei', val: '微软雅黑,Microsoft YaHei'},
 
-             { name: 'kaiti', val: '楷体,楷体_GB2312, SimKai'},
 
-             { name: 'heiti', val: '黑体, SimHei'},
 
-             { name: 'lishu', val: '隶书, SimLi'},
 
-             { name: 'andaleMono', val: 'andale mono'},
 
-             { name: 'arial', val: 'arial, helvetica,sans-serif'},
 
-             { name: 'arialBlack', val: 'arial black,avant garde'},
 
-             { name: 'comicSansMs', val: 'comic sans ms'},
 
-             { name: 'impact', val: 'impact,chicago'},
 
-             { name: 'timesNewRoman', val: 'times new roman'}
 
-         ],
 
-         'fontsize': [10, 11, 12, 14, 16, 18, 20, 24, 36]
 
-     });
 
-     function mergeWithParent(node){
 
-         var parent;
 
-         while(parent = node.parentNode){
 
-             if(parent.tagName == 'SPAN' && domUtils.getChildCount(parent,function(child){
 
-                 return !domUtils.isBookmarkNode(child) && !domUtils.isBr(child)
 
-             }) == 1) {
 
-                 parent.style.cssText += node.style.cssText;
 
-                 domUtils.remove(node,true);
 
-                 node = parent;
 
-             }else{
 
-                 break;
 
-             }
 
-         }
 
-     }
 
-     function mergeChild(rng,cmdName,value){
 
-         if(needSetChild[cmdName]){
 
-             rng.adjustmentBoundary();
 
-             if(!rng.collapsed && rng.startContainer.nodeType == 1){
 
-                 var start = rng.startContainer.childNodes[rng.startOffset];
 
-                 if(start && domUtils.isTagNode(start,'span')){
 
-                     var bk = rng.createBookmark();
 
-                     utils.each(domUtils.getElementsByTagName(start, 'span'), function (span) {
 
-                         if (!span.parentNode || domUtils.isBookmarkNode(span))return;
 
-                         if(cmdName == 'backcolor' && domUtils.getComputedStyle(span,'background-color').toLowerCase() === value){
 
-                             return;
 
-                         }
 
-                         domUtils.removeStyle(span,needSetChild[cmdName]);
 
-                         if(span.style.cssText.replace(/^\s+$/,'').length == 0){
 
-                             domUtils.remove(span,true)
 
-                         }
 
-                     });
 
-                     rng.moveToBookmark(bk)
 
-                 }
 
-             }
 
-         }
 
-     }
 
-     function mergesibling(rng,cmdName,value) {
 
-         var collapsed = rng.collapsed,
 
-             bk = rng.createBookmark(), common;
 
-         if (collapsed) {
 
-             common = bk.start.parentNode;
 
-             while (dtd.$inline[common.tagName]) {
 
-                 common = common.parentNode;
 
-             }
 
-         } else {
 
-             common = domUtils.getCommonAncestor(bk.start, bk.end);
 
-         }
 
-         utils.each(domUtils.getElementsByTagName(common, 'span'), function (span) {
 
-             if (!span.parentNode || domUtils.isBookmarkNode(span))return;
 
-             if (/\s*border\s*:\s*none;?\s*/i.test(span.style.cssText)) {
 
-                 if(/^\s*border\s*:\s*none;?\s*$/.test(span.style.cssText)){
 
-                     domUtils.remove(span, true);
 
-                 }else{
 
-                     domUtils.removeStyle(span,'border');
 
-                 }
 
-                 return
 
-             }
 
-             if (/border/i.test(span.style.cssText) && span.parentNode.tagName == 'SPAN' && /border/i.test(span.parentNode.style.cssText)) {
 
-                 span.style.cssText = span.style.cssText.replace(/border[^:]*:[^;]+;?/gi, '');
 
-             }
 
-             if(!(cmdName=='fontborder' && value=='none')){
 
-                 var next = span.nextSibling;
 
-                 while (next && next.nodeType == 1 && next.tagName == 'SPAN' ) {
 
-                     if(domUtils.isBookmarkNode(next) && cmdName == 'fontborder') {
 
-                         span.appendChild(next);
 
-                         next = span.nextSibling;
 
-                         continue;
 
-                     }
 
-                     if (next.style.cssText == span.style.cssText) {
 
-                         domUtils.moveChild(next, span);
 
-                         domUtils.remove(next);
 
-                     }
 
-                     if (span.nextSibling === next)
 
-                         break;
 
-                     next = span.nextSibling;
 
-                 }
 
-             }
 
-             mergeWithParent(span);
 
-             if(browser.ie && browser.version > 8 ){
 
-                 //拷贝父亲们的特别的属性,这里只做背景颜色的处理
 
-                 var parent = domUtils.findParent(span,function(n){return n.tagName == 'SPAN' && /background-color/.test(n.style.cssText)});
 
-                 if(parent && !/background-color/.test(span.style.cssText)){
 
-                     span.style.backgroundColor = parent.style.backgroundColor;
 
-                 }
 
-             }
 
-         });
 
-         rng.moveToBookmark(bk);
 
-         mergeChild(rng,cmdName,value)
 
-     }
 
-     me.addInputRule(function (root) {
 
-         utils.each(root.getNodesByTagName('u s del font strike'), function (node) {
 
-             if (node.tagName == 'font') {
 
-                 var cssStyle = [];
 
-                 for (var p in node.attrs) {
 
-                     switch (p) {
 
-                         case 'size':
 
-                             cssStyle.push('font-size:' +
 
-                                 ({
 
-                                 '1':'10',
 
-                                 '2':'12',
 
-                                 '3':'16',
 
-                                 '4':'18',
 
-                                 '5':'24',
 
-                                 '6':'32',
 
-                                 '7':'48'
 
-                             }[node.attrs[p]] || node.attrs[p]) + 'px');
 
-                             break;
 
-                         case 'color':
 
-                             cssStyle.push('color:' + node.attrs[p]);
 
-                             break;
 
-                         case 'face':
 
-                             cssStyle.push('font-family:' + node.attrs[p]);
 
-                             break;
 
-                         case 'style':
 
-                             cssStyle.push(node.attrs[p]);
 
-                     }
 
-                 }
 
-                 node.attrs = {
 
-                     'style': cssStyle.join(';')
 
-                 };
 
-             } else {
 
-                 var val = node.tagName == 'u' ? 'underline' : 'line-through';
 
-                 node.attrs = {
 
-                     'style': (node.getAttr('style') || '') + 'text-decoration:' + val + ';'
 
-                 }
 
-             }
 
-             node.tagName = 'span';
 
-         });
 
- //        utils.each(root.getNodesByTagName('span'), function (node) {
 
- //            var val;
 
- //            if(val = node.getAttr('class')){
 
- //                if(/fontstrikethrough/.test(val)){
 
- //                    node.setStyle('text-decoration','line-through');
 
- //                    if(node.attrs['class']){
 
- //                        node.attrs['class'] = node.attrs['class'].replace(/fontstrikethrough/,'');
 
- //                    }else{
 
- //                        node.setAttr('class')
 
- //                    }
 
- //                }
 
- //                if(/fontborder/.test(val)){
 
- //                    node.setStyle('border','1px solid #000');
 
- //                    if(node.attrs['class']){
 
- //                        node.attrs['class'] = node.attrs['class'].replace(/fontborder/,'');
 
- //                    }else{
 
- //                        node.setAttr('class')
 
- //                    }
 
- //                }
 
- //            }
 
- //        });
 
-     });
 
- //    me.addOutputRule(function(root){
 
- //        utils.each(root.getNodesByTagName('span'), function (node) {
 
- //            var val;
 
- //            if(val = node.getStyle('text-decoration')){
 
- //                if(/line-through/.test(val)){
 
- //                    if(node.attrs['class']){
 
- //                        node.attrs['class'] += ' fontstrikethrough';
 
- //                    }else{
 
- //                        node.setAttr('class','fontstrikethrough')
 
- //                    }
 
- //                }
 
- //
 
- //                node.setStyle('text-decoration')
 
- //            }
 
- //            if(val = node.getStyle('border')){
 
- //                if(/1px/.test(val) && /solid/.test(val)){
 
- //                    if(node.attrs['class']){
 
- //                        node.attrs['class'] += ' fontborder';
 
- //
 
- //                    }else{
 
- //                        node.setAttr('class','fontborder')
 
- //                    }
 
- //                }
 
- //                node.setStyle('border')
 
- //
 
- //            }
 
- //        });
 
- //    });
 
-     for (var p in fonts) {
 
-         (function (cmd, style) {
 
-             UE.commands[cmd] = {
 
-                 execCommand: function (cmdName, value) {
 
-                     value = value || (this.queryCommandState(cmdName) ? 'none' : cmdName == 'underline' ? 'underline' :
 
-                         cmdName == 'fontborder' ? '1px solid #000' :
 
-                             'line-through');
 
-                     var me = this,
 
-                         range = this.selection.getRange(),
 
-                         text;
 
-                     if (value == 'default') {
 
-                         if (range.collapsed) {
 
-                             text = me.document.createTextNode('font');
 
-                             range.insertNode(text).select();
 
-                         }
 
-                         me.execCommand('removeFormat', 'span,a', style);
 
-                         if (text) {
 
-                             range.setStartBefore(text).collapse(true);
 
-                             domUtils.remove(text);
 
-                         }
 
-                         mergesibling(range,cmdName,value);
 
-                         range.select()
 
-                     } else {
 
-                         if (!range.collapsed) {
 
-                             if (needCmd[cmd] && me.queryCommandValue(cmd)) {
 
-                                 me.execCommand('removeFormat', 'span,a', style);
 
-                             }
 
-                             range = me.selection.getRange();
 
-                             range.applyInlineStyle('span', {'style': style + ':' + value});
 
-                             mergesibling(range, cmdName,value);
 
-                             range.select();
 
-                         } else {
 
-                             var span = domUtils.findParentByTagName(range.startContainer, 'span', true);
 
-                             text = me.document.createTextNode('font');
 
-                             if (span && !span.children.length && !span[browser.ie ? 'innerText' : 'textContent'].replace(fillCharReg, '').length) {
 
-                                 //for ie hack when enter
 
-                                 range.insertNode(text);
 
-                                 if (needCmd[cmd]) {
 
-                                     range.selectNode(text).select();
 
-                                     me.execCommand('removeFormat', 'span,a', style, null);
 
-                                     span = domUtils.findParentByTagName(text, 'span', true);
 
-                                     range.setStartBefore(text);
 
-                                 }
 
-                                 span && (span.style.cssText += ';' + style + ':' + value);
 
-                                 range.collapse(true).select();
 
-                             } else {
 
-                                 range.insertNode(text);
 
-                                 range.selectNode(text).select();
 
-                                 span = range.document.createElement('span');
 
-                                 if (needCmd[cmd]) {
 
-                                     //a标签内的不处理跳过
 
-                                     if (domUtils.findParentByTagName(text, 'a', true)) {
 
-                                         range.setStartBefore(text).setCursor();
 
-                                         domUtils.remove(text);
 
-                                         return;
 
-                                     }
 
-                                     me.execCommand('removeFormat', 'span,a', style);
 
-                                 }
 
-                                 span.style.cssText = style + ':' + value;
 
-                                 text.parentNode.insertBefore(span, text);
 
-                                 //修复,span套span 但样式不继承的问题
 
-                                 if (!browser.ie || browser.ie && browser.version == 9) {
 
-                                     var spanParent = span.parentNode;
 
-                                     while (!domUtils.isBlockElm(spanParent)) {
 
-                                         if (spanParent.tagName == 'SPAN') {
 
-                                             //opera合并style不会加入";"
 
-                                             span.style.cssText = spanParent.style.cssText + ";" + span.style.cssText;
 
-                                         }
 
-                                         spanParent = spanParent.parentNode;
 
-                                     }
 
-                                 }
 
-                                 if (opera) {
 
-                                     setTimeout(function () {
 
-                                         range.setStart(span, 0).collapse(true);
 
-                                         mergesibling(range, cmdName,value);
 
-                                         range.select();
 
-                                     });
 
-                                 } else {
 
-                                     range.setStart(span, 0).collapse(true);
 
-                                     mergesibling(range,cmdName,value);
 
-                                     range.select();
 
-                                 }
 
-                                 //trace:981
 
-                                 //domUtils.mergeToParent(span)
 
-                             }
 
-                             domUtils.remove(text);
 
-                         }
 
-                     }
 
-                     return true;
 
-                 },
 
-                 queryCommandValue: function (cmdName) {
 
-                     var startNode = this.selection.getStart();
 
-                     //trace:946
 
-                     if (cmdName == 'underline' || cmdName == 'strikethrough') {
 
-                         var tmpNode = startNode, value;
 
-                         while (tmpNode && !domUtils.isBlockElm(tmpNode) && !domUtils.isBody(tmpNode)) {
 
-                             if (tmpNode.nodeType == 1) {
 
-                                 value = domUtils.getComputedStyle(tmpNode, style);
 
-                                 if (value != 'none') {
 
-                                     return value;
 
-                                 }
 
-                             }
 
-                             tmpNode = tmpNode.parentNode;
 
-                         }
 
-                         return 'none';
 
-                     }
 
-                     if (cmdName == 'fontborder') {
 
-                         var tmp = startNode, val;
 
-                         while (tmp && dtd.$inline[tmp.tagName]) {
 
-                             if (val = domUtils.getComputedStyle(tmp, 'border')) {
 
-                                 if (/1px/.test(val) && /solid/.test(val)) {
 
-                                     return val;
 
-                                 }
 
-                             }
 
-                             tmp = tmp.parentNode;
 
-                         }
 
-                         return ''
 
-                     }
 
-                     if( cmdName == 'FontSize' ) {
 
-                         var styleVal = domUtils.getComputedStyle(startNode, style),
 
-                             tmp = /^([\d\.]+)(\w+)$/.exec( styleVal );
 
-                         if( tmp ) {
 
-                             return Math.floor( tmp[1] ) + tmp[2];
 
-                         }
 
-                         return styleVal;
 
-                     }
 
-                     return  domUtils.getComputedStyle(startNode, style);
 
-                 },
 
-                 queryCommandState: function (cmdName) {
 
-                     if (!needCmd[cmdName])
 
-                         return 0;
 
-                     var val = this.queryCommandValue(cmdName);
 
-                     if (cmdName == 'fontborder') {
 
-                         return /1px/.test(val) && /solid/.test(val)
 
-                     } else {
 
-                         return  cmdName == 'underline' ? /underline/.test(val) : /line\-through/.test(val);
 
-                     }
 
-                 }
 
-             };
 
-         })(p, fonts[p]);
 
-     }
 
- };
 
 
  |