shop-live/static/we7/resource/js/htmlToWxml.js

203 lines
7.9 KiB
JavaScript

var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/, endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/, attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g, empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr"), block = makeMap("a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video"), inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"), closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"), fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"), special = makeMap("script,style"), HTMLParser = function(e, n) {
var t, a, r, s = [], i = e;
for (s.last = function() {
return this[this.length - 1];
}; e; ) {
if (a = !0, s.last() && special[s.last()]) e = e.replace(new RegExp("([\\s\\S]*?)</" + s.last() + "[^>]*>"), function(e, t) {
return t = t.replace(/<!--([\s\S]*?)-->|<!\[CDATA\[([\s\S]*?)]]>/g, "$1$2"), n.chars && n.chars(t),
"";
}), c("", s.last()); else if (0 == e.indexOf("\x3c!--") ? 0 <= (t = e.indexOf("--\x3e")) && (n.comment && n.comment(e.substring(4, t)),
e = e.substring(t + 3), a = !1) : 0 == e.indexOf("</") ? (r = e.match(endTag)) && (e = e.substring(r[0].length),
r[0].replace(endTag, c), a = !1) : 0 == e.indexOf("<") && (r = e.match(startTag)) && (e = e.substring(r[0].length),
r[0].replace(startTag, o), a = !1), a) {
var l = (t = e.indexOf("<")) < 0 ? e : e.substring(0, t);
e = t < 0 ? "" : e.substring(t), n.chars && n.chars(l);
}
if (e == i) throw "Parse Error: " + e;
i = e;
}
function o(e, t, a, r) {
if (t = t.toLowerCase(), block[t]) for (;s.last() && inline[s.last()]; ) c("", s.last());
if (closeSelf[t] && s.last() == t && c("", t), (r = empty[t] || !!r) || s.push(t),
n.start) {
var i = [];
a.replace(attr, function(e, t) {
var a = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? arguments[4] : fillAttrs[t] ? t : "";
i.push({
name: t,
value: a,
escaped: a.replace(/(^|[^\\])"/g, '$1\\"')
});
}), n.start && n.start(t, i, r);
}
}
function c(e, t) {
if (t) for (a = s.length - 1; 0 <= a && s[a] != t; a--) ; else var a = 0;
if (0 <= a) {
for (var r = s.length - 1; a <= r; r--) n.end && n.end(s[r]);
s.length = a;
}
}
c();
};
function makeMap(e) {
for (var t = {}, a = e.split(","), r = 0; r < a.length; r++) t[a[r]] = !0;
return t;
}
var global = {}, debug = function() {};
function q(e) {
return '"' + e + '"';
}
function removeDOCTYPE(e) {
return e.replace(/<\?xml.*\?>\n/, "").replace(/<!doctype.*\>\n/, "").replace(/<!DOCTYPE.*\>\n/, "");
}
global.html2json = function(e) {
e = removeDOCTYPE(e);
var n = [], s = {
node: "root",
child: []
};
return HTMLParser(e, {
start: function(e, t, a) {
debug(e, t, a);
var r = {
node: "element",
tag: e
};
if (0 !== t.length && (r.attr = t.reduce(function(e, t) {
var a = t.name, r = t.value;
return r.match(/ /) && (r = r.split(" ")), e[a] ? Array.isArray(e[a]) ? e[a].push(r) : e[a] = [ e[a], r ] : e[a] = r,
e;
}, {})), a) {
var i = n[0] || s;
void 0 === i.child && (i.child = []), i.child.push(r);
} else n.unshift(r);
},
end: function(e) {
debug(e);
var t = n.shift();
if (t.tag !== e && console.error("invalid state: mismatch end tag"), 0 === n.length) s.child.push(t); else {
var a = n[0];
void 0 === a.child && (a.child = []), a.child.push(t);
}
},
chars: function(e) {
debug(e);
var t = {
node: "text",
text: e
};
if (0 === n.length) s.child.push(t); else {
var a = n[0];
void 0 === a.child && (a.child = []), a.child.push(t);
}
},
comment: function(e) {
debug(e);
var t = {
node: "comment",
text: e
}, a = n[0];
void 0 === a.child && (a.child = []), a.child.push(t);
}
}), s;
}, global.json2html = function t(a) {
var e = "";
a.child && (e = a.child.map(function(e) {
return t(e);
}).join(""));
var r = "";
if (a.attr && "" !== (r = Object.keys(a.attr).map(function(e) {
var t = a.attr[e];
return Array.isArray(t) && (t = t.join(" ")), e + "=" + q(t);
}).join(" ")) && (r = " " + r), "element" === a.node) {
var i = a.tag;
return -1 < [ "area", "base", "basefont", "br", "col", "frame", "hr", "img", "input", "isindex", "link", "meta", "param", "embed" ].indexOf(i) ? "<" + a.tag + r + "/>" : "<" + a.tag + r + ">" + e + ("</" + a.tag + ">");
}
return "text" === a.node ? a.text : "comment" === a.node ? "\x3c!--" + a.text + "--\x3e" : "root" === a.node ? e : void 0;
};
var html2wxwebview = function(e) {
var t = global.html2json(e);
return t = parseHtmlNode(t), t = arrangeNode(t);
}, arrangeNode = function(e) {
for (var t = [], a = [], r = 0, i = e.length; r < i; r++) if (0 == r) {
if ("view" == e[r].type) continue;
t.push(e[r]);
} else if ("view" == e[r].type) {
if (0 < t.length) {
var n = {
type: "view",
child: t
};
a.push(n);
}
t = [];
} else if ("img" == e[r].type) {
if (0 < t.length) {
n = {
type: "view",
child: t
};
a.push(n);
}
var s = e[r].attr;
e[r].attr.width && -1 === e[r].attr.width.indexOf("%") && -1 === e[r].attr.width.indexOf("px") && (e[r].attr.width = e[r].attr.width + "px"),
e[r].attr.height && -1 === e[r].attr.height.indexOf("%") && -1 === e[r].attr.height.indexOf("px") && (e[r].attr.height = e[r].attr.height + "px");
n = {
type: "img",
attr: s
};
a.push(n), t = [];
} else if (t.push(e[r]), r == i - 1) {
n = {
type: "view",
child: t
};
a.push(n);
}
return a;
}, parseHtmlNode = function(e) {
var n = [];
return function e(t) {
var a = {};
if ("root" == t.node) ; else if ("element" == t.node) switch (t.tag) {
case "a":
a = {
type: "a",
text: t.child[0].text
};
break;
case "img":
a = {
type: "img",
text: t.text
};
break;
case "p":
case "div":
a = {
type: "view",
text: t.text
};
} else "text" == t.node && (a = {
type: "text",
text: t.text
});
if (t.attr && (a.attr = t.attr), 0 != Object.keys(a).length && n.push(a), "a" != t.tag) {
var r = t.child;
if (r) for (var i in r) e(r[i]);
}
}(e), n;
};
module.exports = {
html2json: html2wxwebview
};