{"version":3,"sources":["webpack:///./src/components/widget/ParseAndCompleteHtml.js"],"names":["ParseAndCompleteHtml","html","this","originHtml","ncname","qnameCapture","startTagOpen","RegExp","endTag","attribute","startTagClose","commentPattern","stack","singleEndTag","tagName","push","length","pop","n","substring","start","match","end","attr","matchTagName","advance","replace","textEnd","indexOf","startTagMatch","parseStartTag","endTagMatch","text","completedStr","clearComment","parseHTML","i","itemTag"],"mappings":"4MAAqBA,G,uEACnB,WAAYC,GAAM,uBAEhBC,KAAKC,WAAaF,EAClBC,KAAKD,KAAOA,EACZC,KAAKE,OAAL,+BACAF,KAAKG,aAAL,cAA2BH,KAAKE,OAAhC,gBAA8CF,KAAKE,OAAnD,KACAF,KAAKI,aAAe,IAAIC,OAAJ,YAAgBL,KAAKG,eACzCH,KAAKM,OAAS,IAAID,OAAJ,eAAmBL,KAAKG,aAAxB,WACdH,KAAKO,UACH,6EACFP,KAAKQ,cAAgB,QACrBR,KAAKS,eAAiB,yBACtBT,KAAKU,MAAQ,GACbV,KAAKW,aAAe,G,4CAGtB,SAAMC,GACJZ,KAAKU,MAAMG,KAAKD,K,iBAGlB,SAAIA,GAGFZ,KAAKU,MAAMI,OAAS,EAAId,KAAKU,MAAMK,MAAQf,KAAKW,aAAaE,KAAKD,K,qBAGpE,SAAQI,GACNhB,KAAKD,KAAOC,KAAKD,KAAKkB,UAAUD,K,2BAElC,WACE,IAAIE,EAAQlB,KAAKD,KAAKoB,MAAMnB,KAAKI,cACjC,GAAIc,EAAO,CAET,IAEIE,EAAKC,EAFHC,EAAeJ,EAAM,GAC3BlB,KAAKuB,QAAQL,EAAM,GAAGJ,QAEtB,QACIM,EAAMpB,KAAKD,KAAKoB,MAAMnB,KAAKQ,kBAC5Ba,EAAOrB,KAAKD,KAAKoB,MAAMnB,KAAKO,YAG7BP,KAAKuB,QAAQF,EAAK,GAAGP,QAEvB,GAAIM,EAGF,OADApB,KAAKuB,QAAQH,EAAI,GAAGN,QACbQ,K,sBAIb,WACE,OAAOtB,KAAKU,Q,6BAEd,WACE,OAAOV,KAAKW,e,0BAGd,WAIE,OAHIX,KAAKD,OACPC,KAAKD,KAAOC,KAAKD,KAAKyB,QAAQxB,KAAKS,eAAgB,KAE9CT,KAAKD,O,uBAEd,WAEE,MAAOC,KAAKD,KAAM,CAChB,IAAI0B,EAAUzB,KAAKD,KAAK2B,QAAQ,KAChC,GAAe,GAAXD,EAAc,CAEhB,IAAIE,EAAgB3B,KAAK4B,gBACzB,GAAID,EAAe,CACjB3B,KAAKkB,MAAMS,GACX,SAEF,IAAIE,EAAc7B,KAAKD,KAAKoB,MAAMnB,KAAKM,QACvC,GAAIuB,EAAa,CACf7B,KAAKuB,QAAQM,EAAY,GAAGf,QAC5Bd,KAAKoB,IAAIS,EAAY,IACrB,UAGJ,IAAIC,OAAI,EAENA,EADEL,GAAW,EACNzB,KAAKD,KAAKkB,UAAU,EAAGQ,GAGvBzB,KAAKD,KAGV+B,GACF9B,KAAKuB,QAAQO,EAAKhB,W,yBAIxB,WACE,IAAIiB,EAAe/B,KAAKC,WAIxB,GAHA8B,EAAe/B,KAAKgC,eACpBhC,KAAKiC,YAEDjC,KAAKW,aAAaG,OAAS,EAC7B,IAAK,IAAIoB,EAAI,EAAGA,EAAIlC,KAAKW,aAAaG,OAAQoB,IAAK,CACjD,IAAIC,EAAUnC,KAAKW,aAAauB,GAChCH,EAAe,IAAH,OAAOI,EAAP,YAAkBJ,GAGlC,GAAI/B,KAAKU,MAAMI,OAAS,EACtB,IAAK,IAAIoB,EAAIlC,KAAKU,MAAMI,OAAQoB,GAAK,EAAGA,IAAK,CAC3C,IAAIC,EAAUnC,KAAKU,MAAMwB,GACzBH,EAAe,GAAH,OAAMA,EAAN,aAAuBI,EAAvB,KAGhB,OAAOJ,M","file":"js/c-widget-ParseAndCompleteHtml.93f303f5.js","sourcesContent":["export default class ParseAndCompleteHtml {\n constructor(html) {\n // 初始str\n this.originHtml = html\n this.html = html\n this.ncname = `[a-zA-Z_][\\\\-\\\\.0-9_a-zA-Z]*`\n this.qnameCapture = `((?:${this.ncname}\\\\:)?${this.ncname})`\n this.startTagOpen = new RegExp(`^<${this.qnameCapture}`) // 标签开头的正则 捕获的内容是标签名\n this.endTag = new RegExp(`^<\\\\/${this.qnameCapture}[^>]*>`) // 匹配标签结尾的 自闭合标签不用添加到stack里\n this.attribute =\n /^\\s*([^\\s\"'<>\\\\/=]+)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/ // 匹配属性的\n this.startTagClose = /^\\s*>/ // 匹配标签结束的 > 只匹配双标签,不匹配自闭合标签,因为自闭合标签不用补全\n this.commentPattern = //gim // html注释,先将传入的字符串的注释去掉\n this.stack = [] // 存放已匹配的标签\n this.singleEndTag = [] // 存放剩余的结束标签\n }\n // 箭头函数处理this\n start(tagName) {\n this.stack.push(tagName)\n }\n\n end(tagName) {\n // 当stack中有对应的tag,取出\n // 如果stack中已经没有tag,说明是尾部有多余的tag结束标签,没有与之匹配的开始标签\n this.stack.length > 0 ? this.stack.pop() : this.singleEndTag.push(tagName)\n }\n // 不停从左到右解析html\n advance(n) {\n this.html = this.html.substring(n)\n }\n parseStartTag() {\n let start = this.html.match(this.startTagOpen)\n if (start) {\n // 获取tagName\n const matchTagName = start[1]\n this.advance(start[0].length) // 将标签删除\n let end, attr\n while (\n !(end = this.html.match(this.startTagClose)) &&\n (attr = this.html.match(this.attribute))\n ) {\n // 将属性进行解析\n this.advance(attr[0].length) // 将属性去掉\n }\n if (end) {\n // 去掉开始标签的 >\n this.advance(end[0].length)\n return matchTagName\n }\n }\n }\n getStack() {\n return this.stack\n }\n getSingleEndTag() {\n return this.singleEndTag\n }\n // 清除html注释\n clearComment() {\n if (this.html) {\n this.html = this.html.replace(this.commentPattern, '')\n }\n return this.html\n }\n parseHTML() {\n // 不停的从左至右去解析html字符串\n while (this.html) {\n let textEnd = this.html.indexOf('<')\n if (textEnd == 0) {\n // 如果当前索引为0 肯定是一个标签 开始标签 结束标签\n let startTagMatch = this.parseStartTag() // 通过这个方法获取到匹配的结果 tagName\n if (startTagMatch) {\n this.start(startTagMatch) // 1解析开始标签\n continue // 如果开始标签匹配完毕后 继续下一次 匹配\n }\n let endTagMatch = this.html.match(this.endTag)\n if (endTagMatch) {\n this.advance(endTagMatch[0].length)\n this.end(endTagMatch[1]) // 2解析结束标签\n continue\n }\n }\n let text\n if (textEnd >= 0) {\n text = this.html.substring(0, textEnd)\n } else {\n // 解决只剩text的情况,例如 “
只剩文本”解析完div后只剩下“只剩文本”,textEnd=-1,直接将html赋值给text\n text = this.html\n }\n // 解析文本\n if (text) {\n this.advance(text.length)\n }\n }\n }\n completeTag() {\n let completedStr = this.originHtml\n completedStr = this.clearComment()\n this.parseHTML()\n // 有结束标签未匹配上\n if (this.singleEndTag.length > 0) {\n for (let i = 0; i < this.singleEndTag.length; i++) {\n let itemTag = this.singleEndTag[i]\n completedStr = `<${itemTag}>${completedStr}`\n }\n }\n if (this.stack.length > 0) {\n for (let i = this.stack.length; i >= 0; i--) {\n let itemTag = this.stack[i]\n completedStr = `${completedStr}`\n }\n }\n return completedStr\n }\n}\n"],"sourceRoot":""}