123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549 |
- /**
- * 字体颜色,背景色,字号,字体,下划线,删除线
- * @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]);
- }
- };
|