소스 검색

rich-text

product
HolyKnightIX 1 년 전
부모
커밋
f6f43162e4
13개의 변경된 파일4728개의 추가작업 그리고 9개의 파일을 삭제
  1. +4
    -4
      ext.json
  2. +41
    -2
      pages/freeBannerDetail/freeBannerDetail.js
  3. +5
    -1
      pages/freeBannerDetail/freeBannerDetail.ttml
  4. +6
    -1
      pages/freeBannerDetail/freeBannerDetail.ttss
  5. +318
    -0
      pages/freeBannerDetail/ttParse/html2json.js
  6. +192
    -0
      pages/freeBannerDetail/ttParse/htmlparser.js
  7. +2532
    -0
      pages/freeBannerDetail/ttParse/showdown.js
  8. +207
    -0
      pages/freeBannerDetail/ttParse/wxDiscode.js
  9. +157
    -0
      pages/freeBannerDetail/ttParse/wxParse.js
  10. +965
    -0
      pages/freeBannerDetail/ttParse/wxParse.ttml
  11. +293
    -0
      pages/freeBannerDetail/ttParse/wxParse.ttss
  12. +2
    -0
      pages/order/detail/index.js
  13. +6
    -1
      pages/order/detail/index.ttml

+ 4
- 4
ext.json 파일 보기

@@ -1,17 +1,17 @@
{
"ext": {
"attr": {
"configUrl": "https://c.malls.iformall.com/C/api"
"configUrl": "https://ctest.malls.iformall.com/C/api"
},
"name": "家帮汇保姆育儿嫂",
"weappId": "ttc82fbe92571351e401"
"name": "富茂券券集团版",
"weappId": "tt620e14b3fd30264101"
},
"window": {
"backgroundTextStyle": "light",
"navigationBarTextStyle": "black",
"navigationBarBackgroundColor": "#fff"
},
"extAppid": "ttc82fbe92571351e401",
"extAppid": "tt620e14b3fd30264101",
"extEnable": true,
"directCommit": false,
"networkTimeout": {


+ 41
- 2
pages/freeBannerDetail/freeBannerDetail.js 파일 보기

@@ -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({
data: {

nodeData: "",
date: "",
mallTenantId: ""
},

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);
}
}
})
}

})

+ 5
- 1
pages/freeBannerDetail/freeBannerDetail.ttml 파일 보기

@@ -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>

+ 6
- 1
pages/freeBannerDetail/freeBannerDetail.ttss 파일 보기

@@ -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;
}

+ 318
- 0
pages/freeBannerDetail/ttParse/html2json.js 파일 보기

@@ -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
};


+ 192
- 0
pages/freeBannerDetail/ttParse/htmlparser.js 파일 보기

@@ -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;

+ 2532
- 0
pages/freeBannerDetail/ttParse/showdown.js
파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
파일 보기


+ 207
- 0
pages/freeBannerDetail/ttParse/wxDiscode.js 파일 보기

@@ -0,0 +1,207 @@
// HTML 支持的数学符号
function strNumDiscode(str){
str = str.replace(/&forall;/g, '∀');
str = str.replace(/&part;/g, '∂');
str = str.replace(/&exists;/g, '∃');
str = str.replace(/&empty;/g, '∅');
str = str.replace(/&nabla;/g, '∇');
str = str.replace(/&isin;/g, '∈');
str = str.replace(/&notin;/g, '∉');
str = str.replace(/&ni;/g, '∋');
str = str.replace(/&prod;/g, '∏');
str = str.replace(/&sum;/g, '∑');
str = str.replace(/&minus;/g, '−');
str = str.replace(/&lowast;/g, '∗');
str = str.replace(/&radic;/g, '√');
str = str.replace(/&prop;/g, '∝');
str = str.replace(/&infin;/g, '∞');
str = str.replace(/&ang;/g, '∠');
str = str.replace(/&and;/g, '∧');
str = str.replace(/&or;/g, '∨');
str = str.replace(/&cap;/g, '∩');
str = str.replace(/&cap;/g, '∪');
str = str.replace(/&int;/g, '∫');
str = str.replace(/&there4;/g, '∴');
str = str.replace(/&sim;/g, '∼');
str = str.replace(/&cong;/g, '≅');
str = str.replace(/&asymp;/g, '≈');
str = str.replace(/&ne;/g, '≠');
str = str.replace(/&le;/g, '≤');
str = str.replace(/&ge;/g, '≥');
str = str.replace(/&sub;/g, '⊂');
str = str.replace(/&sup;/g, '⊃');
str = str.replace(/&nsub;/g, '⊄');
str = str.replace(/&sube;/g, '⊆');
str = str.replace(/&supe;/g, '⊇');
str = str.replace(/&oplus;/g, '⊕');
str = str.replace(/&otimes;/g, '⊗');
str = str.replace(/&perp;/g, '⊥');
str = str.replace(/&sdot;/g, '⋅');
return str;
}

