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]);
- }
- };
|