Kaynağa Gözat

高亮的修改

zhuliu 1 yıl önce
ebeveyn
işleme
b3cd8100c6
1 değiştirilmiş dosya ile 80 ekleme ve 15 silme
  1. 80 15
      src/utils/model/RichText/mixins.js

+ 80 - 15
src/utils/model/RichText/mixins.js

@@ -119,6 +119,15 @@ export default {
             }
             return arr
         },
+        //解析html实体
+        parsedText(text) {  
+            // 创建一个新的 DOMParser 实例  
+            const parser = new DOMParser();  
+            // 解析包含 HTML 实体的字符串  
+            const doc = parser.parseFromString(text, "text/html");  
+            // 提取 body 中的文本内容,此时 HTML 实体已被转换  
+            return doc.body.textContent || doc.body.innerText;   
+        },
         //修改html
         changeHtml(data,tag){
             var startIndex = 0
@@ -126,13 +135,21 @@ export default {
             var endIndex = 0
             var currentIndex = 0
             var currentIndex1 = 0
+            debugger
             for(var i = 0;i<data.length;i++){
-                var a = data[i].text
-                if(data[i].text.indexOf('&nbsp;')!=-1){
-                    a = data[i].text.replace(/&nbsp;/g,' ')
-                }
+                // var a = data[i].text
+                // if(data[i].text.indexOf('&nbsp;')!=-1){
+                //     a = data[i].text.replace(/&nbsp;/g,' ')
+                // }
+                // if(data[i].text.match(/&([a-z]+);/gi) && data[i].text.match(/&([a-z]+);/gi).length>0){
+                //     var len = data[i].text.match(/&([a-z]+);/gi).length
+                //     for(var j = 0;j<len;j++){
+                //         a = a.replace(/&([a-z]+);/,' ')
+                //     }
+                // }
+                var a = this.parsedText(data[i].text)
                 if(data[i].type == 'text'){
-                    if(this.selectObj.startIndex >= currentIndex && this.selectObj.startIndex<currentIndex + data[i].text.length && !sign){
+                    if(this.selectObj.startIndex >= currentIndex && this.selectObj.startIndex<currentIndex + a.length && !sign){
                         startIndex = i
                         sign = true
                     }else{
@@ -146,7 +163,7 @@ export default {
                         }
                         
                     }
-                    if(this.selectObj.endIndex > currentIndex1 && this.selectObj.endIndex<=currentIndex1 + data[i].text.length){
+                    if(this.selectObj.endIndex > currentIndex1 && this.selectObj.endIndex<=currentIndex1 + a.length){
                         endIndex = i
                         break
                     }else{
@@ -161,9 +178,22 @@ export default {
             }
             var arr = []
             var item = data[startIndex]
-            if(item.text.indexOf('&nbsp;')!=-1){
-                item.text = item.text.replace(/&nbsp;/g,' ')
-            }
+            // if(item.text.indexOf('&nbsp;')!=-1){
+            //     item.text = item.text.replace(/&nbsp;/g,' ')
+            // }
+            // if(item.text.match(/&([a-z]+);/gi) && item.text.match(/&([a-z]+);/gi).length>0){
+            //     // var len = item.text.match(/&([a-z]+);/gi).length
+            //     // for(var i = 0;i<len;i++){
+            //     //     item.text = item.text.replace(/&([a-z]+);/,' ')
+            //     // }
+            //     const parser = new DOMParser();  
+            //     // 解析包含 HTML 实体的字符串  
+            //     const doc = parser.parseFromString(item.text, "text/html");  
+            //     // 提取 body 中的文本内容,此时 HTML 实体已被转换  
+            //     var a = doc.body.textContent || doc.body.innerText;  
+            //     console.log(a)
+            // }
+            item.text = this.parsedText(item.text)
             if(startIndex == endIndex){
                 var prevTag = this.checkPrevTag(data,startIndex,tag)
                 var nextTag = this.checkNextTag(data,startIndex,tag)
@@ -173,6 +203,27 @@ export default {
                         if(prevTag.tag == `<${tag}>` && nextTag.tag == `</${tag}>`){
                             data[prevTag.index].del = true
                             data[nextTag.index].del = true
+                        }else{
+                            if(prevTag.index == startIndex - 1 && nextTag.index == endIndex + 1){
+                                data[prevTag.index].del = true
+                                data[nextTag.index].del = true
+                            }
+                            else if(prevTag.index == startIndex - 1 && nextTag.index != endIndex + 1){
+                                data[prevTag.index].del = true
+                                arr.push({type:'text',text:item.text})
+                                arr.push({type:'tag',text:`</${tag}>`})
+                                data.splice(startIndex,1,...arr)
+                            }else if(prevTag.index != startIndex - 1 && nextTag.index == endIndex + 1){
+                                arr.push({type:'tag',text:`<${tag}>`})
+                                arr.push({type:'text',text:item.text})
+                                data[nextTag.index].del = true
+                                data.splice(startIndex,1,...arr)
+                            }else if(prevTag.index != startIndex - 1 && nextTag.index != endIndex + 1){
+                                arr.push({type:'tag',text:`<${tag}>`})
+                                arr.push({type:'text',text:item.text})
+                                arr.push({type:'tag',text:`</${tag}>`})
+                                data.splice(startIndex,1,...arr)
+                            }
                         }
                         
                     }else if(this.selectObj.startIndex > currentIndex && this.selectObj.endIndex == currentIndex+item.text.length){
@@ -190,7 +241,10 @@ export default {
                                 arr.push({type:'text',text:item.text.substring(0,this.selectObj.startIndex - currentIndex)})
                                 arr.push({type:'tag',text:`<${tag}>`})
                                 arr.push({type:'text',text:item.text.substring(this.selectObj.startIndex - currentIndex,item.text.length)})
-                                data[nextTag.index].del = true
+                                
+                                if(nextTag.index == endIndex + 1){
+                                    data[nextTag.index].del = true
+                                }
                                 data.splice(startIndex,1,...arr)
                             }
                     }else if(this.selectObj.startIndex == currentIndex && this.selectObj.endIndex < currentIndex+item.text.length){
@@ -206,8 +260,12 @@ export default {
                                 data.splice(startIndex,1,...arr)
                             }
                             else if(prevTag.tag == `</${tag}>` && nextTag.tag == `<${tag}>`){
-                                
-                                data[prevTag.index].del = true
+                                if(prevTag.index != startIndex - 1){
+                                    arr.push({type:'tag',text:`<${tag}>`})
+                                }else{
+                                    data[prevTag.index].del = true
+                                }
+                                // data[prevTag.index].del = true
                                 arr.push({type:'text',text:item.text.substring(0,this.selectObj.endIndex - currentIndex)})
                                 arr.push({type:'tag',text:`</${tag}>`})
                                 arr.push({type:'text',text:item.text.substring(this.selectObj.endIndex - currentIndex,item.text.length)})
@@ -245,9 +303,16 @@ export default {
                 var nextTag = this.checkNextTag(data,startIndex,tag)
                 var betweenTag = this.checkBetweenTag(data,startIndex,endIndex,tag)
                 var item1 = data[endIndex]
-                if(item1.text.indexOf('&nbsp;')!=-1){
-                    item1.text = item1.text.replace(/&nbsp;/g,' ')
-                }
+                // if(item1.text.indexOf('&nbsp;')!=-1){
+                //     item1.text = item1.text.replace(/&nbsp;/g,' ')
+                // }
+                // if(item1.text.match(/&([a-z]+);/gi) && item1.text.match(/&([a-z]+);/gi).length>0){
+                //     var len = item1.text.match(/&([a-z]+);/gi).length
+                //     for(var i = 0;i<len;i++){
+                //         item1.text = item1.text.replace(/&([a-z]+);/,' ')
+                //     }
+                // }
+                item1.text = this.parsedText(item1.text)
                 if(betweenTag.length==0){
                     var betweenText = this.checkBetweenText(data,startIndex,endIndex)
                     var prevTag = this.checkPrevTag(data,startIndex,tag) || {}