html5parser
Advanced tools
| /*! | ||
| * | ||
| * 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,EAAkBC,gBAAlBD,kBAAkBC,KACpD,IAAIC,EAAQ/C,EAAOgD,UAAU9C,EAAc4C,OACvCF,OAA8BA,IAChCG,EAAQA,EAAMnC,mBAEZgC,IACY,WAAVG,EACFzC,GAAW,EACQ,UAAVyC,IACTxC,GAAU,QAGVqC,IACFtC,EAAWC,GAAU,QAEhBqC,OAA8BA,GAAkCE,IAAQ5C,IAE7EE,EAAO6C,KAAK,CAAEC,KAAMN,EAAMO,MAAOjD,EAAc4C,MAAKC,cAElDH,OAAiCA,GACnC1C,EAAe4C,EAAM,EACrB/C,MAEAG,EAAe4C,EACf/C,EAAQ8C,GAIZ,SAASnB,SACHrB,GAEFqC,OAIJ,SAASf,IACHrB,GAAYC,OACVF,GACFN,KACAG,EAAeC,EAAQ,GAEvBJ,IAICM,OAAoBA,QAAsBA,OAAoBA,OAEjEN,IACAG,EAAeC,QACNE,GAETN,KACAG,EAAeC,EAAQ,QACdE,EAETqC,UACSrC,GAETN,IACAG,EAAeC,QACNE,GAGTH,EAAeC,EACfuC,SAIA3C,IAIJ,SAAS6B,IACHL,IAEFmB,YACSrC,GAETqC,KACAA,WACSrC,GAETqC,OAIJ,SAASb,SACHxB,GAEFqC,KACAA,WACSrC,EAETqC,YACSrC,GAETqC,KACAA,SAAiC,EAAQvC,EAAQ,SACxCE,EAETqC,YACSrC,EAETqC,OACUnB,KAEVmB,OAIJ,SAASZ,SACHzB,GAEFqC,KACAA,WACSrC,EAETqC,YACSrC,GAETqC,KACAA,MAAqDvC,EAAQ,IACpDoB,KAETmB,OAIJ,SAASX,SACH1B,GAEFqC,MAAqDvC,EAAQ,GAIjE,SAAS6B,SACH3B,GAEFqC,MAAqDvC,EAAQ,GAIjE,SAAS8B,SACH5B,EAEFqC,MAGAA,OACAb,KAIJ,SAASK,IACP,OAAQ7B,GACN,QACEN,KACA,MACF,SACA,QACEA,IACA,MACF,QACE2C,SAKN,SAASP,KACP3B,EAASL,EAAQD,KACFkB,EAAQD,OAEjBI,IACFmB,OAEAD,SAEOpC,GAETqC,SAA6B,EAAQxC,EAAe,GACpDwC,KACAA,MACStB,EAAQT,MAAMH,KAAYH,GAAQe,EAAQH,MAAMT,KAAYH,GAErEqC,OAAmDxC,EAAe,GAItE,SAASkC,SACH/B,EAEFqC,OAAoDvC,EAAQ,GAE5DuC,OAAmDxC,EAAe,GAItE,SAASmC,SACHhC,GAEFqC,QAIJ,SAASJ,SACHjC,IAEFqC,KACAA,MAIJ,SAASH,IAEQ,KADf/B,EAASL,EAAQD,QAEXG,EAEFqC,UACSrC,EAETqC,SAA6B,EAAQxC,EAAe,GAGpDH,UAEOM,IAETN,MAIJ,SAASyC,IACPhC,EAASL,EAAQD,EACbK,OACEF,GACFH,GAAgB,EAChBwC,QACSlC,EAASa,EAAMF,OACpBE,EAAMV,MAAMH,KAAYH,GAAQgB,EAAMJ,MAAMT,KAAYH,IAC1DH,GAAgB,EAChBH,UAEOM,EACTqC,KACUnB,MACVrB,GAAgB,EAChBH,KAEOO,OACLD,GACFH,GAAgB,EAChBwC,QACSlC,EAASc,EAAOH,OACrBG,EAAOX,MAAMH,KAAYH,GAAQiB,EAAOL,MAAMT,KAAYH,IAC5DH,GAAgB,EAChBH,UAEOM,EACTqC,KACUnB,MACVrB,GAAgB,EAChBH,UAEOM,GAETqC,KAIJ,SAASD,IACP,MAAM,IAAIW,YACR,qBAAqBpD,EAAOqD,OAAOlD,WAAcA,iBAAoBJ,sNCtezE,SAASuD,EAAaC,EAAcR,GAClC,OAAOQ,EAAK1C,MAAM,KAAK2C,QAAO,SAACC,EAAKC,GAElC,OADAD,EAAIC,GAAOX,EACJU,IACNE,OAAOC,OAAO,OAGZ,ICWHzD,EACA0D,EACAzD,EACA0D,EACAC,EACAC,EACAC,EACAjE,EACAkE,EACAC,EDpBSC,EAAgBd,EAC3B,wFACA,GAGWe,EAAef,EAAgB,6BAA6B,GELzE,SAASgB,EAAML,EAAaM,EAA2BpE,EAAeqE,GAEpE,GADAA,EAAQC,OAASD,EAAQC,MAAMR,EAAMM,EAAQpE,GACzC8D,EAAKf,OAASpD,aAAW4E,KAAOC,MAAMC,QAAQX,EAAKY,MACrD,IAAK,IAAIC,EAAI,EAAGA,EAAIb,EAAKY,KAAK1D,OAAQ2D,IACpCR,EAAML,EAAKY,KAAKC,GAAIb,EAAMa,EAAGN,GAGjCA,EAAQO,OAASP,EAAQO,MAAMd,EAAMM,EAAQpE,YAG/B6E,EAAKC,EAAcT,GACjC,IAAK,IAAIM,EAAI,EAAGA,EAAIG,EAAI9D,OAAQ2D,IAC9BR,EAAMW,EAAIH,QAAI,EAAQA,EAAGN,GDU7B,SAAShD,EAAKd,EAAgB8D,QACd,IAAV9D,GACFmD,EAAQ,EACRzD,EAAOe,OAAS,EAChBnB,EAAS,KAETI,EAASqB,EAASf,GAClBmD,EAAQzD,EAAOe,OACfnB,EAASU,GAEXP,EAAQ,EACR2D,OAAW,EACXC,EAAQ,GACRC,OAAQ,EACRC,OAAO,EACPC,OAAQ,EACRC,EAAeK,EAGjB,SAASU,EAASC,GACXrB,EAGHqB,EAAMjC,OAASpD,aAAW4E,KAC1BS,EAAMC,OAAStB,EAASuB,IAAID,MAC5Bf,EAAac,EAAMC,OAEnBtB,EAAWA,EAASS,OACpBW,EAASC,IACArB,EAASuB,IAAIR,OACtBf,EAASuB,IAAIvC,IAAMqC,EAAMrC,IACzBgB,EAASuB,IAAIR,KAAK5B,KAAKkC,IAVvBpB,EAAMd,KAAKkC,GAcf,SAASG,GAAaD,GACpBvB,EAAW,CAAES,OAAQT,EAAUuB,IAAKA,GACpCpB,OAAO,EAGT,SAASsB,GAAcpC,EAAqBL,EAAiBC,GAC3D,oBADqBI,EAAQa,EAAMb,oBAAOL,EAAMkB,EAAMlB,kBAAKC,EAAQiB,EAAMjB,OAClE,CAAEI,QAAOL,MAAKC,QAAOG,KAAMpD,aAAW0F,MAkB/C,SAASC,KACP,MAAO,CACLtC,MAAOa,EAAMb,MACbL,IAAKkB,EAAMlB,IACXsC,KAAMG,KACNxC,WAAO,GAqBX,SAAS2C,GAAcP,gBAAAA,EAAiClB,GACtDkB,EAAMpC,OAASiB,EAAMjB,MACrBoC,EAAMrC,IAAMkB,EAAMlB,IAGpB,SAASL,UACO,IAAVyB,IACFA,EAAsBlE,EExHXa,MAAM,MAAM2C,QACvB,SAACmC,EAAKC,GAEJ,OADAD,EAAI1C,KAAK2C,EAAKzE,OAAS,EAAIwE,EAAIA,EAAIxE,OAAS,IACrCwE,IAET,CAAC,KFqHG,IAAAE,yRAAAC,UEjHoBC,EAAkBvF,GAG5C,IAFA,IAAIoF,EAAOI,IACPC,EAASD,IACJlB,EAAI,EAAGA,EAAIiB,EAAO5E,OAAQ2D,IACjC,GAAIiB,EAAOjB,GAAKtE,EAAQ,CACtBoF,EAAOd,EACPmB,EAASzF,EAASuF,EAAOjB,EAAI,GAAK,EAClC,MAGJ,MAAO,CAACc,EAAMK,GFuGSC,CAAYhC,EAAOF,EAAMb,UAAzCyC,OAAMK,OACb,MAAM,IAAIE,MACR,qBAAqBnC,EAAMjB,UAASiB,EAAMd,eAAc0C,MAAQK,OAC7DnC,EAAW,sBAAsBsC,KAAKC,UAAUvC,EAASuB,IAAID,UAAW,KAI/E,SAASkB,GAAkBjB,WACzBA,EAAIkB,aAAe,OACnB,IAAmB,IAAAC,2SAAAC,CAAApB,EAAIqB,0CAAY,CAA9B,IAAMC,UACTtB,EAAIkB,aAAaI,EAAKvB,KAAKrC,OAAS4D,qGAYxC,SAASC,KACP,IAAI7G,IAEA4G,OAAmB,EAEjBtB,EA5EC,CACLlC,MAAOa,EAAMb,MAAQ,EACrBL,IAAKkB,EAAMlB,IACXI,KAAMpD,aAAW4E,IACjBmC,KAAMtB,GAAcvB,EAAMb,MAAQ,GAClCiC,KAAMpB,EAAMjB,MACZ+D,QAAS9G,EAAOgD,UAAUgB,EAAMb,MAAOa,EAAMlB,KAC7C4D,WAAY,GACZH,kBAAc,EACd1B,KAAM,KACNkC,MAAO,MAoET,GADA7B,EAASG,GACQ,KAAbA,EAAID,MAA4B,MAAbC,EAAID,MAA6B,QAAbC,EAAID,KAAgB,CAE7D,GADAC,EAAIwB,KAAK9D,MAAQ,IAAMsC,EAAIwB,KAAK9D,MAC5B5C,IAAU0D,EACZ,OAGA,QADAG,EAAQ5D,IAASD,IACP+C,KAGR,IAFAe,EAAOsB,KACPF,EAAIR,KAAO,CAACZ,KACH9D,EAAQ0D,GAAO,CAEtB,QADAG,EAAQ5D,EAAOD,IACL+C,KAA+B,CACvCe,OAAO,EACP,MAEFyB,KAMN,OAHEL,EAAI0B,MAAQxB,GAAcvB,EAAMb,MAAOa,EAAMlB,IAAM,EAAMkB,EAAMjB,gBAC/DsC,EAAIvC,IAAMuC,EAAI0B,MAAMjE,KAIxB,OAAS3C,EAAQ0D,GAAO,CAEtB,QADAG,EAAQ5D,EAAOD,IACL+C,KAA+B,CACvCmC,EAAIvC,IAAMuC,EAAIwB,KAAK/D,IAAMkB,EAAMlB,IAAM,EACrCuC,EAAIwB,KAAK9D,MAAQ/C,EAAOgD,UAAUqC,EAAIwB,KAAK1D,MAAOkC,EAAIwB,KAAK/D,KACvC,KAAhBkB,EAAMjB,OAAiBqB,EAAciB,EAAID,MAI3CC,EAAIR,UAAO,GAHXQ,EAAIR,KAAO,GACXS,GAAaD,IAIf,UACStF,MACLiE,EAAMd,OACRyD,EAAOlB,KACP1F,IACAsF,EAAIqB,WAAWzD,KAAK0D,QAEb5G,MACLiE,EAAMd,KACRnD,QACSiE,EAAMd,KACfnD,IAEA2F,GAAciB,EAAKvB,UAEZrF,MACLiE,EAAMd,WACJc,EAAMd,KACRnD,KAEA4G,EAAOlB,KACP1F,IACAsF,EAAIqB,WAAWzD,KAAK0D,SAGf5G,MACLiE,EAAMd,OACRyD,EAAK5D,MAnHJ,CACLI,MAAOa,EAAMb,MACbL,IAAKkB,EAAMlB,IACXC,UACEiB,EAAMd,KACFc,EAAMjB,MACNiB,EAAMjB,MAAMiE,OAAO,EAAGhD,EAAMjB,MAAM5B,OAAS,GACjD8F,UACEjD,EAAMd,UACF,MACAc,EAAMd,KACN,IACA,SAwGEc,EAAMd,KACRnD,KAEA4G,EAAK7D,IAAM6D,EAAK5D,MAAMD,IACtB/C,UAIAiE,EAAMd,MACRyD,EAAK7D,IAAM6D,EAAK5D,MAAOD,IACvB/C,KAEA2F,GAAciB,EAAK5D,QAM3B,SAASmE,KAEP,IADA,IAAIC,EAAWrD,EAERqD,GAAYnD,EAAMjB,MAAMqE,SAAWD,EAAS9B,IAAID,MAGrD+B,EAAWA,EAAS5C,OAEjB4C,IAGLA,EAAS9B,IAAI0B,MAAQxB,GACnBvB,EAAMb,MAAQ,EACda,EAAMlB,IAAM,EACZ9C,EAAOgD,UAAUgB,EAAMb,MAAQ,EAAGa,EAAMlB,IAAM,IAEhDqE,EAAS9B,IAAIvC,IAAMqE,EAAS9B,IAAI0B,MAAMjE,IACtCqE,EAAWA,EAAS5C,OACpBT,EAAWqD,YAGGE,GAAM3G,EAAe8D,GAKnC,IAJAhD,EAAKd,EAAO4G,GACVC,iBAAiB,GACd/C,IAEErE,EAAQ0D,GAAO,CAEpB,QADAG,EAAQ5D,EAAOD,IACD+C,MACZ,OACOe,EAIHyB,GAAczB,GAFdiB,EADAjB,EAAOsB,MAKT,MACF,OACEtB,OAAO,EACP2C,KACA,MACF,OACE3C,OAAO,EACPiD,KACA,MACF,QACEzE,KAGJtC,IAEF,IAAMqH,EAASzD,EAWf,OAVII,MAAAA,SAAAA,EAAcoD,kBAChBvC,EAAKwC,EAAQ,CACX/C,MAAA,SAAMR,GACAA,EAAKf,OAASpD,aAAW4E,KAC3B4B,GAAkBrC,MAK1BzC,IACOgG,MGhSIC,GAA0C,CACrDC,YAAa,CACX,IACA,OACA,UACA,OACA,UACA,QACA,IACA,MACA,MACA,MACA,aACA,KACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,KACA,MACA,MACA,MACA,KACA,KACA,KACA,aACA,SACA,SACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,KACA,IACA,MACA,MACA,MACA,KACA,OACA,MACA,KACA,IACA,UACA,MACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,QACA,OACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,QACA,KACA,QACA,OACA,KACA,IACA,KACA,MACA,OAEFC,aAAc,CAAC,SACfC,gBAAiB,CACfC,EAAG,CAAC,OAAQ,UACZC,IAAK,CAAC,OACNC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,KAAM,CAAC,YACPC,SAAU,CAAC,QACXC,IAAK,CAAC,SAERC,WAAY,+DAmBd,SAAS/B,GACPpB,EACAoD,EACA3H,GAEA,OAAOuE,EACJnE,KAAI,SAACmD,GACJ,GAAIA,EAAKf,OAASpD,aAAW0F,KAC3B,OAAOvB,EAAKlB,MAEd,IAA+C,IAA3CsF,EAAOX,YAAYY,QAAQrE,EAAKmB,MAClC,MAAO,GAET,GAAIhB,EAAcH,EAAKmB,OACrB,QAAkB,IAAdnB,EAAKY,KACP,MAAM,IAAIsB,MACR,oBAAoBlC,EAAKmB,oCAI7B,IAAKnB,EAAKY,OAASZ,EAAK8C,MACtB,MAAM,IAAIZ,MAAM,QAAQlC,EAAKmB,qCAGjC,IAAMmD,EAAQtE,EAAKyC,WAChB8B,QAAO,SAACX,SACP,OACEQ,EAAOV,aAAaW,QAAQT,EAAEzC,KAAKrC,QAAU,cAC7CsF,EAAOT,gBAAgB3D,EAAKmB,4BAAOkD,QAAQT,EAAEzC,KAAKrC,SAAU,MAEvD8E,EAAE9E,QAGc,QAAjB8E,EAAEzC,KAAKrC,OAAoC,SAAjB8E,EAAEzC,KAAKrC,SAGjCsF,EAAOD,WAAWK,KAAKZ,EAAE9E,MAAMA,YAOtCjC,KAAI,SAAC+G,GAAM,OAAAnH,EAAMsC,UAAU6E,EAAE1E,MAAO0E,EAAE/E,QACtC4F,KAAK,KACFC,EAAO,IAAM1E,EAAK6C,SAAWyB,EAAQ,IAAMA,EAAQ,IAAM,IAC/D,OAAKtE,EAAKY,KAGH8D,EAAOtC,GAAUpC,EAAKY,KAAMwD,EAAQ3H,GAAS,KAAKuD,EAAK6C,YAFrD6B,KAIVD,KAAK,mCAlERhI,EACA8D,gBAAAA,MAEA,IAAM6D,WACDZ,IACAjD,IACHoD,uBACKH,GAAuBG,iBACvBpD,EAAQoD,mBAIf,OAAOvB,GADKgB,GAAM3G,GACI2H,EAAQ3H"} |
| /*! | ||
| * | ||
| * 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. |
+26
-28
| { | ||
| "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 | ||
| [](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. | ||
| ``` |
+1
-8
@@ -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; |
+5
-7
@@ -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'; |
+6
-46
@@ -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 @@ ]; |
+5
-18
@@ -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), |
+50
-60
@@ -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}`, | ||
| ); | ||
| } |
+1
-34
@@ -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; |
+5
-10
@@ -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'; |
-20
| "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[]; |
-295
| "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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"} |
-291
| /*! | ||
| * | ||
| * 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":"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"} |
| 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; |
-155
| "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":";AAAA;;;GAGG;;;;AAEH,mCAAyC;AACzC,iCAAgC;AAChC,iCAA4C;AAS/B,QAAA,sBAAsB,GAAoB;IACrD,WAAW,EAAE;QACX,GAAG;QACH,MAAM;QACN,SAAS;QACT,MAAM;QACN,SAAS;QACT,OAAO;QACP,GAAG;QACH,KAAK;QACL,KAAK;QACL,KAAK;QACL,YAAY;QACZ,IAAI;QACJ,QAAQ;QACR,SAAS;QACT,MAAM;QACN,MAAM;QACN,KAAK;QACL,UAAU;QACV,MAAM;QACN,IAAI;QACJ,KAAK;QACL,KAAK;QACL,KAAK;QACL,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,QAAQ;QACR,IAAI;QACJ,GAAG;QACH,KAAK;QACL,KAAK;QACL,KAAK;QACL,IAAI;QACJ,MAAM;QACN,KAAK;QACL,IAAI;QACJ,GAAG;QACH,SAAS;QACT,KAAK;QACL,GAAG;QACH,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,GAAG;QACH,MAAM;QACN,SAAS;QACT,OAAO;QACP,MAAM;QACN,QAAQ;QACR,KAAK;QACL,SAAS;QACT,KAAK;QACL,OAAO;QACP,OAAO;QACP,IAAI;QACJ,OAAO;QACP,IAAI;QACJ,OAAO;QACP,MAAM;QACN,IAAI;QACJ,GAAG;QACH,IAAI;QACJ,KAAK;QACL,KAAK;KACN;IACD,YAAY,EAAE,CAAC,OAAO,CAAC;IACvB,eAAe,EAAE;QACf,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QACrB,GAAG,EAAE,CAAC,KAAK,CAAC;QACZ,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC1B,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC1B,IAAI,EAAE,CAAC,UAAU,CAAC;QAClB,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,GAAG,EAAE,CAAC,MAAM,CAAC;KACd;IACD,UAAU,EAAE,6DAA6D;CAC1E,CAAC;AAEF,SAAgB,QAAQ,CACtB,KAAa,EACb,OAAsC;IAAtC,wBAAA,EAAA,YAAsC;IAEtC,IAAM,MAAM,0DACP,8BAAsB,GACtB,OAAO,KACV,eAAe,wCACV,8BAAsB,CAAC,eAAe,GACtC,OAAO,CAAC,eAAe,IAE7B,CAAC;IACF,IAAM,GAAG,GAAG,aAAK,CAAC,KAAK,CAAC,CAAC;IACzB,OAAO,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAdD,4BAcC;AAED,SAAS,SAAS,CAChB,GAAY,EACZ,MAAuB,EACvB,KAAa;IAEb,OAAO,GAAG;SACP,GAAG,CAAC,UAAC,IAAI;QACR,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAU,CAAC,IAAI,EAAE;YACjC,OAAO,IAAI,CAAC,KAAK,CAAC;SACnB;QACD,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAChD,OAAO,EAAE,CAAC;SACX;QACD,IAAI,sBAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE;gBACxB,MAAM,IAAI,KAAK,CACb,uBAAoB,IAAI,CAAC,IAAI,4BAAwB,CACtD,CAAC;aACH;SACF;aAAM;YACL,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBAC7B,MAAM,IAAI,KAAK,CAAC,WAAQ,IAAI,CAAC,IAAI,kCAA8B,CAAC,CAAC;aAClE;SACF;QACD,IAAM,KAAK,GAAG,IAAI,CAAC,UAAU;aAC1B,MAAM,CAAC,UAAC,CAAC;;YACR,IACE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9C,OAAA,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,0CAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAI,CAAC,CAAC,EAC7D;gBACA,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;oBACZ,OAAO,IAAI,CAAC;iBACb;gBACD,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE;oBACrD,OAAO,IAAI,CAAC;iBACb;gBACD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;oBACzC,OAAO,IAAI,CAAC;iBACb;gBACD,OAAO,KAAK,CAAC;aACd;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;aACD,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAA/B,CAA+B,CAAC;aAC3C,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,IAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,IAAI,CAAC;SACb;QACD,OAAO,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,IAAG,OAAK,IAAI,CAAC,OAAO,MAAG,CAAA,CAAC;IAC3E,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"} |
-151
| /* | ||
| * @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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"} |
| export {}; |
| "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"} |
| export {}; |
| "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"} |
| export {}; |
| "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[]; |
-510
| "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":"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"} |
-506
| /*! | ||
| * | ||
| * 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; |
-18
| "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]; |
-74
| "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; |
-29
| "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"} |
-25
| /*! | ||
| * | ||
| * 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"} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
325
51.16%4
-42.86%259322
-4.03%19
46.15%31
-64.37%3929
-28.43%2
Infinity%Updated