| @@ -1,17 +1,17 @@ | |||||
| { | { | ||||
| "ext": { | "ext": { | ||||
| "attr": { | "attr": { | ||||
| "configUrl": "https://c.malls.iformall.com/C/api" | |||||
| "configUrl": "https://ctest.malls.iformall.com/C/api" | |||||
| }, | }, | ||||
| "name": "家帮汇保姆育儿嫂", | |||||
| "weappId": "ttc82fbe92571351e401" | |||||
| "name": "富茂券券集团版", | |||||
| "weappId": "tt620e14b3fd30264101" | |||||
| }, | }, | ||||
| "window": { | "window": { | ||||
| "backgroundTextStyle": "light", | "backgroundTextStyle": "light", | ||||
| "navigationBarTextStyle": "black", | "navigationBarTextStyle": "black", | ||||
| "navigationBarBackgroundColor": "#fff" | "navigationBarBackgroundColor": "#fff" | ||||
| }, | }, | ||||
| "extAppid": "ttc82fbe92571351e401", | |||||
| "extAppid": "tt620e14b3fd30264101", | |||||
| "extEnable": true, | "extEnable": true, | ||||
| "directCommit": false, | "directCommit": false, | ||||
| "networkTimeout": { | "networkTimeout": { | ||||
| @@ -1,9 +1,48 @@ | |||||
| // c:\Users\Holy-Knight-IX\Desktop\Working Space\4.TikTok-MiniPro\ttc\pages\freeBannerDetail\freeBannerDetail.js | |||||
| let config = require("../../config/config.js"); | |||||
| const extConfig = tt.getExtConfigSync ? tt.getExtConfigSync().extConfig : {} | |||||
| let configUrls = extConfig.attr.configUrl; | |||||
| let app = getApp(); | |||||
| var ttParse = require('./ttParse/wxParse.js'); | |||||
| Page({ | Page({ | ||||
| data: { | data: { | ||||
| nodeData: "", | |||||
| date: "", | |||||
| mallTenantId: "" | |||||
| }, | }, | ||||
| onLoad: function (options) { | onLoad: function (options) { | ||||
| const that = this | |||||
| const date = new Date() | |||||
| that.setData({ | |||||
| date, | |||||
| mallTenantId: tt.getStorageSync('mallTenantId') || "" | |||||
| }) | |||||
| if (options.id) { | |||||
| that.getHtmlData(options.id) | |||||
| } | |||||
| }, | |||||
| getHtmlData(id) { | |||||
| const that = this | |||||
| tt.request({ | |||||
| url: configUrls + config.api.printHtmlById, | |||||
| data: { | |||||
| token: app.globalData.token, | |||||
| id, | |||||
| date: that.data.date, | |||||
| mallTenantId: that.data.mallTenantId | |||||
| }, | |||||
| header: { | |||||
| 'content-type': 'application/html' | |||||
| }, | |||||
| success: function (res) { | |||||
| console.log(res, 'res'); | |||||
| if (res.data) { | |||||
| var temp = ttParse.wxParse('article', 'html', res.data, that, 5); | |||||
| } | |||||
| } | |||||
| }) | |||||
| } | } | ||||
| }) | }) | ||||
| @@ -1 +1,5 @@ | |||||
| <!-- \pages\freeBannerDetail\freeBannerDetail.ttml --> | |||||
| <!-- \pages\freeBannerDetail\freeBannerDetail.ttml --> | |||||
| <import src="./ttParse/wxParse.ttml" /> | |||||
| <view class="content"> | |||||
| <template is="wxParse" data="{{wxParseData:article.nodes}}" /> | |||||
| </view> | |||||
| @@ -1 +1,6 @@ | |||||
| /* c:\Users\Holy-Knight-IX\Desktop\Working Space\4.TikTok-MiniPro\ttc\pages\freeBannerDetail\freeBannerDetail.ttss */ | |||||
| @import "./ttParse/wxParse.ttss"; | |||||
| .content { | |||||
| width: 710rpx; | |||||
| padding: 0 20rpx; | |||||
| } | |||||
| @@ -0,0 +1,318 @@ | |||||
| /** | |||||
| * html2Json 改造来自: https://github.com/Jxck/html2json | |||||
| * | |||||
| * | |||||
| * author: Di (微信小程序开发工程师) | |||||
| * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) | |||||
| * 垂直微信小程序开发交流社区 | |||||
| * | |||||
| * github地址: https://github.com/icindy/wxParse | |||||
| * | |||||
| * for: 微信小程序富文本解析 | |||||
| * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 | |||||
| */ | |||||
| var __placeImgeUrlHttps = "https"; | |||||
| var __emojisReg = ''; | |||||
| var __emojisBaseSrc = ''; | |||||
| var __emojis = {}; | |||||
| var wxDiscode = require('./wxDiscode.js'); | |||||
| var HTMLParser = require('./htmlparser.js'); | |||||
| // Empty Elements - HTML 5 | |||||
| var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr"); | |||||
| // Block Elements - HTML 5 | |||||
| var block = makeMap("br,a,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video"); | |||||
| // Inline Elements - HTML 5 | |||||
| var inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"); | |||||
| // Elements that you can, intentionally, leave open | |||||
| // (and which close themselves) | |||||
| var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"); | |||||
| // Attributes that have their values filled in disabled="disabled" | |||||
| var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"); | |||||
| // Special Elements (can contain anything) | |||||
| var special = makeMap("wxxxcode-style,script,style,view,scroll-view,block"); | |||||
| function makeMap(str) { | |||||
| var obj = {}, items = str.split(","); | |||||
| for (var i = 0; i < items.length; i++) | |||||
| obj[items[i]] = true; | |||||
| return obj; | |||||
| } | |||||
| function q(v) { | |||||
| return '"' + v + '"'; | |||||
| } | |||||
| function removeDOCTYPE(html) { | |||||
| return html | |||||
| .replace(/<\?xml.*\?>\n/, '') | |||||
| .replace(/<.*!doctype.*\>\n/, '') | |||||
| .replace(/<.*!DOCTYPE.*\>\n/, ''); | |||||
| } | |||||
| function trimHtml(html) { | |||||
| return html | |||||
| .replace(/\r?\n+/g, '') | |||||
| .replace(/<!--.*?-->/ig, '') | |||||
| .replace(/\/\*.*?\*\//ig, '') | |||||
| .replace(/[ ]+</ig, '<') | |||||
| } | |||||
| function html2json(html, bindName) { | |||||
| //处理字符串 | |||||
| html = removeDOCTYPE(html); | |||||
| html = trimHtml(html); | |||||
| html = wxDiscode.strDiscode(html); | |||||
| //生成node节点 | |||||
| var bufArray = []; | |||||
| var results = { | |||||
| node: bindName, | |||||
| nodes: [], | |||||
| images:[], | |||||
| imageUrls:[] | |||||
| }; | |||||
| var index = 0; | |||||
| HTMLParser(html, { | |||||
| start: function (tag, attrs, unary) { | |||||
| //debug(tag, attrs, unary); | |||||
| // node for this element | |||||
| var node = { | |||||
| node: 'element', | |||||
| tag: tag, | |||||
| attr:{} | |||||
| }; | |||||
| if (node.tag =="embed"){ | |||||
| console.log(node,attrs,unary,666) | |||||
| var embUrl = ''; | |||||
| attrs.map((item,index)=>{ | |||||
| if(item.name == 'src'){ | |||||
| embUrl = item.value | |||||
| } | |||||
| }) | |||||
| // if (node.attr.src.indexOf('http:')==-1){ | |||||
| // embUrl = "http://xxxx.com" + node.attr.src; | |||||
| // } | |||||
| node.attr.src = embUrl; | |||||
| node.tag='video'; | |||||
| } | |||||
| if (bufArray.length === 0) { | |||||
| node.index = index.toString() | |||||
| index += 1 | |||||
| } else { | |||||
| var parent = bufArray[0]; | |||||
| if (parent.nodes === undefined) { | |||||
| parent.nodes = []; | |||||
| } | |||||
| node.index = parent.index + '.' + parent.nodes.length | |||||
| } | |||||
| if (block[tag]) { | |||||
| node.tagType = "block"; | |||||
| } else if (inline[tag]) { | |||||
| node.tagType = "inline"; | |||||
| } else if (closeSelf[tag]) { | |||||
| node.tagType = "closeSelf"; | |||||
| } | |||||
| if (attrs.length !== 0) { | |||||
| node.attr = attrs.reduce(function (pre, attr) { | |||||
| var name = attr.name; | |||||
| var value = attr.value; | |||||
| if (name == 'class') { | |||||
| console.dir(value); | |||||
| // value = value.join("") | |||||
| node.classStr = value; | |||||
| } | |||||
| // has multi attibutes | |||||
| // make it array of attribute | |||||
| if (name == 'style') { | |||||
| console.dir(value); | |||||
| // value = value.join("") | |||||
| node.styleStr = value; | |||||
| } | |||||
| if (value.match(/ /)) { | |||||
| value = value.split(' '); | |||||
| } | |||||
| // if attr already exists | |||||
| // merge it | |||||
| if (pre[name]) { | |||||
| if (Array.isArray(pre[name])) { | |||||
| // already array, push to last | |||||
| pre[name].push(value); | |||||
| } else { | |||||
| // single value, make it array | |||||
| pre[name] = [pre[name], value]; | |||||
| } | |||||
| } else { | |||||
| // not exist, put it | |||||
| pre[name] = value; | |||||
| } | |||||
| return pre; | |||||
| }, {}); | |||||
| } | |||||
| //对img添加额外数据 | |||||
| if (node.tag === 'img') { | |||||
| node.imgIndex = results.images.length; | |||||
| var imgUrl = node.attr.src; | |||||
| if (imgUrl[0] == '') { | |||||
| imgUrl.splice(0, 1); | |||||
| } | |||||
| imgUrl = wxDiscode.urlToHttpUrl(imgUrl, __placeImgeUrlHttps); | |||||
| node.attr.src = imgUrl; | |||||
| node.from = bindName; | |||||
| results.images.push(node); | |||||
| results.imageUrls.push(imgUrl); | |||||
| } | |||||
| // 处理font标签样式属性 | |||||
| if (node.tag === 'font') { | |||||
| var fontSize = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', '-webkit-xxx-large']; | |||||
| var styleAttrs = { | |||||
| 'color': 'color', | |||||
| 'face': 'font-family', | |||||
| 'size': 'font-size' | |||||
| }; | |||||
| if (!node.attr.style) node.attr.style = []; | |||||
| if (!node.styleStr) node.styleStr = ''; | |||||
| for (var key in styleAttrs) { | |||||
| if (node.attr[key]) { | |||||
| var value = key === 'size' ? fontSize[node.attr[key]-1] : node.attr[key]; | |||||
| node.attr.style.push(styleAttrs[key]); | |||||
| node.attr.style.push(value); | |||||
| node.styleStr += styleAttrs[key] + ': ' + value + ';'; | |||||
| } | |||||
| } | |||||
| } | |||||
| //临时记录source资源 | |||||
| if(node.tag === 'source'){ | |||||
| results.source = node.attr.src; | |||||
| } | |||||
| if (unary) { | |||||
| // if this tag doesn't have end tag | |||||
| // like <img src="hoge.png"/> | |||||
| // add to parents | |||||
| var parent = bufArray[0] || results; | |||||
| if (parent.nodes === undefined) { | |||||
| parent.nodes = []; | |||||
| } | |||||
| parent.nodes.push(node); | |||||
| } else { | |||||
| bufArray.unshift(node); | |||||
| } | |||||
| }, | |||||
| end: function (tag) { | |||||
| //debug(tag); | |||||
| // merge into parent tag | |||||
| var node = bufArray.shift(); | |||||
| if (node.tag !== tag) console.error('invalid state: mismatch end tag'); | |||||
| //当有缓存source资源时于于video补上src资源 | |||||
| if(node.tag === 'video' && results.source){ | |||||
| node.attr.src = results.source; | |||||
| delete results.source; | |||||
| } | |||||
| if (bufArray.length === 0) { | |||||
| results.nodes.push(node); | |||||
| } else { | |||||
| var parent = bufArray[0]; | |||||
| if (parent.nodes === undefined) { | |||||
| parent.nodes = []; | |||||
| } | |||||
| parent.nodes.push(node); | |||||
| } | |||||
| }, | |||||
| chars: function (text) { | |||||
| //debug(text); | |||||
| var node = { | |||||
| node: 'text', | |||||
| text: text, | |||||
| textArray:transEmojiStr(text) | |||||
| }; | |||||
| if (bufArray.length === 0) { | |||||
| node.index = index.toString() | |||||
| index += 1 | |||||
| results.nodes.push(node); | |||||
| } else { | |||||
| var parent = bufArray[0]; | |||||
| if (parent.nodes === undefined) { | |||||
| parent.nodes = []; | |||||
| } | |||||
| node.index = parent.index + '.' + parent.nodes.length | |||||
| parent.nodes.push(node); | |||||
| } | |||||
| }, | |||||
| comment: function (text) { | |||||
| //debug(text); | |||||
| // var node = { | |||||
| // node: 'comment', | |||||
| // text: text, | |||||
| // }; | |||||
| // var parent = bufArray[0]; | |||||
| // if (parent.nodes === undefined) { | |||||
| // parent.nodes = []; | |||||
| // } | |||||
| // parent.nodes.push(node); | |||||
| }, | |||||
| }); | |||||
| return results; | |||||
| }; | |||||
| function transEmojiStr(str){ | |||||
| // var eReg = new RegExp("["+__reg+' '+"]"); | |||||
| // str = str.replace(/\[([^\[\]]+)\]/g,':$1:') | |||||
| var emojiObjs = []; | |||||
| //如果正则表达式为空 | |||||
| if(__emojisReg.length == 0 || !__emojis){ | |||||
| var emojiObj = {} | |||||
| emojiObj.node = "text"; | |||||
| emojiObj.text = str; | |||||
| array = [emojiObj]; | |||||
| return array; | |||||
| } | |||||
| //这个地方需要调整 | |||||
| str = str.replace(/\[([^\[\]]+)\]/g,':$1:') | |||||
| var eReg = new RegExp("[:]"); | |||||
| var array = str.split(eReg); | |||||
| for(var i = 0; i < array.length; i++){ | |||||
| var ele = array[i]; | |||||
| var emojiObj = {}; | |||||
| if(__emojis[ele]){ | |||||
| emojiObj.node = "element"; | |||||
| emojiObj.tag = "emoji"; | |||||
| emojiObj.text = __emojis[ele]; | |||||
| emojiObj.baseSrc= __emojisBaseSrc; | |||||
| }else{ | |||||
| emojiObj.node = "text"; | |||||
| emojiObj.text = ele; | |||||
| } | |||||
| emojiObjs.push(emojiObj); | |||||
| } | |||||
| return emojiObjs; | |||||
| } | |||||
| function emojisInit(reg='',baseSrc="/wxParse/emojis/",emojis){ | |||||
| __emojisReg = reg; | |||||
| __emojisBaseSrc=baseSrc; | |||||
| __emojis=emojis; | |||||
| } | |||||
| module.exports = { | |||||
| html2json: html2json, | |||||
| emojisInit:emojisInit | |||||
| }; | |||||
| @@ -0,0 +1,192 @@ | |||||
| /** | |||||
| * | |||||
| * htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser | |||||
| * | |||||
| * author: Di (微信小程序开发工程师) | |||||
| * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) | |||||
| * 垂直微信小程序开发交流社区 | |||||
| * | |||||
| * github地址: https://github.com/icindy/wxParse | |||||
| * | |||||
| * for: 微信小程序富文本解析 | |||||
| * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 | |||||
| */ | |||||
| // Regular Expressions for parsing tags and attributes | |||||
| var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/, | |||||
| endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/, | |||||
| attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; | |||||
| // Empty Elements - HTML 5 | |||||
| var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr"); | |||||
| // Block Elements - HTML 5 | |||||
| var block = makeMap("a,address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video"); | |||||
| // Inline Elements - HTML 5 | |||||
| var inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"); | |||||
| // Elements that you can, intentionally, leave open | |||||
| // (and which close themselves) | |||||
| var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"); | |||||
| // Attributes that have their values filled in disabled="disabled" | |||||
| var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"); | |||||
| // Special Elements (can contain anything) | |||||
| var special = makeMap("wxxxcode-style,script,style,view,scroll-view,block"); | |||||
| function HTMLParser(html, handler) { | |||||
| var index, chars, match, stack = [], last = html; | |||||
| stack.last = function () { | |||||
| return this[this.length - 1]; | |||||
| }; | |||||
| while (html) { | |||||
| chars = true; | |||||
| // Make sure we're not in a script or style element | |||||
| if (!stack.last() || !special[stack.last()]) { | |||||
| // Comment | |||||
| if (html.indexOf("<!--") == 0) { | |||||
| index = html.indexOf("-->"); | |||||
| if (index >= 0) { | |||||
| if (handler.comment) | |||||
| handler.comment(html.substring(4, index)); | |||||
| html = html.substring(index + 3); | |||||
| chars = false; | |||||
| } | |||||
| // end tag | |||||
| } else if (html.indexOf("</") == 0) { | |||||
| match = html.match(endTag); | |||||
| if (match) { | |||||
| html = html.substring(match[0].length); | |||||
| match[0].replace(endTag, parseEndTag); | |||||
| chars = false; | |||||
| } | |||||
| // start tag | |||||
| } else if (html.indexOf("<") == 0) { | |||||
| match = html.match(startTag); | |||||
| if (match) { | |||||
| html = html.substring(match[0].length); | |||||
| match[0].replace(startTag, parseStartTag); | |||||
| chars = false; | |||||
| } | |||||
| } | |||||
| if (chars) { | |||||
| index = html.indexOf("<"); | |||||
| var text = '' | |||||
| while (index === 0) { | |||||
| text += "<"; | |||||
| html = html.substring(1); | |||||
| index = html.indexOf("<"); | |||||
| } | |||||
| text += index < 0 ? html : html.substring(0, index); | |||||
| html = index < 0 ? "" : html.substring(index); | |||||
| if (handler.chars) | |||||
| handler.chars(text); | |||||
| } | |||||
| } else { | |||||
| html = html.replace(new RegExp("([\\s\\S]*?)<\/" + stack.last() + "[^>]*>"), function (all, text) { | |||||
| text = text.replace(/<!--([\s\S]*?)-->|<!\[CDATA\[([\s\S]*?)]]>/g, "$1$2"); | |||||
| if (handler.chars) | |||||
| handler.chars(text); | |||||
| return ""; | |||||
| }); | |||||
| parseEndTag("", stack.last()); | |||||
| } | |||||
| if (html == last) | |||||
| throw "Parse Error: " + html; | |||||
| last = html; | |||||
| } | |||||
| // Clean up any remaining tags | |||||
| parseEndTag(); | |||||
| function parseStartTag(tag, tagName, rest, unary) { | |||||
| tagName = tagName.toLowerCase(); | |||||
| if (block[tagName]) { | |||||
| while (stack.last() && inline[stack.last()]) { | |||||
| parseEndTag("", stack.last()); | |||||
| } | |||||
| } | |||||
| if (closeSelf[tagName] && stack.last() == tagName) { | |||||
| parseEndTag("", tagName); | |||||
| } | |||||
| unary = empty[tagName] || !!unary; | |||||
| if (!unary) | |||||
| stack.push(tagName); | |||||
| if (handler.start) { | |||||
| var attrs = []; | |||||
| rest.replace(attr, function (match, name) { | |||||
| var value = arguments[2] ? arguments[2] : | |||||
| arguments[3] ? arguments[3] : | |||||
| arguments[4] ? arguments[4] : | |||||
| fillAttrs[name] ? name : ""; | |||||
| attrs.push({ | |||||
| name: name, | |||||
| value: value, | |||||
| escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') //" | |||||
| }); | |||||
| }); | |||||
| if (handler.start) { | |||||
| handler.start(tagName, attrs, unary); | |||||
| } | |||||
| } | |||||
| } | |||||
| function parseEndTag(tag, tagName) { | |||||
| // If no tag name is provided, clean shop | |||||
| if (!tagName) | |||||
| var pos = 0; | |||||
| // Find the closest opened tag of the same type | |||||
| else { | |||||
| tagName = tagName.toLowerCase(); | |||||
| for (var pos = stack.length - 1; pos >= 0; pos--) | |||||
| if (stack[pos] == tagName) | |||||
| break; | |||||
| } | |||||
| if (pos >= 0) { | |||||
| // Close all the open elements, up the stack | |||||
| for (var i = stack.length - 1; i >= pos; i--) | |||||
| if (handler.end) | |||||
| handler.end(stack[i]); | |||||
| // Remove the open elements from the stack | |||||
| stack.length = pos; | |||||
| } | |||||
| } | |||||
| }; | |||||
| function makeMap(str) { | |||||
| var obj = {}, items = str.split(","); | |||||
| for (var i = 0; i < items.length; i++) | |||||
| obj[items[i]] = true; | |||||
| return obj; | |||||
| } | |||||
| module.exports = HTMLParser; | |||||
| @@ -0,0 +1,207 @@ | |||||
| // HTML 支持的数学符号 | |||||
| function strNumDiscode(str){ | |||||
| str = str.replace(/∀/g, '∀'); | |||||
| str = str.replace(/∂/g, '∂'); | |||||
| str = str.replace(/&exists;/g, '∃'); | |||||
| str = str.replace(/∅/g, '∅'); | |||||
| str = str.replace(/∇/g, '∇'); | |||||
| str = str.replace(/∈/g, '∈'); | |||||
| str = str.replace(/∉/g, '∉'); | |||||
| str = str.replace(/∋/g, '∋'); | |||||
| str = str.replace(/∏/g, '∏'); | |||||
| str = str.replace(/∑/g, '∑'); | |||||
| str = str.replace(/−/g, '−'); | |||||
| str = str.replace(/∗/g, '∗'); | |||||
| str = str.replace(/√/g, '√'); | |||||
| str = str.replace(/∝/g, '∝'); | |||||
| str = str.replace(/∞/g, '∞'); | |||||
| str = str.replace(/∠/g, '∠'); | |||||
| str = str.replace(/∧/g, '∧'); | |||||
| str = str.replace(/∨/g, '∨'); | |||||
| str = str.replace(/∩/g, '∩'); | |||||
| str = str.replace(/∩/g, '∪'); | |||||
| str = str.replace(/∫/g, '∫'); | |||||
| str = str.replace(/∴/g, '∴'); | |||||
| str = str.replace(/∼/g, '∼'); | |||||
| str = str.replace(/≅/g, '≅'); | |||||
| str = str.replace(/≈/g, '≈'); | |||||
| str = str.replace(/≠/g, '≠'); | |||||
| str = str.replace(/≤/g, '≤'); | |||||
| str = str.replace(/≥/g, '≥'); | |||||
| str = str.replace(/⊂/g, '⊂'); | |||||
| str = str.replace(/⊃/g, '⊃'); | |||||
| str = str.replace(/⊄/g, '⊄'); | |||||
| str = str.replace(/⊆/g, '⊆'); | |||||
| str = str.replace(/⊇/g, '⊇'); | |||||
| str = str.replace(/⊕/g, '⊕'); | |||||
| str = str.replace(/⊗/g, '⊗'); | |||||
| str = str.replace(/⊥/g, '⊥'); | |||||
| str = str.replace(/⋅/g, '⋅'); | |||||
| return str; | |||||
| } | |||||
| //HTML 支持的希腊字母 | |||||
| function strGreeceDiscode(str){ | |||||
| str = str.replace(/Α/g, 'Α'); | |||||
| str = str.replace(/Β/g, 'Β'); | |||||
| str = str.replace(/Γ/g, 'Γ'); | |||||
| str = str.replace(/Δ/g, 'Δ'); | |||||
| str = str.replace(/Ε/g, 'Ε'); | |||||
| str = str.replace(/Ζ/g, 'Ζ'); | |||||
| str = str.replace(/Η/g, 'Η'); | |||||
| str = str.replace(/Θ/g, 'Θ'); | |||||
| str = str.replace(/Ι/g, 'Ι'); | |||||
| str = str.replace(/Κ/g, 'Κ'); | |||||
| str = str.replace(/Λ/g, 'Λ'); | |||||
| str = str.replace(/Μ/g, 'Μ'); | |||||
| str = str.replace(/Ν/g, 'Ν'); | |||||
| str = str.replace(/Ξ/g, 'Ν'); | |||||
| str = str.replace(/Ο/g, 'Ο'); | |||||
| str = str.replace(/Π/g, 'Π'); | |||||
| str = str.replace(/Ρ/g, 'Ρ'); | |||||
| str = str.replace(/Σ/g, 'Σ'); | |||||
| str = str.replace(/Τ/g, 'Τ'); | |||||
| str = str.replace(/Υ/g, 'Υ'); | |||||
| str = str.replace(/Φ/g, 'Φ'); | |||||
| str = str.replace(/Χ/g, 'Χ'); | |||||
| str = str.replace(/Ψ/g, 'Ψ'); | |||||
| str = str.replace(/Ω/g, 'Ω'); | |||||
| str = str.replace(/α/g, 'α'); | |||||
| str = str.replace(/β/g, 'β'); | |||||
| str = str.replace(/γ/g, 'γ'); | |||||
| str = str.replace(/δ/g, 'δ'); | |||||
| str = str.replace(/ε/g, 'ε'); | |||||
| str = str.replace(/ζ/g, 'ζ'); | |||||
| str = str.replace(/η/g, 'η'); | |||||
| str = str.replace(/θ/g, 'θ'); | |||||
| str = str.replace(/ι/g, 'ι'); | |||||
| str = str.replace(/κ/g, 'κ'); | |||||
| str = str.replace(/λ/g, 'λ'); | |||||
| str = str.replace(/μ/g, 'μ'); | |||||
| str = str.replace(/ν/g, 'ν'); | |||||
| str = str.replace(/ξ/g, 'ξ'); | |||||
| str = str.replace(/ο/g, 'ο'); | |||||
| str = str.replace(/π/g, 'π'); | |||||
| str = str.replace(/ρ/g, 'ρ'); | |||||
| str = str.replace(/ς/g, 'ς'); | |||||
| str = str.replace(/σ/g, 'σ'); | |||||
| str = str.replace(/τ/g, 'τ'); | |||||
| str = str.replace(/υ/g, 'υ'); | |||||
| str = str.replace(/φ/g, 'φ'); | |||||
| str = str.replace(/χ/g, 'χ'); | |||||
| str = str.replace(/ψ/g, 'ψ'); | |||||
| str = str.replace(/ω/g, 'ω'); | |||||
| str = str.replace(/ϑ/g, 'ϑ'); | |||||
| str = str.replace(/ϒ/g, 'ϒ'); | |||||
| str = str.replace(/ϖ/g, 'ϖ'); | |||||
| str = str.replace(/·/g, '·'); | |||||
| return str; | |||||
| } | |||||
| // | |||||
| function strcharacterDiscode(str){ | |||||
| // 加入常用解析 | |||||
| str = str.replace(/ /g, ' '); | |||||
| str = str.replace(/"/g, "'"); | |||||
| str = str.replace(/&/g, '&'); | |||||
| // str = str.replace(/</g, '‹'); | |||||
| // str = str.replace(/>/g, '›'); | |||||
| str = str.replace(/</g, '<'); | |||||
| str = str.replace(/>/g, '>'); | |||||
| str = str.replace(/•/g, '•'); | |||||
| return str; | |||||
| } | |||||
| // HTML 支持的其他实体 | |||||
| function strOtherDiscode(str){ | |||||
| str = str.replace(/Œ/g, 'Œ'); | |||||
| str = str.replace(/œ/g, 'œ'); | |||||
| str = str.replace(/Š/g, 'Š'); | |||||
| str = str.replace(/š/g, 'š'); | |||||
| str = str.replace(/Ÿ/g, 'Ÿ'); | |||||
| str = str.replace(/ƒ/g, 'ƒ'); | |||||
| str = str.replace(/ˆ/g, 'ˆ'); | |||||
| str = str.replace(/˜/g, '˜'); | |||||
| str = str.replace(/ /g, ''); | |||||
| str = str.replace(/ /g, ''); | |||||
| str = str.replace(/ /g, ''); | |||||
| str = str.replace(/‌/g, ''); | |||||
| str = str.replace(/‍/g, ''); | |||||
| str = str.replace(/‎/g, ''); | |||||
| str = str.replace(/‏/g, ''); | |||||
| str = str.replace(/–/g, '–'); | |||||
| str = str.replace(/—/g, '—'); | |||||
| str = str.replace(/‘/g, '‘'); | |||||
| str = str.replace(/’/g, '’'); | |||||
| str = str.replace(/‚/g, '‚'); | |||||
| str = str.replace(/“/g, '“'); | |||||
| str = str.replace(/”/g, '”'); | |||||
| str = str.replace(/„/g, '„'); | |||||
| str = str.replace(/†/g, '†'); | |||||
| str = str.replace(/‡/g, '‡'); | |||||
| str = str.replace(/•/g, '•'); | |||||
| str = str.replace(/…/g, '…'); | |||||
| str = str.replace(/‰/g, '‰'); | |||||
| str = str.replace(/′/g, '′'); | |||||
| str = str.replace(/″/g, '″'); | |||||
| str = str.replace(/‹/g, '‹'); | |||||
| str = str.replace(/›/g, '›'); | |||||
| str = str.replace(/‾/g, '‾'); | |||||
| str = str.replace(/€/g, '€'); | |||||
| str = str.replace(/™/g, '™'); | |||||
| str = str.replace(/←/g, '←'); | |||||
| str = str.replace(/↑/g, '↑'); | |||||
| str = str.replace(/→/g, '→'); | |||||
| str = str.replace(/↓/g, '↓'); | |||||
| str = str.replace(/↔/g, '↔'); | |||||
| str = str.replace(/↵/g, '↵'); | |||||
| str = str.replace(/⌈/g, '⌈'); | |||||
| str = str.replace(/⌉/g, '⌉'); | |||||
| str = str.replace(/⌊/g, '⌊'); | |||||
| str = str.replace(/⌋/g, '⌋'); | |||||
| str = str.replace(/◊/g, '◊'); | |||||
| str = str.replace(/♠/g, '♠'); | |||||
| str = str.replace(/♣/g, '♣'); | |||||
| str = str.replace(/♥/g, '♥'); | |||||
| str = str.replace(/♦/g, '♦'); | |||||
| str = str.replace(/'/g, '\''); | |||||
| return str; | |||||
| } | |||||
| function strMoreDiscode(str){ | |||||
| str = str.replace(/\r\n/g,""); | |||||
| str = str.replace(/\n/g,""); | |||||
| str = str.replace(/code/g,"wxxxcode-style"); | |||||
| return str; | |||||
| } | |||||
| function strDiscode(str){ | |||||
| str = strNumDiscode(str); | |||||
| str = strGreeceDiscode(str); | |||||
| str = strcharacterDiscode(str); | |||||
| str = strOtherDiscode(str); | |||||
| str = strMoreDiscode(str); | |||||
| return str; | |||||
| } | |||||
| function urlToHttpUrl(url,rep){ | |||||
| var patt1 = new RegExp("^//"); | |||||
| var result = patt1.test(url); | |||||
| if(result){ | |||||
| url = rep+":"+url; | |||||
| } | |||||
| return url; | |||||
| } | |||||
| module.exports = { | |||||
| strDiscode:strDiscode, | |||||
| urlToHttpUrl:urlToHttpUrl | |||||
| } | |||||
| @@ -0,0 +1,157 @@ | |||||
| /** | |||||
| * author: Di (微信小程序开发工程师) | |||||
| * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) | |||||
| * 垂直微信小程序开发交流社区 | |||||
| * | |||||
| * github地址: https://github.com/icindy/wxParse | |||||
| * | |||||
| * for: 微信小程序富文本解析 | |||||
| * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 | |||||
| */ | |||||
| /** | |||||
| * utils函数引入 | |||||
| **/ | |||||
| import showdown from './showdown.js'; | |||||
| import HtmlToJson from './html2json.js'; | |||||
| /** | |||||
| * 配置及公有属性 | |||||
| **/ | |||||
| var realWindowWidth = 0; | |||||
| var realWindowHeight = 0; | |||||
| tt.getSystemInfo({ | |||||
| success: function (res) { | |||||
| realWindowWidth = res.windowWidth | |||||
| realWindowHeight = res.windowHeight | |||||
| } | |||||
| }) | |||||
| /** | |||||
| * 主函数入口区 | |||||
| **/ | |||||
| function wxParse(bindName = 'wxParseData', type = 'html', data = '<div class="color:red;">数据不能为空</div>', target, imagePadding) { | |||||
| var that = target; | |||||
| var transData = {}; //存放转化后的数据 | |||||
| if (type == 'html') { | |||||
| transData = HtmlToJson.html2json(data, bindName); | |||||
| } else if (type == 'md' || type == 'markdown') { | |||||
| var converter = new showdown.Converter(); | |||||
| var html = converter.makeHtml(data); | |||||
| transData = HtmlToJson.html2json(html, bindName); | |||||
| } | |||||
| transData.view = {}; | |||||
| transData.view.imagePadding = 0; | |||||
| if (typeof (imagePadding) != 'undefined') { | |||||
| transData.view.imagePadding = imagePadding | |||||
| } | |||||
| var bindData = {}; | |||||
| bindData[bindName] = transData; | |||||
| that.setData(bindData) | |||||
| that.wxParseImgLoad = wxParseImgLoad; | |||||
| that.wxParseImgTap = wxParseImgTap; | |||||
| } | |||||
| // 图片点击事件 | |||||
| function wxParseImgTap(e) { | |||||
| var that = this; | |||||
| var nowImgUrl = e.target.dataset.src; | |||||
| var tagFrom = e.target.dataset.from; | |||||
| if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) { | |||||
| tt.previewImage({ | |||||
| current: nowImgUrl, // 当前显示图片的http链接 | |||||
| urls: that.data[tagFrom].imageUrls // 需要预览的图片http链接列表 | |||||
| }) | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 图片视觉宽高计算函数区 | |||||
| **/ | |||||
| function wxParseImgLoad(e) { | |||||
| var that = this; | |||||
| var tagFrom = e.target.dataset.from; | |||||
| var idx = e.target.dataset.idx; | |||||
| if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) { | |||||
| calMoreImageInfo(e, idx, that, tagFrom) | |||||
| } | |||||
| } | |||||
| // 假循环获取计算图片视觉最佳宽高 | |||||
| function calMoreImageInfo(e, idx, that, bindName) { | |||||
| var temData = that.data[bindName]; | |||||
| if (!temData || temData.images.length == 0) { | |||||
| return; | |||||
| } | |||||
| var temImages = temData.images; | |||||
| //因为无法获取view宽度 需要自定义padding进行计算,稍后处理 | |||||
| var recal = wxAutoImageCal(e.detail.width, e.detail.height, that, bindName); | |||||
| // temImages[idx].width = recal.imageWidth; | |||||
| // temImages[idx].height = recal.imageheight; | |||||
| // temData.images = temImages; | |||||
| // var bindData = {}; | |||||
| // bindData[bindName] = temData; | |||||
| // that.setData(bindData); | |||||
| var index = temImages[idx].index | |||||
| var key = `${bindName}` | |||||
| for (var i of index.split('.')) key += `.nodes[${i}]` | |||||
| var keyW = key + '.width' | |||||
| var keyH = key + '.height' | |||||
| that.setData({ | |||||
| [keyW]: recal.imageWidth, | |||||
| [keyH]: recal.imageheight, | |||||
| }) | |||||
| } | |||||
| // 计算视觉优先的图片宽高 | |||||
| function wxAutoImageCal(originalWidth, originalHeight, that, bindName) { | |||||
| //获取图片的原始长宽 | |||||
| var windowWidth = 0, | |||||
| windowHeight = 0; | |||||
| var autoWidth = 0, | |||||
| autoHeight = 0; | |||||
| var results = {}; | |||||
| var padding = that.data[bindName].view.imagePadding; | |||||
| windowWidth = realWindowWidth - 2 * padding; | |||||
| windowHeight = realWindowHeight; | |||||
| //判断按照那种方式进行缩放 | |||||
| // console.log("windowWidth" + windowWidth); | |||||
| if (originalWidth > windowWidth) { //在图片width大于手机屏幕width时候 | |||||
| autoWidth = windowWidth; | |||||
| // console.log("autoWidth" + autoWidth); | |||||
| autoHeight = (autoWidth * originalHeight) / originalWidth; | |||||
| // console.log("autoHeight" + autoHeight); | |||||
| results.imageWidth = autoWidth; | |||||
| results.imageheight = autoHeight; | |||||
| } else { //否则展示原来的数据 | |||||
| results.imageWidth = originalWidth; | |||||
| results.imageheight = originalHeight; | |||||
| } | |||||
| return results; | |||||
| } | |||||
| function wxParseTemArray(temArrayName, bindNameReg, total, that) { | |||||
| var array = []; | |||||
| var temData = that.data; | |||||
| var obj = null; | |||||
| for (var i = 0; i < total; i++) { | |||||
| var simArr = temData[bindNameReg + i].nodes; | |||||
| array.push(simArr); | |||||
| } | |||||
| temArrayName = temArrayName || 'wxParseTemArray'; | |||||
| obj = JSON.parse('{"' + temArrayName + '":""}'); | |||||
| obj[temArrayName] = array; | |||||
| that.setData(obj); | |||||
| } | |||||
| /** | |||||
| * 配置emojis | |||||
| * | |||||
| */ | |||||
| function emojisInit(reg = '', baseSrc = "/wxParse/emojis/", emojis) { | |||||
| HtmlToJson.emojisInit(reg, baseSrc, emojis); | |||||
| } | |||||
| module.exports = { | |||||
| wxParse: wxParse, | |||||
| wxParseTemArray: wxParseTemArray, | |||||
| emojisInit: emojisInit | |||||
| } | |||||
| @@ -0,0 +1,965 @@ | |||||
| <!--基础元素--> | |||||
| <template name="wxParseVideo"> | |||||
| <!--增加video标签支持,并循环添加--> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <video class="{{item.classStr}} wxParse-{{item.tag}}-video" src="{{item.attr.src}}"></video> | |||||
| </view> | |||||
| </template> | |||||
| <template name="wxParseImg"> | |||||
| <image class="{{item.classStr}} wxParse-{{item.tag}}" data-from="{{item.from}}" data-src="{{item.attr.src}}" | |||||
| data-idx="{{item.imgIndex}}" src="{{item.attr.src}}" bindload="wxParseImgLoad" bindtap="wxParseImgTap" | |||||
| mode="widthFix" style="width:{{item.width}}px;" /> | |||||
| </template> | |||||
| <template name="WxEmojiView"> | |||||
| <view class="WxEmojiView wxParse-inline" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.textArray}}" tt:key=""> | |||||
| <block class="{{item.text == '\\n' ? 'wxParse-hide':''}}" tt:if="{{item.node == 'text'}}">{{item.text}}</block> | |||||
| <block tt:elif="{{item.node == 'element'}}"> | |||||
| <image class="wxEmoji" src="{{item.baseSrc}}{{item.text}}" /> | |||||
| </block> | |||||
| </block> | |||||
| </view> | |||||
| </template> | |||||
| <template name="WxParseBr"> | |||||
| <text>\n</text> | |||||
| </template> | |||||
| <!--入口模版--> | |||||
| <template name="wxParse"> | |||||
| <block tt:for="{{wxParseData}}" tt:key=""> | |||||
| <template is="wxParse0" tt:if="{{item.tag !='style'}}" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse0"> | |||||
| <!--<template is="wxParse1" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse1" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse1" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse1" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'table'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse1" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse1" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse1" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse1"> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'&&item.tag !='style'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse2" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse2" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse2" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse2" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse2" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse2"> | |||||
| <!--<template is="wxParse3" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse3" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse3" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse3" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse3" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse3" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'&&item.tag !='style'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse3"> | |||||
| <!--<template is="wxParse4" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse4" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse4" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse4" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse4" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse4" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse4"> | |||||
| <!--<template is="wxParse5" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse5" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse5" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse5" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse5" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse5" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse5"> | |||||
| <!--<template is="wxParse6" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse6" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse6" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse6" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse6" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse6" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse6"> | |||||
| <!--<template is="wxParse7" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse7" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse7" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse7" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse7" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse7" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse7"> | |||||
| <!--<template is="wxParse8" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse8" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse8" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse8" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse8" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse8" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse8"> | |||||
| <!--<template is="wxParse9" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse9" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse9" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse9" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse9" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse9" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse9"> | |||||
| <!--<template is="wxParse10" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse10" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse10" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse10" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse10" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse10" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse10"> | |||||
| <!--<template is="wxParse11" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse11" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse11" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse11" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse11" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse11" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| <!--循环模版--> | |||||
| <template name="wxParse11"> | |||||
| <!--<template is="wxParse12" data="{{item}}" />--> | |||||
| <!--判断是否是标签节点--> | |||||
| <block tt:if="{{item.node == 'element'}}"> | |||||
| <block tt:if="{{item.tag == 'button'}}"> | |||||
| <button type="default" size="mini"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse12" data="{{item}}" /> | |||||
| </block> | |||||
| </button> | |||||
| </block> | |||||
| <!--li类型--> | |||||
| <block tt:elif="{{item.tag == 'li'}}"> | |||||
| <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}"> | |||||
| <view class="{{item.classStr}} wxParse-li-inner"> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <view class="{{item.classStr}} wxParse-li-circle"></view> | |||||
| </view> | |||||
| <view class="{{item.classStr}} wxParse-li-text"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse12" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </block> | |||||
| <!--video类型--> | |||||
| <block tt:elif="{{item.tag == 'video'}}"> | |||||
| <template is="wxParseVideo" data="{{item}}" /> | |||||
| </block> | |||||
| <!--img类型--> | |||||
| <block tt:elif="{{item.tag == 'img'}}"> | |||||
| <template is="wxParseImg" data="{{item}}" /> | |||||
| </block> | |||||
| <!--a类型--> | |||||
| <block tt:elif="{{item.tag == 'a'}}"> | |||||
| <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" | |||||
| data-src="{{item.attr.href}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse12" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <block tt:elif="{{item.tag == 'br'}}"> | |||||
| <template is="WxParseBr"></template> | |||||
| </block> | |||||
| <!--其他块级标签--> | |||||
| <block tt:elif="{{item.tagType == 'block'}}"> | |||||
| <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse12" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--内联标签--> | |||||
| <view tt:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}"> | |||||
| <block tt:for="{{item.nodes}}" tt:for-item="item" tt:key=""> | |||||
| <template is="wxParse12" data="{{item}}" /> | |||||
| </block> | |||||
| </view> | |||||
| </block> | |||||
| <!--判断是否是文本节点--> | |||||
| <block tt:elif="{{item.node == 'text'}}"> | |||||
| <!--如果是,直接进行--> | |||||
| <template is="WxEmojiView" data="{{item}}" /> | |||||
| </block> | |||||
| </template> | |||||
| @@ -0,0 +1,293 @@ | |||||
| .wxParse { | |||||
| margin: 0 5px; | |||||
| font-family: Helvetica, sans-serif; | |||||
| font-size: 28rpx; | |||||
| color: #666; | |||||
| line-height: 1.8; | |||||
| } | |||||
| view { | |||||
| word-break: break-all; | |||||
| overflow: auto; | |||||
| background: #FFF; | |||||
| } | |||||
| .wxParse-inline { | |||||
| display: inline; | |||||
| margin: 0; | |||||
| padding: 0; | |||||
| } | |||||
| /*//标题 */ | |||||
| .wxParse-div { | |||||
| margin: 0; | |||||
| padding: 0; | |||||
| } | |||||
| .wxParse-h1 { | |||||
| font-size: 2em; | |||||
| margin: .67em 0 | |||||
| } | |||||
| .wxParse-h2 { | |||||
| font-size: 1.5em; | |||||
| margin: .75em 0 | |||||
| } | |||||
| .wxParse-h3 { | |||||
| font-size: 1.17em; | |||||
| margin: .83em 0 | |||||
| } | |||||
| .wxParse-h4 { | |||||
| margin: 1.12em 0 | |||||
| } | |||||
| .wxParse-h5 { | |||||
| font-size: .83em; | |||||
| margin: 1.5em 0 | |||||
| } | |||||
| .wxParse-h6 { | |||||
| font-size: .75em; | |||||
| margin: 1.67em 0 | |||||
| } | |||||
| .wxParse-h1 { | |||||
| font-size: 18px; | |||||
| font-weight: 400; | |||||
| margin-bottom: .9em; | |||||
| } | |||||
| .wxParse-h2 { | |||||
| font-size: 16px; | |||||
| font-weight: 400; | |||||
| margin-bottom: .34em; | |||||
| } | |||||
| .wxParse-h3 { | |||||
| font-weight: 400; | |||||
| font-size: 15px; | |||||
| margin-bottom: .34em; | |||||
| } | |||||
| .wxParse-h4 { | |||||
| font-weight: 400; | |||||
| font-size: 14px; | |||||
| margin-bottom: .24em; | |||||
| } | |||||
| .wxParse-h5 { | |||||
| font-weight: 400; | |||||
| font-size: 13px; | |||||
| margin-bottom: .14em; | |||||
| } | |||||
| .wxParse-h6 { | |||||
| font-weight: 400; | |||||
| font-size: 12px; | |||||
| margin-bottom: .04em; | |||||
| } | |||||
| .wxParse-h1, | |||||
| .wxParse-h2, | |||||
| .wxParse-h3, | |||||
| .wxParse-h4, | |||||
| .wxParse-h5, | |||||
| .wxParse-h6, | |||||
| .wxParse-b, | |||||
| .wxParse-strong { | |||||
| font-weight: bolder | |||||
| } | |||||
| .wxParse-i, | |||||
| .wxParse-cite, | |||||
| .wxParse-em, | |||||
| .wxParse-var, | |||||
| .wxParse-address { | |||||
| font-style: italic | |||||
| } | |||||
| .wxParse-pre, | |||||
| .wxParse-tt, | |||||
| .wxParse-code, | |||||
| .wxParse-kbd, | |||||
| .wxParse-samp { | |||||
| font-family: monospace | |||||
| } | |||||
| .wxParse-pre { | |||||
| white-space: pre | |||||
| } | |||||
| .wxParse-big { | |||||
| font-size: 1.17em | |||||
| } | |||||
| .wxParse-small, | |||||
| .wxParse-sub, | |||||
| .wxParse-sup { | |||||
| font-size: .83em | |||||
| } | |||||
| .wxParse-sub { | |||||
| vertical-align: sub | |||||
| } | |||||
| .wxParse-sup { | |||||
| vertical-align: super | |||||
| } | |||||
| .wxParse-s, | |||||
| .wxParse-strike, | |||||
| .wxParse-del { | |||||
| text-decoration: line-through | |||||
| } | |||||
| /*wxparse-自定义个性化的css样式*/ | |||||
| /*增加video的css样式*/ | |||||
| .wxParse-strong, | |||||
| .wxParse-s { | |||||
| display: inline | |||||
| } | |||||
| .wxParse-a { | |||||
| color: deepskyblue; | |||||
| word-break: break-all; | |||||
| overflow: auto; | |||||
| } | |||||
| .wxParse-video { | |||||
| text-align: center; | |||||
| margin: 10px 0; | |||||
| } | |||||
| .wxParse-video-video { | |||||
| width: 100%; | |||||
| } | |||||
| .wxParse-img { | |||||
| /*background-color: #efefef;*/ | |||||
| overflow: hidden; | |||||
| } | |||||
| .wxParse-blockquote { | |||||
| margin: 0; | |||||
| padding: 10px 0 10px 5px; | |||||
| font-family: Courier, Calibri, "宋体"; | |||||
| background: #f5f5f5; | |||||
| border-left: 3px solid #dbdbdb; | |||||
| } | |||||
| .wxParse-code, | |||||
| .wxParse-wxxxcode-style { | |||||
| display: inline; | |||||
| background: #f5f5f5; | |||||
| } | |||||
| .wxParse-ul { | |||||
| margin: 20rpx 10rpx; | |||||
| } | |||||
| .wxParse-li, | |||||
| .wxParse-li-inner { | |||||
| display: flex; | |||||
| align-items: baseline; | |||||
| margin: 10rpx 0; | |||||
| } | |||||
| .wxParse-li-text { | |||||
| align-items: center; | |||||
| line-height: 20px; | |||||
| } | |||||
| .wxParse-li-circle { | |||||
| display: inline-flex; | |||||
| width: 5px; | |||||
| height: 5px; | |||||
| background-color: #333; | |||||
| margin-right: 5px; | |||||
| } | |||||
| .wxParse-li-square { | |||||
| display: inline-flex; | |||||
| width: 10rpx; | |||||
| height: 10rpx; | |||||
| background-color: #333; | |||||
| margin-right: 5px; | |||||
| } | |||||
| .wxParse-li-ring { | |||||
| display: inline-flex; | |||||
| width: 10rpx; | |||||
| height: 10rpx; | |||||
| border: 2rpx solid #333; | |||||
| border-radius: 50%; | |||||
| background-color: #fff; | |||||
| margin-right: 5px; | |||||
| } | |||||
| /*.wxParse-table{ | |||||
| width: 100%; | |||||
| height: 400px; | |||||
| } | |||||
| .wxParse-thead,.wxParse-tfoot,.wxParse-tr{ | |||||
| display: flex; | |||||
| flex-direction: row; | |||||
| } | |||||
| .wxParse-th,.wxParse-td{ | |||||
| display: flex; | |||||
| width: 580px; | |||||
| overflow: auto; | |||||
| }*/ | |||||
| .wxParse-u { | |||||
| text-decoration: underline; | |||||
| } | |||||
| .wxParse-hide { | |||||
| display: none; | |||||
| } | |||||
| .WxEmojiView { | |||||
| align-items: center; | |||||
| } | |||||
| .wxEmoji { | |||||
| width: 16px; | |||||
| height: 16px; | |||||
| } | |||||
| .wxParse-tr { | |||||
| display: flex; | |||||
| border-right: 1px solid #e0e0e0; | |||||
| border-bottom: 1px solid #e0e0e0; | |||||
| border-top: 1px solid #e0e0e0; | |||||
| } | |||||
| .wxParse-th, | |||||
| .wxParse-td { | |||||
| flex: 1; | |||||
| padding: 5px; | |||||
| font-size: 28rpx; | |||||
| border-left: 1px solid #e0e0e0; | |||||
| word-break: break-all; | |||||
| } | |||||
| .wxParse-td:last { | |||||
| border-top: 1px solid #e0e0e0; | |||||
| } | |||||
| .wxParse-th { | |||||
| background: #f0f0f0; | |||||
| border-top: 1px solid #e0e0e0; | |||||
| } | |||||
| .wxParse-del { | |||||
| display: inline; | |||||
| } | |||||
| .wxParse-figure { | |||||
| overflow: hidden; | |||||
| } | |||||
| @@ -208,6 +208,8 @@ Page({ | |||||
| outRefundOrderId: outRefundOrderId | outRefundOrderId: outRefundOrderId | ||||
| }) | }) | ||||
| } else if (orderStatus == 2) { | |||||
| status = 'orderCancel' | |||||
| } else { | } else { | ||||
| status = 'noRefund' | status = 'noRefund' | ||||
| } | } | ||||
| @@ -48,7 +48,7 @@ | |||||
| <image class="infoArrow" src="{{chevronUrl}}" mode='widthFix'></image> | <image class="infoArrow" src="{{chevronUrl}}" mode='widthFix'></image> | ||||
| <view tt:if="{{orderStatus != 'noRefund'}}"> | |||||
| <view tt:if="{{orderStatus != 'noRefund' && orderStatus != 'orderCancel'}}"> | |||||
| <pay-button tt:if="{{orderStatus}}" id='payBtn' class="goRefundPayBtn" order-status="{{orderStatus}}" | <pay-button tt:if="{{orderStatus}}" id='payBtn' class="goRefundPayBtn" order-status="{{orderStatus}}" | ||||
| order-id="{{outOrderId}}" refund-id="{{outRefundOrderId}}" bind:refund="handleRefund" | order-id="{{outOrderId}}" refund-id="{{outRefundOrderId}}" bind:refund="handleRefund" | ||||
| bind:applyrefund="applyRefund" bind:error="handleError" /> | bind:applyrefund="applyRefund" bind:error="handleError" /> | ||||
| @@ -58,6 +58,11 @@ | |||||
| </view> | </view> | ||||
| </view> | </view> | ||||
| <view tt:if="{{orderStatus == 'orderCancel'}}"> | |||||
| <view id='payBtn' class="goRefund"> | |||||
| 交易关闭 | |||||
| </view> | |||||
| </view> | |||||
| <!-- <view class="goRefund" catchtap="goRefund" data-id="{{order.id}}" | <!-- <view class="goRefund" catchtap="goRefund" data-id="{{order.id}}" | ||||
| tt:if="{{order.payment!=0&&(order.couponOrderStatus==0||order.couponOrderStatus==3)}}"> | tt:if="{{order.payment!=0&&(order.couponOrderStatus==0||order.couponOrderStatus==3)}}"> | ||||