You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

html5parser

Package Overview
Dependencies
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

html5parser - npm Package Compare versions

Comparing version
1.2.1
to
2.0.0-next
+11
dist/config.d.ts
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 15:56:14
* @version 1.0.0
* @desc config.ts
*/
export declare const selfCloseTags: Record<string, true>;
export declare const noNestedTags: Record<string, true>;
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var tslib = require('tslib');
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-18 15:17:51
* @version 1.0.0
* @desc types.ts
*/
(function (SyntaxKind) {
SyntaxKind["Text"] = "Text";
SyntaxKind["Tag"] = "Tag";
})(exports.SyntaxKind || (exports.SyntaxKind = {}));
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:29
* @version 1.0.0
* @desc tokenize.ts
*/
var state;
var buffer;
var bufSize;
var sectionStart;
var index;
var tokens;
var char;
var inScript;
var inStyle;
var offset;
function makeCodePoints(input) {
return {
lower: input
.toLowerCase()
.split('')
.map(function (c) { return c.charCodeAt(0); }),
upper: input
.toUpperCase()
.split('')
.map(function (c) { return c.charCodeAt(0); }),
length: input.length,
};
}
var doctype = makeCodePoints('!doctype');
var style = makeCodePoints('style');
var script = makeCodePoints('script');
function isWhiteSpace() {
return (char === 32 /* _S */ ||
char === 10 /* _N */ ||
char === 9 /* _T */ ||
char === 9 /* _T */ ||
char === 13 /* _R */ ||
char === 12 /* _F */);
}
function init(input) {
state = 0 /* Literal */;
buffer = input;
bufSize = input.length;
sectionStart = 0;
index = 0;
tokens = [];
inScript = false;
inStyle = false;
offset = 0;
}
function tokenize(input) {
init(input);
while (index < bufSize) {
char = buffer.charCodeAt(index);
switch (state) {
case 0 /* Literal */:
parseLiteral();
break;
case 1 /* BeforeOpenTag */:
parseBeforeOpenTag();
break;
case 2 /* OpeningTag */:
parseOpeningTag();
break;
case 3 /* AfterOpenTag */:
parseAfterOpenTag();
break;
case 4 /* InValueNq */:
parseInValueNq();
break;
case 5 /* InValueSq */:
parseInValueSq();
break;
case 6 /* InValueDq */:
parseInValueDq();
break;
case 7 /* ClosingOpenTag */:
parseClosingOpenTag();
break;
case 8 /* OpeningSpecial */:
parseOpeningSpecial();
break;
case 9 /* OpeningDoctype */:
parseOpeningDoctype();
break;
case 10 /* OpeningNormalComment */:
parseOpeningNormalComment();
break;
case 11 /* InNormalComment */:
parseNormalComment();
break;
case 12 /* InShortComment */:
parseShortComment();
break;
case 13 /* ClosingNormalComment */:
parseClosingNormalComment();
break;
case 14 /* ClosingTag */:
parseClosingTag();
break;
default:
unexpected();
break;
}
index++;
}
switch (state) {
case 0 /* Literal */:
case 1 /* BeforeOpenTag */:
case 4 /* InValueNq */:
case 5 /* InValueSq */:
case 6 /* InValueDq */:
case 7 /* ClosingOpenTag */:
case 11 /* InNormalComment */:
case 12 /* InShortComment */:
case 13 /* ClosingNormalComment */:
emitToken(0 /* Literal */);
break;
case 2 /* OpeningTag */:
emitToken(1 /* OpenTag */);
break;
case 3 /* AfterOpenTag */:
break;
case 8 /* OpeningSpecial */:
emitToken(1 /* OpenTag */, 12 /* InShortComment */);
break;
case 9 /* OpeningDoctype */:
if (index - sectionStart === doctype.length) {
emitToken(1 /* OpenTag */);
}
else {
emitToken(1 /* OpenTag */, void 0, sectionStart + 1);
emitToken(0 /* Literal */);
}
break;
case 10 /* OpeningNormalComment */:
if (index - sectionStart === 2) {
emitToken(1 /* OpenTag */);
}
else {
emitToken(1 /* OpenTag */, void 0, sectionStart + 1);
emitToken(0 /* Literal */);
}
break;
case 14 /* ClosingTag */:
emitToken(3 /* CloseTag */);
break;
}
var _tokens = tokens;
init('');
return _tokens;
}
function emitToken(kind, newState, end) {
if (newState === void 0) { newState = state; }
if (end === void 0) { end = index; }
var value = buffer.substring(sectionStart, end);
if (kind === 1 /* OpenTag */ || kind === 3 /* CloseTag */) {
value = value.toLowerCase();
}
if (kind === 1 /* OpenTag */) {
if (value === 'script') {
inScript = true;
}
else if (value === 'style') {
inStyle = true;
}
}
if (kind === 3 /* CloseTag */) {
inScript = inStyle = false;
}
if (!((kind === 0 /* Literal */ || kind === 4 /* Whitespace */) && end === sectionStart)) {
// empty literal should be ignored
tokens.push({ type: kind, start: sectionStart, end: end, value: value });
}
if (kind === 2 /* OpenTagEnd */ || kind === 3 /* CloseTag */) {
sectionStart = end + 1;
state = 0 /* Literal */;
}
else {
sectionStart = end;
state = newState;
}
}
function parseLiteral() {
if (char === 60 /* Lt */) {
// <
emitToken(0 /* Literal */, 1 /* BeforeOpenTag */);
}
}
function parseBeforeOpenTag() {
if (inScript || inStyle) {
if (char === 47 /* Sl */) {
state = 14 /* ClosingTag */;
sectionStart = index + 1;
}
else {
state = 0 /* Literal */;
}
return;
}
if ((char >= 97 /* La */ && char <= 122 /* Lz */) || (char >= 65 /* Ua */ && char <= 90 /* Uz */)) {
// <d
state = 2 /* OpeningTag */;
sectionStart = index;
}
else if (char === 47 /* Sl */) {
// </
state = 14 /* ClosingTag */;
sectionStart = index + 1;
}
else if (char === 60 /* Lt */) {
// <<
emitToken(0 /* Literal */);
}
else if (char === 33 /* Ep */) {
// <!
state = 8 /* OpeningSpecial */;
sectionStart = index;
}
else if (char === 63 /* Qm */) {
// <?
// treat as short comment
sectionStart = index;
emitToken(1 /* OpenTag */, 12 /* InShortComment */);
}
else {
// <>
// any other chars covert to normal state
state = 0 /* Literal */;
}
}
function parseOpeningTag() {
if (isWhiteSpace()) {
// <div ...
emitToken(1 /* OpenTag */, 3 /* AfterOpenTag */);
}
else if (char === 62 /* Gt */) {
// <div>
emitToken(1 /* OpenTag */);
emitToken(2 /* OpenTagEnd */);
}
else if (char === 47 /* Sl */) {
// <div/
emitToken(1 /* OpenTag */, 7 /* ClosingOpenTag */);
}
}
function parseAfterOpenTag() {
if (char === 62 /* Gt */) {
// <div >
emitToken(4 /* Whitespace */);
emitToken(2 /* OpenTagEnd */);
}
else if (char === 47 /* Sl */) {
// <div /
emitToken(4 /* Whitespace */, 7 /* ClosingOpenTag */);
}
else if (char === 61 /* Eq */) {
// <div ...=...
emitToken(4 /* Whitespace */);
emitToken(5 /* AttrValueEq */, void 0, index + 1);
}
else if (char === 39 /* Sq */) {
// <div ...'...
emitToken(4 /* Whitespace */, 5 /* InValueSq */);
}
else if (char === 34 /* Dq */) {
// <div ..."...
emitToken(4 /* Whitespace */, 6 /* InValueDq */);
}
else if (!isWhiteSpace()) {
// <div ...name...
emitToken(4 /* Whitespace */, 4 /* InValueNq */);
}
}
function parseInValueNq() {
if (char === 62 /* Gt */) {
// <div xxx>
emitToken(6 /* AttrValueNq */);
emitToken(2 /* OpenTagEnd */);
}
else if (char === 47 /* Sl */) {
// <div xxx/
emitToken(6 /* AttrValueNq */, 7 /* ClosingOpenTag */);
}
else if (char === 61 /* Eq */) {
// <div xxx=
emitToken(6 /* AttrValueNq */);
emitToken(5 /* AttrValueEq */, 3 /* AfterOpenTag */, index + 1);
}
else if (isWhiteSpace()) {
// <div xxx ...
emitToken(6 /* AttrValueNq */, 3 /* AfterOpenTag */);
}
}
function parseInValueSq() {
if (char === 39 /* Sq */) {
// <div 'xxx'
emitToken(7 /* AttrValueSq */, 3 /* AfterOpenTag */, index + 1);
}
}
function parseInValueDq() {
if (char === 34 /* Dq */) {
// <div "xxx", problem same to Sq
emitToken(8 /* AttrValueDq */, 3 /* AfterOpenTag */, index + 1);
}
}
function parseClosingOpenTag() {
if (char === 62 /* Gt */) {
// <div />
emitToken(2 /* OpenTagEnd */);
}
else {
// <div /...>
emitToken(6 /* AttrValueNq */, 3 /* AfterOpenTag */);
parseAfterOpenTag();
}
}
function parseOpeningSpecial() {
switch (char) {
case 45 /* Cl */: // <!-
state = 10 /* OpeningNormalComment */;
break;
case 100 /* Ld */: // <!d
case 68 /* Ud */: // <!D
state = 9 /* OpeningDoctype */;
break;
default:
emitToken(1 /* OpenTag */, 12 /* InShortComment */);
break;
}
}
function parseOpeningDoctype() {
offset = index - sectionStart;
if (offset === doctype.length) {
// <!d, <!d , start: 0, index: 2
if (isWhiteSpace()) {
emitToken(1 /* OpenTag */, 3 /* AfterOpenTag */);
}
else {
unexpected();
}
}
else if (char === 62 /* Gt */) {
// <!DOCT>
emitToken(1 /* OpenTag */, void 0, sectionStart + 1);
emitToken(0 /* Literal */);
emitToken(2 /* OpenTagEnd */);
}
else if (doctype.lower[offset] !== char && doctype.upper[offset] !== char) {
// <!DOCX...
emitToken(1 /* OpenTag */, 12 /* InShortComment */, sectionStart + 1);
}
}
function parseOpeningNormalComment() {
if (char === 45 /* Cl */) {
// <!--
emitToken(1 /* OpenTag */, 11 /* InNormalComment */, index + 1);
}
else {
emitToken(1 /* OpenTag */, 12 /* InShortComment */, sectionStart + 1);
}
}
function parseNormalComment() {
if (char === 45 /* Cl */) {
// <!-- ... -
emitToken(0 /* Literal */, 13 /* ClosingNormalComment */);
}
}
function parseShortComment() {
if (char === 62 /* Gt */) {
// <! ... >
emitToken(0 /* Literal */);
emitToken(2 /* OpenTagEnd */);
}
}
function parseClosingNormalComment() {
offset = index - sectionStart;
if (offset === 2) {
if (char === 62 /* Gt */) {
// <!-- xxx -->
emitToken(2 /* OpenTagEnd */);
}
else if (char === 45 /* Cl */) {
// <!-- xxx ---
emitToken(0 /* Literal */, void 0, sectionStart + 1);
}
else {
// <!-- xxx --x
state = 11 /* InNormalComment */;
}
}
else if (char !== 45 /* Cl */) {
// <!-- xxx - ...
state = 11 /* InNormalComment */;
}
}
function parseClosingTag() {
offset = index - sectionStart;
if (inStyle) {
if (char === 60 /* Lt */) {
sectionStart -= 2;
emitToken(0 /* Literal */, 1 /* BeforeOpenTag */);
}
else if (offset < style.length) {
if (style.lower[offset] !== char && style.upper[offset] !== char) {
sectionStart -= 2;
state = 0 /* Literal */;
}
}
else if (char === 62 /* Gt */) {
emitToken(3 /* CloseTag */);
}
else if (!isWhiteSpace()) {
sectionStart -= 2;
state = 0 /* Literal */;
}
}
else if (inScript) {
if (char === 60 /* Lt */) {
sectionStart -= 2;
emitToken(0 /* Literal */, 1 /* BeforeOpenTag */);
}
else if (offset < script.length) {
if (script.lower[offset] !== char && script.upper[offset] !== char) {
sectionStart -= 2;
state = 0 /* Literal */;
}
}
else if (char === 62 /* Gt */) {
emitToken(3 /* CloseTag */);
}
else if (!isWhiteSpace()) {
sectionStart -= 2;
state = 0 /* Literal */;
}
}
else if (char === 62 /* Gt */) {
// </ xxx >
emitToken(3 /* CloseTag */);
}
}
function unexpected() {
throw new SyntaxError("Unexpected token \"" + buffer.charAt(index) + "\" at " + index + " when parse " + state);
}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 15:56:14
* @version 1.0.0
* @desc config.ts
*/
function createMap(keys, value) {
return keys.split(',').reduce(function (pre, now) {
pre[now] = value;
return pre;
}, Object.create(null));
}
var selfCloseTags = createMap('area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr,!doctype,,!,!--', true);
var noNestedTags = createMap('li,option,select,textarea', true);
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-20 21:41:39
* @version 1.0.0
* @desc utils.ts
*/
function getLineRanges(input) {
return input.split('\n').reduce(function (arr, line) {
arr.push(line.length + 1 + arr[arr.length - 1]);
return arr;
}, [0]);
}
function getPosition(ranges, offset) {
var line = NaN;
var column = NaN;
for (var i = 1; i < ranges.length; i++) {
if (ranges[i] > offset) {
line = i;
column = offset - ranges[i - 1] + 1;
break;
}
}
return [line, column];
}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc walk.ts
*/
function visit(node, parent, index, options) {
options.enter && options.enter(node, parent, index);
if (node.type === exports.SyntaxKind.Tag && Array.isArray(node.body)) {
for (var i = 0; i < node.body.length; i++) {
visit(node.body[i], node, i, options);
}
}
options.leave && options.leave(node, parent, index);
}
function walk(ast, options) {
for (var i = 0; i < ast.length; i++) {
visit(ast[i], void 0, i, options);
}
}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc parse.ts
*/
var index$1;
var count;
var tokens$1;
var tagChain;
var nodes;
var token;
var node;
var buffer$1;
var lines;
var parseOptions;
function init$1(input, options) {
if (input === void 0) {
count = 0;
tokens$1.length = 0;
buffer$1 = '';
}
else {
tokens$1 = tokenize(input);
count = tokens$1.length;
buffer$1 = input;
}
index$1 = 0;
tagChain = void 0;
nodes = [];
token = void 0;
node = void 0;
lines = void 0;
parseOptions = options;
}
function pushNode(_node) {
if (!tagChain) {
nodes.push(_node);
}
else if (_node.type === exports.SyntaxKind.Tag &&
_node.name === tagChain.tag.name &&
noNestedTags[_node.name]) {
tagChain = tagChain.parent;
pushNode(_node);
}
else if (tagChain.tag.body) {
tagChain.tag.end = _node.end;
tagChain.tag.body.push(_node);
}
}
function pushTagChain(tag) {
tagChain = { parent: tagChain, tag: tag };
node = void 0;
}
function createLiteral(start, end, value) {
if (start === void 0) { start = token.start; }
if (end === void 0) { end = token.end; }
if (value === void 0) { value = token.value; }
return { start: start, end: end, value: value, type: exports.SyntaxKind.Text };
}
function createTag() {
return {
start: token.start - 1,
end: token.end,
type: exports.SyntaxKind.Tag,
open: createLiteral(token.start - 1),
name: token.value,
rawName: buffer$1.substring(token.start, token.end),
attributes: [],
attributeMap: void 0,
body: null,
close: null,
};
}
function createAttribute() {
return {
start: token.start,
end: token.end,
name: createLiteral(),
value: void 0,
};
}
function createAttributeValue() {
return {
start: token.start,
end: token.end,
value: token.type === 6 /* AttrValueNq */
? token.value
: token.value.substr(1, token.value.length - 2),
quote: token.type === 6 /* AttrValueNq */
? void 0
: token.type === 7 /* AttrValueSq */
? "'"
: '"',
};
}
function appendLiteral(_node) {
if (_node === void 0) { _node = node; }
_node.value += token.value;
_node.end = token.end;
}
function unexpected$1() {
if (lines === void 0) {
lines = getLineRanges(buffer$1);
}
var _a = tslib.__read(getPosition(lines, token.start), 2), line = _a[0], column = _a[1];
throw new Error("Unexpected token \"" + token.value + "(" + token.type + ")\" at [" + line + "," + column + "]" +
(tagChain ? " when parsing tag: " + JSON.stringify(tagChain.tag.name) + "." : ''));
}
function buildAttributeMap(tag) {
var e_1, _a;
tag.attributeMap = {};
try {
for (var _b = tslib.__values(tag.attributes), _c = _b.next(); !_c.done; _c = _b.next()) {
var attr = _c.value;
tag.attributeMap[attr.name.value] = attr;
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
}
function parseOpenTag() {
var state = 0 /* BeforeAttr */;
var attr = void 0;
var tag = createTag();
pushNode(tag);
if (tag.name === '' || tag.name === '!' || tag.name === '!--') {
tag.open.value = '<' + tag.open.value;
if (index$1 === count) {
return;
}
else {
token = tokens$1[++index$1];
if (token.type !== 2 /* OpenTagEnd */) {
node = createLiteral();
tag.body = [node];
while (++index$1 < count) {
token = tokens$1[index$1];
if (token.type === 2 /* OpenTagEnd */) {
node = void 0;
break;
}
appendLiteral();
}
}
tag.close = createLiteral(token.start, token.end + 1, token.value + ">");
tag.end = tag.close.end;
}
return;
}
while (++index$1 < count) {
token = tokens$1[index$1];
if (token.type === 2 /* OpenTagEnd */) {
tag.end = tag.open.end = token.end + 1;
tag.open.value = buffer$1.substring(tag.open.start, tag.open.end);
if (token.value === '' && !selfCloseTags[tag.name]) {
tag.body = [];
pushTagChain(tag);
}
else {
tag.body = void 0;
}
break;
}
else if (state === 0 /* BeforeAttr */) {
if (token.type !== 4 /* Whitespace */) {
attr = createAttribute();
state = 1 /* InName */;
tag.attributes.push(attr);
}
}
else if (state === 1 /* InName */) {
if (token.type === 4 /* Whitespace */) {
state = 2 /* AfterName */;
}
else if (token.type === 5 /* AttrValueEq */) {
state = 3 /* AfterEqual */;
}
else {
appendLiteral(attr.name);
}
}
else if (state === 2 /* AfterName */) {
if (token.type !== 4 /* Whitespace */) {
if (token.type === 5 /* AttrValueEq */) {
state = 3 /* AfterEqual */;
}
else {
attr = createAttribute();
state = 1 /* InName */;
tag.attributes.push(attr);
}
}
}
else if (state === 3 /* AfterEqual */) {
if (token.type !== 4 /* Whitespace */) {
attr.value = createAttributeValue();
if (token.type === 6 /* AttrValueNq */) {
state = 4 /* InValue */;
}
else {
attr.end = attr.value.end;
state = 0 /* BeforeAttr */;
}
}
}
else {
if (token.type === 4 /* Whitespace */) {
attr.end = attr.value.end;
state = 0 /* BeforeAttr */;
}
else {
appendLiteral(attr.value);
}
}
}
}
function parseCloseTag() {
var _context = tagChain;
while (true) {
if (!_context || token.value.trim() === _context.tag.name) {
break;
}
_context = _context.parent;
}
if (!_context) {
return;
}
_context.tag.close = createLiteral(token.start - 2, token.end + 1, buffer$1.substring(token.start - 2, token.end + 1));
_context.tag.end = _context.tag.close.end;
_context = _context.parent;
tagChain = _context;
}
function parse(input, options) {
init$1(input, tslib.__assign({ setAttributeMap: false }, options));
while (index$1 < count) {
token = tokens$1[index$1];
switch (token.type) {
case 0 /* Literal */:
if (!node) {
node = createLiteral();
pushNode(node);
}
else {
appendLiteral(node);
}
break;
case 1 /* OpenTag */:
node = void 0;
parseOpenTag();
break;
case 3 /* CloseTag */:
node = void 0;
parseCloseTag();
break;
default:
unexpected$1();
break;
}
index$1++;
}
var _nodes = nodes;
if (parseOptions === null || parseOptions === void 0 ? void 0 : parseOptions.setAttributeMap) {
walk(_nodes, {
enter: function (node) {
if (node.type === exports.SyntaxKind.Tag) {
buildAttributeMap(node);
}
},
});
}
init$1();
return _nodes;
}
/*
* @since 2020-09-09 22:53:14
* @author acrazing <joking.young@gmail.com>
*/
var safeHtmlDefaultOptions = {
allowedTags: [
'a',
'abbr',
'address',
'area',
'article',
'aside',
'b',
'bdi',
'bdo',
'big',
'blockquote',
'br',
'button',
'caption',
'cite',
'code',
'col',
'colgroup',
'data',
'dd',
'del',
'dfn',
'div',
'dl',
'dt',
'em',
'figcaption',
'figure',
'footer',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'header',
'hgroup',
'hr',
'i',
'img',
'ins',
'kbd',
'li',
'main',
'map',
'ol',
'p',
'picture',
'pre',
'q',
'rp',
'rt',
'ruby',
's',
'samp',
'section',
'small',
'span',
'strong',
'sub',
'summary',
'sup',
'table',
'tbody',
'td',
'tfoot',
'th',
'thead',
'time',
'tr',
'u',
'ul',
'var',
'wbr',
],
allowedAttrs: ['style'],
tagAllowedAttrs: {
a: ['href', 'target'],
img: ['src'],
td: ['rowspan', 'colspan'],
th: ['rowspan', 'colspan'],
time: ['datetime'],
colgroup: ['span'],
col: ['span'],
},
allowedUrl: /^(?:mailto|tel|https?|ftp|[^:]*[^a-z0-9.+-][^:]*):|^[^:]*$/i,
};
function safeHtml(input, options) {
if (options === void 0) { options = {}; }
var config = tslib.__assign(tslib.__assign(tslib.__assign({}, safeHtmlDefaultOptions), options), { tagAllowedAttrs: tslib.__assign(tslib.__assign({}, safeHtmlDefaultOptions.tagAllowedAttrs), options.tagAllowedAttrs) });
var ast = parse(input);
return stringify(ast, config, input);
}
function stringify(ast, config, input) {
return ast
.map(function (node) {
if (node.type === exports.SyntaxKind.Text) {
return node.value;
}
if (config.allowedTags.indexOf(node.name) === -1) {
return '';
}
if (selfCloseTags[node.name]) {
if (node.body !== void 0) {
throw new Error("self closed tag \"" + node.name + "\" should not have body");
}
}
else {
if (!node.body || !node.close) {
throw new Error("tag \"" + node.name + "\" should have body and close");
}
}
var attrs = node.attributes
.filter(function (a) {
var _a;
if (config.allowedAttrs.indexOf(a.name.value) > -1 ||
((_a = config.tagAllowedAttrs[node.name]) === null || _a === void 0 ? void 0 : _a.indexOf(a.name.value)) > -1) {
if (!a.value) {
return true;
}
if (a.name.value !== 'src' && a.name.value !== 'href') {
return true;
}
if (config.allowedUrl.test(a.value.value)) {
return true;
}
return false;
}
return false;
})
.map(function (a) { return input.substring(a.start, a.end); })
.join(' ');
var head = '<' + node.rawName + (attrs ? ' ' + attrs : '') + '>';
if (!node.body) {
return head;
}
return head + stringify(node.body, config, input) + ("</" + node.rawName + ">");
})
.join('');
}
exports.parse = parse;
exports.safeHtml = safeHtml;
exports.safeHtmlDefaultOptions = safeHtmlDefaultOptions;
exports.tokenize = tokenize;
exports.walk = walk;
//# sourceMappingURL=html5parser.cjs.js.map
{"version":3,"file":"html5parser.cjs.js","sources":["../src/types.ts","../src/tokenize.ts","../src/config.ts","../src/utils.ts","../src/walk.ts","../src/parse.ts","../src/safeHtml.ts"],"sourcesContent":["/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-18 15:17:51\n * @version 1.0.0\n * @desc types.ts\n */\n\nexport enum SyntaxKind {\n Text = 'Text',\n Tag = 'Tag',\n}\n\nexport interface IBaseNode {\n start: number;\n end: number;\n}\n\nexport interface IText extends IBaseNode {\n type: SyntaxKind.Text;\n value: string;\n}\n\nexport interface IAttributeValue extends IBaseNode {\n value: string;\n quote: \"'\" | '\"' | undefined;\n}\n\nexport interface IAttribute extends IBaseNode {\n name: IText;\n value: IAttributeValue | undefined;\n}\n\nexport interface ITag extends IBaseNode {\n type: SyntaxKind.Tag;\n // original open tag, <Div id=\"id\">\n open: IText;\n // lower case tag name, div\n name: string;\n // original case tag name, Div\n rawName: string;\n attributes: IAttribute[];\n // the attribute map, if `options.setAttributeMap` is `true`\n // this will be a Record, key is the attribute name literal,\n // value is the attribute self.\n attributeMap: Record<string, IAttribute> | undefined;\n body:\n | Array<ITag | IText> // with close tag\n | undefined // self closed\n | null; // EOF before open tag end\n // original close tag, </DIV >\n close:\n | IText // with close tag\n | undefined // self closed\n | null; // EOF before end or without close tag\n}\n\nexport type INode = IText | ITag;\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 00:54:29\n * @version 1.0.0\n * @desc tokenize.ts\n */\n\nconst enum State {\n Literal,\n BeforeOpenTag,\n OpeningTag,\n AfterOpenTag,\n InValueNq,\n InValueSq,\n InValueDq,\n ClosingOpenTag,\n OpeningSpecial,\n OpeningDoctype,\n OpeningNormalComment,\n InNormalComment,\n InShortComment,\n ClosingNormalComment,\n ClosingTag,\n}\n\nexport const enum TokenKind {\n Literal,\n OpenTag, // trim leading '<'\n OpenTagEnd, // trim tailing '>', only could be '/' or ''\n CloseTag, // trim leading '</' and tailing '>'\n Whitespace, // the whitespace between attributes\n AttrValueEq,\n AttrValueNq,\n AttrValueSq,\n AttrValueDq,\n}\n\nexport interface IToken {\n start: number;\n end: number;\n value: string;\n type: TokenKind;\n}\n\nlet state: State;\nlet buffer: string;\nlet bufSize: number;\nlet sectionStart: number;\nlet index: number;\nlet tokens: IToken[];\nlet char: number;\nlet inScript: boolean;\nlet inStyle: boolean;\nlet offset: number;\n\nfunction makeCodePoints(input: string) {\n return {\n lower: input\n .toLowerCase()\n .split('')\n .map((c) => c.charCodeAt(0)),\n upper: input\n .toUpperCase()\n .split('')\n .map((c) => c.charCodeAt(0)),\n length: input.length,\n };\n}\n\nconst doctype = makeCodePoints('!doctype');\nconst style = makeCodePoints('style');\nconst script = makeCodePoints('script');\n\nconst enum Chars {\n _S = 32, // ' '\n _N = 10, // \\n\n _T = 9, // \\t\n _R = 13, // \\r\n _F = 12, // \\f\n Lt = 60, // <\n Ep = 33, // !\n Cl = 45, // -\n Sl = 47, // /\n Gt = 62, // >\n Qm = 63, // ?\n La = 97, // a\n Lz = 122, // z\n Ua = 65, // A\n Uz = 90, // Z\n Eq = 61, // =\n Sq = 39, // '\n Dq = 34, // \"\n Ld = 100, // d\n Ud = 68, //D\n}\n\nfunction isWhiteSpace() {\n return (\n char === Chars._S ||\n char === Chars._N ||\n char === Chars._T ||\n char === Chars._T ||\n char === Chars._R ||\n char === Chars._F\n );\n}\n\nfunction init(input: string) {\n state = State.Literal;\n buffer = input;\n bufSize = input.length;\n sectionStart = 0;\n index = 0;\n tokens = [];\n inScript = false;\n inStyle = false;\n offset = 0;\n}\n\nexport function tokenize(input: string): IToken[] {\n init(input);\n while (index < bufSize) {\n char = buffer.charCodeAt(index);\n switch (state) {\n case State.Literal:\n parseLiteral();\n break;\n case State.BeforeOpenTag:\n parseBeforeOpenTag();\n break;\n case State.OpeningTag:\n parseOpeningTag();\n break;\n case State.AfterOpenTag:\n parseAfterOpenTag();\n break;\n case State.InValueNq:\n parseInValueNq();\n break;\n case State.InValueSq:\n parseInValueSq();\n break;\n case State.InValueDq:\n parseInValueDq();\n break;\n case State.ClosingOpenTag:\n parseClosingOpenTag();\n break;\n case State.OpeningSpecial:\n parseOpeningSpecial();\n break;\n case State.OpeningDoctype:\n parseOpeningDoctype();\n break;\n case State.OpeningNormalComment:\n parseOpeningNormalComment();\n break;\n case State.InNormalComment:\n parseNormalComment();\n break;\n case State.InShortComment:\n parseShortComment();\n break;\n case State.ClosingNormalComment:\n parseClosingNormalComment();\n break;\n case State.ClosingTag:\n parseClosingTag();\n break;\n default:\n unexpected();\n break;\n }\n index++;\n }\n switch (state) {\n case State.Literal:\n case State.BeforeOpenTag:\n case State.InValueNq:\n case State.InValueSq:\n case State.InValueDq:\n case State.ClosingOpenTag:\n case State.InNormalComment:\n case State.InShortComment:\n case State.ClosingNormalComment:\n emitToken(TokenKind.Literal);\n break;\n case State.OpeningTag:\n emitToken(TokenKind.OpenTag);\n break;\n case State.AfterOpenTag:\n break;\n case State.OpeningSpecial:\n emitToken(TokenKind.OpenTag, State.InShortComment);\n break;\n case State.OpeningDoctype:\n if (index - sectionStart === doctype.length) {\n emitToken(TokenKind.OpenTag);\n } else {\n emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);\n emitToken(TokenKind.Literal);\n }\n break;\n case State.OpeningNormalComment:\n if (index - sectionStart === 2) {\n emitToken(TokenKind.OpenTag);\n } else {\n emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);\n emitToken(TokenKind.Literal);\n }\n break;\n case State.ClosingTag:\n emitToken(TokenKind.CloseTag);\n break;\n default:\n break;\n }\n const _tokens = tokens;\n init('');\n return _tokens;\n}\n\nfunction emitToken(kind: TokenKind, newState = state, end = index) {\n let value = buffer.substring(sectionStart, end);\n if (kind === TokenKind.OpenTag || kind === TokenKind.CloseTag) {\n value = value.toLowerCase();\n }\n if (kind === TokenKind.OpenTag) {\n if (value === 'script') {\n inScript = true;\n } else if (value === 'style') {\n inStyle = true;\n }\n }\n if (kind === TokenKind.CloseTag) {\n inScript = inStyle = false;\n }\n if (!((kind === TokenKind.Literal || kind === TokenKind.Whitespace) && end === sectionStart)) {\n // empty literal should be ignored\n tokens.push({ type: kind, start: sectionStart, end, value });\n }\n if (kind === TokenKind.OpenTagEnd || kind === TokenKind.CloseTag) {\n sectionStart = end + 1;\n state = State.Literal;\n } else {\n sectionStart = end;\n state = newState;\n }\n}\n\nfunction parseLiteral() {\n if (char === Chars.Lt) {\n // <\n emitToken(TokenKind.Literal, State.BeforeOpenTag);\n }\n}\n\nfunction parseBeforeOpenTag() {\n if (inScript || inStyle) {\n if (char === Chars.Sl) {\n state = State.ClosingTag;\n sectionStart = index + 1;\n } else {\n state = State.Literal;\n }\n return;\n }\n if ((char >= Chars.La && char <= Chars.Lz) || (char >= Chars.Ua && char <= Chars.Uz)) {\n // <d\n state = State.OpeningTag;\n sectionStart = index;\n } else if (char === Chars.Sl) {\n // </\n state = State.ClosingTag;\n sectionStart = index + 1;\n } else if (char === Chars.Lt) {\n // <<\n emitToken(TokenKind.Literal);\n } else if (char === Chars.Ep) {\n // <!\n state = State.OpeningSpecial;\n sectionStart = index;\n } else if (char === Chars.Qm) {\n // <?\n // treat as short comment\n sectionStart = index;\n emitToken(TokenKind.OpenTag, State.InShortComment);\n } else {\n // <>\n // any other chars covert to normal state\n state = State.Literal;\n }\n}\n\nfunction parseOpeningTag() {\n if (isWhiteSpace()) {\n // <div ...\n emitToken(TokenKind.OpenTag, State.AfterOpenTag);\n } else if (char === Chars.Gt) {\n // <div>\n emitToken(TokenKind.OpenTag);\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Sl) {\n // <div/\n emitToken(TokenKind.OpenTag, State.ClosingOpenTag);\n }\n}\n\nfunction parseAfterOpenTag() {\n if (char === Chars.Gt) {\n // <div >\n emitToken(TokenKind.Whitespace);\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Sl) {\n // <div /\n emitToken(TokenKind.Whitespace, State.ClosingOpenTag);\n } else if (char === Chars.Eq) {\n // <div ...=...\n emitToken(TokenKind.Whitespace);\n emitToken(TokenKind.AttrValueEq, void 0, index + 1);\n } else if (char === Chars.Sq) {\n // <div ...'...\n emitToken(TokenKind.Whitespace, State.InValueSq);\n } else if (char === Chars.Dq) {\n // <div ...\"...\n emitToken(TokenKind.Whitespace, State.InValueDq);\n } else if (!isWhiteSpace()) {\n // <div ...name...\n emitToken(TokenKind.Whitespace, State.InValueNq);\n }\n}\n\nfunction parseInValueNq() {\n if (char === Chars.Gt) {\n // <div xxx>\n emitToken(TokenKind.AttrValueNq);\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Sl) {\n // <div xxx/\n emitToken(TokenKind.AttrValueNq, State.ClosingOpenTag);\n } else if (char === Chars.Eq) {\n // <div xxx=\n emitToken(TokenKind.AttrValueNq);\n emitToken(TokenKind.AttrValueEq, State.AfterOpenTag, index + 1);\n } else if (isWhiteSpace()) {\n // <div xxx ...\n emitToken(TokenKind.AttrValueNq, State.AfterOpenTag);\n }\n}\n\nfunction parseInValueSq() {\n if (char === Chars.Sq) {\n // <div 'xxx'\n emitToken(TokenKind.AttrValueSq, State.AfterOpenTag, index + 1);\n }\n}\n\nfunction parseInValueDq() {\n if (char === Chars.Dq) {\n // <div \"xxx\", problem same to Sq\n emitToken(TokenKind.AttrValueDq, State.AfterOpenTag, index + 1);\n }\n}\n\nfunction parseClosingOpenTag() {\n if (char === Chars.Gt) {\n // <div />\n emitToken(TokenKind.OpenTagEnd);\n } else {\n // <div /...>\n emitToken(TokenKind.AttrValueNq, State.AfterOpenTag);\n parseAfterOpenTag();\n }\n}\n\nfunction parseOpeningSpecial() {\n switch (char) {\n case Chars.Cl: // <!-\n state = State.OpeningNormalComment;\n break;\n case Chars.Ld: // <!d\n case Chars.Ud: // <!D\n state = State.OpeningDoctype;\n break;\n default:\n emitToken(TokenKind.OpenTag, State.InShortComment);\n break;\n }\n}\n\nfunction parseOpeningDoctype() {\n offset = index - sectionStart;\n if (offset === doctype.length) {\n // <!d, <!d , start: 0, index: 2\n if (isWhiteSpace()) {\n emitToken(TokenKind.OpenTag, State.AfterOpenTag);\n } else {\n unexpected();\n }\n } else if (char === Chars.Gt) {\n // <!DOCT>\n emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);\n emitToken(TokenKind.Literal);\n emitToken(TokenKind.OpenTagEnd);\n } else if (doctype.lower[offset] !== char && doctype.upper[offset] !== char) {\n // <!DOCX...\n emitToken(TokenKind.OpenTag, State.InShortComment, sectionStart + 1);\n }\n}\n\nfunction parseOpeningNormalComment() {\n if (char === Chars.Cl) {\n // <!--\n emitToken(TokenKind.OpenTag, State.InNormalComment, index + 1);\n } else {\n emitToken(TokenKind.OpenTag, State.InShortComment, sectionStart + 1);\n }\n}\n\nfunction parseNormalComment() {\n if (char === Chars.Cl) {\n // <!-- ... -\n emitToken(TokenKind.Literal, State.ClosingNormalComment);\n }\n}\n\nfunction parseShortComment() {\n if (char === Chars.Gt) {\n // <! ... >\n emitToken(TokenKind.Literal);\n emitToken(TokenKind.OpenTagEnd);\n }\n}\n\nfunction parseClosingNormalComment() {\n offset = index - sectionStart;\n if (offset === 2) {\n if (char === Chars.Gt) {\n // <!-- xxx -->\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Cl) {\n // <!-- xxx ---\n emitToken(TokenKind.Literal, void 0, sectionStart + 1);\n } else {\n // <!-- xxx --x\n state = State.InNormalComment;\n }\n } else if (char !== Chars.Cl) {\n // <!-- xxx - ...\n state = State.InNormalComment;\n }\n}\n\nfunction parseClosingTag() {\n offset = index - sectionStart;\n if (inStyle) {\n if (char === Chars.Lt) {\n sectionStart -= 2;\n emitToken(TokenKind.Literal, State.BeforeOpenTag);\n } else if (offset < style.length) {\n if (style.lower[offset] !== char && style.upper[offset] !== char) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (char === Chars.Gt) {\n emitToken(TokenKind.CloseTag);\n } else if (!isWhiteSpace()) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (inScript) {\n if (char === Chars.Lt) {\n sectionStart -= 2;\n emitToken(TokenKind.Literal, State.BeforeOpenTag);\n } else if (offset < script.length) {\n if (script.lower[offset] !== char && script.upper[offset] !== char) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (char === Chars.Gt) {\n emitToken(TokenKind.CloseTag);\n } else if (!isWhiteSpace()) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (char === Chars.Gt) {\n // </ xxx >\n emitToken(TokenKind.CloseTag);\n }\n}\n\nfunction unexpected() {\n throw new SyntaxError(\n `Unexpected token \"${buffer.charAt(index)}\" at ${index} when parse ${state}`,\n );\n}\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 15:56:14\n * @version 1.0.0\n * @desc config.ts\n */\n\nfunction createMap<T>(keys: string, value: T): Record<string, T> {\n return keys.split(',').reduce((pre, now) => {\n pre[now] = value;\n return pre;\n }, Object.create(null));\n}\n\nexport const selfCloseTags = createMap<true>(\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr,!doctype,,!,!--',\n true,\n);\n\nexport const noNestedTags = createMap<true>('li,option,select,textarea', true);\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-20 21:41:39\n * @version 1.0.0\n * @desc utils.ts\n */\n\nexport function getLineRanges(input: string) {\n return input.split('\\n').reduce(\n (arr, line) => {\n arr.push(line.length + 1 + arr[arr.length - 1]);\n return arr;\n },\n [0],\n );\n}\n\nexport function getPosition(ranges: number[], offset: number): [number, number] {\n let line = NaN;\n let column = NaN;\n for (let i = 1; i < ranges.length; i++) {\n if (ranges[i] > offset) {\n line = i;\n column = offset - ranges[i - 1] + 1;\n break;\n }\n }\n return [line, column];\n}\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 00:54:46\n * @version 1.0.0\n * @desc walk.ts\n */\n\nimport { INode, SyntaxKind } from './types';\n\nexport interface WalkOptions {\n enter?(node: INode, parent: INode | undefined, index: number): void;\n leave?(node: INode, parent: INode | undefined, index: number): void;\n}\n\nfunction visit(node: INode, parent: INode | undefined, index: number, options: WalkOptions) {\n options.enter && options.enter(node, parent, index);\n if (node.type === SyntaxKind.Tag && Array.isArray(node.body)) {\n for (let i = 0; i < node.body.length; i++) {\n visit(node.body[i], node, i, options);\n }\n }\n options.leave && options.leave(node, parent, index);\n}\n\nexport function walk(ast: INode[], options: WalkOptions) {\n for (let i = 0; i < ast.length; i++) {\n visit(ast[i], void 0, i, options);\n }\n}\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 00:54:46\n * @version 1.0.0\n * @desc parse.ts\n */\n\nimport { noNestedTags, selfCloseTags } from './config';\nimport { IToken, tokenize, TokenKind } from './tokenize';\nimport { IAttribute, IAttributeValue, INode, ITag, IText, SyntaxKind } from './types';\nimport { getLineRanges, getPosition } from './utils';\nimport { walk } from './walk';\n\ninterface IContext {\n parent: IContext | undefined;\n tag: ITag;\n}\n\nexport interface ParseOptions {\n // create tag's attributes map\n // if true, will set ITag.attributeMap property\n // as a `Record<string, IAttribute>`\n setAttributeMap: boolean;\n}\n\nlet index: number;\nlet count: number;\nlet tokens: IToken[];\nlet tagChain: IContext | undefined;\nlet nodes: INode[];\nlet token: IToken;\nlet node: IText | undefined;\nlet buffer: string;\nlet lines: number[] | undefined;\nlet parseOptions: ParseOptions | undefined;\n\nfunction init(input?: string, options?: ParseOptions) {\n if (input === void 0) {\n count = 0;\n tokens.length = 0;\n buffer = '';\n } else {\n tokens = tokenize(input);\n count = tokens.length;\n buffer = input;\n }\n index = 0;\n tagChain = void 0;\n nodes = [];\n token = void 0 as any;\n node = void 0;\n lines = void 0;\n parseOptions = options;\n}\n\nfunction pushNode(_node: ITag | IText) {\n if (!tagChain) {\n nodes.push(_node);\n } else if (\n _node.type === SyntaxKind.Tag &&\n _node.name === tagChain.tag.name &&\n noNestedTags[_node.name]\n ) {\n tagChain = tagChain.parent;\n pushNode(_node);\n } else if (tagChain.tag.body) {\n tagChain.tag.end = _node.end;\n tagChain.tag.body.push(_node);\n }\n}\n\nfunction pushTagChain(tag: ITag) {\n tagChain = { parent: tagChain, tag: tag };\n node = void 0;\n}\n\nfunction createLiteral(start = token.start, end = token.end, value = token.value): IText {\n return { start, end, value, type: SyntaxKind.Text };\n}\n\nfunction createTag(): ITag {\n return {\n start: token.start - 1, // include <\n end: token.end,\n type: SyntaxKind.Tag,\n open: createLiteral(token.start - 1), // not finished\n name: token.value,\n rawName: buffer.substring(token.start, token.end),\n attributes: [],\n attributeMap: void 0,\n body: null,\n close: null,\n };\n}\n\nfunction createAttribute(): IAttribute {\n return {\n start: token.start,\n end: token.end,\n name: createLiteral(),\n value: void 0,\n };\n}\n\nfunction createAttributeValue(): IAttributeValue {\n return {\n start: token.start,\n end: token.end,\n value:\n token.type === TokenKind.AttrValueNq\n ? token.value\n : token.value.substr(1, token.value.length - 2),\n quote:\n token.type === TokenKind.AttrValueNq\n ? void 0\n : token.type === TokenKind.AttrValueSq\n ? \"'\"\n : '\"',\n };\n}\n\nfunction appendLiteral(_node: IText | IAttributeValue = node as IText) {\n _node.value += token.value;\n _node.end = token.end;\n}\n\nfunction unexpected() {\n if (lines === void 0) {\n lines = getLineRanges(buffer);\n }\n const [line, column] = getPosition(lines, token.start);\n throw new Error(\n `Unexpected token \"${token.value}(${token.type})\" at [${line},${column}]` +\n (tagChain ? ` when parsing tag: ${JSON.stringify(tagChain.tag.name)}.` : ''),\n );\n}\n\nfunction buildAttributeMap(tag: ITag) {\n tag.attributeMap = {};\n for (const attr of tag.attributes) {\n tag.attributeMap[attr.name.value] = attr;\n }\n}\n\nconst enum OpenTagState {\n BeforeAttr,\n InName,\n AfterName,\n AfterEqual,\n InValue,\n}\n\nfunction parseOpenTag() {\n let state = OpenTagState.BeforeAttr;\n\n let attr: IAttribute = void 0 as any;\n\n const tag = createTag();\n pushNode(tag);\n if (tag.name === '' || tag.name === '!' || tag.name === '!--') {\n tag.open.value = '<' + tag.open.value;\n if (index === count) {\n return;\n } else {\n token = tokens[++index];\n if (token.type !== TokenKind.OpenTagEnd) {\n node = createLiteral();\n tag.body = [node];\n while (++index < count) {\n token = tokens[index];\n if (token.type === TokenKind.OpenTagEnd) {\n node = void 0;\n break;\n }\n appendLiteral();\n }\n }\n tag.close = createLiteral(token.start, token.end + 1, `${token.value}>`);\n tag.end = tag.close.end;\n }\n return;\n }\n while (++index < count) {\n token = tokens[index];\n if (token.type === TokenKind.OpenTagEnd) {\n tag.end = tag.open.end = token.end + 1;\n tag.open.value = buffer.substring(tag.open.start, tag.open.end);\n if (token.value === '' && !selfCloseTags[tag.name]) {\n tag.body = [];\n pushTagChain(tag);\n } else {\n tag.body = void 0;\n }\n break;\n } else if (state === OpenTagState.BeforeAttr) {\n if (token.type !== TokenKind.Whitespace) {\n attr = createAttribute();\n state = OpenTagState.InName;\n tag.attributes.push(attr);\n }\n } else if (state === OpenTagState.InName) {\n if (token.type === TokenKind.Whitespace) {\n state = OpenTagState.AfterName;\n } else if (token.type === TokenKind.AttrValueEq) {\n state = OpenTagState.AfterEqual;\n } else {\n appendLiteral(attr.name);\n }\n } else if (state === OpenTagState.AfterName) {\n if (token.type !== TokenKind.Whitespace) {\n if (token.type === TokenKind.AttrValueEq) {\n state = OpenTagState.AfterEqual;\n } else {\n attr = createAttribute();\n state = OpenTagState.InName;\n tag.attributes.push(attr);\n }\n }\n } else if (state === OpenTagState.AfterEqual) {\n if (token.type !== TokenKind.Whitespace) {\n attr.value = createAttributeValue();\n if (token.type === TokenKind.AttrValueNq) {\n state = OpenTagState.InValue;\n } else {\n attr.end = attr.value.end;\n state = OpenTagState.BeforeAttr;\n }\n }\n } else {\n if (token.type === TokenKind.Whitespace) {\n attr.end = attr.value!.end;\n state = OpenTagState.BeforeAttr;\n } else {\n appendLiteral(attr.value);\n }\n }\n }\n}\n\nfunction parseCloseTag() {\n let _context = tagChain;\n while (true) {\n if (!_context || token.value.trim() === _context.tag.name) {\n break;\n }\n _context = _context.parent;\n }\n if (!_context) {\n return;\n }\n _context.tag.close = createLiteral(\n token.start - 2,\n token.end + 1,\n buffer.substring(token.start - 2, token.end + 1),\n );\n _context.tag.end = _context.tag.close.end;\n _context = _context.parent;\n tagChain = _context;\n}\n\nexport function parse(input: string, options?: ParseOptions): INode[] {\n init(input, {\n setAttributeMap: false,\n ...options,\n } as ParseOptions);\n while (index < count) {\n token = tokens[index];\n switch (token.type) {\n case TokenKind.Literal:\n if (!node) {\n node = createLiteral();\n pushNode(node);\n } else {\n appendLiteral(node);\n }\n break;\n case TokenKind.OpenTag:\n node = void 0;\n parseOpenTag();\n break;\n case TokenKind.CloseTag:\n node = void 0;\n parseCloseTag();\n break;\n default:\n unexpected();\n break;\n }\n index++;\n }\n const _nodes = nodes;\n if (parseOptions?.setAttributeMap) {\n walk(_nodes, {\n enter(node: IText | ITag): void {\n if (node.type === SyntaxKind.Tag) {\n buildAttributeMap(node);\n }\n },\n });\n }\n init();\n return _nodes;\n}\n","/*\n * @since 2020-09-09 22:53:14\n * @author acrazing <joking.young@gmail.com>\n */\n\nimport { selfCloseTags } from './config';\nimport { parse } from './parse';\nimport { INode, SyntaxKind } from './types';\n\nexport interface SafeHtmlOptions {\n allowedTags: string[];\n allowedAttrs: string[];\n tagAllowedAttrs: Record<string, string[]>;\n allowedUrl: RegExp;\n}\n\nexport const safeHtmlDefaultOptions: SafeHtmlOptions = {\n allowedTags: [\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blockquote',\n 'br',\n 'button',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'data',\n 'dd',\n 'del',\n 'dfn',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'figcaption',\n 'figure',\n 'footer',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hgroup',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'map',\n 'ol',\n 'p',\n 'picture',\n 'pre',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'u',\n 'ul',\n 'var',\n 'wbr',\n ],\n allowedAttrs: ['style'],\n tagAllowedAttrs: {\n a: ['href', 'target'],\n img: ['src'],\n td: ['rowspan', 'colspan'],\n th: ['rowspan', 'colspan'],\n time: ['datetime'],\n colgroup: ['span'],\n col: ['span'],\n },\n allowedUrl: /^(?:mailto|tel|https?|ftp|[^:]*[^a-z0-9.+-][^:]*):|^[^:]*$/i,\n};\n\nexport function safeHtml(\n input: string,\n options: Partial<SafeHtmlOptions> = {},\n): string {\n const config: SafeHtmlOptions = {\n ...safeHtmlDefaultOptions,\n ...options,\n tagAllowedAttrs: {\n ...safeHtmlDefaultOptions.tagAllowedAttrs,\n ...options.tagAllowedAttrs,\n },\n };\n const ast = parse(input);\n return stringify(ast, config, input);\n}\n\nfunction stringify(\n ast: INode[],\n config: SafeHtmlOptions,\n input: string,\n): string {\n return ast\n .map((node) => {\n if (node.type === SyntaxKind.Text) {\n return node.value;\n }\n if (config.allowedTags.indexOf(node.name) === -1) {\n return '';\n }\n if (selfCloseTags[node.name]) {\n if (node.body !== void 0) {\n throw new Error(\n `self closed tag \"${node.name}\" should not have body`,\n );\n }\n } else {\n if (!node.body || !node.close) {\n throw new Error(`tag \"${node.name}\" should have body and close`);\n }\n }\n const attrs = node.attributes\n .filter((a) => {\n if (\n config.allowedAttrs.indexOf(a.name.value) > -1 ||\n config.tagAllowedAttrs[node.name]?.indexOf(a.name.value) > -1\n ) {\n if (!a.value) {\n return true;\n }\n if (a.name.value !== 'src' && a.name.value !== 'href') {\n return true;\n }\n if (config.allowedUrl.test(a.value.value)) {\n return true;\n }\n return false;\n }\n return false;\n })\n .map((a) => input.substring(a.start, a.end))\n .join(' ');\n const head = '<' + node.rawName + (attrs ? ' ' + attrs : '') + '>';\n if (!node.body) {\n return head;\n }\n return head + stringify(node.body, config, input) + `</${node.rawName}>`;\n })\n .join('');\n}\n"],"names":["SyntaxKind","index","tokens","buffer","init","unexpected","__read","__values","__assign"],"mappings":"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"}
import { __assign, __read, __values } from 'tslib';
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-18 15:17:51
* @version 1.0.0
* @desc types.ts
*/
var SyntaxKind;
(function (SyntaxKind) {
SyntaxKind["Text"] = "Text";
SyntaxKind["Tag"] = "Tag";
})(SyntaxKind || (SyntaxKind = {}));
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:29
* @version 1.0.0
* @desc tokenize.ts
*/
var state;
var buffer;
var bufSize;
var sectionStart;
var index;
var tokens;
var char;
var inScript;
var inStyle;
var offset;
function makeCodePoints(input) {
return {
lower: input
.toLowerCase()
.split('')
.map(function (c) { return c.charCodeAt(0); }),
upper: input
.toUpperCase()
.split('')
.map(function (c) { return c.charCodeAt(0); }),
length: input.length,
};
}
var doctype = makeCodePoints('!doctype');
var style = makeCodePoints('style');
var script = makeCodePoints('script');
function isWhiteSpace() {
return (char === 32 /* _S */ ||
char === 10 /* _N */ ||
char === 9 /* _T */ ||
char === 9 /* _T */ ||
char === 13 /* _R */ ||
char === 12 /* _F */);
}
function init(input) {
state = 0 /* Literal */;
buffer = input;
bufSize = input.length;
sectionStart = 0;
index = 0;
tokens = [];
inScript = false;
inStyle = false;
offset = 0;
}
function tokenize(input) {
init(input);
while (index < bufSize) {
char = buffer.charCodeAt(index);
switch (state) {
case 0 /* Literal */:
parseLiteral();
break;
case 1 /* BeforeOpenTag */:
parseBeforeOpenTag();
break;
case 2 /* OpeningTag */:
parseOpeningTag();
break;
case 3 /* AfterOpenTag */:
parseAfterOpenTag();
break;
case 4 /* InValueNq */:
parseInValueNq();
break;
case 5 /* InValueSq */:
parseInValueSq();
break;
case 6 /* InValueDq */:
parseInValueDq();
break;
case 7 /* ClosingOpenTag */:
parseClosingOpenTag();
break;
case 8 /* OpeningSpecial */:
parseOpeningSpecial();
break;
case 9 /* OpeningDoctype */:
parseOpeningDoctype();
break;
case 10 /* OpeningNormalComment */:
parseOpeningNormalComment();
break;
case 11 /* InNormalComment */:
parseNormalComment();
break;
case 12 /* InShortComment */:
parseShortComment();
break;
case 13 /* ClosingNormalComment */:
parseClosingNormalComment();
break;
case 14 /* ClosingTag */:
parseClosingTag();
break;
default:
unexpected();
break;
}
index++;
}
switch (state) {
case 0 /* Literal */:
case 1 /* BeforeOpenTag */:
case 4 /* InValueNq */:
case 5 /* InValueSq */:
case 6 /* InValueDq */:
case 7 /* ClosingOpenTag */:
case 11 /* InNormalComment */:
case 12 /* InShortComment */:
case 13 /* ClosingNormalComment */:
emitToken(0 /* Literal */);
break;
case 2 /* OpeningTag */:
emitToken(1 /* OpenTag */);
break;
case 3 /* AfterOpenTag */:
break;
case 8 /* OpeningSpecial */:
emitToken(1 /* OpenTag */, 12 /* InShortComment */);
break;
case 9 /* OpeningDoctype */:
if (index - sectionStart === doctype.length) {
emitToken(1 /* OpenTag */);
}
else {
emitToken(1 /* OpenTag */, void 0, sectionStart + 1);
emitToken(0 /* Literal */);
}
break;
case 10 /* OpeningNormalComment */:
if (index - sectionStart === 2) {
emitToken(1 /* OpenTag */);
}
else {
emitToken(1 /* OpenTag */, void 0, sectionStart + 1);
emitToken(0 /* Literal */);
}
break;
case 14 /* ClosingTag */:
emitToken(3 /* CloseTag */);
break;
}
var _tokens = tokens;
init('');
return _tokens;
}
function emitToken(kind, newState, end) {
if (newState === void 0) { newState = state; }
if (end === void 0) { end = index; }
var value = buffer.substring(sectionStart, end);
if (kind === 1 /* OpenTag */ || kind === 3 /* CloseTag */) {
value = value.toLowerCase();
}
if (kind === 1 /* OpenTag */) {
if (value === 'script') {
inScript = true;
}
else if (value === 'style') {
inStyle = true;
}
}
if (kind === 3 /* CloseTag */) {
inScript = inStyle = false;
}
if (!((kind === 0 /* Literal */ || kind === 4 /* Whitespace */) && end === sectionStart)) {
// empty literal should be ignored
tokens.push({ type: kind, start: sectionStart, end: end, value: value });
}
if (kind === 2 /* OpenTagEnd */ || kind === 3 /* CloseTag */) {
sectionStart = end + 1;
state = 0 /* Literal */;
}
else {
sectionStart = end;
state = newState;
}
}
function parseLiteral() {
if (char === 60 /* Lt */) {
// <
emitToken(0 /* Literal */, 1 /* BeforeOpenTag */);
}
}
function parseBeforeOpenTag() {
if (inScript || inStyle) {
if (char === 47 /* Sl */) {
state = 14 /* ClosingTag */;
sectionStart = index + 1;
}
else {
state = 0 /* Literal */;
}
return;
}
if ((char >= 97 /* La */ && char <= 122 /* Lz */) || (char >= 65 /* Ua */ && char <= 90 /* Uz */)) {
// <d
state = 2 /* OpeningTag */;
sectionStart = index;
}
else if (char === 47 /* Sl */) {
// </
state = 14 /* ClosingTag */;
sectionStart = index + 1;
}
else if (char === 60 /* Lt */) {
// <<
emitToken(0 /* Literal */);
}
else if (char === 33 /* Ep */) {
// <!
state = 8 /* OpeningSpecial */;
sectionStart = index;
}
else if (char === 63 /* Qm */) {
// <?
// treat as short comment
sectionStart = index;
emitToken(1 /* OpenTag */, 12 /* InShortComment */);
}
else {
// <>
// any other chars covert to normal state
state = 0 /* Literal */;
}
}
function parseOpeningTag() {
if (isWhiteSpace()) {
// <div ...
emitToken(1 /* OpenTag */, 3 /* AfterOpenTag */);
}
else if (char === 62 /* Gt */) {
// <div>
emitToken(1 /* OpenTag */);
emitToken(2 /* OpenTagEnd */);
}
else if (char === 47 /* Sl */) {
// <div/
emitToken(1 /* OpenTag */, 7 /* ClosingOpenTag */);
}
}
function parseAfterOpenTag() {
if (char === 62 /* Gt */) {
// <div >
emitToken(4 /* Whitespace */);
emitToken(2 /* OpenTagEnd */);
}
else if (char === 47 /* Sl */) {
// <div /
emitToken(4 /* Whitespace */, 7 /* ClosingOpenTag */);
}
else if (char === 61 /* Eq */) {
// <div ...=...
emitToken(4 /* Whitespace */);
emitToken(5 /* AttrValueEq */, void 0, index + 1);
}
else if (char === 39 /* Sq */) {
// <div ...'...
emitToken(4 /* Whitespace */, 5 /* InValueSq */);
}
else if (char === 34 /* Dq */) {
// <div ..."...
emitToken(4 /* Whitespace */, 6 /* InValueDq */);
}
else if (!isWhiteSpace()) {
// <div ...name...
emitToken(4 /* Whitespace */, 4 /* InValueNq */);
}
}
function parseInValueNq() {
if (char === 62 /* Gt */) {
// <div xxx>
emitToken(6 /* AttrValueNq */);
emitToken(2 /* OpenTagEnd */);
}
else if (char === 47 /* Sl */) {
// <div xxx/
emitToken(6 /* AttrValueNq */, 7 /* ClosingOpenTag */);
}
else if (char === 61 /* Eq */) {
// <div xxx=
emitToken(6 /* AttrValueNq */);
emitToken(5 /* AttrValueEq */, 3 /* AfterOpenTag */, index + 1);
}
else if (isWhiteSpace()) {
// <div xxx ...
emitToken(6 /* AttrValueNq */, 3 /* AfterOpenTag */);
}
}
function parseInValueSq() {
if (char === 39 /* Sq */) {
// <div 'xxx'
emitToken(7 /* AttrValueSq */, 3 /* AfterOpenTag */, index + 1);
}
}
function parseInValueDq() {
if (char === 34 /* Dq */) {
// <div "xxx", problem same to Sq
emitToken(8 /* AttrValueDq */, 3 /* AfterOpenTag */, index + 1);
}
}
function parseClosingOpenTag() {
if (char === 62 /* Gt */) {
// <div />
emitToken(2 /* OpenTagEnd */);
}
else {
// <div /...>
emitToken(6 /* AttrValueNq */, 3 /* AfterOpenTag */);
parseAfterOpenTag();
}
}
function parseOpeningSpecial() {
switch (char) {
case 45 /* Cl */: // <!-
state = 10 /* OpeningNormalComment */;
break;
case 100 /* Ld */: // <!d
case 68 /* Ud */: // <!D
state = 9 /* OpeningDoctype */;
break;
default:
emitToken(1 /* OpenTag */, 12 /* InShortComment */);
break;
}
}
function parseOpeningDoctype() {
offset = index - sectionStart;
if (offset === doctype.length) {
// <!d, <!d , start: 0, index: 2
if (isWhiteSpace()) {
emitToken(1 /* OpenTag */, 3 /* AfterOpenTag */);
}
else {
unexpected();
}
}
else if (char === 62 /* Gt */) {
// <!DOCT>
emitToken(1 /* OpenTag */, void 0, sectionStart + 1);
emitToken(0 /* Literal */);
emitToken(2 /* OpenTagEnd */);
}
else if (doctype.lower[offset] !== char && doctype.upper[offset] !== char) {
// <!DOCX...
emitToken(1 /* OpenTag */, 12 /* InShortComment */, sectionStart + 1);
}
}
function parseOpeningNormalComment() {
if (char === 45 /* Cl */) {
// <!--
emitToken(1 /* OpenTag */, 11 /* InNormalComment */, index + 1);
}
else {
emitToken(1 /* OpenTag */, 12 /* InShortComment */, sectionStart + 1);
}
}
function parseNormalComment() {
if (char === 45 /* Cl */) {
// <!-- ... -
emitToken(0 /* Literal */, 13 /* ClosingNormalComment */);
}
}
function parseShortComment() {
if (char === 62 /* Gt */) {
// <! ... >
emitToken(0 /* Literal */);
emitToken(2 /* OpenTagEnd */);
}
}
function parseClosingNormalComment() {
offset = index - sectionStart;
if (offset === 2) {
if (char === 62 /* Gt */) {
// <!-- xxx -->
emitToken(2 /* OpenTagEnd */);
}
else if (char === 45 /* Cl */) {
// <!-- xxx ---
emitToken(0 /* Literal */, void 0, sectionStart + 1);
}
else {
// <!-- xxx --x
state = 11 /* InNormalComment */;
}
}
else if (char !== 45 /* Cl */) {
// <!-- xxx - ...
state = 11 /* InNormalComment */;
}
}
function parseClosingTag() {
offset = index - sectionStart;
if (inStyle) {
if (char === 60 /* Lt */) {
sectionStart -= 2;
emitToken(0 /* Literal */, 1 /* BeforeOpenTag */);
}
else if (offset < style.length) {
if (style.lower[offset] !== char && style.upper[offset] !== char) {
sectionStart -= 2;
state = 0 /* Literal */;
}
}
else if (char === 62 /* Gt */) {
emitToken(3 /* CloseTag */);
}
else if (!isWhiteSpace()) {
sectionStart -= 2;
state = 0 /* Literal */;
}
}
else if (inScript) {
if (char === 60 /* Lt */) {
sectionStart -= 2;
emitToken(0 /* Literal */, 1 /* BeforeOpenTag */);
}
else if (offset < script.length) {
if (script.lower[offset] !== char && script.upper[offset] !== char) {
sectionStart -= 2;
state = 0 /* Literal */;
}
}
else if (char === 62 /* Gt */) {
emitToken(3 /* CloseTag */);
}
else if (!isWhiteSpace()) {
sectionStart -= 2;
state = 0 /* Literal */;
}
}
else if (char === 62 /* Gt */) {
// </ xxx >
emitToken(3 /* CloseTag */);
}
}
function unexpected() {
throw new SyntaxError("Unexpected token \"" + buffer.charAt(index) + "\" at " + index + " when parse " + state);
}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 15:56:14
* @version 1.0.0
* @desc config.ts
*/
function createMap(keys, value) {
return keys.split(',').reduce(function (pre, now) {
pre[now] = value;
return pre;
}, Object.create(null));
}
var selfCloseTags = createMap('area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr,!doctype,,!,!--', true);
var noNestedTags = createMap('li,option,select,textarea', true);
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-20 21:41:39
* @version 1.0.0
* @desc utils.ts
*/
function getLineRanges(input) {
return input.split('\n').reduce(function (arr, line) {
arr.push(line.length + 1 + arr[arr.length - 1]);
return arr;
}, [0]);
}
function getPosition(ranges, offset) {
var line = NaN;
var column = NaN;
for (var i = 1; i < ranges.length; i++) {
if (ranges[i] > offset) {
line = i;
column = offset - ranges[i - 1] + 1;
break;
}
}
return [line, column];
}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc walk.ts
*/
function visit(node, parent, index, options) {
options.enter && options.enter(node, parent, index);
if (node.type === SyntaxKind.Tag && Array.isArray(node.body)) {
for (var i = 0; i < node.body.length; i++) {
visit(node.body[i], node, i, options);
}
}
options.leave && options.leave(node, parent, index);
}
function walk(ast, options) {
for (var i = 0; i < ast.length; i++) {
visit(ast[i], void 0, i, options);
}
}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc parse.ts
*/
var index$1;
var count;
var tokens$1;
var tagChain;
var nodes;
var token;
var node;
var buffer$1;
var lines;
var parseOptions;
function init$1(input, options) {
if (input === void 0) {
count = 0;
tokens$1.length = 0;
buffer$1 = '';
}
else {
tokens$1 = tokenize(input);
count = tokens$1.length;
buffer$1 = input;
}
index$1 = 0;
tagChain = void 0;
nodes = [];
token = void 0;
node = void 0;
lines = void 0;
parseOptions = options;
}
function pushNode(_node) {
if (!tagChain) {
nodes.push(_node);
}
else if (_node.type === SyntaxKind.Tag &&
_node.name === tagChain.tag.name &&
noNestedTags[_node.name]) {
tagChain = tagChain.parent;
pushNode(_node);
}
else if (tagChain.tag.body) {
tagChain.tag.end = _node.end;
tagChain.tag.body.push(_node);
}
}
function pushTagChain(tag) {
tagChain = { parent: tagChain, tag: tag };
node = void 0;
}
function createLiteral(start, end, value) {
if (start === void 0) { start = token.start; }
if (end === void 0) { end = token.end; }
if (value === void 0) { value = token.value; }
return { start: start, end: end, value: value, type: SyntaxKind.Text };
}
function createTag() {
return {
start: token.start - 1,
end: token.end,
type: SyntaxKind.Tag,
open: createLiteral(token.start - 1),
name: token.value,
rawName: buffer$1.substring(token.start, token.end),
attributes: [],
attributeMap: void 0,
body: null,
close: null,
};
}
function createAttribute() {
return {
start: token.start,
end: token.end,
name: createLiteral(),
value: void 0,
};
}
function createAttributeValue() {
return {
start: token.start,
end: token.end,
value: token.type === 6 /* AttrValueNq */
? token.value
: token.value.substr(1, token.value.length - 2),
quote: token.type === 6 /* AttrValueNq */
? void 0
: token.type === 7 /* AttrValueSq */
? "'"
: '"',
};
}
function appendLiteral(_node) {
if (_node === void 0) { _node = node; }
_node.value += token.value;
_node.end = token.end;
}
function unexpected$1() {
if (lines === void 0) {
lines = getLineRanges(buffer$1);
}
var _a = __read(getPosition(lines, token.start), 2), line = _a[0], column = _a[1];
throw new Error("Unexpected token \"" + token.value + "(" + token.type + ")\" at [" + line + "," + column + "]" +
(tagChain ? " when parsing tag: " + JSON.stringify(tagChain.tag.name) + "." : ''));
}
function buildAttributeMap(tag) {
var e_1, _a;
tag.attributeMap = {};
try {
for (var _b = __values(tag.attributes), _c = _b.next(); !_c.done; _c = _b.next()) {
var attr = _c.value;
tag.attributeMap[attr.name.value] = attr;
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
}
function parseOpenTag() {
var state = 0 /* BeforeAttr */;
var attr = void 0;
var tag = createTag();
pushNode(tag);
if (tag.name === '' || tag.name === '!' || tag.name === '!--') {
tag.open.value = '<' + tag.open.value;
if (index$1 === count) {
return;
}
else {
token = tokens$1[++index$1];
if (token.type !== 2 /* OpenTagEnd */) {
node = createLiteral();
tag.body = [node];
while (++index$1 < count) {
token = tokens$1[index$1];
if (token.type === 2 /* OpenTagEnd */) {
node = void 0;
break;
}
appendLiteral();
}
}
tag.close = createLiteral(token.start, token.end + 1, token.value + ">");
tag.end = tag.close.end;
}
return;
}
while (++index$1 < count) {
token = tokens$1[index$1];
if (token.type === 2 /* OpenTagEnd */) {
tag.end = tag.open.end = token.end + 1;
tag.open.value = buffer$1.substring(tag.open.start, tag.open.end);
if (token.value === '' && !selfCloseTags[tag.name]) {
tag.body = [];
pushTagChain(tag);
}
else {
tag.body = void 0;
}
break;
}
else if (state === 0 /* BeforeAttr */) {
if (token.type !== 4 /* Whitespace */) {
attr = createAttribute();
state = 1 /* InName */;
tag.attributes.push(attr);
}
}
else if (state === 1 /* InName */) {
if (token.type === 4 /* Whitespace */) {
state = 2 /* AfterName */;
}
else if (token.type === 5 /* AttrValueEq */) {
state = 3 /* AfterEqual */;
}
else {
appendLiteral(attr.name);
}
}
else if (state === 2 /* AfterName */) {
if (token.type !== 4 /* Whitespace */) {
if (token.type === 5 /* AttrValueEq */) {
state = 3 /* AfterEqual */;
}
else {
attr = createAttribute();
state = 1 /* InName */;
tag.attributes.push(attr);
}
}
}
else if (state === 3 /* AfterEqual */) {
if (token.type !== 4 /* Whitespace */) {
attr.value = createAttributeValue();
if (token.type === 6 /* AttrValueNq */) {
state = 4 /* InValue */;
}
else {
attr.end = attr.value.end;
state = 0 /* BeforeAttr */;
}
}
}
else {
if (token.type === 4 /* Whitespace */) {
attr.end = attr.value.end;
state = 0 /* BeforeAttr */;
}
else {
appendLiteral(attr.value);
}
}
}
}
function parseCloseTag() {
var _context = tagChain;
while (true) {
if (!_context || token.value.trim() === _context.tag.name) {
break;
}
_context = _context.parent;
}
if (!_context) {
return;
}
_context.tag.close = createLiteral(token.start - 2, token.end + 1, buffer$1.substring(token.start - 2, token.end + 1));
_context.tag.end = _context.tag.close.end;
_context = _context.parent;
tagChain = _context;
}
function parse(input, options) {
init$1(input, __assign({ setAttributeMap: false }, options));
while (index$1 < count) {
token = tokens$1[index$1];
switch (token.type) {
case 0 /* Literal */:
if (!node) {
node = createLiteral();
pushNode(node);
}
else {
appendLiteral(node);
}
break;
case 1 /* OpenTag */:
node = void 0;
parseOpenTag();
break;
case 3 /* CloseTag */:
node = void 0;
parseCloseTag();
break;
default:
unexpected$1();
break;
}
index$1++;
}
var _nodes = nodes;
if (parseOptions === null || parseOptions === void 0 ? void 0 : parseOptions.setAttributeMap) {
walk(_nodes, {
enter: function (node) {
if (node.type === SyntaxKind.Tag) {
buildAttributeMap(node);
}
},
});
}
init$1();
return _nodes;
}
/*
* @since 2020-09-09 22:53:14
* @author acrazing <joking.young@gmail.com>
*/
var safeHtmlDefaultOptions = {
allowedTags: [
'a',
'abbr',
'address',
'area',
'article',
'aside',
'b',
'bdi',
'bdo',
'big',
'blockquote',
'br',
'button',
'caption',
'cite',
'code',
'col',
'colgroup',
'data',
'dd',
'del',
'dfn',
'div',
'dl',
'dt',
'em',
'figcaption',
'figure',
'footer',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'header',
'hgroup',
'hr',
'i',
'img',
'ins',
'kbd',
'li',
'main',
'map',
'ol',
'p',
'picture',
'pre',
'q',
'rp',
'rt',
'ruby',
's',
'samp',
'section',
'small',
'span',
'strong',
'sub',
'summary',
'sup',
'table',
'tbody',
'td',
'tfoot',
'th',
'thead',
'time',
'tr',
'u',
'ul',
'var',
'wbr',
],
allowedAttrs: ['style'],
tagAllowedAttrs: {
a: ['href', 'target'],
img: ['src'],
td: ['rowspan', 'colspan'],
th: ['rowspan', 'colspan'],
time: ['datetime'],
colgroup: ['span'],
col: ['span'],
},
allowedUrl: /^(?:mailto|tel|https?|ftp|[^:]*[^a-z0-9.+-][^:]*):|^[^:]*$/i,
};
function safeHtml(input, options) {
if (options === void 0) { options = {}; }
var config = __assign(__assign(__assign({}, safeHtmlDefaultOptions), options), { tagAllowedAttrs: __assign(__assign({}, safeHtmlDefaultOptions.tagAllowedAttrs), options.tagAllowedAttrs) });
var ast = parse(input);
return stringify(ast, config, input);
}
function stringify(ast, config, input) {
return ast
.map(function (node) {
if (node.type === SyntaxKind.Text) {
return node.value;
}
if (config.allowedTags.indexOf(node.name) === -1) {
return '';
}
if (selfCloseTags[node.name]) {
if (node.body !== void 0) {
throw new Error("self closed tag \"" + node.name + "\" should not have body");
}
}
else {
if (!node.body || !node.close) {
throw new Error("tag \"" + node.name + "\" should have body and close");
}
}
var attrs = node.attributes
.filter(function (a) {
var _a;
if (config.allowedAttrs.indexOf(a.name.value) > -1 ||
((_a = config.tagAllowedAttrs[node.name]) === null || _a === void 0 ? void 0 : _a.indexOf(a.name.value)) > -1) {
if (!a.value) {
return true;
}
if (a.name.value !== 'src' && a.name.value !== 'href') {
return true;
}
if (config.allowedUrl.test(a.value.value)) {
return true;
}
return false;
}
return false;
})
.map(function (a) { return input.substring(a.start, a.end); })
.join(' ');
var head = '<' + node.rawName + (attrs ? ' ' + attrs : '') + '>';
if (!node.body) {
return head;
}
return head + stringify(node.body, config, input) + ("</" + node.rawName + ">");
})
.join('');
}
export { SyntaxKind, parse, safeHtml, safeHtmlDefaultOptions, tokenize, walk };
//# sourceMappingURL=html5parser.es.js.map
{"version":3,"file":"html5parser.es.js","sources":["../src/types.ts","../src/tokenize.ts","../src/config.ts","../src/utils.ts","../src/walk.ts","../src/parse.ts","../src/safeHtml.ts"],"sourcesContent":["/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-18 15:17:51\n * @version 1.0.0\n * @desc types.ts\n */\n\nexport enum SyntaxKind {\n Text = 'Text',\n Tag = 'Tag',\n}\n\nexport interface IBaseNode {\n start: number;\n end: number;\n}\n\nexport interface IText extends IBaseNode {\n type: SyntaxKind.Text;\n value: string;\n}\n\nexport interface IAttributeValue extends IBaseNode {\n value: string;\n quote: \"'\" | '\"' | undefined;\n}\n\nexport interface IAttribute extends IBaseNode {\n name: IText;\n value: IAttributeValue | undefined;\n}\n\nexport interface ITag extends IBaseNode {\n type: SyntaxKind.Tag;\n // original open tag, <Div id=\"id\">\n open: IText;\n // lower case tag name, div\n name: string;\n // original case tag name, Div\n rawName: string;\n attributes: IAttribute[];\n // the attribute map, if `options.setAttributeMap` is `true`\n // this will be a Record, key is the attribute name literal,\n // value is the attribute self.\n attributeMap: Record<string, IAttribute> | undefined;\n body:\n | Array<ITag | IText> // with close tag\n | undefined // self closed\n | null; // EOF before open tag end\n // original close tag, </DIV >\n close:\n | IText // with close tag\n | undefined // self closed\n | null; // EOF before end or without close tag\n}\n\nexport type INode = IText | ITag;\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 00:54:29\n * @version 1.0.0\n * @desc tokenize.ts\n */\n\nconst enum State {\n Literal,\n BeforeOpenTag,\n OpeningTag,\n AfterOpenTag,\n InValueNq,\n InValueSq,\n InValueDq,\n ClosingOpenTag,\n OpeningSpecial,\n OpeningDoctype,\n OpeningNormalComment,\n InNormalComment,\n InShortComment,\n ClosingNormalComment,\n ClosingTag,\n}\n\nexport const enum TokenKind {\n Literal,\n OpenTag, // trim leading '<'\n OpenTagEnd, // trim tailing '>', only could be '/' or ''\n CloseTag, // trim leading '</' and tailing '>'\n Whitespace, // the whitespace between attributes\n AttrValueEq,\n AttrValueNq,\n AttrValueSq,\n AttrValueDq,\n}\n\nexport interface IToken {\n start: number;\n end: number;\n value: string;\n type: TokenKind;\n}\n\nlet state: State;\nlet buffer: string;\nlet bufSize: number;\nlet sectionStart: number;\nlet index: number;\nlet tokens: IToken[];\nlet char: number;\nlet inScript: boolean;\nlet inStyle: boolean;\nlet offset: number;\n\nfunction makeCodePoints(input: string) {\n return {\n lower: input\n .toLowerCase()\n .split('')\n .map((c) => c.charCodeAt(0)),\n upper: input\n .toUpperCase()\n .split('')\n .map((c) => c.charCodeAt(0)),\n length: input.length,\n };\n}\n\nconst doctype = makeCodePoints('!doctype');\nconst style = makeCodePoints('style');\nconst script = makeCodePoints('script');\n\nconst enum Chars {\n _S = 32, // ' '\n _N = 10, // \\n\n _T = 9, // \\t\n _R = 13, // \\r\n _F = 12, // \\f\n Lt = 60, // <\n Ep = 33, // !\n Cl = 45, // -\n Sl = 47, // /\n Gt = 62, // >\n Qm = 63, // ?\n La = 97, // a\n Lz = 122, // z\n Ua = 65, // A\n Uz = 90, // Z\n Eq = 61, // =\n Sq = 39, // '\n Dq = 34, // \"\n Ld = 100, // d\n Ud = 68, //D\n}\n\nfunction isWhiteSpace() {\n return (\n char === Chars._S ||\n char === Chars._N ||\n char === Chars._T ||\n char === Chars._T ||\n char === Chars._R ||\n char === Chars._F\n );\n}\n\nfunction init(input: string) {\n state = State.Literal;\n buffer = input;\n bufSize = input.length;\n sectionStart = 0;\n index = 0;\n tokens = [];\n inScript = false;\n inStyle = false;\n offset = 0;\n}\n\nexport function tokenize(input: string): IToken[] {\n init(input);\n while (index < bufSize) {\n char = buffer.charCodeAt(index);\n switch (state) {\n case State.Literal:\n parseLiteral();\n break;\n case State.BeforeOpenTag:\n parseBeforeOpenTag();\n break;\n case State.OpeningTag:\n parseOpeningTag();\n break;\n case State.AfterOpenTag:\n parseAfterOpenTag();\n break;\n case State.InValueNq:\n parseInValueNq();\n break;\n case State.InValueSq:\n parseInValueSq();\n break;\n case State.InValueDq:\n parseInValueDq();\n break;\n case State.ClosingOpenTag:\n parseClosingOpenTag();\n break;\n case State.OpeningSpecial:\n parseOpeningSpecial();\n break;\n case State.OpeningDoctype:\n parseOpeningDoctype();\n break;\n case State.OpeningNormalComment:\n parseOpeningNormalComment();\n break;\n case State.InNormalComment:\n parseNormalComment();\n break;\n case State.InShortComment:\n parseShortComment();\n break;\n case State.ClosingNormalComment:\n parseClosingNormalComment();\n break;\n case State.ClosingTag:\n parseClosingTag();\n break;\n default:\n unexpected();\n break;\n }\n index++;\n }\n switch (state) {\n case State.Literal:\n case State.BeforeOpenTag:\n case State.InValueNq:\n case State.InValueSq:\n case State.InValueDq:\n case State.ClosingOpenTag:\n case State.InNormalComment:\n case State.InShortComment:\n case State.ClosingNormalComment:\n emitToken(TokenKind.Literal);\n break;\n case State.OpeningTag:\n emitToken(TokenKind.OpenTag);\n break;\n case State.AfterOpenTag:\n break;\n case State.OpeningSpecial:\n emitToken(TokenKind.OpenTag, State.InShortComment);\n break;\n case State.OpeningDoctype:\n if (index - sectionStart === doctype.length) {\n emitToken(TokenKind.OpenTag);\n } else {\n emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);\n emitToken(TokenKind.Literal);\n }\n break;\n case State.OpeningNormalComment:\n if (index - sectionStart === 2) {\n emitToken(TokenKind.OpenTag);\n } else {\n emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);\n emitToken(TokenKind.Literal);\n }\n break;\n case State.ClosingTag:\n emitToken(TokenKind.CloseTag);\n break;\n default:\n break;\n }\n const _tokens = tokens;\n init('');\n return _tokens;\n}\n\nfunction emitToken(kind: TokenKind, newState = state, end = index) {\n let value = buffer.substring(sectionStart, end);\n if (kind === TokenKind.OpenTag || kind === TokenKind.CloseTag) {\n value = value.toLowerCase();\n }\n if (kind === TokenKind.OpenTag) {\n if (value === 'script') {\n inScript = true;\n } else if (value === 'style') {\n inStyle = true;\n }\n }\n if (kind === TokenKind.CloseTag) {\n inScript = inStyle = false;\n }\n if (!((kind === TokenKind.Literal || kind === TokenKind.Whitespace) && end === sectionStart)) {\n // empty literal should be ignored\n tokens.push({ type: kind, start: sectionStart, end, value });\n }\n if (kind === TokenKind.OpenTagEnd || kind === TokenKind.CloseTag) {\n sectionStart = end + 1;\n state = State.Literal;\n } else {\n sectionStart = end;\n state = newState;\n }\n}\n\nfunction parseLiteral() {\n if (char === Chars.Lt) {\n // <\n emitToken(TokenKind.Literal, State.BeforeOpenTag);\n }\n}\n\nfunction parseBeforeOpenTag() {\n if (inScript || inStyle) {\n if (char === Chars.Sl) {\n state = State.ClosingTag;\n sectionStart = index + 1;\n } else {\n state = State.Literal;\n }\n return;\n }\n if ((char >= Chars.La && char <= Chars.Lz) || (char >= Chars.Ua && char <= Chars.Uz)) {\n // <d\n state = State.OpeningTag;\n sectionStart = index;\n } else if (char === Chars.Sl) {\n // </\n state = State.ClosingTag;\n sectionStart = index + 1;\n } else if (char === Chars.Lt) {\n // <<\n emitToken(TokenKind.Literal);\n } else if (char === Chars.Ep) {\n // <!\n state = State.OpeningSpecial;\n sectionStart = index;\n } else if (char === Chars.Qm) {\n // <?\n // treat as short comment\n sectionStart = index;\n emitToken(TokenKind.OpenTag, State.InShortComment);\n } else {\n // <>\n // any other chars covert to normal state\n state = State.Literal;\n }\n}\n\nfunction parseOpeningTag() {\n if (isWhiteSpace()) {\n // <div ...\n emitToken(TokenKind.OpenTag, State.AfterOpenTag);\n } else if (char === Chars.Gt) {\n // <div>\n emitToken(TokenKind.OpenTag);\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Sl) {\n // <div/\n emitToken(TokenKind.OpenTag, State.ClosingOpenTag);\n }\n}\n\nfunction parseAfterOpenTag() {\n if (char === Chars.Gt) {\n // <div >\n emitToken(TokenKind.Whitespace);\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Sl) {\n // <div /\n emitToken(TokenKind.Whitespace, State.ClosingOpenTag);\n } else if (char === Chars.Eq) {\n // <div ...=...\n emitToken(TokenKind.Whitespace);\n emitToken(TokenKind.AttrValueEq, void 0, index + 1);\n } else if (char === Chars.Sq) {\n // <div ...'...\n emitToken(TokenKind.Whitespace, State.InValueSq);\n } else if (char === Chars.Dq) {\n // <div ...\"...\n emitToken(TokenKind.Whitespace, State.InValueDq);\n } else if (!isWhiteSpace()) {\n // <div ...name...\n emitToken(TokenKind.Whitespace, State.InValueNq);\n }\n}\n\nfunction parseInValueNq() {\n if (char === Chars.Gt) {\n // <div xxx>\n emitToken(TokenKind.AttrValueNq);\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Sl) {\n // <div xxx/\n emitToken(TokenKind.AttrValueNq, State.ClosingOpenTag);\n } else if (char === Chars.Eq) {\n // <div xxx=\n emitToken(TokenKind.AttrValueNq);\n emitToken(TokenKind.AttrValueEq, State.AfterOpenTag, index + 1);\n } else if (isWhiteSpace()) {\n // <div xxx ...\n emitToken(TokenKind.AttrValueNq, State.AfterOpenTag);\n }\n}\n\nfunction parseInValueSq() {\n if (char === Chars.Sq) {\n // <div 'xxx'\n emitToken(TokenKind.AttrValueSq, State.AfterOpenTag, index + 1);\n }\n}\n\nfunction parseInValueDq() {\n if (char === Chars.Dq) {\n // <div \"xxx\", problem same to Sq\n emitToken(TokenKind.AttrValueDq, State.AfterOpenTag, index + 1);\n }\n}\n\nfunction parseClosingOpenTag() {\n if (char === Chars.Gt) {\n // <div />\n emitToken(TokenKind.OpenTagEnd);\n } else {\n // <div /...>\n emitToken(TokenKind.AttrValueNq, State.AfterOpenTag);\n parseAfterOpenTag();\n }\n}\n\nfunction parseOpeningSpecial() {\n switch (char) {\n case Chars.Cl: // <!-\n state = State.OpeningNormalComment;\n break;\n case Chars.Ld: // <!d\n case Chars.Ud: // <!D\n state = State.OpeningDoctype;\n break;\n default:\n emitToken(TokenKind.OpenTag, State.InShortComment);\n break;\n }\n}\n\nfunction parseOpeningDoctype() {\n offset = index - sectionStart;\n if (offset === doctype.length) {\n // <!d, <!d , start: 0, index: 2\n if (isWhiteSpace()) {\n emitToken(TokenKind.OpenTag, State.AfterOpenTag);\n } else {\n unexpected();\n }\n } else if (char === Chars.Gt) {\n // <!DOCT>\n emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);\n emitToken(TokenKind.Literal);\n emitToken(TokenKind.OpenTagEnd);\n } else if (doctype.lower[offset] !== char && doctype.upper[offset] !== char) {\n // <!DOCX...\n emitToken(TokenKind.OpenTag, State.InShortComment, sectionStart + 1);\n }\n}\n\nfunction parseOpeningNormalComment() {\n if (char === Chars.Cl) {\n // <!--\n emitToken(TokenKind.OpenTag, State.InNormalComment, index + 1);\n } else {\n emitToken(TokenKind.OpenTag, State.InShortComment, sectionStart + 1);\n }\n}\n\nfunction parseNormalComment() {\n if (char === Chars.Cl) {\n // <!-- ... -\n emitToken(TokenKind.Literal, State.ClosingNormalComment);\n }\n}\n\nfunction parseShortComment() {\n if (char === Chars.Gt) {\n // <! ... >\n emitToken(TokenKind.Literal);\n emitToken(TokenKind.OpenTagEnd);\n }\n}\n\nfunction parseClosingNormalComment() {\n offset = index - sectionStart;\n if (offset === 2) {\n if (char === Chars.Gt) {\n // <!-- xxx -->\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Cl) {\n // <!-- xxx ---\n emitToken(TokenKind.Literal, void 0, sectionStart + 1);\n } else {\n // <!-- xxx --x\n state = State.InNormalComment;\n }\n } else if (char !== Chars.Cl) {\n // <!-- xxx - ...\n state = State.InNormalComment;\n }\n}\n\nfunction parseClosingTag() {\n offset = index - sectionStart;\n if (inStyle) {\n if (char === Chars.Lt) {\n sectionStart -= 2;\n emitToken(TokenKind.Literal, State.BeforeOpenTag);\n } else if (offset < style.length) {\n if (style.lower[offset] !== char && style.upper[offset] !== char) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (char === Chars.Gt) {\n emitToken(TokenKind.CloseTag);\n } else if (!isWhiteSpace()) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (inScript) {\n if (char === Chars.Lt) {\n sectionStart -= 2;\n emitToken(TokenKind.Literal, State.BeforeOpenTag);\n } else if (offset < script.length) {\n if (script.lower[offset] !== char && script.upper[offset] !== char) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (char === Chars.Gt) {\n emitToken(TokenKind.CloseTag);\n } else if (!isWhiteSpace()) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (char === Chars.Gt) {\n // </ xxx >\n emitToken(TokenKind.CloseTag);\n }\n}\n\nfunction unexpected() {\n throw new SyntaxError(\n `Unexpected token \"${buffer.charAt(index)}\" at ${index} when parse ${state}`,\n );\n}\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 15:56:14\n * @version 1.0.0\n * @desc config.ts\n */\n\nfunction createMap<T>(keys: string, value: T): Record<string, T> {\n return keys.split(',').reduce((pre, now) => {\n pre[now] = value;\n return pre;\n }, Object.create(null));\n}\n\nexport const selfCloseTags = createMap<true>(\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr,!doctype,,!,!--',\n true,\n);\n\nexport const noNestedTags = createMap<true>('li,option,select,textarea', true);\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-20 21:41:39\n * @version 1.0.0\n * @desc utils.ts\n */\n\nexport function getLineRanges(input: string) {\n return input.split('\\n').reduce(\n (arr, line) => {\n arr.push(line.length + 1 + arr[arr.length - 1]);\n return arr;\n },\n [0],\n );\n}\n\nexport function getPosition(ranges: number[], offset: number): [number, number] {\n let line = NaN;\n let column = NaN;\n for (let i = 1; i < ranges.length; i++) {\n if (ranges[i] > offset) {\n line = i;\n column = offset - ranges[i - 1] + 1;\n break;\n }\n }\n return [line, column];\n}\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 00:54:46\n * @version 1.0.0\n * @desc walk.ts\n */\n\nimport { INode, SyntaxKind } from './types';\n\nexport interface WalkOptions {\n enter?(node: INode, parent: INode | undefined, index: number): void;\n leave?(node: INode, parent: INode | undefined, index: number): void;\n}\n\nfunction visit(node: INode, parent: INode | undefined, index: number, options: WalkOptions) {\n options.enter && options.enter(node, parent, index);\n if (node.type === SyntaxKind.Tag && Array.isArray(node.body)) {\n for (let i = 0; i < node.body.length; i++) {\n visit(node.body[i], node, i, options);\n }\n }\n options.leave && options.leave(node, parent, index);\n}\n\nexport function walk(ast: INode[], options: WalkOptions) {\n for (let i = 0; i < ast.length; i++) {\n visit(ast[i], void 0, i, options);\n }\n}\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 00:54:46\n * @version 1.0.0\n * @desc parse.ts\n */\n\nimport { noNestedTags, selfCloseTags } from './config';\nimport { IToken, tokenize, TokenKind } from './tokenize';\nimport { IAttribute, IAttributeValue, INode, ITag, IText, SyntaxKind } from './types';\nimport { getLineRanges, getPosition } from './utils';\nimport { walk } from './walk';\n\ninterface IContext {\n parent: IContext | undefined;\n tag: ITag;\n}\n\nexport interface ParseOptions {\n // create tag's attributes map\n // if true, will set ITag.attributeMap property\n // as a `Record<string, IAttribute>`\n setAttributeMap: boolean;\n}\n\nlet index: number;\nlet count: number;\nlet tokens: IToken[];\nlet tagChain: IContext | undefined;\nlet nodes: INode[];\nlet token: IToken;\nlet node: IText | undefined;\nlet buffer: string;\nlet lines: number[] | undefined;\nlet parseOptions: ParseOptions | undefined;\n\nfunction init(input?: string, options?: ParseOptions) {\n if (input === void 0) {\n count = 0;\n tokens.length = 0;\n buffer = '';\n } else {\n tokens = tokenize(input);\n count = tokens.length;\n buffer = input;\n }\n index = 0;\n tagChain = void 0;\n nodes = [];\n token = void 0 as any;\n node = void 0;\n lines = void 0;\n parseOptions = options;\n}\n\nfunction pushNode(_node: ITag | IText) {\n if (!tagChain) {\n nodes.push(_node);\n } else if (\n _node.type === SyntaxKind.Tag &&\n _node.name === tagChain.tag.name &&\n noNestedTags[_node.name]\n ) {\n tagChain = tagChain.parent;\n pushNode(_node);\n } else if (tagChain.tag.body) {\n tagChain.tag.end = _node.end;\n tagChain.tag.body.push(_node);\n }\n}\n\nfunction pushTagChain(tag: ITag) {\n tagChain = { parent: tagChain, tag: tag };\n node = void 0;\n}\n\nfunction createLiteral(start = token.start, end = token.end, value = token.value): IText {\n return { start, end, value, type: SyntaxKind.Text };\n}\n\nfunction createTag(): ITag {\n return {\n start: token.start - 1, // include <\n end: token.end,\n type: SyntaxKind.Tag,\n open: createLiteral(token.start - 1), // not finished\n name: token.value,\n rawName: buffer.substring(token.start, token.end),\n attributes: [],\n attributeMap: void 0,\n body: null,\n close: null,\n };\n}\n\nfunction createAttribute(): IAttribute {\n return {\n start: token.start,\n end: token.end,\n name: createLiteral(),\n value: void 0,\n };\n}\n\nfunction createAttributeValue(): IAttributeValue {\n return {\n start: token.start,\n end: token.end,\n value:\n token.type === TokenKind.AttrValueNq\n ? token.value\n : token.value.substr(1, token.value.length - 2),\n quote:\n token.type === TokenKind.AttrValueNq\n ? void 0\n : token.type === TokenKind.AttrValueSq\n ? \"'\"\n : '\"',\n };\n}\n\nfunction appendLiteral(_node: IText | IAttributeValue = node as IText) {\n _node.value += token.value;\n _node.end = token.end;\n}\n\nfunction unexpected() {\n if (lines === void 0) {\n lines = getLineRanges(buffer);\n }\n const [line, column] = getPosition(lines, token.start);\n throw new Error(\n `Unexpected token \"${token.value}(${token.type})\" at [${line},${column}]` +\n (tagChain ? ` when parsing tag: ${JSON.stringify(tagChain.tag.name)}.` : ''),\n );\n}\n\nfunction buildAttributeMap(tag: ITag) {\n tag.attributeMap = {};\n for (const attr of tag.attributes) {\n tag.attributeMap[attr.name.value] = attr;\n }\n}\n\nconst enum OpenTagState {\n BeforeAttr,\n InName,\n AfterName,\n AfterEqual,\n InValue,\n}\n\nfunction parseOpenTag() {\n let state = OpenTagState.BeforeAttr;\n\n let attr: IAttribute = void 0 as any;\n\n const tag = createTag();\n pushNode(tag);\n if (tag.name === '' || tag.name === '!' || tag.name === '!--') {\n tag.open.value = '<' + tag.open.value;\n if (index === count) {\n return;\n } else {\n token = tokens[++index];\n if (token.type !== TokenKind.OpenTagEnd) {\n node = createLiteral();\n tag.body = [node];\n while (++index < count) {\n token = tokens[index];\n if (token.type === TokenKind.OpenTagEnd) {\n node = void 0;\n break;\n }\n appendLiteral();\n }\n }\n tag.close = createLiteral(token.start, token.end + 1, `${token.value}>`);\n tag.end = tag.close.end;\n }\n return;\n }\n while (++index < count) {\n token = tokens[index];\n if (token.type === TokenKind.OpenTagEnd) {\n tag.end = tag.open.end = token.end + 1;\n tag.open.value = buffer.substring(tag.open.start, tag.open.end);\n if (token.value === '' && !selfCloseTags[tag.name]) {\n tag.body = [];\n pushTagChain(tag);\n } else {\n tag.body = void 0;\n }\n break;\n } else if (state === OpenTagState.BeforeAttr) {\n if (token.type !== TokenKind.Whitespace) {\n attr = createAttribute();\n state = OpenTagState.InName;\n tag.attributes.push(attr);\n }\n } else if (state === OpenTagState.InName) {\n if (token.type === TokenKind.Whitespace) {\n state = OpenTagState.AfterName;\n } else if (token.type === TokenKind.AttrValueEq) {\n state = OpenTagState.AfterEqual;\n } else {\n appendLiteral(attr.name);\n }\n } else if (state === OpenTagState.AfterName) {\n if (token.type !== TokenKind.Whitespace) {\n if (token.type === TokenKind.AttrValueEq) {\n state = OpenTagState.AfterEqual;\n } else {\n attr = createAttribute();\n state = OpenTagState.InName;\n tag.attributes.push(attr);\n }\n }\n } else if (state === OpenTagState.AfterEqual) {\n if (token.type !== TokenKind.Whitespace) {\n attr.value = createAttributeValue();\n if (token.type === TokenKind.AttrValueNq) {\n state = OpenTagState.InValue;\n } else {\n attr.end = attr.value.end;\n state = OpenTagState.BeforeAttr;\n }\n }\n } else {\n if (token.type === TokenKind.Whitespace) {\n attr.end = attr.value!.end;\n state = OpenTagState.BeforeAttr;\n } else {\n appendLiteral(attr.value);\n }\n }\n }\n}\n\nfunction parseCloseTag() {\n let _context = tagChain;\n while (true) {\n if (!_context || token.value.trim() === _context.tag.name) {\n break;\n }\n _context = _context.parent;\n }\n if (!_context) {\n return;\n }\n _context.tag.close = createLiteral(\n token.start - 2,\n token.end + 1,\n buffer.substring(token.start - 2, token.end + 1),\n );\n _context.tag.end = _context.tag.close.end;\n _context = _context.parent;\n tagChain = _context;\n}\n\nexport function parse(input: string, options?: ParseOptions): INode[] {\n init(input, {\n setAttributeMap: false,\n ...options,\n } as ParseOptions);\n while (index < count) {\n token = tokens[index];\n switch (token.type) {\n case TokenKind.Literal:\n if (!node) {\n node = createLiteral();\n pushNode(node);\n } else {\n appendLiteral(node);\n }\n break;\n case TokenKind.OpenTag:\n node = void 0;\n parseOpenTag();\n break;\n case TokenKind.CloseTag:\n node = void 0;\n parseCloseTag();\n break;\n default:\n unexpected();\n break;\n }\n index++;\n }\n const _nodes = nodes;\n if (parseOptions?.setAttributeMap) {\n walk(_nodes, {\n enter(node: IText | ITag): void {\n if (node.type === SyntaxKind.Tag) {\n buildAttributeMap(node);\n }\n },\n });\n }\n init();\n return _nodes;\n}\n","/*\n * @since 2020-09-09 22:53:14\n * @author acrazing <joking.young@gmail.com>\n */\n\nimport { selfCloseTags } from './config';\nimport { parse } from './parse';\nimport { INode, SyntaxKind } from './types';\n\nexport interface SafeHtmlOptions {\n allowedTags: string[];\n allowedAttrs: string[];\n tagAllowedAttrs: Record<string, string[]>;\n allowedUrl: RegExp;\n}\n\nexport const safeHtmlDefaultOptions: SafeHtmlOptions = {\n allowedTags: [\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blockquote',\n 'br',\n 'button',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'data',\n 'dd',\n 'del',\n 'dfn',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'figcaption',\n 'figure',\n 'footer',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hgroup',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'map',\n 'ol',\n 'p',\n 'picture',\n 'pre',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'u',\n 'ul',\n 'var',\n 'wbr',\n ],\n allowedAttrs: ['style'],\n tagAllowedAttrs: {\n a: ['href', 'target'],\n img: ['src'],\n td: ['rowspan', 'colspan'],\n th: ['rowspan', 'colspan'],\n time: ['datetime'],\n colgroup: ['span'],\n col: ['span'],\n },\n allowedUrl: /^(?:mailto|tel|https?|ftp|[^:]*[^a-z0-9.+-][^:]*):|^[^:]*$/i,\n};\n\nexport function safeHtml(\n input: string,\n options: Partial<SafeHtmlOptions> = {},\n): string {\n const config: SafeHtmlOptions = {\n ...safeHtmlDefaultOptions,\n ...options,\n tagAllowedAttrs: {\n ...safeHtmlDefaultOptions.tagAllowedAttrs,\n ...options.tagAllowedAttrs,\n },\n };\n const ast = parse(input);\n return stringify(ast, config, input);\n}\n\nfunction stringify(\n ast: INode[],\n config: SafeHtmlOptions,\n input: string,\n): string {\n return ast\n .map((node) => {\n if (node.type === SyntaxKind.Text) {\n return node.value;\n }\n if (config.allowedTags.indexOf(node.name) === -1) {\n return '';\n }\n if (selfCloseTags[node.name]) {\n if (node.body !== void 0) {\n throw new Error(\n `self closed tag \"${node.name}\" should not have body`,\n );\n }\n } else {\n if (!node.body || !node.close) {\n throw new Error(`tag \"${node.name}\" should have body and close`);\n }\n }\n const attrs = node.attributes\n .filter((a) => {\n if (\n config.allowedAttrs.indexOf(a.name.value) > -1 ||\n config.tagAllowedAttrs[node.name]?.indexOf(a.name.value) > -1\n ) {\n if (!a.value) {\n return true;\n }\n if (a.name.value !== 'src' && a.name.value !== 'href') {\n return true;\n }\n if (config.allowedUrl.test(a.value.value)) {\n return true;\n }\n return false;\n }\n return false;\n })\n .map((a) => input.substring(a.start, a.end))\n .join(' ');\n const head = '<' + node.rawName + (attrs ? ' ' + attrs : '') + '>';\n if (!node.body) {\n return head;\n }\n return head + stringify(node.body, config, input) + `</${node.rawName}>`;\n })\n .join('');\n}\n"],"names":["index","tokens","buffer","init","unexpected"],"mappings":"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"}
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Html5parser={})}(this,(function(e){"use strict";var t,a,n,r,o,i,u,l,s,d,c;function f(e){return{lower:e.toLowerCase().split("").map((function(e){return e.charCodeAt(0)})),upper:e.toUpperCase().split("").map((function(e){return e.charCodeAt(0)})),length:e.length}}(t=e.SyntaxKind||(e.SyntaxKind={})).Text="Text",t.Tag="Tag";var p=f("!doctype"),v=f("style"),b=f("script");function y(){return 32===l||10===l||9===l||9===l||13===l||12===l}function h(e){a=0,n=e,r=e.length,o=0,i=0,u=[],s=!1,d=!1,c=0}function g(e){for(h(e);i<r;){switch(l=n.charCodeAt(i),a){case 0:w();break;case 1:k();break;case 2:x();break;case 3:A();break;case 4:S();break;case 5:T();break;case 6:O();break;case 7:j();break;case 8:K();break;case 9:N();break;case 10:C();break;case 11:M();break;case 12:E();break;case 13:U();break;case 14:q();break;default:H()}i++}switch(a){case 0:case 1:case 4:case 5:case 6:case 7:case 11:case 12:case 13:m(0);break;case 2:m(1);break;case 3:break;case 8:m(1,12);break;case 9:i-o===p.length?m(1):(m(1,void 0,o+1),m(0));break;case 10:i-o==2?m(1):(m(1,void 0,o+1),m(0));break;case 14:m(3)}var t=u;return h(""),t}function m(e,t,r){void 0===t&&(t=a),void 0===r&&(r=i);var l=n.substring(o,r);1!==e&&3!==e||(l=l.toLowerCase()),1===e&&("script"===l?s=!0:"style"===l&&(d=!0)),3===e&&(s=d=!1),(0!==e&&4!==e||r!==o)&&u.push({type:e,start:o,end:r,value:l}),2===e||3===e?(o=r+1,a=0):(o=r,a=t)}function w(){60===l&&m(0,1)}function k(){s||d?47===l?(a=14,o=i+1):a=0:l>=97&&l<=122||l>=65&&l<=90?(a=2,o=i):47===l?(a=14,o=i+1):60===l?m(0):33===l?(a=8,o=i):63===l?(o=i,m(1,12)):a=0}function x(){y()?m(1,3):62===l?(m(1),m(2)):47===l&&m(1,7)}function A(){62===l?(m(4),m(2)):47===l?m(4,7):61===l?(m(4),m(5,void 0,i+1)):39===l?m(4,5):34===l?m(4,6):y()||m(4,4)}function S(){62===l?(m(6),m(2)):47===l?m(6,7):61===l?(m(6),m(5,3,i+1)):y()&&m(6,3)}function T(){39===l&&m(7,3,i+1)}function O(){34===l&&m(8,3,i+1)}function j(){62===l?m(2):(m(6,3),A())}function K(){switch(l){case 45:a=10;break;case 100:case 68:a=9;break;default:m(1,12)}}function N(){(c=i-o)===p.length?y()?m(1,3):H():62===l?(m(1,void 0,o+1),m(0),m(2)):p.lower[c]!==l&&p.upper[c]!==l&&m(1,12,o+1)}function C(){45===l?m(1,11,i+1):m(1,12,o+1)}function M(){45===l&&m(0,13)}function E(){62===l&&(m(0),m(2))}function U(){2===(c=i-o)?62===l?m(2):45===l?m(0,void 0,o+1):a=11:45!==l&&(a=11)}function q(){c=i-o,d?60===l?(o-=2,m(0,1)):c<v.length?v.lower[c]!==l&&v.upper[c]!==l&&(o-=2,a=0):62===l?m(3):y()||(o-=2,a=0):s?60===l?(o-=2,m(0,1)):c<b.length?b.lower[c]!==l&&b.upper[c]!==l&&(o-=2,a=0):62===l?m(3):y()||(o-=2,a=0):62===l&&m(3)}function H(){throw new SyntaxError('Unexpected token "'+n.charAt(i)+'" at '+i+" when parse "+a)}var z=function(){return(z=Object.assign||function(e){for(var t,a=1,n=arguments.length;a<n;a++)for(var r in t=arguments[a])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e}).apply(this,arguments)};function L(e,t){return e.split(",").reduce((function(e,a){return e[a]=t,e}),Object.create(null))}var P,_,D,J,$,B,F,G,I,Q,R=L("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr,!doctype,,!,!--",!0),V=L("li,option,select,textarea",!0);function W(t,a,n,r){if(r.enter&&r.enter(t,a,n),t.type===e.SyntaxKind.Tag&&Array.isArray(t.body))for(var o=0;o<t.body.length;o++)W(t.body[o],t,o,r);r.leave&&r.leave(t,a,n)}function X(e,t){for(var a=0;a<e.length;a++)W(e[a],void 0,a,t)}function Y(e,t){void 0===e?(_=0,D.length=0,G=""):(D=g(e),_=D.length,G=e),P=0,J=void 0,$=[],B=void 0,F=void 0,I=void 0,Q=t}function Z(t){J?t.type===e.SyntaxKind.Tag&&t.name===J.tag.name&&V[t.name]?(J=J.parent,Z(t)):J.tag.body&&(J.tag.end=t.end,J.tag.body.push(t)):$.push(t)}function ee(e){J={parent:J,tag:e},F=void 0}function te(t,a,n){return void 0===t&&(t=B.start),void 0===a&&(a=B.end),void 0===n&&(n=B.value),{start:t,end:a,value:n,type:e.SyntaxKind.Text}}function ae(){return{start:B.start,end:B.end,name:te(),value:void 0}}function ne(e){void 0===e&&(e=F),e.value+=B.value,e.end=B.end}function re(){void 0===I&&(I=G.split("\n").reduce((function(e,t){return e.push(t.length+1+e[e.length-1]),e}),[0]));var e=function(e,t){var a="function"==typeof Symbol&&e[Symbol.iterator];if(!a)return e;var n,r,o=a.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(e){r={error:e}}finally{try{n&&!n.done&&(a=o.return)&&a.call(o)}finally{if(r)throw r.error}}return i}(function(e,t){for(var a=NaN,n=NaN,r=1;r<e.length;r++)if(e[r]>t){a=r,n=t-e[r-1]+1;break}return[a,n]}(I,B.start),2),t=e[0],a=e[1];throw new Error('Unexpected token "'+B.value+"("+B.type+')" at ['+t+","+a+"]"+(J?" when parsing tag: "+JSON.stringify(J.tag.name)+".":""))}function oe(e){var t,a;e.attributeMap={};try{for(var n=function(e){var t="function"==typeof Symbol&&Symbol.iterator,a=t&&e[t],n=0;if(a)return a.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}(e.attributes),r=n.next();!r.done;r=n.next()){var o=r.value;e.attributeMap[o.name.value]=o}}catch(e){t={error:e}}finally{try{r&&!r.done&&(a=n.return)&&a.call(n)}finally{if(t)throw t.error}}}function ie(){var t=0,a=void 0,n={start:B.start-1,end:B.end,type:e.SyntaxKind.Tag,open:te(B.start-1),name:B.value,rawName:G.substring(B.start,B.end),attributes:[],attributeMap:void 0,body:null,close:null};if(Z(n),""===n.name||"!"===n.name||"!--"===n.name){if(n.open.value="<"+n.open.value,P===_)return;if(2!==(B=D[++P]).type)for(F=te(),n.body=[F];++P<_;){if(2===(B=D[P]).type){F=void 0;break}ne()}return n.close=te(B.start,B.end+1,B.value+">"),void(n.end=n.close.end)}for(;++P<_;){if(2===(B=D[P]).type){n.end=n.open.end=B.end+1,n.open.value=G.substring(n.open.start,n.open.end),""!==B.value||R[n.name]?n.body=void 0:(n.body=[],ee(n));break}0===t?4!==B.type&&(a=ae(),t=1,n.attributes.push(a)):1===t?4===B.type?t=2:5===B.type?t=3:ne(a.name):2===t?4!==B.type&&(5===B.type?t=3:(a=ae(),t=1,n.attributes.push(a))):3===t?4!==B.type&&(a.value={start:B.start,end:B.end,value:6===B.type?B.value:B.value.substr(1,B.value.length-2),quote:6===B.type?void 0:7===B.type?"'":'"'},6===B.type?t=4:(a.end=a.value.end,t=0)):4===B.type?(a.end=a.value.end,t=0):ne(a.value)}}function ue(){for(var e=J;e&&B.value.trim()!==e.tag.name;)e=e.parent;e&&(e.tag.close=te(B.start-2,B.end+1,G.substring(B.start-2,B.end+1)),e.tag.end=e.tag.close.end,e=e.parent,J=e)}function le(t,a){for(Y(t,z({setAttributeMap:!1},a));P<_;){switch((B=D[P]).type){case 0:F?ne(F):Z(F=te());break;case 1:F=void 0,ie();break;case 3:F=void 0,ue();break;default:re()}P++}var n=$;return(null==Q?void 0:Q.setAttributeMap)&&X(n,{enter:function(t){t.type===e.SyntaxKind.Tag&&oe(t)}}),Y(),n}var se={allowedTags:["a","abbr","address","area","article","aside","b","bdi","bdo","big","blockquote","br","button","caption","cite","code","col","colgroup","data","dd","del","dfn","div","dl","dt","em","figcaption","figure","footer","h1","h2","h3","h4","h5","h6","header","hgroup","hr","i","img","ins","kbd","li","main","map","ol","p","picture","pre","q","rp","rt","ruby","s","samp","section","small","span","strong","sub","summary","sup","table","tbody","td","tfoot","th","thead","time","tr","u","ul","var","wbr"],allowedAttrs:["style"],tagAllowedAttrs:{a:["href","target"],img:["src"],td:["rowspan","colspan"],th:["rowspan","colspan"],time:["datetime"],colgroup:["span"],col:["span"]},allowedUrl:/^(?:mailto|tel|https?|ftp|[^:]*[^a-z0-9.+-][^:]*):|^[^:]*$/i};function de(t,a,n){return t.map((function(t){if(t.type===e.SyntaxKind.Text)return t.value;if(-1===a.allowedTags.indexOf(t.name))return"";if(R[t.name]){if(void 0!==t.body)throw new Error('self closed tag "'+t.name+'" should not have body')}else if(!t.body||!t.close)throw new Error('tag "'+t.name+'" should have body and close');var r=t.attributes.filter((function(e){var n;return(a.allowedAttrs.indexOf(e.name.value)>-1||(null===(n=a.tagAllowedAttrs[t.name])||void 0===n?void 0:n.indexOf(e.name.value))>-1)&&(!e.value||("src"!==e.name.value&&"href"!==e.name.value||!!a.allowedUrl.test(e.value.value)))})).map((function(e){return n.substring(e.start,e.end)})).join(" "),o="<"+t.rawName+(r?" "+r:"")+">";return t.body?o+de(t.body,a,n)+"</"+t.rawName+">":o})).join("")}e.parse=le,e.safeHtml=function(e,t){void 0===t&&(t={});var a=z(z(z({},se),t),{tagAllowedAttrs:z(z({},se.tagAllowedAttrs),t.tagAllowedAttrs)});return de(le(e),a,e)},e.safeHtmlDefaultOptions=se,e.tokenize=g,e.walk=X,Object.defineProperty(e,"__esModule",{value:!0})}));
//# sourceMappingURL=html5parser.umd.js.map
{"version":3,"file":"html5parser.umd.js","sources":["../src/types.ts","../src/tokenize.ts","../src/config.ts","../src/parse.ts","../src/walk.ts","../src/utils.ts","../src/safeHtml.ts"],"sourcesContent":["/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-18 15:17:51\n * @version 1.0.0\n * @desc types.ts\n */\n\nexport enum SyntaxKind {\n Text = 'Text',\n Tag = 'Tag',\n}\n\nexport interface IBaseNode {\n start: number;\n end: number;\n}\n\nexport interface IText extends IBaseNode {\n type: SyntaxKind.Text;\n value: string;\n}\n\nexport interface IAttributeValue extends IBaseNode {\n value: string;\n quote: \"'\" | '\"' | undefined;\n}\n\nexport interface IAttribute extends IBaseNode {\n name: IText;\n value: IAttributeValue | undefined;\n}\n\nexport interface ITag extends IBaseNode {\n type: SyntaxKind.Tag;\n // original open tag, <Div id=\"id\">\n open: IText;\n // lower case tag name, div\n name: string;\n // original case tag name, Div\n rawName: string;\n attributes: IAttribute[];\n // the attribute map, if `options.setAttributeMap` is `true`\n // this will be a Record, key is the attribute name literal,\n // value is the attribute self.\n attributeMap: Record<string, IAttribute> | undefined;\n body:\n | Array<ITag | IText> // with close tag\n | undefined // self closed\n | null; // EOF before open tag end\n // original close tag, </DIV >\n close:\n | IText // with close tag\n | undefined // self closed\n | null; // EOF before end or without close tag\n}\n\nexport type INode = IText | ITag;\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 00:54:29\n * @version 1.0.0\n * @desc tokenize.ts\n */\n\nconst enum State {\n Literal,\n BeforeOpenTag,\n OpeningTag,\n AfterOpenTag,\n InValueNq,\n InValueSq,\n InValueDq,\n ClosingOpenTag,\n OpeningSpecial,\n OpeningDoctype,\n OpeningNormalComment,\n InNormalComment,\n InShortComment,\n ClosingNormalComment,\n ClosingTag,\n}\n\nexport const enum TokenKind {\n Literal,\n OpenTag, // trim leading '<'\n OpenTagEnd, // trim tailing '>', only could be '/' or ''\n CloseTag, // trim leading '</' and tailing '>'\n Whitespace, // the whitespace between attributes\n AttrValueEq,\n AttrValueNq,\n AttrValueSq,\n AttrValueDq,\n}\n\nexport interface IToken {\n start: number;\n end: number;\n value: string;\n type: TokenKind;\n}\n\nlet state: State;\nlet buffer: string;\nlet bufSize: number;\nlet sectionStart: number;\nlet index: number;\nlet tokens: IToken[];\nlet char: number;\nlet inScript: boolean;\nlet inStyle: boolean;\nlet offset: number;\n\nfunction makeCodePoints(input: string) {\n return {\n lower: input\n .toLowerCase()\n .split('')\n .map((c) => c.charCodeAt(0)),\n upper: input\n .toUpperCase()\n .split('')\n .map((c) => c.charCodeAt(0)),\n length: input.length,\n };\n}\n\nconst doctype = makeCodePoints('!doctype');\nconst style = makeCodePoints('style');\nconst script = makeCodePoints('script');\n\nconst enum Chars {\n _S = 32, // ' '\n _N = 10, // \\n\n _T = 9, // \\t\n _R = 13, // \\r\n _F = 12, // \\f\n Lt = 60, // <\n Ep = 33, // !\n Cl = 45, // -\n Sl = 47, // /\n Gt = 62, // >\n Qm = 63, // ?\n La = 97, // a\n Lz = 122, // z\n Ua = 65, // A\n Uz = 90, // Z\n Eq = 61, // =\n Sq = 39, // '\n Dq = 34, // \"\n Ld = 100, // d\n Ud = 68, //D\n}\n\nfunction isWhiteSpace() {\n return (\n char === Chars._S ||\n char === Chars._N ||\n char === Chars._T ||\n char === Chars._T ||\n char === Chars._R ||\n char === Chars._F\n );\n}\n\nfunction init(input: string) {\n state = State.Literal;\n buffer = input;\n bufSize = input.length;\n sectionStart = 0;\n index = 0;\n tokens = [];\n inScript = false;\n inStyle = false;\n offset = 0;\n}\n\nexport function tokenize(input: string): IToken[] {\n init(input);\n while (index < bufSize) {\n char = buffer.charCodeAt(index);\n switch (state) {\n case State.Literal:\n parseLiteral();\n break;\n case State.BeforeOpenTag:\n parseBeforeOpenTag();\n break;\n case State.OpeningTag:\n parseOpeningTag();\n break;\n case State.AfterOpenTag:\n parseAfterOpenTag();\n break;\n case State.InValueNq:\n parseInValueNq();\n break;\n case State.InValueSq:\n parseInValueSq();\n break;\n case State.InValueDq:\n parseInValueDq();\n break;\n case State.ClosingOpenTag:\n parseClosingOpenTag();\n break;\n case State.OpeningSpecial:\n parseOpeningSpecial();\n break;\n case State.OpeningDoctype:\n parseOpeningDoctype();\n break;\n case State.OpeningNormalComment:\n parseOpeningNormalComment();\n break;\n case State.InNormalComment:\n parseNormalComment();\n break;\n case State.InShortComment:\n parseShortComment();\n break;\n case State.ClosingNormalComment:\n parseClosingNormalComment();\n break;\n case State.ClosingTag:\n parseClosingTag();\n break;\n default:\n unexpected();\n break;\n }\n index++;\n }\n switch (state) {\n case State.Literal:\n case State.BeforeOpenTag:\n case State.InValueNq:\n case State.InValueSq:\n case State.InValueDq:\n case State.ClosingOpenTag:\n case State.InNormalComment:\n case State.InShortComment:\n case State.ClosingNormalComment:\n emitToken(TokenKind.Literal);\n break;\n case State.OpeningTag:\n emitToken(TokenKind.OpenTag);\n break;\n case State.AfterOpenTag:\n break;\n case State.OpeningSpecial:\n emitToken(TokenKind.OpenTag, State.InShortComment);\n break;\n case State.OpeningDoctype:\n if (index - sectionStart === doctype.length) {\n emitToken(TokenKind.OpenTag);\n } else {\n emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);\n emitToken(TokenKind.Literal);\n }\n break;\n case State.OpeningNormalComment:\n if (index - sectionStart === 2) {\n emitToken(TokenKind.OpenTag);\n } else {\n emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);\n emitToken(TokenKind.Literal);\n }\n break;\n case State.ClosingTag:\n emitToken(TokenKind.CloseTag);\n break;\n default:\n break;\n }\n const _tokens = tokens;\n init('');\n return _tokens;\n}\n\nfunction emitToken(kind: TokenKind, newState = state, end = index) {\n let value = buffer.substring(sectionStart, end);\n if (kind === TokenKind.OpenTag || kind === TokenKind.CloseTag) {\n value = value.toLowerCase();\n }\n if (kind === TokenKind.OpenTag) {\n if (value === 'script') {\n inScript = true;\n } else if (value === 'style') {\n inStyle = true;\n }\n }\n if (kind === TokenKind.CloseTag) {\n inScript = inStyle = false;\n }\n if (!((kind === TokenKind.Literal || kind === TokenKind.Whitespace) && end === sectionStart)) {\n // empty literal should be ignored\n tokens.push({ type: kind, start: sectionStart, end, value });\n }\n if (kind === TokenKind.OpenTagEnd || kind === TokenKind.CloseTag) {\n sectionStart = end + 1;\n state = State.Literal;\n } else {\n sectionStart = end;\n state = newState;\n }\n}\n\nfunction parseLiteral() {\n if (char === Chars.Lt) {\n // <\n emitToken(TokenKind.Literal, State.BeforeOpenTag);\n }\n}\n\nfunction parseBeforeOpenTag() {\n if (inScript || inStyle) {\n if (char === Chars.Sl) {\n state = State.ClosingTag;\n sectionStart = index + 1;\n } else {\n state = State.Literal;\n }\n return;\n }\n if ((char >= Chars.La && char <= Chars.Lz) || (char >= Chars.Ua && char <= Chars.Uz)) {\n // <d\n state = State.OpeningTag;\n sectionStart = index;\n } else if (char === Chars.Sl) {\n // </\n state = State.ClosingTag;\n sectionStart = index + 1;\n } else if (char === Chars.Lt) {\n // <<\n emitToken(TokenKind.Literal);\n } else if (char === Chars.Ep) {\n // <!\n state = State.OpeningSpecial;\n sectionStart = index;\n } else if (char === Chars.Qm) {\n // <?\n // treat as short comment\n sectionStart = index;\n emitToken(TokenKind.OpenTag, State.InShortComment);\n } else {\n // <>\n // any other chars covert to normal state\n state = State.Literal;\n }\n}\n\nfunction parseOpeningTag() {\n if (isWhiteSpace()) {\n // <div ...\n emitToken(TokenKind.OpenTag, State.AfterOpenTag);\n } else if (char === Chars.Gt) {\n // <div>\n emitToken(TokenKind.OpenTag);\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Sl) {\n // <div/\n emitToken(TokenKind.OpenTag, State.ClosingOpenTag);\n }\n}\n\nfunction parseAfterOpenTag() {\n if (char === Chars.Gt) {\n // <div >\n emitToken(TokenKind.Whitespace);\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Sl) {\n // <div /\n emitToken(TokenKind.Whitespace, State.ClosingOpenTag);\n } else if (char === Chars.Eq) {\n // <div ...=...\n emitToken(TokenKind.Whitespace);\n emitToken(TokenKind.AttrValueEq, void 0, index + 1);\n } else if (char === Chars.Sq) {\n // <div ...'...\n emitToken(TokenKind.Whitespace, State.InValueSq);\n } else if (char === Chars.Dq) {\n // <div ...\"...\n emitToken(TokenKind.Whitespace, State.InValueDq);\n } else if (!isWhiteSpace()) {\n // <div ...name...\n emitToken(TokenKind.Whitespace, State.InValueNq);\n }\n}\n\nfunction parseInValueNq() {\n if (char === Chars.Gt) {\n // <div xxx>\n emitToken(TokenKind.AttrValueNq);\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Sl) {\n // <div xxx/\n emitToken(TokenKind.AttrValueNq, State.ClosingOpenTag);\n } else if (char === Chars.Eq) {\n // <div xxx=\n emitToken(TokenKind.AttrValueNq);\n emitToken(TokenKind.AttrValueEq, State.AfterOpenTag, index + 1);\n } else if (isWhiteSpace()) {\n // <div xxx ...\n emitToken(TokenKind.AttrValueNq, State.AfterOpenTag);\n }\n}\n\nfunction parseInValueSq() {\n if (char === Chars.Sq) {\n // <div 'xxx'\n emitToken(TokenKind.AttrValueSq, State.AfterOpenTag, index + 1);\n }\n}\n\nfunction parseInValueDq() {\n if (char === Chars.Dq) {\n // <div \"xxx\", problem same to Sq\n emitToken(TokenKind.AttrValueDq, State.AfterOpenTag, index + 1);\n }\n}\n\nfunction parseClosingOpenTag() {\n if (char === Chars.Gt) {\n // <div />\n emitToken(TokenKind.OpenTagEnd);\n } else {\n // <div /...>\n emitToken(TokenKind.AttrValueNq, State.AfterOpenTag);\n parseAfterOpenTag();\n }\n}\n\nfunction parseOpeningSpecial() {\n switch (char) {\n case Chars.Cl: // <!-\n state = State.OpeningNormalComment;\n break;\n case Chars.Ld: // <!d\n case Chars.Ud: // <!D\n state = State.OpeningDoctype;\n break;\n default:\n emitToken(TokenKind.OpenTag, State.InShortComment);\n break;\n }\n}\n\nfunction parseOpeningDoctype() {\n offset = index - sectionStart;\n if (offset === doctype.length) {\n // <!d, <!d , start: 0, index: 2\n if (isWhiteSpace()) {\n emitToken(TokenKind.OpenTag, State.AfterOpenTag);\n } else {\n unexpected();\n }\n } else if (char === Chars.Gt) {\n // <!DOCT>\n emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);\n emitToken(TokenKind.Literal);\n emitToken(TokenKind.OpenTagEnd);\n } else if (doctype.lower[offset] !== char && doctype.upper[offset] !== char) {\n // <!DOCX...\n emitToken(TokenKind.OpenTag, State.InShortComment, sectionStart + 1);\n }\n}\n\nfunction parseOpeningNormalComment() {\n if (char === Chars.Cl) {\n // <!--\n emitToken(TokenKind.OpenTag, State.InNormalComment, index + 1);\n } else {\n emitToken(TokenKind.OpenTag, State.InShortComment, sectionStart + 1);\n }\n}\n\nfunction parseNormalComment() {\n if (char === Chars.Cl) {\n // <!-- ... -\n emitToken(TokenKind.Literal, State.ClosingNormalComment);\n }\n}\n\nfunction parseShortComment() {\n if (char === Chars.Gt) {\n // <! ... >\n emitToken(TokenKind.Literal);\n emitToken(TokenKind.OpenTagEnd);\n }\n}\n\nfunction parseClosingNormalComment() {\n offset = index - sectionStart;\n if (offset === 2) {\n if (char === Chars.Gt) {\n // <!-- xxx -->\n emitToken(TokenKind.OpenTagEnd);\n } else if (char === Chars.Cl) {\n // <!-- xxx ---\n emitToken(TokenKind.Literal, void 0, sectionStart + 1);\n } else {\n // <!-- xxx --x\n state = State.InNormalComment;\n }\n } else if (char !== Chars.Cl) {\n // <!-- xxx - ...\n state = State.InNormalComment;\n }\n}\n\nfunction parseClosingTag() {\n offset = index - sectionStart;\n if (inStyle) {\n if (char === Chars.Lt) {\n sectionStart -= 2;\n emitToken(TokenKind.Literal, State.BeforeOpenTag);\n } else if (offset < style.length) {\n if (style.lower[offset] !== char && style.upper[offset] !== char) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (char === Chars.Gt) {\n emitToken(TokenKind.CloseTag);\n } else if (!isWhiteSpace()) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (inScript) {\n if (char === Chars.Lt) {\n sectionStart -= 2;\n emitToken(TokenKind.Literal, State.BeforeOpenTag);\n } else if (offset < script.length) {\n if (script.lower[offset] !== char && script.upper[offset] !== char) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (char === Chars.Gt) {\n emitToken(TokenKind.CloseTag);\n } else if (!isWhiteSpace()) {\n sectionStart -= 2;\n state = State.Literal;\n }\n } else if (char === Chars.Gt) {\n // </ xxx >\n emitToken(TokenKind.CloseTag);\n }\n}\n\nfunction unexpected() {\n throw new SyntaxError(\n `Unexpected token \"${buffer.charAt(index)}\" at ${index} when parse ${state}`,\n );\n}\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 15:56:14\n * @version 1.0.0\n * @desc config.ts\n */\n\nfunction createMap<T>(keys: string, value: T): Record<string, T> {\n return keys.split(',').reduce((pre, now) => {\n pre[now] = value;\n return pre;\n }, Object.create(null));\n}\n\nexport const selfCloseTags = createMap<true>(\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr,!doctype,,!,!--',\n true,\n);\n\nexport const noNestedTags = createMap<true>('li,option,select,textarea', true);\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 00:54:46\n * @version 1.0.0\n * @desc parse.ts\n */\n\nimport { noNestedTags, selfCloseTags } from './config';\nimport { IToken, tokenize, TokenKind } from './tokenize';\nimport { IAttribute, IAttributeValue, INode, ITag, IText, SyntaxKind } from './types';\nimport { getLineRanges, getPosition } from './utils';\nimport { walk } from './walk';\n\ninterface IContext {\n parent: IContext | undefined;\n tag: ITag;\n}\n\nexport interface ParseOptions {\n // create tag's attributes map\n // if true, will set ITag.attributeMap property\n // as a `Record<string, IAttribute>`\n setAttributeMap: boolean;\n}\n\nlet index: number;\nlet count: number;\nlet tokens: IToken[];\nlet tagChain: IContext | undefined;\nlet nodes: INode[];\nlet token: IToken;\nlet node: IText | undefined;\nlet buffer: string;\nlet lines: number[] | undefined;\nlet parseOptions: ParseOptions | undefined;\n\nfunction init(input?: string, options?: ParseOptions) {\n if (input === void 0) {\n count = 0;\n tokens.length = 0;\n buffer = '';\n } else {\n tokens = tokenize(input);\n count = tokens.length;\n buffer = input;\n }\n index = 0;\n tagChain = void 0;\n nodes = [];\n token = void 0 as any;\n node = void 0;\n lines = void 0;\n parseOptions = options;\n}\n\nfunction pushNode(_node: ITag | IText) {\n if (!tagChain) {\n nodes.push(_node);\n } else if (\n _node.type === SyntaxKind.Tag &&\n _node.name === tagChain.tag.name &&\n noNestedTags[_node.name]\n ) {\n tagChain = tagChain.parent;\n pushNode(_node);\n } else if (tagChain.tag.body) {\n tagChain.tag.end = _node.end;\n tagChain.tag.body.push(_node);\n }\n}\n\nfunction pushTagChain(tag: ITag) {\n tagChain = { parent: tagChain, tag: tag };\n node = void 0;\n}\n\nfunction createLiteral(start = token.start, end = token.end, value = token.value): IText {\n return { start, end, value, type: SyntaxKind.Text };\n}\n\nfunction createTag(): ITag {\n return {\n start: token.start - 1, // include <\n end: token.end,\n type: SyntaxKind.Tag,\n open: createLiteral(token.start - 1), // not finished\n name: token.value,\n rawName: buffer.substring(token.start, token.end),\n attributes: [],\n attributeMap: void 0,\n body: null,\n close: null,\n };\n}\n\nfunction createAttribute(): IAttribute {\n return {\n start: token.start,\n end: token.end,\n name: createLiteral(),\n value: void 0,\n };\n}\n\nfunction createAttributeValue(): IAttributeValue {\n return {\n start: token.start,\n end: token.end,\n value:\n token.type === TokenKind.AttrValueNq\n ? token.value\n : token.value.substr(1, token.value.length - 2),\n quote:\n token.type === TokenKind.AttrValueNq\n ? void 0\n : token.type === TokenKind.AttrValueSq\n ? \"'\"\n : '\"',\n };\n}\n\nfunction appendLiteral(_node: IText | IAttributeValue = node as IText) {\n _node.value += token.value;\n _node.end = token.end;\n}\n\nfunction unexpected() {\n if (lines === void 0) {\n lines = getLineRanges(buffer);\n }\n const [line, column] = getPosition(lines, token.start);\n throw new Error(\n `Unexpected token \"${token.value}(${token.type})\" at [${line},${column}]` +\n (tagChain ? ` when parsing tag: ${JSON.stringify(tagChain.tag.name)}.` : ''),\n );\n}\n\nfunction buildAttributeMap(tag: ITag) {\n tag.attributeMap = {};\n for (const attr of tag.attributes) {\n tag.attributeMap[attr.name.value] = attr;\n }\n}\n\nconst enum OpenTagState {\n BeforeAttr,\n InName,\n AfterName,\n AfterEqual,\n InValue,\n}\n\nfunction parseOpenTag() {\n let state = OpenTagState.BeforeAttr;\n\n let attr: IAttribute = void 0 as any;\n\n const tag = createTag();\n pushNode(tag);\n if (tag.name === '' || tag.name === '!' || tag.name === '!--') {\n tag.open.value = '<' + tag.open.value;\n if (index === count) {\n return;\n } else {\n token = tokens[++index];\n if (token.type !== TokenKind.OpenTagEnd) {\n node = createLiteral();\n tag.body = [node];\n while (++index < count) {\n token = tokens[index];\n if (token.type === TokenKind.OpenTagEnd) {\n node = void 0;\n break;\n }\n appendLiteral();\n }\n }\n tag.close = createLiteral(token.start, token.end + 1, `${token.value}>`);\n tag.end = tag.close.end;\n }\n return;\n }\n while (++index < count) {\n token = tokens[index];\n if (token.type === TokenKind.OpenTagEnd) {\n tag.end = tag.open.end = token.end + 1;\n tag.open.value = buffer.substring(tag.open.start, tag.open.end);\n if (token.value === '' && !selfCloseTags[tag.name]) {\n tag.body = [];\n pushTagChain(tag);\n } else {\n tag.body = void 0;\n }\n break;\n } else if (state === OpenTagState.BeforeAttr) {\n if (token.type !== TokenKind.Whitespace) {\n attr = createAttribute();\n state = OpenTagState.InName;\n tag.attributes.push(attr);\n }\n } else if (state === OpenTagState.InName) {\n if (token.type === TokenKind.Whitespace) {\n state = OpenTagState.AfterName;\n } else if (token.type === TokenKind.AttrValueEq) {\n state = OpenTagState.AfterEqual;\n } else {\n appendLiteral(attr.name);\n }\n } else if (state === OpenTagState.AfterName) {\n if (token.type !== TokenKind.Whitespace) {\n if (token.type === TokenKind.AttrValueEq) {\n state = OpenTagState.AfterEqual;\n } else {\n attr = createAttribute();\n state = OpenTagState.InName;\n tag.attributes.push(attr);\n }\n }\n } else if (state === OpenTagState.AfterEqual) {\n if (token.type !== TokenKind.Whitespace) {\n attr.value = createAttributeValue();\n if (token.type === TokenKind.AttrValueNq) {\n state = OpenTagState.InValue;\n } else {\n attr.end = attr.value.end;\n state = OpenTagState.BeforeAttr;\n }\n }\n } else {\n if (token.type === TokenKind.Whitespace) {\n attr.end = attr.value!.end;\n state = OpenTagState.BeforeAttr;\n } else {\n appendLiteral(attr.value);\n }\n }\n }\n}\n\nfunction parseCloseTag() {\n let _context = tagChain;\n while (true) {\n if (!_context || token.value.trim() === _context.tag.name) {\n break;\n }\n _context = _context.parent;\n }\n if (!_context) {\n return;\n }\n _context.tag.close = createLiteral(\n token.start - 2,\n token.end + 1,\n buffer.substring(token.start - 2, token.end + 1),\n );\n _context.tag.end = _context.tag.close.end;\n _context = _context.parent;\n tagChain = _context;\n}\n\nexport function parse(input: string, options?: ParseOptions): INode[] {\n init(input, {\n setAttributeMap: false,\n ...options,\n } as ParseOptions);\n while (index < count) {\n token = tokens[index];\n switch (token.type) {\n case TokenKind.Literal:\n if (!node) {\n node = createLiteral();\n pushNode(node);\n } else {\n appendLiteral(node);\n }\n break;\n case TokenKind.OpenTag:\n node = void 0;\n parseOpenTag();\n break;\n case TokenKind.CloseTag:\n node = void 0;\n parseCloseTag();\n break;\n default:\n unexpected();\n break;\n }\n index++;\n }\n const _nodes = nodes;\n if (parseOptions?.setAttributeMap) {\n walk(_nodes, {\n enter(node: IText | ITag): void {\n if (node.type === SyntaxKind.Tag) {\n buildAttributeMap(node);\n }\n },\n });\n }\n init();\n return _nodes;\n}\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-19 00:54:46\n * @version 1.0.0\n * @desc walk.ts\n */\n\nimport { INode, SyntaxKind } from './types';\n\nexport interface WalkOptions {\n enter?(node: INode, parent: INode | undefined, index: number): void;\n leave?(node: INode, parent: INode | undefined, index: number): void;\n}\n\nfunction visit(node: INode, parent: INode | undefined, index: number, options: WalkOptions) {\n options.enter && options.enter(node, parent, index);\n if (node.type === SyntaxKind.Tag && Array.isArray(node.body)) {\n for (let i = 0; i < node.body.length; i++) {\n visit(node.body[i], node, i, options);\n }\n }\n options.leave && options.leave(node, parent, index);\n}\n\nexport function walk(ast: INode[], options: WalkOptions) {\n for (let i = 0; i < ast.length; i++) {\n visit(ast[i], void 0, i, options);\n }\n}\n","/*!\n *\n * Copyright 2017 - acrazing\n *\n * @author acrazing joking.young@gmail.com\n * @since 2017-08-20 21:41:39\n * @version 1.0.0\n * @desc utils.ts\n */\n\nexport function getLineRanges(input: string) {\n return input.split('\\n').reduce(\n (arr, line) => {\n arr.push(line.length + 1 + arr[arr.length - 1]);\n return arr;\n },\n [0],\n );\n}\n\nexport function getPosition(ranges: number[], offset: number): [number, number] {\n let line = NaN;\n let column = NaN;\n for (let i = 1; i < ranges.length; i++) {\n if (ranges[i] > offset) {\n line = i;\n column = offset - ranges[i - 1] + 1;\n break;\n }\n }\n return [line, column];\n}\n","/*\n * @since 2020-09-09 22:53:14\n * @author acrazing <joking.young@gmail.com>\n */\n\nimport { selfCloseTags } from './config';\nimport { parse } from './parse';\nimport { INode, SyntaxKind } from './types';\n\nexport interface SafeHtmlOptions {\n allowedTags: string[];\n allowedAttrs: string[];\n tagAllowedAttrs: Record<string, string[]>;\n allowedUrl: RegExp;\n}\n\nexport const safeHtmlDefaultOptions: SafeHtmlOptions = {\n allowedTags: [\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blockquote',\n 'br',\n 'button',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'data',\n 'dd',\n 'del',\n 'dfn',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'figcaption',\n 'figure',\n 'footer',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hgroup',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'map',\n 'ol',\n 'p',\n 'picture',\n 'pre',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'u',\n 'ul',\n 'var',\n 'wbr',\n ],\n allowedAttrs: ['style'],\n tagAllowedAttrs: {\n a: ['href', 'target'],\n img: ['src'],\n td: ['rowspan', 'colspan'],\n th: ['rowspan', 'colspan'],\n time: ['datetime'],\n colgroup: ['span'],\n col: ['span'],\n },\n allowedUrl: /^(?:mailto|tel|https?|ftp|[^:]*[^a-z0-9.+-][^:]*):|^[^:]*$/i,\n};\n\nexport function safeHtml(\n input: string,\n options: Partial<SafeHtmlOptions> = {},\n): string {\n const config: SafeHtmlOptions = {\n ...safeHtmlDefaultOptions,\n ...options,\n tagAllowedAttrs: {\n ...safeHtmlDefaultOptions.tagAllowedAttrs,\n ...options.tagAllowedAttrs,\n },\n };\n const ast = parse(input);\n return stringify(ast, config, input);\n}\n\nfunction stringify(\n ast: INode[],\n config: SafeHtmlOptions,\n input: string,\n): string {\n return ast\n .map((node) => {\n if (node.type === SyntaxKind.Text) {\n return node.value;\n }\n if (config.allowedTags.indexOf(node.name) === -1) {\n return '';\n }\n if (selfCloseTags[node.name]) {\n if (node.body !== void 0) {\n throw new Error(\n `self closed tag \"${node.name}\" should not have body`,\n );\n }\n } else {\n if (!node.body || !node.close) {\n throw new Error(`tag \"${node.name}\" should have body and close`);\n }\n }\n const attrs = node.attributes\n .filter((a) => {\n if (\n config.allowedAttrs.indexOf(a.name.value) > -1 ||\n config.tagAllowedAttrs[node.name]?.indexOf(a.name.value) > -1\n ) {\n if (!a.value) {\n return true;\n }\n if (a.name.value !== 'src' && a.name.value !== 'href') {\n return true;\n }\n if (config.allowedUrl.test(a.value.value)) {\n return true;\n }\n return false;\n }\n return false;\n })\n .map((a) => input.substring(a.start, a.end))\n .join(' ');\n const head = '<' + node.rawName + (attrs ? ' ' + attrs : '') + '>';\n if (!node.body) {\n return head;\n }\n return head + stringify(node.body, config, input) + `</${node.rawName}>`;\n })\n .join('');\n}\n"],"names":["SyntaxKind","state","buffer","bufSize","sectionStart","index","tokens","char","inScript","inStyle","offset","makeCodePoints","input","lower","toLowerCase","split","map","c","charCodeAt","upper","toUpperCase","length","doctype","style","script","isWhiteSpace","init","tokenize","parseLiteral","parseBeforeOpenTag","parseOpeningTag","parseAfterOpenTag","parseInValueNq","parseInValueSq","parseInValueDq","parseClosingOpenTag","parseOpeningSpecial","parseOpeningDoctype","parseOpeningNormalComment","parseNormalComment","parseShortComment","parseClosingNormalComment","parseClosingTag","unexpected","emitToken","_tokens","kind","newState","end","value","substring","push","type","start","SyntaxError","charAt","createMap","keys","reduce","pre","now","Object","create","count","tagChain","nodes","token","node","lines","parseOptions","selfCloseTags","noNestedTags","visit","parent","options","enter","Tag","Array","isArray","body","i","leave","walk","ast","pushNode","_node","name","tag","pushTagChain","createLiteral","Text","createAttribute","appendLiteral","arr","line","_a","__read","ranges","NaN","column","getPosition","Error","JSON","stringify","buildAttributeMap","attributeMap","_b","__values","attributes","attr","parseOpenTag","open","rawName","close","substr","quote","parseCloseTag","_context","trim","parse","__assign","setAttributeMap","_nodes","safeHtmlDefaultOptions","allowedTags","allowedAttrs","tagAllowedAttrs","a","img","td","th","time","colgroup","col","allowedUrl","config","indexOf","attrs","filter","test","join","head"],"mappings":"mPAUA,IAAYA,ECqCRC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAEJ,SAASC,EAAeC,GACtB,MAAO,CACLC,MAAOD,EACJE,cACAC,MAAM,IACNC,KAAI,SAACC,GAAM,OAAAA,EAAEC,WAAW,MAC3BC,MAAOP,EACJQ,cACAL,MAAM,IACNC,KAAI,SAACC,GAAM,OAAAA,EAAEC,WAAW,MAC3BG,OAAQT,EAAMS,SD1DNrB,EAAAA,eAAAA,8BAEVA,YC4DF,IAAMsB,EAAUX,EAAe,YACzBY,EAAQZ,EAAe,SACvBa,EAASb,EAAe,UAyB9B,SAASc,IACP,YACElB,QACAA,OACAA,OACAA,QACAA,QACAA,EAIJ,SAASmB,EAAKd,GACZX,IACAC,EAASU,EACTT,EAAUS,EAAMS,OAChBjB,EAAe,EACfC,EAAQ,EACRC,EAAS,GACTE,GAAW,EACXC,GAAU,EACVC,EAAS,WAGKiB,EAASf,GAEvB,IADAc,EAAKd,GACEP,EAAQF,GAAS,CAEtB,OADAI,EAAOL,EAAOgB,WAAWb,GACjBJ,GACN,OACE2B,IACA,MACF,OACEC,IACA,MACF,OACEC,IACA,MACF,OACEC,IACA,MACF,OACEC,IACA,MACF,OACEC,IACA,MACF,OACEC,IACA,MACF,OACEC,IACA,MACF,OACEC,IACA,MACF,OACEC,IACA,MACF,QACEC,IACA,MACF,QACEC,IACA,MACF,QACEC,IACA,MACF,QACEC,IACA,MACF,QACEC,IACA,MACF,QACEC,IAGJtC,IAEF,OAAQJ,GACN,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,QACE2C,KACA,MACF,OACEA,KACA,MACF,OACE,MACF,OACEA,QACA,MACF,OACMvC,EAAQD,IAAiBkB,EAAQD,OACnCuB,MAEAA,SAA6B,EAAQxC,EAAe,GACpDwC,MAEF,MACF,QACMvC,EAAQD,GAAiB,EAC3BwC,MAEAA,SAA6B,EAAQxC,EAAe,GACpDwC,MAEF,MACF,QACEA,KAKJ,IAAMC,EAAUvC,EAEhB,OADAoB,EAAK,IACEmB,EAGT,SAASD,EAAUE,EAAiBC,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"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 01:09:54
* @version 1.0.0
* @desc index.ts
*/
export { SyntaxKind, IBaseNode, IAttributeValue, IAttribute, ITag, IText, INode } from './types';
export { TokenKind, IToken, tokenize } from './tokenize';
export { ParseOptions, parse } from './parse';
export { WalkOptions, walk } from './walk';
export { SafeHtmlOptions, safeHtmlDefaultOptions, safeHtml } from './safeHtml';
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc parse.ts
*/
import { INode } from './types';
export interface ParseOptions {
setAttributeMap: boolean;
}
export declare function parse(input: string, options?: ParseOptions): INode[];
export interface SafeHtmlOptions {
allowedTags: string[];
allowedAttrs: string[];
tagAllowedAttrs: Record<string, string[]>;
allowedUrl: RegExp;
}
export declare const safeHtmlDefaultOptions: SafeHtmlOptions;
export declare function safeHtml(input: string, options?: Partial<SafeHtmlOptions>): string;
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:29
* @version 1.0.0
* @desc tokenize.ts
*/
export declare const enum TokenKind {
Literal = 0,
OpenTag = 1,
OpenTagEnd = 2,
CloseTag = 3,
Whitespace = 4,
AttrValueEq = 5,
AttrValueNq = 6,
AttrValueSq = 7,
AttrValueDq = 8
}
export interface IToken {
start: number;
end: number;
value: string;
type: TokenKind;
}
export declare function tokenize(input: string): IToken[];
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-18 15:17:51
* @version 1.0.0
* @desc types.ts
*/
export declare enum SyntaxKind {
Text = "Text",
Tag = "Tag"
}
export interface IBaseNode {
start: number;
end: number;
}
export interface IText extends IBaseNode {
type: SyntaxKind.Text;
value: string;
}
export interface IAttributeValue extends IBaseNode {
value: string;
quote: "'" | '"' | undefined;
}
export interface IAttribute extends IBaseNode {
name: IText;
value: IAttributeValue | undefined;
}
export interface ITag extends IBaseNode {
type: SyntaxKind.Tag;
open: IText;
name: string;
rawName: string;
attributes: IAttribute[];
attributeMap: Record<string, IAttribute> | undefined;
body: Array<ITag | IText> | undefined | null;
close: IText | undefined | null;
}
export declare type INode = IText | ITag;
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-20 21:41:39
* @version 1.0.0
* @desc utils.ts
*/
export declare function getLineRanges(input: string): number[];
export declare function getPosition(ranges: number[], offset: number): [number, number];
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc walk.ts
*/
import { INode } from './types';
export interface WalkOptions {
enter?(node: INode, parent: INode | undefined, index: number): void;
leave?(node: INode, parent: INode | undefined, index: number): void;
}
export declare function walk(ast: INode[], options: WalkOptions): void;
+2
-2
The MIT License (MIT)
Copyright (c) 2016 acrazing
Copyright (c) 2020 acrazing

@@ -21,2 +21,2 @@ Permission is hereby granted, free of charge, to any person obtaining a copy

OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
SOFTWARE.
{
"name": "html5parser",
"description": "A fast, accurate AST parser for HTML5",
"version": "1.2.1",
"description": "A super fast & tiny HTML5 parser",
"version": "2.0.0-next",
"author": "acrazing <joking.young@gmail.com>",

@@ -13,23 +13,15 @@ "keywords": [

"license": "MIT",
"main": "lib/index.js",
"module": "lib/index.mjs",
"types": "lib/index.d.ts",
"main": "dist/html5parser.cjs.js",
"module": "dist/html5parser.es.js",
"umd": "dist/html5parser.umd.js",
"types": "dist/index.d.ts",
"files": [
"assets/",
"lib/",
"dist/",
"src/"
],
"scripts": {
"build": "run-s clean && run-p build:cjs build:esm && run-s build:esm:rename build:cjs:rename",
"build:cjs": "tsc --outDir cjs --module commonjs",
"build:cjs:rename": "run-p build:cjs:rename:js build:cjs:rename:map",
"build:cjs:rename:js": "find ./cjs -type f -name '*.js' | sed -E 's/^\\.\\/cjs\\/(.+)$/\\1/' | xargs -I % mv ./cjs/% ./lib/%",
"build:cjs:rename:map": "find ./cjs -type f -name '*.js.map' | sed -E 's/^\\.\\/cjs\\/(.+)$/\\1/' | xargs -I % mv ./cjs/% ./lib/%",
"build:esm": "tsc --outDir lib --module esnext --declaration",
"build:esm:rename": "run-p build:esm:rename:js build:esm:rename:map",
"build:esm:rename:js": "find ./lib -type f -name '*.js' | sed -E 's/^(.+)\\.js$/\\1/' | xargs -I % mv %.js %.mjs",
"build:esm:rename:map": "find ./lib -type f -name '*.js.map' | sed -E 's/^(.+)\\.js\\.map$/\\1/' | xargs -I % mv %.js.map %.mjs.map",
"clean": "rm -rf cjs esm lib build temp .cache",
"clean": "rm -rf dist temp .cache",
"bundle": "rollup -c rollup.config.js",
"build": "run-s clean bundle",
"prepublishOnly": "run-s test build",
"start": "npm run clean && npm run build:esm -- --watch",
"test": "jest"

@@ -46,15 +38,21 @@ },

"devDependencies": {
"@types/fs-extra": "^9.0.1",
"@types/jest": "^26.0.13",
"@types/node": "^14.6.4",
"@rollup/plugin-commonjs": "^16.0.0",
"@rollup/plugin-node-resolve": "^10.0.0",
"@types/fs-extra": "^9.0.3",
"@types/jest": "^26.0.15",
"@types/node": "^14.14.7",
"@types/node-fetch": "^2.5.7",
"fs-extra": "^9.0.1",
"husky": "^4.3.0",
"jest": "^26.4.2",
"lint-staged": "^10.3.0",
"jest": "^26.6.3",
"lint-staged": "^10.5.1",
"node-fetch": "^2.6.1",
"npm-run-all": "^4.1.5",
"prettier": "^2.1.1",
"ts-jest": "^26.3.0",
"typescript": "^4.0.2"
"prettier": "^2.1.2",
"rollup": "^2.33.1",
"rollup-plugin-sourcemaps": "^0.6.3",
"rollup-plugin-terser": "^7.0.2",
"rollup-plugin-typescript2": "^0.29.0",
"ts-jest": "^26.4.4",
"typescript": "^4.0.5"
},

@@ -101,3 +99,3 @@ "jest": {

"prettier": {
"printWidth": 80,
"printWidth": 100,
"tabWidth": 2,

@@ -115,4 +113,4 @@ "useTabs": false,

"dependencies": {
"tslib": "^2.0.1"
"tslib": "^2.0.3"
}
}
+233
-123
# html5parser
A very tiny and fast html5 AST parser, the result could be manipulated like
ECMAScript ESTree, especially about the attributes.
It is a great platform for helping people in trouble.
`html5parser` is a super fast and tiny **HTML5** parser.
## Introduction
## Highlights
Currently, all the public parsers, like `htmlparser2`, `parser5`, etc,
could not be used for manipulate attributes. For example: the `htmlparser2`
has `startIndex` and `endIndex` for tags and texts, but no range information
about attribute name and values. This project is used for resolve this problem.
Just added ranges for tags, texts, and attribute name and values, and else,
with the information of attribute quote type, (without or with `'`/`"`).
- **[Fast](#benchmark)**: maybe the fastest one you can find on GitHub.
- **Tiny**: the fully packaged bundle size is less than `5kb`.
- **Cross platform**: works in the modern browsers and Node.js.
- **[HTML5 only](#warnings)**: any thing not in the specification will be ignored.
- **Accurate**: every token could be located in source file.
## Install
## Table of Contents
```bash
# var npm
npm install html5parser -S
- [Installation](#installation)
- [Quick start](#quick-start)
- [API Reference](#api-reference)
- Core
- [tokenize()](#tokenizeinput)
- [parse()](#parseinput)
- Utilities
- [walk()](#walkast-options)
- [safeHtml()](#safehtmlinput)
- [safeHtmlDefaultOptions](#safehtmldefaultoptions)
- [Warnings](#warnings)
- [Benchmark](#benchmark)
# var yarn
yarn add html5parser
```
## Installation
## Quick Start
1. Package manager
```ts
import * as html from 'html5parser';
```bash
npm i -S html5parser
const input = `
<!DOCTYPE html>
<html>
<body>
<h1 id="hello">Hello world</h1>
</body>
</html>
`;
# or var yarn
yarn add html5parser
```
const ast = html.parse(input);
2. CDN
html.walk(ast, {
```html
<script src="https://unpkg.com/html5parser@latest/dist/html5parser.umd.js"></script>
```
## Quick start
[![Edit html5parser - quick start](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/keen-wind-2mpwr?fontsize=14&hidenavigation=1&theme=dark)
```typescript jsx
import { parse, walk, SyntaxKind } from 'html5parser';
const ast = parse('<!DOCTYPE html><head><title>Hello html5parser!</title></head></html>');
walk(ast, {
enter: (node) => {
if (node.type === html.SyntaxKind.Tag) {
for (const attr of node.attributes) {
if (attr.value !== void 0) {
// This is used for present the ranges of attributes.
console.log(input.substring(attr.value.start, attr.value.end));
// you can get the value directly:
console.log(attr.value.value);
}
if (node.type === SyntaxKind.Tag && node.name === 'title' && Array.isArray(node.body)) {
const text = node.body[0];
if (text.type !== SyntaxKind.Text) {
return;
}
const div = document.createElement('div');
div.innerHTML = `The title of the input is <strong>${text.value}</strong>`;
document.body.appendChild(div);
}
},
});
```
// Should output:
// hello
## API Reference
### tokenize(input)
Low level API to parse string to tokens:
```typescript jsx
function tokenize(input: string): IToken[];
```
## API
- `IToken`
```ts
// Top level API, parse html to ast tree
export function parse(input: string, options?: ParseOptions): INode[];
```typescript jsx
interface IToken {
start: number;
end: number;
value: string;
type: TokenKind;
}
```
export interface ParseOptions {
// create tag's attributes map
// if true, will set ITag.attributeMap property
// as a `Record<string, IAttribute>`
// see {ITag#attributeMap} bellow
setAttributeMap: boolean;
}
- `TokenKind`
// Low level API, get tokens
export function tokenize(input: string): IToken[];
```typescript jsx
const enum TokenKind {
Literal,
OpenTag, // trim leading '<'
OpenTagEnd, // trim tailing '>', only could be '/' or ''
CloseTag, // trim leading '</' and tailing '>'
Whitespace, // the whitespace between attributes
AttrValueEq,
AttrValueNq,
AttrValueSq,
AttrValueDq,
}
```
// Utils API, walk the ast tree
export function walk(ast: INode[], options: IWalkOptions): void;
### parse(input)
// get safe html, remove danger tag/attributes with whitelist
export function safeHtml(
html: string,
options?: Partial<SafeHtmlOptions>,
): string;
Core API to parse string to AST:
// you can get default value of the options at ./src/safeHtml.ts
export interface SafeHtmlOptions {
allowedTags: string[];
allowedAttrs: string[];
tagAllowedAttrs: Record<string, string[]>;
allowedUrl: RegExp;
}
```typescript jsx
function parse(input: string, options?: ParseOptions): INode[];
```
## Abstract Syntax Tree Spec
- `ParseOptions`
1. `IBaseNode`: the base struct for all the nodes:
```typescript jsx
interface ParseOptions {
// create tag's attributes map
// if true, will set ITag.attributeMap property
// as a `Record<string, IAttribute>`
setAttributeMap: boolean;
}
```
```ts
export interface IBaseNode {
start: number; // the start position of the node (include)
end: number; // the end position of the node (exclude)
}
```
- `INode`
2. `IText`: The text node struct:
```typescript jsx
export type INode = IText | ITag;
```
```ts
export interface IText extends IBaseNode {
type: SyntaxKind.Text;
value: string; // text value
}
```
- `ITag`
3. `ITag`: The tag node struct
```typescript jsx
export interface ITag extends IBaseNode {
type: SyntaxKind.Tag;
// original open tag, <Div id="id">
open: IText;
// lower case tag name, div
name: string;
// original case tag name, Div
rawName: string;
attributes: IAttribute[];
// the attribute map, if `options.setAttributeMap` is `true`
// this will be a Record, key is the attribute name literal,
// value is the attribute self.
attributeMap: Record<string, IAttribute> | undefined;
body:
| Array<ITag | IText> // with close tag
| undefined // self closed
| null; // EOF before open tag end
// original close tag, </DIV >
close:
| IText // with close tag
| undefined // self closed
| null; // EOF before end or without close tag
}
```
```ts
export interface ITag extends IBaseNode {
type: SyntaxKind.Tag;
open: IText;
name: string;
attributes: IAttribute[];
// the attribute map, if `options.setAttributeMap` is `true`
// this will be a Record, key is the attribute name literal,
// value is the attribute self.
attributeMap: Record<string, IAttribute> | undefined;
body:
| Array<ITag | IText> // with close tag
| undefined // self closed
| null; // EOF before open tag end
close:
| IText // with close tag
| undefined // self closed
| null; // EOF before end or without close tag
}
```
- `IAttribute`
4. `IAttribute`: the attribute struct:
```typescript jsx
export interface IAttribute extends IBaseNode {
name: IText;
value: IAttributeValue | undefined;
}
```
```ts
export interface IAttribute extends IBaseNode {
name: IText; // the name of the attribute
value: IAttributeValue | void; // the value of the attribute
}
```
- `IAttributeValue`
5. `IAttributeValue`: the attribute value struct:
```typescript jsx
export interface IAttributeValue extends IBaseNode {
value: string;
quote: "'" | '"' | undefined;
}
```
```ts
// NOTE: the range start and end contains quotes.
export interface IAttributeValue extends IBaseNode {
value: string; // the value text, exclude leading and tailing `'` or `"`
quote: "'" | '"' | void; // the quote type
}
```
- `IText`
6. `INode`: the exposed nodes:
```typescript jsx
export interface IText extends IBaseNode {
type: SyntaxKind.Text;
value: string;
}
```
```ts
export type INode = ITag | IText;
```
- `IBaseNode`
```typescript jsx
export interface IBaseNode {
start: number;
end: number;
}
```
- `SyntaxKind`
```typescript jsx
export enum SyntaxKind {
Text = 'Text',
Tag = 'Tag',
}
```
### walk(ast, options)
Visit all the nodes of the AST with specified callbacks:
```typescript jsx
function walk(ast: INode[], options: WalkOptions): void;
```
- `IWalkOptions`
```typescript jsx
export interface IWalkOptions {
enter?(node: INode, parent: INode | void, index: number): void;
leave?(node: INode, parent: INode | void, index: number): void;
}
```
### safeHtml(input)
Parse input to AST and keep the tags and attributes by whitelists, and then
print it to a string.
```typescript jsx
function safeHtml(input: string, options?: Partial<SafeHtmlOptions>): string;
```
<a name="safehtmloptions"></a>
- `SafeHtmlOptions`
```typescript jsx
export interface SafeHtmlOptions {
allowedTags: string[];
allowedAttrs: string[];
tagAllowedAttrs: Record<string, string[]>;
allowedUrl: RegExp;
}
```
#### safeHtmlDefaultOptions
The default options of [`safeHtml`](#safehtmlinput), you can modify it, its
effect is global.
```typescript jsx
const safeHtmlDefaultOptions: SafeHtmlOptions;
```
## Warnings

@@ -214,2 +302,24 @@

[MIT](./LICENSE)
```
The MIT License (MIT)
Copyright (c) 2020 acrazing
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

@@ -11,6 +11,3 @@ /*!

function createMap<T>(
keys: string,
value: T,
): { [key: number]: T; [key: string]: T } {
function createMap<T>(keys: string, value: T): Record<string, T> {
return keys.split(',').reduce((pre, now) => {

@@ -27,6 +24,2 @@ pre[now] = value;

export const rawTextTags = createMap<true>('script,style', true);
export const noNestedTags = createMap<true>('li,option,select,textarea', true);
export const ANY: any = void 0;

@@ -11,8 +11,6 @@ /*!

export * from './walk';
export * from './types';
export * from './parse';
export * from './tokenize';
export * from './utils';
export * from './config';
export * from './safeHtml';
export { SyntaxKind, IBaseNode, IAttributeValue, IAttribute, ITag, IText, INode } from './types';
export { TokenKind, IToken, tokenize } from './tokenize';
export { ParseOptions, parse } from './parse';
export { WalkOptions, walk } from './walk';
export { SafeHtmlOptions, safeHtmlDefaultOptions, safeHtml } from './safeHtml';

@@ -13,10 +13,3 @@ /*!

import { parse } from './parse';
import {
IAttribute,
IAttributeValue,
INode,
ITag,
IText,
SyntaxKind,
} from './types';
import { IAttribute, IAttributeValue, INode, ITag, IText, SyntaxKind } from './types';

@@ -67,7 +60,3 @@ export let index = 0;

function value(
input: string,
quote: undefined | "'" | '"',
start = index,
): IAttributeValue {
function value(input: string, quote: undefined | "'" | '"', start = index): IAttributeValue {
return {

@@ -99,5 +88,3 @@ start: start,

input: '<div></div>',
nodes: [
tag('<div></div>', 'div', text('<div>', 0), [], [], text('</div>'), 0),
],
nodes: [tag('<div></div>', 'div', text('<div>', 0), [], [], text('</div>'), 0)],
},

@@ -181,11 +168,3 @@ {

text('\n ', 77),
tag(
'<input />',
'input',
text('<input />', 80),
[],
void 0,
null,
80,
),
tag('<input />', 'input', text('<input />', 80), [], void 0, null, 80),
text('\n ', 89),

@@ -264,11 +243,3 @@ tag(

),
tag(
'<html></html>',
'html',
text('<html>', 15),
[],
[],
text('</html>', 21),
15,
),
tag('<html></html>', 'html', text('<html>', 15), [], [], text('</html>', 21), 15),
],

@@ -376,14 +347,3 @@ },

input: '<DIV></DIV>',
nodes: [
tag(
'<DIV></DIV>',
'div',
text('<DIV>', 0),
[],
[],
text('</DIV>', 5),
0,
'DIV',
),
],
nodes: [tag('<DIV></DIV>', 'div', text('<DIV>', 0), [], [], text('</DIV>', 5), 0, 'DIV')],
},

@@ -390,0 +350,0 @@ ];

@@ -11,12 +11,5 @@ /*!

import { ANY, noNestedTags, selfCloseTags } from './config';
import { noNestedTags, selfCloseTags } from './config';
import { IToken, tokenize, TokenKind } from './tokenize';
import {
IAttribute,
IAttributeValue,
INode,
ITag,
IText,
SyntaxKind,
} from './types';
import { IAttribute, IAttributeValue, INode, ITag, IText, SyntaxKind } from './types';
import { getLineRanges, getPosition } from './utils';

@@ -88,7 +81,3 @@ import { walk } from './walk';

function createLiteral(
start = token.start,
end = token.end,
value = token.value,
): IText {
function createLiteral(start = token.start, end = token.end, value = token.value): IText {
return { start, end, value, type: SyntaxKind.Text };

@@ -150,5 +139,3 @@ }

`Unexpected token "${token.value}(${token.type})" at [${line},${column}]` +
(tagChain
? ` when parsing tag: ${JSON.stringify(tagChain.tag.name)}.`
: ''),
(tagChain ? ` when parsing tag: ${JSON.stringify(tagChain.tag.name)}.` : ''),
);

@@ -175,3 +162,3 @@ }

let attr: IAttribute = ANY;
let attr: IAttribute = void 0 as any;

@@ -178,0 +165,0 @@ const tag = createTag();

@@ -9,2 +9,4 @@ /*!

* @desc tokenize.spec.ts
*
* @formatter:off
*/

@@ -23,7 +25,3 @@

export function token(
value: string,
type: TokenKind = TokenKind.Literal,
start = tokenIndex,
) {
export function token(value: string, type: TokenKind = TokenKind.Literal, start = tokenIndex) {
const v = {

@@ -84,4 +82,3 @@ start: start,

name: 'attribute values',
input:
'<div a b= c=1 d e = f = g \'h\'=i "j"k=lmn o=\'pq\' r="st"u>M</div>',
input: '<div a b= c=1 d e = f = g \'h\'=i "j"k=lmn o=\'pq\' r="st"u>M</div>',
tokens: [

@@ -176,4 +173,3 @@ token('div', TokenKind.OpenTag, 1),

name: 'open tag end',
input:
'<a1><b2/><c3 /><d4 / ><e5 f6/><g7 /h8><i9 /j10/><k11//>',
input: '<a1><b2/><c3 /><d4 / ><e5 f6/><g7 /h8><i9 /j10/><k11//>',
tokens: [

@@ -180,0 +176,0 @@ token('a1', TokenKind.OpenTag, 1),

@@ -11,30 +11,30 @@ /*!

enum State {
Literal = 'Literal',
BeforeOpenTag = 'BeforeOpenTag',
OpeningTag = 'OpeningTag',
AfterOpenTag = 'AfterOpenTag',
InValueNq = 'InValueNq',
InValueSq = 'InValueSq',
InValueDq = 'InValueDq',
ClosingOpenTag = 'ClosingOpenTag',
OpeningSpecial = 'OpeningSpecial',
OpeningDoctype = 'OpeningDoctype',
OpeningNormalComment = 'OpeningNormalComment',
InNormalComment = 'InNormalComment',
InShortComment = 'InShortComment',
ClosingNormalComment = 'ClosingNormalComment',
ClosingTag = 'ClosingTag',
const enum State {
Literal,
BeforeOpenTag,
OpeningTag,
AfterOpenTag,
InValueNq,
InValueSq,
InValueDq,
ClosingOpenTag,
OpeningSpecial,
OpeningDoctype,
OpeningNormalComment,
InNormalComment,
InShortComment,
ClosingNormalComment,
ClosingTag,
}
export enum TokenKind {
Literal = 'Literal',
OpenTag = 'OpenTag', // trim leading '<'
OpenTagEnd = 'OpenTagEnd', // trim tailing '>', only could be '/' or ''
CloseTag = 'CloseTag', // trim leading '</' and tailing '>'
Whitespace = 'Whitespace', // the whitespace between attributes
AttrValueEq = 'AttrValueEq',
AttrValueNq = 'AttrValueNq',
AttrValueSq = 'AttrValueSq',
AttrValueDq = 'AttrValueDq',
export const enum TokenKind {
Literal,
OpenTag, // trim leading '<'
OpenTagEnd, // trim tailing '>', only could be '/' or ''
CloseTag, // trim leading '</' and tailing '>'
Whitespace, // the whitespace between attributes
AttrValueEq,
AttrValueNq,
AttrValueSq,
AttrValueDq,
}

@@ -78,23 +78,23 @@

enum Chars {
_S = ' '.charCodeAt(0),
_N = '\n'.charCodeAt(0),
_T = '\t'.charCodeAt(0),
_R = '\r'.charCodeAt(0),
_F = '\f'.charCodeAt(0),
Lt = '<'.charCodeAt(0),
Ep = '!'.charCodeAt(0),
Cl = '-'.charCodeAt(0),
Sl = '/'.charCodeAt(0),
Gt = '>'.charCodeAt(0),
Qm = '?'.charCodeAt(0),
La = 'a'.charCodeAt(0),
Lz = 'z'.charCodeAt(0),
Ua = 'A'.charCodeAt(0),
Uz = 'Z'.charCodeAt(0),
Eq = '='.charCodeAt(0),
Sq = "'".charCodeAt(0),
Dq = '"'.charCodeAt(0),
Ld = 'd'.charCodeAt(0),
Ud = 'D'.charCodeAt(0),
const enum Chars {
_S = 32, // ' '
_N = 10, // \n
_T = 9, // \t
_R = 13, // \r
_F = 12, // \f
Lt = 60, // <
Ep = 33, // !
Cl = 45, // -
Sl = 47, // /
Gt = 62, // >
Qm = 63, // ?
La = 97, // a
Lz = 122, // z
Ua = 65, // A
Uz = 90, // Z
Eq = 61, // =
Sq = 39, // '
Dq = 34, // "
Ld = 100, // d
Ud = 68, //D
}

@@ -243,8 +243,3 @@

}
if (
!(
(kind === TokenKind.Literal || kind === TokenKind.Whitespace) &&
end === sectionStart
)
) {
if (!((kind === TokenKind.Literal || kind === TokenKind.Whitespace) && end === sectionStart)) {
// empty literal should be ignored

@@ -279,6 +274,3 @@ tokens.push({ type: kind, start: sectionStart, end, value });

}
if (
(char >= Chars.La && char <= Chars.Lz) ||
(char >= Chars.Ua && char <= Chars.Uz)
) {
if ((char >= Chars.La && char <= Chars.Lz) || (char >= Chars.Ua && char <= Chars.Uz)) {
// <d

@@ -509,6 +501,4 @@ state = State.OpeningTag;

throw new SyntaxError(
`Unexpected token "${buffer.charAt(
index,
)}" at ${index} when parse ${state}`,
`Unexpected token "${buffer.charAt(index)}" at ${index} when parse ${state}`,
);
}

@@ -11,32 +11,2 @@ /*!

import { tokenize } from './tokenize';
export function inspectToken(input: string): string {
const tokens = tokenize(input);
let output = '';
let upper = '';
let down = '';
const max = 120;
let pos: string;
let value: string;
let width: number;
for (const token of tokens) {
pos = token.start.toString();
value = JSON.stringify(token.value);
value = value.substr(1, value.length - 2);
width = Math.max(pos.length, value.length) + 1;
upper += value.padEnd(width, ' ') + '|';
down += pos.padEnd(width, ' ') + '|';
if (upper.length > max) {
output += `${upper}\n${down}\n\n`;
upper = '';
down = '';
}
}
if (upper.length > 0) {
output += `${upper}\n${down}\n`;
}
return output;
}
export function getLineRanges(input: string) {

@@ -52,6 +22,3 @@ return input.split('\n').reduce(

export function getPosition(
ranges: number[],
offset: number,
): [number, number] {
export function getPosition(ranges: number[], offset: number): [number, number] {
let line = NaN;

@@ -58,0 +25,0 @@ let column = NaN;

@@ -13,13 +13,8 @@ /*!

export interface IWalkOptions {
enter?(node: INode, parent: INode | void, index: number): void;
leave?(node: INode, parent: INode | void, index: number): void;
export interface WalkOptions {
enter?(node: INode, parent: INode | undefined, index: number): void;
leave?(node: INode, parent: INode | undefined, index: number): void;
}
function visit(
node: INode,
parent: INode | void,
index: number,
options: IWalkOptions,
) {
function visit(node: INode, parent: INode | undefined, index: number, options: WalkOptions) {
options.enter && options.enter(node, parent, index);

@@ -34,3 +29,3 @@ if (node.type === SyntaxKind.Tag && Array.isArray(node.body)) {

export function walk(ast: INode[], options: IWalkOptions) {
export function walk(ast: INode[], options: WalkOptions) {
for (let i = 0; i < ast.length; i++) {

@@ -37,0 +32,0 @@ visit(ast[i], void 0, i, options);

/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 15:56:14
* @version 1.0.0
* @desc config.ts
*/
export declare const selfCloseTags: {
[key: string]: true;
[key: number]: true;
};
export declare const rawTextTags: {
[key: string]: true;
[key: number]: true;
};
export declare const noNestedTags: {
[key: string]: true;
[key: number]: true;
};
export declare const ANY: any;
"use strict";
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 15:56:14
* @version 1.0.0
* @desc config.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ANY = exports.noNestedTags = exports.rawTextTags = exports.selfCloseTags = void 0;
function createMap(keys, value) {
return keys.split(',').reduce(function (pre, now) {
pre[now] = value;
return pre;
}, Object.create(null));
}
exports.selfCloseTags = createMap('area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr,!doctype,,!,!--', true);
exports.rawTextTags = createMap('script,style', true);
exports.noNestedTags = createMap('li,option,select,textarea', true);
exports.ANY = void 0;
//# sourceMappingURL=config.js.map
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,SAAS,SAAS,CAChB,IAAY,EACZ,KAAQ;IAER,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,GAAG;QACrC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1B,CAAC;AAEY,QAAA,aAAa,GAAG,SAAS,CACpC,sFAAsF,EACtF,IAAI,CACL,CAAC;AAEW,QAAA,WAAW,GAAG,SAAS,CAAO,cAAc,EAAE,IAAI,CAAC,CAAC;AAEpD,QAAA,YAAY,GAAG,SAAS,CAAO,2BAA2B,EAAE,IAAI,CAAC,CAAC;AAElE,QAAA,GAAG,GAAQ,KAAK,CAAC,CAAC"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 15:56:14
* @version 1.0.0
* @desc config.ts
*/
function createMap(keys, value) {
return keys.split(',').reduce(function (pre, now) {
pre[now] = value;
return pre;
}, Object.create(null));
}
export var selfCloseTags = createMap('area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr,!doctype,,!,!--', true);
export var rawTextTags = createMap('script,style', true);
export var noNestedTags = createMap('li,option,select,textarea', true);
export var ANY = void 0;
//# sourceMappingURL=config.js.map
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,SAAS,SAAS,CAChB,IAAY,EACZ,KAAQ;IAER,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,GAAG;QACrC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,IAAM,aAAa,GAAG,SAAS,CACpC,sFAAsF,EACtF,IAAI,CACL,CAAC;AAEF,MAAM,CAAC,IAAM,WAAW,GAAG,SAAS,CAAO,cAAc,EAAE,IAAI,CAAC,CAAC;AAEjE,MAAM,CAAC,IAAM,YAAY,GAAG,SAAS,CAAO,2BAA2B,EAAE,IAAI,CAAC,CAAC;AAE/E,MAAM,CAAC,IAAM,GAAG,GAAQ,KAAK,CAAC,CAAC"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 01:09:54
* @version 1.0.0
* @desc index.ts
*/
export * from './walk';
export * from './types';
export * from './parse';
export * from './tokenize';
export * from './utils';
export * from './config';
export * from './safeHtml';
"use strict";
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 01:09:54
* @version 1.0.0
* @desc index.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
tslib_1.__exportStar(require("./walk"), exports);
tslib_1.__exportStar(require("./types"), exports);
tslib_1.__exportStar(require("./parse"), exports);
tslib_1.__exportStar(require("./tokenize"), exports);
tslib_1.__exportStar(require("./utils"), exports);
tslib_1.__exportStar(require("./config"), exports);
tslib_1.__exportStar(require("./safeHtml"), exports);
//# sourceMappingURL=index.js.map
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,iDAAuB;AACvB,kDAAwB;AACxB,kDAAwB;AACxB,qDAA2B;AAC3B,kDAAwB;AACxB,mDAAyB;AACzB,qDAA2B"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 01:09:54
* @version 1.0.0
* @desc index.ts
*/
export * from './walk';
export * from './types';
export * from './parse';
export * from './tokenize';
export * from './utils';
export * from './config';
export * from './safeHtml';
//# sourceMappingURL=index.js.map
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-22 22:17:46
* @version 1.0.0
* @desc misc.spec.ts
*/
export {};
"use strict";
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-22 22:17:46
* @version 1.0.0
* @desc misc.spec.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var fs = tslib_1.__importStar(require("fs-extra"));
var node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
var path = tslib_1.__importStar(require("path"));
var parse_1 = require("./parse");
function run(url) {
var id = url.replace(/[^\w\d]+/g, '_').replace(/^_+|_+$/g, '');
return node_fetch_1.default(url)
.then(function (r) { return r.text(); })
.then(function (d) {
console.log('[FETCH:OK]: %s', url);
fs.outputFileSync(path.join(process.cwd(), 'temp', id + ".html"), d);
console.time('parse:' + url);
var ast = parse_1.parse(d);
console.timeEnd('parse:' + url);
fs.outputJSONSync(path.join(process.cwd(), 'temp', id + ".json"), ast, {
spaces: 2,
});
})
.catch(function (err) {
console.error('[ERR]: %s, %s', id, err.message);
});
}
var scenes = [
'https://www.baidu.com/',
'https://www.qq.com/?fromdefault',
'https://www.taobao.com/',
];
describe('real scenarios', function () {
var e_1, _a;
var _loop_1 = function (scene) {
it("parse " + scene, function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
return [2 /*return*/, run(scene)];
}); }); });
};
try {
for (var scenes_1 = tslib_1.__values(scenes), scenes_1_1 = scenes_1.next(); !scenes_1_1.done; scenes_1_1 = scenes_1.next()) {
var scene = scenes_1_1.value;
_loop_1(scene);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (scenes_1_1 && !scenes_1_1.done && (_a = scenes_1.return)) _a.call(scenes_1);
}
finally { if (e_1) throw e_1.error; }
}
});
//# sourceMappingURL=misc.spec.js.map
{"version":3,"file":"misc.spec.js","sourceRoot":"","sources":["../src/misc.spec.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,mDAA+B;AAC/B,kEAA+B;AAC/B,iDAA6B;AAC7B,iCAAgC;AAEhC,SAAS,GAAG,CAAC,GAAW;IACtB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACjE,OAAO,oBAAK,CAAC,GAAG,CAAC;SACd,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC;SACrB,IAAI,CAAC,UAAC,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QACnC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAK,EAAE,UAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAC7B,IAAM,GAAG,GAAG,aAAK,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAChC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAK,EAAE,UAAO,CAAC,EAAE,GAAG,EAAE;YACrE,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;IACL,CAAC,CAAC;SACD,KAAK,CAAC,UAAC,GAAG;QACT,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,IAAM,MAAM,GAAG;IACb,wBAAwB;IACxB,iCAAiC;IACjC,yBAAyB;CAC1B,CAAC;AAEF,QAAQ,CAAC,gBAAgB,EAAE;;4BACd,KAAK;QACd,EAAE,CAAC,WAAS,KAAO,EAAE;YAAY,sBAAA,GAAG,CAAC,KAAK,CAAC,EAAA;iBAAA,CAAC,CAAC;;;QAD/C,KAAoB,IAAA,WAAA,iBAAA,MAAM,CAAA,8BAAA;YAArB,IAAM,KAAK,mBAAA;oBAAL,KAAK;SAEf;;;;;;;;;AACH,CAAC,CAAC,CAAC"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-22 22:17:46
* @version 1.0.0
* @desc misc.spec.ts
*/
import { __awaiter, __generator, __values } from "tslib";
import * as fs from 'fs-extra';
import fetch from 'node-fetch';
import * as path from 'path';
import { parse } from './parse';
function run(url) {
var id = url.replace(/[^\w\d]+/g, '_').replace(/^_+|_+$/g, '');
return fetch(url)
.then(function (r) { return r.text(); })
.then(function (d) {
console.log('[FETCH:OK]: %s', url);
fs.outputFileSync(path.join(process.cwd(), 'temp', id + ".html"), d);
console.time('parse:' + url);
var ast = parse(d);
console.timeEnd('parse:' + url);
fs.outputJSONSync(path.join(process.cwd(), 'temp', id + ".json"), ast, {
spaces: 2,
});
})
.catch(function (err) {
console.error('[ERR]: %s, %s', id, err.message);
});
}
var scenes = [
'https://www.baidu.com/',
'https://www.qq.com/?fromdefault',
'https://www.taobao.com/',
];
describe('real scenarios', function () {
var e_1, _a;
var _loop_1 = function (scene) {
it("parse " + scene, function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
return [2 /*return*/, run(scene)];
}); }); });
};
try {
for (var scenes_1 = __values(scenes), scenes_1_1 = scenes_1.next(); !scenes_1_1.done; scenes_1_1 = scenes_1.next()) {
var scene = scenes_1_1.value;
_loop_1(scene);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (scenes_1_1 && !scenes_1_1.done && (_a = scenes_1.return)) _a.call(scenes_1);
}
finally { if (e_1) throw e_1.error; }
}
});
//# sourceMappingURL=misc.spec.js.map
{"version":3,"file":"misc.spec.js","sourceRoot":"","sources":["../src/misc.spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;;AAEH,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,SAAS,GAAG,CAAC,GAAW;IACtB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC,GAAG,CAAC;SACd,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC;SACrB,IAAI,CAAC,UAAC,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QACnC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAK,EAAE,UAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAC7B,IAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAChC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAK,EAAE,UAAO,CAAC,EAAE,GAAG,EAAE;YACrE,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;IACL,CAAC,CAAC;SACD,KAAK,CAAC,UAAC,GAAG;QACT,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,IAAM,MAAM,GAAG;IACb,wBAAwB;IACxB,iCAAiC;IACjC,yBAAyB;CAC1B,CAAC;AAEF,QAAQ,CAAC,gBAAgB,EAAE;;4BACd,KAAK;QACd,EAAE,CAAC,WAAS,KAAO,EAAE;YAAY,sBAAA,GAAG,CAAC,KAAK,CAAC,EAAA;iBAAA,CAAC,CAAC;;;QAD/C,KAAoB,IAAA,WAAA,SAAA,MAAM,CAAA,8BAAA;YAArB,IAAM,KAAK,mBAAA;oBAAL,KAAK;SAEf;;;;;;;;;AACH,CAAC,CAAC,CAAC"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc parse.ts
*/
import { INode } from './types';
export interface ParseOptions {
setAttributeMap: boolean;
}
export declare function parse(input: string, options?: ParseOptions): INode[];
"use strict";
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc parse.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.parse = void 0;
var tslib_1 = require("tslib");
var config_1 = require("./config");
var tokenize_1 = require("./tokenize");
var types_1 = require("./types");
var utils_1 = require("./utils");
var walk_1 = require("./walk");
var index;
var count;
var tokens;
var tagChain;
var nodes;
var token;
var node;
var buffer;
var lines;
var parseOptions;
function init(input, options) {
if (input === void 0) {
count = 0;
tokens.length = 0;
buffer = '';
}
else {
tokens = tokenize_1.tokenize(input);
count = tokens.length;
buffer = input;
}
index = 0;
tagChain = void 0;
nodes = [];
token = void 0;
node = void 0;
lines = void 0;
parseOptions = options;
}
function pushNode(_node) {
if (!tagChain) {
nodes.push(_node);
}
else if (_node.type === types_1.SyntaxKind.Tag &&
_node.name === tagChain.tag.name &&
config_1.noNestedTags[_node.name]) {
tagChain = tagChain.parent;
pushNode(_node);
}
else if (tagChain.tag.body) {
tagChain.tag.end = _node.end;
tagChain.tag.body.push(_node);
}
}
function pushTagChain(tag) {
tagChain = { parent: tagChain, tag: tag };
node = void 0;
}
function createLiteral(start, end, value) {
if (start === void 0) { start = token.start; }
if (end === void 0) { end = token.end; }
if (value === void 0) { value = token.value; }
return { start: start, end: end, value: value, type: types_1.SyntaxKind.Text };
}
function createTag() {
return {
start: token.start - 1,
end: token.end,
type: types_1.SyntaxKind.Tag,
open: createLiteral(token.start - 1),
name: token.value,
rawName: buffer.substring(token.start, token.end),
attributes: [],
attributeMap: void 0,
body: null,
close: null,
};
}
function createAttribute() {
return {
start: token.start,
end: token.end,
name: createLiteral(),
value: void 0,
};
}
function createAttributeValue() {
return {
start: token.start,
end: token.end,
value: token.type === tokenize_1.TokenKind.AttrValueNq
? token.value
: token.value.substr(1, token.value.length - 2),
quote: token.type === tokenize_1.TokenKind.AttrValueNq
? void 0
: token.type === tokenize_1.TokenKind.AttrValueSq
? "'"
: '"',
};
}
function appendLiteral(_node) {
if (_node === void 0) { _node = node; }
_node.value += token.value;
_node.end = token.end;
}
function unexpected() {
if (lines === void 0) {
lines = utils_1.getLineRanges(buffer);
}
var _a = tslib_1.__read(utils_1.getPosition(lines, token.start), 2), line = _a[0], column = _a[1];
throw new Error("Unexpected token \"" + token.value + "(" + token.type + ")\" at [" + line + "," + column + "]" +
(tagChain
? " when parsing tag: " + JSON.stringify(tagChain.tag.name) + "."
: ''));
}
function buildAttributeMap(tag) {
var e_1, _a;
tag.attributeMap = {};
try {
for (var _b = tslib_1.__values(tag.attributes), _c = _b.next(); !_c.done; _c = _b.next()) {
var attr = _c.value;
tag.attributeMap[attr.name.value] = attr;
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
}
function parseOpenTag() {
var state = 0 /* BeforeAttr */;
var attr = config_1.ANY;
var tag = createTag();
pushNode(tag);
if (tag.name === '' || tag.name === '!' || tag.name === '!--') {
tag.open.value = '<' + tag.open.value;
if (index === count) {
return;
}
else {
token = tokens[++index];
if (token.type !== tokenize_1.TokenKind.OpenTagEnd) {
node = createLiteral();
tag.body = [node];
while (++index < count) {
token = tokens[index];
if (token.type === tokenize_1.TokenKind.OpenTagEnd) {
node = void 0;
break;
}
appendLiteral();
}
}
tag.close = createLiteral(token.start, token.end + 1, token.value + ">");
tag.end = tag.close.end;
}
return;
}
while (++index < count) {
token = tokens[index];
if (token.type === tokenize_1.TokenKind.OpenTagEnd) {
tag.end = tag.open.end = token.end + 1;
tag.open.value = buffer.substring(tag.open.start, tag.open.end);
if (token.value === '' && !config_1.selfCloseTags[tag.name]) {
tag.body = [];
pushTagChain(tag);
}
else {
tag.body = void 0;
}
break;
}
else if (state === 0 /* BeforeAttr */) {
if (token.type !== tokenize_1.TokenKind.Whitespace) {
attr = createAttribute();
state = 1 /* InName */;
tag.attributes.push(attr);
}
}
else if (state === 1 /* InName */) {
if (token.type === tokenize_1.TokenKind.Whitespace) {
state = 2 /* AfterName */;
}
else if (token.type === tokenize_1.TokenKind.AttrValueEq) {
state = 3 /* AfterEqual */;
}
else {
appendLiteral(attr.name);
}
}
else if (state === 2 /* AfterName */) {
if (token.type !== tokenize_1.TokenKind.Whitespace) {
if (token.type === tokenize_1.TokenKind.AttrValueEq) {
state = 3 /* AfterEqual */;
}
else {
attr = createAttribute();
state = 1 /* InName */;
tag.attributes.push(attr);
}
}
}
else if (state === 3 /* AfterEqual */) {
if (token.type !== tokenize_1.TokenKind.Whitespace) {
attr.value = createAttributeValue();
if (token.type === tokenize_1.TokenKind.AttrValueNq) {
state = 4 /* InValue */;
}
else {
attr.end = attr.value.end;
state = 0 /* BeforeAttr */;
}
}
}
else {
if (token.type === tokenize_1.TokenKind.Whitespace) {
attr.end = attr.value.end;
state = 0 /* BeforeAttr */;
}
else {
appendLiteral(attr.value);
}
}
}
}
function parseCloseTag() {
var _context = tagChain;
while (true) {
if (!_context || token.value.trim() === _context.tag.name) {
break;
}
_context = _context.parent;
}
if (!_context) {
return;
}
_context.tag.close = createLiteral(token.start - 2, token.end + 1, buffer.substring(token.start - 2, token.end + 1));
_context.tag.end = _context.tag.close.end;
_context = _context.parent;
tagChain = _context;
}
function parse(input, options) {
init(input, tslib_1.__assign({ setAttributeMap: false }, options));
while (index < count) {
token = tokens[index];
switch (token.type) {
case tokenize_1.TokenKind.Literal:
if (!node) {
node = createLiteral();
pushNode(node);
}
else {
appendLiteral(node);
}
break;
case tokenize_1.TokenKind.OpenTag:
node = void 0;
parseOpenTag();
break;
case tokenize_1.TokenKind.CloseTag:
node = void 0;
parseCloseTag();
break;
default:
unexpected();
break;
}
index++;
}
var _nodes = nodes;
if (parseOptions === null || parseOptions === void 0 ? void 0 : parseOptions.setAttributeMap) {
walk_1.walk(_nodes, {
enter: function (node) {
if (node.type === types_1.SyntaxKind.Tag) {
buildAttributeMap(node);
}
},
});
}
init();
return _nodes;
}
exports.parse = parse;
//# sourceMappingURL=parse.js.map
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc parse.ts
*/
import { __assign, __read, __values } from "tslib";
import { ANY, noNestedTags, selfCloseTags } from './config';
import { tokenize, TokenKind } from './tokenize';
import { SyntaxKind, } from './types';
import { getLineRanges, getPosition } from './utils';
import { walk } from './walk';
var index;
var count;
var tokens;
var tagChain;
var nodes;
var token;
var node;
var buffer;
var lines;
var parseOptions;
function init(input, options) {
if (input === void 0) {
count = 0;
tokens.length = 0;
buffer = '';
}
else {
tokens = tokenize(input);
count = tokens.length;
buffer = input;
}
index = 0;
tagChain = void 0;
nodes = [];
token = void 0;
node = void 0;
lines = void 0;
parseOptions = options;
}
function pushNode(_node) {
if (!tagChain) {
nodes.push(_node);
}
else if (_node.type === SyntaxKind.Tag &&
_node.name === tagChain.tag.name &&
noNestedTags[_node.name]) {
tagChain = tagChain.parent;
pushNode(_node);
}
else if (tagChain.tag.body) {
tagChain.tag.end = _node.end;
tagChain.tag.body.push(_node);
}
}
function pushTagChain(tag) {
tagChain = { parent: tagChain, tag: tag };
node = void 0;
}
function createLiteral(start, end, value) {
if (start === void 0) { start = token.start; }
if (end === void 0) { end = token.end; }
if (value === void 0) { value = token.value; }
return { start: start, end: end, value: value, type: SyntaxKind.Text };
}
function createTag() {
return {
start: token.start - 1,
end: token.end,
type: SyntaxKind.Tag,
open: createLiteral(token.start - 1),
name: token.value,
rawName: buffer.substring(token.start, token.end),
attributes: [],
attributeMap: void 0,
body: null,
close: null,
};
}
function createAttribute() {
return {
start: token.start,
end: token.end,
name: createLiteral(),
value: void 0,
};
}
function createAttributeValue() {
return {
start: token.start,
end: token.end,
value: token.type === TokenKind.AttrValueNq
? token.value
: token.value.substr(1, token.value.length - 2),
quote: token.type === TokenKind.AttrValueNq
? void 0
: token.type === TokenKind.AttrValueSq
? "'"
: '"',
};
}
function appendLiteral(_node) {
if (_node === void 0) { _node = node; }
_node.value += token.value;
_node.end = token.end;
}
function unexpected() {
if (lines === void 0) {
lines = getLineRanges(buffer);
}
var _a = __read(getPosition(lines, token.start), 2), line = _a[0], column = _a[1];
throw new Error("Unexpected token \"" + token.value + "(" + token.type + ")\" at [" + line + "," + column + "]" +
(tagChain
? " when parsing tag: " + JSON.stringify(tagChain.tag.name) + "."
: ''));
}
function buildAttributeMap(tag) {
var e_1, _a;
tag.attributeMap = {};
try {
for (var _b = __values(tag.attributes), _c = _b.next(); !_c.done; _c = _b.next()) {
var attr = _c.value;
tag.attributeMap[attr.name.value] = attr;
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
}
function parseOpenTag() {
var state = 0 /* BeforeAttr */;
var attr = ANY;
var tag = createTag();
pushNode(tag);
if (tag.name === '' || tag.name === '!' || tag.name === '!--') {
tag.open.value = '<' + tag.open.value;
if (index === count) {
return;
}
else {
token = tokens[++index];
if (token.type !== TokenKind.OpenTagEnd) {
node = createLiteral();
tag.body = [node];
while (++index < count) {
token = tokens[index];
if (token.type === TokenKind.OpenTagEnd) {
node = void 0;
break;
}
appendLiteral();
}
}
tag.close = createLiteral(token.start, token.end + 1, token.value + ">");
tag.end = tag.close.end;
}
return;
}
while (++index < count) {
token = tokens[index];
if (token.type === TokenKind.OpenTagEnd) {
tag.end = tag.open.end = token.end + 1;
tag.open.value = buffer.substring(tag.open.start, tag.open.end);
if (token.value === '' && !selfCloseTags[tag.name]) {
tag.body = [];
pushTagChain(tag);
}
else {
tag.body = void 0;
}
break;
}
else if (state === 0 /* BeforeAttr */) {
if (token.type !== TokenKind.Whitespace) {
attr = createAttribute();
state = 1 /* InName */;
tag.attributes.push(attr);
}
}
else if (state === 1 /* InName */) {
if (token.type === TokenKind.Whitespace) {
state = 2 /* AfterName */;
}
else if (token.type === TokenKind.AttrValueEq) {
state = 3 /* AfterEqual */;
}
else {
appendLiteral(attr.name);
}
}
else if (state === 2 /* AfterName */) {
if (token.type !== TokenKind.Whitespace) {
if (token.type === TokenKind.AttrValueEq) {
state = 3 /* AfterEqual */;
}
else {
attr = createAttribute();
state = 1 /* InName */;
tag.attributes.push(attr);
}
}
}
else if (state === 3 /* AfterEqual */) {
if (token.type !== TokenKind.Whitespace) {
attr.value = createAttributeValue();
if (token.type === TokenKind.AttrValueNq) {
state = 4 /* InValue */;
}
else {
attr.end = attr.value.end;
state = 0 /* BeforeAttr */;
}
}
}
else {
if (token.type === TokenKind.Whitespace) {
attr.end = attr.value.end;
state = 0 /* BeforeAttr */;
}
else {
appendLiteral(attr.value);
}
}
}
}
function parseCloseTag() {
var _context = tagChain;
while (true) {
if (!_context || token.value.trim() === _context.tag.name) {
break;
}
_context = _context.parent;
}
if (!_context) {
return;
}
_context.tag.close = createLiteral(token.start - 2, token.end + 1, buffer.substring(token.start - 2, token.end + 1));
_context.tag.end = _context.tag.close.end;
_context = _context.parent;
tagChain = _context;
}
export function parse(input, options) {
init(input, __assign({ setAttributeMap: false }, options));
while (index < count) {
token = tokens[index];
switch (token.type) {
case TokenKind.Literal:
if (!node) {
node = createLiteral();
pushNode(node);
}
else {
appendLiteral(node);
}
break;
case TokenKind.OpenTag:
node = void 0;
parseOpenTag();
break;
case TokenKind.CloseTag:
node = void 0;
parseCloseTag();
break;
default:
unexpected();
break;
}
index++;
}
var _nodes = nodes;
if (parseOptions === null || parseOptions === void 0 ? void 0 : parseOptions.setAttributeMap) {
walk(_nodes, {
enter: function (node) {
if (node.type === SyntaxKind.Tag) {
buildAttributeMap(node);
}
},
});
}
init();
return _nodes;
}
//# sourceMappingURL=parse.js.map
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-20 17:32:24
* @version 1.0.0
* @desc parse.spec.ts
*/
import { IAttribute, INode, ITag, IText } from './types';
export declare let index: number;
export declare function text(input: string, start?: number): IText;
export declare function tag(input: string, name: string, open: IText, attributes: IAttribute[], body: INode[] | undefined | null, close: IText | undefined | null, start: number, rawName?: string): ITag;
"use strict";
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-20 17:32:24
* @version 1.0.0
* @desc parse.spec.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.tag = exports.text = exports.index = void 0;
var tslib_1 = require("tslib");
var assert = tslib_1.__importStar(require("assert"));
var parse_1 = require("./parse");
var types_1 = require("./types");
exports.index = 0;
function text(input, start) {
if (start === void 0) { start = exports.index; }
return {
type: types_1.SyntaxKind.Text,
start: start,
end: exports.index = input.length + start,
value: input,
};
}
exports.text = text;
function tag(input, name, open, attributes, body, close, start, rawName) {
if (rawName === void 0) { rawName = name; }
return {
start: start,
end: exports.index = start + input.length,
type: types_1.SyntaxKind.Tag,
open: open,
name: name,
rawName: rawName,
attributes: attributes,
attributeMap: undefined,
body: body,
close: close,
};
}
exports.tag = tag;
function attr(name, value) {
return {
start: name.start,
end: exports.index = value ? value.end : name.end,
name: name,
value: value,
};
}
function value(input, quote, start) {
if (start === void 0) { start = exports.index; }
return {
start: start,
end: exports.index = start + (quote === void 0 ? 0 : 2) + input.length,
value: input,
quote: quote,
};
}
var scenes = [
{
name: 'text',
input: 'hello world',
nodes: [text('hello world', 0)],
},
{
name: 'text twice',
input: 'hello < world',
nodes: [text('hello < world', 0)],
},
{
name: 'single tag',
input: '<div></div>',
nodes: [
tag('<div></div>', 'div', text('<div>', 0), [], [], text('</div>'), 0),
],
},
{
name: 'tag attributes',
input: '<div a1 b2=c3 d4 = e5 f6=\'g7\' h8="i9" />',
nodes: [
tag('<div a1 b2=c3 d4 = e5 f6=\'g7\' h8="i9" />', 'div', text('<div a1 b2=c3 d4 = e5 f6=\'g7\' h8="i9" />', 0), [
attr(text('a1', 5)),
attr(text('b2', exports.index + 1), value('c3', void 0, exports.index + 1)),
attr(text('d4', exports.index + 1), value('e5', void 0, exports.index + 3)),
attr(text('f6', exports.index + 1), value('g7', "'", exports.index + 1)),
attr(text('h8', exports.index + 1), value('i9', '"', exports.index + 1)),
], void 0, null, 0),
],
},
{
name: 'nested tags',
input: "\n<div id=\"1\">\n hello world\n <h1 id=\"h1\">h1</h1>\n <img src=\"/src/index.ts\">\n <input />\n <div id=\"2\">\n <div id=\"3\">\n <span>span</span>\n <empty></empty>\n </div>\n </div>\n</div>\n ",
nodes: [
text('\n', 0),
tag("<div id=\"1\">\n hello world\n <h1 id=\"h1\">h1</h1>\n <img src=\"/src/index.ts\">\n <input />\n <div id=\"2\">\n <div id=\"3\">\n <span>span</span>\n <empty></empty>\n </div>\n </div>\n</div>", 'div', text('<div id="1">', 1), [attr(text('id', 6), value('1', '"', 9))], [
text('\n hello world\n ', 13),
tag('<h1 id="h1">h1</h1>', 'h1', text('<h1 id="h1">', 30), [attr(text('id', 34), value('h1', '"', 37))], [text('h1', 42)], text('</h1>', 44), 30),
text('\n ', 49),
tag('<img src="/src/index.ts">', 'img', text('<img src="/src/index.ts">', 52), [attr(text('src', 57), value('/src/index.ts', '"', 61))], void 0, null, 52),
text('\n ', 77),
tag('<input />', 'input', text('<input />', 80), [], void 0, null, 80),
text('\n ', 89),
tag("<div id=\"2\">\n <div id=\"3\">\n <span>span</span>\n <empty></empty>\n </div>\n </div>", 'div', text('<div id="2">', 92), [attr(text('id', 97), value('2', '"', 100))], [
text('\n ', 104),
tag("<div id=\"3\">\n <span>span</span>\n <empty></empty>\n </div>", 'div', text('<div id="3">', 109), [attr(text('id', 114), value('3', '"', 117))], [
text('\n ', 121),
tag('<span>span</span>', 'span', text('<span>', 128), [], [text('span', 134)], text('</span>', 138), 128),
text('\n ', 145),
tag('<empty></empty>', 'empty', text('<empty>', 152), [], [], text('</empty>', 159), 152),
text('\n ', 167),
], text('</div>', 172), 109),
text('\n ', 178),
], text('</div>', 181), 92),
text('\n', 187),
], text('</div>', 188), 1),
text('\n ', 194),
],
},
{
name: 'doctype',
input: '<!doctype html><html></html>',
nodes: [
tag('<!doctype html>', '!doctype', text('<!doctype html>', 0), [attr(text('html', 10))], void 0, null, 0),
tag('<html></html>', 'html', text('<html>', 15), [], [], text('</html>', 21), 15),
],
},
{
name: 'comments',
input: '<!-- normal comment --><!- short comment -><! short-2 comment ><? qm comment ?><![CDATA[ cdata ]]>',
nodes: [
tag('<!-- normal comment -->', '!--', text('<!--', 0), [], [text(' normal comment ', 4)], text('-->', 20), 0),
tag('<!- short comment ->', '!', text('<!', 23), [], [text('- short comment -', 25)], text('>', 42), 23),
tag('<! short-2 comment >', '!', text('<!', 43), [], [text(' short-2 comment ', 45)], text('>', 62), 43),
tag('<? qm comment ?>', '', text('<', 63), [], [text('? qm comment ?', 64)], text('>', 78), 63),
tag('<![CDATA[ cdata ]]>', '!', text('<!', 79), [], [text('[CDATA[ cdata ]]', 81)], text('>', 97), 79),
],
},
{
name: 'normal comment special',
input: '<!---- - -- ---->',
nodes: [
tag('<!---- - -- ---->', '!--', text('<!--', 0), [], [text('-- - -- --', 4)], text('-->', 14), 0),
],
},
{
name: 'script',
input: '<script></div></script</script >',
nodes: [
tag('<script></div></script</script >', 'script', text('<script>', 0), [], [text('</div></script', 8)], text('</script >', 22), 0),
],
},
{
name: 'script',
input: '<style></div></style</style >',
nodes: [
tag('<style></div></style</style >', 'style', text('<style>', 0), [], [text('</div></style', 7)], text('</style >', 20), 0),
],
},
{
name: 'tag name',
input: '<DIV></DIV>',
nodes: [
tag('<DIV></DIV>', 'div', text('<DIV>', 0), [], [], text('</DIV>', 5), 0, 'DIV'),
],
},
];
describe('parse cases', function () {
var e_1, _a;
var _loop_1 = function (scene) {
it("case " + JSON.stringify(scene.name), function () {
assert.deepStrictEqual(parse_1.parse(scene.input), scene.nodes);
});
};
try {
for (var scenes_1 = tslib_1.__values(scenes), scenes_1_1 = scenes_1.next(); !scenes_1_1.done; scenes_1_1 = scenes_1.next()) {
var scene = scenes_1_1.value;
_loop_1(scene);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (scenes_1_1 && !scenes_1_1.done && (_a = scenes_1.return)) _a.call(scenes_1);
}
finally { if (e_1) throw e_1.error; }
}
});
describe('parse options', function () {
it('should setAttributeMap', function () {
var ast = parse_1.parse("<div same=\"1\" diff=\"2\" same=\"3\" />", {
setAttributeMap: true,
});
var div = tag('<div same="1" diff="2" same="3" />', 'div', text('<div same="1" diff="2" same="3" />', 0), [
attr(text('same', 5), value('1', '"', exports.index + 1)),
attr(text('diff', exports.index + 1), value('2', '"', exports.index + 1)),
attr(text('same', exports.index + 1), value('3', '"', exports.index + 1)),
], void 0, null, 0);
div.attributeMap = {
same: div.attributes[2],
diff: div.attributes[1],
};
expect(ast).toEqual([div]);
});
});
//# sourceMappingURL=parse.spec.js.map
{"version":3,"file":"parse.spec.js","sourceRoot":"","sources":["../src/parse.spec.ts"],"names":[],"mappings":"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"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-20 17:32:24
* @version 1.0.0
* @desc parse.spec.ts
*/
import { __values } from "tslib";
import * as assert from 'assert';
import { parse } from './parse';
import { SyntaxKind, } from './types';
export var index = 0;
export function text(input, start) {
if (start === void 0) { start = index; }
return {
type: SyntaxKind.Text,
start: start,
end: index = input.length + start,
value: input,
};
}
export function tag(input, name, open, attributes, body, close, start, rawName) {
if (rawName === void 0) { rawName = name; }
return {
start: start,
end: index = start + input.length,
type: SyntaxKind.Tag,
open: open,
name: name,
rawName: rawName,
attributes: attributes,
attributeMap: undefined,
body: body,
close: close,
};
}
function attr(name, value) {
return {
start: name.start,
end: index = value ? value.end : name.end,
name: name,
value: value,
};
}
function value(input, quote, start) {
if (start === void 0) { start = index; }
return {
start: start,
end: index = start + (quote === void 0 ? 0 : 2) + input.length,
value: input,
quote: quote,
};
}
var scenes = [
{
name: 'text',
input: 'hello world',
nodes: [text('hello world', 0)],
},
{
name: 'text twice',
input: 'hello < world',
nodes: [text('hello < world', 0)],
},
{
name: 'single tag',
input: '<div></div>',
nodes: [
tag('<div></div>', 'div', text('<div>', 0), [], [], text('</div>'), 0),
],
},
{
name: 'tag attributes',
input: '<div a1 b2=c3 d4 = e5 f6=\'g7\' h8="i9" />',
nodes: [
tag('<div a1 b2=c3 d4 = e5 f6=\'g7\' h8="i9" />', 'div', text('<div a1 b2=c3 d4 = e5 f6=\'g7\' h8="i9" />', 0), [
attr(text('a1', 5)),
attr(text('b2', index + 1), value('c3', void 0, index + 1)),
attr(text('d4', index + 1), value('e5', void 0, index + 3)),
attr(text('f6', index + 1), value('g7', "'", index + 1)),
attr(text('h8', index + 1), value('i9', '"', index + 1)),
], void 0, null, 0),
],
},
{
name: 'nested tags',
input: "\n<div id=\"1\">\n hello world\n <h1 id=\"h1\">h1</h1>\n <img src=\"/src/index.ts\">\n <input />\n <div id=\"2\">\n <div id=\"3\">\n <span>span</span>\n <empty></empty>\n </div>\n </div>\n</div>\n ",
nodes: [
text('\n', 0),
tag("<div id=\"1\">\n hello world\n <h1 id=\"h1\">h1</h1>\n <img src=\"/src/index.ts\">\n <input />\n <div id=\"2\">\n <div id=\"3\">\n <span>span</span>\n <empty></empty>\n </div>\n </div>\n</div>", 'div', text('<div id="1">', 1), [attr(text('id', 6), value('1', '"', 9))], [
text('\n hello world\n ', 13),
tag('<h1 id="h1">h1</h1>', 'h1', text('<h1 id="h1">', 30), [attr(text('id', 34), value('h1', '"', 37))], [text('h1', 42)], text('</h1>', 44), 30),
text('\n ', 49),
tag('<img src="/src/index.ts">', 'img', text('<img src="/src/index.ts">', 52), [attr(text('src', 57), value('/src/index.ts', '"', 61))], void 0, null, 52),
text('\n ', 77),
tag('<input />', 'input', text('<input />', 80), [], void 0, null, 80),
text('\n ', 89),
tag("<div id=\"2\">\n <div id=\"3\">\n <span>span</span>\n <empty></empty>\n </div>\n </div>", 'div', text('<div id="2">', 92), [attr(text('id', 97), value('2', '"', 100))], [
text('\n ', 104),
tag("<div id=\"3\">\n <span>span</span>\n <empty></empty>\n </div>", 'div', text('<div id="3">', 109), [attr(text('id', 114), value('3', '"', 117))], [
text('\n ', 121),
tag('<span>span</span>', 'span', text('<span>', 128), [], [text('span', 134)], text('</span>', 138), 128),
text('\n ', 145),
tag('<empty></empty>', 'empty', text('<empty>', 152), [], [], text('</empty>', 159), 152),
text('\n ', 167),
], text('</div>', 172), 109),
text('\n ', 178),
], text('</div>', 181), 92),
text('\n', 187),
], text('</div>', 188), 1),
text('\n ', 194),
],
},
{
name: 'doctype',
input: '<!doctype html><html></html>',
nodes: [
tag('<!doctype html>', '!doctype', text('<!doctype html>', 0), [attr(text('html', 10))], void 0, null, 0),
tag('<html></html>', 'html', text('<html>', 15), [], [], text('</html>', 21), 15),
],
},
{
name: 'comments',
input: '<!-- normal comment --><!- short comment -><! short-2 comment ><? qm comment ?><![CDATA[ cdata ]]>',
nodes: [
tag('<!-- normal comment -->', '!--', text('<!--', 0), [], [text(' normal comment ', 4)], text('-->', 20), 0),
tag('<!- short comment ->', '!', text('<!', 23), [], [text('- short comment -', 25)], text('>', 42), 23),
tag('<! short-2 comment >', '!', text('<!', 43), [], [text(' short-2 comment ', 45)], text('>', 62), 43),
tag('<? qm comment ?>', '', text('<', 63), [], [text('? qm comment ?', 64)], text('>', 78), 63),
tag('<![CDATA[ cdata ]]>', '!', text('<!', 79), [], [text('[CDATA[ cdata ]]', 81)], text('>', 97), 79),
],
},
{
name: 'normal comment special',
input: '<!---- - -- ---->',
nodes: [
tag('<!---- - -- ---->', '!--', text('<!--', 0), [], [text('-- - -- --', 4)], text('-->', 14), 0),
],
},
{
name: 'script',
input: '<script></div></script</script >',
nodes: [
tag('<script></div></script</script >', 'script', text('<script>', 0), [], [text('</div></script', 8)], text('</script >', 22), 0),
],
},
{
name: 'script',
input: '<style></div></style</style >',
nodes: [
tag('<style></div></style</style >', 'style', text('<style>', 0), [], [text('</div></style', 7)], text('</style >', 20), 0),
],
},
{
name: 'tag name',
input: '<DIV></DIV>',
nodes: [
tag('<DIV></DIV>', 'div', text('<DIV>', 0), [], [], text('</DIV>', 5), 0, 'DIV'),
],
},
];
describe('parse cases', function () {
var e_1, _a;
var _loop_1 = function (scene) {
it("case " + JSON.stringify(scene.name), function () {
assert.deepStrictEqual(parse(scene.input), scene.nodes);
});
};
try {
for (var scenes_1 = __values(scenes), scenes_1_1 = scenes_1.next(); !scenes_1_1.done; scenes_1_1 = scenes_1.next()) {
var scene = scenes_1_1.value;
_loop_1(scene);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (scenes_1_1 && !scenes_1_1.done && (_a = scenes_1.return)) _a.call(scenes_1);
}
finally { if (e_1) throw e_1.error; }
}
});
describe('parse options', function () {
it('should setAttributeMap', function () {
var ast = parse("<div same=\"1\" diff=\"2\" same=\"3\" />", {
setAttributeMap: true,
});
var div = tag('<div same="1" diff="2" same="3" />', 'div', text('<div same="1" diff="2" same="3" />', 0), [
attr(text('same', 5), value('1', '"', index + 1)),
attr(text('diff', index + 1), value('2', '"', index + 1)),
attr(text('same', index + 1), value('3', '"', index + 1)),
], void 0, null, 0);
div.attributeMap = {
same: div.attributes[2],
diff: div.attributes[1],
};
expect(ast).toEqual([div]);
});
});
//# sourceMappingURL=parse.spec.js.map
{"version":3,"file":"parse.spec.js","sourceRoot":"","sources":["../src/parse.spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAML,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAErB,MAAM,UAAU,IAAI,CAAC,KAAa,EAAE,KAAa;IAAb,sBAAA,EAAA,aAAa;IAC/C,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK;QACjC,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,CACjB,KAAa,EACb,IAAY,EACZ,IAAW,EACX,UAAwB,EACxB,IAAgC,EAChC,KAA+B,EAC/B,KAAa,EACb,OAAc;IAAd,wBAAA,EAAA,cAAc;IAEd,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM;QACjC,IAAI,EAAE,UAAU,CAAC,GAAG;QACpB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,UAAU;QACtB,YAAY,EAAE,SAAS;QACvB,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,IAAW,EAAE,KAAuB;IAChD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;QACzC,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CACZ,KAAa,EACb,KAA4B,EAC5B,KAAa;IAAb,sBAAA,EAAA,aAAa;IAEb,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM;QAC9D,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC;AAED,IAAM,MAAM,GAIP;IACH;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;KAChC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;KAClC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE;YACL,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACvE;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,4CAA4C;QACnD,KAAK,EAAE;YACL,GAAG,CACD,4CAA4C,EAC5C,KAAK,EACL,IAAI,CAAC,4CAA4C,EAAE,CAAC,CAAC,EACrD;gBACE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBACxD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;aACzD,EACD,KAAK,CAAC,EACN,IAAI,EACJ,CAAC,CACF;SACF;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,gOAaN;QACD,KAAK,EAAE;YACL,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACb,GAAG,CACD,wNAWD,EACC,KAAK,EACL,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EACvB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EACzC;gBACE,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;gBAC/B,GAAG,CACD,qBAAqB,EACrB,IAAI,EACJ,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,EACxB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAC5C,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAChB,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EACjB,EAAE,CACH;gBACD,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAChB,GAAG,CACD,2BAA2B,EAC3B,KAAK,EACL,IAAI,CAAC,2BAA2B,EAAE,EAAE,CAAC,EACrC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EACxD,KAAK,CAAC,EACN,IAAI,EACJ,EAAE,CACH;gBACD,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAChB,GAAG,CACD,WAAW,EACX,OAAO,EACP,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EACrB,EAAE,EACF,KAAK,CAAC,EACN,IAAI,EACJ,EAAE,CACH;gBACD,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAChB,GAAG,CACD,0GAKH,EACG,KAAK,EACL,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,EACxB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAC5C;oBACE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;oBACnB,GAAG,CACD,4EAGL,EACK,KAAK,EACL,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,EACzB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAC7C;wBACE,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;wBACrB,GAAG,CACD,mBAAmB,EACnB,MAAM,EACN,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EACnB,EAAE,EACF,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EACnB,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EACpB,GAAG,CACJ;wBACD,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;wBACrB,GAAG,CACD,iBAAiB,EACjB,OAAO,EACP,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EACpB,EAAE,EACF,EAAE,EACF,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EACrB,GAAG,CACJ;wBACD,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;qBACpB,EACD,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EACnB,GAAG,CACJ;oBACD,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;iBAClB,EACD,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EACnB,EAAE,CACH;gBACD,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;aAChB,EACD,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EACnB,CAAC,CACF;YACD,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;SACpB;KACF;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,8BAA8B;QACrC,KAAK,EAAE;YACL,GAAG,CACD,iBAAiB,EACjB,UAAU,EACV,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EACxB,KAAK,CAAC,EACN,IAAI,EACJ,CAAC,CACF;YACD,GAAG,CACD,eAAe,EACf,MAAM,EACN,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAClB,EAAE,EACF,EAAE,EACF,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,EACnB,EAAE,CACH;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EACH,oGAAoG;QACtG,KAAK,EAAE;YACL,GAAG,CACD,yBAAyB,EACzB,KAAK,EACL,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EACf,EAAE,EACF,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAC7B,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EACf,CAAC,CACF;YACD,GAAG,CACD,sBAAsB,EACtB,GAAG,EACH,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EACd,EAAE,EACF,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,EAC/B,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EACb,EAAE,CACH;YACD,GAAG,CACD,sBAAsB,EACtB,GAAG,EACH,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EACd,EAAE,EACF,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,EAC/B,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EACb,EAAE,CACH;YACD,GAAG,CACD,kBAAkB,EAClB,EAAE,EACF,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EACb,EAAE,EACF,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,EAC5B,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EACb,EAAE,CACH;YACD,GAAG,CACD,qBAAqB,EACrB,GAAG,EACH,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EACd,EAAE,EACF,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,EAC9B,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EACb,EAAE,CACH;SACF;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE,mBAAmB;QAC1B,KAAK,EAAE;YACL,GAAG,CACD,mBAAmB,EACnB,KAAK,EACL,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EACf,EAAE,EACF,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EACvB,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EACf,CAAC,CACF;SACF;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,kCAAkC;QACzC,KAAK,EAAE;YACL,GAAG,CACD,kCAAkC,EAClC,QAAQ,EACR,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EACnB,EAAE,EACF,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAC3B,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EACtB,CAAC,CACF;SACF;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,+BAA+B;QACtC,KAAK,EAAE;YACL,GAAG,CACD,+BAA+B,EAC/B,OAAO,EACP,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAClB,EAAE,EACF,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAC1B,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EACrB,CAAC,CACF;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE;YACL,GAAG,CACD,aAAa,EACb,KAAK,EACL,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAChB,EAAE,EACF,EAAE,EACF,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EACjB,CAAC,EACD,KAAK,CACN;SACF;KACF;CACF,CAAC;AAEF,QAAQ,CAAC,aAAa,EAAE;;4BACX,KAAK;QACd,EAAE,CAAC,UAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAG,EAAE;YACvC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;;;QAHL,KAAoB,IAAA,WAAA,SAAA,MAAM,CAAA,8BAAA;YAArB,IAAM,KAAK,mBAAA;oBAAL,KAAK;SAIf;;;;;;;;;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE;IACxB,EAAE,CAAC,wBAAwB,EAAE;QAC3B,IAAM,GAAG,GAAG,KAAK,CAAC,0CAAoC,EAAE;YACtD,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,IAAM,GAAG,GAAG,GAAG,CACb,oCAAoC,EACpC,KAAK,EACL,IAAI,CAAC,oCAAoC,EAAE,CAAC,CAAC,EAC7C;YACE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;SAC1D,EACD,KAAK,CAAC,EACN,IAAI,EACJ,CAAC,CACF,CAAC;QACF,GAAG,CAAC,YAAY,GAAG;YACjB,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACvB,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;SACxB,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
export interface SafeHtmlOptions {
allowedTags: string[];
allowedAttrs: string[];
tagAllowedAttrs: Record<string, string[]>;
allowedUrl: RegExp;
}
export declare const safeHtmlDefaultOptions: SafeHtmlOptions;
export declare function safeHtml(input: string, options?: Partial<SafeHtmlOptions>): string;
"use strict";
/*
* @since 2020-09-09 22:53:14
* @author acrazing <joking.young@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.safeHtml = exports.safeHtmlDefaultOptions = void 0;
var tslib_1 = require("tslib");
var config_1 = require("./config");
var parse_1 = require("./parse");
var types_1 = require("./types");
exports.safeHtmlDefaultOptions = {
allowedTags: [
'a',
'abbr',
'address',
'area',
'article',
'aside',
'b',
'bdi',
'bdo',
'big',
'blockquote',
'br',
'button',
'caption',
'cite',
'code',
'col',
'colgroup',
'data',
'dd',
'del',
'dfn',
'div',
'dl',
'dt',
'em',
'figcaption',
'figure',
'footer',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'header',
'hgroup',
'hr',
'i',
'img',
'ins',
'kbd',
'li',
'main',
'map',
'ol',
'p',
'picture',
'pre',
'q',
'rp',
'rt',
'ruby',
's',
'samp',
'section',
'small',
'span',
'strong',
'sub',
'summary',
'sup',
'table',
'tbody',
'td',
'tfoot',
'th',
'thead',
'time',
'tr',
'u',
'ul',
'var',
'wbr',
],
allowedAttrs: ['style'],
tagAllowedAttrs: {
a: ['href', 'target'],
img: ['src'],
td: ['rowspan', 'colspan'],
th: ['rowspan', 'colspan'],
time: ['datetime'],
colgroup: ['span'],
col: ['span'],
},
allowedUrl: /^(?:mailto|tel|https?|ftp|[^:]*[^a-z0-9.+-][^:]*):|^[^:]*$/i,
};
function safeHtml(input, options) {
if (options === void 0) { options = {}; }
var config = tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, exports.safeHtmlDefaultOptions), options), { tagAllowedAttrs: tslib_1.__assign(tslib_1.__assign({}, exports.safeHtmlDefaultOptions.tagAllowedAttrs), options.tagAllowedAttrs) });
var ast = parse_1.parse(input);
return stringify(ast, config, input);
}
exports.safeHtml = safeHtml;
function stringify(ast, config, input) {
return ast
.map(function (node) {
if (node.type === types_1.SyntaxKind.Text) {
return node.value;
}
if (config.allowedTags.indexOf(node.name) === -1) {
return '';
}
if (config_1.selfCloseTags[node.name]) {
if (node.body !== void 0) {
throw new Error("self closed tag \"" + node.name + "\" should not have body");
}
}
else {
if (!node.body || !node.close) {
throw new Error("tag \"" + node.name + "\" should have body and close");
}
}
var attrs = node.attributes
.filter(function (a) {
var _a;
if (config.allowedAttrs.indexOf(a.name.value) > -1 ||
((_a = config.tagAllowedAttrs[node.name]) === null || _a === void 0 ? void 0 : _a.indexOf(a.name.value)) > -1) {
if (!a.value) {
return true;
}
if (a.name.value !== 'src' && a.name.value !== 'href') {
return true;
}
if (config.allowedUrl.test(a.value.value)) {
return true;
}
return false;
}
return false;
})
.map(function (a) { return input.substring(a.start, a.end); })
.join(' ');
var head = '<' + node.rawName + (attrs ? ' ' + attrs : '') + '>';
if (!node.body) {
return head;
}
return head + stringify(node.body, config, input) + ("</" + node.rawName + ">");
})
.join('');
}
//# sourceMappingURL=safeHtml.js.map
{"version":3,"file":"safeHtml.js","sourceRoot":"","sources":["../src/safeHtml.ts"],"names":[],"mappings":"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"}
/*
* @since 2020-09-09 22:53:14
* @author acrazing <joking.young@gmail.com>
*/
import { __assign } from "tslib";
import { selfCloseTags } from './config';
import { parse } from './parse';
import { SyntaxKind } from './types';
export var safeHtmlDefaultOptions = {
allowedTags: [
'a',
'abbr',
'address',
'area',
'article',
'aside',
'b',
'bdi',
'bdo',
'big',
'blockquote',
'br',
'button',
'caption',
'cite',
'code',
'col',
'colgroup',
'data',
'dd',
'del',
'dfn',
'div',
'dl',
'dt',
'em',
'figcaption',
'figure',
'footer',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'header',
'hgroup',
'hr',
'i',
'img',
'ins',
'kbd',
'li',
'main',
'map',
'ol',
'p',
'picture',
'pre',
'q',
'rp',
'rt',
'ruby',
's',
'samp',
'section',
'small',
'span',
'strong',
'sub',
'summary',
'sup',
'table',
'tbody',
'td',
'tfoot',
'th',
'thead',
'time',
'tr',
'u',
'ul',
'var',
'wbr',
],
allowedAttrs: ['style'],
tagAllowedAttrs: {
a: ['href', 'target'],
img: ['src'],
td: ['rowspan', 'colspan'],
th: ['rowspan', 'colspan'],
time: ['datetime'],
colgroup: ['span'],
col: ['span'],
},
allowedUrl: /^(?:mailto|tel|https?|ftp|[^:]*[^a-z0-9.+-][^:]*):|^[^:]*$/i,
};
export function safeHtml(input, options) {
if (options === void 0) { options = {}; }
var config = __assign(__assign(__assign({}, safeHtmlDefaultOptions), options), { tagAllowedAttrs: __assign(__assign({}, safeHtmlDefaultOptions.tagAllowedAttrs), options.tagAllowedAttrs) });
var ast = parse(input);
return stringify(ast, config, input);
}
function stringify(ast, config, input) {
return ast
.map(function (node) {
if (node.type === SyntaxKind.Text) {
return node.value;
}
if (config.allowedTags.indexOf(node.name) === -1) {
return '';
}
if (selfCloseTags[node.name]) {
if (node.body !== void 0) {
throw new Error("self closed tag \"" + node.name + "\" should not have body");
}
}
else {
if (!node.body || !node.close) {
throw new Error("tag \"" + node.name + "\" should have body and close");
}
}
var attrs = node.attributes
.filter(function (a) {
var _a;
if (config.allowedAttrs.indexOf(a.name.value) > -1 ||
((_a = config.tagAllowedAttrs[node.name]) === null || _a === void 0 ? void 0 : _a.indexOf(a.name.value)) > -1) {
if (!a.value) {
return true;
}
if (a.name.value !== 'src' && a.name.value !== 'href') {
return true;
}
if (config.allowedUrl.test(a.value.value)) {
return true;
}
return false;
}
return false;
})
.map(function (a) { return input.substring(a.start, a.end); })
.join(' ');
var head = '<' + node.rawName + (attrs ? ' ' + attrs : '') + '>';
if (!node.body) {
return head;
}
return head + stringify(node.body, config, input) + ("</" + node.rawName + ">");
})
.join('');
}
//# sourceMappingURL=safeHtml.js.map
{"version":3,"file":"safeHtml.js","sourceRoot":"","sources":["../src/safeHtml.ts"],"names":[],"mappings":"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"}
"use strict";
/*
* @since 2020-09-09 23:37:28
* @author acrazing <joking.young@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
var safeHtml_1 = require("./safeHtml");
var htmlInput = "\n<div>\n <h1>H1</h1>\n <h2>H2</h2>\n\t<script>Script</script>\n\t<style>Style</style>\n <p class=\"class\" style=\"padding: 0\">\n <span>Span</span>\n <table>\n <tr><td>TD</td></tr>\n </table>\n <img src=\"hello world\" id=\"omit\" />\n </p>\n <a href=\"/download.html\" target=\"_blank\" about=\"about\">Download<span>child</span></a>\n <a href=\"javascript:\" target=\"_blank\" about=\"about\">Javascript<span>child</span></a>\n</div>\n";
var htmlOutput = "\n<div>\n <h1>H1</h1>\n <h2>H2</h2>\n\t\n\t\n <p style=\"padding: 0\">\n <span>Span</span>\n <table>\n <tr><td>TD</td></tr>\n </table>\n <img src=\"hello world\">\n </p>\n <a href=\"/download.html\" target=\"_blank\">Download<span>child</span></a>\n <a target=\"_blank\">Javascript<span>child</span></a>\n</div>\n";
describe('safeHtml', function () {
it('should stringify safe html as expected', function () {
expect(safeHtml_1.safeHtml(htmlInput)).toEqual(htmlOutput);
});
});
//# sourceMappingURL=safeHtml.spec.js.map
{"version":3,"file":"safeHtml.spec.js","sourceRoot":"","sources":["../src/safeHtml.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,uCAAsC;AAEtC,IAAM,SAAS,GAAG,gdAgBjB,CAAC;AAEF,IAAM,UAAU,GAAG,kVAgBlB,CAAC;AAEF,QAAQ,CAAC,UAAU,EAAE;IACnB,EAAE,CAAC,wCAAwC,EAAE;QAC3C,MAAM,CAAC,mBAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
/*
* @since 2020-09-09 23:37:28
* @author acrazing <joking.young@gmail.com>
*/
import { safeHtml } from './safeHtml';
var htmlInput = "\n<div>\n <h1>H1</h1>\n <h2>H2</h2>\n\t<script>Script</script>\n\t<style>Style</style>\n <p class=\"class\" style=\"padding: 0\">\n <span>Span</span>\n <table>\n <tr><td>TD</td></tr>\n </table>\n <img src=\"hello world\" id=\"omit\" />\n </p>\n <a href=\"/download.html\" target=\"_blank\" about=\"about\">Download<span>child</span></a>\n <a href=\"javascript:\" target=\"_blank\" about=\"about\">Javascript<span>child</span></a>\n</div>\n";
var htmlOutput = "\n<div>\n <h1>H1</h1>\n <h2>H2</h2>\n\t\n\t\n <p style=\"padding: 0\">\n <span>Span</span>\n <table>\n <tr><td>TD</td></tr>\n </table>\n <img src=\"hello world\">\n </p>\n <a href=\"/download.html\" target=\"_blank\">Download<span>child</span></a>\n <a target=\"_blank\">Javascript<span>child</span></a>\n</div>\n";
describe('safeHtml', function () {
it('should stringify safe html as expected', function () {
expect(safeHtml(htmlInput)).toEqual(htmlOutput);
});
});
//# sourceMappingURL=safeHtml.spec.js.map
{"version":3,"file":"safeHtml.spec.js","sourceRoot":"","sources":["../src/safeHtml.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,IAAM,SAAS,GAAG,gdAgBjB,CAAC;AAEF,IAAM,UAAU,GAAG,kVAgBlB,CAAC;AAEF,QAAQ,CAAC,UAAU,EAAE;IACnB,EAAE,CAAC,wCAAwC,EAAE;QAC3C,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
"use strict";
/*
* @since 2020-09-09 22:04:54
* @author acrazing <joking.young@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
var parse_1 = require("../parse");
var parse_spec_1 = require("../parse.spec");
var tokenize_1 = require("../tokenize");
var tokenize_spec_1 = require("../tokenize.spec");
describe('issue #6', function () {
it('should tokenize upper case tag to lower', function () {
expect(tokenize_1.tokenize('<Test></Test>')).toEqual([
tokenize_spec_1.token('test', tokenize_1.TokenKind.OpenTag, 1),
tokenize_spec_1.token('', tokenize_1.TokenKind.OpenTagEnd),
tokenize_spec_1.token('test', tokenize_1.TokenKind.CloseTag, tokenize_spec_1.tokenIndex + 3),
]);
});
it('should parse upper case as expected', function () {
expect(parse_1.parse('<Test></Test>')).toEqual([
parse_spec_1.tag('<Test></Test>', 'test', parse_spec_1.text('<Test>', 0), [], [], parse_spec_1.text('</Test>'), 0, 'Test'),
]);
});
});
//# sourceMappingURL=issue_6.spec.js.map
{"version":3,"file":"issue_6.spec.js","sourceRoot":"","sources":["../../src/test/issue_6.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,kCAAiC;AACjC,4CAA0C;AAC1C,wCAAkD;AAClD,kDAAqD;AAErD,QAAQ,CAAC,UAAU,EAAE;IACnB,EAAE,CAAC,yCAAyC,EAAE;QAC5C,MAAM,CAAC,mBAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,qBAAK,CAAC,MAAM,EAAE,oBAAS,CAAC,OAAO,EAAE,CAAC,CAAC;YACnC,qBAAK,CAAC,EAAE,EAAE,oBAAS,CAAC,UAAU,CAAC;YAC/B,qBAAK,CAAC,MAAM,EAAE,oBAAS,CAAC,QAAQ,EAAE,0BAAU,GAAG,CAAC,CAAC;SAClD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE;QACxC,MAAM,CAAC,aAAK,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC,gBAAG,CACD,eAAe,EACf,MAAM,EACN,iBAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EACjB,EAAE,EACF,EAAE,EACF,iBAAI,CAAC,SAAS,CAAC,EACf,CAAC,EACD,MAAM,CACP;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
/*
* @since 2020-09-09 22:04:54
* @author acrazing <joking.young@gmail.com>
*/
import { parse } from '../parse';
import { tag, text } from '../parse.spec';
import { tokenize, TokenKind } from '../tokenize';
import { token, tokenIndex } from '../tokenize.spec';
describe('issue #6', function () {
it('should tokenize upper case tag to lower', function () {
expect(tokenize('<Test></Test>')).toEqual([
token('test', TokenKind.OpenTag, 1),
token('', TokenKind.OpenTagEnd),
token('test', TokenKind.CloseTag, tokenIndex + 3),
]);
});
it('should parse upper case as expected', function () {
expect(parse('<Test></Test>')).toEqual([
tag('<Test></Test>', 'test', text('<Test>', 0), [], [], text('</Test>'), 0, 'Test'),
]);
});
});
//# sourceMappingURL=issue_6.spec.js.map
{"version":3,"file":"issue_6.spec.js","sourceRoot":"","sources":["../../src/test/issue_6.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAErD,QAAQ,CAAC,UAAU,EAAE;IACnB,EAAE,CAAC,yCAAyC,EAAE;QAC5C,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;YACnC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,UAAU,CAAC;YAC/B,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE,UAAU,GAAG,CAAC,CAAC;SAClD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE;QACxC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC,GAAG,CACD,eAAe,EACf,MAAM,EACN,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EACjB,EAAE,EACF,EAAE,EACF,IAAI,CAAC,SAAS,CAAC,EACf,CAAC,EACD,MAAM,CACP;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
"use strict";
/*
* @since 2020-09-09 22:43:03
* @author acrazing <joking.young@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
var parse_1 = require("../parse");
var parse_spec_1 = require("../parse.spec");
describe('issue #7', function () {
it('should parse comment as expected', function () {
expect(parse_1.parse('<!-- it is comment -->\n-\n')).toEqual([
parse_spec_1.tag('<!-- it is comment -->', '!--', parse_spec_1.text('<!--', 0), [], [parse_spec_1.text(' it is comment ')], parse_spec_1.text('-->'), 0),
parse_spec_1.text('\n-\n'),
]);
});
});
//# sourceMappingURL=issue_7.spec.js.map
{"version":3,"file":"issue_7.spec.js","sourceRoot":"","sources":["../../src/test/issue_7.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,kCAAiC;AACjC,4CAA0C;AAE1C,QAAQ,CAAC,UAAU,EAAE;IACnB,EAAE,CAAC,kCAAkC,EAAE;QACrC,MAAM,CAAC,aAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC,OAAO,CAAC;YACnD,gBAAG,CACD,wBAAwB,EACxB,KAAK,EACL,iBAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EACf,EAAE,EACF,CAAC,iBAAI,CAAC,iBAAiB,CAAC,CAAC,EACzB,iBAAI,CAAC,KAAK,CAAC,EACX,CAAC,CACF;YACD,iBAAI,CAAC,OAAO,CAAC;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
/*
* @since 2020-09-09 22:43:03
* @author acrazing <joking.young@gmail.com>
*/
import { parse } from '../parse';
import { tag, text } from '../parse.spec';
describe('issue #7', function () {
it('should parse comment as expected', function () {
expect(parse('<!-- it is comment -->\n-\n')).toEqual([
tag('<!-- it is comment -->', '!--', text('<!--', 0), [], [text(' it is comment ')], text('-->'), 0),
text('\n-\n'),
]);
});
});
//# sourceMappingURL=issue_7.spec.js.map
{"version":3,"file":"issue_7.spec.js","sourceRoot":"","sources":["../../src/test/issue_7.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,QAAQ,CAAC,UAAU,EAAE;IACnB,EAAE,CAAC,kCAAkC,EAAE;QACrC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC,OAAO,CAAC;YACnD,GAAG,CACD,wBAAwB,EACxB,KAAK,EACL,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EACf,EAAE,EACF,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EACzB,IAAI,CAAC,KAAK,CAAC,EACX,CAAC,CACF;YACD,IAAI,CAAC,OAAO,CAAC;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:29
* @version 1.0.0
* @desc tokenize.ts
*/
export declare enum TokenKind {
Literal = "Literal",
OpenTag = "OpenTag",
OpenTagEnd = "OpenTagEnd",
CloseTag = "CloseTag",
Whitespace = "Whitespace",
AttrValueEq = "AttrValueEq",
AttrValueNq = "AttrValueNq",
AttrValueSq = "AttrValueSq",
AttrValueDq = "AttrValueDq"
}
export interface IToken {
start: number;
end: number;
value: string;
type: TokenKind;
}
export declare function tokenize(input: string): IToken[];
"use strict";
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:29
* @version 1.0.0
* @desc tokenize.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.tokenize = exports.TokenKind = void 0;
var State;
(function (State) {
State["Literal"] = "Literal";
State["BeforeOpenTag"] = "BeforeOpenTag";
State["OpeningTag"] = "OpeningTag";
State["AfterOpenTag"] = "AfterOpenTag";
State["InValueNq"] = "InValueNq";
State["InValueSq"] = "InValueSq";
State["InValueDq"] = "InValueDq";
State["ClosingOpenTag"] = "ClosingOpenTag";
State["OpeningSpecial"] = "OpeningSpecial";
State["OpeningDoctype"] = "OpeningDoctype";
State["OpeningNormalComment"] = "OpeningNormalComment";
State["InNormalComment"] = "InNormalComment";
State["InShortComment"] = "InShortComment";
State["ClosingNormalComment"] = "ClosingNormalComment";
State["ClosingTag"] = "ClosingTag";
})(State || (State = {}));
var TokenKind;
(function (TokenKind) {
TokenKind["Literal"] = "Literal";
TokenKind["OpenTag"] = "OpenTag";
TokenKind["OpenTagEnd"] = "OpenTagEnd";
TokenKind["CloseTag"] = "CloseTag";
TokenKind["Whitespace"] = "Whitespace";
TokenKind["AttrValueEq"] = "AttrValueEq";
TokenKind["AttrValueNq"] = "AttrValueNq";
TokenKind["AttrValueSq"] = "AttrValueSq";
TokenKind["AttrValueDq"] = "AttrValueDq";
})(TokenKind = exports.TokenKind || (exports.TokenKind = {}));
var state;
var buffer;
var bufSize;
var sectionStart;
var index;
var tokens;
var char;
var inScript;
var inStyle;
var offset;
function makeCodePoints(input) {
return {
lower: input
.toLowerCase()
.split('')
.map(function (c) { return c.charCodeAt(0); }),
upper: input
.toUpperCase()
.split('')
.map(function (c) { return c.charCodeAt(0); }),
length: input.length,
};
}
var doctype = makeCodePoints('!doctype');
var style = makeCodePoints('style');
var script = makeCodePoints('script');
var Chars;
(function (Chars) {
Chars[Chars["_S"] = ' '.charCodeAt(0)] = "_S";
Chars[Chars["_N"] = '\n'.charCodeAt(0)] = "_N";
Chars[Chars["_T"] = '\t'.charCodeAt(0)] = "_T";
Chars[Chars["_R"] = '\r'.charCodeAt(0)] = "_R";
Chars[Chars["_F"] = '\f'.charCodeAt(0)] = "_F";
Chars[Chars["Lt"] = '<'.charCodeAt(0)] = "Lt";
Chars[Chars["Ep"] = '!'.charCodeAt(0)] = "Ep";
Chars[Chars["Cl"] = '-'.charCodeAt(0)] = "Cl";
Chars[Chars["Sl"] = '/'.charCodeAt(0)] = "Sl";
Chars[Chars["Gt"] = '>'.charCodeAt(0)] = "Gt";
Chars[Chars["Qm"] = '?'.charCodeAt(0)] = "Qm";
Chars[Chars["La"] = 'a'.charCodeAt(0)] = "La";
Chars[Chars["Lz"] = 'z'.charCodeAt(0)] = "Lz";
Chars[Chars["Ua"] = 'A'.charCodeAt(0)] = "Ua";
Chars[Chars["Uz"] = 'Z'.charCodeAt(0)] = "Uz";
Chars[Chars["Eq"] = '='.charCodeAt(0)] = "Eq";
Chars[Chars["Sq"] = "'".charCodeAt(0)] = "Sq";
Chars[Chars["Dq"] = '"'.charCodeAt(0)] = "Dq";
Chars[Chars["Ld"] = 'd'.charCodeAt(0)] = "Ld";
Chars[Chars["Ud"] = 'D'.charCodeAt(0)] = "Ud";
})(Chars || (Chars = {}));
function isWhiteSpace() {
return (char === Chars._S ||
char === Chars._N ||
char === Chars._T ||
char === Chars._T ||
char === Chars._R ||
char === Chars._F);
}
function init(input) {
state = State.Literal;
buffer = input;
bufSize = input.length;
sectionStart = 0;
index = 0;
tokens = [];
inScript = false;
inStyle = false;
offset = 0;
}
function tokenize(input) {
init(input);
while (index < bufSize) {
char = buffer.charCodeAt(index);
switch (state) {
case State.Literal:
parseLiteral();
break;
case State.BeforeOpenTag:
parseBeforeOpenTag();
break;
case State.OpeningTag:
parseOpeningTag();
break;
case State.AfterOpenTag:
parseAfterOpenTag();
break;
case State.InValueNq:
parseInValueNq();
break;
case State.InValueSq:
parseInValueSq();
break;
case State.InValueDq:
parseInValueDq();
break;
case State.ClosingOpenTag:
parseClosingOpenTag();
break;
case State.OpeningSpecial:
parseOpeningSpecial();
break;
case State.OpeningDoctype:
parseOpeningDoctype();
break;
case State.OpeningNormalComment:
parseOpeningNormalComment();
break;
case State.InNormalComment:
parseNormalComment();
break;
case State.InShortComment:
parseShortComment();
break;
case State.ClosingNormalComment:
parseClosingNormalComment();
break;
case State.ClosingTag:
parseClosingTag();
break;
default:
unexpected();
break;
}
index++;
}
switch (state) {
case State.Literal:
case State.BeforeOpenTag:
case State.InValueNq:
case State.InValueSq:
case State.InValueDq:
case State.ClosingOpenTag:
case State.InNormalComment:
case State.InShortComment:
case State.ClosingNormalComment:
emitToken(TokenKind.Literal);
break;
case State.OpeningTag:
emitToken(TokenKind.OpenTag);
break;
case State.AfterOpenTag:
break;
case State.OpeningSpecial:
emitToken(TokenKind.OpenTag, State.InShortComment);
break;
case State.OpeningDoctype:
if (index - sectionStart === doctype.length) {
emitToken(TokenKind.OpenTag);
}
else {
emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);
emitToken(TokenKind.Literal);
}
break;
case State.OpeningNormalComment:
if (index - sectionStart === 2) {
emitToken(TokenKind.OpenTag);
}
else {
emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);
emitToken(TokenKind.Literal);
}
break;
case State.ClosingTag:
emitToken(TokenKind.CloseTag);
break;
default:
break;
}
var _tokens = tokens;
init('');
return _tokens;
}
exports.tokenize = tokenize;
function emitToken(kind, newState, end) {
if (newState === void 0) { newState = state; }
if (end === void 0) { end = index; }
var value = buffer.substring(sectionStart, end);
if (kind === TokenKind.OpenTag || kind === TokenKind.CloseTag) {
value = value.toLowerCase();
}
if (kind === TokenKind.OpenTag) {
if (value === 'script') {
inScript = true;
}
else if (value === 'style') {
inStyle = true;
}
}
if (kind === TokenKind.CloseTag) {
inScript = inStyle = false;
}
if (!((kind === TokenKind.Literal || kind === TokenKind.Whitespace) &&
end === sectionStart)) {
// empty literal should be ignored
tokens.push({ type: kind, start: sectionStart, end: end, value: value });
}
if (kind === TokenKind.OpenTagEnd || kind === TokenKind.CloseTag) {
sectionStart = end + 1;
state = State.Literal;
}
else {
sectionStart = end;
state = newState;
}
}
function parseLiteral() {
if (char === Chars.Lt) {
// <
emitToken(TokenKind.Literal, State.BeforeOpenTag);
}
}
function parseBeforeOpenTag() {
if (inScript || inStyle) {
if (char === Chars.Sl) {
state = State.ClosingTag;
sectionStart = index + 1;
}
else {
state = State.Literal;
}
return;
}
if ((char >= Chars.La && char <= Chars.Lz) ||
(char >= Chars.Ua && char <= Chars.Uz)) {
// <d
state = State.OpeningTag;
sectionStart = index;
}
else if (char === Chars.Sl) {
// </
state = State.ClosingTag;
sectionStart = index + 1;
}
else if (char === Chars.Lt) {
// <<
emitToken(TokenKind.Literal);
}
else if (char === Chars.Ep) {
// <!
state = State.OpeningSpecial;
sectionStart = index;
}
else if (char === Chars.Qm) {
// <?
// treat as short comment
sectionStart = index;
emitToken(TokenKind.OpenTag, State.InShortComment);
}
else {
// <>
// any other chars covert to normal state
state = State.Literal;
}
}
function parseOpeningTag() {
if (isWhiteSpace()) {
// <div ...
emitToken(TokenKind.OpenTag, State.AfterOpenTag);
}
else if (char === Chars.Gt) {
// <div>
emitToken(TokenKind.OpenTag);
emitToken(TokenKind.OpenTagEnd);
}
else if (char === Chars.Sl) {
// <div/
emitToken(TokenKind.OpenTag, State.ClosingOpenTag);
}
}
function parseAfterOpenTag() {
if (char === Chars.Gt) {
// <div >
emitToken(TokenKind.Whitespace);
emitToken(TokenKind.OpenTagEnd);
}
else if (char === Chars.Sl) {
// <div /
emitToken(TokenKind.Whitespace, State.ClosingOpenTag);
}
else if (char === Chars.Eq) {
// <div ...=...
emitToken(TokenKind.Whitespace);
emitToken(TokenKind.AttrValueEq, void 0, index + 1);
}
else if (char === Chars.Sq) {
// <div ...'...
emitToken(TokenKind.Whitespace, State.InValueSq);
}
else if (char === Chars.Dq) {
// <div ..."...
emitToken(TokenKind.Whitespace, State.InValueDq);
}
else if (!isWhiteSpace()) {
// <div ...name...
emitToken(TokenKind.Whitespace, State.InValueNq);
}
}
function parseInValueNq() {
if (char === Chars.Gt) {
// <div xxx>
emitToken(TokenKind.AttrValueNq);
emitToken(TokenKind.OpenTagEnd);
}
else if (char === Chars.Sl) {
// <div xxx/
emitToken(TokenKind.AttrValueNq, State.ClosingOpenTag);
}
else if (char === Chars.Eq) {
// <div xxx=
emitToken(TokenKind.AttrValueNq);
emitToken(TokenKind.AttrValueEq, State.AfterOpenTag, index + 1);
}
else if (isWhiteSpace()) {
// <div xxx ...
emitToken(TokenKind.AttrValueNq, State.AfterOpenTag);
}
}
function parseInValueSq() {
if (char === Chars.Sq) {
// <div 'xxx'
emitToken(TokenKind.AttrValueSq, State.AfterOpenTag, index + 1);
}
}
function parseInValueDq() {
if (char === Chars.Dq) {
// <div "xxx", problem same to Sq
emitToken(TokenKind.AttrValueDq, State.AfterOpenTag, index + 1);
}
}
function parseClosingOpenTag() {
if (char === Chars.Gt) {
// <div />
emitToken(TokenKind.OpenTagEnd);
}
else {
// <div /...>
emitToken(TokenKind.AttrValueNq, State.AfterOpenTag);
parseAfterOpenTag();
}
}
function parseOpeningSpecial() {
switch (char) {
case Chars.Cl: // <!-
state = State.OpeningNormalComment;
break;
case Chars.Ld: // <!d
case Chars.Ud: // <!D
state = State.OpeningDoctype;
break;
default:
emitToken(TokenKind.OpenTag, State.InShortComment);
break;
}
}
function parseOpeningDoctype() {
offset = index - sectionStart;
if (offset === doctype.length) {
// <!d, <!d , start: 0, index: 2
if (isWhiteSpace()) {
emitToken(TokenKind.OpenTag, State.AfterOpenTag);
}
else {
unexpected();
}
}
else if (char === Chars.Gt) {
// <!DOCT>
emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);
emitToken(TokenKind.Literal);
emitToken(TokenKind.OpenTagEnd);
}
else if (doctype.lower[offset] !== char && doctype.upper[offset] !== char) {
// <!DOCX...
emitToken(TokenKind.OpenTag, State.InShortComment, sectionStart + 1);
}
}
function parseOpeningNormalComment() {
if (char === Chars.Cl) {
// <!--
emitToken(TokenKind.OpenTag, State.InNormalComment, index + 1);
}
else {
emitToken(TokenKind.OpenTag, State.InShortComment, sectionStart + 1);
}
}
function parseNormalComment() {
if (char === Chars.Cl) {
// <!-- ... -
emitToken(TokenKind.Literal, State.ClosingNormalComment);
}
}
function parseShortComment() {
if (char === Chars.Gt) {
// <! ... >
emitToken(TokenKind.Literal);
emitToken(TokenKind.OpenTagEnd);
}
}
function parseClosingNormalComment() {
offset = index - sectionStart;
if (offset === 2) {
if (char === Chars.Gt) {
// <!-- xxx -->
emitToken(TokenKind.OpenTagEnd);
}
else if (char === Chars.Cl) {
// <!-- xxx ---
emitToken(TokenKind.Literal, void 0, sectionStart + 1);
}
else {
// <!-- xxx --x
state = State.InNormalComment;
}
}
else if (char !== Chars.Cl) {
// <!-- xxx - ...
state = State.InNormalComment;
}
}
function parseClosingTag() {
offset = index - sectionStart;
if (inStyle) {
if (char === Chars.Lt) {
sectionStart -= 2;
emitToken(TokenKind.Literal, State.BeforeOpenTag);
}
else if (offset < style.length) {
if (style.lower[offset] !== char && style.upper[offset] !== char) {
sectionStart -= 2;
state = State.Literal;
}
}
else if (char === Chars.Gt) {
emitToken(TokenKind.CloseTag);
}
else if (!isWhiteSpace()) {
sectionStart -= 2;
state = State.Literal;
}
}
else if (inScript) {
if (char === Chars.Lt) {
sectionStart -= 2;
emitToken(TokenKind.Literal, State.BeforeOpenTag);
}
else if (offset < script.length) {
if (script.lower[offset] !== char && script.upper[offset] !== char) {
sectionStart -= 2;
state = State.Literal;
}
}
else if (char === Chars.Gt) {
emitToken(TokenKind.CloseTag);
}
else if (!isWhiteSpace()) {
sectionStart -= 2;
state = State.Literal;
}
}
else if (char === Chars.Gt) {
// </ xxx >
emitToken(TokenKind.CloseTag);
}
}
function unexpected() {
throw new SyntaxError("Unexpected token \"" + buffer.charAt(index) + "\" at " + index + " when parse " + state);
}
//# sourceMappingURL=tokenize.js.map
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,IAAK,KAgBJ;AAhBD,WAAK,KAAK;IACR,4BAAmB,CAAA;IACnB,wCAA+B,CAAA;IAC/B,kCAAyB,CAAA;IACzB,sCAA6B,CAAA;IAC7B,gCAAuB,CAAA;IACvB,gCAAuB,CAAA;IACvB,gCAAuB,CAAA;IACvB,0CAAiC,CAAA;IACjC,0CAAiC,CAAA;IACjC,0CAAiC,CAAA;IACjC,sDAA6C,CAAA;IAC7C,4CAAmC,CAAA;IACnC,0CAAiC,CAAA;IACjC,sDAA6C,CAAA;IAC7C,kCAAyB,CAAA;AAC3B,CAAC,EAhBI,KAAK,KAAL,KAAK,QAgBT;AAED,IAAY,SAUX;AAVD,WAAY,SAAS;IACnB,gCAAmB,CAAA;IACnB,gCAAmB,CAAA;IACnB,sCAAyB,CAAA;IACzB,kCAAqB,CAAA;IACrB,sCAAyB,CAAA;IACzB,wCAA2B,CAAA;IAC3B,wCAA2B,CAAA;IAC3B,wCAA2B,CAAA;IAC3B,wCAA2B,CAAA;AAC7B,CAAC,EAVW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAUpB;AASD,IAAI,KAAY,CAAC;AACjB,IAAI,MAAc,CAAC;AACnB,IAAI,OAAe,CAAC;AACpB,IAAI,YAAoB,CAAC;AACzB,IAAI,KAAa,CAAC;AAClB,IAAI,MAAgB,CAAC;AACrB,IAAI,IAAY,CAAC;AACjB,IAAI,QAAiB,CAAC;AACtB,IAAI,OAAgB,CAAC;AACrB,IAAI,MAAc,CAAC;AAEnB,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO;QACL,KAAK,EAAE,KAAK;aACT,WAAW,EAAE;aACb,KAAK,CAAC,EAAE,CAAC;aACT,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAf,CAAe,CAAC;QAC9B,KAAK,EAAE,KAAK;aACT,WAAW,EAAE;aACb,KAAK,CAAC,EAAE,CAAC;aACT,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAf,CAAe,CAAC;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAED,IAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AAC3C,IAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;AACtC,IAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;AAExC,IAAK,KAqBJ;AArBD,WAAK,KAAK;IACR,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACvB,oBAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACvB,oBAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACvB,oBAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACvB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;IACtB,oBAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAA,CAAA;AACxB,CAAC,EArBI,KAAK,KAAL,KAAK,QAqBT;AAED,SAAS,YAAY;IACnB,OAAO,CACL,IAAI,KAAK,KAAK,CAAC,EAAE;QACjB,IAAI,KAAK,KAAK,CAAC,EAAE;QACjB,IAAI,KAAK,KAAK,CAAC,EAAE;QACjB,IAAI,KAAK,KAAK,CAAC,EAAE;QACjB,IAAI,KAAK,KAAK,CAAC,EAAE;QACjB,IAAI,KAAK,KAAK,CAAC,EAAE,CAClB,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;IACtB,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,YAAY,GAAG,CAAC,CAAC;IACjB,KAAK,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,EAAE,CAAC;IACZ,QAAQ,GAAG,KAAK,CAAC;IACjB,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,CAAC,CAAC;AACb,CAAC;AAED,SAAgB,QAAQ,CAAC,KAAa;IACpC,IAAI,CAAC,KAAK,CAAC,CAAC;IACZ,OAAO,KAAK,GAAG,OAAO,EAAE;QACtB,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,QAAQ,KAAK,EAAE;YACb,KAAK,KAAK,CAAC,OAAO;gBAChB,YAAY,EAAE,CAAC;gBACf,MAAM;YACR,KAAK,KAAK,CAAC,aAAa;gBACtB,kBAAkB,EAAE,CAAC;gBACrB,MAAM;YACR,KAAK,KAAK,CAAC,UAAU;gBACnB,eAAe,EAAE,CAAC;gBAClB,MAAM;YACR,KAAK,KAAK,CAAC,YAAY;gBACrB,iBAAiB,EAAE,CAAC;gBACpB,MAAM;YACR,KAAK,KAAK,CAAC,SAAS;gBAClB,cAAc,EAAE,CAAC;gBACjB,MAAM;YACR,KAAK,KAAK,CAAC,SAAS;gBAClB,cAAc,EAAE,CAAC;gBACjB,MAAM;YACR,KAAK,KAAK,CAAC,SAAS;gBAClB,cAAc,EAAE,CAAC;gBACjB,MAAM;YACR,KAAK,KAAK,CAAC,cAAc;gBACvB,mBAAmB,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,KAAK,CAAC,cAAc;gBACvB,mBAAmB,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,KAAK,CAAC,cAAc;gBACvB,mBAAmB,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,KAAK,CAAC,oBAAoB;gBAC7B,yBAAyB,EAAE,CAAC;gBAC5B,MAAM;YACR,KAAK,KAAK,CAAC,eAAe;gBACxB,kBAAkB,EAAE,CAAC;gBACrB,MAAM;YACR,KAAK,KAAK,CAAC,cAAc;gBACvB,iBAAiB,EAAE,CAAC;gBACpB,MAAM;YACR,KAAK,KAAK,CAAC,oBAAoB;gBAC7B,yBAAyB,EAAE,CAAC;gBAC5B,MAAM;YACR,KAAK,KAAK,CAAC,UAAU;gBACnB,eAAe,EAAE,CAAC;gBAClB,MAAM;YACR;gBACE,UAAU,EAAE,CAAC;gBACb,MAAM;SACT;QACD,KAAK,EAAE,CAAC;KACT;IACD,QAAQ,KAAK,EAAE;QACb,KAAK,KAAK,CAAC,OAAO,CAAC;QACnB,KAAK,KAAK,CAAC,aAAa,CAAC;QACzB,KAAK,KAAK,CAAC,SAAS,CAAC;QACrB,KAAK,KAAK,CAAC,SAAS,CAAC;QACrB,KAAK,KAAK,CAAC,SAAS,CAAC;QACrB,KAAK,KAAK,CAAC,cAAc,CAAC;QAC1B,KAAK,KAAK,CAAC,eAAe,CAAC;QAC3B,KAAK,KAAK,CAAC,cAAc,CAAC;QAC1B,KAAK,KAAK,CAAC,oBAAoB;YAC7B,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM;QACR,KAAK,KAAK,CAAC,UAAU;YACnB,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM;QACR,KAAK,KAAK,CAAC,YAAY;YACrB,MAAM;QACR,KAAK,KAAK,CAAC,cAAc;YACvB,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;YACnD,MAAM;QACR,KAAK,KAAK,CAAC,cAAc;YACvB,IAAI,KAAK,GAAG,YAAY,KAAK,OAAO,CAAC,MAAM,EAAE;gBAC3C,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;aAC9B;iBAAM;gBACL,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;gBACvD,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;aAC9B;YACD,MAAM;QACR,KAAK,KAAK,CAAC,oBAAoB;YAC7B,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,EAAE;gBAC9B,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;aAC9B;iBAAM;gBACL,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;gBACvD,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;aAC9B;YACD,MAAM;QACR,KAAK,KAAK,CAAC,UAAU;YACnB,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC9B,MAAM;QACR;YACE,MAAM;KACT;IACD,IAAM,OAAO,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,OAAO,CAAC;AACjB,CAAC;AArGD,4BAqGC;AAED,SAAS,SAAS,CAAC,IAAe,EAAE,QAAgB,EAAE,GAAW;IAA7B,yBAAA,EAAA,gBAAgB;IAAE,oBAAA,EAAA,WAAW;IAC/D,IAAI,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAChD,IAAI,IAAI,KAAK,SAAS,CAAC,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,QAAQ,EAAE;QAC7D,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;KAC7B;IACD,IAAI,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE;QAC9B,IAAI,KAAK,KAAK,QAAQ,EAAE;YACtB,QAAQ,GAAG,IAAI,CAAC;SACjB;aAAM,IAAI,KAAK,KAAK,OAAO,EAAE;YAC5B,OAAO,GAAG,IAAI,CAAC;SAChB;KACF;IACD,IAAI,IAAI,KAAK,SAAS,CAAC,QAAQ,EAAE;QAC/B,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;KAC5B;IACD,IACE,CAAC,CACC,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,UAAU,CAAC;QAC7D,GAAG,KAAK,YAAY,CACrB,EACD;QACA,kCAAkC;QAClC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,KAAA,EAAE,KAAK,OAAA,EAAE,CAAC,CAAC;KAC9D;IACD,IAAI,IAAI,KAAK,SAAS,CAAC,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC,QAAQ,EAAE;QAChE,YAAY,GAAG,GAAG,GAAG,CAAC,CAAC;QACvB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;KACvB;SAAM;QACL,YAAY,GAAG,GAAG,CAAC;QACnB,KAAK,GAAG,QAAQ,CAAC;KAClB;AACH,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QACrB,IAAI;QACJ,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;KACnD;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,QAAQ,IAAI,OAAO,EAAE;QACvB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;YACrB,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;YACzB,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC;SAC1B;aAAM;YACL,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;SACvB;QACD,OAAO;KACR;IACD,IACE,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACtC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,EACtC;QACA,KAAK;QACL,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;QACzB,YAAY,GAAG,KAAK,CAAC;KACtB;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,KAAK;QACL,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;QACzB,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC;KAC1B;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,KAAK;QACL,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;KAC9B;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,KAAK;QACL,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC;QAC7B,YAAY,GAAG,KAAK,CAAC;KACtB;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,KAAK;QACL,yBAAyB;QACzB,YAAY,GAAG,KAAK,CAAC;QACrB,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;KACpD;SAAM;QACL,KAAK;QACL,yCAAyC;QACzC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;KACvB;AACH,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,YAAY,EAAE,EAAE;QAClB,WAAW;QACX,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;KAClD;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,QAAQ;QACR,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7B,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KACjC;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,QAAQ;QACR,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;KACpD;AACH,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QACrB,SAAS;QACT,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAChC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KACjC;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,SAAS;QACT,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;KACvD;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,eAAe;QACf,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAChC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;KACrD;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,eAAe;QACf,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;KAClD;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,eAAe;QACf,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;KAClD;SAAM,IAAI,CAAC,YAAY,EAAE,EAAE;QAC1B,kBAAkB;QAClB,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;KAClD;AACH,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QACrB,YAAY;QACZ,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACjC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KACjC;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,YAAY;QACZ,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;KACxD;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,YAAY;QACZ,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACjC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;KACjE;SAAM,IAAI,YAAY,EAAE,EAAE;QACzB,eAAe;QACf,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;KACtD;AACH,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QACrB,aAAa;QACb,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;KACjE;AACH,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QACrB,iCAAiC;QACjC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;KACjE;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QACrB,UAAU;QACV,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KACjC;SAAM;QACL,aAAa;QACb,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACrD,iBAAiB,EAAE,CAAC;KACrB;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,QAAQ,IAAI,EAAE;QACZ,KAAK,KAAK,CAAC,EAAE,EAAE,MAAM;YACnB,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC;YACnC,MAAM;QACR,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM;QACrB,KAAK,KAAK,CAAC,EAAE,EAAE,MAAM;YACnB,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC;YAC7B,MAAM;QACR;YACE,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;YACnD,MAAM;KACT;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;IAC9B,IAAI,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE;QAC7B,gCAAgC;QAChC,IAAI,YAAY,EAAE,EAAE;YAClB,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;SAClD;aAAM;YACL,UAAU,EAAE,CAAC;SACd;KACF;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,UAAU;QACV,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;QACvD,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7B,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KACjC;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QAC3E,YAAY;QACZ,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;KACtE;AACH,CAAC;AAED,SAAS,yBAAyB;IAChC,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QACrB,OAAO;QACP,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;KAChE;SAAM;QACL,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;KACtE;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QACrB,aAAa;QACb,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;KAC1D;AACH,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QACrB,WAAW;QACX,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7B,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KACjC;AACH,CAAC;AAED,SAAS,yBAAyB;IAChC,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;IAC9B,IAAI,MAAM,KAAK,CAAC,EAAE;QAChB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;YACrB,eAAe;YACf,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;SACjC;aAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;YAC5B,eAAe;YACf,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;SACxD;aAAM;YACL,eAAe;YACf,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC;SAC/B;KACF;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,iBAAiB;QACjB,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC;KAC/B;AACH,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;IAC9B,IAAI,OAAO,EAAE;QACX,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;YACrB,YAAY,IAAI,CAAC,CAAC;YAClB,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;SACnD;aAAM,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE;YAChC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChE,YAAY,IAAI,CAAC,CAAC;gBAClB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;aACvB;SACF;aAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;YAC5B,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;SAC/B;aAAM,IAAI,CAAC,YAAY,EAAE,EAAE;YAC1B,YAAY,IAAI,CAAC,CAAC;YAClB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;SACvB;KACF;SAAM,IAAI,QAAQ,EAAE;QACnB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;YACrB,YAAY,IAAI,CAAC,CAAC;YAClB,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;SACnD;aAAM,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE;YACjC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;gBAClE,YAAY,IAAI,CAAC,CAAC;gBAClB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;aACvB;SACF;aAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;YAC5B,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;SAC/B;aAAM,IAAI,CAAC,YAAY,EAAE,EAAE;YAC1B,YAAY,IAAI,CAAC,CAAC;YAClB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;SACvB;KACF;SAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE;QAC5B,WAAW;QACX,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;KAC/B;AACH,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,IAAI,WAAW,CACnB,wBAAqB,MAAM,CAAC,MAAM,CAChC,KAAK,CACN,cAAQ,KAAK,oBAAe,KAAO,CACrC,CAAC;AACJ,CAAC"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:29
* @version 1.0.0
* @desc tokenize.ts
*/
var State;
(function (State) {
State["Literal"] = "Literal";
State["BeforeOpenTag"] = "BeforeOpenTag";
State["OpeningTag"] = "OpeningTag";
State["AfterOpenTag"] = "AfterOpenTag";
State["InValueNq"] = "InValueNq";
State["InValueSq"] = "InValueSq";
State["InValueDq"] = "InValueDq";
State["ClosingOpenTag"] = "ClosingOpenTag";
State["OpeningSpecial"] = "OpeningSpecial";
State["OpeningDoctype"] = "OpeningDoctype";
State["OpeningNormalComment"] = "OpeningNormalComment";
State["InNormalComment"] = "InNormalComment";
State["InShortComment"] = "InShortComment";
State["ClosingNormalComment"] = "ClosingNormalComment";
State["ClosingTag"] = "ClosingTag";
})(State || (State = {}));
export var TokenKind;
(function (TokenKind) {
TokenKind["Literal"] = "Literal";
TokenKind["OpenTag"] = "OpenTag";
TokenKind["OpenTagEnd"] = "OpenTagEnd";
TokenKind["CloseTag"] = "CloseTag";
TokenKind["Whitespace"] = "Whitespace";
TokenKind["AttrValueEq"] = "AttrValueEq";
TokenKind["AttrValueNq"] = "AttrValueNq";
TokenKind["AttrValueSq"] = "AttrValueSq";
TokenKind["AttrValueDq"] = "AttrValueDq";
})(TokenKind || (TokenKind = {}));
var state;
var buffer;
var bufSize;
var sectionStart;
var index;
var tokens;
var char;
var inScript;
var inStyle;
var offset;
function makeCodePoints(input) {
return {
lower: input
.toLowerCase()
.split('')
.map(function (c) { return c.charCodeAt(0); }),
upper: input
.toUpperCase()
.split('')
.map(function (c) { return c.charCodeAt(0); }),
length: input.length,
};
}
var doctype = makeCodePoints('!doctype');
var style = makeCodePoints('style');
var script = makeCodePoints('script');
var Chars;
(function (Chars) {
Chars[Chars["_S"] = ' '.charCodeAt(0)] = "_S";
Chars[Chars["_N"] = '\n'.charCodeAt(0)] = "_N";
Chars[Chars["_T"] = '\t'.charCodeAt(0)] = "_T";
Chars[Chars["_R"] = '\r'.charCodeAt(0)] = "_R";
Chars[Chars["_F"] = '\f'.charCodeAt(0)] = "_F";
Chars[Chars["Lt"] = '<'.charCodeAt(0)] = "Lt";
Chars[Chars["Ep"] = '!'.charCodeAt(0)] = "Ep";
Chars[Chars["Cl"] = '-'.charCodeAt(0)] = "Cl";
Chars[Chars["Sl"] = '/'.charCodeAt(0)] = "Sl";
Chars[Chars["Gt"] = '>'.charCodeAt(0)] = "Gt";
Chars[Chars["Qm"] = '?'.charCodeAt(0)] = "Qm";
Chars[Chars["La"] = 'a'.charCodeAt(0)] = "La";
Chars[Chars["Lz"] = 'z'.charCodeAt(0)] = "Lz";
Chars[Chars["Ua"] = 'A'.charCodeAt(0)] = "Ua";
Chars[Chars["Uz"] = 'Z'.charCodeAt(0)] = "Uz";
Chars[Chars["Eq"] = '='.charCodeAt(0)] = "Eq";
Chars[Chars["Sq"] = "'".charCodeAt(0)] = "Sq";
Chars[Chars["Dq"] = '"'.charCodeAt(0)] = "Dq";
Chars[Chars["Ld"] = 'd'.charCodeAt(0)] = "Ld";
Chars[Chars["Ud"] = 'D'.charCodeAt(0)] = "Ud";
})(Chars || (Chars = {}));
function isWhiteSpace() {
return (char === Chars._S ||
char === Chars._N ||
char === Chars._T ||
char === Chars._T ||
char === Chars._R ||
char === Chars._F);
}
function init(input) {
state = State.Literal;
buffer = input;
bufSize = input.length;
sectionStart = 0;
index = 0;
tokens = [];
inScript = false;
inStyle = false;
offset = 0;
}
export function tokenize(input) {
init(input);
while (index < bufSize) {
char = buffer.charCodeAt(index);
switch (state) {
case State.Literal:
parseLiteral();
break;
case State.BeforeOpenTag:
parseBeforeOpenTag();
break;
case State.OpeningTag:
parseOpeningTag();
break;
case State.AfterOpenTag:
parseAfterOpenTag();
break;
case State.InValueNq:
parseInValueNq();
break;
case State.InValueSq:
parseInValueSq();
break;
case State.InValueDq:
parseInValueDq();
break;
case State.ClosingOpenTag:
parseClosingOpenTag();
break;
case State.OpeningSpecial:
parseOpeningSpecial();
break;
case State.OpeningDoctype:
parseOpeningDoctype();
break;
case State.OpeningNormalComment:
parseOpeningNormalComment();
break;
case State.InNormalComment:
parseNormalComment();
break;
case State.InShortComment:
parseShortComment();
break;
case State.ClosingNormalComment:
parseClosingNormalComment();
break;
case State.ClosingTag:
parseClosingTag();
break;
default:
unexpected();
break;
}
index++;
}
switch (state) {
case State.Literal:
case State.BeforeOpenTag:
case State.InValueNq:
case State.InValueSq:
case State.InValueDq:
case State.ClosingOpenTag:
case State.InNormalComment:
case State.InShortComment:
case State.ClosingNormalComment:
emitToken(TokenKind.Literal);
break;
case State.OpeningTag:
emitToken(TokenKind.OpenTag);
break;
case State.AfterOpenTag:
break;
case State.OpeningSpecial:
emitToken(TokenKind.OpenTag, State.InShortComment);
break;
case State.OpeningDoctype:
if (index - sectionStart === doctype.length) {
emitToken(TokenKind.OpenTag);
}
else {
emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);
emitToken(TokenKind.Literal);
}
break;
case State.OpeningNormalComment:
if (index - sectionStart === 2) {
emitToken(TokenKind.OpenTag);
}
else {
emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);
emitToken(TokenKind.Literal);
}
break;
case State.ClosingTag:
emitToken(TokenKind.CloseTag);
break;
default:
break;
}
var _tokens = tokens;
init('');
return _tokens;
}
function emitToken(kind, newState, end) {
if (newState === void 0) { newState = state; }
if (end === void 0) { end = index; }
var value = buffer.substring(sectionStart, end);
if (kind === TokenKind.OpenTag || kind === TokenKind.CloseTag) {
value = value.toLowerCase();
}
if (kind === TokenKind.OpenTag) {
if (value === 'script') {
inScript = true;
}
else if (value === 'style') {
inStyle = true;
}
}
if (kind === TokenKind.CloseTag) {
inScript = inStyle = false;
}
if (!((kind === TokenKind.Literal || kind === TokenKind.Whitespace) &&
end === sectionStart)) {
// empty literal should be ignored
tokens.push({ type: kind, start: sectionStart, end: end, value: value });
}
if (kind === TokenKind.OpenTagEnd || kind === TokenKind.CloseTag) {
sectionStart = end + 1;
state = State.Literal;
}
else {
sectionStart = end;
state = newState;
}
}
function parseLiteral() {
if (char === Chars.Lt) {
// <
emitToken(TokenKind.Literal, State.BeforeOpenTag);
}
}
function parseBeforeOpenTag() {
if (inScript || inStyle) {
if (char === Chars.Sl) {
state = State.ClosingTag;
sectionStart = index + 1;
}
else {
state = State.Literal;
}
return;
}
if ((char >= Chars.La && char <= Chars.Lz) ||
(char >= Chars.Ua && char <= Chars.Uz)) {
// <d
state = State.OpeningTag;
sectionStart = index;
}
else if (char === Chars.Sl) {
// </
state = State.ClosingTag;
sectionStart = index + 1;
}
else if (char === Chars.Lt) {
// <<
emitToken(TokenKind.Literal);
}
else if (char === Chars.Ep) {
// <!
state = State.OpeningSpecial;
sectionStart = index;
}
else if (char === Chars.Qm) {
// <?
// treat as short comment
sectionStart = index;
emitToken(TokenKind.OpenTag, State.InShortComment);
}
else {
// <>
// any other chars covert to normal state
state = State.Literal;
}
}
function parseOpeningTag() {
if (isWhiteSpace()) {
// <div ...
emitToken(TokenKind.OpenTag, State.AfterOpenTag);
}
else if (char === Chars.Gt) {
// <div>
emitToken(TokenKind.OpenTag);
emitToken(TokenKind.OpenTagEnd);
}
else if (char === Chars.Sl) {
// <div/
emitToken(TokenKind.OpenTag, State.ClosingOpenTag);
}
}
function parseAfterOpenTag() {
if (char === Chars.Gt) {
// <div >
emitToken(TokenKind.Whitespace);
emitToken(TokenKind.OpenTagEnd);
}
else if (char === Chars.Sl) {
// <div /
emitToken(TokenKind.Whitespace, State.ClosingOpenTag);
}
else if (char === Chars.Eq) {
// <div ...=...
emitToken(TokenKind.Whitespace);
emitToken(TokenKind.AttrValueEq, void 0, index + 1);
}
else if (char === Chars.Sq) {
// <div ...'...
emitToken(TokenKind.Whitespace, State.InValueSq);
}
else if (char === Chars.Dq) {
// <div ..."...
emitToken(TokenKind.Whitespace, State.InValueDq);
}
else if (!isWhiteSpace()) {
// <div ...name...
emitToken(TokenKind.Whitespace, State.InValueNq);
}
}
function parseInValueNq() {
if (char === Chars.Gt) {
// <div xxx>
emitToken(TokenKind.AttrValueNq);
emitToken(TokenKind.OpenTagEnd);
}
else if (char === Chars.Sl) {
// <div xxx/
emitToken(TokenKind.AttrValueNq, State.ClosingOpenTag);
}
else if (char === Chars.Eq) {
// <div xxx=
emitToken(TokenKind.AttrValueNq);
emitToken(TokenKind.AttrValueEq, State.AfterOpenTag, index + 1);
}
else if (isWhiteSpace()) {
// <div xxx ...
emitToken(TokenKind.AttrValueNq, State.AfterOpenTag);
}
}
function parseInValueSq() {
if (char === Chars.Sq) {
// <div 'xxx'
emitToken(TokenKind.AttrValueSq, State.AfterOpenTag, index + 1);
}
}
function parseInValueDq() {
if (char === Chars.Dq) {
// <div "xxx", problem same to Sq
emitToken(TokenKind.AttrValueDq, State.AfterOpenTag, index + 1);
}
}
function parseClosingOpenTag() {
if (char === Chars.Gt) {
// <div />
emitToken(TokenKind.OpenTagEnd);
}
else {
// <div /...>
emitToken(TokenKind.AttrValueNq, State.AfterOpenTag);
parseAfterOpenTag();
}
}
function parseOpeningSpecial() {
switch (char) {
case Chars.Cl: // <!-
state = State.OpeningNormalComment;
break;
case Chars.Ld: // <!d
case Chars.Ud: // <!D
state = State.OpeningDoctype;
break;
default:
emitToken(TokenKind.OpenTag, State.InShortComment);
break;
}
}
function parseOpeningDoctype() {
offset = index - sectionStart;
if (offset === doctype.length) {
// <!d, <!d , start: 0, index: 2
if (isWhiteSpace()) {
emitToken(TokenKind.OpenTag, State.AfterOpenTag);
}
else {
unexpected();
}
}
else if (char === Chars.Gt) {
// <!DOCT>
emitToken(TokenKind.OpenTag, void 0, sectionStart + 1);
emitToken(TokenKind.Literal);
emitToken(TokenKind.OpenTagEnd);
}
else if (doctype.lower[offset] !== char && doctype.upper[offset] !== char) {
// <!DOCX...
emitToken(TokenKind.OpenTag, State.InShortComment, sectionStart + 1);
}
}
function parseOpeningNormalComment() {
if (char === Chars.Cl) {
// <!--
emitToken(TokenKind.OpenTag, State.InNormalComment, index + 1);
}
else {
emitToken(TokenKind.OpenTag, State.InShortComment, sectionStart + 1);
}
}
function parseNormalComment() {
if (char === Chars.Cl) {
// <!-- ... -
emitToken(TokenKind.Literal, State.ClosingNormalComment);
}
}
function parseShortComment() {
if (char === Chars.Gt) {
// <! ... >
emitToken(TokenKind.Literal);
emitToken(TokenKind.OpenTagEnd);
}
}
function parseClosingNormalComment() {
offset = index - sectionStart;
if (offset === 2) {
if (char === Chars.Gt) {
// <!-- xxx -->
emitToken(TokenKind.OpenTagEnd);
}
else if (char === Chars.Cl) {
// <!-- xxx ---
emitToken(TokenKind.Literal, void 0, sectionStart + 1);
}
else {
// <!-- xxx --x
state = State.InNormalComment;
}
}
else if (char !== Chars.Cl) {
// <!-- xxx - ...
state = State.InNormalComment;
}
}
function parseClosingTag() {
offset = index - sectionStart;
if (inStyle) {
if (char === Chars.Lt) {
sectionStart -= 2;
emitToken(TokenKind.Literal, State.BeforeOpenTag);
}
else if (offset < style.length) {
if (style.lower[offset] !== char && style.upper[offset] !== char) {
sectionStart -= 2;
state = State.Literal;
}
}
else if (char === Chars.Gt) {
emitToken(TokenKind.CloseTag);
}
else if (!isWhiteSpace()) {
sectionStart -= 2;
state = State.Literal;
}
}
else if (inScript) {
if (char === Chars.Lt) {
sectionStart -= 2;
emitToken(TokenKind.Literal, State.BeforeOpenTag);
}
else if (offset < script.length) {
if (script.lower[offset] !== char && script.upper[offset] !== char) {
sectionStart -= 2;
state = State.Literal;
}
}
else if (char === Chars.Gt) {
emitToken(TokenKind.CloseTag);
}
else if (!isWhiteSpace()) {
sectionStart -= 2;
state = State.Literal;
}
}
else if (char === Chars.Gt) {
// </ xxx >
emitToken(TokenKind.CloseTag);
}
}
function unexpected() {
throw new SyntaxError("Unexpected token \"" + buffer.charAt(index) + "\" at " + index + " when parse " + state);
}
//# sourceMappingURL=tokenize.js.map
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":"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"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 14:15:25
* @version 1.0.0
* @desc tokenize.spec.ts
*/
import { TokenKind } from './tokenize';
export declare let tokenIndex: number;
export declare function token(value: string, type?: TokenKind, start?: number): {
start: number;
end: number;
value: string;
type: TokenKind;
};
"use strict";
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 14:15:25
* @version 1.0.0
* @desc tokenize.spec.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.token = exports.tokenIndex = void 0;
var tslib_1 = require("tslib");
var assert = tslib_1.__importStar(require("assert"));
var tokenize_1 = require("./tokenize");
exports.tokenIndex = 0;
function token(value, type, start) {
if (type === void 0) { type = tokenize_1.TokenKind.Literal; }
if (start === void 0) { start = exports.tokenIndex; }
var v = {
start: start,
end: start + value.length,
value: value,
type: type,
};
exports.tokenIndex = v.end;
return v;
}
exports.token = token;
var cases = [
{
name: 'single Literal',
input: 'hello',
tokens: [token('hello', tokenize_1.TokenKind.Literal, 0)],
},
{
name: 'Literal end with <',
input: 'hello<',
tokens: [token('hello', void 0, 0), token('<')],
},
{
name: 'Literal unexpected <',
input: 'hello< world',
tokens: [token('hello', void 0, 0), token('< world')],
},
{
name: 'OpenTag EOF',
input: '<div',
tokens: [token('div', tokenize_1.TokenKind.OpenTag, 1)],
},
{
name: 'attribute names',
input: "<div a1 'b2' \"c3\" 'd4'e5 'f6\"' \"g7'\"></div>",
tokens: [
token('div', tokenize_1.TokenKind.OpenTag, 1),
token(' ', tokenize_1.TokenKind.Whitespace),
token('a1', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token("'b2'", tokenize_1.TokenKind.AttrValueSq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('"c3"', tokenize_1.TokenKind.AttrValueDq),
token(' ', tokenize_1.TokenKind.Whitespace),
token("'d4'", tokenize_1.TokenKind.AttrValueSq),
token('e5', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token("'f6\"'", tokenize_1.TokenKind.AttrValueSq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('"g7\'"', tokenize_1.TokenKind.AttrValueDq),
token('', tokenize_1.TokenKind.OpenTagEnd),
token('div', tokenize_1.TokenKind.CloseTag, exports.tokenIndex + 3),
],
},
{
name: 'attribute values',
input: '<div a b= c=1 d e = f = g \'h\'=i "j"k=lmn o=\'pq\' r="st"u>M</div>',
tokens: [
token('div', tokenize_1.TokenKind.OpenTag, 1),
token(' ', tokenize_1.TokenKind.Whitespace),
token('a', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('b', tokenize_1.TokenKind.AttrValueNq),
token('=', tokenize_1.TokenKind.AttrValueEq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('c', tokenize_1.TokenKind.AttrValueNq),
token('=', tokenize_1.TokenKind.AttrValueEq),
token('1', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('d', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('e', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('=', tokenize_1.TokenKind.AttrValueEq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('f', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('=', tokenize_1.TokenKind.AttrValueEq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('g', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token("'h'", tokenize_1.TokenKind.AttrValueSq),
token('=', tokenize_1.TokenKind.AttrValueEq),
token('i', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('"j"', tokenize_1.TokenKind.AttrValueDq),
token('k', tokenize_1.TokenKind.AttrValueNq),
token('=', tokenize_1.TokenKind.AttrValueEq),
token('lmn', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('o', tokenize_1.TokenKind.AttrValueNq),
token('=', tokenize_1.TokenKind.AttrValueEq),
token("'pq'", tokenize_1.TokenKind.AttrValueSq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('r', tokenize_1.TokenKind.AttrValueNq),
token('=', tokenize_1.TokenKind.AttrValueEq),
token('"st"', tokenize_1.TokenKind.AttrValueDq),
token('u', tokenize_1.TokenKind.AttrValueNq),
token('', tokenize_1.TokenKind.OpenTagEnd),
token('M', void 0, exports.tokenIndex + 1),
token('div', tokenize_1.TokenKind.CloseTag, exports.tokenIndex + 2),
],
},
{
name: 'normal doctype',
input: '<!doctype html>',
tokens: [
token('!doctype', tokenize_1.TokenKind.OpenTag, 1),
token(' ', tokenize_1.TokenKind.Whitespace),
token('html', tokenize_1.TokenKind.AttrValueNq),
token('', tokenize_1.TokenKind.OpenTagEnd),
],
},
{
name: 'unexpected eof end doctype',
input: '<!doctype',
tokens: [token('!doctype', tokenize_1.TokenKind.OpenTag, 1)],
},
{
name: 'unexpected eof in doctype',
input: '<!doctyp',
tokens: [token('!', tokenize_1.TokenKind.OpenTag, 1), token('doctyp')],
},
{
name: 'normal comment',
input: '<!-- hello world -->',
tokens: [
token('!--', tokenize_1.TokenKind.OpenTag, 1),
token(' hello world '),
token('--', tokenize_1.TokenKind.OpenTagEnd),
],
},
{
name: 'short comment',
input: '<? hello world ?><!- hello world ->',
tokens: [
token('', tokenize_1.TokenKind.OpenTag, 1),
token('? hello world ?'),
token('', tokenize_1.TokenKind.OpenTagEnd),
token('!', tokenize_1.TokenKind.OpenTag, exports.tokenIndex + 2),
token('- hello world -'),
token('', tokenize_1.TokenKind.OpenTagEnd),
],
},
{
name: 'open tag end',
input: '<a1><b2/><c3 /><d4 / ><e5 f6/><g7 /h8><i9 /j10/><k11//>',
tokens: [
token('a1', tokenize_1.TokenKind.OpenTag, 1),
token('', tokenize_1.TokenKind.OpenTagEnd),
token('b2', tokenize_1.TokenKind.OpenTag, exports.tokenIndex + 2),
token('/', tokenize_1.TokenKind.OpenTagEnd),
token('c3', tokenize_1.TokenKind.OpenTag, exports.tokenIndex + 2),
token(' ', tokenize_1.TokenKind.Whitespace),
token('/', tokenize_1.TokenKind.OpenTagEnd),
token('d4', tokenize_1.TokenKind.OpenTag, exports.tokenIndex + 2),
token(' ', tokenize_1.TokenKind.Whitespace),
token('/', tokenize_1.TokenKind.AttrValueNq),
token(' ', tokenize_1.TokenKind.Whitespace),
token('', tokenize_1.TokenKind.OpenTagEnd),
token('e5', tokenize_1.TokenKind.OpenTag, exports.tokenIndex + 2),
token(' ', tokenize_1.TokenKind.Whitespace),
token('f6', tokenize_1.TokenKind.AttrValueNq),
token('/', tokenize_1.TokenKind.OpenTagEnd),
token('g7', tokenize_1.TokenKind.OpenTag, exports.tokenIndex + 2),
token(' ', tokenize_1.TokenKind.Whitespace),
token('/', tokenize_1.TokenKind.AttrValueNq),
token('h8', tokenize_1.TokenKind.AttrValueNq),
token('', tokenize_1.TokenKind.OpenTagEnd),
token('i9', tokenize_1.TokenKind.OpenTag, exports.tokenIndex + 2),
token(' ', tokenize_1.TokenKind.Whitespace),
token('/', tokenize_1.TokenKind.AttrValueNq),
token('j10', tokenize_1.TokenKind.AttrValueNq),
token('/', tokenize_1.TokenKind.OpenTagEnd),
token('k11', tokenize_1.TokenKind.OpenTag, exports.tokenIndex + 2),
token('/', tokenize_1.TokenKind.AttrValueNq),
token('/', tokenize_1.TokenKind.OpenTagEnd),
],
},
{
name: 'close tag',
input: '</div></ div >',
tokens: [
token('div', tokenize_1.TokenKind.CloseTag, 2),
token(' div ', tokenize_1.TokenKind.CloseTag, exports.tokenIndex + 3),
],
},
{
name: 'special normal comment',
input: '<!---- - -- ---->',
tokens: [
token('!--', tokenize_1.TokenKind.OpenTag, 1),
token('-- '),
token('- '),
token('-- '),
token('-'),
token('-'),
token('--', tokenize_1.TokenKind.OpenTagEnd),
],
},
{
name: 'script',
input: '<script></div></script</script >',
tokens: [
token('script', tokenize_1.TokenKind.OpenTag, 1),
token('', tokenize_1.TokenKind.OpenTagEnd),
token('</div>', tokenize_1.TokenKind.Literal, exports.tokenIndex + 1),
token('</script'),
token('script ', tokenize_1.TokenKind.CloseTag, exports.tokenIndex + 2),
],
},
{
name: 'style',
input: '<style></div></style</style >',
tokens: [
token('style', tokenize_1.TokenKind.OpenTag, 1),
token('', tokenize_1.TokenKind.OpenTagEnd),
token('</div>', tokenize_1.TokenKind.Literal, exports.tokenIndex + 1),
token('</style'),
token('style ', tokenize_1.TokenKind.CloseTag, exports.tokenIndex + 2),
],
},
];
describe('simple cases', function () {
var e_1, _a;
var _loop_1 = function (_case) {
it("case \"" + _case.name + "\"", function () {
var tokens = tokenize_1.tokenize(_case.input);
assert.deepStrictEqual(tokens, _case.tokens);
});
};
try {
for (var cases_1 = tslib_1.__values(cases), cases_1_1 = cases_1.next(); !cases_1_1.done; cases_1_1 = cases_1.next()) {
var _case = cases_1_1.value;
_loop_1(_case);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (cases_1_1 && !cases_1_1.done && (_a = cases_1.return)) _a.call(cases_1);
}
finally { if (e_1) throw e_1.error; }
}
});
//# sourceMappingURL=tokenize.spec.js.map
{"version":3,"file":"tokenize.spec.js","sourceRoot":"","sources":["../src/tokenize.spec.ts"],"names":[],"mappings":"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"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 14:15:25
* @version 1.0.0
* @desc tokenize.spec.ts
*/
import { __values } from "tslib";
import * as assert from 'assert';
import { tokenize, TokenKind } from './tokenize';
export var tokenIndex = 0;
export function token(value, type, start) {
if (type === void 0) { type = TokenKind.Literal; }
if (start === void 0) { start = tokenIndex; }
var v = {
start: start,
end: start + value.length,
value: value,
type: type,
};
tokenIndex = v.end;
return v;
}
var cases = [
{
name: 'single Literal',
input: 'hello',
tokens: [token('hello', TokenKind.Literal, 0)],
},
{
name: 'Literal end with <',
input: 'hello<',
tokens: [token('hello', void 0, 0), token('<')],
},
{
name: 'Literal unexpected <',
input: 'hello< world',
tokens: [token('hello', void 0, 0), token('< world')],
},
{
name: 'OpenTag EOF',
input: '<div',
tokens: [token('div', TokenKind.OpenTag, 1)],
},
{
name: 'attribute names',
input: "<div a1 'b2' \"c3\" 'd4'e5 'f6\"' \"g7'\"></div>",
tokens: [
token('div', TokenKind.OpenTag, 1),
token(' ', TokenKind.Whitespace),
token('a1', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token("'b2'", TokenKind.AttrValueSq),
token(' ', TokenKind.Whitespace),
token('"c3"', TokenKind.AttrValueDq),
token(' ', TokenKind.Whitespace),
token("'d4'", TokenKind.AttrValueSq),
token('e5', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token("'f6\"'", TokenKind.AttrValueSq),
token(' ', TokenKind.Whitespace),
token('"g7\'"', TokenKind.AttrValueDq),
token('', TokenKind.OpenTagEnd),
token('div', TokenKind.CloseTag, tokenIndex + 3),
],
},
{
name: 'attribute values',
input: '<div a b= c=1 d e = f = g \'h\'=i "j"k=lmn o=\'pq\' r="st"u>M</div>',
tokens: [
token('div', TokenKind.OpenTag, 1),
token(' ', TokenKind.Whitespace),
token('a', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token('b', TokenKind.AttrValueNq),
token('=', TokenKind.AttrValueEq),
token(' ', TokenKind.Whitespace),
token('c', TokenKind.AttrValueNq),
token('=', TokenKind.AttrValueEq),
token('1', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token('d', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token('e', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token('=', TokenKind.AttrValueEq),
token(' ', TokenKind.Whitespace),
token('f', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token('=', TokenKind.AttrValueEq),
token(' ', TokenKind.Whitespace),
token('g', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token("'h'", TokenKind.AttrValueSq),
token('=', TokenKind.AttrValueEq),
token('i', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token('"j"', TokenKind.AttrValueDq),
token('k', TokenKind.AttrValueNq),
token('=', TokenKind.AttrValueEq),
token('lmn', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token('o', TokenKind.AttrValueNq),
token('=', TokenKind.AttrValueEq),
token("'pq'", TokenKind.AttrValueSq),
token(' ', TokenKind.Whitespace),
token('r', TokenKind.AttrValueNq),
token('=', TokenKind.AttrValueEq),
token('"st"', TokenKind.AttrValueDq),
token('u', TokenKind.AttrValueNq),
token('', TokenKind.OpenTagEnd),
token('M', void 0, tokenIndex + 1),
token('div', TokenKind.CloseTag, tokenIndex + 2),
],
},
{
name: 'normal doctype',
input: '<!doctype html>',
tokens: [
token('!doctype', TokenKind.OpenTag, 1),
token(' ', TokenKind.Whitespace),
token('html', TokenKind.AttrValueNq),
token('', TokenKind.OpenTagEnd),
],
},
{
name: 'unexpected eof end doctype',
input: '<!doctype',
tokens: [token('!doctype', TokenKind.OpenTag, 1)],
},
{
name: 'unexpected eof in doctype',
input: '<!doctyp',
tokens: [token('!', TokenKind.OpenTag, 1), token('doctyp')],
},
{
name: 'normal comment',
input: '<!-- hello world -->',
tokens: [
token('!--', TokenKind.OpenTag, 1),
token(' hello world '),
token('--', TokenKind.OpenTagEnd),
],
},
{
name: 'short comment',
input: '<? hello world ?><!- hello world ->',
tokens: [
token('', TokenKind.OpenTag, 1),
token('? hello world ?'),
token('', TokenKind.OpenTagEnd),
token('!', TokenKind.OpenTag, tokenIndex + 2),
token('- hello world -'),
token('', TokenKind.OpenTagEnd),
],
},
{
name: 'open tag end',
input: '<a1><b2/><c3 /><d4 / ><e5 f6/><g7 /h8><i9 /j10/><k11//>',
tokens: [
token('a1', TokenKind.OpenTag, 1),
token('', TokenKind.OpenTagEnd),
token('b2', TokenKind.OpenTag, tokenIndex + 2),
token('/', TokenKind.OpenTagEnd),
token('c3', TokenKind.OpenTag, tokenIndex + 2),
token(' ', TokenKind.Whitespace),
token('/', TokenKind.OpenTagEnd),
token('d4', TokenKind.OpenTag, tokenIndex + 2),
token(' ', TokenKind.Whitespace),
token('/', TokenKind.AttrValueNq),
token(' ', TokenKind.Whitespace),
token('', TokenKind.OpenTagEnd),
token('e5', TokenKind.OpenTag, tokenIndex + 2),
token(' ', TokenKind.Whitespace),
token('f6', TokenKind.AttrValueNq),
token('/', TokenKind.OpenTagEnd),
token('g7', TokenKind.OpenTag, tokenIndex + 2),
token(' ', TokenKind.Whitespace),
token('/', TokenKind.AttrValueNq),
token('h8', TokenKind.AttrValueNq),
token('', TokenKind.OpenTagEnd),
token('i9', TokenKind.OpenTag, tokenIndex + 2),
token(' ', TokenKind.Whitespace),
token('/', TokenKind.AttrValueNq),
token('j10', TokenKind.AttrValueNq),
token('/', TokenKind.OpenTagEnd),
token('k11', TokenKind.OpenTag, tokenIndex + 2),
token('/', TokenKind.AttrValueNq),
token('/', TokenKind.OpenTagEnd),
],
},
{
name: 'close tag',
input: '</div></ div >',
tokens: [
token('div', TokenKind.CloseTag, 2),
token(' div ', TokenKind.CloseTag, tokenIndex + 3),
],
},
{
name: 'special normal comment',
input: '<!---- - -- ---->',
tokens: [
token('!--', TokenKind.OpenTag, 1),
token('-- '),
token('- '),
token('-- '),
token('-'),
token('-'),
token('--', TokenKind.OpenTagEnd),
],
},
{
name: 'script',
input: '<script></div></script</script >',
tokens: [
token('script', TokenKind.OpenTag, 1),
token('', TokenKind.OpenTagEnd),
token('</div>', TokenKind.Literal, tokenIndex + 1),
token('</script'),
token('script ', TokenKind.CloseTag, tokenIndex + 2),
],
},
{
name: 'style',
input: '<style></div></style</style >',
tokens: [
token('style', TokenKind.OpenTag, 1),
token('', TokenKind.OpenTagEnd),
token('</div>', TokenKind.Literal, tokenIndex + 1),
token('</style'),
token('style ', TokenKind.CloseTag, tokenIndex + 2),
],
},
];
describe('simple cases', function () {
var e_1, _a;
var _loop_1 = function (_case) {
it("case \"" + _case.name + "\"", function () {
var tokens = tokenize(_case.input);
assert.deepStrictEqual(tokens, _case.tokens);
});
};
try {
for (var cases_1 = __values(cases), cases_1_1 = cases_1.next(); !cases_1_1.done; cases_1_1 = cases_1.next()) {
var _case = cases_1_1.value;
_loop_1(_case);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (cases_1_1 && !cases_1_1.done && (_a = cases_1.return)) _a.call(cases_1);
}
finally { if (e_1) throw e_1.error; }
}
});
//# sourceMappingURL=tokenize.spec.js.map
{"version":3,"file":"tokenize.spec.js","sourceRoot":"","sources":["../src/tokenize.spec.ts"],"names":[],"mappings":"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"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-18 15:17:51
* @version 1.0.0
* @desc types.ts
*/
export declare enum SyntaxKind {
Text = "Text",
Tag = "Tag"
}
export interface IBaseNode {
start: number;
end: number;
}
export interface IText extends IBaseNode {
type: SyntaxKind.Text;
value: string;
}
export interface IAttributeValue extends IBaseNode {
value: string;
quote: "'" | '"' | undefined;
}
export interface IAttribute extends IBaseNode {
name: IText;
value: IAttributeValue | undefined;
}
export interface ITag extends IBaseNode {
type: SyntaxKind.Tag;
open: IText;
name: string;
rawName: string;
attributes: IAttribute[];
attributeMap: Record<string, IAttribute> | undefined;
body: Array<ITag | IText> | undefined | null;
close: IText | undefined | null;
}
export declare type INode = IText | ITag;
"use strict";
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-18 15:17:51
* @version 1.0.0
* @desc types.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.SyntaxKind = void 0;
var SyntaxKind;
(function (SyntaxKind) {
SyntaxKind["Text"] = "Text";
SyntaxKind["Tag"] = "Tag";
})(SyntaxKind = exports.SyntaxKind || (exports.SyntaxKind = {}));
//# sourceMappingURL=types.js.map
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,yBAAW,CAAA;AACb,CAAC,EAHW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAGrB"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-18 15:17:51
* @version 1.0.0
* @desc types.ts
*/
export var SyntaxKind;
(function (SyntaxKind) {
SyntaxKind["Text"] = "Text";
SyntaxKind["Tag"] = "Tag";
})(SyntaxKind || (SyntaxKind = {}));
//# sourceMappingURL=types.js.map
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAN,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,yBAAW,CAAA;AACb,CAAC,EAHW,UAAU,KAAV,UAAU,QAGrB"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-20 21:41:39
* @version 1.0.0
* @desc utils.ts
*/
export declare function inspectToken(input: string): string;
export declare function getLineRanges(input: string): number[];
export declare function getPosition(ranges: number[], offset: number): [number, number];
"use strict";
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-20 21:41:39
* @version 1.0.0
* @desc utils.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPosition = exports.getLineRanges = exports.inspectToken = void 0;
var tslib_1 = require("tslib");
var tokenize_1 = require("./tokenize");
function inspectToken(input) {
var e_1, _a;
var tokens = tokenize_1.tokenize(input);
var output = '';
var upper = '';
var down = '';
var max = 120;
var pos;
var value;
var width;
try {
for (var tokens_1 = tslib_1.__values(tokens), tokens_1_1 = tokens_1.next(); !tokens_1_1.done; tokens_1_1 = tokens_1.next()) {
var token = tokens_1_1.value;
pos = token.start.toString();
value = JSON.stringify(token.value);
value = value.substr(1, value.length - 2);
width = Math.max(pos.length, value.length) + 1;
upper += value.padEnd(width, ' ') + '|';
down += pos.padEnd(width, ' ') + '|';
if (upper.length > max) {
output += upper + "\n" + down + "\n\n";
upper = '';
down = '';
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (tokens_1_1 && !tokens_1_1.done && (_a = tokens_1.return)) _a.call(tokens_1);
}
finally { if (e_1) throw e_1.error; }
}
if (upper.length > 0) {
output += upper + "\n" + down + "\n";
}
return output;
}
exports.inspectToken = inspectToken;
function getLineRanges(input) {
return input.split('\n').reduce(function (arr, line) {
arr.push(line.length + 1 + arr[arr.length - 1]);
return arr;
}, [0]);
}
exports.getLineRanges = getLineRanges;
function getPosition(ranges, offset) {
var line = NaN;
var column = NaN;
for (var i = 1; i < ranges.length; i++) {
if (ranges[i] > offset) {
line = i;
column = offset - ranges[i - 1] + 1;
break;
}
}
return [line, column];
}
exports.getPosition = getPosition;
//# sourceMappingURL=utils.js.map
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;AAEH,uCAAsC;AAEtC,SAAgB,YAAY,CAAC,KAAa;;IACxC,IAAM,MAAM,GAAG,mBAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAM,GAAG,GAAG,GAAG,CAAC;IAChB,IAAI,GAAW,CAAC;IAChB,IAAI,KAAa,CAAC;IAClB,IAAI,KAAa,CAAC;;QAClB,KAAoB,IAAA,WAAA,iBAAA,MAAM,CAAA,8BAAA,kDAAE;YAAvB,IAAM,KAAK,mBAAA;YACd,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1C,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/C,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;YACxC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;YACrC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE;gBACtB,MAAM,IAAO,KAAK,UAAK,IAAI,SAAM,CAAC;gBAClC,KAAK,GAAG,EAAE,CAAC;gBACX,IAAI,GAAG,EAAE,CAAC;aACX;SACF;;;;;;;;;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,MAAM,IAAO,KAAK,UAAK,IAAI,OAAI,CAAC;KACjC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AA1BD,oCA0BC;AAED,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAC7B,UAAC,GAAG,EAAE,IAAI;QACR,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC;IACb,CAAC,EACD,CAAC,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AARD,sCAQC;AAED,SAAgB,WAAW,CACzB,MAAgB,EAChB,MAAc;IAEd,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE;YACtB,IAAI,GAAG,CAAC,CAAC;YACT,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM;SACP;KACF;IACD,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxB,CAAC;AAdD,kCAcC"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-20 21:41:39
* @version 1.0.0
* @desc utils.ts
*/
import { __values } from "tslib";
import { tokenize } from './tokenize';
export function inspectToken(input) {
var e_1, _a;
var tokens = tokenize(input);
var output = '';
var upper = '';
var down = '';
var max = 120;
var pos;
var value;
var width;
try {
for (var tokens_1 = __values(tokens), tokens_1_1 = tokens_1.next(); !tokens_1_1.done; tokens_1_1 = tokens_1.next()) {
var token = tokens_1_1.value;
pos = token.start.toString();
value = JSON.stringify(token.value);
value = value.substr(1, value.length - 2);
width = Math.max(pos.length, value.length) + 1;
upper += value.padEnd(width, ' ') + '|';
down += pos.padEnd(width, ' ') + '|';
if (upper.length > max) {
output += upper + "\n" + down + "\n\n";
upper = '';
down = '';
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (tokens_1_1 && !tokens_1_1.done && (_a = tokens_1.return)) _a.call(tokens_1);
}
finally { if (e_1) throw e_1.error; }
}
if (upper.length > 0) {
output += upper + "\n" + down + "\n";
}
return output;
}
export function getLineRanges(input) {
return input.split('\n').reduce(function (arr, line) {
arr.push(line.length + 1 + arr[arr.length - 1]);
return arr;
}, [0]);
}
export function getPosition(ranges, offset) {
var line = NaN;
var column = NaN;
for (var i = 1; i < ranges.length; i++) {
if (ranges[i] > offset) {
line = i;
column = offset - ranges[i - 1] + 1;
break;
}
}
return [line, column];
}
//# sourceMappingURL=utils.js.map
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,UAAU,YAAY,CAAC,KAAa;;IACxC,IAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAM,GAAG,GAAG,GAAG,CAAC;IAChB,IAAI,GAAW,CAAC;IAChB,IAAI,KAAa,CAAC;IAClB,IAAI,KAAa,CAAC;;QAClB,KAAoB,IAAA,WAAA,SAAA,MAAM,CAAA,8BAAA,kDAAE;YAAvB,IAAM,KAAK,mBAAA;YACd,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1C,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/C,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;YACxC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;YACrC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE;gBACtB,MAAM,IAAO,KAAK,UAAK,IAAI,SAAM,CAAC;gBAClC,KAAK,GAAG,EAAE,CAAC;gBACX,IAAI,GAAG,EAAE,CAAC;aACX;SACF;;;;;;;;;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,MAAM,IAAO,KAAK,UAAK,IAAI,OAAI,CAAC;KACjC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAC7B,UAAC,GAAG,EAAE,IAAI;QACR,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC;IACb,CAAC,EACD,CAAC,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,MAAgB,EAChB,MAAc;IAEd,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE;YACtB,IAAI,GAAG,CAAC,CAAC;YACT,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM;SACP;KACF;IACD,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxB,CAAC"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc walk.ts
*/
import { INode } from './types';
export interface IWalkOptions {
enter?(node: INode, parent: INode | void, index: number): void;
leave?(node: INode, parent: INode | void, index: number): void;
}
export declare function walk(ast: INode[], options: IWalkOptions): void;
"use strict";
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc walk.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.walk = void 0;
var types_1 = require("./types");
function visit(node, parent, index, options) {
options.enter && options.enter(node, parent, index);
if (node.type === types_1.SyntaxKind.Tag && Array.isArray(node.body)) {
for (var i = 0; i < node.body.length; i++) {
visit(node.body[i], node, i, options);
}
}
options.leave && options.leave(node, parent, index);
}
function walk(ast, options) {
for (var i = 0; i < ast.length; i++) {
visit(ast[i], void 0, i, options);
}
}
exports.walk = walk;
//# sourceMappingURL=walk.js.map
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../src/walk.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,iCAA4C;AAO5C,SAAS,KAAK,CACZ,IAAW,EACX,MAAoB,EACpB,KAAa,EACb,OAAqB;IAErB,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAU,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACzC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;SACvC;KACF;IACD,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,SAAgB,IAAI,CAAC,GAAY,EAAE,OAAqB;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;KACnC;AACH,CAAC;AAJD,oBAIC"}
/*!
*
* Copyright 2017 - acrazing
*
* @author acrazing joking.young@gmail.com
* @since 2017-08-19 00:54:46
* @version 1.0.0
* @desc walk.ts
*/
import { SyntaxKind } from './types';
function visit(node, parent, index, options) {
options.enter && options.enter(node, parent, index);
if (node.type === SyntaxKind.Tag && Array.isArray(node.body)) {
for (var i = 0; i < node.body.length; i++) {
visit(node.body[i], node, i, options);
}
}
options.leave && options.leave(node, parent, index);
}
export function walk(ast, options) {
for (var i = 0; i < ast.length; i++) {
visit(ast[i], void 0, i, options);
}
}
//# sourceMappingURL=walk.js.map
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../src/walk.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAS,UAAU,EAAE,MAAM,SAAS,CAAC;AAO5C,SAAS,KAAK,CACZ,IAAW,EACX,MAAoB,EACpB,KAAa,EACb,OAAqB;IAErB,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACzC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;SACvC;KACF;IACD,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAY,EAAE,OAAqB;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;KACnC;AACH,CAAC"}