"use strict"; /** * 使用样式事件 */ define(function (require, exports, module) { function handle(event) { let utils = require("../../common/utils"); let curS = utils.GetSelection(); let curRange = curS.getRangeAt(0); //只考虑一个选区场景 let copyRange = curRange.cloneRange(); let curNode = utils.GetEventTarget(event); //只处理选择的是一个范围。 if (curS.type !== "Range") { return; } //选区信息 console.dir(curS) console.dir(curRange) //获取样式 let styleK = curNode.getAttribute("data-k"); let styleV = curNode.getAttribute("data-v"); if (styleK === undefined || styleK === null) { styleK = curNode.closest("span").getAttribute("data-k"); styleV = curNode.closest("span").getAttribute("data-v"); // console.log("closest: ", curNode, curNode.closest("span")) } console.log("styleK: ", styleK, " styleV: ", styleV); //获取开始结束的区域 let curStartContainerEle = curRange.startContainer; let curEndContainerEle = curRange.endContainer; let taskMap = new Map; let start = curRange.startOffset; let end = curRange.endOffset; if (start > end) { let tmpS = start; start = end; end = tmpS; } //处理选区数量 let pStart = getSpanContentOfP(curStartContainerEle); let pEnd = getSpanContentOfP(curEndContainerEle); console.dir(curStartContainerEle) console.dir(curEndContainerEle) console.dir(pStart) console.dir(pEnd) if (pStart.getAttribute("id") === pEnd.getAttribute("id")) { taskMap.set(pStart.getAttribute("id"), pStart) } else { //修正顺序 let tmp = pStart; if (parseInt(pStart.getAttribute("data-order")) > parseInt(pEnd.getAttribute("data-order"))) { pStart = pEnd; pEnd = tmp; } //fill p let nextTask = pStart; taskMap.set(nextTask.getAttribute("id"), nextTask) while (true) { nextTask = nextTask.nextSibling; taskMap.set(nextTask.getAttribute("id"), nextTask) if (nextTask.getAttribute("id") === pEnd.getAttribute("id")) { break } console.dir(nextTask) } } //选择单行还是多行 let multiply = taskMap.size > 1; //遍历设置样式 console.dir(taskMap) for (let [key, curP] of taskMap) { let curSpanContent = curP.querySelector("span[data-flag='span_content']"); console.log("curP : ", curP, "\n", "\nkey:", key, "\ncurSpanContent: ", curSpanContent); if (curSpanContent.childNodes === undefined || curSpanContent.childNodes === null || curSpanContent.childNodes.length <= 0) { continue } let firstItem = curSpanContent.childNodes[0]; console.log("curSpanContent : ", curSpanContent, curSpanContent.childNodes.length, firstItem.nodeName, firstItem.nodeType); let isEmptyStyle = curSpanContent.childNodes.length === 1 && firstItem.nodeName === "#text" && firstItem.nodeType === 3; if (isEmptyStyle) { let copySpan = curSpanContent.cloneNode(); copySpan.innerHTML = ""; for (let j = 0; j < curSpanContent.innerText.length; j++) { if (!multiply) { //单选 if (j >= start && j < end) { let tmpSpan = document.createElement("span"); tmpSpan.innerText = curSpanContent.innerText.charAt(j); applySpanStyleKV(tmpSpan, styleK, styleV); copySpan.append(tmpSpan); } else { let tmpSpan = document.createElement("span"); tmpSpan.innerText = curSpanContent.innerText.charAt(j); copySpan.append(tmpSpan); } } else { //多选 if (curP.getAttribute("id") === pStart.getAttribute("id")) { //首行 if (j >= start) { let tmpSpan = document.createElement("span"); tmpSpan.innerText = curSpanContent.innerText.charAt(j); applySpanStyleKV(tmpSpan, styleK, styleV); copySpan.append(tmpSpan); } else { let tmpSpan = document.createElement("span"); tmpSpan.innerText = curSpanContent.innerText.charAt(j); copySpan.append(tmpSpan); } } else if (curP.getAttribute("id") === pEnd.getAttribute("id")) { //尾行 if (j < end) { let tmpSpan = document.createElement("span"); tmpSpan.innerText = curSpanContent.innerText.charAt(j); applySpanStyleKV(tmpSpan, styleK, styleV); copySpan.append(tmpSpan); } else { let tmpSpan = document.createElement("span"); tmpSpan.innerText = curSpanContent.innerText.charAt(j); copySpan.append(tmpSpan); } } else { let tmpSpan = document.createElement("span"); tmpSpan.innerText = curSpanContent.innerText.charAt(j); applySpanStyleKV(tmpSpan, styleK, styleV); copySpan.append(tmpSpan); } } } curSpanContent.innerHTML = copySpan.innerHTML; } else { let total = 0, effectNum = 0; for (let j = 0; j < curSpanContent.childNodes.length; j++) { let tmpSpan = curSpanContent.childNodes[j]; if (curS.containsNode(tmpSpan, true)) { total++; if (spanContainsStyleKV(tmpSpan, styleK, styleV)) { console.dir(tmpSpan); } else { effectNum++; applySpanStyleKV(tmpSpan, styleK, styleV); } } } //如果没有设置任何一个 则取消 if (effectNum === 0) { for (let j = 0; j < curSpanContent.childNodes.length; j++) { let tmpSpan = curSpanContent.childNodes[j]; if (curS.containsNode(tmpSpan, true)) { removeSpanStyleKV(tmpSpan, styleK, styleV); } } } } } //光标保持 curS.removeAllRanges(); let newR = document.createRange(); newR.setStart(copyRange.startContainer,start); newR.setEnd(copyRange.endContainer,end); curS.addRange(newR); } function removeSpanStyleKV(span, styleK, styleV) { let kList = styleK.toString().split(","); let vList = styleV.toString().split(","); for (let i = 0; i < kList.length; i++) { if (span.style.getPropertyValue(kList[0]) === vList[0]) { span.style.removeProperty(kList[0]); } } } function spanContainsStyleKV(span, styleK, styleV) { let kList = styleK.toString().split(","); let vList = styleV.toString().split(","); let total = kList.length, match = 0; for (let i = 0; i < kList.length; i++) { if (span.style.getPropertyValue(kList[0]) === vList[0]) { match++; } } return total === match; } function applySpanStyleKV(span, styleK, styleV) { let kList = styleK.toString().split(","); let vList = styleV.toString().split(","); for (let i = 0; i < kList.length; i++) { span.style.setProperty(kList[i], vList[i]); } } function getSpanContentOfP(item) { let tmp = item; if (item.nodeName !== "SPAN" || item.getAttribute("data-flag") !== "span_content") { tmp = item.parentElement.closest("span[data-flag='span_content']"); } return tmp.parentNode; } //导出 exports.handle = handle; });