//HTML 支持的希腊字母
function strGreeceDiscode(str){
str = str.replace(/&Alpha;/g, 'Α');
str = str.replace(/&Beta;/g, 'Β');
str = str.replace(/&Gamma;/g, 'Γ');
str = str.replace(/&Delta;/g, 'Δ');
str = str.replace(/&Epsilon;/g, 'Ε');
str = str.replace(/&Zeta;/g, 'Ζ');
str = str.replace(/&Eta;/g, 'Η');
str = str.replace(/&Theta;/g, 'Θ');
str = str.replace(/&Iota;/g, 'Ι');
str = str.replace(/&Kappa;/g, 'Κ');
str = str.replace(/&Lambda;/g, 'Λ');
str = str.replace(/&Mu;/g, 'Μ');
str = str.replace(/&Nu;/g, 'Ν');
str = str.replace(/&Xi;/g, 'Ν');
str = str.replace(/&Omicron;/g, 'Ο');
str = str.replace(/&Pi;/g, 'Π');
str = str.replace(/&Rho;/g, 'Ρ');
str = str.replace(/&Sigma;/g, 'Σ');
str = str.replace(/&Tau;/g, 'Τ');
str = str.replace(/&Upsilon;/g, 'Υ');
str = str.replace(/&Phi;/g, 'Φ');
str = str.replace(/&Chi;/g, 'Χ');
str = str.replace(/&Psi;/g, 'Ψ');
str = str.replace(/&Omega;/g, 'Ω');

str = str.replace(/&alpha;/g, 'α');
str = str.replace(/&beta;/g, 'β');
str = str.replace(/&gamma;/g, 'γ');
str = str.replace(/&delta;/g, 'δ');
str = str.replace(/&epsilon;/g, 'ε');
str = str.replace(/&zeta;/g, 'ζ');
str = str.replace(/&eta;/g, 'η');
str = str.replace(/&theta;/g, 'θ');
str = str.replace(/&iota;/g, 'ι');
str = str.replace(/&kappa;/g, 'κ');
str = str.replace(/&lambda;/g, 'λ');
str = str.replace(/&mu;/g, 'μ');
str = str.replace(/&nu;/g, 'ν');
str = str.replace(/&xi;/g, 'ξ');
str = str.replace(/&omicron;/g, 'ο');
str = str.replace(/&pi;/g, 'π');
str = str.replace(/&rho;/g, 'ρ');
str = str.replace(/&sigmaf;/g, 'ς');
str = str.replace(/&sigma;/g, 'σ');
str = str.replace(/&tau;/g, 'τ');
str = str.replace(/&upsilon;/g, 'υ');
str = str.replace(/&phi;/g, 'φ');
str = str.replace(/&chi;/g, 'χ');
str = str.replace(/&psi;/g, 'ψ');
str = str.replace(/&omega;/g, 'ω');
str = str.replace(/&thetasym;/g, 'ϑ');
str = str.replace(/&upsih;/g, 'ϒ');
str = str.replace(/&piv;/g, 'ϖ');
str = str.replace(/&middot;/g, '·');
return str;
}

//

