@alifd/meet-react
Version:
Fusion Mobile React UI System Component
891 lines • 28.6 kB
JavaScript
import { isIOS, windowWidth } from '../utils';
var 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'),
blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),
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'),
entities: {
lt: '<',
gt: '>',
quot: '"',
apos: "'",
ensp: "\u2002",
emsp: "\u2003",
nbsp: '\xA0',
semi: ';',
ndash: '–',
mdash: '—',
middot: '·',
lsquo: '‘',
rsquo: '’',
ldquo: '“',
rdquo: '”',
bull: '•',
hellip: '…'
},
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'
}
};
var tagSelector = {};
var blankChar = makeMap(' ,\r,\n,\t,\f');
var idIndex = 0;
function makeMap(str) {
var map = Object.create(null);
var list = str.split(',');
for (var i = list.length; i--;) {
map[list[i]] = true;
}
return map;
}
function decodeEntity(str, amp) {
var i = str.indexOf('&');
while (i !== -1) {
var j = str.indexOf(';', i + 3);
var code = void 0;
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 HtmlParser(vm) {
this.options = vm.props || vm.properties || {};
this.tagStyle = Object.assign({}, config.tagStyle, this.options.tagStyle);
this.imgList = vm.imgList || [];
this.plugins = vm.plugins || [];
this.attrs = Object.create(null);
this.stack = [];
this.nodes = [];
this.pre = (this.options.containerStyle || '').includes('white-space') && this.options.containerStyle.includes('pre') ? 2 : 0;
}
HtmlParser.prototype.parse = function (content) {
for (var 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();
}
return this.nodes;
};
HtmlParser.prototype.expose = function () {
for (var i = this.stack.length; i--;) {
var item = this.stack[i];
if (item.c || item.name === 'a' || item.name === 'video' || item.name === 'audio') {
return;
}
item.c = 1;
}
};
HtmlParser.prototype.hook = function (node) {
for (var i = this.plugins.length; i--;) {
if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) === false) {
return false;
}
}
return true;
};
HtmlParser.prototype.getUrl = function (url) {
var domain = this.options.domain;
if (url[0] === '/') {
if (url[1] === '/') {
url = "".concat(domain ? domain.split('://')[0] : 'http', ":").concat(url);
} else if (domain) {
url = domain + url;
}
} else if (domain && !url.includes('data:') && !url.includes('://')) {
url = "".concat(domain, "/").concat(url);
}
return url;
};
HtmlParser.prototype.parseStyle = function (node) {
var attrs = node.attrs;
var list = (this.tagStyle[node.name] || '').split(';').concat((attrs.style || '').split(';'));
var styleObj = {};
var 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 = undefined;
}
}
if (attrs.width) {
styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px');
attrs.width = undefined;
}
if (attrs.height) {
styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px');
attrs.height = undefined;
}
for (var i = 0, len = list.length; i < len; i++) {
var info = list[i].split(':');
if (info.length < 2) {
continue;
}
var key = info.shift().trim().toLowerCase();
var value = info.join(':').trim();
if (value[0] === '-' && value.lastIndexOf('-') > 0 || value.includes('safe')) {
tmp += ";".concat(key, ":").concat(value);
} else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) {
if (value.includes('url')) {
var 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, function ($) {
return "".concat(parseFloat($) * windowWidth / 750, "px");
});
}
styleObj[key] = value;
}
}
node.attrs.style = tmp;
return styleObj;
};
HtmlParser.prototype.onTagName = function (name) {
this.tagName = this.xml ? name : name.toLowerCase();
if (this.tagName === 'svg') {
this.xml = (this.xml || 0) + 1;
}
};
HtmlParser.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 = undefined;
}
} else {
this.attrName = name;
this.attrs[name] = 'T';
}
};
HtmlParser.prototype.onAttrVal = function (val) {
var 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;
}
};
HtmlParser.prototype.onOpenTag = function (selfClose) {
var node = Object.create(null);
node.name = this.tagName;
node.attrs = this.attrs;
this.attrs = Object.create(null);
var attrs = node.attrs;
var parent = this.stack[this.stack.length - 1];
var siblings = parent ? parent.children : this.nodes;
var close = this.xml ? selfClose : config.voidTags[node.name];
if (tagSelector[node.name]) {
attrs["class"] = tagSelector[node.name] + (attrs["class"] ? " ".concat(attrs["class"]) : '');
}
if (node.name === 'embed') {
var 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".concat(idIndex++);
}
if (!attrs.controls && !attrs.autoplay) {
attrs.controls = 'T';
}
node.src = [];
if (attrs.src) {
node.src.push(attrs.src);
attrs.src = undefined;
}
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;
}
var 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 (var i = this.stack.length; i--;) {
var item = this.stack[i];
if (item.name === 'a') {
node.a = item.attrs;
break;
}
var style = item.attrs.style || '';
if (style.includes('flex:') && !style.includes('flex:0') && !style.includes('flex: 0') && (!styleObj.width || !styleObj.width.includes('%'))) {
styleObj.width = '100% !important';
styleObj.height = '';
for (var 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 (var _j = i + 1; _j < this.stack.length; _j++) {
var _style = this.stack[_j].attrs.style || '';
if (!_style.includes(';width') && !_style.includes(' width') && _style.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:".concat(styleObj.width);
styleObj.width = '';
} else {
item.attrs.style += ';max-width:100%';
}
}
item.c = 1;
}
node.i = this.imgList.length;
var _src = attrs['original-src'] || attrs.src;
if (this.imgList.includes(_src)) {
var _i = _src.indexOf('://');
if (_i !== -1) {
_i += 3;
var 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 (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 = undefined;
}
if (styleObj.width) {
if (styleObj.width.includes('auto')) {
styleObj.width = '';
} else {
node.w = 'T';
if (styleObj.height && !styleObj.height.includes('auto')) {
node.h = 'T';
}
}
}
} else if (node.name === 'svg') {
siblings.push(node);
this.stack.push(node);
this.popNode();
return;
}
for (var key in styleObj) {
if (styleObj[key]) {
attrs.style += ";".concat(key, ":").concat(styleObj[key].replace(' !important', ''));
}
}
attrs.style = attrs.style.substr(1) || undefined;
} else {
if ((node.name === 'pre' || (attrs.style || '').includes('white-space') && attrs.style.includes('pre')) && this.pre !== 2) {
this.pre = 1;
node.pre = 1;
}
node.children = [];
this.stack.push(node);
}
siblings.push(node);
};
HtmlParser.prototype.onCloseTag = function (name) {
name = this.xml ? name : name.toLowerCase();
var 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') {
var siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes;
siblings.push({
name: name,
attrs: {
"class": tagSelector[name],
style: this.tagStyle[name]
}
});
}
};
HtmlParser.prototype.popNode = function () {
var node = this.stack.pop();
var attrs = node.attrs;
var children = node.children;
var parent = this.stack[this.stack.length - 1];
var 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) {}
siblings.pop();
return;
}
if (node.pre && this.pre !== 2) {
node.pre = undefined;
this.pre = node.pre;
for (var i = this.stack.length; i--;) {
if (this.stack[i].pre) {
this.pre = 1;
}
}
}
if (node.name === 'svg') {
if (this.xml > 1) {
this.xml--;
return;
}
var src = '';
var _attrs = attrs,
style = _attrs.style;
attrs.style = '';
if (attrs.viewbox) {
attrs.viewBox = attrs.viewbox;
}
attrs.xmlns = 'http://www.w3.org/2000/svg';
(function traversal(_node) {
if (_node.type === 'text') {
src += _node.text;
return;
}
src += "<".concat(_node.name);
for (var item in _node.attrs) {
var val = _node.attrs[item];
if (val) {
src += " ".concat(item, "=\"").concat(val, "\"");
}
}
if (!_node.children) {
src += '/>';
} else {
src += '>';
for (var _i2 = 0; _i2 < _node.children.length; _i2++) {
traversal(_node.children[_i2]);
}
src += "</".concat(_node.name, ">");
}
})(node);
node.name = 'img';
node.attrs = {
src: "data:image/svg+xml;utf8,".concat(src.replace(/#/g, '%23')),
style: style,
ignore: 'T'
};
node.children = undefined;
this.xml = false;
return;
}
var styleObj = {};
if (attrs.align) {
if (node.name === 'table') {
if (attrs.align === 'center') {
styleObj['margin-inline-end'] = 'auto';
styleObj['margin-inline-start'] = styleObj['margin-inline-end'];
} else {
styleObj["float"] = attrs.align;
}
} else {
styleObj['text-align'] = attrs.align;
}
attrs.align = undefined;
}
if (node.name === 'font') {
if (attrs.color) {
styleObj.color = attrs.color;
attrs.color = undefined;
}
if (attrs.face) {
styleObj['font-family'] = attrs.face;
attrs.face = undefined;
}
if (attrs.size) {
var size = parseInt(attrs.size);
if (!isNaN(size)) {
if (size < 1) {
size = 1;
} else if (size > 7) {
size = 7;
}
styleObj['font-size'] = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'][size - 1];
}
attrs.size = undefined;
}
}
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';
} else if (node.name === 'a' || node.name === 'ad') {
this.expose();
} else if (node.name === 'video' || node.name === 'audio') {
node.children = undefined;
} else if ((node.name === 'ul' || node.name === 'ol') && node.c) {
var types = {
a: 'lower-alpha',
A: 'upper-alpha',
i: 'lower-roman',
I: 'upper-roman'
};
if (types[attrs.type]) {
attrs.style += ";list-style-type:".concat(types[attrs.type]);
attrs.type = undefined;
}
node.c = 1;
for (var _i3 = children.length; _i3--;) {
if (children[_i3].name === 'li') {
children[_i3].c = 1;
}
}
} else if (node.name === 'table') {
var padding = parseFloat(attrs.cellpadding);
var spacing = parseFloat(attrs.cellspacing);
var border = parseFloat(attrs.border);
node.c = 1;
if (node.c) {
if (isNaN(padding)) {
padding = 2;
}
if (isNaN(spacing)) {
spacing = 2;
}
}
if (border) {
attrs.style += ";border:".concat(border, "px solid gray");
}
if (node.flag && node.c) {
node.flag = undefined;
styleObj.display = 'grid';
if (spacing) {
styleObj['grid-gap'] = "".concat(spacing, "px");
styleObj.padding = "".concat(spacing, "px");
} else if (border) {
attrs.style += ';border-left:0;border-top:0';
}
var width = [];
var trList = [];
var cells = [];
var map = {};
(function traversal(nodes) {
for (var _i4 = 0; _i4 < nodes.length; _i4++) {
if (nodes[_i4].name === 'tr') {
trList.push(nodes[_i4]);
} else {
traversal(nodes[_i4].children || []);
}
}
})(children);
for (var row = 1; row <= trList.length; row++) {
var col = 1;
for (var j = 0; j < trList[row - 1].children.length; j++, col++) {
var td = trList[row - 1].children[j];
if (td.name === 'td' || td.name === 'th') {
while (map["".concat(row, ".").concat(col)]) {
col++;
}
td.c = 1;
var _style2 = td.attrs.style || '';
var start = _style2.indexOf('width') ? _style2.indexOf(';width') : 0;
if (start !== -1) {
var end = _style2.indexOf(';', start + 6);
if (end === -1) {
end = _style2.length;
}
if (!td.attrs.colspan) {
width[col] = _style2.substring(start ? start + 7 : 6, end);
}
_style2 = _style2.substr(0, start) + _style2.substr(end);
}
_style2 += (border ? ";border:".concat(border, "px solid gray").concat(spacing ? '' : ';border-right:0;border-bottom:0') : '') + (padding ? ";padding:".concat(padding, "px") : '');
if (td.attrs.colspan) {
_style2 += ";grid-column-start:".concat(col, ";grid-column-end:").concat(col + parseInt(td.attrs.colspan));
if (!td.attrs.rowspan) {
_style2 += ";grid-row-start:".concat(row, ";grid-row-end:").concat(row + 1);
}
col += parseInt(td.attrs.colspan) - 1;
}
if (td.attrs.rowspan) {
_style2 += ";grid-row-start:".concat(row, ";grid-row-end:").concat(row + parseInt(td.attrs.rowspan));
if (!td.attrs.colspan) {
_style2 += ";grid-column-start:".concat(col, ";grid-column-end:").concat(col + 1);
}
for (var rowspan = 1; rowspan < td.attrs.rowspan; rowspan++) {
for (var colspan = 0; colspan < (td.attrs.colspan || 1); colspan++) {
map["".concat(row + rowspan, ".").concat(col - colspan)] = 1;
}
}
}
if (_style2) {
td.attrs.style = _style2;
}
cells.push(td);
}
}
if (row === 1) {
var temp = '';
for (var _i5 = 1; _i5 < col; _i5++) {
temp += "".concat(width[_i5] ? width[_i5] : 'auto', " ");
}
styleObj['grid-template-columns'] = temp;
}
}
node.children = cells;
} else {
if (node.c) {
styleObj.display = 'table';
}
if (!isNaN(spacing)) {
styleObj['border-spacing'] = "".concat(spacing, "px");
}
if (border || padding || node.c) {
(function traversal(nodes) {
for (var _i6 = 0; _i6 < nodes.length; _i6++) {
var _td = nodes[_i6];
if (node.c) {
_td.c = 1;
}
if (_td.name === 'th' || _td.name === 'td') {
if (border) {
_td.attrs.style = "border:".concat(border, "px solid gray;").concat(_td.attrs.style || '');
}
if (padding) {
_td.attrs.style = "padding:".concat(padding, "px;").concat(_td.attrs.style || '');
}
} else if (_td.children) {
traversal(_td.children);
}
}
})(children);
}
}
if (this.options.enableTableScroll && !(attrs.style || '').includes('inline')) {
var table = Object.assign({}, node);
node.name = 'div';
node.attrs = {
style: 'overflow-x:auto;padding:1px'
};
node.children = [table];
attrs = table.attrs;
}
} else if ((node.name === 'td' || node.name === 'th') && (attrs.colspan || attrs.rowspan)) {
for (var _i7 = this.stack.length; _i7--;) {
if (this.stack[_i7].name === 'table') {
this.stack[_i7].flag = 1;
break;
}
}
} else if (node.name === 'ruby') {
node.name = 'span';
for (var _i8 = 0; _i8 < children.length - 1; _i8++) {
if (children[_i8].type === 'text' && children[_i8 + 1].name === 'rt') {
children[_i8] = {
name: 'span',
attrs: {
style: 'display:inline-block;text-align:center'
},
children: [{
name: 'div',
attrs: {
style: "font-size:50%;".concat(children[_i8 + 1].attrs.style || '')
},
children: children[_i8 + 1].children
}, children[_i8]]
};
children.splice(_i8 + 1, 1);
}
}
}
if ((styleObj.display || '').includes('flex') && !node.c) {
for (var _i9 = children.length; _i9--;) {
var item = children[_i9];
if (item.f) {
item.attrs.style = (item.attrs.style || '') + item.f;
item.f = undefined;
}
}
}
var flex = parent && (parent.attrs.style || '').includes('flex') && !node.c && !(styleObj.display || '').includes('inline');
if (flex) {
node.f = ';max-width:100%';
}
for (var key in styleObj) {
if (styleObj[key]) {
var val = ";".concat(key, ":").concat(styleObj[key].replace(' !important', ''));
if (flex && (key.includes('flex') && key !== 'flex-direction' || key === 'align-self' || styleObj[key][0] === '-' || key === 'width' && val.includes('%'))) {
node.f += val;
if (key === 'width') {
attrs.style += ';width:100%';
}
} else {
attrs.style += val;
}
}
}
attrs.style = attrs.style.substr(1) || undefined;
};
HtmlParser.prototype.onText = function (text) {
if (!this.pre) {
var trim = '';
var flag;
for (var 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 === ' ' && flag) {
return;
}
text = trim;
}
var node = Object.create(null);
node.type = 'text';
node.text = decodeEntity(text);
if (this.hook(node)) {
if (this.options.selectable === 'force' && isIOS) {
this.expose();
node.us = 'T';
}
var 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 (var len = this.content.length; this.i !== -1 && this.i < len;) {
this.state();
}
};
Lexer.prototype.checkClose = function (method) {
var 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;
}
var 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));
}
var 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;
}
var 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 () {
var c = this.content[this.i];
if (blankChar[c] || c === '=') {
this.handler.onAttrName(this.content.substring(this.start, this.i));
var needVal = c === '=';
var 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 () {
var c = this.content[this.i];
var 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 () {
var 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++;
}
};
export default HtmlParser;