From f63f640a7b55c95b20dd6a745a8506293e373494 Mon Sep 17 00:00:00 2001 From: jia <1451658316@qq.com> Date: Sat, 28 Oct 2023 16:31:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hbuilderx/launch.json | 20 + ai1.png | Bin 33356 -> 0 bytes api/api.js | 168 ++ api/public.js | 21 + api/user.js | 106 + components/emptyPage.vue | 45 + components/gb-popup/gb-popup.vue | 168 ++ components/jyf-parser/jyf-parser.vue | 815 +++++++ components/jyf-parser/libs/CssHandler.js | 111 + components/jyf-parser/libs/MpHtmlParser.js | 586 +++++ components/jyf-parser/libs/config.js | 89 + components/jyf-parser/libs/handler.sjs | 44 + components/jyf-parser/libs/handler.wxs | 53 + components/jyf-parser/libs/trees.vue | 485 +++++ components/mh-msgList/mh-msgList.vue | 183 ++ components/sd-live-page/histroy.nvue | 1915 ++++++++++++++++ components/sd-live-page/livepage.nvue | 1923 +++++++++++++++++ components/sd-live-page/livepage1.nvue | 1637 ++++++++++++++ components/shoppinglist/shoppinglist.vue | 488 +++++ components/subtractive/subtractive.vue | 217 ++ components/uni-popup/live-uni-popup.vue | 241 +++ components/uni-popup/uni-popup.vue | 241 +++ components/verify/utils/ase.js | 12 + components/verify/verify.vue | 515 +++++ components/verify/verifyPoint/verifyPoint.vue | 544 +++++ .../verify/verifySlider/verifySlider.vue | 648 ++++++ config/app.js | 73 + config/cache.js | 43 + mixins/SendVerifyCode.js | 36 + mixins/history.js | 25 + pages/live/anchor.nvue | 84 + pages/live/histroyroom.nvue | 104 + pages/live/spectator.nvue | 358 +++ pages/login/login.vue | 1123 ++++++++++ pages/room/create_room.vue | 534 +++++ pages/room/room_list.vue | 590 +++++ plugin/dayjs/dayjs.min.js | 1 + 37 files changed, 14246 insertions(+) create mode 100644 .hbuilderx/launch.json delete mode 100644 ai1.png create mode 100644 api/api.js create mode 100644 api/public.js create mode 100644 api/user.js create mode 100644 components/emptyPage.vue create mode 100644 components/gb-popup/gb-popup.vue create mode 100644 components/jyf-parser/jyf-parser.vue create mode 100644 components/jyf-parser/libs/CssHandler.js create mode 100644 components/jyf-parser/libs/MpHtmlParser.js create mode 100644 components/jyf-parser/libs/config.js create mode 100644 components/jyf-parser/libs/handler.sjs create mode 100644 components/jyf-parser/libs/handler.wxs create mode 100644 components/jyf-parser/libs/trees.vue create mode 100644 components/mh-msgList/mh-msgList.vue create mode 100644 components/sd-live-page/histroy.nvue create mode 100644 components/sd-live-page/livepage.nvue create mode 100644 components/sd-live-page/livepage1.nvue create mode 100644 components/shoppinglist/shoppinglist.vue create mode 100644 components/subtractive/subtractive.vue create mode 100644 components/uni-popup/live-uni-popup.vue create mode 100644 components/uni-popup/uni-popup.vue create mode 100644 components/verify/utils/ase.js create mode 100644 components/verify/verify.vue create mode 100644 components/verify/verifyPoint/verifyPoint.vue create mode 100644 components/verify/verifySlider/verifySlider.vue create mode 100644 config/app.js create mode 100644 config/cache.js create mode 100644 mixins/SendVerifyCode.js create mode 100644 mixins/history.js create mode 100644 pages/live/anchor.nvue create mode 100644 pages/live/histroyroom.nvue create mode 100644 pages/live/spectator.nvue create mode 100644 pages/login/login.vue create mode 100644 pages/room/create_room.vue create mode 100644 pages/room/room_list.vue create mode 100644 plugin/dayjs/dayjs.min.js diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json new file mode 100644 index 0000000..4ccd172 --- /dev/null +++ b/.hbuilderx/launch.json @@ -0,0 +1,20 @@ +{ + // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/ + // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数 + "version" : "0.0", + "configurations" : [ + { + "app-plus" : { + "launchtype" : "local" + }, + "default" : { + "launchtype" : "local" + }, + "type" : "uniCloud" + }, + { + "playground" : "custom", + "type" : "uni-app:app-android" + } + ] +} diff --git a/ai1.png b/ai1.png deleted file mode 100644 index 3bcf4bdd064dd1b457687d9b9e9e3efe1bfd36d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33356 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 k$#DOd4E +// +---------------------------------------------------------------------- +import request from "@/utils/requesta.js"; + +export function getVersion() { + return request.get("version",{},{noAuth: true}); +} +export function commonAuth(data) { + return request.post( + "auth", data, { + noAuth: true + } + ); +} diff --git a/api/user.js b/api/user.js new file mode 100644 index 0000000..56e0b83 --- /dev/null +++ b/api/user.js @@ -0,0 +1,106 @@ +// +---------------------------------------------------------------------- +// | CRMEB [ CRMEB赋能开发者,助力企业发展 ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 +// +---------------------------------------------------------------------- +// | Author: CRMEB Team +// +---------------------------------------------------------------------- +import request from "@/utils/requesta.js"; + + +export function getAdminApplyListAPI(merId) { + return request.get(`admin/${merId}/lis_apply`); +} +/** + * 获取用户信息 + * + */ +export function getUserInfo() { + return request.get('user'); +} +/** + * 头像 + * + */ +export function editAvatar(data) { + return request.post('user/change/info', data); +} + +// 修改昵称 +export function updateInfo(data) { + return request.post('user/change/avatar', data); +} +/** + * h5用户登录 + * @param data object 用户账号密码 + */ +export function loginH5(data) { + return request.post("auth/login", data, { + noAuth: true + }); +} +/** + * h5用户手机号登录 + * @param data object 用户手机号 也只能 + */ +export function loginMobile(data) { + return request.post("auth/smslogin", data, { + noAuth: true + }); +} +/** + * h5用户手机号登录 + * @param data object 用户手机号 也只能 + */ +export function loginMpPhone(data) { + return request.post("auth/mp_phone", data, { + noAuth: true + }); +} +/** + * 验证码key + */ +export function getCodeApi() { + return request.get("verify_code", {}, { + noAuth: true + }); +} + +/** + * h5用户发送验证码 + * @param data object 用户手机号 + */ +export function registerVerify(data) { + return request.post("auth/verify", data, { + noAuth: true + }); +} +/** + * h5用户手机号注册 + * @param data object 用户手机号 验证码 密码 + */ +export function register(data) { + return request.post("auth/register", data, { + noAuth: true + }); +} + +/** + * 用户手机号修改密码 + * @param data object 用户手机号 验证码 密码 + */ +export function registerReset(data) { + return request.post("/register/reset", data, { + noAuth: true + }); +} +/** + * 用户手机号忘记密码 + */ +export function registerForget(data) { + return request.post("user/change_pwd", data, { + noAuth: true + }); +} diff --git a/components/emptyPage.vue b/components/emptyPage.vue new file mode 100644 index 0000000..0f2ba27 --- /dev/null +++ b/components/emptyPage.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/components/gb-popup/gb-popup.vue b/components/gb-popup/gb-popup.vue new file mode 100644 index 0000000..12dcd71 --- /dev/null +++ b/components/gb-popup/gb-popup.vue @@ -0,0 +1,168 @@ + + + + + \ No newline at end of file diff --git a/components/jyf-parser/jyf-parser.vue b/components/jyf-parser/jyf-parser.vue new file mode 100644 index 0000000..6294c26 --- /dev/null +++ b/components/jyf-parser/jyf-parser.vue @@ -0,0 +1,815 @@ + + + + + + diff --git a/components/jyf-parser/libs/CssHandler.js b/components/jyf-parser/libs/CssHandler.js new file mode 100644 index 0000000..f286db3 --- /dev/null +++ b/components/jyf-parser/libs/CssHandler.js @@ -0,0 +1,111 @@ +// +---------------------------------------------------------------------- +// | CRMEB [ CRMEB赋能开发者,助力企业发展 ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 +// +---------------------------------------------------------------------- +// | Author: CRMEB Team +// +---------------------------------------------------------------------- +/* + 解析和匹配 Css 的选择器 + github:https://github.com/jin-yufeng/Parser + docs:https://jin-yufeng.github.io/Parser + author:JinYufeng + update:2020/03/15 +*/ +var cfg = require('./config.js'); +class CssHandler { + constructor(tagStyle) { + var styles = Object.assign({}, cfg.userAgentStyles); + for (var item in tagStyle) + styles[item] = (styles[item] ? styles[item] + ';' : '') + tagStyle[item]; + this.styles = styles; + } + getStyle = data => this.styles = new CssParser(data, this.styles).parse(); + match(name, attrs) { + var tmp, matched = (tmp = this.styles[name]) ? tmp + ';' : ''; + if (attrs.class) { + var items = attrs.class.split(' '); + for (var i = 0, item; item = items[i]; i++) + if (tmp = this.styles['.' + item]) + matched += tmp + ';'; + } + if (tmp = this.styles['#' + attrs.id]) + matched += tmp + ';'; + return matched; + } +} +module.exports = CssHandler; +class CssParser { + constructor(data, init) { + this.data = data; + this.floor = 0; + this.i = 0; + this.list = []; + this.res = init; + this.state = this.Space; + } + parse() { + for (var c; c = this.data[this.i]; this.i++) + this.state(c); + return this.res; + } + section = () => this.data.substring(this.start, this.i); + isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); + // 状态机 + Space(c) { + if (c == '.' || c == '#' || this.isLetter(c)) { + this.start = this.i; + this.state = this.Name; + } else if (c == '/' && this.data[this.i + 1] == '*') + this.Comment(); + else if (!cfg.blankChar[c] && c != ';') + this.state = this.Ignore; + } + Comment() { + this.i = this.data.indexOf('*/', this.i) + 1; + if (!this.i) this.i = this.data.length; + this.state = this.Space; + } + Ignore(c) { + if (c == '{') this.floor++; + else if (c == '}' && !--this.floor) this.state = this.Space; + } + Name(c) { + if (cfg.blankChar[c]) { + this.list.push(this.section()); + this.state = this.NameSpace; + } else if (c == '{') { + this.list.push(this.section()); + this.Content(); + } else if (c == ',') { + this.list.push(this.section()); + this.Comma(); + } else if (!this.isLetter(c) && (c < '0' || c > '9') && c != '-' && c != '_') + this.state = this.Ignore; + } + NameSpace(c) { + if (c == '{') this.Content(); + else if (c == ',') this.Comma(); + else if (!cfg.blankChar[c]) this.state = this.Ignore; + } + Comma() { + while (cfg.blankChar[this.data[++this.i]]); + if (this.data[this.i] == '{') this.Content(); + else { + this.start = this.i--; + this.state = this.Name; + } + } + Content() { + this.start = ++this.i; + if ((this.i = this.data.indexOf('}', this.i)) == -1) this.i = this.data.length; + var content = this.section(); + for (var i = 0, item; item = this.list[i++];) + if (this.res[item]) this.res[item] += ';' + content; + else this.res[item] = content; + this.list = []; + this.state = this.Space; + } +} diff --git a/components/jyf-parser/libs/MpHtmlParser.js b/components/jyf-parser/libs/MpHtmlParser.js new file mode 100644 index 0000000..30c59e9 --- /dev/null +++ b/components/jyf-parser/libs/MpHtmlParser.js @@ -0,0 +1,586 @@ +// +---------------------------------------------------------------------- +// | CRMEB [ CRMEB赋能开发者,助力企业发展 ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 +// +---------------------------------------------------------------------- +// | Author: CRMEB Team +// +---------------------------------------------------------------------- +/* + 将 html 解析为适用于小程序 rich-text 的 DOM 结构 + github:https://github.com/jin-yufeng/Parser + docs:https://jin-yufeng.github.io/Parser + author:JinYufeng + update:2020/04/13 +*/ +var cfg = require('./config.js'), + blankChar = cfg.blankChar, + CssHandler = require('./CssHandler.js'), + { + screenWidth, + system + } = wx.getSystemInfoSync(); +// #ifdef MP-BAIDU || MP-ALIPAY || MP-TOUTIAO +var entities = { + lt: '<', + gt: '>', + amp: '&', + quot: '"', + apos: "'", + nbsp: '\xA0', + ensp: '\u2002', + emsp: '\u2003', + ndash: '–', + mdash: '—', + middot: '·', + lsquo: '‘', + rsquo: '’', + ldquo: '“', + rdquo: '”', + bull: '•', + hellip: '…', + permil: '‰', + copy: '©', + reg: '®', + trade: '™', + times: '×', + divide: '÷', + cent: '¢', + pound: '£', + yen: '¥', + euro: '€', + sect: '§' +}; +// #endif +var emoji; // emoji 补丁包 https://jin-yufeng.github.io/Parser/#/instructions?id=emoji +class MpHtmlParser { + constructor(data, options = {}) { + this.attrs = {}; + this.compress = options.compress; + this.CssHandler = new CssHandler(options.tagStyle, screenWidth); + this.data = data; + this.domain = options.domain; + this.DOM = []; + this.i = this.start = this.audioNum = this.imgNum = this.videoNum = 0; + this.protocol = this.domain && this.domain.includes('://') ? this.domain.split('://')[0] : ''; + this.state = this.Text; + this.STACK = []; + this.useAnchor = options.useAnchor; + this.xml = options.xml; + } + parse() { + if (emoji) this.data = emoji.parseEmoji(this.data); + for (var c; c = this.data[this.i]; this.i++) + this.state(c); + if (this.state == this.Text) this.setText(); + while (this.STACK.length) this.popNode(this.STACK.pop()); + // #ifdef MP-BAIDU || MP-TOUTIAO + // 将顶层标签的一些样式提取出来给 rich-text + (function f(ns) { + for (var i = ns.length, n; n = ns[--i];) { + if (n.type == 'text') continue; + if (!n.c) { + var style = n.attrs.style; + if (style) { + var j, k, res; + if ((j = style.indexOf('display')) != -1) + res = style.substring(j, (k = style.indexOf(';', j)) == -1 ? style.length : k); + if ((j = style.indexOf('float')) != -1) + res += ';' + style.substring(j, (k = style.indexOf(';', j)) == -1 ? style.length : k); + n.attrs.contain = res; + } + } else f(n.children); + } + })(this.DOM); + // #endif + if (this.DOM.length) { + this.DOM[0].PoweredBy = 'Parser'; + if (this.title) this.DOM[0].title = this.title; + } + return this.DOM; + } + // 设置属性 + setAttr() { + var name = this.getName(this.attrName); + if (cfg.trustAttrs[name]) { + if (!this.attrVal) { + if (cfg.boolAttrs[name]) this.attrs[name] = 'T'; + } else if (name == 'src') this.attrs[name] = this.getUrl(this.attrVal.replace(/&/g, '&')); + else this.attrs[name] = this.attrVal; + } + this.attrVal = ''; + while (blankChar[this.data[this.i]]) this.i++; + if (this.isClose()) this.setNode(); + else { + this.start = this.i; + this.state = this.AttrName; + } + } + // 设置文本节点 + setText() { + var back, text = this.section(); + if (!text) return; + text = (cfg.onText && cfg.onText(text, () => back = true)) || text; + if (back) { + this.data = this.data.substr(0, this.start) + text + this.data.substr(this.i); + let j = this.start + text.length; + for (this.i = this.start; this.i < j; this.i++) this.state(this.data[this.i]); + return; + } + if (!this.pre) { + // 合并空白符 + var tmp = []; + for (let i = text.length, c; c = text[--i];) + if (!blankChar[c] || (!blankChar[tmp[0]] && (c = ' '))) tmp.unshift(c); + text = tmp.join(''); + if (text == ' ') return; + } + // 处理实体 + var siblings = this.siblings(), + i = -1, + j, en; + while (1) { + if ((i = text.indexOf('&', i + 1)) == -1) break; + if ((j = text.indexOf(';', i + 2)) == -1) break; + if (text[i + 1] == '#') { + en = parseInt((text[i + 2] == 'x' ? '0' : '') + text.substring(i + 2, j)); + if (!isNaN(en)) text = text.substr(0, i) + String.fromCharCode(en) + text.substring(j + 1); + } else { + en = text.substring(i + 1, j); + // #ifdef MP-WEIXIN || MP-QQ || APP-PLUS + if (en == 'nbsp') text = text.substr(0, i) + '\xA0' + text.substr(j + 1); // 解决   失效 + else if (en != 'lt' && en != 'gt' && en != 'amp' && en != 'ensp' && en != 'emsp' && en != 'quot' && en != 'apos') { + i && siblings.push({ + type: 'text', + text: text.substr(0, i) + }) + siblings.push({ + type: 'text', + text: `&${en};`, + en: 1 + }) + text = text.substr(j + 1); + i = -1; + } + // #endif + // #ifdef MP-BAIDU || MP-ALIPAY || MP-TOUTIAO + if (entities[en]) text = text.substr(0, i) + entities[en] + text.substr(j + 1); + // #endif + } + } + text && siblings.push({ + type: 'text', + text + }) + } + // 设置元素节点 + setNode() { + var node = { + name: this.tagName.toLowerCase(), + attrs: this.attrs + }, + close = cfg.selfClosingTags[node.name] || (this.xml && this.data[this.i] == '/'); + this.attrs = {}; + if (!cfg.ignoreTags[node.name]) { + this.matchAttr(node); + if (!close) { + node.children = []; + if (node.name == 'pre' && cfg.highlight) { + this.remove(node); + this.pre = node.pre = true; + } + this.siblings().push(node); + this.STACK.push(node); + } else if (!cfg.filter || cfg.filter(node, this) != false) + this.siblings().push(node); + } else { + if (!close) this.remove(node); + else if (node.name == 'source') { + var parent = this.STACK[this.STACK.length - 1], + attrs = node.attrs; + if (parent && attrs.src) + if (parent.name == 'video' || parent.name == 'audio') + parent.attrs.source.push(attrs.src); + else { + var i, media = attrs.media; + if (parent.name == 'picture' && !parent.attrs.src && !(attrs.src.indexOf('.webp') && system.includes('iOS')) && + (!media || (media.includes('px') && + (((i = media.indexOf('min-width')) != -1 && (i = media.indexOf(':', i + 8)) != -1 && screenWidth > parseInt( + media.substr(i + 1))) || + ((i = media.indexOf('max-width')) != -1 && (i = media.indexOf(':', i + 8)) != -1 && screenWidth < parseInt( + media.substr(i + 1))))))) + parent.attrs.src = attrs.src; + } + } else if (node.name == 'base' && !this.domain) this.domain = node.attrs.href; + } + if (this.data[this.i] == '/') this.i++; + this.start = this.i + 1; + this.state = this.Text; + } + // 移除标签 + remove(node) { + var name = node.name, + j = this.i; + while (1) { + if ((this.i = this.data.indexOf('', this.i)) == -1) this.i = this.data.length; + // 处理 svg + if (name == 'svg') { + var src = this.data.substring(j, this.i + 1); + if (!node.attrs.xmlns) src = ' xmlns="http://www.w3.org/2000/svg"' + src; + var i = j; + while (this.data[j] != '<') j--; + src = this.data.substring(j, i) + src; + var parent = this.STACK[this.STACK.length - 1]; + if (node.attrs.width == '100%' && parent && (parent.attrs.style || '').includes('inline')) + parent.attrs.style = 'width:300px;max-width:100%;' + parent.attrs.style; + this.siblings().push({ + name: 'img', + attrs: { + src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'), + ignore: 'T' + } + }) + } + return; + } + } + } + // 处理属性 + matchAttr(node) { + var attrs = node.attrs, + style = this.CssHandler.match(node.name, attrs, node) + (attrs.style || ''), + styleObj = {}; + if (attrs.id) { + if (this.compress & 1) attrs.id = void 0; + else if (this.useAnchor) this.bubble(); + } + if ((this.compress & 2) && attrs.class) attrs.class = void 0; + switch (node.name) { + case 'img': + if (attrs['data-src']) { + attrs.src = attrs.src || attrs['data-src']; + attrs['data-src'] = void 0; + } + if (attrs.src && !attrs.ignore) { + if (this.bubble()) attrs.i = (this.imgNum++).toString(); + else attrs.ignore = 'T'; + } + break; + case 'a': + case 'ad': + // #ifdef APP-PLUS + case 'iframe': + case 'embed': + // #endif + this.bubble(); + break; + case 'font': + if (attrs.color) { + styleObj['color'] = attrs.color; + attrs.color = void 0; + } + if (attrs.face) { + styleObj['font-family'] = attrs.face; + attrs.face = void 0; + } + if (attrs.size) { + var size = parseInt(attrs.size); + if (size < 1) size = 1; + else if (size > 7) size = 7; + var map = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large']; + styleObj['font-size'] = map[size - 1]; + attrs.size = void 0; + } + break; + case 'video': + case 'audio': + if (!attrs.id) attrs.id = node.name + (++this[`${node.name}Num`]); + else this[`${node.name}Num`]++; + if (node.name == 'video') { + if (attrs.width) { + style = `width:${parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')};${style}`; + attrs.width = void 0; + } + if (attrs.height) { + style = `height:${parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')};${style}`; + attrs.height = void 0; + } + if (this.videoNum > 3) node.lazyLoad = true; + } + attrs.source = []; + if (attrs.src) attrs.source.push(attrs.src); + if (!attrs.controls && !attrs.autoplay) + console.warn(`存在没有 controls 属性的 ${node.name} 标签,可能导致无法播放`, node); + this.bubble(); + break; + case 'td': + case 'th': + if (attrs.colspan || attrs.rowspan) + for (var k = this.STACK.length, item; item = this.STACK[--k];) + if (item.name == 'table') { + item.c = void 0; + break; + } + } + if (attrs.align) { + styleObj['text-align'] = attrs.align; + attrs.align = void 0; + } + // 压缩 style + var styles = style.replace(/"/g, '"').replace(/&/g, '&').split(';'); + style = ''; + for (var i = 0, len = styles.length; i < len; i++) { + var info = styles[i].split(':'); + if (info.length < 2) continue; + let key = info[0].trim().toLowerCase(), + value = info.slice(1).join(':').trim(); + if (value.includes('-webkit') || value.includes('-moz') || value.includes('-ms') || value.includes('-o') || value + .includes( + 'safe')) + style += `;${key}:${value}`; + else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) + styleObj[key] = value; + } + if (node.name == 'img' && parseInt(styleObj.width || attrs.width) > screenWidth) + styleObj.height = 'auto'; + for (var key in styleObj) { + var value = styleObj[key]; + if (key.includes('flex') || key == 'order' || key == 'self-align') node.c = 1; + // 填充链接 + if (value.includes('url')) { + var j = value.indexOf('('); + if (j++ != -1) { + while (value[j] == '"' || value[j] == "'" || blankChar[value[j]]) j++; + value = value.substr(0, j) + this.getUrl(value.substr(j)); + } + } + // 转换 rpx + else if (value.includes('rpx')) + value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * screenWidth / 750 + 'px'); + else if (key == 'white-space' && value.includes('pre')) + this.pre = node.pre = true; + style += `;${key}:${value}`; + } + style = style.substr(1); + if (style) attrs.style = style; + } + // 节点出栈处理 + popNode(node) { + // 空白符处理 + if (node.pre) { + node.pre = this.pre = void 0; + for (let i = this.STACK.length; i--;) + if (this.STACK[i].pre) + this.pre = true; + } + if (node.name == 'head' || (cfg.filter && cfg.filter(node, this) == false)) + return this.siblings().pop(); + var attrs = node.attrs; + // 替换一些标签名 + if (node.name == 'picture') { + node.name = 'img'; + if (!attrs.src && (node.children[0] || '').name == 'img') + attrs.src = node.children[0].attrs.src; + if (attrs.src && !attrs.ignore) + attrs.i = (this.imgNum++).toString(); + return node.children = void 0; + } + if (cfg.blockTags[node.name]) node.name = 'div'; + else if (!cfg.trustTags[node.name]) node.name = 'span'; + // 处理列表 + if (node.c) { + if (node.name == 'ul') { + var floor = 1; + for (let i = this.STACK.length; i--;) + if (this.STACK[i].name == 'ul') floor++; + if (floor != 1) + for (let i = node.children.length; i--;) + node.children[i].floor = floor; + } else if (node.name == 'ol') { + for (let i = 0, num = 1, child; child = node.children[i++];) + if (child.name == 'li') { + child.type = 'ol'; + child.num = ((num, type) => { + if (type == 'a') return String.fromCharCode(97 + (num - 1) % 26); + if (type == 'A') return String.fromCharCode(65 + (num - 1) % 26); + if (type == 'i' || type == 'I') { + num = (num - 1) % 99 + 1; + var one = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'], + ten = ['X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'], + res = (ten[Math.floor(num / 10) - 1] || '') + (one[num % 10 - 1] || ''); + if (type == 'i') return res.toLowerCase(); + return res; + } + return num; + })(num++, attrs.type) + '.'; + } + } + } + // 处理表格的边框 + if (node.name == 'table') { + var padding = attrs.cellpadding, + spacing = attrs.cellspacing, + border = attrs.border; + if (node.c) { + this.bubble(); + if (!padding) padding = 2; + if (!spacing) spacing = 2; + } + if (border) attrs.style = `border:${border}px solid gray;${attrs.style || ''}`; + if (spacing) attrs.style = `border-spacing:${spacing}px;${attrs.style || ''}`; + if (border || padding) + (function f(ns) { + for (var i = 0, n; n = ns[i]; i++) { + if (n.name == 'th' || n.name == 'td') { + if (border) n.attrs.style = `border:${border}px solid gray;${n.attrs.style}`; + if (padding) n.attrs.style = `padding:${padding}px;${n.attrs.style}`; + } else f(n.children || []); + } + })(node.children) + } + this.CssHandler.pop && this.CssHandler.pop(node); + // 自动压缩 + if (node.name == 'div' && !Object.keys(attrs).length) { + var siblings = this.siblings(); + if (node.children.length == 1 && node.children[0].name == 'div') + siblings[siblings.length - 1] = node.children[0]; + } + } + // 工具函数 + bubble() { + for (var i = this.STACK.length, item; item = this.STACK[--i];) { + if (cfg.richOnlyTags[item.name]) { + if (item.name == 'table' && !Object.hasOwnProperty.call(item, 'c')) item.c = 1; + return false; + } + item.c = 1; + } + return true; + } + getName = val => this.xml ? val : val.toLowerCase(); + getUrl(url) { + if (url[0] == '/') { + if (url[1] == '/') url = this.protocol + ':' + url; + else if (this.domain) url = this.domain + url; + } else if (this.domain && url.indexOf('data:') != 0 && !url.includes('://')) + url = this.domain + '/' + url; + return url; + } + isClose = () => this.data[this.i] == '>' || (this.data[this.i] == '/' && this.data[this.i + 1] == '>'); + section = () => this.data.substring(this.start, this.i); + siblings = () => this.STACK.length ? this.STACK[this.STACK.length - 1].children : this.DOM; + // 状态机 + Text(c) { + if (c == '<') { + var next = this.data[this.i + 1], + isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); + if (isLetter(next)) { + this.setText(); + this.start = this.i + 1; + this.state = this.TagName; + } else if (next == '/') { + this.setText(); + if (isLetter(this.data[++this.i + 1])) { + this.start = this.i + 1; + this.state = this.EndTag; + } else + this.Comment(); + } else if (next == '!') { + this.setText(); + this.Comment(); + } + } + } + Comment() { + var key; + if (this.data.substring(this.i + 2, this.i + 4) == '--') key = '-->'; + else if (this.data.substring(this.i + 2, this.i + 9) == '[CDATA[') key = ']]>'; + else key = '>'; + if ((this.i = this.data.indexOf(key, this.i + 2)) == -1) this.i = this.data.length; + else this.i += key.length - 1; + this.start = this.i + 1; + this.state = this.Text; + } + TagName(c) { + if (blankChar[c]) { + this.tagName = this.section(); + while (blankChar[this.data[this.i]]) this.i++; + if (this.isClose()) this.setNode(); + else { + this.start = this.i; + this.state = this.AttrName; + } + } else if (this.isClose()) { + this.tagName = this.section(); + this.setNode(); + } + } + AttrName(c) { + var blank = blankChar[c]; + if (blank) { + this.attrName = this.section(); + c = this.data[this.i]; + } + if (c == '=') { + if (!blank) this.attrName = this.section(); + while (blankChar[this.data[++this.i]]); + this.start = this.i--; + this.state = this.AttrValue; + } else if (blank) this.setAttr(); + else if (this.isClose()) { + this.attrName = this.section(); + this.setAttr(); + } + } + AttrValue(c) { + if (c == '"' || c == "'") { + this.start++; + if ((this.i = this.data.indexOf(c, this.i + 1)) == -1) return this.i = this.data.length; + this.attrVal = this.section(); + this.i++; + } else { + for (; !blankChar[this.data[this.i]] && !this.isClose(); this.i++); + this.attrVal = this.section(); + } + this.setAttr(); + } + EndTag(c) { + if (blankChar[c] || c == '>' || c == '/') { + var name = this.getName(this.section()); + for (var i = this.STACK.length; i--;) + if (this.STACK[i].name == name) break; + if (i != -1) { + var node; + while ((node = this.STACK.pop()).name != name); + this.popNode(node); + } else if (name == 'p' || name == 'br') + this.siblings().push({ + name, + attrs: {} + }); + this.i = this.data.indexOf('>', this.i); + this.start = this.i + 1; + if (this.i == -1) this.i = this.data.length; + else this.state = this.Text; + } + } +} +module.exports = MpHtmlParser; diff --git a/components/jyf-parser/libs/config.js b/components/jyf-parser/libs/config.js new file mode 100644 index 0000000..c7985ad --- /dev/null +++ b/components/jyf-parser/libs/config.js @@ -0,0 +1,89 @@ +// +---------------------------------------------------------------------- +// | CRMEB [ CRMEB赋能开发者,助力企业发展 ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 +// +---------------------------------------------------------------------- +// | Author: CRMEB Team +// +---------------------------------------------------------------------- +/* 配置文件 */ +// #ifdef MP-WEIXIN +const canIUse = wx.canIUse('editor'); // 高基础库标识,用于兼容 +// #endif +module.exports = { + // 过滤器函数 + filter: null, + // 代码高亮函数 + highlight: null, + // 文本处理函数 + onText: null, + blankChar: makeMap(' ,\xA0,\t,\r,\n,\f'), + // 块级标签,将被转为 div + blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,section' + ( + // #ifdef MP-WEIXIN + canIUse ? '' : + // #endif + ',pre')), + // 将被移除的标签 + ignoreTags: makeMap( + 'area,base,basefont,canvas,command,frame,input,isindex,keygen,link,map,meta,param,script,source,style,svg,textarea,title,track,use,wbr' + // #ifdef MP-WEIXIN + + (canIUse ? ',rp' : '') + // #endif + // #ifndef APP-PLUS + + ',embed,iframe' + // #endif + ), + // 只能被 rich-text 显示的标签 + richOnlyTags: makeMap('a,colgroup,fieldset,legend,picture,table' + // #ifdef MP-WEIXIN + + (canIUse ? ',bdi,bdo,caption,rt,ruby' : '') + // #endif + ), + // 自闭合的标签 + selfClosingTags: makeMap( + 'area,base,basefont,br,col,circle,ellipse,embed,frame,hr,img,input,isindex,keygen,line,link,meta,param,path,polygon,rect,source,track,use,wbr' + ), + // 信任的属性 + trustAttrs: makeMap( + 'align,alt,app-id,author,autoplay,border,cellpadding,cellspacing,class,color,colspan,controls,data-src,dir,face,height,href,id,ignore,loop,media,muted,name,path,poster,rowspan,size,span,src,start,style,type,unit-id,width,xmlns' + ), + // bool 型的属性 + boolAttrs: makeMap('autoplay,controls,ignore,loop,muted'), + // 信任的标签 + trustTags: makeMap( + 'a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video' + // #ifdef MP-WEIXIN + + (canIUse ? ',bdi,bdo,caption,pre,rt,ruby' : '') + // #endif + // #ifdef APP-PLUS + + ',embed,iframe' + // #endif + ), + // 默认的标签样式 + userAgentStyles: { + address: 'font-style:italic', + big: 'display:inline;font-size:1.2em', + blockquote: 'background-color:#f6f6f6;border-left:3px solid #dbdbdb;color:#6c6c6c;padding:5px 0 5px 10px', + caption: 'display:table-caption;text-align:center', + center: 'text-align:center', + cite: 'font-style:italic', + dd: 'margin-left:40px', + img: 'max-width:100%', + mark: 'background-color:yellow', + picture: 'max-width:100%', + pre: 'font-family:monospace;white-space:pre;overflow:scroll', + s: 'text-decoration:line-through', + small: 'display:inline;font-size:0.8em', + u: 'text-decoration:underline' + } +} + +function makeMap(str) { + var map = {}, + list = str.split(','); + for (var i = list.length; i--;) + map[list[i]] = true; + return map; +} diff --git a/components/jyf-parser/libs/handler.sjs b/components/jyf-parser/libs/handler.sjs new file mode 100644 index 0000000..e8743fa --- /dev/null +++ b/components/jyf-parser/libs/handler.sjs @@ -0,0 +1,44 @@ +// +---------------------------------------------------------------------- +// | CRMEB [ CRMEB赋能开发者,助力企业发展 ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 +// +---------------------------------------------------------------------- +// | Author: CRMEB Team +// +---------------------------------------------------------------------- +var inlineTags = { + abbr: 1, + b: 1, + big: 1, + code: 1, + del: 1, + em: 1, + i: 1, + ins: 1, + label: 1, + q: 1, + small: 1, + span: 1, + strong: 1 +} +export default { + // 从顶层标签的样式中取出一些给 rich-text + getStyle: function(style) { + if (style) { + var i, j, res = ''; + if ((i = style.indexOf('display')) != -1) + res = style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j); + if ((i = style.indexOf('float')) != -1) + res += ';' + style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j); + return res; + } + }, + getNode: function(item) { + return [item]; + }, + // 是否通过 rich-text 显示 + useRichText: function(item) { + return !item.c && !inlineTags[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1; + } +} diff --git a/components/jyf-parser/libs/handler.wxs b/components/jyf-parser/libs/handler.wxs new file mode 100644 index 0000000..afaf0bc --- /dev/null +++ b/components/jyf-parser/libs/handler.wxs @@ -0,0 +1,53 @@ +// +---------------------------------------------------------------------- +// | CRMEB [ CRMEB赋能开发者,助力企业发展 ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 +// +---------------------------------------------------------------------- +// | Author: CRMEB Team +// +---------------------------------------------------------------------- +var inlineTags = { + abbr: 1, + b: 1, + big: 1, + code: 1, + del: 1, + em: 1, + i: 1, + ins: 1, + label: 1, + q: 1, + small: 1, + span: 1, + strong: 1 +} +module.exports = { + // 从顶层标签的样式中取出一些给 rich-text + getStyle: function(style) { + if (style) { + var i, j, res = ''; + if ((i = style.indexOf('display')) != -1) + res = style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j); + if ((i = style.indexOf('float')) != -1) + res += ';' + style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j); + return res; + } + }, + // 处理懒加载 + getNode: function(item, imgLoad) { + if (!imgLoad && item.attrs.i != '0') { + var img = { + name: 'img', + attrs: JSON.parse(JSON.stringify(item.attrs)) + } + delete img.attrs.src; + img.attrs.style += ';width:20px;height:20px'; + return [img]; + } else return [item]; + }, + // 是否通过 rich-text 显示 + useRichText: function(item) { + return !item.c && !inlineTags[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1; + } +} diff --git a/components/jyf-parser/libs/trees.vue b/components/jyf-parser/libs/trees.vue new file mode 100644 index 0000000..c2ea476 --- /dev/null +++ b/components/jyf-parser/libs/trees.vue @@ -0,0 +1,485 @@ + +