diff --git a/components/feng-parse/components/wxParseAudio.vue b/components/feng-parse/components/wxParseAudio.vue new file mode 100644 index 0000000..c0cb532 --- /dev/null +++ b/components/feng-parse/components/wxParseAudio.vue @@ -0,0 +1,28 @@ + + + diff --git a/components/feng-parse/components/wxParseImg.vue b/components/feng-parse/components/wxParseImg.vue new file mode 100644 index 0000000..a042ab2 --- /dev/null +++ b/components/feng-parse/components/wxParseImg.vue @@ -0,0 +1,94 @@ + + + diff --git a/components/feng-parse/components/wxParseTable.vue b/components/feng-parse/components/wxParseTable.vue new file mode 100644 index 0000000..5341d83 --- /dev/null +++ b/components/feng-parse/components/wxParseTable.vue @@ -0,0 +1,56 @@ + + + \ No newline at end of file diff --git a/components/feng-parse/components/wxParseTemplate0.vue b/components/feng-parse/components/wxParseTemplate0.vue new file mode 100644 index 0000000..5cbe790 --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate0.vue @@ -0,0 +1,116 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate1.vue b/components/feng-parse/components/wxParseTemplate1.vue new file mode 100644 index 0000000..70779e3 --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate1.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate10.vue b/components/feng-parse/components/wxParseTemplate10.vue new file mode 100644 index 0000000..891c8c3 --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate10.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate11.vue b/components/feng-parse/components/wxParseTemplate11.vue new file mode 100644 index 0000000..d38efbd --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate11.vue @@ -0,0 +1,105 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate2.vue b/components/feng-parse/components/wxParseTemplate2.vue new file mode 100644 index 0000000..c68b226 --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate2.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate3.vue b/components/feng-parse/components/wxParseTemplate3.vue new file mode 100644 index 0000000..1a1bb29 --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate3.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate4.vue b/components/feng-parse/components/wxParseTemplate4.vue new file mode 100644 index 0000000..c3497b8 --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate4.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate5.vue b/components/feng-parse/components/wxParseTemplate5.vue new file mode 100644 index 0000000..5e66618 --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate5.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate6.vue b/components/feng-parse/components/wxParseTemplate6.vue new file mode 100644 index 0000000..dc44621 --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate6.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate7.vue b/components/feng-parse/components/wxParseTemplate7.vue new file mode 100644 index 0000000..71636dc --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate7.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate8.vue b/components/feng-parse/components/wxParseTemplate8.vue new file mode 100644 index 0000000..326115d --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate8.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/feng-parse/components/wxParseTemplate9.vue b/components/feng-parse/components/wxParseTemplate9.vue new file mode 100644 index 0000000..f1224a3 --- /dev/null +++ b/components/feng-parse/components/wxParseTemplate9.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/feng-parse/components/wxParseVideo.vue b/components/feng-parse/components/wxParseVideo.vue new file mode 100644 index 0000000..31f2fee --- /dev/null +++ b/components/feng-parse/components/wxParseVideo.vue @@ -0,0 +1,55 @@ + + + + diff --git a/components/feng-parse/components/wxParseVideo1.vue b/components/feng-parse/components/wxParseVideo1.vue new file mode 100644 index 0000000..2ae122e --- /dev/null +++ b/components/feng-parse/components/wxParseVideo1.vue @@ -0,0 +1,25 @@ + + + + diff --git a/components/feng-parse/libs/html2json.js b/components/feng-parse/libs/html2json.js new file mode 100644 index 0000000..bf3082d --- /dev/null +++ b/components/feng-parse/libs/html2json.js @@ -0,0 +1,308 @@ +/** + * 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 + */ + +import wxDiscode from './wxDiscode'; +import HTMLParser from './htmlparser'; + +function makeMap(str) { + const obj = {}; + const items = str.split(','); + for (let i = 0; i < items.length; i += 1) obj[items[i]] = true; + return obj; +} + +// Block Elements - HTML 5 +const block = makeMap( + 'br,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 +const inline = makeMap( + 'a,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) +const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); + +function removeDOCTYPE(html) { + const isDocument = /([^]*)<\/body>/.test(html); + return isDocument ? RegExp.$1 : html; +} + +function trimHtml(html) { + return html + .replace(//gi, '') + .replace(/\/\*.*?\*\//gi, '') + // .replace(/[ ]+/gi, '') + .replace(//gi, ''); +} + +function getScreenInfo() { + const screen = {}; + wx.getSystemInfo({ + success: (res) => { + screen.width = res.windowWidth; + screen.height = res.windowHeight; + }, + }); + return screen; +} + +function html2json(html, customHandler, imageProp, host) { + // 处理字符串 + html = removeDOCTYPE(html); + html = trimHtml(html); + html = wxDiscode.strDiscode(html); + // 生成node节点 + const bufArray = []; + const results = { + nodes: [], + imageUrls: [], + }; + + const screen = getScreenInfo(); + + function Node(tag) { + this.node = 'element'; + this.tag = tag; + + this.$screen = screen; + } + + HTMLParser(html, { + start(tag, attrs, unary) { + // node for this element + const node = new Node(tag); + + if (bufArray.length !== 0) { + const parent = bufArray[0]; + if (parent.nodes === undefined) { + parent.nodes = []; + } + } + + if (block[tag]) { + node.tagType = 'block'; + } else if (inline[tag]) { + node.tagType = 'inline'; + } else if (closeSelf[tag]) { + node.tagType = 'closeSelf'; + } + + node.attr = attrs.reduce((pre, attr) => { + const { + name + } = attr; + let { + value + } = attr; + if (name === 'class') { + node.classStr = value; + } + // has multi attibutes + // make it array of attribute + if (name === 'style') { + 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; + }, {}); + + // 优化样式相关属性 + if (node.classStr) { + node.classStr += ` ${node.tag}`; + } else { + node.classStr = node.tag; + } + if (node.tagType === 'inline') { + node.classStr += ' inline'; + } + + // 对img添加额外数据 + if (node.tag === 'img') { + let imgUrl = node.attr.src; + imgUrl = wxDiscode.urlToHttpUrl(imgUrl, imageProp.domain); + Object.assign(node.attr, imageProp, { + src: imgUrl || '', + }); + if (imgUrl) { + results.imageUrls.push(imgUrl); + } + } + + // 处理a标签属性 + if (node.tag === 'a') { + node.attr.href = node.attr.href || ''; + } + + //处理table + if (node.tag === 'table' || node.tag === 'tr' || node.tag === 'td') { + node.styleStr = "" + if (node.attr.width) { + node.styleStr += "width:" + node.attr.width + 'px;' + if (node.attr.width > node.$screen.width) { + //等比缩放height + if (node.attr.height) { + node.attr.height = (node.$screen.width * node.attr.height) / node.attr.width + } + } + } + if (node.attr.height) { + node.styleStr += "height:" + node.attr.height + 'px;' + } + + } + //处理video + if (node.tag === 'video') { + node.styleStr = "" + if (node.attr.width) { + node.styleStr += "width:" + node.attr.width + 'px;' + if (node.attr.width > node.$screen.width) { + //等比缩放height + if (node.attr.height) { + node.attr.height = (node.$screen.width * node.attr.height) / node.attr.width + } + } + } + if (node.attr.height) { + node.styleStr += "height:" + node.attr.height + 'px;' + } + + } + + // 处理font标签样式属性 + if (node.tag === 'font') { + const fontSize = [ + 'x-small', + 'small', + 'medium', + 'large', + 'x-large', + 'xx-large', + '-webkit-xxx-large', + ]; + const styleAttrs = { + color: 'color', + face: 'font-family', + size: 'font-size', + }; + if (!node.styleStr) node.styleStr = ''; + Object.keys(styleAttrs).forEach((key) => { + if (node.attr[key]) { + const value = key === 'size' ? fontSize[node.attr[key] - 1] : node.attr[key]; + node.styleStr += `${styleAttrs[key]}: ${value};`; + } + }); + } + + // 临时记录source资源 + if (node.tag === 'source') { + results.source = node.attr.src; + } + //#ifndef MP-BAIDU + if (customHandler.start) { + customHandler.start(node, results); + } + //#endif + + if (unary) { + // if this tag doesn't have end tag + // like + // add to parents + const parent = bufArray[0] || results; + if (parent.nodes === undefined) { + parent.nodes = []; + } + parent.nodes.push(node); + } else { + bufArray.unshift(node); + } + }, + end(tag) { + // merge into parent tag + const 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; + } + //#ifndef MP-BAIDU + if (customHandler && customHandler.end) { + customHandler.end(node, results); + } + //#endif + + if (bufArray.length === 0) { + results.nodes.push(node); + } else { + const parent = bufArray[0]; + if (!parent.nodes) { + parent.nodes = []; + } + parent.nodes.push(node); + } + }, + chars(text) { + if (!text.trim()) return; + + const node = { + node: 'text', + text, + }; + //#ifndef MP-BAIDU + if (customHandler.chars) { + customHandler.chars(node, results); + } + //#endif + + if (bufArray.length === 0) { + results.nodes.push(node); + } else { + const parent = bufArray[0]; + if (parent.nodes === undefined) { + parent.nodes = []; + } + parent.nodes.push(node); + } + }, + }); + + return results; +} + +export default html2json; diff --git a/components/feng-parse/libs/htmlparser.js b/components/feng-parse/libs/htmlparser.js new file mode 100644 index 0000000..a02eaf6 --- /dev/null +++ b/components/feng-parse/libs/htmlparser.js @@ -0,0 +1,156 @@ +/** + * + * 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 + +const startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/; +const endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/; +const attr = /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; + +function makeMap(str) { + const obj = {}; + const items = str.split(','); + for (let i = 0; i < items.length; i += 1) obj[items[i]] = true; + return obj; +} + +// Empty Elements - HTML 5 +const empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'); + +// Block Elements - HTML 5 +const block = makeMap('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 +const inline = makeMap('a,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) +const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); + +// Attributes that have their values filled in disabled="disabled" +const fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); + +function HTMLParser(html, handler) { + let index; + let chars; + let match; + let last = html; + const stack = []; + + stack.last = () => stack[stack.length - 1]; + + function parseEndTag(tag, tagName) { + // If no tag name is provided, clean shop + let pos; + if (!tagName) { + pos = 0; + } else { + // Find the closest opened tag of the same type + tagName = tagName.toLowerCase(); + for (pos = stack.length - 1; pos >= 0; pos -= 1) { + if (stack[pos] === tagName) break; + } + } + if (pos >= 0) { + // Close all the open elements, up the stack + for (let i = stack.length - 1; i >= pos; i -= 1) { + if (handler.end) handler.end(stack[i]); + } + + // Remove the open elements from the stack + stack.length = pos; + } + } + + 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) { + const attrs = []; + + rest.replace(attr, function genAttr(matches, name) { + const value = arguments[2] || arguments[3] || arguments[4] || (fillAttrs[name] ? name : ''); + + attrs.push({ + name, + value, + escaped: value.replace(/(^|[^\\])"/g, '$1\\"'), // " + }); + }); + + if (handler.start) { + handler.start(tagName, attrs, unary); + } + } + } + + while (html) { + chars = true; + + if (html.indexOf(' '); +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 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(/ |$#8201;| /g, ''); +str = str.replace(/‌|‌|‌/g, ''); +str = str.replace(/‍|$#8205;|‍/g, ''); +str = str.replace(/‎|$#8206;|‎/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 strDiscode(str) { + str = strNumDiscode(str); + str = strGreeceDiscode(str); + str = strcharacterDiscode(str); + str = strOtherDiscode(str); + return str; +} + +function urlToHttpUrl(url, domain) { + if (/^\/\//.test(url)) { + return `https:${url}`; + } else if (/^\//.test(url)) { + return `https://${domain}${url}`; + } + return url; +} + +export default { + strDiscode, + urlToHttpUrl, +}; diff --git a/components/feng-parse/parse.css b/components/feng-parse/parse.css new file mode 100644 index 0000000..79d0693 --- /dev/null +++ b/components/feng-parse/parse.css @@ -0,0 +1,258 @@ +/** + * 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 + */ +/** + * 请在全局下引入该文件,@import '/static/wxParse.css'; + */ +.wxParse { + user-select:none; + width: 100%; + font-family: Helvetica, "PingFangSC", 'Microsoft Yahei', '微软雅黑', Arial, sans-serif; + color: #333; + line-height: 1.5; + font-size: 1em; + text-align:justify;/* //左右两端对齐 */ +} +.wxParse view ,.wxParse uni-view{ + word-break: break-word; +} +.wxParse .p { + padding-bottom: 0.5em; + clear: both; + /* letter-spacing: 0;//字间距 */ +} +.wxParse .inline { + display: inline; + margin: 0; + padding: 0; +} + +.wxParse .div { + margin: 0; + padding: 0; + display: block; +} + +.wxParse .h1{ + font-size: 2em; + line-height: 1.2em; + margin: 0.67em 0; +} +.wxParse .h2{ + font-size: 1.5em; + margin: 0.83em 0; +} +.wxParse .h3{ + font-size: 1.17em; + margin: 1em 0; +} +.wxParse .h4{ + margin: 1.33em 0; +} +.wxParse .h5{ + font-size: 0.83em; + margin: 1.67em 0; +} +.wxParse .h6{ + font-size: 0.83em; + margin: 1.67em 0; +} + +.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 .spaceshow{ + white-space: pre; +} +.wxParse .pre, +.wxParse .tt, +.wxParse .code, +.wxParse .kbd, +.wxParse .samp { + font-family: monospace; +} +.wxParse .pre { + overflow: auto; + background: #f5f5f5; + padding: 16upx; + white-space: pre; + margin: 1em 0upx; + font-size: 24upx; +} +.wxParse .code { + overflow: auto; + padding: 16upx; + white-space: pre; + margin: 1em 0upx; + background: #f5f5f5; + font-size: 24upx; +} + +.wxParse .big { + font-size: 1.17em; +} + +.wxParse .small, +.wxParse .sub, +.wxParse .sup { + font-size: 0.83em; +} + +.wxParse .sub { + vertical-align: sub; +} +.wxParse .sup { + vertical-align: super; +} + +.wxParse .s, +.wxParse .strike, +.wxParse .del { + text-decoration: line-through; +} + +.wxParse .strong, +.wxParse .text, +.wxParse .span, +.wxParse .s { + display: inline; +} + +.wxParse .a { + color: deepskyblue; +} + +.wxParse .video { + text-align: center; + margin: 22upx 0; +} + +.wxParse .video-video { + width: 100%; +} +.wxParse .uni-image{ + max-width: 100%; +} +.wxParse .img { + display: block; + max-width: 100%; + margin-bottom: 0em;/* //与p标签底部padding同时修改 */ + overflow: hidden; +} + +.wxParse .blockquote { + margin: 10upx 0; + padding: 22upx 0 22upx 22upx; + font-family: Courier, Calibri, "宋体"; + background: #f5f5f5; + border-left: 6upx solid #dbdbdb; +} +.wxParse .blockquote .p { + margin: 0; +} +.wxParse .ul, .wxParse .ol { + display: block; + margin: 1em 0; + padding-left: 2em; +} +.wxParse .ol { + list-style-type: disc; +} +.wxParse .ol { + list-style-type: decimal; +} +.wxParse .ol>weixin-parse-template,.wxParse .ul>weixin-parse-template { + display: list-item; + align-items: baseline; + text-align: match-parent; +} + +.wxParse .ol>.li,.wxParse .ul>.li { + display: list-item; + align-items: baseline; + text-align: match-parent; +} +.wxParse .ul .ul, .wxParse .ol .ul { + list-style-type: circle; +} +.wxParse .ol .ol .ul, .wxParse .ol .ul .ul, .wxParse .ul .ol .ul, .wxParse .ul .ul .ul { + list-style-type: square; +} + +.wxParse .u { + text-decoration: underline; +} +.wxParse .hide { + display: none; +} +.wxParse .del { + display: inline; +} +.wxParse .figure { + overflow: hidden; +} +.wxParse .tablebox{ + overflow: auto; + background-color: #f5f5f5; + background: #f5f5f5; + font-size: 13px; + padding: 8px; +} +.wxParse .table .table,.wxParse .table{ + border-collapse:collapse; + box-sizing: border-box; + /* 内边框 */ + /* width: 100%; */ + overflow: auto; + white-space: pre; +} +.wxParse .tbody{ + border-collapse:collapse; + box-sizing: border-box; + /* 内边框 */ + border: 1px solid #dadada; +} +.wxParse .table .thead, .wxParse .table .tfoot, .wxParse .table .th{ + border-collapse:collapse; + box-sizing: border-box; + background: #ececec; + font-weight: 40; +} +.wxParse .table .tr { + border-collapse:collapse; + box-sizing: border-box; + /* border: 2px solid #F0AD4E; */ + overflow:auto; +} +.wxParse .table .th, +.wxParse .table .td{ + border-collapse:collapse; + box-sizing: border-box; + border: 2upx solid #dadada; + overflow:auto; +} +.wxParse .audio, .wxParse .uni-audio-default{ + display: block; +} diff --git a/components/feng-parse/parse.vue b/components/feng-parse/parse.vue new file mode 100644 index 0000000..38adc4f --- /dev/null +++ b/components/feng-parse/parse.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/nxTemp/config/index.config.js b/nxTemp/config/index.config.js index 3e0f88d..a1ef494 100644 --- a/nxTemp/config/index.config.js +++ b/nxTemp/config/index.config.js @@ -4,9 +4,10 @@ const CONFIG = { loginTitleTxt: "development_wx", // 登录页标题 copyrightTxt: "XXXv1.0", // 版本信息 assetsPath: "http://cdn.com/img", // 静态资源路径 - baseUrl: "http://testmanager.ouxuanzhineng.cn", + // baseUrl: "http://testmanager.ouxuanzhineng.cn", //测试环境 // baseUrl: "https://testmatch.ouxuanzhineng.cn", - // baseUrl: "http://192.168.1.55:9090", + baseUrl: "https://match.ouxuanzhineng.cn", + // tokenKey: "wxacdbba29503f6351", // 登录标识 测试环境 tokenKey: "wxf368fa7316d6952f", // 登录标识 testOpenId: "", // 小程序测试openId forcedLogin: false, // touristMode游客模式下APP是否强制用户登录 场景:当用户进入登录页面后无法后退。 @@ -19,8 +20,10 @@ const CONFIG = { loginTitleTxt: "production_wx", // 登录页标题 copyrightTxt: "XXXv1.0", // 版本信息 assetsPath: "/static/img", // 静态资源路径 - baseUrl: "https://testmatch.ouxuanzhineng.cn", + // baseUrl: "https://testmatch.ouxuanzhineng.cn", // 测试环境 + baseUrl: "https://match.ouxuanzhineng.cn", tokenKey: "WECHAT_TRADE", // 登录标识 + // testOpenId: "wxacdbba29503f6351", // 小程序测试openId testOpenId: "wxf368fa7316d6952f", // 小程序测试openId forcedLogin: false, // touristMode游客模式下APP是否强制用户登录 场景:当用户进入登录页面后无法后退。 touristMode: true, // APP是否开启游客模式, 游客模式true开启:APP打开后可以进入首页和无权限的页面,游客模式false关闭:APP打开后首先需要登录才能进入, 此时forcedLogin配置项失效。 @@ -28,5 +31,5 @@ const CONFIG = { } } - +console.log(123,process.env.NODE_ENV); export default CONFIG[process.env.NODE_ENV]; diff --git a/nxTemp/utils/canvas_get_image_colors.js b/nxTemp/utils/canvas_get_image_colors.js new file mode 100644 index 0000000..3810715 --- /dev/null +++ b/nxTemp/utils/canvas_get_image_colors.js @@ -0,0 +1,294 @@ +export class getImgColor { //定义了一个名字为Person的类 + constructor(img) { //constructor是一个构造方法,用来接收参数 + // this代表的是实例对象 + // var that = this + let canvasId = "testcanvasId" + let imgPath = img || "/static/images/logo_main.png" + // let imgPath = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2F8c39725605bf4e80e9763c58dbfb02482f98d87711069-qXPaNI_fw658&refer=http%3A%2F%2Fhbimg.b0.upaiyun.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1650531435&t=6f1744c5f84585eaef5dd1be6f83ae24" + const ctx = uni.createCanvasContext(canvasId) + + ctx.drawImage(imgPath, 0, 0, 300, 300) + console.log(777, ctx); + ctx.draw(false, () => { + // uni.canvasGetImageData({ + // canvasId: canvasId, + // x: 150, + // y: 150, + // width: 50, + // height: 50, + // success: (res) => { + // console.log(res.data[0] +' ' + res.data[1] +' ' + res.data[2]) + // console.log("canvasGetImageData return:",res.data); + // }, + // fail: res => { + // console.log(res) + // }, + // }, that) + }) + this.canvas = ctx + this.canvas.width = 300 + this.canvas.height = 300 + this.cvs = ctx + + + // this.canvas = document.createElement("canvas") + // this.canvas.width = img.width + // this.canvas.height = img.height + // this.cvs = this.canvas.getContext("2d") + // this.cvs.drawImage(img, 0, 0) + // this.accuracy = 5 + // this.progress = '' + } + getColorXY(x, y) { + + /** + * @param x Number x坐标起点 + * @param y Number y坐标起点 + * @return color Object 包含颜色的rgba #16进制颜色 + */ + + let obj = this.cvs.getImageData(x, y, 1, 1) //{"data":{"0":247,"1":255,"2":254,"3":255}} + let arr = obj.data.toString().split(",") + + let first = parseInt(arr[0]).toString(16) + first = first.length === 2 ? first : first + first + + let second = parseInt(arr[1]).toString(16) + second = second.length === 2 ? second : second + second + + let third = parseInt(arr[2]).toString(16) + third = third.length === 2 ? third : third + third + + let last = parseInt(arr.pop()) / 255 + last = last.toFixed(0) + + let color = {} + color['rgba'] = 'rgba(' + arr.join(',') + ',' + last + ')' + color['#'] = '#' + first + second + third + return color + } + getColors() { + + /** + * 避免图片过大,阻塞卡死 + * 每加载一行像素,延迟20毫秒加载下一行 + * return Promise + * promise resolve 解析完成后,返回颜色的总计数组,降序排列 + * promise reject none + */ + + return (new Promise((resolve, reject) => { + + let arr = [] + let getY = (i) => { + for (let j = 0; j < this.canvas.height; j++) { + let obj = {} + obj = this.getColorXY(i, j) + obj.index = 1 + let is = true + + arr.forEach((item) => { + if (item['#'] === obj['#']) { + is = false + item.index += 1 + } + + let l = [] + + for (let i = 0; i < obj['#'].length; i++) { + + if (item['#'].indexOf(obj['#'][i]) > -1) { + l.push('1') + } + } + + let acc = (this.accuracy > 7) ? 7 : this.accuracy + acc = (this.accuracy < 1) ? 2 : this.accuracy + if (l.length > acc) { + is = false + item.index += 1 + } + }) + + if (is) { + arr.push(obj) + } + } + }; + + let getX = (i) => { + if (i < this.canvas.width) { + + getY(i) + this.progress = (i / this.canvas.width * 100).toFixed(2) + '%' + console.log(this.progress) + setTimeout(() => { + getX(++i) + }, 20) + + } else { + + this.progress = '100%' + console.log(this.progress) + + resolve(arr.sort(function(a, b) { + return a.index < b.index ? 1 : (a.index > b.index ? -1 : 0) + })) + } + }; + + getX(0) + + })) + } +} + +var getImgColor1 = function getImgColor(img) { + /** + * @ param 传入的图片 + * @ this.progress 解析图片的进度 实时 + * @ this.canvas canvas元素 + * @ this.cvs context对象 + * @ this.accuracy Number 解析图片颜色的精确度 1 - 7 数字选择 + * + * + * @ anther taoqun + */ + var that = this + let canvasId = "testcanvasId" + let imgPath = img || "/static/images/logo_main.png" + // let imgPath = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2F8c39725605bf4e80e9763c58dbfb02482f98d87711069-qXPaNI_fw658&refer=http%3A%2F%2Fhbimg.b0.upaiyun.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1650531435&t=6f1744c5f84585eaef5dd1be6f83ae24" + const ctx = uni.createCanvasContext(canvasId) + + ctx.drawImage(imgPath, 0, 0, 300, 300) + console.log(777, ctx); + ctx.draw(false, () => { + // uni.canvasGetImageData({ + // canvasId: canvasId, + // x: 150, + // y: 150, + // width: 50, + // height: 50, + // success: (res) => { + // console.log(res.data[0] +' ' + res.data[1] +' ' + res.data[2]) + // console.log("canvasGetImageData return:",res.data); + // }, + // fail: res => { + // console.log(res) + // }, + // }, that) + }) + + // this.canvas = document.createElement("canvas") + // this.canvas.width = img.width + // this.canvas.height = img.height + // this.cvs = this.canvas.getContext("2d") + // this.cvs.drawImage(img, 0, 0) + // this.accuracy = 5 + // this.progress = '' +} +getImgColor1.prototype.getColorXY = function(x, y) { + + /** + * @param x Number x坐标起点 + * @param y Number y坐标起点 + * @return color Object 包含颜色的rgba #16进制颜色 + */ + + let obj = this.cvs.getImageData(x, y, 1, 1) + let arr = obj.data.toString().split(",") + + let first = parseInt(arr[0]).toString(16) + first = first.length === 2 ? first : first + first + + let second = parseInt(arr[1]).toString(16) + second = second.length === 2 ? second : second + second + + let third = parseInt(arr[2]).toString(16) + third = third.length === 2 ? third : third + third + + let last = parseInt(arr.pop()) / 255 + last = last.toFixed(0) + + let color = {} + color['rgba'] = 'rgba(' + arr.join(',') + ',' + last + ')' + color['#'] = '#' + first + second + third + return color +} +getImgColor1.prototype.getColors = function() { + + /** + * 避免图片过大,阻塞卡死 + * 每加载一行像素,延迟20毫秒加载下一行 + * return Promise + * promise resolve 解析完成后,返回颜色的总计数组,降序排列 + * promise reject none + */ + + return (new Promise((resolve, reject) => { + + let arr = [] + let getY = (i) => { + for (let j = 0; j < this.canvas.height; j++) { + let obj = {} + obj = this.getColorXY(i, j) + obj.index = 1 + let is = true + + arr.forEach((item) => { + if (item['#'] === obj['#']) { + is = false + item.index += 1 + } + + let l = [] + + for (let i = 0; i < obj['#'].length; i++) { + + if (item['#'].indexOf(obj['#'][i]) > -1) { + l.push('1') + } + } + + let acc = (this.accuracy > 7) ? 7 : this.accuracy + acc = (this.accuracy < 1) ? 2 : this.accuracy + if (l.length > acc) { + is = false + item.index += 1 + } + }) + + if (is) { + arr.push(obj) + } + } + }; + + let getX = (i) => { + if (i < this.canvas.width) { + + getY(i) + this.progress = (i / this.canvas.width * 100).toFixed(2) + '%' + console.log(this.progress) + setTimeout(() => { + getX(++i) + }, 20) + + } else { + + this.progress = '100%' + console.log(this.progress) + + resolve(arr.sort(function(a, b) { + return a.index < b.index ? 1 : (a.index > b.index ? -1 : 0) + })) + } + }; + + getX(0) + + })) +} +export default { + getImgColor +} diff --git a/pages.json b/pages.json index ed5cd3e..5b0b265 100644 --- a/pages.json +++ b/pages.json @@ -8,6 +8,7 @@ } }, "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + { "path": "pages/index/index", "aliasPath": "/", diff --git a/pages/event/event_grade.vue b/pages/event/event_grade.vue index f7e4117..8b51569 100644 --- a/pages/event/event_grade.vue +++ b/pages/event/event_grade.vue @@ -188,8 +188,8 @@ updatePage() { if(this.listLoadFinished)return console.log("已加载完毕") getPostAPI(this)(this.postData).then(res => { - this.pageList.push(...res.list) this.match_name = res.match_name + this.pageList.push(...res.list) checkListLoadFinished(res,this); }).catch(e=>{ this.$tools.showNone(e.errMsg) @@ -523,7 +523,8 @@ padding-right: 20rpx; } input { - width: 184rpx; + // width: 184rpx; + width: 300rpx; } } } diff --git a/pages/event/event_list.vue b/pages/event/event_list.vue index 9266841..2e1544a 100644 --- a/pages/event/event_list.vue +++ b/pages/event/event_list.vue @@ -27,7 +27,8 @@ - {{i.match_addr}} + + {{i.match_addr}} diff --git a/pages/index/index.vue b/pages/index/index.vue index 30a5896..aaea617 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -28,7 +28,9 @@ 退出登录 - + + + -