laya-coreui-es
Version:
laya核心库、ui库es版本,剔除了媒体、TTF等功能。基于 LayaAir-release_2.12.0 修改
120 lines (119 loc) • 4.94 kB
JavaScript
import { HTMLDivParser } from "../dom/HTMLDivParser";
import { HTMLElement } from "../dom/HTMLElement";
import { Pool } from "../../utils/Pool";
import { ClassUtils } from "../../utils/ClassUtils";
import { Utils } from "../../utils/Utils";
import { IHtml } from "./IHtml";
import { HTMLBrElement } from "../dom/HTMLBrElement";
import { HTMLStyleElement } from "../dom/HTMLStyleElement";
import { HTMLLinkElement } from "../dom/HTMLLinkElement";
import { HTMLImageElement } from "../dom/HTMLImageElement";
export class HTMLParse {
static getInstance(type) {
var rst = Pool.getItem(HTMLParse._htmlClassMapShort[type]);
if (!rst) {
rst = ClassUtils.getInstance(type);
}
return rst;
}
static parse(ower, xmlString, url) {
xmlString = xmlString.replace(/<br>/g, "<br/>");
xmlString = "<root>" + xmlString + "</root>";
xmlString = xmlString.replace(HTMLParse.spacePattern, HTMLParse.char255);
var xml = Utils.parseXMLFromString(xmlString);
HTMLParse._parseXML(ower, xml.childNodes[0].childNodes, url);
}
static _parseXML(parent, xml, url, href = null) {
var i, n;
if (xml.join || xml.item)
{
for (i = 0, n = xml.length; i < n; ++i) {
HTMLParse._parseXML(parent, xml[i], url, href);
}
}
else {
var node;
var nodeName;
if (xml.nodeType == 3)
{
var txt;
if (parent instanceof IHtml.HTMLDivParser) {
if (xml.nodeName == null) {
xml.nodeName = "#text";
}
nodeName = xml.nodeName.toLowerCase();
txt = xml.textContent.replace(/^\s+|\s+$/g, '');
if (txt.length > 0) {
node = HTMLParse.getInstance(nodeName);
if (node) {
parent.addChild(node);
(node.innerTEXT = txt.replace(HTMLParse.char255AndOneSpacePattern, " "));
}
}
}
else {
txt = xml.textContent.replace(/^\s+|\s+$/g, '');
if (txt.length > 0) {
var containNode = parent;
if (parent instanceof HTMLElement && parent.innerTEXT && parent.innerTEXT.length > 0) {
let cnode = HTMLParse.getInstance('p');
if (cnode) {
parent.addChild(cnode);
containNode = cnode;
}
}
containNode.innerTEXT = txt.replace(HTMLParse.char255AndOneSpacePattern, " ");
}
}
return;
}
else {
nodeName = xml.nodeName.toLowerCase();
if (nodeName == "#comment")
return;
node = HTMLParse.getInstance(nodeName);
if (node) {
if (nodeName == "p") {
parent.addChild(HTMLParse.getInstance("br"));
node = parent.addChild(node);
parent.addChild(HTMLParse.getInstance("br"));
}
else {
node = parent.addChild(node);
}
node.URI = url;
node.href = href;
var attributes = xml.attributes;
if (attributes && attributes.length > 0) {
for (i = 0, n = attributes.length; i < n; ++i) {
var attribute = attributes[i];
var attrName = attribute.nodeName;
var value = attribute.value;
node._setAttributes(attrName, value);
}
}
HTMLParse._parseXML(node, xml.childNodes, url, node.href);
}
else {
HTMLParse._parseXML(parent, xml.childNodes, url, href);
}
}
}
}
}
HTMLParse.char255 = String.fromCharCode(255);
HTMLParse.spacePattern = / | /g;
HTMLParse.char255AndOneSpacePattern = new RegExp(String.fromCharCode(255) + "|(\\s+)", "g");
HTMLParse._htmlClassMapShort = {
'div': HTMLDivParser,
'p': HTMLElement,
'img': HTMLImageElement,
'span': HTMLElement,
'br': HTMLBrElement,
'style': HTMLStyleElement,
'font': HTMLElement,
'a': HTMLElement,
'#text': HTMLElement,
'link': HTMLLinkElement
};
IHtml.HTMLParse = HTMLParse;