已支付订单列表:where.payStatus = 1;
This commit is contained in:
@@ -0,0 +1,392 @@
|
||||
"use strict";
|
||||
const common_vendor = require("../../../../../common/vendor.js");
|
||||
const block0 = {};
|
||||
const node = () => Promise.resolve().then(() => L1VzZXJzL2d4d2Vic29mdC9BUFAvZ3h0eXp4LXVuaWFwcC1jbGkvc3JjL3VuaV9tb2R1bGVzL3V2LXBhcnNlL2NvbXBvbmVudHMvdXYtcGFyc2Uvbm9kZS9ub2RlLnZ1ZQ);
|
||||
const _sfc_main = {
|
||||
name: "node",
|
||||
options: {
|
||||
virtualHost: true
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
ctrl: {},
|
||||
isiOS: common_vendor.index.getSystemInfoSync().system.includes("iOS")
|
||||
};
|
||||
},
|
||||
props: {
|
||||
name: String,
|
||||
attrs: {
|
||||
type: Object,
|
||||
default() {
|
||||
return {};
|
||||
}
|
||||
},
|
||||
childs: Array,
|
||||
opts: Array
|
||||
},
|
||||
components: {
|
||||
node
|
||||
},
|
||||
mounted() {
|
||||
this.$nextTick(() => {
|
||||
for (this.root = this.$parent; this.root.$options.name !== "uv-parse"; this.root = this.root.$parent) ;
|
||||
});
|
||||
},
|
||||
beforeDestroy() {
|
||||
},
|
||||
methods: {
|
||||
toJSON() {
|
||||
return this;
|
||||
},
|
||||
/**
|
||||
* @description 播放视频事件
|
||||
* @param {Event} e
|
||||
*/
|
||||
play(e) {
|
||||
this.root.$emit("play");
|
||||
if (this.root.pauseVideo) {
|
||||
let flag = false;
|
||||
const id = e.target.id;
|
||||
for (let i = this.root._videos.length; i--; ) {
|
||||
if (this.root._videos[i].id === id) {
|
||||
flag = true;
|
||||
} else {
|
||||
this.root._videos[i].pause();
|
||||
}
|
||||
}
|
||||
if (!flag) {
|
||||
const ctx = common_vendor.index.createVideoContext(
|
||||
id,
|
||||
this
|
||||
);
|
||||
ctx.id = id;
|
||||
if (this.root.playbackRate) {
|
||||
ctx.playbackRate(this.root.playbackRate);
|
||||
}
|
||||
this.root._videos.push(ctx);
|
||||
}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @description 图片点击事件
|
||||
* @param {Event} e
|
||||
*/
|
||||
imgTap(e) {
|
||||
const node2 = this.childs[e.currentTarget.dataset.i];
|
||||
if (node2.a) {
|
||||
this.linkTap(node2.a);
|
||||
return;
|
||||
}
|
||||
if (node2.attrs.ignore) return;
|
||||
this.root.$emit("imgtap", node2.attrs);
|
||||
if (this.root.previewImg) {
|
||||
common_vendor.index.previewImage({
|
||||
showmenu: this.root.showImgMenu,
|
||||
current: parseInt(node2.attrs.i),
|
||||
urls: this.root.imgList
|
||||
});
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @description 图片长按
|
||||
*/
|
||||
imgLongTap(e) {
|
||||
},
|
||||
/**
|
||||
* @description 图片加载完成事件
|
||||
* @param {Event} e
|
||||
*/
|
||||
imgLoad(e) {
|
||||
const i = e.currentTarget.dataset.i;
|
||||
if (!this.childs[i].w) {
|
||||
this.$set(this.ctrl, i, e.detail.width);
|
||||
} else if (this.opts[1] && !this.ctrl[i] || this.ctrl[i] === -1) {
|
||||
this.$set(this.ctrl, i, 1);
|
||||
}
|
||||
this.checkReady();
|
||||
},
|
||||
/**
|
||||
* @description 检查是否所有图片加载完毕
|
||||
*/
|
||||
checkReady() {
|
||||
if (this.root && !this.root.lazyLoad) {
|
||||
this.root._unloadimgs -= 1;
|
||||
if (!this.root._unloadimgs) {
|
||||
setTimeout(() => {
|
||||
this.root.getRect().then((rect) => {
|
||||
this.root.$emit("ready", rect);
|
||||
}).catch(() => {
|
||||
this.root.$emit("ready", {});
|
||||
});
|
||||
}, 350);
|
||||
}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @description 链接点击事件
|
||||
* @param {Event} e
|
||||
*/
|
||||
linkTap(e) {
|
||||
const node2 = e.currentTarget ? this.childs[e.currentTarget.dataset.i] : {};
|
||||
const attrs = node2.attrs || e;
|
||||
const href = attrs.href;
|
||||
this.root.$emit("linktap", Object.assign({
|
||||
innerText: this.root.getText(node2.children || [])
|
||||
// 链接内的文本内容
|
||||
}, attrs));
|
||||
if (href) {
|
||||
if (href[0] === "#") {
|
||||
this.root.navigateTo(href.substring(1)).catch(() => {
|
||||
});
|
||||
} else if (href.split("?")[0].includes("://")) {
|
||||
if (this.root.copyLink) {
|
||||
common_vendor.index.setClipboardData({
|
||||
data: href,
|
||||
success: () => common_vendor.index.showToast({
|
||||
title: "链接已复制"
|
||||
})
|
||||
});
|
||||
}
|
||||
} else {
|
||||
common_vendor.index.navigateTo({
|
||||
url: href,
|
||||
fail() {
|
||||
common_vendor.index.switchTab({
|
||||
url: href,
|
||||
fail() {
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @description 错误事件
|
||||
* @param {Event} e
|
||||
*/
|
||||
mediaError(e) {
|
||||
const i = e.currentTarget.dataset.i;
|
||||
const node2 = this.childs[i];
|
||||
if (node2.name === "video" || node2.name === "audio") {
|
||||
let index = (this.ctrl[i] || 0) + 1;
|
||||
if (index > node2.src.length) {
|
||||
index = 0;
|
||||
}
|
||||
if (index < node2.src.length) {
|
||||
this.$set(this.ctrl, i, index);
|
||||
return;
|
||||
}
|
||||
} else if (node2.name === "img") {
|
||||
if (this.opts[2]) {
|
||||
this.$set(this.ctrl, i, -1);
|
||||
}
|
||||
this.checkReady();
|
||||
}
|
||||
if (this.root) {
|
||||
this.root.$emit("error", {
|
||||
source: node2.name,
|
||||
attrs: node2.attrs,
|
||||
errMsg: e.detail.errMsg
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
if (!Array) {
|
||||
const _component_node = common_vendor.resolveComponent("node");
|
||||
_component_node();
|
||||
}
|
||||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||||
return {
|
||||
a: common_vendor.f($props.childs, (n, i, i0) => {
|
||||
return common_vendor.e({
|
||||
a: n.name === "img" && !n.t && ($props.opts[1] && !$data.ctrl[i] || $data.ctrl[i] < 0)
|
||||
}, n.name === "img" && !n.t && ($props.opts[1] && !$data.ctrl[i] || $data.ctrl[i] < 0) ? {
|
||||
b: common_vendor.s(n.attrs.style),
|
||||
c: $data.ctrl[i] < 0 ? $props.opts[2] : $props.opts[1]
|
||||
} : {}, {
|
||||
d: n.name === "img" && n.t
|
||||
}, n.name === "img" && n.t ? {
|
||||
e: common_vendor.s("display:" + n.t),
|
||||
f: [{
|
||||
attrs: {
|
||||
style: n.attrs.style,
|
||||
src: n.attrs.src
|
||||
},
|
||||
name: "img"
|
||||
}],
|
||||
g: i,
|
||||
h: common_vendor.o((...args) => $options.imgTap && $options.imgTap(...args), i)
|
||||
} : n.name === "img" ? {
|
||||
j: n.attrs.id,
|
||||
k: common_vendor.n("_img " + n.attrs.class),
|
||||
l: common_vendor.s(($data.ctrl[i] === -1 ? "display:none;" : "") + "width:" + ($data.ctrl[i] || 1) + "px;height:1px;" + n.attrs.style),
|
||||
m: n.attrs.src,
|
||||
n: !n.h ? "widthFix" : !n.w ? "heightFix" : "",
|
||||
o: $props.opts[0],
|
||||
p: n.webp,
|
||||
q: $props.opts[3] && !n.attrs.ignore,
|
||||
r: !$props.opts[3] || n.attrs.ignore,
|
||||
s: i,
|
||||
t: common_vendor.o((...args) => $options.imgLoad && $options.imgLoad(...args), i),
|
||||
v: common_vendor.o((...args) => $options.mediaError && $options.mediaError(...args), i),
|
||||
w: common_vendor.o((...args) => $options.imgTap && $options.imgTap(...args), i),
|
||||
x: common_vendor.o((...args) => $options.imgLongTap && $options.imgLongTap(...args), i)
|
||||
} : n.text ? {
|
||||
z: common_vendor.t(n.text),
|
||||
A: $props.opts[4] == "force" && $data.isiOS
|
||||
} : n.name === "br" ? {} : n.name === "a" ? {
|
||||
D: "602a2654-0-" + i0,
|
||||
E: common_vendor.p({
|
||||
name: "span",
|
||||
childs: n.children,
|
||||
opts: $props.opts
|
||||
}),
|
||||
F: n.attrs.id,
|
||||
G: common_vendor.n((n.attrs.href ? "_a " : "") + n.attrs.class),
|
||||
H: common_vendor.s("display:inline;" + n.attrs.style),
|
||||
I: i,
|
||||
J: common_vendor.o((...args) => $options.linkTap && $options.linkTap(...args), i)
|
||||
} : n.name === "video" ? {
|
||||
L: n.attrs.id,
|
||||
M: common_vendor.n(n.attrs.class),
|
||||
N: common_vendor.s(n.attrs.style),
|
||||
O: n.attrs.autoplay,
|
||||
P: n.attrs.controls,
|
||||
Q: n.attrs.loop,
|
||||
R: n.attrs.muted,
|
||||
S: n.attrs["object-fit"],
|
||||
T: n.attrs.poster,
|
||||
U: n.src[$data.ctrl[i] || 0],
|
||||
V: i,
|
||||
W: common_vendor.o((...args) => $options.play && $options.play(...args), i),
|
||||
X: common_vendor.o((...args) => $options.mediaError && $options.mediaError(...args), i)
|
||||
} : n.name === "audio" ? {
|
||||
Z: n.attrs.id,
|
||||
aa: common_vendor.n(n.attrs.class),
|
||||
ab: common_vendor.s(n.attrs.style),
|
||||
ac: n.attrs.author,
|
||||
ad: n.attrs.controls,
|
||||
ae: n.attrs.loop,
|
||||
af: n.attrs.name,
|
||||
ag: n.attrs.poster,
|
||||
ah: n.src[$data.ctrl[i] || 0],
|
||||
ai: i,
|
||||
aj: common_vendor.o((...args) => $options.play && $options.play(...args), i),
|
||||
ak: common_vendor.o((...args) => $options.mediaError && $options.mediaError(...args), i)
|
||||
} : n.name === "table" && n.c || n.name === "li" ? common_vendor.e({
|
||||
am: n.name === "li"
|
||||
}, n.name === "li" ? {
|
||||
an: "602a2654-1-" + i0,
|
||||
ao: common_vendor.p({
|
||||
childs: n.children,
|
||||
opts: $props.opts
|
||||
})
|
||||
} : {
|
||||
ap: common_vendor.f(n.children, (tbody, x, i1) => {
|
||||
return common_vendor.e({
|
||||
a: tbody.name === "td" || tbody.name === "th"
|
||||
}, tbody.name === "td" || tbody.name === "th" ? {
|
||||
b: "602a2654-2-" + i0 + "-" + i1,
|
||||
c: common_vendor.p({
|
||||
childs: tbody.children,
|
||||
opts: $props.opts
|
||||
})
|
||||
} : {
|
||||
d: common_vendor.f(tbody.children, (tr, y, i2) => {
|
||||
return common_vendor.e({
|
||||
a: tr.name === "td" || tr.name === "th"
|
||||
}, tr.name === "td" || tr.name === "th" ? {
|
||||
b: "602a2654-3-" + i0 + "-" + i1 + "-" + i2,
|
||||
c: common_vendor.p({
|
||||
childs: tr.children,
|
||||
opts: $props.opts
|
||||
}),
|
||||
d: common_vendor.n("_" + tr.name + " " + tr.attrs.class),
|
||||
e: common_vendor.s(tr.attrs.style)
|
||||
} : {
|
||||
f: common_vendor.f(tr.children, (td, z, i3) => {
|
||||
return {
|
||||
a: "602a2654-4-" + i0 + "-" + i1 + "-" + i2 + "-" + i3,
|
||||
b: common_vendor.p({
|
||||
childs: td.children,
|
||||
opts: $props.opts
|
||||
}),
|
||||
c: z,
|
||||
d: common_vendor.n("_" + td.name + " " + td.attrs.class),
|
||||
e: common_vendor.s(td.attrs.style)
|
||||
};
|
||||
}),
|
||||
g: common_vendor.n("_" + tr.name + " " + tr.attrs.class),
|
||||
h: common_vendor.s(tr.attrs.style)
|
||||
}, {
|
||||
i: y
|
||||
});
|
||||
})
|
||||
}, {
|
||||
e: x,
|
||||
f: common_vendor.n("_" + tbody.name + " " + tbody.attrs.class),
|
||||
g: common_vendor.s(tbody.attrs.style)
|
||||
});
|
||||
})
|
||||
}, {
|
||||
aq: n.attrs.id,
|
||||
ar: common_vendor.n("_" + n.name + " " + n.attrs.class),
|
||||
as: common_vendor.s(n.attrs.style)
|
||||
}) : !n.c ? {
|
||||
av: n.attrs.id,
|
||||
aw: common_vendor.s("display:inline;" + n.f),
|
||||
ax: $props.opts[4],
|
||||
ay: $props.opts[4],
|
||||
az: [n]
|
||||
} : n.c === 2 ? {
|
||||
aB: common_vendor.f(n.children, (n2, j, i1) => {
|
||||
return {
|
||||
a: j,
|
||||
b: common_vendor.s(n2.f),
|
||||
c: "602a2654-5-" + i0 + "-" + i1,
|
||||
d: common_vendor.p({
|
||||
name: n2.name,
|
||||
attrs: n2.attrs,
|
||||
childs: n2.children,
|
||||
opts: $props.opts
|
||||
})
|
||||
};
|
||||
}),
|
||||
aC: n.attrs.id,
|
||||
aD: common_vendor.n("_block _" + n.name + " " + n.attrs.class),
|
||||
aE: common_vendor.s(n.f + ";" + n.attrs.style)
|
||||
} : {
|
||||
aF: common_vendor.s(n.f),
|
||||
aG: "602a2654-6-" + i0,
|
||||
aH: common_vendor.p({
|
||||
name: n.name,
|
||||
attrs: n.attrs,
|
||||
childs: n.children,
|
||||
opts: $props.opts
|
||||
})
|
||||
}, {
|
||||
i: n.name === "img",
|
||||
y: n.text,
|
||||
B: n.name === "br",
|
||||
C: n.name === "a",
|
||||
K: n.name === "video",
|
||||
Y: n.name === "audio",
|
||||
al: n.name === "table" && n.c || n.name === "li",
|
||||
at: !n.c,
|
||||
aA: n.c === 2,
|
||||
aI: i
|
||||
});
|
||||
}),
|
||||
b: $props.attrs.id,
|
||||
c: common_vendor.n("_block _" + $props.name + " " + $props.attrs.class),
|
||||
d: common_vendor.s($props.attrs.style)
|
||||
};
|
||||
}
|
||||
if (typeof block0 === "function") block0(_sfc_main);
|
||||
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "/Users/gxwebsoft/APP/gxtyzx-uniapp-cli/src/uni_modules/uv-parse/components/uv-parse/node/node.vue"]]);
|
||||
wx.createComponent(Component);
|
||||
const L1VzZXJzL2d4d2Vic29mdC9BUFAvZ3h0eXp4LXVuaWFwcC1jbGkvc3JjL3VuaV9tb2R1bGVzL3V2LXBhcnNlL2NvbXBvbmVudHMvdXYtcGFyc2Uvbm9kZS9ub2RlLnZ1ZQ = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||||
__proto__: null
|
||||
}, Symbol.toStringTag, { value: "Module" }));
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"component": true,
|
||||
"usingComponents": {
|
||||
"node": "./node"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<wxs module="handler">
|
||||
|
||||
// 行内标签列表
|
||||
var inlineTags = {
|
||||
abbr: true,
|
||||
b: true,
|
||||
big: true,
|
||||
code: true,
|
||||
del: true,
|
||||
em: true,
|
||||
i: true,
|
||||
ins: true,
|
||||
label: true,
|
||||
q: true,
|
||||
small: true,
|
||||
span: true,
|
||||
strong: true,
|
||||
sub: true,
|
||||
sup: true
|
||||
}
|
||||
/**
|
||||
* @description 判断是否为行内标签
|
||||
*/
|
||||
module.exports = {
|
||||
isInline: function (tagName, style) {
|
||||
return inlineTags[tagName] || (style || '').indexOf('display:inline') !== -1
|
||||
}
|
||||
}
|
||||
|
||||
</wxs>
|
||||
<view id="{{b}}" class="{{c}}" style="{{d}}"><block wx:for="{{a}}" wx:for-item="n" wx:key="aI"><image wx:if="{{n.a}}" class="_img" style="{{n.b}}" src="{{n.c}}" mode="widthFix"/><rich-text wx:if="{{n.d}}" style="{{n.e}}" nodes="{{n.f}}" data-i="{{n.g}}" catchtap="{{n.h}}"/><image wx:elif="{{n.i}}" id="{{n.j}}" class="{{n.k}}" style="{{n.l}}" src="{{n.m}}" mode="{{n.n}}" lazy-load="{{n.o}}" webp="{{n.p}}" show-menu-by-longpress="{{n.q}}" image-menu-prevent="{{n.r}}" data-i="{{n.s}}" bindload="{{n.t}}" binderror="{{n.v}}" catchtap="{{n.w}}" bindlongpress="{{n.x}}"/><text wx:elif="{{n.y}}" user-select="{{n.A}}" decode>{{n.z}}</text><text wx:elif="{{n.B}}">\n</text><view wx:elif="{{n.C}}" id="{{n.F}}" class="{{n.G}}" hover-class="_hover" style="{{n.H}}" data-i="{{n.I}}" catchtap="{{n.J}}"><node wx:if="{{n.E}}" style="display:inherit" u-i="{{n.D}}" bind:__l="__l" u-p="{{n.E}}"/></view><video wx:elif="{{n.K}}" id="{{n.L}}" class="{{n.M}}" style="{{n.N}}" autoplay="{{n.O}}" controls="{{n.P}}" loop="{{n.Q}}" muted="{{n.R}}" object-fit="{{n.S}}" poster="{{n.T}}" src="{{n.U}}" data-i="{{n.V}}" bindplay="{{n.W}}" binderror="{{n.X}}"/><audio wx:elif="{{n.Y}}" id="{{n.Z}}" class="{{n.aa}}" style="{{n.ab}}" author="{{n.ac}}" controls="{{n.ad}}" loop="{{n.ae}}" name="{{n.af}}" poster="{{n.ag}}" src="{{n.ah}}" data-i="{{n.ai}}" bindplay="{{n.aj}}" binderror="{{n.ak}}"/><view wx:elif="{{n.al}}" id="{{n.aq}}" class="{{n.ar}}" style="{{n.as}}"><node wx:if="{{n.am}}" u-i="{{n.an}}" bind:__l="__l" u-p="{{n.ao}}"/><block wx:else><view wx:for="{{n.ap}}" wx:for-item="tbody" wx:key="e" class="{{tbody.f}}" style="{{tbody.g}}"><node wx:if="{{tbody.a}}" u-i="{{tbody.b}}" bind:__l="__l" u-p="{{tbody.c}}"/><block wx:else><block wx:for="{{tbody.d}}" wx:for-item="tr" wx:key="i"><view wx:if="{{tr.a}}" class="{{tr.d}}" style="{{tr.e}}"><node wx:if="{{tr.c}}" u-i="{{tr.b}}" bind:__l="__l" u-p="{{tr.c}}"/></view><view wx:else class="{{tr.g}}" style="{{tr.h}}"><view wx:for="{{tr.f}}" wx:for-item="td" wx:key="c" class="{{td.d}}" style="{{td.e}}"><node wx:if="{{td.b}}" u-i="{{td.a}}" bind:__l="__l" u-p="{{td.b}}"/></view></view></block></block></view></block></view><rich-text wx:elif="{{n.at}}" id="{{n.av}}" style="{{n.aw}}" preview="{{false}}" selectable="{{n.ax}}" user-select="{{n.ay}}" nodes="{{n.az}}"/><view wx:elif="{{n.aA}}" id="{{n.aC}}" class="{{n.aD}}" style="{{n.aE}}"><node wx:for="{{n.aB}}" wx:for-item="n2" wx:key="a" style="{{n2.b}}" u-i="{{n2.c}}" bind:__l="__l" u-p="{{n2.d}}"/></view><node wx:else style="{{n.aF}}" u-i="{{n.aG}}" bind:__l="__l" u-p="{{n.aH||''}}"/></block></view>
|
||||
@@ -0,0 +1,143 @@
|
||||
|
||||
/* a 标签默认效果 */
|
||||
._a {
|
||||
padding: 1.5px 0 1.5px 0;
|
||||
color: #366092;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
/* a 标签点击态效果 */
|
||||
._hover {
|
||||
text-decoration: underline;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
/* 图片默认效果 */
|
||||
._img {
|
||||
max-width: 100%;
|
||||
-webkit-touch-callout: none;
|
||||
}
|
||||
|
||||
/* 内部样式 */
|
||||
._block {
|
||||
display: block;
|
||||
}
|
||||
._b,
|
||||
._strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
._code {
|
||||
font-family: monospace;
|
||||
}
|
||||
._del {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
._em,
|
||||
._i {
|
||||
font-style: italic;
|
||||
}
|
||||
._h1 {
|
||||
font-size: 2em;
|
||||
}
|
||||
._h2 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
._h3 {
|
||||
font-size: 1.17em;
|
||||
}
|
||||
._h5 {
|
||||
font-size: 0.83em;
|
||||
}
|
||||
._h6 {
|
||||
font-size: 0.67em;
|
||||
}
|
||||
._h1,
|
||||
._h2,
|
||||
._h3,
|
||||
._h4,
|
||||
._h5,
|
||||
._h6 {
|
||||
display: block;
|
||||
font-weight: bold;
|
||||
}
|
||||
._image {
|
||||
height: 1px;
|
||||
}
|
||||
._ins {
|
||||
text-decoration: underline;
|
||||
}
|
||||
._li {
|
||||
display: list-item;
|
||||
}
|
||||
._ol {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
._ol,
|
||||
._ul {
|
||||
display: block;
|
||||
padding-left: 40px;
|
||||
margin: 1em 0;
|
||||
}
|
||||
._q::before {
|
||||
content: '"';
|
||||
}
|
||||
._q::after {
|
||||
content: '"';
|
||||
}
|
||||
._sub {
|
||||
font-size: smaller;
|
||||
vertical-align: sub;
|
||||
}
|
||||
._sup {
|
||||
font-size: smaller;
|
||||
vertical-align: super;
|
||||
}
|
||||
._thead,
|
||||
._tbody,
|
||||
._tfoot {
|
||||
display: table-row-group;
|
||||
}
|
||||
._tr {
|
||||
display: table-row;
|
||||
}
|
||||
._td,
|
||||
._th {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
}
|
||||
._th {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
}
|
||||
._ul {
|
||||
list-style-type: disc;
|
||||
}
|
||||
._ul ._ul {
|
||||
margin: 0;
|
||||
list-style-type: circle;
|
||||
}
|
||||
._ul ._ul ._ul {
|
||||
list-style-type: square;
|
||||
}
|
||||
._abbr,
|
||||
._b,
|
||||
._code,
|
||||
._del,
|
||||
._em,
|
||||
._i,
|
||||
._ins,
|
||||
._label,
|
||||
._q,
|
||||
._span,
|
||||
._strong,
|
||||
._sub,
|
||||
._sup {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,978 @@
|
||||
"use strict";
|
||||
const common_vendor = require("../../../../common/vendor.js");
|
||||
const config = {
|
||||
// 信任的标签(保持标签名不变)
|
||||
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,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video"),
|
||||
// 块级标签(转为 div,其他的非信任标签转为 span)
|
||||
blockTags: makeMap("address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section"),
|
||||
// 行内标签
|
||||
inlineTags: makeMap("abbr,b,big,code,del,em,i,ins,label,q,small,span,strong,sub,sup"),
|
||||
// 要移除的标签
|
||||
ignoreTags: makeMap("area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr"),
|
||||
// 自闭合的标签
|
||||
voidTags: makeMap("area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr"),
|
||||
// html 实体
|
||||
entities: {
|
||||
lt: "<",
|
||||
gt: ">",
|
||||
quot: '"',
|
||||
apos: "'",
|
||||
ensp: " ",
|
||||
emsp: " ",
|
||||
nbsp: " ",
|
||||
semi: ";",
|
||||
ndash: "–",
|
||||
mdash: "—",
|
||||
middot: "·",
|
||||
lsquo: "‘",
|
||||
rsquo: "’",
|
||||
ldquo: "“",
|
||||
rdquo: "”",
|
||||
bull: "•",
|
||||
hellip: "…",
|
||||
larr: "←",
|
||||
uarr: "↑",
|
||||
rarr: "→",
|
||||
darr: "↓"
|
||||
},
|
||||
// 默认的标签样式
|
||||
tagStyle: {
|
||||
address: "font-style:italic",
|
||||
big: "display:inline;font-size:1.2em",
|
||||
caption: "display:table-caption;text-align:center",
|
||||
center: "text-align:center",
|
||||
cite: "font-style:italic",
|
||||
dd: "margin-left:40px",
|
||||
mark: "background-color:yellow",
|
||||
pre: "font-family:monospace;white-space:pre",
|
||||
s: "text-decoration:line-through",
|
||||
small: "display:inline;font-size:0.8em",
|
||||
strike: "text-decoration:line-through",
|
||||
u: "text-decoration:underline"
|
||||
},
|
||||
// svg 大小写对照表
|
||||
svgDict: {
|
||||
animatetransform: "animateTransform",
|
||||
lineargradient: "linearGradient",
|
||||
viewbox: "viewBox",
|
||||
attributename: "attributeName",
|
||||
repeatcount: "repeatCount",
|
||||
repeatdur: "repeatDur"
|
||||
}
|
||||
};
|
||||
const tagSelector = {};
|
||||
const {
|
||||
windowWidth,
|
||||
system
|
||||
} = common_vendor.index.getSystemInfoSync();
|
||||
const blankChar = makeMap(" ,\r,\n, ,\f");
|
||||
let idIndex = 0;
|
||||
function makeMap(str) {
|
||||
const map = /* @__PURE__ */ Object.create(null);
|
||||
const list = str.split(",");
|
||||
for (let i = list.length; i--; ) {
|
||||
map[list[i]] = true;
|
||||
}
|
||||
return map;
|
||||
}
|
||||
function decodeEntity(str, amp) {
|
||||
let i = str.indexOf("&");
|
||||
while (i !== -1) {
|
||||
const j = str.indexOf(";", i + 3);
|
||||
let code;
|
||||
if (j === -1) break;
|
||||
if (str[i + 1] === "#") {
|
||||
code = parseInt((str[i + 2] === "x" ? "0" : "") + str.substring(i + 2, j));
|
||||
if (!isNaN(code)) {
|
||||
str = str.substr(0, i) + String.fromCharCode(code) + str.substr(j + 1);
|
||||
}
|
||||
} else {
|
||||
code = str.substring(i + 1, j);
|
||||
if (config.entities[code] || code === "amp" && amp) {
|
||||
str = str.substr(0, i) + (config.entities[code] || "&") + str.substr(j + 1);
|
||||
}
|
||||
}
|
||||
i = str.indexOf("&", i + 1);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
function mergeNodes(nodes) {
|
||||
let i = nodes.length - 1;
|
||||
for (let j = i; j >= -1; j--) {
|
||||
if (j === -1 || nodes[j].c || !nodes[j].name || nodes[j].name !== "div" && nodes[j].name !== "p" && nodes[j].name[0] !== "h" || (nodes[j].attrs.style || "").includes("inline")) {
|
||||
if (i - j >= 5) {
|
||||
nodes.splice(j + 1, i - j, {
|
||||
name: "div",
|
||||
attrs: {},
|
||||
children: nodes.slice(j + 1, i + 1)
|
||||
});
|
||||
}
|
||||
i = j - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
function Parser(vm) {
|
||||
this.options = vm || {};
|
||||
this.tagStyle = Object.assign({}, config.tagStyle, this.options.tagStyle);
|
||||
this.imgList = vm.imgList || [];
|
||||
this.imgList._unloadimgs = 0;
|
||||
this.plugins = vm.plugins || [];
|
||||
this.attrs = /* @__PURE__ */ Object.create(null);
|
||||
this.stack = [];
|
||||
this.nodes = [];
|
||||
this.pre = (this.options.containerStyle || "").includes("white-space") && this.options.containerStyle.includes("pre") ? 2 : 0;
|
||||
}
|
||||
Parser.prototype.parse = function(content) {
|
||||
for (let i = this.plugins.length; i--; ) {
|
||||
if (this.plugins[i].onUpdate) {
|
||||
content = this.plugins[i].onUpdate(content, config) || content;
|
||||
}
|
||||
}
|
||||
new Lexer(this).parse(content);
|
||||
while (this.stack.length) {
|
||||
this.popNode();
|
||||
}
|
||||
if (this.nodes.length > 50) {
|
||||
mergeNodes(this.nodes);
|
||||
}
|
||||
return this.nodes;
|
||||
};
|
||||
Parser.prototype.expose = function() {
|
||||
for (let i = this.stack.length; i--; ) {
|
||||
const item = this.stack[i];
|
||||
if (item.c || item.name === "a" || item.name === "video" || item.name === "audio") return;
|
||||
item.c = 1;
|
||||
}
|
||||
};
|
||||
Parser.prototype.hook = function(node) {
|
||||
for (let i = this.plugins.length; i--; ) {
|
||||
if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) === false) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
Parser.prototype.getUrl = function(url) {
|
||||
const domain = this.options.domain;
|
||||
if (url[0] === "/") {
|
||||
if (url[1] === "/") {
|
||||
url = (domain ? domain.split("://")[0] : "http") + ":" + url;
|
||||
} else if (domain) {
|
||||
url = domain + url;
|
||||
}
|
||||
} else if (!url.includes("data:") && !url.includes("://")) {
|
||||
if (domain) {
|
||||
url = domain + "/" + url;
|
||||
}
|
||||
}
|
||||
return url;
|
||||
};
|
||||
Parser.prototype.parseStyle = function(node) {
|
||||
const attrs = node.attrs;
|
||||
const list = (this.tagStyle[node.name] || "").split(";").concat((attrs.style || "").split(";"));
|
||||
const styleObj = {};
|
||||
let tmp = "";
|
||||
if (attrs.id && !this.xml) {
|
||||
if (this.options.useAnchor) {
|
||||
this.expose();
|
||||
} else if (node.name !== "img" && node.name !== "a" && node.name !== "video" && node.name !== "audio") {
|
||||
attrs.id = void 0;
|
||||
}
|
||||
}
|
||||
if (attrs.width) {
|
||||
styleObj.width = parseFloat(attrs.width) + (attrs.width.includes("%") ? "%" : "px");
|
||||
attrs.width = void 0;
|
||||
}
|
||||
if (attrs.height) {
|
||||
styleObj.height = parseFloat(attrs.height) + (attrs.height.includes("%") ? "%" : "px");
|
||||
attrs.height = void 0;
|
||||
}
|
||||
for (let i = 0, len = list.length; i < len; i++) {
|
||||
const info = list[i].split(":");
|
||||
if (info.length < 2) continue;
|
||||
const key = info.shift().trim().toLowerCase();
|
||||
let value = info.join(":").trim();
|
||||
if (value[0] === "-" && value.lastIndexOf("-") > 0 || value.includes("safe")) {
|
||||
tmp += `;${key}:${value}`;
|
||||
} else if (!styleObj[key] || value.includes("import") || !styleObj[key].includes("import")) {
|
||||
if (value.includes("url")) {
|
||||
let j = value.indexOf("(") + 1;
|
||||
if (j) {
|
||||
while (value[j] === '"' || value[j] === "'" || blankChar[value[j]]) {
|
||||
j++;
|
||||
}
|
||||
value = value.substr(0, j) + this.getUrl(value.substr(j));
|
||||
}
|
||||
} else if (value.includes("rpx")) {
|
||||
value = value.replace(/[0-9.]+\s*rpx/g, ($) => parseFloat($) * windowWidth / 750 + "px");
|
||||
}
|
||||
styleObj[key] = value;
|
||||
}
|
||||
}
|
||||
node.attrs.style = tmp;
|
||||
return styleObj;
|
||||
};
|
||||
Parser.prototype.onTagName = function(name) {
|
||||
this.tagName = this.xml ? name : name.toLowerCase();
|
||||
if (this.tagName === "svg") {
|
||||
this.xml = (this.xml || 0) + 1;
|
||||
config.ignoreTags.style = void 0;
|
||||
}
|
||||
};
|
||||
Parser.prototype.onAttrName = function(name) {
|
||||
name = this.xml ? name : name.toLowerCase();
|
||||
if (name.substr(0, 5) === "data-") {
|
||||
if (name === "data-src" && !this.attrs.src) {
|
||||
this.attrName = "src";
|
||||
} else if (this.tagName === "img" || this.tagName === "a") {
|
||||
this.attrName = name;
|
||||
} else {
|
||||
this.attrName = void 0;
|
||||
}
|
||||
} else {
|
||||
this.attrName = name;
|
||||
this.attrs[name] = "T";
|
||||
}
|
||||
};
|
||||
Parser.prototype.onAttrVal = function(val) {
|
||||
const name = this.attrName || "";
|
||||
if (name === "style" || name === "href") {
|
||||
this.attrs[name] = decodeEntity(val, true);
|
||||
} else if (name.includes("src")) {
|
||||
this.attrs[name] = this.getUrl(decodeEntity(val, true));
|
||||
} else if (name) {
|
||||
this.attrs[name] = val;
|
||||
}
|
||||
};
|
||||
Parser.prototype.onOpenTag = function(selfClose) {
|
||||
const node = /* @__PURE__ */ Object.create(null);
|
||||
node.name = this.tagName;
|
||||
node.attrs = this.attrs;
|
||||
if (this.options.nodes.length) {
|
||||
node.type = "node";
|
||||
}
|
||||
this.attrs = /* @__PURE__ */ Object.create(null);
|
||||
const attrs = node.attrs;
|
||||
const parent = this.stack[this.stack.length - 1];
|
||||
const siblings = parent ? parent.children : this.nodes;
|
||||
const close = this.xml ? selfClose : config.voidTags[node.name];
|
||||
if (tagSelector[node.name]) {
|
||||
attrs.class = tagSelector[node.name] + (attrs.class ? " " + attrs.class : "");
|
||||
}
|
||||
if (node.name === "embed") {
|
||||
const src = attrs.src || "";
|
||||
if (src.includes(".mp4") || src.includes(".3gp") || src.includes(".m3u8") || (attrs.type || "").includes("video")) {
|
||||
node.name = "video";
|
||||
} else if (src.includes(".mp3") || src.includes(".wav") || src.includes(".aac") || src.includes(".m4a") || (attrs.type || "").includes("audio")) {
|
||||
node.name = "audio";
|
||||
}
|
||||
if (attrs.autostart) {
|
||||
attrs.autoplay = "T";
|
||||
}
|
||||
attrs.controls = "T";
|
||||
}
|
||||
if (node.name === "video" || node.name === "audio") {
|
||||
if (node.name === "video" && !attrs.id) {
|
||||
attrs.id = "v" + idIndex++;
|
||||
}
|
||||
if (!attrs.controls && !attrs.autoplay) {
|
||||
attrs.controls = "T";
|
||||
}
|
||||
node.src = [];
|
||||
if (attrs.src) {
|
||||
node.src.push(attrs.src);
|
||||
attrs.src = void 0;
|
||||
}
|
||||
this.expose();
|
||||
}
|
||||
if (close) {
|
||||
if (!this.hook(node) || config.ignoreTags[node.name]) {
|
||||
if (node.name === "base" && !this.options.domain) {
|
||||
this.options.domain = attrs.href;
|
||||
} else if (node.name === "source" && parent && (parent.name === "video" || parent.name === "audio") && attrs.src) {
|
||||
parent.src.push(attrs.src);
|
||||
}
|
||||
return;
|
||||
}
|
||||
const styleObj = this.parseStyle(node);
|
||||
if (node.name === "img") {
|
||||
if (attrs.src) {
|
||||
if (attrs.src.includes("webp")) {
|
||||
node.webp = "T";
|
||||
}
|
||||
if (attrs.src.includes("data:") && !attrs["original-src"]) {
|
||||
attrs.ignore = "T";
|
||||
}
|
||||
if (!attrs.ignore || node.webp || attrs.src.includes("cloud://")) {
|
||||
for (let i = this.stack.length; i--; ) {
|
||||
const item = this.stack[i];
|
||||
if (item.name === "a") {
|
||||
node.a = item.attrs;
|
||||
}
|
||||
if (item.name === "table" && !node.webp && !attrs.src.includes("cloud://")) {
|
||||
if (!styleObj.display || styleObj.display.includes("inline")) {
|
||||
node.t = "inline-block";
|
||||
} else {
|
||||
node.t = styleObj.display;
|
||||
}
|
||||
styleObj.display = void 0;
|
||||
}
|
||||
const style = item.attrs.style || "";
|
||||
if (style.includes("flex:") && !style.includes("flex:0") && !style.includes("flex: 0") && (!styleObj.width || parseInt(styleObj.width) > 100)) {
|
||||
styleObj.width = "100% !important";
|
||||
styleObj.height = "";
|
||||
for (let j = i + 1; j < this.stack.length; j++) {
|
||||
this.stack[j].attrs.style = (this.stack[j].attrs.style || "").replace("inline-", "");
|
||||
}
|
||||
} else if (style.includes("flex") && styleObj.width === "100%") {
|
||||
for (let j = i + 1; j < this.stack.length; j++) {
|
||||
const style2 = this.stack[j].attrs.style || "";
|
||||
if (!style2.includes(";width") && !style2.includes(" width") && style2.indexOf("width") !== 0) {
|
||||
styleObj.width = "";
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (style.includes("inline-block")) {
|
||||
if (styleObj.width && styleObj.width[styleObj.width.length - 1] === "%") {
|
||||
item.attrs.style += ";max-width:" + styleObj.width;
|
||||
styleObj.width = "";
|
||||
} else {
|
||||
item.attrs.style += ";max-width:100%";
|
||||
}
|
||||
}
|
||||
item.c = 1;
|
||||
}
|
||||
attrs.i = this.imgList.length.toString();
|
||||
let src = attrs["original-src"] || attrs.src;
|
||||
if (this.imgList.includes(src)) {
|
||||
let i = src.indexOf("://");
|
||||
if (i !== -1) {
|
||||
i += 3;
|
||||
let newSrc = src.substr(0, i);
|
||||
for (; i < src.length; i++) {
|
||||
if (src[i] === "/") break;
|
||||
newSrc += Math.random() > 0.5 ? src[i].toUpperCase() : src[i];
|
||||
}
|
||||
newSrc += src.substr(i);
|
||||
src = newSrc;
|
||||
}
|
||||
}
|
||||
this.imgList.push(src);
|
||||
if (!node.t) {
|
||||
this.imgList._unloadimgs += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (styleObj.display === "inline") {
|
||||
styleObj.display = "";
|
||||
}
|
||||
if (attrs.ignore) {
|
||||
styleObj["max-width"] = styleObj["max-width"] || "100%";
|
||||
attrs.style += ";-webkit-touch-callout:none";
|
||||
}
|
||||
if (parseInt(styleObj.width) > windowWidth) {
|
||||
styleObj.height = void 0;
|
||||
}
|
||||
if (!isNaN(parseInt(styleObj.width))) {
|
||||
node.w = "T";
|
||||
}
|
||||
if (!isNaN(parseInt(styleObj.height)) && (!styleObj.height.includes("%") || parent && (parent.attrs.style || "").includes("height"))) {
|
||||
node.h = "T";
|
||||
}
|
||||
} else if (node.name === "svg") {
|
||||
siblings.push(node);
|
||||
this.stack.push(node);
|
||||
this.popNode();
|
||||
return;
|
||||
}
|
||||
for (const key in styleObj) {
|
||||
if (styleObj[key]) {
|
||||
attrs.style += `;${key}:${styleObj[key].replace(" !important", "")}`;
|
||||
}
|
||||
}
|
||||
attrs.style = attrs.style.substr(1) || void 0;
|
||||
if (!attrs.style) {
|
||||
delete attrs.style;
|
||||
}
|
||||
} else {
|
||||
if ((node.name === "pre" || (attrs.style || "").includes("white-space") && attrs.style.includes("pre")) && this.pre !== 2) {
|
||||
this.pre = node.pre = 1;
|
||||
}
|
||||
node.children = [];
|
||||
this.stack.push(node);
|
||||
}
|
||||
siblings.push(node);
|
||||
};
|
||||
Parser.prototype.onCloseTag = function(name) {
|
||||
name = this.xml ? name : name.toLowerCase();
|
||||
let i;
|
||||
for (i = this.stack.length; i--; ) {
|
||||
if (this.stack[i].name === name) break;
|
||||
}
|
||||
if (i !== -1) {
|
||||
while (this.stack.length > i) {
|
||||
this.popNode();
|
||||
}
|
||||
} else if (name === "p" || name === "br") {
|
||||
const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes;
|
||||
siblings.push({
|
||||
name,
|
||||
attrs: {
|
||||
class: tagSelector[name] || "",
|
||||
style: this.tagStyle[name] || ""
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
Parser.prototype.popNode = function() {
|
||||
const node = this.stack.pop();
|
||||
let attrs = node.attrs;
|
||||
const children = node.children;
|
||||
const parent = this.stack[this.stack.length - 1];
|
||||
const siblings = parent ? parent.children : this.nodes;
|
||||
if (!this.hook(node) || config.ignoreTags[node.name]) {
|
||||
if (node.name === "title" && children.length && children[0].type === "text" && this.options.setTitle) {
|
||||
common_vendor.index.setNavigationBarTitle({
|
||||
title: children[0].text
|
||||
});
|
||||
}
|
||||
siblings.pop();
|
||||
return;
|
||||
}
|
||||
if (node.pre && this.pre !== 2) {
|
||||
this.pre = node.pre = void 0;
|
||||
for (let i = this.stack.length; i--; ) {
|
||||
if (this.stack[i].pre) {
|
||||
this.pre = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
const styleObj = {};
|
||||
if (node.name === "svg") {
|
||||
if (this.xml > 1) {
|
||||
this.xml--;
|
||||
return;
|
||||
}
|
||||
let src = "";
|
||||
const style = attrs.style;
|
||||
attrs.style = "";
|
||||
attrs.xmlns = "http://www.w3.org/2000/svg";
|
||||
(function traversal(node2) {
|
||||
if (node2.type === "text") {
|
||||
src += node2.text;
|
||||
return;
|
||||
}
|
||||
const name = config.svgDict[node2.name] || node2.name;
|
||||
src += "<" + name;
|
||||
for (const item in node2.attrs) {
|
||||
const val = node2.attrs[item];
|
||||
if (val) {
|
||||
src += ` ${config.svgDict[item] || item}="${val}"`;
|
||||
}
|
||||
}
|
||||
if (!node2.children) {
|
||||
src += "/>";
|
||||
} else {
|
||||
src += ">";
|
||||
for (let i = 0; i < node2.children.length; i++) {
|
||||
traversal(node2.children[i]);
|
||||
}
|
||||
src += "</" + name + ">";
|
||||
}
|
||||
})(node);
|
||||
node.name = "img";
|
||||
node.attrs = {
|
||||
src: "data:image/svg+xml;utf8," + src.replace(/#/g, "%23"),
|
||||
style,
|
||||
ignore: "T"
|
||||
};
|
||||
node.children = void 0;
|
||||
this.xml = false;
|
||||
config.ignoreTags.style = true;
|
||||
return;
|
||||
}
|
||||
if (attrs.align) {
|
||||
if (node.name === "table") {
|
||||
if (attrs.align === "center") {
|
||||
styleObj["margin-inline-start"] = styleObj["margin-inline-end"] = "auto";
|
||||
} else {
|
||||
styleObj.float = attrs.align;
|
||||
}
|
||||
} else {
|
||||
styleObj["text-align"] = attrs.align;
|
||||
}
|
||||
attrs.align = void 0;
|
||||
}
|
||||
if (attrs.dir) {
|
||||
styleObj.direction = attrs.dir;
|
||||
attrs.dir = void 0;
|
||||
}
|
||||
if (node.name === "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) {
|
||||
let size = parseInt(attrs.size);
|
||||
if (!isNaN(size)) {
|
||||
if (size < 1) {
|
||||
size = 1;
|
||||
} else if (size > 7) {
|
||||
size = 7;
|
||||
}
|
||||
styleObj["font-size"] = ["x-small", "small", "medium", "large", "x-large", "xx-large", "xxx-large"][size - 1];
|
||||
}
|
||||
attrs.size = void 0;
|
||||
}
|
||||
}
|
||||
if ((attrs.class || "").includes("align-center")) {
|
||||
styleObj["text-align"] = "center";
|
||||
}
|
||||
Object.assign(styleObj, this.parseStyle(node));
|
||||
if (node.name !== "table" && parseInt(styleObj.width) > windowWidth) {
|
||||
styleObj["max-width"] = "100%";
|
||||
styleObj["box-sizing"] = "border-box";
|
||||
}
|
||||
if (config.blockTags[node.name]) {
|
||||
node.name = "div";
|
||||
} else if (!config.trustTags[node.name] && !this.xml) {
|
||||
node.name = "span";
|
||||
}
|
||||
if (node.name === "a" || node.name === "ad") {
|
||||
this.expose();
|
||||
} else if (node.name === "video") {
|
||||
if ((styleObj.height || "").includes("auto")) {
|
||||
styleObj.height = void 0;
|
||||
}
|
||||
} else if ((node.name === "ul" || node.name === "ol") && node.c) {
|
||||
const types = {
|
||||
a: "lower-alpha",
|
||||
A: "upper-alpha",
|
||||
i: "lower-roman",
|
||||
I: "upper-roman"
|
||||
};
|
||||
if (types[attrs.type]) {
|
||||
attrs.style += ";list-style-type:" + types[attrs.type];
|
||||
attrs.type = void 0;
|
||||
}
|
||||
for (let i = children.length; i--; ) {
|
||||
if (children[i].name === "li") {
|
||||
children[i].c = 1;
|
||||
}
|
||||
}
|
||||
} else if (node.name === "table") {
|
||||
let padding = parseFloat(attrs.cellpadding);
|
||||
let spacing = parseFloat(attrs.cellspacing);
|
||||
const border = parseFloat(attrs.border);
|
||||
const bordercolor = styleObj["border-color"];
|
||||
const borderstyle = styleObj["border-style"];
|
||||
if (node.c) {
|
||||
if (isNaN(padding)) {
|
||||
padding = 2;
|
||||
}
|
||||
if (isNaN(spacing)) {
|
||||
spacing = 2;
|
||||
}
|
||||
}
|
||||
if (border) {
|
||||
attrs.style += `;border:${border}px ${borderstyle || "solid"} ${bordercolor || "gray"}`;
|
||||
}
|
||||
if (node.flag && node.c) {
|
||||
styleObj.display = "grid";
|
||||
if (spacing) {
|
||||
styleObj["grid-gap"] = spacing + "px";
|
||||
styleObj.padding = spacing + "px";
|
||||
} else if (border) {
|
||||
attrs.style += ";border-left:0;border-top:0";
|
||||
}
|
||||
const width = [];
|
||||
const trList = [];
|
||||
const cells = [];
|
||||
const map = {};
|
||||
(function traversal(nodes) {
|
||||
for (let i = 0; i < nodes.length; i++) {
|
||||
if (nodes[i].name === "tr") {
|
||||
trList.push(nodes[i]);
|
||||
} else {
|
||||
traversal(nodes[i].children || []);
|
||||
}
|
||||
}
|
||||
})(children);
|
||||
for (let row = 1; row <= trList.length; row++) {
|
||||
let col = 1;
|
||||
for (let j = 0; j < trList[row - 1].children.length; j++) {
|
||||
const td = trList[row - 1].children[j];
|
||||
if (td.name === "td" || td.name === "th") {
|
||||
while (map[row + "." + col]) {
|
||||
col++;
|
||||
}
|
||||
let style = td.attrs.style || "";
|
||||
let start = style.indexOf("width") ? style.indexOf(";width") : 0;
|
||||
if (start !== -1) {
|
||||
let end = style.indexOf(";", start + 6);
|
||||
if (end === -1) {
|
||||
end = style.length;
|
||||
}
|
||||
if (!td.attrs.colspan) {
|
||||
width[col] = style.substring(start ? start + 7 : 6, end);
|
||||
}
|
||||
style = style.substr(0, start) + style.substr(end);
|
||||
}
|
||||
style += ";display:flex";
|
||||
start = style.indexOf("vertical-align");
|
||||
if (start !== -1) {
|
||||
const val = style.substr(start + 15, 10);
|
||||
if (val.includes("middle")) {
|
||||
style += ";align-items:center";
|
||||
} else if (val.includes("bottom")) {
|
||||
style += ";align-items:flex-end";
|
||||
}
|
||||
} else {
|
||||
style += ";align-items:center";
|
||||
}
|
||||
start = style.indexOf("text-align");
|
||||
if (start !== -1) {
|
||||
const val = style.substr(start + 11, 10);
|
||||
if (val.includes("center")) {
|
||||
style += ";justify-content: center";
|
||||
} else if (val.includes("right")) {
|
||||
style += ";justify-content: right";
|
||||
}
|
||||
}
|
||||
style = (border ? `;border:${border}px ${borderstyle || "solid"} ${bordercolor || "gray"}` + (spacing ? "" : ";border-right:0;border-bottom:0") : "") + (padding ? `;padding:${padding}px` : "") + ";" + style;
|
||||
if (td.attrs.colspan) {
|
||||
style += `;grid-column-start:${col};grid-column-end:${col + parseInt(td.attrs.colspan)}`;
|
||||
if (!td.attrs.rowspan) {
|
||||
style += `;grid-row-start:${row};grid-row-end:${row + 1}`;
|
||||
}
|
||||
col += parseInt(td.attrs.colspan) - 1;
|
||||
}
|
||||
if (td.attrs.rowspan) {
|
||||
style += `;grid-row-start:${row};grid-row-end:${row + parseInt(td.attrs.rowspan)}`;
|
||||
if (!td.attrs.colspan) {
|
||||
style += `;grid-column-start:${col};grid-column-end:${col + 1}`;
|
||||
}
|
||||
for (let rowspan = 1; rowspan < td.attrs.rowspan; rowspan++) {
|
||||
for (let colspan = 0; colspan < (td.attrs.colspan || 1); colspan++) {
|
||||
map[row + rowspan + "." + (col - colspan)] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (style) {
|
||||
td.attrs.style = style;
|
||||
}
|
||||
cells.push(td);
|
||||
col++;
|
||||
}
|
||||
}
|
||||
if (row === 1) {
|
||||
let temp = "";
|
||||
for (let i = 1; i < col; i++) {
|
||||
temp += (width[i] ? width[i] : "auto") + " ";
|
||||
}
|
||||
styleObj["grid-template-columns"] = temp;
|
||||
}
|
||||
}
|
||||
node.children = cells;
|
||||
} else {
|
||||
if (node.c) {
|
||||
styleObj.display = "table";
|
||||
}
|
||||
if (!isNaN(spacing)) {
|
||||
styleObj["border-spacing"] = spacing + "px";
|
||||
}
|
||||
if (border || padding) {
|
||||
(function traversal(nodes) {
|
||||
for (let i = 0; i < nodes.length; i++) {
|
||||
const td = nodes[i];
|
||||
if (td.name === "th" || td.name === "td") {
|
||||
if (border) {
|
||||
td.attrs.style = `border:${border}px ${borderstyle || "solid"} ${bordercolor || "gray"};${td.attrs.style || ""}`;
|
||||
}
|
||||
if (padding) {
|
||||
td.attrs.style = `padding:${padding}px;${td.attrs.style || ""}`;
|
||||
}
|
||||
} else if (td.children) {
|
||||
traversal(td.children);
|
||||
}
|
||||
}
|
||||
})(children);
|
||||
}
|
||||
}
|
||||
if (this.options.scrollTable && !(attrs.style || "").includes("inline")) {
|
||||
const table = Object.assign({}, node);
|
||||
node.name = "div";
|
||||
node.attrs = {
|
||||
style: "overflow:auto"
|
||||
};
|
||||
node.children = [table];
|
||||
attrs = table.attrs;
|
||||
}
|
||||
} else if ((node.name === "td" || node.name === "th") && (attrs.colspan || attrs.rowspan)) {
|
||||
for (let i = this.stack.length; i--; ) {
|
||||
if (this.stack[i].name === "table") {
|
||||
this.stack[i].flag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (node.name === "ruby") {
|
||||
node.name = "span";
|
||||
for (let i = 0; i < children.length - 1; i++) {
|
||||
if (children[i].type === "text" && children[i + 1].name === "rt") {
|
||||
children[i] = {
|
||||
name: "div",
|
||||
attrs: {
|
||||
style: "display:inline-block;text-align:center"
|
||||
},
|
||||
children: [{
|
||||
name: "div",
|
||||
attrs: {
|
||||
style: "font-size:50%;" + (children[i + 1].attrs.style || "")
|
||||
},
|
||||
children: children[i + 1].children
|
||||
}, children[i]]
|
||||
};
|
||||
children.splice(i + 1, 1);
|
||||
}
|
||||
}
|
||||
} else if (node.c) {
|
||||
(function traversal(node2) {
|
||||
node2.c = 2;
|
||||
for (let i = node2.children.length; i--; ) {
|
||||
const child = node2.children[i];
|
||||
if (child.name && (config.inlineTags[child.name] || (child.attrs.style || "").includes("inline") && child.children) && !child.c) {
|
||||
traversal(child);
|
||||
}
|
||||
if (!child.c || child.name === "table") {
|
||||
node2.c = 1;
|
||||
}
|
||||
}
|
||||
})(node);
|
||||
}
|
||||
if ((styleObj.display || "").includes("flex") && !node.c) {
|
||||
for (let i = children.length; i--; ) {
|
||||
const item = children[i];
|
||||
if (item.f) {
|
||||
item.attrs.style = (item.attrs.style || "") + item.f;
|
||||
item.f = void 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
const flex = parent && ((parent.attrs.style || "").includes("flex") || (parent.attrs.style || "").includes("grid")) && !(node.c && common_vendor.wx$1.getNFCAdapter);
|
||||
if (flex) {
|
||||
node.f = ";max-width:100%";
|
||||
}
|
||||
if (children.length >= 50 && node.c && !(styleObj.display || "").includes("flex")) {
|
||||
mergeNodes(children);
|
||||
}
|
||||
for (const key in styleObj) {
|
||||
if (styleObj[key]) {
|
||||
const val = `;${key}:${styleObj[key].replace(" !important", "")}`;
|
||||
if (flex && (key.includes("flex") && key !== "flex-direction" || key === "align-self" || key.includes("grid") || styleObj[key][0] === "-" || key.includes("width") && val.includes("%"))) {
|
||||
node.f += val;
|
||||
if (key === "width") {
|
||||
attrs.style += ";width:100%";
|
||||
}
|
||||
} else {
|
||||
attrs.style += val;
|
||||
}
|
||||
}
|
||||
}
|
||||
attrs.style = attrs.style.substr(1) || void 0;
|
||||
for (const key in attrs) {
|
||||
if (!attrs[key]) {
|
||||
delete attrs[key];
|
||||
}
|
||||
}
|
||||
};
|
||||
Parser.prototype.onText = function(text) {
|
||||
if (!this.pre) {
|
||||
let trim = "";
|
||||
let flag;
|
||||
for (let i = 0, len = text.length; i < len; i++) {
|
||||
if (!blankChar[text[i]]) {
|
||||
trim += text[i];
|
||||
} else {
|
||||
if (trim[trim.length - 1] !== " ") {
|
||||
trim += " ";
|
||||
}
|
||||
if (text[i] === "\n" && !flag) {
|
||||
flag = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (trim === " ") {
|
||||
if (flag) return;
|
||||
else {
|
||||
const parent = this.stack[this.stack.length - 1];
|
||||
if (parent && parent.name[0] === "t") return;
|
||||
}
|
||||
}
|
||||
text = trim;
|
||||
}
|
||||
const node = /* @__PURE__ */ Object.create(null);
|
||||
node.type = "text";
|
||||
node.text = decodeEntity(text);
|
||||
if (this.hook(node)) {
|
||||
if (this.options.selectable === "force" && system.includes("iOS") && !common_vendor.index.canIUse("rich-text.user-select")) {
|
||||
this.expose();
|
||||
}
|
||||
const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes;
|
||||
siblings.push(node);
|
||||
}
|
||||
};
|
||||
function Lexer(handler) {
|
||||
this.handler = handler;
|
||||
}
|
||||
Lexer.prototype.parse = function(content) {
|
||||
this.content = content || "";
|
||||
this.i = 0;
|
||||
this.start = 0;
|
||||
this.state = this.text;
|
||||
for (let len = this.content.length; this.i !== -1 && this.i < len; ) {
|
||||
this.state();
|
||||
}
|
||||
};
|
||||
Lexer.prototype.checkClose = function(method) {
|
||||
const selfClose = this.content[this.i] === "/";
|
||||
if (this.content[this.i] === ">" || selfClose && this.content[this.i + 1] === ">") {
|
||||
if (method) {
|
||||
this.handler[method](this.content.substring(this.start, this.i));
|
||||
}
|
||||
this.i += selfClose ? 2 : 1;
|
||||
this.start = this.i;
|
||||
this.handler.onOpenTag(selfClose);
|
||||
if (this.handler.tagName === "script") {
|
||||
this.i = this.content.indexOf("</", this.i);
|
||||
if (this.i !== -1) {
|
||||
this.i += 2;
|
||||
this.start = this.i;
|
||||
}
|
||||
this.state = this.endTag;
|
||||
} else {
|
||||
this.state = this.text;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
Lexer.prototype.text = function() {
|
||||
this.i = this.content.indexOf("<", this.i);
|
||||
if (this.i === -1) {
|
||||
if (this.start < this.content.length) {
|
||||
this.handler.onText(this.content.substring(this.start, this.content.length));
|
||||
}
|
||||
return;
|
||||
}
|
||||
const c = this.content[this.i + 1];
|
||||
if (c >= "a" && c <= "z" || c >= "A" && c <= "Z") {
|
||||
if (this.start !== this.i) {
|
||||
this.handler.onText(this.content.substring(this.start, this.i));
|
||||
}
|
||||
this.start = ++this.i;
|
||||
this.state = this.tagName;
|
||||
} else if (c === "/" || c === "!" || c === "?") {
|
||||
if (this.start !== this.i) {
|
||||
this.handler.onText(this.content.substring(this.start, this.i));
|
||||
}
|
||||
const next = this.content[this.i + 2];
|
||||
if (c === "/" && (next >= "a" && next <= "z" || next >= "A" && next <= "Z")) {
|
||||
this.i += 2;
|
||||
this.start = this.i;
|
||||
this.state = this.endTag;
|
||||
return;
|
||||
}
|
||||
let end = "-->";
|
||||
if (c !== "!" || this.content[this.i + 2] !== "-" || this.content[this.i + 3] !== "-") {
|
||||
end = ">";
|
||||
}
|
||||
this.i = this.content.indexOf(end, this.i);
|
||||
if (this.i !== -1) {
|
||||
this.i += end.length;
|
||||
this.start = this.i;
|
||||
}
|
||||
} else {
|
||||
this.i++;
|
||||
}
|
||||
};
|
||||
Lexer.prototype.tagName = function() {
|
||||
if (blankChar[this.content[this.i]]) {
|
||||
this.handler.onTagName(this.content.substring(this.start, this.i));
|
||||
while (blankChar[this.content[++this.i]]) ;
|
||||
if (this.i < this.content.length && !this.checkClose()) {
|
||||
this.start = this.i;
|
||||
this.state = this.attrName;
|
||||
}
|
||||
} else if (!this.checkClose("onTagName")) {
|
||||
this.i++;
|
||||
}
|
||||
};
|
||||
Lexer.prototype.attrName = function() {
|
||||
let c = this.content[this.i];
|
||||
if (blankChar[c] || c === "=") {
|
||||
this.handler.onAttrName(this.content.substring(this.start, this.i));
|
||||
let needVal = c === "=";
|
||||
const len = this.content.length;
|
||||
while (++this.i < len) {
|
||||
c = this.content[this.i];
|
||||
if (!blankChar[c]) {
|
||||
if (this.checkClose()) return;
|
||||
if (needVal) {
|
||||
this.start = this.i;
|
||||
this.state = this.attrVal;
|
||||
return;
|
||||
}
|
||||
if (this.content[this.i] === "=") {
|
||||
needVal = true;
|
||||
} else {
|
||||
this.start = this.i;
|
||||
this.state = this.attrName;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (!this.checkClose("onAttrName")) {
|
||||
this.i++;
|
||||
}
|
||||
};
|
||||
Lexer.prototype.attrVal = function() {
|
||||
const c = this.content[this.i];
|
||||
const len = this.content.length;
|
||||
if (c === '"' || c === "'") {
|
||||
this.start = ++this.i;
|
||||
this.i = this.content.indexOf(c, this.i);
|
||||
if (this.i === -1) return;
|
||||
this.handler.onAttrVal(this.content.substring(this.start, this.i));
|
||||
} else {
|
||||
for (; this.i < len; this.i++) {
|
||||
if (blankChar[this.content[this.i]]) {
|
||||
this.handler.onAttrVal(this.content.substring(this.start, this.i));
|
||||
break;
|
||||
} else if (this.checkClose("onAttrVal")) return;
|
||||
}
|
||||
}
|
||||
while (blankChar[this.content[++this.i]]) ;
|
||||
if (this.i < len && !this.checkClose()) {
|
||||
this.start = this.i;
|
||||
this.state = this.attrName;
|
||||
}
|
||||
};
|
||||
Lexer.prototype.endTag = function() {
|
||||
const c = this.content[this.i];
|
||||
if (blankChar[c] || c === ">" || c === "/") {
|
||||
this.handler.onCloseTag(this.content.substring(this.start, this.i));
|
||||
if (c !== ">") {
|
||||
this.i = this.content.indexOf(">", this.i);
|
||||
if (this.i === -1) return;
|
||||
}
|
||||
this.start = ++this.i;
|
||||
this.state = this.text;
|
||||
} else {
|
||||
this.i++;
|
||||
}
|
||||
};
|
||||
exports.Parser = Parser;
|
||||
@@ -0,0 +1,267 @@
|
||||
"use strict";
|
||||
const common_vendor = require("../../../../common/vendor.js");
|
||||
const uni_modules_uvParse_components_uvParse_parser = require("./parser.js");
|
||||
const node = () => "./node/node.js";
|
||||
const plugins = [];
|
||||
const _sfc_main = {
|
||||
name: "uv-parse",
|
||||
data() {
|
||||
return {
|
||||
nodes: []
|
||||
};
|
||||
},
|
||||
props: {
|
||||
containerStyle: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
content: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
copyLink: {
|
||||
type: [Boolean, String],
|
||||
default: true
|
||||
},
|
||||
domain: String,
|
||||
errorImg: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
lazyLoad: {
|
||||
type: [Boolean, String],
|
||||
default: false
|
||||
},
|
||||
loadingImg: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
pauseVideo: {
|
||||
type: [Boolean, String],
|
||||
default: true
|
||||
},
|
||||
previewImg: {
|
||||
type: [Boolean, String],
|
||||
default: true
|
||||
},
|
||||
scrollTable: [Boolean, String],
|
||||
selectable: [Boolean, String],
|
||||
setTitle: {
|
||||
type: [Boolean, String],
|
||||
default: true
|
||||
},
|
||||
showImgMenu: {
|
||||
type: [Boolean, String],
|
||||
default: true
|
||||
},
|
||||
tagStyle: Object,
|
||||
useAnchor: [Boolean, Number]
|
||||
},
|
||||
emits: ["load", "ready", "imgtap", "linktap", "play", "error"],
|
||||
components: {
|
||||
node
|
||||
},
|
||||
watch: {
|
||||
content(content) {
|
||||
this.setContent(content);
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.plugins = [];
|
||||
for (let i = plugins.length; i--; ) {
|
||||
this.plugins.push(new plugins[i](this));
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
if (this.content && !this.nodes.length) {
|
||||
this.setContent(this.content);
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
this._hook("onDetached");
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* @description 将锚点跳转的范围限定在一个 scroll-view 内
|
||||
* @param {Object} page scroll-view 所在页面的示例
|
||||
* @param {String} selector scroll-view 的选择器
|
||||
* @param {String} scrollTop scroll-view scroll-top 属性绑定的变量名
|
||||
*/
|
||||
in(page, selector, scrollTop) {
|
||||
if (page && selector && scrollTop) {
|
||||
this._in = {
|
||||
page,
|
||||
selector,
|
||||
scrollTop
|
||||
};
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @description 锚点跳转
|
||||
* @param {String} id 要跳转的锚点 id
|
||||
* @param {Number} offset 跳转位置的偏移量
|
||||
* @returns {Promise}
|
||||
*/
|
||||
navigateTo(id, offset) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!this.useAnchor) {
|
||||
reject(Error("Anchor is disabled"));
|
||||
return;
|
||||
}
|
||||
offset = offset || parseInt(this.useAnchor) || 0;
|
||||
let deep = " ";
|
||||
deep = ">>>";
|
||||
const selector = common_vendor.index.createSelectorQuery().in(this._in ? this._in.page : this).select((this._in ? this._in.selector : "._root") + (id ? `${deep}#${id}` : "")).boundingClientRect();
|
||||
if (this._in) {
|
||||
selector.select(this._in.selector).scrollOffset().select(this._in.selector).boundingClientRect();
|
||||
} else {
|
||||
selector.selectViewport().scrollOffset();
|
||||
}
|
||||
selector.exec((res) => {
|
||||
if (!res[0]) {
|
||||
reject(Error("Label not found"));
|
||||
return;
|
||||
}
|
||||
const scrollTop = res[1].scrollTop + res[0].top - (res[2] ? res[2].top : 0) + offset;
|
||||
if (this._in) {
|
||||
this._in.page[this._in.scrollTop] = scrollTop;
|
||||
} else {
|
||||
common_vendor.index.pageScrollTo({
|
||||
scrollTop,
|
||||
duration: 300
|
||||
});
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
},
|
||||
/**
|
||||
* @description 获取文本内容
|
||||
* @return {String}
|
||||
*/
|
||||
getText(nodes) {
|
||||
let text = "";
|
||||
(function traversal(nodes2) {
|
||||
for (let i = 0; i < nodes2.length; i++) {
|
||||
const node2 = nodes2[i];
|
||||
if (node2.type === "text") {
|
||||
text += node2.text.replace(/&/g, "&");
|
||||
} else if (node2.name === "br") {
|
||||
text += "\n";
|
||||
} else {
|
||||
const isBlock = node2.name === "p" || node2.name === "div" || node2.name === "tr" || node2.name === "li" || node2.name[0] === "h" && node2.name[1] > "0" && node2.name[1] < "7";
|
||||
if (isBlock && text && text[text.length - 1] !== "\n") {
|
||||
text += "\n";
|
||||
}
|
||||
if (node2.children) {
|
||||
traversal(node2.children);
|
||||
}
|
||||
if (isBlock && text[text.length - 1] !== "\n") {
|
||||
text += "\n";
|
||||
} else if (node2.name === "td" || node2.name === "th") {
|
||||
text += " ";
|
||||
}
|
||||
}
|
||||
}
|
||||
})(nodes || this.nodes);
|
||||
return text;
|
||||
},
|
||||
/**
|
||||
* @description 获取内容大小和位置
|
||||
* @return {Promise}
|
||||
*/
|
||||
getRect() {
|
||||
return new Promise((resolve, reject) => {
|
||||
common_vendor.index.createSelectorQuery().in(this).select("#_root").boundingClientRect().exec((res) => res[0] ? resolve(res[0]) : reject(Error("Root label not found")));
|
||||
});
|
||||
},
|
||||
/**
|
||||
* @description 暂停播放媒体
|
||||
*/
|
||||
pauseMedia() {
|
||||
for (let i = (this._videos || []).length; i--; ) {
|
||||
this._videos[i].pause();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @description 设置媒体播放速率
|
||||
* @param {Number} rate 播放速率
|
||||
*/
|
||||
setPlaybackRate(rate) {
|
||||
this.playbackRate = rate;
|
||||
for (let i = (this._videos || []).length; i--; ) {
|
||||
this._videos[i].playbackRate(rate);
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @description 设置内容
|
||||
* @param {String} content html 内容
|
||||
* @param {Boolean} append 是否在尾部追加
|
||||
*/
|
||||
setContent(content, append) {
|
||||
if (!append || !this.imgList) {
|
||||
this.imgList = [];
|
||||
}
|
||||
const nodes = new uni_modules_uvParse_components_uvParse_parser.Parser(this).parse(content);
|
||||
this.$set(this, "nodes", append ? (this.nodes || []).concat(nodes) : nodes);
|
||||
this._videos = [];
|
||||
this.$nextTick(() => {
|
||||
this._hook("onLoad");
|
||||
this.$emit("load");
|
||||
});
|
||||
if (this.lazyLoad || this.imgList._unloadimgs < this.imgList.length / 2) {
|
||||
let height = 0;
|
||||
const callback = (rect) => {
|
||||
if (!rect || !rect.height) rect = {};
|
||||
if (rect.height === height) {
|
||||
this.$emit("ready", rect);
|
||||
} else {
|
||||
height = rect.height;
|
||||
setTimeout(() => {
|
||||
this.getRect().then(callback).catch(callback);
|
||||
}, 350);
|
||||
}
|
||||
};
|
||||
this.getRect().then(callback).catch(callback);
|
||||
} else {
|
||||
if (!this.imgList._unloadimgs) {
|
||||
this.getRect().then((rect) => {
|
||||
this.$emit("ready", rect);
|
||||
}).catch(() => {
|
||||
this.$emit("ready", {});
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @description 调用插件钩子函数
|
||||
*/
|
||||
_hook(name) {
|
||||
for (let i = plugins.length; i--; ) {
|
||||
if (this.plugins[i][name]) {
|
||||
this.plugins[i][name]();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
if (!Array) {
|
||||
const _component_node = common_vendor.resolveComponent("node");
|
||||
_component_node();
|
||||
}
|
||||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||||
return common_vendor.e({
|
||||
a: !$data.nodes[0]
|
||||
}, !$data.nodes[0] ? {} : {
|
||||
b: common_vendor.p({
|
||||
childs: $data.nodes,
|
||||
opts: [$props.lazyLoad, $props.loadingImg, $props.errorImg, $props.showImgMenu, $props.selectable],
|
||||
name: "span"
|
||||
})
|
||||
}, {
|
||||
c: common_vendor.n(($props.selectable ? "_select " : "") + "_root"),
|
||||
d: common_vendor.s($props.containerStyle)
|
||||
});
|
||||
}
|
||||
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "/Users/gxwebsoft/APP/gxtyzx-uniapp-cli/src/uni_modules/uv-parse/components/uv-parse/uv-parse.vue"]]);
|
||||
wx.createComponent(Component);
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"component": true,
|
||||
"usingComponents": {
|
||||
"node": "./node/node"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<view id="_root" class="{{c}}" style="{{d}}"><slot wx:if="{{a}}"/><node wx:else u-i="31b4f8b2-0" bind:__l="__l" u-p="{{b||''}}"/></view>
|
||||
@@ -0,0 +1,17 @@
|
||||
|
||||
|
||||
/* 根节点样式 */
|
||||
._root {
|
||||
padding: 1px 0;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
/* 长按复制 */
|
||||
._select {
|
||||
-webkit-user-select: text;
|
||||
-moz-user-select: text;
|
||||
user-select: text;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user