function strcharacterDiscode(str){
// 加入常用解析
str = str.replace(/&nbsp;/g, ' ');
str = str.replace(/&quot;/g, "'");
str = str.replace(/&amp;/g, '&');
// str = str.replace(/&lt;/g, '‹');
// str = str.replace(/&gt;/g, '›');

str = str.replace(/&lt;/g, '<');
str = str.replace(/&gt;/g, '>');
str = str.replace(/&#8226;/g, '•');

return str;
}

// HTML 支持的其他实体
function strOtherDiscode(str){
str = str.replace(/&OElig;/g, 'Œ');
str = str.replace(/&oelig;/g, 'œ');
str = str.replace(/&Scaron;/g, 'Š');
str = str.replace(/&scaron;/g, 'š');
str = str.replace(/&Yuml;/g, 'Ÿ');
str = str.replace(/&fnof;/g, 'ƒ');
str = str.replace(/&circ;/g, 'ˆ');
str = str.replace(/&tilde;/g, '˜');
str = str.replace(/&ensp;/g, '');
str = str.replace(/&emsp;/g, '');
str = str.replace(/&thinsp;/g, '');
str = str.replace(/&zwnj;/g, '');
str = str.replace(/&zwj;/g, '');
str = str.replace(/&lrm;/g, '');
str = str.replace(/&rlm;/g, '');
str = str.replace(/&ndash;/g, '–');
str = str.replace(/&mdash;/g, '—');
str = str.replace(/&lsquo;/g, '‘');
str = str.replace(/&rsquo;/g, '’');
str = str.replace(/&sbquo;/g, '‚');
str = str.replace(/&ldquo;/g, '“');
str = str.replace(/&rdquo;/g, '”');
str = str.replace(/&bdquo;/g, '„');
str = str.replace(/&dagger;/g, '†');
str = str.replace(/&Dagger;/g, '‡');
str = str.replace(/&bull;/g, '•');
str = str.replace(/&hellip;/g, '…');
str = str.replace(/&permil;/g, '‰');
str = str.replace(/&prime;/g, '′');
str = str.replace(/&Prime;/g, '″');
str = str.replace(/&lsaquo;/g, '‹');
str = str.replace(/&rsaquo;/g, '›');
str = str.replace(/&oline;/g, '‾');
str = str.replace(/&euro;/g, '€');
str = str.replace(/&trade;/g, '™');

str = str.replace(/&larr;/g, '←');
str = str.replace(/&uarr;/g, '↑');
str = str.replace(/&rarr;/g, '→');
str = str.replace(/&darr;/g, '↓');
str = str.replace(/&harr;/g, '↔');
str = str.replace(/&crarr;/g, '↵');
str = str.replace(/&lceil;/g, '⌈');
str = str.replace(/&rceil;/g, '⌉');

str = str.replace(/&lfloor;/g, '⌊');
str = str.replace(/&rfloor;/g, '⌋');
str = str.replace(/&loz;/g, '◊');
str = str.replace(/&spades;/g, '♠');
str = str.replace(/&clubs;/g, '♣');
str = str.replace(/&hearts;/g, '♥');

str = str.replace(/&diams;/g, '♦');
str = str.replace(/&#39;/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
}

+ 157
- 0
pages/freeBannerDetail/ttParse/wxParse.js 파일 보기

@@ -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
}

+ 965
- 0
pages/freeBannerDetail/ttParse/wxParse.ttml 파일 보기

@@ -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>

+ 293
- 0
pages/freeBannerDetail/ttParse/wxParse.ttss 파일 보기

@@ -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;
}

+ 2
- 0
pages/order/detail/index.js 파일 보기

@@ -208,6 +208,8 @@ Page({
outRefundOrderId: outRefundOrderId
})

} else if (orderStatus == 2) {
status = 'orderCancel'
} else {
status = 'noRefund'
}


+ 6
- 1
pages/order/detail/index.ttml 파일 보기

@@ -48,7 +48,7 @@

<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}}"
order-id="{{outOrderId}}" refund-id="{{outRefundOrderId}}" bind:refund="handleRefund"
bind:applyrefund="applyRefund" bind:error="handleError" />
@@ -58,6 +58,11 @@
</view>
</view>

<view tt:if="{{orderStatus == 'orderCancel'}}">
<view id='payBtn' class="goRefund">
交易关闭
</view>
</view>

<!-- <view class="goRefund" catchtap="goRefund" data-id="{{order.id}}"
tt:if="{{order.payment!=0&&(order.couponOrderStatus==0||order.couponOrderStatus==3)}}">


불러오는 중...
취소
저장