Initial commit
This commit is contained in:
266
components/gaoyia-parse/libs/html2json.js
Normal file
266
components/gaoyia-parse/libs/html2json.js
Normal file
@@ -0,0 +1,266 @@
|
||||
/**
|
||||
* html2Json 改造来自: https://github.com/Jxck/html2json
|
||||
*
|
||||
*
|
||||
* author: Di (微信小程序开发工程师)
|
||||
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
|
||||
* 垂直微信小程序开发交流社区
|
||||
*
|
||||
* github地址: https://github.com/icindy/wxParse
|
||||
*
|
||||
* for: 微信小程序富文本解析
|
||||
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
|
||||
*/
|
||||
|
||||
import wxDiscode from "./wxDiscode";
|
||||
import HTMLParser from "./htmlparser";
|
||||
|
||||
function makeMap(str) {
|
||||
const obj = {};
|
||||
const items = str.split(",");
|
||||
for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
|
||||
return obj;
|
||||
}
|
||||
|
||||
// Block Elements - HTML 5
|
||||
const block = makeMap(
|
||||
"br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video",
|
||||
);
|
||||
|
||||
// Inline Elements - HTML 5
|
||||
const inline = makeMap(
|
||||
"a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var",
|
||||
);
|
||||
|
||||
// Elements that you can, intentionally, leave open
|
||||
// (and which close themselves)
|
||||
const closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");
|
||||
|
||||
function removeDOCTYPE(html) {
|
||||
const isDocument = /<body.*>([^]*)<\/body>/.test(html);
|
||||
return isDocument ? RegExp.$1 : html;
|
||||
}
|
||||
|
||||
function trimHtml(html) {
|
||||
return html
|
||||
.replace(/<!--.*?-->/gi, "")
|
||||
.replace(/\/\*.*?\*\//gi, "")
|
||||
.replace(/[ ]+</gi, "<")
|
||||
.replace(/<script[^]*<\/script>/gi, "")
|
||||
.replace(/<style[^]*<\/style>/gi, "");
|
||||
}
|
||||
|
||||
function getScreenInfo() {
|
||||
const screen = {};
|
||||
wx.getSystemInfo({
|
||||
success: (res) => {
|
||||
screen.width = res.windowWidth;
|
||||
screen.height = res.windowHeight;
|
||||
},
|
||||
});
|
||||
return screen;
|
||||
}
|
||||
|
||||
function html2json(html, customHandler, imageProp, host) {
|
||||
// 处理字符串
|
||||
html = removeDOCTYPE(html);
|
||||
html = trimHtml(html);
|
||||
html = wxDiscode.strDiscode(html);
|
||||
// 生成node节点
|
||||
const bufArray = [];
|
||||
const results = {
|
||||
nodes: [],
|
||||
imageUrls: [],
|
||||
};
|
||||
|
||||
const screen = getScreenInfo();
|
||||
function Node(tag) {
|
||||
this.node = "element";
|
||||
this.tag = tag;
|
||||
|
||||
this.$screen = screen;
|
||||
}
|
||||
|
||||
HTMLParser(html, {
|
||||
start(tag, attrs, unary) {
|
||||
// node for this element
|
||||
const node = new Node(tag);
|
||||
|
||||
if (bufArray.length !== 0) {
|
||||
const parent = bufArray[0];
|
||||
if (parent.nodes === undefined) {
|
||||
parent.nodes = [];
|
||||
}
|
||||
}
|
||||
|
||||
if (block[tag]) {
|
||||
node.tagType = "block";
|
||||
} else if (inline[tag]) {
|
||||
node.tagType = "inline";
|
||||
} else if (closeSelf[tag]) {
|
||||
node.tagType = "closeSelf";
|
||||
}
|
||||
|
||||
node.attr = attrs.reduce((pre, attr) => {
|
||||
const { name } = attr;
|
||||
let { value } = attr;
|
||||
if (name === "class") {
|
||||
node.classStr = value;
|
||||
}
|
||||
// has multi attibutes
|
||||
// make it array of attribute
|
||||
if (name === "style") {
|
||||
node.styleStr = value;
|
||||
}
|
||||
if (value.match(/ /)) {
|
||||
value = value.split(" ");
|
||||
}
|
||||
|
||||
// if attr already exists
|
||||
// merge it
|
||||
if (pre[name]) {
|
||||
if (Array.isArray(pre[name])) {
|
||||
// already array, push to last
|
||||
pre[name].push(value);
|
||||
} else {
|
||||
// single value, make it array
|
||||
pre[name] = [pre[name], value];
|
||||
}
|
||||
} else {
|
||||
// not exist, put it
|
||||
pre[name] = value;
|
||||
}
|
||||
|
||||
return pre;
|
||||
}, {});
|
||||
|
||||
// 优化样式相关属性
|
||||
if (node.classStr) {
|
||||
node.classStr += ` ${node.tag}`;
|
||||
} else {
|
||||
node.classStr = node.tag;
|
||||
}
|
||||
if (node.tagType === "inline") {
|
||||
node.classStr += " inline";
|
||||
}
|
||||
|
||||
// 对img添加额外数据
|
||||
if (node.tag === "img") {
|
||||
let imgUrl = node.attr.src;
|
||||
imgUrl = wxDiscode.urlToHttpUrl(imgUrl, imageProp.domain);
|
||||
Object.assign(node.attr, imageProp, {
|
||||
src: imgUrl || "",
|
||||
});
|
||||
if (imgUrl) {
|
||||
results.imageUrls.push(imgUrl);
|
||||
}
|
||||
}
|
||||
|
||||
// 处理a标签属性
|
||||
if (node.tag === "a") {
|
||||
node.attr.href = node.attr.href || "";
|
||||
}
|
||||
|
||||
// 处理font标签样式属性
|
||||
if (node.tag === "font") {
|
||||
const fontSize = [
|
||||
"x-small",
|
||||
"small",
|
||||
"medium",
|
||||
"large",
|
||||
"x-large",
|
||||
"xx-large",
|
||||
"-webkit-xxx-large",
|
||||
];
|
||||
const styleAttrs = {
|
||||
color: "color",
|
||||
face: "font-family",
|
||||
size: "font-size",
|
||||
};
|
||||
if (!node.styleStr) node.styleStr = "";
|
||||
Object.keys(styleAttrs).forEach((key) => {
|
||||
if (node.attr[key]) {
|
||||
const value =
|
||||
key === "size" ? fontSize[node.attr[key] - 1] : node.attr[key];
|
||||
node.styleStr += `${styleAttrs[key]}: ${value};`;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 临时记录source资源
|
||||
if (node.tag === "source") {
|
||||
results.source = node.attr.src;
|
||||
}
|
||||
|
||||
if (customHandler.start) {
|
||||
customHandler.start(node, results);
|
||||
}
|
||||
|
||||
if (unary) {
|
||||
// if this tag doesn't have end tag
|
||||
// like <img src="hoge.png"/>
|
||||
// add to parents
|
||||
const parent = bufArray[0] || results;
|
||||
if (parent.nodes === undefined) {
|
||||
parent.nodes = [];
|
||||
}
|
||||
parent.nodes.push(node);
|
||||
} else {
|
||||
bufArray.unshift(node);
|
||||
}
|
||||
},
|
||||
end(tag) {
|
||||
// merge into parent tag
|
||||
const node = bufArray.shift();
|
||||
if (node.tag !== tag) {
|
||||
console.error("invalid state: mismatch end tag");
|
||||
}
|
||||
|
||||
// 当有缓存source资源时于于video补上src资源
|
||||
if (node.tag === "video" && results.source) {
|
||||
node.attr.src = results.source;
|
||||
delete results.source;
|
||||
}
|
||||
|
||||
if (customHandler.end) {
|
||||
customHandler.end(node, results);
|
||||
}
|
||||
|
||||
if (bufArray.length === 0) {
|
||||
results.nodes.push(node);
|
||||
} else {
|
||||
const parent = bufArray[0];
|
||||
if (!parent.nodes) {
|
||||
parent.nodes = [];
|
||||
}
|
||||
parent.nodes.push(node);
|
||||
}
|
||||
},
|
||||
chars(text) {
|
||||
if (!text.trim()) return;
|
||||
|
||||
const node = {
|
||||
node: "text",
|
||||
text,
|
||||
};
|
||||
|
||||
if (customHandler.chars) {
|
||||
customHandler.chars(node, results);
|
||||
}
|
||||
|
||||
if (bufArray.length === 0) {
|
||||
results.nodes.push(node);
|
||||
} else {
|
||||
const parent = bufArray[0];
|
||||
if (parent.nodes === undefined) {
|
||||
parent.nodes = [];
|
||||
}
|
||||
parent.nodes.push(node);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
export default html2json;
|
||||
170
components/gaoyia-parse/libs/htmlparser.js
Normal file
170
components/gaoyia-parse/libs/htmlparser.js
Normal file
@@ -0,0 +1,170 @@
|
||||
/**
|
||||
*
|
||||
* htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser
|
||||
*
|
||||
* author: Di (微信小程序开发工程师)
|
||||
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
|
||||
* 垂直微信小程序开发交流社区
|
||||
*
|
||||
* github地址: https://github.com/icindy/wxParse
|
||||
*
|
||||
* for: 微信小程序富文本解析
|
||||
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
|
||||
*/
|
||||
// Regular Expressions for parsing tags and attributes
|
||||
|
||||
const startTag =
|
||||
/^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
|
||||
const endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
|
||||
const attr =
|
||||
/([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
|
||||
|
||||
function makeMap(str) {
|
||||
const obj = {};
|
||||
const items = str.split(",");
|
||||
for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
|
||||
return obj;
|
||||
}
|
||||
|
||||
// Empty Elements - HTML 5
|
||||
const empty = makeMap(
|
||||
"area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr",
|
||||
);
|
||||
|
||||
// Block Elements - HTML 5
|
||||
const block = makeMap(
|
||||
"address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video",
|
||||
);
|
||||
|
||||
// Inline Elements - HTML 5
|
||||
const inline = makeMap(
|
||||
"a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var",
|
||||
);
|
||||
|
||||
// Elements that you can, intentionally, leave open
|
||||
// (and which close themselves)
|
||||
const closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");
|
||||
|
||||
// Attributes that have their values filled in disabled="disabled"
|
||||
const fillAttrs = makeMap(
|
||||
"checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected",
|
||||
);
|
||||
|
||||
function HTMLParser(html, handler) {
|
||||
let index;
|
||||
let chars;
|
||||
let match;
|
||||
let last = html;
|
||||
const stack = [];
|
||||
|
||||
stack.last = () => stack[stack.length - 1];
|
||||
|
||||
function parseEndTag(tag, tagName) {
|
||||
// If no tag name is provided, clean shop
|
||||
let pos;
|
||||
if (!tagName) {
|
||||
pos = 0;
|
||||
} else {
|
||||
// Find the closest opened tag of the same type
|
||||
tagName = tagName.toLowerCase();
|
||||
for (pos = stack.length - 1; pos >= 0; pos -= 1) {
|
||||
if (stack[pos] === tagName) break;
|
||||
}
|
||||
}
|
||||
if (pos >= 0) {
|
||||
// Close all the open elements, up the stack
|
||||
for (let i = stack.length - 1; i >= pos; i -= 1) {
|
||||
if (handler.end) handler.end(stack[i]);
|
||||
}
|
||||
|
||||
// Remove the open elements from the stack
|
||||
stack.length = pos;
|
||||
}
|
||||
}
|
||||
|
||||
function parseStartTag(tag, tagName, rest, unary) {
|
||||
tagName = tagName.toLowerCase();
|
||||
|
||||
if (block[tagName]) {
|
||||
while (stack.last() && inline[stack.last()]) {
|
||||
parseEndTag("", stack.last());
|
||||
}
|
||||
}
|
||||
|
||||
if (closeSelf[tagName] && stack.last() === tagName) {
|
||||
parseEndTag("", tagName);
|
||||
}
|
||||
|
||||
unary = empty[tagName] || !!unary;
|
||||
|
||||
if (!unary) stack.push(tagName);
|
||||
|
||||
if (handler.start) {
|
||||
const attrs = [];
|
||||
|
||||
rest.replace(attr, function genAttr(matches, name) {
|
||||
const value =
|
||||
arguments[2] ||
|
||||
arguments[3] ||
|
||||
arguments[4] ||
|
||||
(fillAttrs[name] ? name : "");
|
||||
|
||||
attrs.push({
|
||||
name,
|
||||
value,
|
||||
escaped: value.replace(/(^|[^\\])"/g, '$1\\"'), // "
|
||||
});
|
||||
});
|
||||
|
||||
if (handler.start) {
|
||||
handler.start(tagName, attrs, unary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (html) {
|
||||
chars = true;
|
||||
|
||||
if (html.indexOf("</") === 0) {
|
||||
match = html.match(endTag);
|
||||
|
||||
if (match) {
|
||||
html = html.substring(match[0].length);
|
||||
match[0].replace(endTag, parseEndTag);
|
||||
chars = false;
|
||||
}
|
||||
|
||||
// start tag
|
||||
} else if (html.indexOf("<") === 0) {
|
||||
match = html.match(startTag);
|
||||
|
||||
if (match) {
|
||||
html = html.substring(match[0].length);
|
||||
match[0].replace(startTag, parseStartTag);
|
||||
chars = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (chars) {
|
||||
index = html.indexOf("<");
|
||||
let text = "";
|
||||
while (index === 0) {
|
||||
text += "<";
|
||||
html = html.substring(1);
|
||||
index = html.indexOf("<");
|
||||
}
|
||||
text += index < 0 ? html : html.substring(0, index);
|
||||
html = index < 0 ? "" : html.substring(index);
|
||||
|
||||
if (handler.chars) handler.chars(text);
|
||||
}
|
||||
|
||||
if (html === last) throw new Error(`Parse Error: ${html}`);
|
||||
last = html;
|
||||
}
|
||||
|
||||
// Clean up any remaining tags
|
||||
parseEndTag();
|
||||
}
|
||||
|
||||
export default HTMLParser;
|
||||
227
components/gaoyia-parse/libs/wxDiscode.js
Normal file
227
components/gaoyia-parse/libs/wxDiscode.js
Normal file
@@ -0,0 +1,227 @@
|
||||
// HTML 支持的数学符号
|
||||
function strNumDiscode(str) {
|
||||
str = str.replace(/∀|∀|∀/g, "∀");
|
||||
str = str.replace(/∂|∂|∂/g, "∂");
|
||||
str = str.replace(/∃|∃|∃/g, "∃");
|
||||
str = str.replace(/∅|∅|∅/g, "∅");
|
||||
str = str.replace(/∇|∇|∇/g, "∇");
|
||||
str = str.replace(/∈|∈|∈/g, "∈");
|
||||
str = str.replace(/∉|∉|∉/g, "∉");
|
||||
str = str.replace(/∋|∋|∋/g, "∋");
|
||||
str = str.replace(/∏|∏|∏/g, "∏");
|
||||
str = str.replace(/∑|∑|∑/g, "∑");
|
||||
str = str.replace(/−|−|−/g, "−");
|
||||
str = str.replace(/∗|∗|∗/g, "∗");
|
||||
str = str.replace(/√|√|√/g, "√");
|
||||
str = str.replace(/∝|∝|∝/g, "∝");
|
||||
str = str.replace(/∞|∞|∞/g, "∞");
|
||||
str = str.replace(/∠|∠|∠/g, "∠");
|
||||
str = str.replace(/∧|∧|∧/g, "∧");
|
||||
str = str.replace(/∨|∨|∨/g, "∨");
|
||||
str = str.replace(/∩|∩|∩/g, "∩");
|
||||
str = str.replace(/∪|∪|∪/g, "∪");
|
||||
str = str.replace(/∫|∫|∫/g, "∫");
|
||||
str = str.replace(/∴|∴|∴/g, "∴");
|
||||
str = str.replace(/∼|∼|∼/g, "∼");
|
||||
str = str.replace(/≅|≅|≅/g, "≅");
|
||||
str = str.replace(/≈|≈|≈/g, "≈");
|
||||
str = str.replace(/≠|≠|≠/g, "≠");
|
||||
str = str.replace(/≤|≤|≤/g, "≤");
|
||||
str = str.replace(/≥|≥|≥/g, "≥");
|
||||
str = str.replace(/⊂|⊂|⊂/g, "⊂");
|
||||
str = str.replace(/⊃|⊃|⊃/g, "⊃");
|
||||
str = str.replace(/⊄|⊄|⊄/g, "⊄");
|
||||
str = str.replace(/⊆|⊆|⊆/g, "⊆");
|
||||
str = str.replace(/⊇|⊇|⊇/g, "⊇");
|
||||
str = str.replace(/⊕|⊕|⊕/g, "⊕");
|
||||
str = str.replace(/⊗|⊗|⊗/g, "⊗");
|
||||
str = str.replace(/⊥|⊥|⊥/g, "⊥");
|
||||
str = str.replace(/⋅|⋅|⋅/g, "⋅");
|
||||
return str;
|
||||
}
|
||||
|
||||
// HTML 支持的希腊字母
|
||||
function strGreeceDiscode(str) {
|
||||
str = str.replace(/Α|Α|Α/g, "Α");
|
||||
str = str.replace(/Β|Β|Β/g, "Β");
|
||||
str = str.replace(/Γ|Γ|Γ/g, "Γ");
|
||||
str = str.replace(/Δ|Δ|Δ/g, "Δ");
|
||||
str = str.replace(/Ε|Ε|Ε/g, "Ε");
|
||||
str = str.replace(/Ζ|Ζ|Ζ/g, "Ζ");
|
||||
str = str.replace(/Η|Η|Η/g, "Η");
|
||||
str = str.replace(/Θ|Θ|Θ/g, "Θ");
|
||||
str = str.replace(/Ι|Ι|Ι/g, "Ι");
|
||||
str = str.replace(/Κ|Κ|Κ/g, "Κ");
|
||||
str = str.replace(/Λ|Λ|Λ/g, "Λ");
|
||||
str = str.replace(/Μ|Μ|Μ/g, "Μ");
|
||||
str = str.replace(/Ν|Ν|Ν/g, "Ν");
|
||||
str = str.replace(/Ξ|Ν|Ν/g, "Ν");
|
||||
str = str.replace(/Ο|Ο|Ο/g, "Ο");
|
||||
str = str.replace(/Π|Π|Π/g, "Π");
|
||||
str = str.replace(/Ρ|Ρ|Ρ/g, "Ρ");
|
||||
str = str.replace(/Σ|Σ|Σ/g, "Σ");
|
||||
str = str.replace(/Τ|Τ|Τ/g, "Τ");
|
||||
str = str.replace(/Υ|Υ|Υ/g, "Υ");
|
||||
str = str.replace(/Φ|Φ|Φ/g, "Φ");
|
||||
str = str.replace(/Χ|Χ|Χ/g, "Χ");
|
||||
str = str.replace(/Ψ|Ψ|Ψ/g, "Ψ");
|
||||
str = str.replace(/Ω|Ω|Ω/g, "Ω");
|
||||
|
||||
str = str.replace(/α|α|α/g, "α");
|
||||
str = str.replace(/β|β|β/g, "β");
|
||||
str = str.replace(/γ|γ|γ/g, "γ");
|
||||
str = str.replace(/δ|δ|δ/g, "δ");
|
||||
str = str.replace(/ε|ε|ε/g, "ε");
|
||||
str = str.replace(/ζ|ζ|ζ/g, "ζ");
|
||||
str = str.replace(/η|η|η/g, "η");
|
||||
str = str.replace(/θ|θ|θ/g, "θ");
|
||||
str = str.replace(/ι|ι|ι/g, "ι");
|
||||
str = str.replace(/κ|κ|κ/g, "κ");
|
||||
str = str.replace(/λ|λ|λ/g, "λ");
|
||||
str = str.replace(/μ|μ|μ/g, "μ");
|
||||
str = str.replace(/ν|ν|ν/g, "ν");
|
||||
str = str.replace(/ξ|ξ|ξ/g, "ξ");
|
||||
str = str.replace(/ο|ο|ο/g, "ο");
|
||||
str = str.replace(/π|π|π/g, "π");
|
||||
str = str.replace(/ρ|ρ|ρ/g, "ρ");
|
||||
str = str.replace(/ς|ς|ς/g, "ς");
|
||||
str = str.replace(/σ|σ|σ/g, "σ");
|
||||
str = str.replace(/τ|τ|τ/g, "τ");
|
||||
str = str.replace(/υ|υ|υ/g, "υ");
|
||||
str = str.replace(/φ|φ|φ/g, "φ");
|
||||
str = str.replace(/χ|χ|χ/g, "χ");
|
||||
str = str.replace(/ψ|ψ|ψ/g, "ψ");
|
||||
str = str.replace(/ω|ω|ω/g, "ω");
|
||||
str = str.replace(/ϑ|ϑ|ϑ/g, "ϑ");
|
||||
str = str.replace(/ϒ|ϒ|ϒ/g, "ϒ");
|
||||
str = str.replace(/ϖ|ϖ|ϖ/g, "ϖ");
|
||||
str = str.replace(/·|·|·/g, "·");
|
||||
return str;
|
||||
}
|
||||
|
||||
function strcharacterDiscode(str) {
|
||||
// 加入常用解析
|
||||
|
||||
// str = str.replace(/ | | /g, " ");
|
||||
// str = str.replace(/ | | /g, ' ');
|
||||
// str = str.replace(/ | /g, '<span class=\'spaceshow\'> </span>');
|
||||
// str = str.replace(/ | | /g, ' ');
|
||||
// str = str.replace(/"|"|"/g, "\"");
|
||||
// str = str.replace(/'|'|'/g, "'");
|
||||
// str = str.replace(/´|´|´/g, "´");
|
||||
// str = str.replace(/×|×|×/g, "×");
|
||||
// str = str.replace(/÷|÷|÷/g, "÷");
|
||||
// str = str.replace(/&|&|&/g, '&');
|
||||
// str = str.replace(/<|<|</g, '<');
|
||||
// str = str.replace(/>|>|>/g, '>');
|
||||
|
||||
str = str.replace(/ | | /g, "<span class='spaceshow'> </span>");
|
||||
str = str.replace(
|
||||
/ | | /g,
|
||||
"<span class='spaceshow'> </span>",
|
||||
);
|
||||
str = str.replace(/ | /g, "<span class='spaceshow'> </span>");
|
||||
str = str.replace(
|
||||
/ | | /g,
|
||||
"<span class='spaceshow'> </span>",
|
||||
);
|
||||
str = str.replace(/"|"|"/g, '"');
|
||||
str = str.replace(/"|'|'/g, "'");
|
||||
str = str.replace(/´|´|´/g, "´");
|
||||
str = str.replace(/×|×|×/g, "×");
|
||||
str = str.replace(/÷|÷|÷/g, "÷");
|
||||
str = str.replace(/&|&|&/g, "&");
|
||||
str = str.replace(/<|<|</g, "<");
|
||||
str = str.replace(/>|>|>/g, ">");
|
||||
return str;
|
||||
}
|
||||
|
||||
// HTML 支持的其他实体
|
||||
function strOtherDiscode(str) {
|
||||
str = str.replace(/Œ|Œ|Œ/g, "Œ");
|
||||
str = str.replace(/œ|œ|œ/g, "œ");
|
||||
str = str.replace(/Š|Š|Š/g, "Š");
|
||||
str = str.replace(/š|š|š/g, "š");
|
||||
str = str.replace(/Ÿ|Ÿ|Ÿ/g, "Ÿ");
|
||||
str = str.replace(/ƒ|ƒ|ƒ/g, "ƒ");
|
||||
str = str.replace(/ˆ|ˆ|ˆ/g, "ˆ");
|
||||
str = str.replace(/˜|˜|˜/g, "˜");
|
||||
str = str.replace(
|
||||
/ |$#8201;| /g,
|
||||
"<span class='spaceshow'> </span>",
|
||||
);
|
||||
str = str.replace(
|
||||
/‌|‌|‌/g,
|
||||
"<span class='spaceshow'></span>",
|
||||
);
|
||||
str = str.replace(
|
||||
/‍|$#8205;|‍/g,
|
||||
"<span class='spaceshow'></span>",
|
||||
);
|
||||
str = str.replace(
|
||||
/‎|$#8206;|‎/g,
|
||||
"<span class='spaceshow'></span>",
|
||||
);
|
||||
str = str.replace(
|
||||
/‏|‏|‏/g,
|
||||
"<span class='spaceshow'></span>",
|
||||
);
|
||||
str = str.replace(/–|–|–/g, "–");
|
||||
str = str.replace(/—|—|—/g, "—");
|
||||
str = str.replace(/‘|‘|‘/g, "‘");
|
||||
str = str.replace(/’|’|’/g, "’");
|
||||
str = str.replace(/‚|‚|‚/g, "‚");
|
||||
str = str.replace(/“|“|“/g, "“");
|
||||
str = str.replace(/”|”|”/g, "”");
|
||||
str = str.replace(/„|„|„/g, "„");
|
||||
str = str.replace(/†|†|†/g, "†");
|
||||
str = str.replace(/‡|‡|‡/g, "‡");
|
||||
str = str.replace(/•|•|•/g, "•");
|
||||
str = str.replace(/…|…|…/g, "…");
|
||||
str = str.replace(/‰|‰|‰/g, "‰");
|
||||
str = str.replace(/′|′|′/g, "′");
|
||||
str = str.replace(/″|″|″/g, "″");
|
||||
str = str.replace(/‹|‹|‹/g, "‹");
|
||||
str = str.replace(/›|›|›/g, "›");
|
||||
str = str.replace(/‾|‾|‾/g, "‾");
|
||||
str = str.replace(/€|€|€/g, "€");
|
||||
str = str.replace(/™|™|™/g, "™");
|
||||
str = str.replace(/←|←|←/g, "←");
|
||||
str = str.replace(/↑|↑|↑/g, "↑");
|
||||
str = str.replace(/→|→|→/g, "→");
|
||||
str = str.replace(/↓|↓|↓/g, "↓");
|
||||
str = str.replace(/↔|↔|↔/g, "↔");
|
||||
str = str.replace(/↵|↵|↵/g, "↵");
|
||||
str = str.replace(/⌈|⌈|⌈/g, "⌈");
|
||||
str = str.replace(/⌉|⌉|⌉/g, "⌉");
|
||||
str = str.replace(/⌊|⌊|⌊/g, "⌊");
|
||||
str = str.replace(/⌋|⌋|⌋/g, "⌋");
|
||||
str = str.replace(/◊|◊|◊/g, "◊");
|
||||
str = str.replace(/♠|♠|♠/g, "♠");
|
||||
str = str.replace(/♣|♣|♣/g, "♣");
|
||||
str = str.replace(/♥|♥|♥/g, "♥");
|
||||
str = str.replace(/♦|♦|♦/g, "♦");
|
||||
return str;
|
||||
}
|
||||
|
||||
function strDiscode(str) {
|
||||
str = strNumDiscode(str);
|
||||
str = strGreeceDiscode(str);
|
||||
str = strcharacterDiscode(str);
|
||||
str = strOtherDiscode(str);
|
||||
return str;
|
||||
}
|
||||
|
||||
function urlToHttpUrl(url, domain) {
|
||||
if (/^\/\//.test(url)) {
|
||||
return `https:${url}`;
|
||||
} else if (/^\//.test(url)) {
|
||||
return `https://${domain}${url}`;
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
export default {
|
||||
strDiscode,
|
||||
urlToHttpUrl,
|
||||
};
|
||||
Reference in New Issue
Block a user