tag
- rewriter.on('text', (_, raw) => {
- // Use raw representation of text without HTML entities decoding
- rewriter.emitRaw(`${raw}`);
- });
-
- http.get('http://google.com', res => {
- // Assumes response is UTF-8.
- res.setEncoding('utf8');
- // RewritingStream is the Transform stream, which means you can pipe
- // through it.
- res.pipe(rewriter).pipe(file);
- });
-```
-
-### Constructors
-
-* [constructor](#constructor)
-
-### Methods
-
-* [emitStartTag](#emit_start_tag)
-* [emitEndTag](#emit_end_tag)
-* [emitText](#emit_text)
-* [emitComment](#emit_comment)
-* [emitDoctype](#emit_doctype)
-* [emitRaw](#emit_raw)
-
-See also: [transform stream API](https://nodejs.org/api/stream.html#stream_class_stream_transform).
-
-### Events
-
-* [on("startTag")](#on_startag)
-* [on("endTag")](#on_startag)
-* [on("comment")](#on_comment)
-* [on("text")](#on_text)
-* [on("doctype")](#on_doctype)
-
-See also: [transform stream API](https://nodejs.org/api/stream.html#stream_class_stream_transform).
-
----
-
-## Constructors
-
-
-
-### constructor
-
-⊕ **new RewritingStream**(): [RewritingStream]()
-
-**Note:** [sourceCodeLocationInfo](../../parse5-sax-parser/docs/sax-parser-options.md#locationinfo) option is
-always enabled for the [RewritingStream]().
-
-**Returns:** [RewritingStream]()
-
-___
-
-
-## Methods
-
-
-
-### emitStartTag
-
-▸ **emitStartTag**(startTag: *[StartTagToken](../../parse5-sax-parser/docs/tokens/start-tag.md)*): `void`
-
-Emits serialized start tag token into the output stream.
-
-**Returns:** `void`
-
-___
-
-
-### emitEndTag
-
-▸ **emitEndTag**(endTag: *[EndTagToken](../../parse5-sax-parser/docs/tokens/end-tag.md)*): `void`
-
-Emits serialized end tag token into the output stream.
-
-**Returns:** `void`
-
-___
-
-
-### emitText
-
-▸ **emitText**(text: *[TextToken](../../parse5-sax-parser/docs/tokens/text.md)*): `void`
-
-Emits serialized text token into the output stream.
-
-**Returns:** `void`
-
-___
-
-
-### emitComment
-
-▸ **emitComment**(comment: *[CommentToken](../../parse5-sax-parser/docs/tokens/comment.md)*): `void`
-
-Emits serialized comment token into the output stream.
-
-**Returns:** `void`
-
-___
-
-
-### emitDoctype
-
-▸ **emitDoctype**(doctype: *[DoctypeToken](../../parse5-sax-parser/docs/tokens/doctype.md)*): `void`
-
-Emits serialized document type token into the output stream.
-
-**Returns:** `void`
-
-___
-
-
-### emitRaw
-
-▸ **emitRaw**(html: *String*): `void`
-
-Emits raw HTML string into the output stream.
-
-**Returns:** `void`
-
-___
-
-## Events
-
-**Note:** Each event listener receives raw HTML string representation of a token as its second
-argument, which later can be emitted with the [emitRaw](#emit_raw) method. Thus, token will not be
-re-serialized and will have the same markup as in the source HTML.
-
-**Note:** If an event has an event handler attached, you need to emit token manually, otherwise
-it will not get into the output stream.
-
-
-
-### on("startTag")
-
-▸ **on**(event: *"startTag"*, listener: *`function`*): `this`
-
-Raised when the rewriter encounters a start tag.
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "startTag" |
-| listener | function (startTag: *[StartTagToken](../../parse5-sax-parser/docs/tokens/start-tag.md)*, rawHtml: *String*) |
-
-**Returns:** `this`
-
-___
-
-
-### on("endTag")
-
-▸ **on**(event: *"endTag"*, listener: *`function`*): `this`
-
-Raised when rewriter encounters an end tag.
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "endTag" |
-| listener | function (endTag: *[EndTagToken](../../parse5-sax-parser/docs/tokens/end-tag.md)*, rawHtml: *String*) |
-
-**Returns:** `this`
-
-___
-
-
-### on("comment")
-
-▸ **on**(event: *"comment"*, listener: *`function`*): `this`
-
-Raised when rewriter encounters a comment.
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "comment" |
-| listener | function (comment: *[CommentToken](../../parse5-sax-parser/docs/tokens/comment.md)*, rawHtml: *String*) |
-
-**Returns:** `this`
-
-___
-
-
-### on("text")
-
-▸ **on**(event: *"text"*, listener: *`function`*): `this`
-
-Raised when rewriter encounters text content.
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "text" |
-| listener | function (text: *[TextToken](../../parse5-sax-parser/docs/tokens/text.md)*, rawHtml: *String*)|
-
-**Returns:** `this`
-
-___
-
-
-### on("doctype")
-
-▸ **on**(event: *"doctype"*, listener: *`function`*): `this`
-
-Raised when rewriter encounters a [document type declaration](https://en.wikipedia.org/wiki/Document_type_declaration).
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "doctype" |
-| listener | function (doctype: *[DoctypeToken](../../parse5-sax-parser/docs/tokens/doctype.md)*, rawHtml: *String*) |
-
-**Returns:** `this`
-
-___
diff --git a/packages/parse5-html-rewriting-stream/lib/index.js b/packages/parse5-html-rewriting-stream/lib/index.js
deleted file mode 100644
index 2db2bde..0000000
--- a/packages/parse5-html-rewriting-stream/lib/index.js
+++ /dev/null
@@ -1,92 +0,0 @@
-'use strict';
-
-const SAXParser = require('parse5-sax-parser');
-const { escapeString } = require('parse5/lib/serializer');
-
-class RewritingStream extends SAXParser {
- constructor() {
- super({ sourceCodeLocationInfo: true });
-
- this.posTracker = this.locInfoMixin.posTracker;
- }
-
- _transformChunk(chunk) {
- // NOTE: ignore upstream return value as we want to push to
- // the Writable part of Transform stream ourselves.
- super._transformChunk(chunk);
- }
-
- _getRawHtml(location) {
- const droppedBufferSize = this.posTracker.droppedBufferSize;
- const start = location.startOffset - droppedBufferSize;
- const end = location.endOffset - droppedBufferSize;
-
- return this.tokenizer.preprocessor.html.slice(start, end);
- }
-
- // Events
- _handleToken(token) {
- if (!super._handleToken(token)) {
- this.emitRaw(this._getRawHtml(token.location));
- }
-
- // NOTE: don't skip new lines after and other tags,
- // otherwise we'll have incorrect raw data.
- this.parserFeedbackSimulator.skipNextNewLine = false;
- }
-
- // Emitter API
- _emitToken(eventName, token) {
- this.emit(eventName, token, this._getRawHtml(token.sourceCodeLocation));
- }
-
- emitDoctype(token) {
- let res = `';
-
- this.push(res);
- }
-
- emitStartTag(token) {
- let res = `<${token.tagName}`;
-
- const attrs = token.attrs;
-
- for (let i = 0; i < attrs.length; i++) {
- res += ` ${attrs[i].name}="${escapeString(attrs[i].value, true)}"`;
- }
-
- res += token.selfClosing ? '/>' : '>';
-
- this.push(res);
- }
-
- emitEndTag(token) {
- this.push(`${token.tagName}>`);
- }
-
- emitText({ text }) {
- this.push(escapeString(text, false));
- }
-
- emitComment(token) {
- this.push(``);
- }
-
- emitRaw(html) {
- this.push(html);
- }
-}
-
-module.exports = RewritingStream;
diff --git a/packages/parse5-html-rewriting-stream/lib/index.ts b/packages/parse5-html-rewriting-stream/lib/index.ts
new file mode 100644
index 0000000..158e946
--- /dev/null
+++ b/packages/parse5-html-rewriting-stream/lib/index.ts
@@ -0,0 +1,177 @@
+import { html, type Token } from 'parse5';
+import {
+ SAXParser,
+ type EndTag,
+ type StartTag,
+ type Doctype,
+ type Text,
+ type Comment,
+ type SaxToken,
+} from 'parse5-sax-parser';
+import { escapeText, escapeAttribute } from 'entities/lib/escape.js';
+
+/**
+ * Streaming [SAX](https://en.wikipedia.org/wiki/Simple_API_for_XML)-style HTML rewriter.
+ * A [transform stream](https://nodejs.org/api/stream.html#stream_class_stream_transform) (which means you can pipe _through_ it, see example).
+ *
+ * The rewriter uses the raw source representation of tokens if they are not modified by the user. Therefore, the resulting
+ * HTML is not affected by parser error-recovery mechanisms as in a classical parsing-serialization roundtrip.
+ *
+ * @example
+ *
+ * ```js
+ * const RewritingStream = require('parse5-html-rewriting-stream');
+ * const http = require('http');
+ * const fs = require('fs');
+ *
+ * const file = fs.createWriteStream('/home/google.com.html');
+ * const rewriter = new RewritingStream();
+ *
+ * // Replace divs with spans
+ * rewriter.on('startTag', startTag => {
+ * if (startTag.tagName === 'span') {
+ * startTag.tagName = 'div';
+ * }
+ *
+ * rewriter.emitStartTag(startTag);
+ * });
+ *
+ * rewriter.on('endTag', endTag => {
+ * if (endTag.tagName === 'span') {
+ * endTag.tagName = 'div';
+ * }
+ *
+ * rewriter.emitEndTag(endTag);
+ * });
+ *
+ * // Wrap all text nodes with an tag
+ * rewriter.on('text', (_, raw) => {
+ * // Use the raw representation of text without HTML entities decoding
+ * rewriter.emitRaw(`${raw}`);
+ * });
+ *
+ * http.get('http://google.com', res => {
+ * // Assumes response is UTF-8.
+ * res.setEncoding('utf8');
+ * // `RewritingStream` is a `Transform` stream, which means you can pipe
+ * // through it.
+ * res.pipe(rewriter).pipe(file);
+ * });
+ * ```
+ */
+export class RewritingStream extends SAXParser {
+ /** Note: `sourceCodeLocationInfo` is always enabled. */
+ constructor() {
+ super({ sourceCodeLocationInfo: true });
+ }
+
+ override _transformChunk(chunk: string): string {
+ // NOTE: ignore upstream return values as we want to push to
+ // the `Writable` part of the `Transform` stream ourselves.
+ super._transformChunk(chunk);
+ return '';
+ }
+
+ private _getRawHtml(location: Token.Location): string {
+ const { droppedBufferSize, html } = this.tokenizer.preprocessor;
+ const start = location.startOffset - droppedBufferSize;
+ const end = location.endOffset - droppedBufferSize;
+
+ return html.slice(start, end);
+ }
+
+ // Events
+ protected override emitIfListenerExists(eventName: string, token: SaxToken): boolean {
+ if (!super.emitIfListenerExists(eventName, token)) {
+ this.emitRaw(this._getRawHtml(token.sourceCodeLocation!));
+ }
+
+ // NOTE: don't skip new lines after `` and other tags,
+ // otherwise we'll have incorrect raw data.
+ this.parserFeedbackSimulator.skipNextNewLine = false;
+ return true;
+ }
+
+ // Emitter API
+ protected override _emitToken(eventName: string, token: SaxToken): void {
+ this.emit(eventName, token, this._getRawHtml(token.sourceCodeLocation!));
+ }
+
+ /** Emits a serialized document type token into the output stream. */
+ public emitDoctype(token: Doctype): void {
+ let res = `';
+
+ this.push(res);
+ }
+
+ /** Emits a serialized start tag token into the output stream. */
+ public emitStartTag(token: StartTag): void {
+ let res = `<${token.tagName}`;
+
+ for (const attr of token.attrs) {
+ res += ` ${attr.name}="${escapeAttribute(attr.value)}"`;
+ }
+
+ res += token.selfClosing ? '/>' : '>';
+
+ this.push(res);
+ }
+
+ /** Emits a serialized end tag token into the output stream. */
+ public emitEndTag(token: EndTag): void {
+ this.push(`${token.tagName}>`);
+ }
+
+ /** Emits a serialized text token into the output stream. */
+ public emitText({ text }: Text): void {
+ this.push(
+ !this.parserFeedbackSimulator.inForeignContent &&
+ html.hasUnescapedText(this.tokenizer.lastStartTagName, true)
+ ? text
+ : escapeText(text)
+ );
+ }
+
+ /** Emits a serialized comment token into the output stream. */
+ public emitComment(token: Comment): void {
+ this.push(``);
+ }
+
+ /** Emits a raw HTML string into the output stream. */
+ public emitRaw(html: string): void {
+ this.push(html);
+ }
+}
+
+export interface RewritingStream {
+ /** Raised when the rewriter encounters a start tag. */
+ on(event: 'startTag', listener: (startTag: StartTag, rawHtml: string) => void): this;
+ /** Raised when rewriter encounters an end tag. */
+ on(event: 'endTag', listener: (endTag: EndTag, rawHtml: string) => void): this;
+ /** Raised when rewriter encounters a comment. */
+ on(event: 'comment', listener: (comment: Comment, rawHtml: string) => void): this;
+ /** Raised when rewriter encounters text content. */
+ on(event: 'text', listener: (text: Text, rawHtml: string) => void): this;
+ /** Raised when rewriter encounters a [document type declaration](https://en.wikipedia.org/wiki/Document_type_declaration). */
+ on(event: 'doctype', listener: (doctype: Doctype, rawHtml: string) => void): this;
+
+ /**
+ * Base event handler.
+ *
+ * @param event Name of the event
+ * @param handler Event handler
+ */
+ on(event: string, handler: (...args: any[]) => void): this;
+}
diff --git a/packages/parse5-html-rewriting-stream/package.json b/packages/parse5-html-rewriting-stream/package.json
index e4bf660..4f0997b 100644
--- a/packages/parse5-html-rewriting-stream/package.json
+++ b/packages/parse5-html-rewriting-stream/package.json
@@ -1,10 +1,12 @@
{
"name": "parse5-html-rewriting-stream",
+ "type": "module",
"description": "Streaming HTML rewriter.",
- "version": "6.0.1",
+ "version": "7.0.0",
"author": "Ivan Nikulin (https://github.com/inikulin)",
"contributors": "https://github.com/inikulin/parse5/graphs/contributors",
"homepage": "https://github.com/inikulin/parse5",
+ "funding": "https://github.com/inikulin/parse5?sponsor=1",
"keywords": [
"parse5",
"parser",
@@ -15,16 +17,21 @@
"HTML"
],
"license": "MIT",
- "main": "./lib/index.js",
+ "main": "dist/index.js",
+ "module": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "exports": "./dist/index.js",
"dependencies": {
- "parse5": "^6.0.1",
- "parse5-sax-parser": "^6.0.1"
+ "entities": "^4.3.0",
+ "parse5": "^7.0.0",
+ "parse5-sax-parser": "^7.0.0"
},
"repository": {
"type": "git",
"url": "git://github.com/inikulin/parse5.git"
},
"files": [
- "lib"
+ "dist",
+ "!*.map"
]
}
diff --git a/packages/parse5-html-rewriting-stream/test/rewriting-stream.test.js b/packages/parse5-html-rewriting-stream/test/rewriting-stream.test.js
deleted file mode 100644
index 2bd2745..0000000
--- a/packages/parse5-html-rewriting-stream/test/rewriting-stream.test.js
+++ /dev/null
@@ -1,272 +0,0 @@
-'use strict';
-
-const assert = require('assert');
-const dedent = require('dedent');
-const RewritingStream = require('../lib');
-const loadSAXParserTestData = require('../../../test/utils/load-sax-parser-test-data');
-const { getStringDiffMsg, writeChunkedToStream, WritableStreamStub } = require('../../../test/utils/common');
-
-const srcHtml = dedent`
-
-
-
-
-
-
-
- Hey ya
-
-
-`;
-
-function createRewriterTest({ src, expected, assignTokenHandlers = () => {} }) {
- return done => {
- const rewriter = new RewritingStream();
- const writable = new WritableStreamStub();
-
- writable.once('finish', () => {
- assert.ok(writable.writtenData === expected, getStringDiffMsg(writable.writtenData, expected));
- done();
- });
-
- rewriter.pipe(writable);
-
- assignTokenHandlers(rewriter);
- writeChunkedToStream(src, rewriter);
- };
-}
-
-// Raw data tests
-loadSAXParserTestData().forEach(
- // NOTE: if we don't have any event handlers assigned, stream should use raw
- // data for the serialization, so serialized content should identical to the original.
- (test, idx) =>
- (exports[`RewritingStream - Raw token serialization - ${idx + 1}.${test.name}`] = createRewriterTest({
- src: test.src,
- expected: test.src
- }))
-);
-
-exports['RewritingStream - rewrite start tags'] = createRewriterTest({
- src: srcHtml,
- expected: dedent`
-
-
-
-
-
-
-
- Hey ya
-
-
- `,
- assignTokenHandlers: rewriter => {
- rewriter.on('startTag', token => {
- if (token.tagName === 'head') {
- token.tagName = 'body';
- } else if (token.tagName === 'body') {
- token.tagName = 'head';
- }
-
- rewriter.emitStartTag(token);
- });
- }
-});
-
-exports['RewritingStream - rewrite end tags'] = createRewriterTest({
- src: srcHtml,
- expected: dedent`
-
-
-
-
-
-
-
- Hey ya
-
-
- `,
- assignTokenHandlers: rewriter => {
- rewriter.on('endTag', token => {
- token.tagName = 'rewritten';
-
- rewriter.emitEndTag(token);
- });
- }
-});
-
-exports['RewritingStream - rewrite text'] = createRewriterTest({
- src: srcHtml,
- expected: dedent`
-
-
-
-
-
-
-
-
42
-
-
- `,
- assignTokenHandlers: rewriter => {
- rewriter.on('text', token => {
- if (token.text.trim().length > 0) {
- token.text = '42';
- }
-
- rewriter.emitText(token);
- });
- }
-});
-
-exports['RewritingStream - rewrite comment'] = createRewriterTest({
- src: srcHtml,
- expected: dedent`
-
-
-
-
-
-
-
-
Hey ya
-
-
- `,
- assignTokenHandlers: rewriter => {
- rewriter.on('comment', token => {
- token.text = '42';
-
- rewriter.emitComment(token);
- });
- }
-});
-
-exports['RewritingStream - rewrite doctype'] = createRewriterTest({
- src: srcHtml,
- expected: dedent`
-
-
-
-
-
-
-
-
Hey ya
-
-
- `,
- assignTokenHandlers: rewriter => {
- rewriter.on('doctype', token => {
- token.publicId = '42';
- token.systemId = 'hey';
-
- rewriter.emitDoctype(token);
- });
- }
-});
-
-exports['RewritingStream - emit multiple'] = createRewriterTest({
- src: srcHtml,
- expected: dedent`
-
-
-
-
-
-
-
-
Hey ya
-
-
- `,
- assignTokenHandlers: rewriter => {
- rewriter.on('startTag', token => {
- rewriter.emitRaw('');
- rewriter.emitStartTag(token);
- rewriter.emitRaw('');
- });
- }
-});
-
-exports['RewritingStream - rewrite raw'] = createRewriterTest({
- src: srcHtml,
- expected: dedent`
- 42
- 42
- 42
- 42
- 42
- 42
- 42
- 42Hey ya
42
- 42
- 42
- `,
- assignTokenHandlers: rewriter => {
- const rewriteRaw = (_, raw) => {
- rewriter.emitRaw(raw + '42');
- };
-
- rewriter
- .on('doctype', rewriteRaw)
- .on('startTag', rewriteRaw)
- .on('endTag', rewriteRaw)
- .on('comment', rewriteRaw);
- }
-});
-
-exports['RewritingStream - Should escape entities in attributes and text'] = createRewriterTest({
- src: dedent`
-
-
-
-
-
- foo&bar
-
-
- `,
- expected: dedent`
-
-
-
-
-
- foo&bar
-
-
- `,
- assignTokenHandlers: rewriter => {
- rewriter.on('startTag', token => rewriter.emitStartTag(token));
- rewriter.on('text', token => rewriter.emitText(token));
- }
-});
-
-exports['Regression - RewritingStream - Last text chunk must be flushed (GH-271)'] = done => {
- const parser = new RewritingStream();
- let foundText = false;
-
- parser.on('text', ({ text }) => {
- foundText = true;
- assert.strictEqual(text, 'text');
- });
-
- parser.once('finish', () => {
- assert.ok(foundText);
- done();
- });
-
- parser.write('text');
- parser.end();
-};
-
-exports['Regression - RewritingStream - Should not accept binary input (GH-269)'] = () => {
- const stream = new RewritingStream();
- const buf = Buffer.from('test');
-
- assert.throws(() => stream.write(buf), TypeError);
-};
diff --git a/packages/parse5-html-rewriting-stream/test/rewriting-stream.test.ts b/packages/parse5-html-rewriting-stream/test/rewriting-stream.test.ts
new file mode 100644
index 0000000..5c7892a
--- /dev/null
+++ b/packages/parse5-html-rewriting-stream/test/rewriting-stream.test.ts
@@ -0,0 +1,347 @@
+import * as assert from 'node:assert';
+import { outdent } from 'outdent';
+import { RewritingStream } from '../lib/index.js';
+import { loadSAXParserTestData } from 'parse5-test-utils/utils/load-sax-parser-test-data.js';
+import {
+ finished,
+ getStringDiffMsg,
+ writeChunkedToStream,
+ WritableStreamStub,
+} from 'parse5-test-utils/utils/common.js';
+
+const srcHtml = outdent`
+
+
+
+
+
+
+
+ Hey ya
+
+
+`;
+
+const LONG_TEXT = 'a'.repeat((1 << 16) + 1);
+const LONG_TEXT_WITH_COMMENT = `${'a'.repeat((1 << 16) - 5)}`;
+
+function createRewriterTest({
+ src,
+ expected,
+ assignTokenHandlers = (): void => {
+ /* Ignore */
+ },
+}: {
+ src: string;
+ expected: string;
+ assignTokenHandlers?: (rewriter: RewritingStream) => void;
+}) {
+ return async (): Promise => {
+ const rewriter = new RewritingStream();
+ const writable = new WritableStreamStub();
+
+ rewriter.pipe(writable);
+
+ assignTokenHandlers(rewriter);
+ writeChunkedToStream(src, rewriter);
+
+ await finished(writable);
+
+ assert.ok(writable.writtenData === expected, getStringDiffMsg(writable.writtenData, expected));
+ };
+}
+
+describe('RewritingStream', () => {
+ // Raw data tests
+ for (const [idx, data] of loadSAXParserTestData().entries()) {
+ // NOTE: if we don't have any event handlers assigned, stream should use raw
+ // data for the serialization, so serialized content should identical to the original.
+ it(
+ `Raw token serialization - ${idx + 1}.${data.name}`,
+ createRewriterTest({
+ src: data.src,
+ expected: data.src,
+ })
+ );
+ }
+
+ it(
+ 'rewrite start tags',
+ createRewriterTest({
+ src: srcHtml,
+ expected: outdent`
+
+
+
+
+
+
+
+ Hey ya
+
+
+ `,
+ assignTokenHandlers: (rewriter) => {
+ rewriter.on('startTag', (token) => {
+ if (token.tagName === 'head') {
+ token.tagName = 'body';
+ } else if (token.tagName === 'body') {
+ token.tagName = 'head';
+ }
+
+ rewriter.emitStartTag(token);
+ });
+ },
+ })
+ );
+
+ it(
+ 'rewrite end tags',
+ createRewriterTest({
+ src: srcHtml,
+ expected: outdent`
+
+
+
+
+
+
+
+ Hey ya
+
+
+ `,
+ assignTokenHandlers: (rewriter) => {
+ rewriter.on('endTag', (token) => {
+ token.tagName = 'rewritten';
+
+ rewriter.emitEndTag(token);
+ });
+ },
+ })
+ );
+
+ it(
+ 'rewrite text',
+ createRewriterTest({
+ src: srcHtml,
+ expected: outdent`
+
+
+
+
+
+
+
+
42
+
+
+ `,
+ assignTokenHandlers: (rewriter) => {
+ rewriter.on('text', (token) => {
+ if (token.text.trim().length > 0) {
+ token.text = '42';
+ }
+
+ rewriter.emitText(token);
+ });
+ },
+ })
+ );
+
+ it(
+ 'rewrite comment',
+ createRewriterTest({
+ src: srcHtml,
+ expected: outdent`
+
+
+
+
+
+
+
+
Hey ya
+
+
+ `,
+ assignTokenHandlers: (rewriter) => {
+ rewriter.on('comment', (token) => {
+ token.text = '42';
+
+ rewriter.emitComment(token);
+ });
+ },
+ })
+ );
+
+ it(
+ 'rewrite doctype',
+ createRewriterTest({
+ src: srcHtml,
+ expected: outdent`
+
+
+
+
+
+
+
+
Hey ya
+
+
+ `,
+ assignTokenHandlers: (rewriter) => {
+ rewriter.on('doctype', (token) => {
+ token.publicId = '42';
+ token.systemId = 'hey';
+
+ rewriter.emitDoctype(token);
+ });
+ },
+ })
+ );
+
+ it(
+ 'emit multiple',
+ createRewriterTest({
+ src: srcHtml,
+ expected: outdent`
+
+
+
+
+
+
+
+
Hey ya
+
+
+ `,
+ assignTokenHandlers: (rewriter) => {
+ rewriter.on('startTag', (token) => {
+ rewriter.emitRaw('');
+ rewriter.emitStartTag(token);
+ rewriter.emitRaw('');
+ });
+ },
+ })
+ );
+
+ it(
+ 'rewrite raw',
+ createRewriterTest({
+ src: srcHtml,
+ expected: outdent`
+ 42
+ 42
+ 42
+ 42
+ 42
+ 42
+ 42
+ 42Hey ya
42
+ 42
+ 42
+ `,
+ assignTokenHandlers: (rewriter) => {
+ const rewriteRaw = (_: unknown, raw: string): void => {
+ rewriter.emitRaw(`${raw}42`);
+ };
+
+ rewriter
+ .on('doctype', rewriteRaw)
+ .on('startTag', rewriteRaw)
+ .on('endTag', rewriteRaw)
+ .on('comment', rewriteRaw);
+ },
+ })
+ );
+
+ it(
+ 'Should escape entities in attributes and text',
+ createRewriterTest({
+ src: outdent`
+
+
+
+
+
+ foo&bar
+
+
+ `,
+ expected: outdent`
+
+
+
+
+
+ foo&bar
+
+
+ `,
+ assignTokenHandlers: (rewriter) => {
+ rewriter.on('startTag', (token) => rewriter.emitStartTag(token));
+ rewriter.on('text', (token) => rewriter.emitText(token));
+ },
+ })
+ );
+
+ it('Last text chunk must be flushed (GH-271)', async () => {
+ const parser = new RewritingStream();
+ let foundText = false;
+
+ parser.on('text', ({ text }) => {
+ foundText = true;
+ assert.strictEqual(text, 'text');
+ });
+
+ parser.write('text');
+ parser.end();
+
+ await finished(parser);
+
+ assert.ok(foundText);
+ });
+
+ it('Should not accept binary input (GH-269)', () => {
+ const stream = new RewritingStream();
+ const buf = Buffer.from('test');
+
+ assert.throws(() => stream.write(buf), TypeError);
+ });
+
+ it(
+ 'Should pass long text correctly (GH-292)',
+ createRewriterTest({
+ src: LONG_TEXT,
+ expected: LONG_TEXT,
+ })
+ );
+
+ it(
+ 'Should emit comment after text correctly',
+ createRewriterTest({
+ src: LONG_TEXT_WITH_COMMENT,
+ expected: LONG_TEXT_WITH_COMMENT,
+ })
+ );
+
+ it(
+ 'Should emit text in script without escaping (GH-339)',
+ createRewriterTest({
+ src: '',
+ expected: '',
+ assignTokenHandlers: (rewriter) => {
+ // On a script tag, emit the text without escaping
+ rewriter.on('startTag', (token) => {
+ rewriter.emitStartTag(token);
+ if (token.tagName === 'script') {
+ rewriter.emitText({ text: 'foo && bar' });
+ }
+ });
+ },
+ })
+ );
+});
diff --git a/packages/parse5-html-rewriting-stream/tsconfig.json b/packages/parse5-html-rewriting-stream/tsconfig.json
new file mode 100644
index 0000000..35ad957
--- /dev/null
+++ b/packages/parse5-html-rewriting-stream/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "rootDir": "lib",
+ "outDir": "dist"
+ },
+ "include": ["**/*.ts"],
+ "exclude": ["**/*.test.ts", "dist"],
+ "references": [{ "path": "../parse5/tsconfig.json" }, { "path": "../parse5-sax-parser/tsconfig.json" }]
+}
diff --git a/packages/parse5-htmlparser2-tree-adapter/README.md b/packages/parse5-htmlparser2-tree-adapter/README.md
index 8b61e65..a2d272f 100644
--- a/packages/parse5-htmlparser2-tree-adapter/README.md
+++ b/packages/parse5-htmlparser2-tree-adapter/README.md
@@ -16,7 +16,7 @@
- 📖 Documentation 📖
+ 📖 Documentation 📖
---
@@ -30,5 +30,5 @@
- Version history
+ Changelog
diff --git a/packages/parse5-htmlparser2-tree-adapter/docs/comment-node.md b/packages/parse5-htmlparser2-tree-adapter/docs/comment-node.md
deleted file mode 100644
index 4fb2db5..0000000
--- a/packages/parse5-htmlparser2-tree-adapter/docs/comment-node.md
+++ /dev/null
@@ -1,130 +0,0 @@
-# Interface: CommentNode
-
-### Properties
-
-* [data](#data)
-* [name](#name)
-* [next](#next)
-* [nextSibling](#nextsibling)
-* [nodeType](#nodetype)
-* [nodeValue](#nodevalue)
-* [parent](#parent)
-* [parentNode](#parentnode)
-* [prev](#prev)
-* [previousSibling](#previoussibling)
-* [sourceCodeLocation](#sourcecodelocation)
-* [type](#type)
-
----
-
-## Properties
-
-
-
-### data
-
-**● data**: *`string`*
-
-Comment text.
-
-___
-
-
-### name
-
-**● name**: *"comment"*
-
-The name of the node.
-
-___
-
-
-### next
-
-**● next**: *Node*
-
-Next sibling.
-
-___
-
-
-### nextSibling
-
-**● nextSibling**: *Node*
-
-Same as [next](#next). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### nodeType
-
-**● nodeType**: *`number`*
-
-[DOM spec](https://dom.spec.whatwg.org/#dom-node-nodetype)-compatible node [type](#type).
-
-___
-
-
-### nodeValue
-
-**● nodeValue**: *`string`*
-
-Same as [data](#data). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### parent
-
-**● parent**: *Node*
-
-Parent node.
-
-___
-
-
-### parentNode
-
-**● parentNode**: *Node*
-
-Same as [parent](#parent). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### prev
-
-**● prev**: *Node*
-
-Previous sibling.
-
-___
-
-
-### previousSibling
-
-**● previousSibling**: *Node*
-
-Same as [prev](#prev). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[Location](../../parse5/docs/source-code-location/location.md)*
-
-Comment source code location info. Available if location info is enabled via [ParserOptions](../../parse5/docs/options/parser-options.md).
-
-___
-
-
-### type
-
-**● type**: *`string`*
-
-The type of the node. E.g. [Document](document.md) will have `type` equal to 'root'`.
-
-___
-
diff --git a/packages/parse5-htmlparser2-tree-adapter/docs/document-fragment.md b/packages/parse5-htmlparser2-tree-adapter/docs/document-fragment.md
deleted file mode 100644
index 9ba7f78..0000000
--- a/packages/parse5-htmlparser2-tree-adapter/docs/document-fragment.md
+++ /dev/null
@@ -1,140 +0,0 @@
-# Interface: DocumentFragment
-
-### Properties
-
-* [childNodes](#childnodes)
-* [children](#children)
-* [firstChild](#firstchild)
-* [lastChild](#lastchild)
-* [name](#name)
-* [next](#next)
-* [nextSibling](#nextsibling)
-* [nodeType](#nodetype)
-* [parent](#parent)
-* [parentNode](#parentnode)
-* [prev](#prev)
-* [previousSibling](#previoussibling)
-* [type](#type)
-
----
-
-## Properties
-
-
-
-### childNodes
-
-**● childNodes**: *Node[]*
-
-Same as [children](#children). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### children
-
-**● children**: *Node[]*
-
-Child nodes.
-
-___
-
-
-### firstChild
-
-**● firstChild**: *Node*
-
-First child of the node.
-
-___
-
-
-### lastChild
-
-**● lastChild**: *Node*
-
-Last child of the node.
-
-___
-
-
-### name
-
-**● name**: *"root"*
-
-The name of the node.
-
-___
-
-
-### next
-
-**● next**: *Node*
-
-Next sibling.
-
-___
-
-
-### nextSibling
-
-**● nextSibling**: *Node*
-
-Same as [next](#next). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### nodeType
-
-**● nodeType**: *`number`*
-
-[DOM spec](https://dom.spec.whatwg.org/#dom-node-nodetype)-compatible node [type](#type).
-
-___
-
-
-### parent
-
-**● parent**: *Node*
-
-Parent node.
-
-___
-
-
-### parentNode
-
-**● parentNode**: *Node*
-
-Same as [parent](#parent). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### prev
-
-**● prev**: *Node*
-
-Previous sibling.
-
-___
-
-
-### previousSibling
-
-**● previousSibling**: *Node*
-
-Same as [prev](#prev). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### type
-
-**● type**: *"root"*
-
-The type of the node.
-
-___
-
diff --git a/packages/parse5-htmlparser2-tree-adapter/docs/document-type.md b/packages/parse5-htmlparser2-tree-adapter/docs/document-type.md
deleted file mode 100644
index 57e4da4..0000000
--- a/packages/parse5-htmlparser2-tree-adapter/docs/document-type.md
+++ /dev/null
@@ -1,140 +0,0 @@
-# Interface: DocumentType
-
-### Properties
-
-* [data](#data)
-* [name](#name)
-* [next](#next)
-* [nextSibling](#nextsibling)
-* [nodeType](#nodetype)
-* [parent](#parent)
-* [parentNode](#parentnode)
-* [prev](#prev)
-* [previousSibling](#previoussibling)
-* [type](#type)
-* [x-name](#x_name)
-* [x-publicId](#x_publicid)
-* [x-systemId](#x_systemid)
-
----
-
-## Properties
-
-
-
-### data
-
-**● data**: *`string`*
-
-Serialized doctype [name](#name), {@link publicId} and {@link systemId}.
-
-___
-
-
-### name
-
-**● name**: *"!doctype"*
-
-Node name.
-
-___
-
-
-### next
-
-**● next**: *Node*
-
-Next sibling.
-
-___
-
-
-### nextSibling
-
-**● nextSibling**: *Node*
-
-Same as [next](#next). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### nodeType
-
-**● nodeType**: *`number`*
-
-[DOM spec](https://dom.spec.whatwg.org/#dom-node-nodetype)-compatible node [type](#type).
-
-___
-
-
-### parent
-
-**● parent**: *Node*
-
-Parent node.
-
-___
-
-
-### parentNode
-
-**● parentNode**: *Node*
-
-Same as [parent](#parent). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### prev
-
-**● prev**: *Node*
-
-Previous sibling.
-
-___
-
-
-### previousSibling
-
-**● previousSibling**: *Node*
-
-Same as [prev](#prev). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### type
-
-**● type**: *"directive"*
-
-The type of the node.
-
-___
-
-
-### x-name
-
-**● x-name**: *`string`*
-
-Document type name.
-
-___
-
-
-### x-publicId
-
-**● x-publicId**: *`string`*
-
-Document type public identifier.
-
-___
-
-
-### x-systemId
-
-**● x-systemId**: *`string`*
-
-Document type system identifier.
-
-___
-
diff --git a/packages/parse5-htmlparser2-tree-adapter/docs/document.md b/packages/parse5-htmlparser2-tree-adapter/docs/document.md
deleted file mode 100644
index 7f28591..0000000
--- a/packages/parse5-htmlparser2-tree-adapter/docs/document.md
+++ /dev/null
@@ -1,150 +0,0 @@
-# Interface: Document
-
-### Properties
-
-* [childNodes](#childnodes)
-* [children](#children)
-* [firstChild](#firstchild)
-* [lastChild](#lastchild)
-* [name](#name)
-* [next](#next)
-* [nextSibling](#nextsibling)
-* [nodeType](#nodetype)
-* [parent](#parent)
-* [parentNode](#parentnode)
-* [prev](#prev)
-* [previousSibling](#previoussibling)
-* [type](#type)
-* [x-mode](#x_mode)
-
----
-
-## Properties
-
-
-
-### childNodes
-
-**● childNodes**: *Node[]*
-
-Same as [children](#children). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### children
-
-**● children**: *Node[]*
-
-Child nodes.
-
-___
-
-
-### firstChild
-
-**● firstChild**: *Node*
-
-First child of the node.
-
-___
-
-
-### lastChild
-
-**● lastChild**: *Node*
-
-Last child of the node.
-
-___
-
-
-### name
-
-**● name**: *"root"*
-
-The name of the node.
-
-___
-
-
-### next
-
-**● next**: *Node*
-
-Next sibling.
-
-___
-
-
-### nextSibling
-
-**● nextSibling**: *Node*
-
-Same as [next](#next). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### nodeType
-
-**● nodeType**: *`number`*
-
-[DOM spec](https://dom.spec.whatwg.org/#dom-node-nodetype)-compatible node [type](#type).
-
-___
-
-
-### parent
-
-**● parent**: *Node*
-
-Parent node.
-
-___
-
-
-### parentNode
-
-**● parentNode**: *Node*
-
-Same as [parent](#parent). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### prev
-
-**● prev**: *Node*
-
-Previous sibling.
-
-___
-
-
-### previousSibling
-
-**● previousSibling**: *Node*
-
-Same as [prev](#prev). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### type
-
-**● type**: *"root"*
-
-The type of the node.
-
-___
-
-
-### x-mode
-
-**● x-mode**: *"no-quirks" | "quirks" | "limited-quirks"*
-
-[Document mode](https://dom.spec.whatwg.org/#concept-document-limited-quirks).
-
-___
-
diff --git a/packages/parse5-htmlparser2-tree-adapter/docs/element.md b/packages/parse5-htmlparser2-tree-adapter/docs/element.md
deleted file mode 100644
index 96e48c7..0000000
--- a/packages/parse5-htmlparser2-tree-adapter/docs/element.md
+++ /dev/null
@@ -1,212 +0,0 @@
-# Interface: Element
-
-### Properties
-
-* [attribs](#attribs)
-* [childNodes](#childnodes)
-* [children](#children)
-* [firstChild](#firstchild)
-* [lastChild](#lastchild)
-* [name](#name)
-* [namespace](#namespace)
-* [next](#next)
-* [nextSibling](#nextsibling)
-* [nodeType](#nodetype)
-* [parent](#parent)
-* [parentNode](#parentnode)
-* [prev](#prev)
-* [previousSibling](#previoussibling)
-* [sourceCodeLocation](#sourcecodelocation)
-* [tagName](#tagname)
-* [type](#type)
-* [x-attribsNamespace](#x_attribsnamespace)
-* [x-attribsPrefix](#x_attribsprefix)
-
----
-
-## Properties
-
-
-
-### attribs
-
-**● attribs**: *`object`*
-
-Element attributes.
-
-#### Type declaration
-
-[name: `string`]: `string`
-
-___
-
-
-### childNodes
-
-**● childNodes**: *Node[]*
-
-Same as [children](#children). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### children
-
-**● children**: *Node[]*
-
-Child nodes.
-
-___
-
-
-### firstChild
-
-**● firstChild**: *Node*
-
-First child of the node.
-
-___
-
-
-### lastChild
-
-**● lastChild**: *Node*
-
-Last child of the node.
-
-___
-
-
-### name
-
-**● name**: *`string`*
-
-The name of the node. Equals to element [tagName](#tagname).
-
-___
-
-
-### namespace
-
-**● namespace**: *`string`*
-
-Element namespace.
-
-___
-
-
-### next
-
-**● next**: *Node*
-
-Next sibling.
-
-___
-
-
-### nextSibling
-
-**● nextSibling**: *Node*
-
-Same as [next](#next). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### nodeType
-
-**● nodeType**: *`number`*
-
-[DOM spec](https://dom.spec.whatwg.org/#dom-node-nodetype)-compatible node [type](#type).
-
-___
-
-
-### parent
-
-**● parent**: *Node*
-
-Parent node.
-
-___
-
-
-### parentNode
-
-**● parentNode**: *Node*
-
-Same as [parent](#parent). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### prev
-
-**● prev**: *Node*
-
-Previous sibling.
-
-___
-
-
-### previousSibling
-
-**● previousSibling**: *Node*
-
-Same as [prev](#prev). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[ElementLocation](../../parse5/docs/element-location.md)*
-
-Element source code location info. Available if location info is enabled via [ParserOptions](../../parse5/docs/parser-options.md).
-
-___
-
-
-### tagName
-
-**● tagName**: *`string`*
-
-Element tag name.
-
-___
-
-
-### type
-
-**● type**: *`string`*
-
-The type of the node. E.g. [Document](document.md) will have `type` equal to 'root'`.
-
-___
-
-
-### x-attribsNamespace
-
-**● x-attribsNamespace**: *`object`*
-
-Element attribute namespaces.
-
-#### Type declaration
-
-[name: `string`]: `string`
-
-___
-
-
-### x-attribsPrefix
-
-**● x-attribsPrefix**: *`object`*
-
-Element attribute namespace-related prefixes.
-
-#### Type declaration
-
-[name: `string`]: `string`
-
-___
-
diff --git a/packages/parse5-htmlparser2-tree-adapter/docs/index.md b/packages/parse5-htmlparser2-tree-adapter/docs/index.md
deleted file mode 100644
index 38cdda4..0000000
--- a/packages/parse5-htmlparser2-tree-adapter/docs/index.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# parse5-htmlparser2-tree-adapter
-
-## Usage
-
-```js
-const parse5 = require('parse5');
-const htmlparser2Adapter = require('parse5-htmlparser2-tree-adapter');
-
-const document = parse5.parse('', { treeAdapter: htmlparser2Adapter });
-```
-
-## List of tree interfaces produced by htmlparser2 [tree adapter](../../parse5/docs/tree-adapter/interface.md)
-
-* [CommentNode](comment-node.md)
-* [Document](document.md)
-* [DocumentFragment](document-fragment.md)
-* [DocumentType](document-type.md)
-* [Element](element.md)
-* [TextNode](text-node.md)
-
----
-
diff --git a/packages/parse5-htmlparser2-tree-adapter/docs/text-node.md b/packages/parse5-htmlparser2-tree-adapter/docs/text-node.md
deleted file mode 100644
index 8a9bd00..0000000
--- a/packages/parse5-htmlparser2-tree-adapter/docs/text-node.md
+++ /dev/null
@@ -1,130 +0,0 @@
-# Interface: TextNode
-
-### Properties
-
-* [data](#data)
-* [name](#name)
-* [next](#next)
-* [nextSibling](#nextsibling)
-* [nodeType](#nodetype)
-* [nodeValue](#nodevalue)
-* [parent](#parent)
-* [parentNode](#parentnode)
-* [prev](#prev)
-* [previousSibling](#previoussibling)
-* [sourceCodeLocation](#sourcecodelocation)
-* [type](#type)
-
----
-
-## Properties
-
-
-
-### data
-
-**● data**: *`string`*
-
-Text content.
-
-___
-
-
-### name
-
-**● name**: *"text"*
-
-The name of the node.
-
-___
-
-
-### next
-
-**● next**: *Node*
-
-Next sibling.
-
-___
-
-
-### nextSibling
-
-**● nextSibling**: *Node*
-
-Same as [next](#next). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### nodeType
-
-**● nodeType**: *`number`*
-
-[DOM spec](https://dom.spec.whatwg.org/#dom-node-nodetype)-compatible node [type](#type).
-
-___
-
-
-### nodeValue
-
-**● nodeValue**: *`string`*
-
-Same as [data](#data). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### parent
-
-**● parent**: *Node*
-
-Parent node.
-
-___
-
-
-### parentNode
-
-**● parentNode**: *Node*
-
-Same as [parent](#parent). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### prev
-
-**● prev**: *Node*
-
-Previous sibling.
-
-___
-
-
-### previousSibling
-
-**● previousSibling**: *Node*
-
-Same as [prev](#prev). [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
-
-___
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[Location](../../parse5/docs/location.md)*
-
-Comment source code location info. Available if location info is enabled via [ParserOptions](../../parse5/docs/parser-options.md).
-
-___
-
-
-### type
-
-**● type**: *`string`*
-
-The type of the node. E.g. [Document](document.md) will have `type` equal to 'root'`.
-
-___
-
diff --git a/packages/parse5-htmlparser2-tree-adapter/lib/index.js b/packages/parse5-htmlparser2-tree-adapter/lib/index.js
deleted file mode 100644
index 58464d7..0000000
--- a/packages/parse5-htmlparser2-tree-adapter/lib/index.js
+++ /dev/null
@@ -1,348 +0,0 @@
-'use strict';
-
-const doctype = require('parse5/lib/common/doctype');
-const { DOCUMENT_MODE } = require('parse5/lib/common/html');
-
-//Conversion tables for DOM Level1 structure emulation
-const nodeTypes = {
- element: 1,
- text: 3,
- cdata: 4,
- comment: 8
-};
-
-const nodePropertyShorthands = {
- tagName: 'name',
- childNodes: 'children',
- parentNode: 'parent',
- previousSibling: 'prev',
- nextSibling: 'next',
- nodeValue: 'data'
-};
-
-//Node
-class Node {
- constructor(props) {
- for (const key of Object.keys(props)) {
- this[key] = props[key];
- }
- }
-
- get firstChild() {
- const children = this.children;
-
- return (children && children[0]) || null;
- }
-
- get lastChild() {
- const children = this.children;
-
- return (children && children[children.length - 1]) || null;
- }
-
- get nodeType() {
- return nodeTypes[this.type] || nodeTypes.element;
- }
-}
-
-Object.keys(nodePropertyShorthands).forEach(key => {
- const shorthand = nodePropertyShorthands[key];
-
- Object.defineProperty(Node.prototype, key, {
- get: function() {
- return this[shorthand] || null;
- },
- set: function(val) {
- this[shorthand] = val;
- return val;
- }
- });
-});
-
-//Node construction
-exports.createDocument = function() {
- return new Node({
- type: 'root',
- name: 'root',
- parent: null,
- prev: null,
- next: null,
- children: [],
- 'x-mode': DOCUMENT_MODE.NO_QUIRKS
- });
-};
-
-exports.createDocumentFragment = function() {
- return new Node({
- type: 'root',
- name: 'root',
- parent: null,
- prev: null,
- next: null,
- children: []
- });
-};
-
-exports.createElement = function(tagName, namespaceURI, attrs) {
- const attribs = Object.create(null);
- const attribsNamespace = Object.create(null);
- const attribsPrefix = Object.create(null);
-
- for (let i = 0; i < attrs.length; i++) {
- const attrName = attrs[i].name;
-
- attribs[attrName] = attrs[i].value;
- attribsNamespace[attrName] = attrs[i].namespace;
- attribsPrefix[attrName] = attrs[i].prefix;
- }
-
- return new Node({
- type: tagName === 'script' || tagName === 'style' ? tagName : 'tag',
- name: tagName,
- namespace: namespaceURI,
- attribs: attribs,
- 'x-attribsNamespace': attribsNamespace,
- 'x-attribsPrefix': attribsPrefix,
- children: [],
- parent: null,
- prev: null,
- next: null
- });
-};
-
-exports.createCommentNode = function(data) {
- return new Node({
- type: 'comment',
- data: data,
- parent: null,
- prev: null,
- next: null
- });
-};
-
-const createTextNode = function(value) {
- return new Node({
- type: 'text',
- data: value,
- parent: null,
- prev: null,
- next: null
- });
-};
-
-//Tree mutation
-const appendChild = (exports.appendChild = function(parentNode, newNode) {
- const prev = parentNode.children[parentNode.children.length - 1];
-
- if (prev) {
- prev.next = newNode;
- newNode.prev = prev;
- }
-
- parentNode.children.push(newNode);
- newNode.parent = parentNode;
-});
-
-const insertBefore = (exports.insertBefore = function(parentNode, newNode, referenceNode) {
- const insertionIdx = parentNode.children.indexOf(referenceNode);
- const prev = referenceNode.prev;
-
- if (prev) {
- prev.next = newNode;
- newNode.prev = prev;
- }
-
- referenceNode.prev = newNode;
- newNode.next = referenceNode;
-
- parentNode.children.splice(insertionIdx, 0, newNode);
- newNode.parent = parentNode;
-});
-
-exports.setTemplateContent = function(templateElement, contentElement) {
- appendChild(templateElement, contentElement);
-};
-
-exports.getTemplateContent = function(templateElement) {
- return templateElement.children[0];
-};
-
-exports.setDocumentType = function(document, name, publicId, systemId) {
- const data = doctype.serializeContent(name, publicId, systemId);
- let doctypeNode = null;
-
- for (let i = 0; i < document.children.length; i++) {
- if (document.children[i].type === 'directive' && document.children[i].name === '!doctype') {
- doctypeNode = document.children[i];
- break;
- }
- }
-
- if (doctypeNode) {
- doctypeNode.data = data;
- doctypeNode['x-name'] = name;
- doctypeNode['x-publicId'] = publicId;
- doctypeNode['x-systemId'] = systemId;
- } else {
- appendChild(
- document,
- new Node({
- type: 'directive',
- name: '!doctype',
- data: data,
- 'x-name': name,
- 'x-publicId': publicId,
- 'x-systemId': systemId
- })
- );
- }
-};
-
-exports.setDocumentMode = function(document, mode) {
- document['x-mode'] = mode;
-};
-
-exports.getDocumentMode = function(document) {
- return document['x-mode'];
-};
-
-exports.detachNode = function(node) {
- if (node.parent) {
- const idx = node.parent.children.indexOf(node);
- const prev = node.prev;
- const next = node.next;
-
- node.prev = null;
- node.next = null;
-
- if (prev) {
- prev.next = next;
- }
-
- if (next) {
- next.prev = prev;
- }
-
- node.parent.children.splice(idx, 1);
- node.parent = null;
- }
-};
-
-exports.insertText = function(parentNode, text) {
- const lastChild = parentNode.children[parentNode.children.length - 1];
-
- if (lastChild && lastChild.type === 'text') {
- lastChild.data += text;
- } else {
- appendChild(parentNode, createTextNode(text));
- }
-};
-
-exports.insertTextBefore = function(parentNode, text, referenceNode) {
- const prevNode = parentNode.children[parentNode.children.indexOf(referenceNode) - 1];
-
- if (prevNode && prevNode.type === 'text') {
- prevNode.data += text;
- } else {
- insertBefore(parentNode, createTextNode(text), referenceNode);
- }
-};
-
-exports.adoptAttributes = function(recipient, attrs) {
- for (let i = 0; i < attrs.length; i++) {
- const attrName = attrs[i].name;
-
- if (typeof recipient.attribs[attrName] === 'undefined') {
- recipient.attribs[attrName] = attrs[i].value;
- recipient['x-attribsNamespace'][attrName] = attrs[i].namespace;
- recipient['x-attribsPrefix'][attrName] = attrs[i].prefix;
- }
- }
-};
-
-//Tree traversing
-exports.getFirstChild = function(node) {
- return node.children[0];
-};
-
-exports.getChildNodes = function(node) {
- return node.children;
-};
-
-exports.getParentNode = function(node) {
- return node.parent;
-};
-
-exports.getAttrList = function(element) {
- const attrList = [];
-
- for (const name in element.attribs) {
- attrList.push({
- name: name,
- value: element.attribs[name],
- namespace: element['x-attribsNamespace'][name],
- prefix: element['x-attribsPrefix'][name]
- });
- }
-
- return attrList;
-};
-
-//Node data
-exports.getTagName = function(element) {
- return element.name;
-};
-
-exports.getNamespaceURI = function(element) {
- return element.namespace;
-};
-
-exports.getTextNodeContent = function(textNode) {
- return textNode.data;
-};
-
-exports.getCommentNodeContent = function(commentNode) {
- return commentNode.data;
-};
-
-exports.getDocumentTypeNodeName = function(doctypeNode) {
- return doctypeNode['x-name'];
-};
-
-exports.getDocumentTypeNodePublicId = function(doctypeNode) {
- return doctypeNode['x-publicId'];
-};
-
-exports.getDocumentTypeNodeSystemId = function(doctypeNode) {
- return doctypeNode['x-systemId'];
-};
-
-//Node types
-exports.isTextNode = function(node) {
- return node.type === 'text';
-};
-
-exports.isCommentNode = function(node) {
- return node.type === 'comment';
-};
-
-exports.isDocumentTypeNode = function(node) {
- return node.type === 'directive' && node.name === '!doctype';
-};
-
-exports.isElementNode = function(node) {
- return !!node.attribs;
-};
-
-// Source code location
-exports.setNodeSourceCodeLocation = function(node, location) {
- node.sourceCodeLocation = location;
-};
-
-exports.getNodeSourceCodeLocation = function(node) {
- return node.sourceCodeLocation;
-};
-
-exports.updateNodeSourceCodeLocation = function(node, endLocation) {
- node.sourceCodeLocation = Object.assign(node.sourceCodeLocation, endLocation);
-};
diff --git a/packages/parse5-htmlparser2-tree-adapter/lib/index.ts b/packages/parse5-htmlparser2-tree-adapter/lib/index.ts
new file mode 100644
index 0000000..4a56897
--- /dev/null
+++ b/packages/parse5-htmlparser2-tree-adapter/lib/index.ts
@@ -0,0 +1,292 @@
+import { type TreeAdapterTypeMap, type TreeAdapter, type Token, html } from 'parse5';
+import {
+ type AnyNode,
+ type ParentNode,
+ type ChildNode,
+ Element,
+ Document,
+ ProcessingInstruction,
+ Comment,
+ Text,
+ isDirective,
+ isText,
+ isComment,
+ isTag,
+} from 'domhandler';
+
+export type Htmlparser2TreeAdapterMap = TreeAdapterTypeMap<
+ AnyNode,
+ ParentNode,
+ ChildNode,
+ Document,
+ Document,
+ Element,
+ Comment,
+ Text,
+ Element,
+ ProcessingInstruction
+>;
+
+function createTextNode(value: string): Text {
+ return new Text(value);
+}
+
+function enquoteDoctypeId(id: string): string {
+ const quote = id.includes('"') ? "'" : '"';
+
+ return quote + id + quote;
+}
+
+/** @internal */
+export function serializeDoctypeContent(name: string, publicId: string, systemId: string): string {
+ let str = '!DOCTYPE ';
+
+ if (name) {
+ str += name;
+ }
+
+ if (publicId) {
+ str += ` PUBLIC ${enquoteDoctypeId(publicId)}`;
+ } else if (systemId) {
+ str += ' SYSTEM';
+ }
+
+ if (systemId) {
+ str += ` ${enquoteDoctypeId(systemId)}`;
+ }
+
+ return str;
+}
+
+export const adapter: TreeAdapter = {
+ // Re-exports from domhandler
+ isCommentNode: isComment,
+ isElementNode: isTag,
+ isTextNode: isText,
+
+ //Node construction
+ createDocument(): Document {
+ const node = new Document([]);
+ node['x-mode'] = html.DOCUMENT_MODE.NO_QUIRKS;
+ return node;
+ },
+
+ createDocumentFragment(): Document {
+ return new Document([]);
+ },
+
+ createElement(tagName: string, namespaceURI: html.NS, attrs: Token.Attribute[]): Element {
+ const attribs = Object.create(null);
+ const attribsNamespace = Object.create(null);
+ const attribsPrefix = Object.create(null);
+
+ for (let i = 0; i < attrs.length; i++) {
+ const attrName = attrs[i].name;
+
+ attribs[attrName] = attrs[i].value;
+ attribsNamespace[attrName] = attrs[i].namespace;
+ attribsPrefix[attrName] = attrs[i].prefix;
+ }
+
+ const node = new Element(tagName, attribs, []);
+ node.namespace = namespaceURI;
+ node['x-attribsNamespace'] = attribsNamespace;
+ node['x-attribsPrefix'] = attribsPrefix;
+ return node;
+ },
+
+ createCommentNode(data: string): Comment {
+ return new Comment(data);
+ },
+
+ //Tree mutation
+ appendChild(parentNode: ParentNode, newNode: ChildNode): void {
+ const prev = parentNode.children[parentNode.children.length - 1];
+
+ if (prev) {
+ prev.next = newNode;
+ newNode.prev = prev;
+ }
+
+ parentNode.children.push(newNode);
+ newNode.parent = parentNode;
+ },
+
+ insertBefore(parentNode: ParentNode, newNode: ChildNode, referenceNode: ChildNode): void {
+ const insertionIdx = parentNode.children.indexOf(referenceNode);
+ const { prev } = referenceNode;
+
+ if (prev) {
+ prev.next = newNode;
+ newNode.prev = prev;
+ }
+
+ referenceNode.prev = newNode;
+ newNode.next = referenceNode;
+
+ parentNode.children.splice(insertionIdx, 0, newNode);
+ newNode.parent = parentNode;
+ },
+
+ setTemplateContent(templateElement: Element, contentElement: Document): void {
+ adapter.appendChild(templateElement, contentElement as AnyNode as ChildNode);
+ },
+
+ getTemplateContent(templateElement: Element): Document {
+ return templateElement.children[0] as AnyNode as Document;
+ },
+
+ setDocumentType(document: Document, name: string, publicId: string, systemId: string): void {
+ const data = serializeDoctypeContent(name, publicId, systemId);
+ let doctypeNode = document.children.find(
+ (node): node is ProcessingInstruction => isDirective(node) && node.name === '!doctype'
+ );
+
+ if (doctypeNode) {
+ doctypeNode.data = data ?? null;
+ } else {
+ doctypeNode = new ProcessingInstruction('!doctype', data);
+ adapter.appendChild(document, doctypeNode);
+ }
+
+ doctypeNode['x-name'] = name ?? undefined;
+ doctypeNode['x-publicId'] = publicId ?? undefined;
+ doctypeNode['x-systemId'] = systemId ?? undefined;
+ },
+
+ setDocumentMode(document: Document, mode: html.DOCUMENT_MODE): void {
+ document['x-mode'] = mode;
+ },
+
+ getDocumentMode(document: Document): html.DOCUMENT_MODE {
+ return document['x-mode'] as html.DOCUMENT_MODE;
+ },
+
+ detachNode(node: ChildNode): void {
+ if (node.parent) {
+ const idx = node.parent.children.indexOf(node);
+ const { prev, next } = node;
+
+ node.prev = null;
+ node.next = null;
+
+ if (prev) {
+ prev.next = next;
+ }
+
+ if (next) {
+ next.prev = prev;
+ }
+
+ node.parent.children.splice(idx, 1);
+ node.parent = null;
+ }
+ },
+
+ insertText(parentNode: ParentNode, text: string): void {
+ const lastChild = parentNode.children[parentNode.children.length - 1];
+
+ if (lastChild && isText(lastChild)) {
+ lastChild.data += text;
+ } else {
+ adapter.appendChild(parentNode, createTextNode(text));
+ }
+ },
+
+ insertTextBefore(parentNode: ParentNode, text: string, referenceNode: ChildNode): void {
+ const prevNode = parentNode.children[parentNode.children.indexOf(referenceNode) - 1];
+
+ if (prevNode && isText(prevNode)) {
+ prevNode.data += text;
+ } else {
+ adapter.insertBefore(parentNode, createTextNode(text), referenceNode);
+ }
+ },
+
+ adoptAttributes(recipient: Element, attrs: Token.Attribute[]): void {
+ for (let i = 0; i < attrs.length; i++) {
+ const attrName = attrs[i].name;
+
+ if (typeof recipient.attribs[attrName] === 'undefined') {
+ recipient.attribs[attrName] = attrs[i].value;
+ recipient['x-attribsNamespace']![attrName] = attrs[i].namespace!;
+ recipient['x-attribsPrefix']![attrName] = attrs[i].prefix!;
+ }
+ }
+ },
+
+ //Tree traversing
+ getFirstChild(node: ParentNode): ChildNode | null {
+ return node.children[0];
+ },
+
+ getChildNodes(node: ParentNode): ChildNode[] {
+ return node.children;
+ },
+
+ getParentNode(node: AnyNode): ParentNode | null {
+ return node.parent;
+ },
+
+ getAttrList(element: Element): Token.Attribute[] {
+ return element.attributes;
+ },
+
+ //Node data
+ getTagName(element: Element): string {
+ return element.name;
+ },
+
+ getNamespaceURI(element: Element): html.NS {
+ return element.namespace as html.NS;
+ },
+
+ getTextNodeContent(textNode: Text): string {
+ return textNode.data;
+ },
+
+ getCommentNodeContent(commentNode: Comment): string {
+ return commentNode.data;
+ },
+
+ getDocumentTypeNodeName(doctypeNode: ProcessingInstruction): string {
+ return doctypeNode['x-name'] ?? '';
+ },
+
+ getDocumentTypeNodePublicId(doctypeNode: ProcessingInstruction): string {
+ return doctypeNode['x-publicId'] ?? '';
+ },
+
+ getDocumentTypeNodeSystemId(doctypeNode: ProcessingInstruction): string {
+ return doctypeNode['x-systemId'] ?? '';
+ },
+
+ //Node types
+
+ isDocumentTypeNode(node: AnyNode): node is ProcessingInstruction {
+ return isDirective(node) && node.name === '!doctype';
+ },
+
+ // Source code location
+ setNodeSourceCodeLocation(node: AnyNode, location: Token.ElementLocation | null): void {
+ if (location) {
+ node.startIndex = location.startOffset;
+ node.endIndex = location.endOffset;
+ }
+
+ node.sourceCodeLocation = location;
+ },
+
+ getNodeSourceCodeLocation(node: AnyNode): Token.ElementLocation | null | undefined {
+ return node.sourceCodeLocation;
+ },
+
+ updateNodeSourceCodeLocation(node: AnyNode, endLocation: Token.ElementLocation): void {
+ if (endLocation.endOffset != null) node.endIndex = endLocation.endOffset;
+
+ node.sourceCodeLocation = {
+ ...node.sourceCodeLocation,
+ ...endLocation,
+ };
+ },
+};
diff --git a/packages/parse5-htmlparser2-tree-adapter/package.json b/packages/parse5-htmlparser2-tree-adapter/package.json
index cb8d818..6c2bd8e 100644
--- a/packages/parse5-htmlparser2-tree-adapter/package.json
+++ b/packages/parse5-htmlparser2-tree-adapter/package.json
@@ -1,10 +1,12 @@
{
"name": "parse5-htmlparser2-tree-adapter",
+ "type": "module",
"description": "htmlparser2 tree adapter for parse5.",
- "version": "6.0.1",
+ "version": "7.0.0",
"author": "Ivan Nikulin (https://github.com/inikulin)",
"contributors": "https://github.com/inikulin/parse5/graphs/contributors",
"homepage": "https://github.com/inikulin/parse5",
+ "funding": "https://github.com/inikulin/parse5?sponsor=1",
"keywords": [
"parse5",
"parser",
@@ -12,15 +14,26 @@
"htmlparser2"
],
"license": "MIT",
- "main": "./lib/index.js",
+ "main": "dist/cjs/index.js",
+ "module": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "exports": {
+ "import": "./dist/index.js",
+ "require": "./dist/cjs/index.js"
+ },
"dependencies": {
- "parse5": "^6.0.1"
+ "domhandler": "^5.0.2",
+ "parse5": "^7.0.0"
+ },
+ "scripts": {
+ "build:cjs": "tsc --module CommonJS --target ES6 --outDir dist/cjs && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json"
},
"repository": {
"type": "git",
"url": "git://github.com/inikulin/parse5.git"
},
"files": [
- "lib"
+ "dist",
+ "!*.map"
]
}
diff --git a/packages/parse5-htmlparser2-tree-adapter/tsconfig.json b/packages/parse5-htmlparser2-tree-adapter/tsconfig.json
new file mode 100644
index 0000000..89bf41d
--- /dev/null
+++ b/packages/parse5-htmlparser2-tree-adapter/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "rootDir": "lib",
+ "outDir": "dist"
+ },
+ "include": ["**/*.ts"],
+ "exclude": ["**/*.test.ts", "dist"]
+}
diff --git a/packages/parse5-parser-stream/README.md b/packages/parse5-parser-stream/README.md
index f65d4b2..cf24e21 100644
--- a/packages/parse5-parser-stream/README.md
+++ b/packages/parse5-parser-stream/README.md
@@ -15,9 +15,8 @@
-
- 📖 Documentation 📖
+ 📖 Documentation 📖
---
@@ -31,5 +30,5 @@
- Version history
+ Changelog
diff --git a/packages/parse5-parser-stream/docs/index.md b/packages/parse5-parser-stream/docs/index.md
deleted file mode 100644
index 55bd217..0000000
--- a/packages/parse5-parser-stream/docs/index.md
+++ /dev/null
@@ -1,122 +0,0 @@
-# Class: ParserStream
-
-Streaming HTML parser with scripting support. A [writable stream](https://nodejs.org/api/stream.html#stream_class_stream_writable).
-
-*__example__*:
-
-```js
-const ParserStream = require('parse5-parser-stream');
-const http = require('http');
-
-// Fetch the page content and obtain it's node
-http.get('http://inikulin.github.io/parse5/', res => {
- const parser = new ParserStream();
-
- parser.once('finish', () => {
- console.log(parser.document.childNodes[1].childNodes[0].tagName); //> 'head'
- });
-
- res.pipe(parser);
-});
-```
-
-### Constructors
-
-* [constructor](#constructor)
-
-### Properties
-
-* [document](#document)
-
-### Methods
-
-See: [writable stream API](https://nodejs.org/api/stream.html#stream_class_stream_writable).
-
-### Events
-
-* [on("script")](#on_script)
-
-Also see: [writable stream API](https://nodejs.org/api/stream.html#stream_class_stream_writable).
-
----
-
-## Constructors
-
-
-
-### constructor
-
-⊕ **new ParserStream**(options?: *[ParserOptions](../../parse5/docs/options/parser-options.md)*): [ParserStream]()
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| `Optional` options | [ParserOptions](../../parse5/docs/options/parser-options.md) | Parsing options. |
-
-**Returns:** [ParserStream]()
-
-___
-
-## Properties
-
-
-
-### document
-
-**● document**: *Document*
-
-The resulting document node.
-___
-
-## Events
-
-
-
-### on("script")
-
-▸ **on**(event: *"script"*, listener: *`function`*): `this`
-
-Raised when parser encounters a `');
-```
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "script" |
-| listener | `function` (see below) |
-
-**Returns:** `this`
-
-**listener:** (scriptElement: *Element*, documentWrite: *`function`*, resume: *`function`*): *`void`*
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| scriptElement | Element | The script element that caused the event. |
-| documentWrite | `function (html: string): void` | Write additional html at the current parsing position. Suitable for implementing the DOM document.write and document.writeln methods. |
-| resume | `function` | Resumes parsing.
-
-___
diff --git a/packages/parse5-parser-stream/lib/index.js b/packages/parse5-parser-stream/lib/index.js
deleted file mode 100644
index e91a58a..0000000
--- a/packages/parse5-parser-stream/lib/index.js
+++ /dev/null
@@ -1,83 +0,0 @@
-'use strict';
-
-const { Writable } = require('stream');
-const Parser = require('parse5/lib/parser');
-
-class ParserStream extends Writable {
- constructor(options) {
- super({ decodeStrings: false });
-
- this.parser = new Parser(options);
-
- this.lastChunkWritten = false;
- this.writeCallback = null;
- this.pausedByScript = false;
-
- this.document = this.parser.treeAdapter.createDocument();
-
- this.pendingHtmlInsertions = [];
-
- this._resume = this._resume.bind(this);
- this._documentWrite = this._documentWrite.bind(this);
- this._scriptHandler = this._scriptHandler.bind(this);
-
- this.parser._bootstrap(this.document, null);
- }
-
- //WritableStream implementation
- _write(chunk, encoding, callback) {
- if (typeof chunk !== 'string') {
- throw new TypeError('Parser can work only with string streams.');
- }
-
- this.writeCallback = callback;
- this.parser.tokenizer.write(chunk, this.lastChunkWritten);
- this._runParsingLoop();
- }
-
- end(chunk, encoding, callback) {
- this.lastChunkWritten = true;
- super.end(chunk || '', encoding, callback);
- }
-
- //Scriptable parser implementation
- _runParsingLoop() {
- this.parser.runParsingLoopForCurrentChunk(this.writeCallback, this._scriptHandler);
- }
-
- _resume() {
- if (!this.pausedByScript) {
- throw new Error('Parser was already resumed');
- }
-
- while (this.pendingHtmlInsertions.length) {
- const html = this.pendingHtmlInsertions.pop();
-
- this.parser.tokenizer.insertHtmlAtCurrentPos(html);
- }
-
- this.pausedByScript = false;
-
- //NOTE: keep parsing if we don't wait for the next input chunk
- if (this.parser.tokenizer.active) {
- this._runParsingLoop();
- }
- }
-
- _documentWrite(html) {
- if (!this.parser.stopped) {
- this.pendingHtmlInsertions.push(html);
- }
- }
-
- _scriptHandler(scriptElement) {
- if (this.listenerCount('script') > 0) {
- this.pausedByScript = true;
- this.emit('script', scriptElement, this._documentWrite, this._resume);
- } else {
- this._runParsingLoop();
- }
- }
-}
-
-module.exports = ParserStream;
diff --git a/packages/parse5-parser-stream/lib/index.ts b/packages/parse5-parser-stream/lib/index.ts
new file mode 100644
index 0000000..699005e
--- /dev/null
+++ b/packages/parse5-parser-stream/lib/index.ts
@@ -0,0 +1,147 @@
+import { Writable } from 'node:stream';
+import { Parser, type ParserOptions, type TreeAdapterTypeMap, type DefaultTreeAdapterMap } from 'parse5';
+
+/* eslint-disable unicorn/consistent-function-scoping -- The rule seems to be broken here. */
+
+/**
+ * Streaming HTML parser with scripting support.
+ * A [writable stream](https://nodejs.org/api/stream.html#stream_class_stream_writable).
+ *
+ * @example
+ *
+ * ```js
+ * const ParserStream = require('parse5-parser-stream');
+ * const http = require('http');
+ * const { finished } = require('node:stream');
+ *
+ * // Fetch the page content and obtain it's node
+ * http.get('http://inikulin.github.io/parse5/', res => {
+ * const parser = new ParserStream();
+ *
+ * finished(parser, () => {
+ * console.log(parser.document.childNodes[1].childNodes[0].tagName); //> 'head'
+ * });
+ *
+ * res.pipe(parser);
+ * });
+ * ```
+ *
+ */
+export class ParserStream extends Writable {
+ static getFragmentStream(
+ fragmentContext?: T['parentNode'] | null,
+ options?: ParserOptions
+ ): ParserStream {
+ const parser = Parser.getFragmentParser(fragmentContext, options);
+ const stream = new ParserStream(options, parser);
+ return stream;
+ }
+
+ private lastChunkWritten = false;
+ private writeCallback: undefined | (() => void) = undefined;
+
+ private pendingHtmlInsertions: string[] = [];
+ /** The resulting document node. */
+ public get document(): T['document'] {
+ return this.parser.document;
+ }
+ public getFragment(): T['documentFragment'] {
+ return this.parser.getFragment();
+ }
+
+ /**
+ * @param options Parsing options.
+ */
+ constructor(options?: ParserOptions, public parser: Parser = new Parser(options)) {
+ super({ decodeStrings: false });
+
+ const resume = (): void => {
+ for (let i = this.pendingHtmlInsertions.length - 1; i >= 0; i--) {
+ this.parser.tokenizer.insertHtmlAtCurrentPos(this.pendingHtmlInsertions[i]);
+ }
+
+ this.pendingHtmlInsertions.length = 0;
+
+ //NOTE: keep parsing if we don't wait for the next input chunk
+ this.parser.tokenizer.resume(this.writeCallback);
+ };
+
+ const documentWrite = (html: string): void => {
+ if (!this.parser.stopped) {
+ this.pendingHtmlInsertions.push(html);
+ }
+ };
+
+ const scriptHandler = (scriptElement: T['element']): void => {
+ if (this.listenerCount('script') > 0) {
+ this.parser.tokenizer.pause();
+ this.emit('script', scriptElement, documentWrite, resume);
+ }
+ };
+
+ this.parser.scriptHandler = scriptHandler;
+ }
+
+ //WritableStream implementation
+ override _write(chunk: string, _encoding: string, callback: () => void): void {
+ if (typeof chunk !== 'string') {
+ throw new TypeError('Parser can work only with string streams.');
+ }
+
+ this.writeCallback = callback;
+ this.parser.tokenizer.write(chunk, this.lastChunkWritten, this.writeCallback);
+ }
+
+ // TODO [engine:node@>=16]: Due to issues with Node < 16, we are overriding `end` instead of `_final`.
+
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ override end(chunk?: any, encoding?: any, callback?: any): any {
+ this.lastChunkWritten = true;
+ super.end(chunk || '', encoding, callback);
+ }
+}
+
+export interface ParserStream {
+ /**
+ * Raised when parser encounters a `');
+ * ```
+ *
+ * @param event Name of the event
+ * @param handler
+ */
+ on(
+ event: 'script',
+ handler: (scriptElement: T['element'], documentWrite: (html: string) => void, resume: () => void) => void
+ ): void;
+ /**
+ * Base event handler.
+ *
+ * @param event Name of the event
+ * @param handler Event handler
+ */
+ on(event: string, handler: (...args: any[]) => void): this;
+}
diff --git a/packages/parse5-parser-stream/package.json b/packages/parse5-parser-stream/package.json
index 068e075..48fa6e4 100644
--- a/packages/parse5-parser-stream/package.json
+++ b/packages/parse5-parser-stream/package.json
@@ -1,10 +1,12 @@
{
"name": "parse5-parser-stream",
+ "type": "module",
"description": "Streaming HTML parser with scripting support.",
- "version": "6.0.1",
+ "version": "7.0.0",
"author": "Ivan Nikulin (https://github.com/inikulin)",
"contributors": "https://github.com/inikulin/parse5/graphs/contributors",
"homepage": "https://github.com/inikulin/parse5",
+ "funding": "https://github.com/inikulin/parse5?sponsor=1",
"keywords": [
"parse5",
"parser",
@@ -12,15 +14,19 @@
"streaming"
],
"license": "MIT",
- "main": "./lib/index.js",
+ "main": "dist/index.js",
+ "module": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "exports": "./dist/index.js",
"dependencies": {
- "parse5": "^6.0.1"
+ "parse5": "^7.0.0"
},
"repository": {
"type": "git",
"url": "git://github.com/inikulin/parse5.git"
},
"files": [
- "lib"
+ "dist",
+ "!*.map"
]
}
diff --git a/packages/parse5-parser-stream/test/.eslintrc.js b/packages/parse5-parser-stream/test/.eslintrc.js
deleted file mode 100644
index 4e86ea4..0000000
--- a/packages/parse5-parser-stream/test/.eslintrc.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
- extends: ['../../../.eslintrc.js'],
- parserOptions: {
- ecmaVersion: 8
- }
-};
diff --git a/packages/parse5-parser-stream/test/location-info.test.js b/packages/parse5-parser-stream/test/location-info.test.ts
similarity index 45%
rename from packages/parse5-parser-stream/test/location-info.test.js
rename to packages/parse5-parser-stream/test/location-info.test.ts
index 5751f2f..aea24f7 100644
--- a/packages/parse5-parser-stream/test/location-info.test.js
+++ b/packages/parse5-parser-stream/test/location-info.test.ts
@@ -1,23 +1,23 @@
-const assert = require('assert');
-const generateLocationInfoParserTests = require('../../../test/utils/generate-location-info-parser-tests');
-const { generateTestsForEachTreeAdapter } = require('../../../test/utils/common');
-const parseChunked = require('./utils/parse-chunked');
+import * as assert from 'node:assert';
+import { generateLocationInfoParserTests } from 'parse5-test-utils/utils/generate-location-info-parser-tests.js';
+import { generateTestsForEachTreeAdapter } from 'parse5-test-utils/utils/common.js';
+import { parseChunked } from './utils/parse-chunked.js';
-generateLocationInfoParserTests(module.exports, 'ParserStream', (input, opts) =>
+generateLocationInfoParserTests('location-info', (input, opts) =>
// NOTE: because of performance use bigger chunks here
- parseChunked(input, opts, 100, 400)
+ parseChunked({ input }, opts, 100, 400)
);
-generateTestsForEachTreeAdapter(module.exports, (_test, treeAdapter) => {
- _test['Regression - location info for the implicitly generated , and (GH-44)'] = function() {
+generateTestsForEachTreeAdapter('location-info', (treeAdapter) => {
+ test('Regression - location info for the implicitly generated , and (GH-44)', () => {
const html = '';
const opts = {
- treeAdapter: treeAdapter,
- sourceCodeLocationInfo: true
+ treeAdapter,
+ sourceCodeLocationInfo: true,
};
- const document = parseChunked(html, opts).node;
+ const document = parseChunked({ input: html }, opts).node;
const htmlEl = treeAdapter.getChildNodes(document)[0];
const headEl = treeAdapter.getChildNodes(htmlEl)[0];
const bodyEl = treeAdapter.getChildNodes(htmlEl)[1];
@@ -25,5 +25,5 @@ generateTestsForEachTreeAdapter(module.exports, (_test, treeAdapter) => {
assert.strictEqual(treeAdapter.getNodeSourceCodeLocation(htmlEl), null);
assert.strictEqual(treeAdapter.getNodeSourceCodeLocation(headEl), null);
assert.strictEqual(treeAdapter.getNodeSourceCodeLocation(bodyEl), null);
- };
+ });
});
diff --git a/packages/parse5-parser-stream/test/parser-stream.test.js b/packages/parse5-parser-stream/test/parser-stream.test.js
deleted file mode 100644
index 1a54091..0000000
--- a/packages/parse5-parser-stream/test/parser-stream.test.js
+++ /dev/null
@@ -1,22 +0,0 @@
-const assert = require('assert');
-const ParserStream = require('../lib');
-const generateParsingTests = require('../../../test/utils/generate-parsing-tests');
-const parseChunked = require('./utils/parse-chunked');
-
-generateParsingTests(exports, 'ParserStream', { skipFragments: true }, (test, opts) => parseChunked(test.input, opts));
-
-exports['Regression - Fix empty stream parsing with ParserStream (GH-196)'] = function(done) {
- const parser = new ParserStream().once('finish', () => {
- assert(parser.document.childNodes.length > 0);
- done();
- });
-
- parser.end();
-};
-
-exports['Regression - ParserStream - Should not accept binary input (GH-269)'] = () => {
- const stream = new ParserStream();
- const buf = Buffer.from('test');
-
- assert.throws(() => stream.write(buf), TypeError);
-};
diff --git a/packages/parse5-parser-stream/test/parser-stream.test.ts b/packages/parse5-parser-stream/test/parser-stream.test.ts
new file mode 100644
index 0000000..4653090
--- /dev/null
+++ b/packages/parse5-parser-stream/test/parser-stream.test.ts
@@ -0,0 +1,42 @@
+import * as assert from 'node:assert';
+import { ParserStream } from '../lib/index.js';
+import { generateParsingTests } from 'parse5-test-utils/utils/generate-parsing-tests.js';
+import { parseChunked } from './utils/parse-chunked.js';
+import { finished } from 'parse5-test-utils/utils/common.js';
+
+generateParsingTests(
+ 'ParserStream',
+ 'ParserStream',
+ {
+ expectErrors: [
+ //TODO(GH-448): Foreign content behaviour was updated in the HTML spec.
+ //The old test suite still tests the old behaviour.
+ '269.foreign-fragment',
+ '270.foreign-fragment',
+ '307.foreign-fragment',
+ '309.foreign-fragment',
+ '316.foreign-fragment',
+ '317.foreign-fragment',
+ ],
+ },
+ (test, opts) => parseChunked(test, opts)
+);
+
+describe('ParserStream', () => {
+ it('Fix empty stream parsing with ParserStream (GH-196)', async () => {
+ const parser = new ParserStream();
+
+ parser.end();
+
+ await finished(parser);
+
+ assert.ok(parser.document.childNodes.length > 0);
+ });
+
+ it('Should not accept binary input (GH-269)', () => {
+ const stream = new ParserStream();
+ const buf = Buffer.from('test');
+
+ assert.throws(() => stream.write(buf), TypeError);
+ });
+});
diff --git a/packages/parse5-parser-stream/test/scripting.test.js b/packages/parse5-parser-stream/test/scripting.test.js
deleted file mode 100644
index 4da8cc3..0000000
--- a/packages/parse5-parser-stream/test/scripting.test.js
+++ /dev/null
@@ -1,89 +0,0 @@
-'use strict';
-
-const path = require('path');
-const ParserStream = require('../lib');
-const generateParsingTests = require('../../../test/utils/generate-parsing-tests');
-const { makeChunks, generateTestsForEachTreeAdapter } = require('../../../test/utils/common');
-
-function pause() {
- return new Promise(resolve => setTimeout(resolve, 5));
-}
-
-generateParsingTests(
- module.exports,
- 'ParserStream - Scripting',
- {
- skipFragments: true,
- withoutErrors: true,
- testSuite: [path.join(__dirname, '../../../test/data/tree-construction-scripting')]
- },
- async (test, opts) => {
- const chunks = makeChunks(test.input);
- const parser = new ParserStream(opts);
- const document = parser.document;
-
- const completionPromise = new Promise((resolve, reject) => {
- parser.once('finish', () => resolve({ node: document }));
-
- parser.on('script', async (scriptElement, documentWrite, resume) => {
- const scriptTextNode = opts.treeAdapter.getChildNodes(scriptElement)[0];
- const script = scriptTextNode && opts.treeAdapter.getTextNodeContent(scriptTextNode);
-
- document.write = documentWrite;
-
- //NOTE: emulate postponed script execution
- await pause();
-
- try {
- /* eslint-disable no-eval */
- eval(script);
- /* eslint-enable no-eval */
- resume();
- } catch (err) {
- reject(err);
- }
- });
- });
-
- //NOTE: emulate async input stream behavior
- for (const chunk of chunks) {
- parser.write(chunk);
- await pause();
- }
-
- parser.end();
-
- return completionPromise;
- }
-);
-
-generateTestsForEachTreeAdapter(module.exports, (_test, treeAdapter) => {
- _test['Regression - Synchronously calling resume() leads to crash (GH-98)'] = function(done) {
- const parser = new ParserStream({ treeAdapter: treeAdapter });
-
- parser.on('script', (el, docWrite, resume) => {
- resume();
- });
-
- parser.end('');
-
- process.nextTick(done);
- };
-
- _test['Regression - Parsing loop lock causes accidental hang ups (GH-101)'] = function(done) {
- const parser = new ParserStream({ treeAdapter: treeAdapter });
-
- parser.once('finish', () => {
- done();
- });
-
- parser.on('script', (scriptElement, documentWrite, resume) => {
- process.nextTick(() => {
- resume();
- });
- });
-
- parser.write('');
- parser.end('dawg');
- };
-});
diff --git a/packages/parse5-parser-stream/test/scripting.test.ts b/packages/parse5-parser-stream/test/scripting.test.ts
new file mode 100644
index 0000000..953ef6e
--- /dev/null
+++ b/packages/parse5-parser-stream/test/scripting.test.ts
@@ -0,0 +1,78 @@
+import { ParserStream } from '../lib/index.js';
+import { generateParsingTests } from 'parse5-test-utils/utils/generate-parsing-tests.js';
+import { makeChunks, generateTestsForEachTreeAdapter, finished } from 'parse5-test-utils/utils/common.js';
+import { runInNewContext } from 'node:vm';
+
+function pause(): Promise {
+ return new Promise((resolve) => setTimeout(resolve, 5));
+}
+
+const suitePath = new URL('../../../test/data/tree-construction-scripting', import.meta.url);
+
+generateParsingTests(
+ 'ParserStream - Scripting',
+ 'ParserStream - Scripting',
+ {
+ withoutErrors: true,
+ suitePath,
+ },
+ async (test, opts) => {
+ const chunks = makeChunks(test.input);
+ const parser = test.fragmentContext
+ ? ParserStream.getFragmentStream(test.fragmentContext, opts)
+ : new ParserStream(opts);
+
+ parser.on('script', async (scriptElement, documentWrite, resume) => {
+ const scriptTextNode = opts.treeAdapter.getChildNodes(scriptElement)[0];
+ const script = scriptTextNode ? opts.treeAdapter.getTextNodeContent(scriptTextNode) : '';
+
+ //NOTE: emulate postponed script execution
+ await pause();
+
+ try {
+ runInNewContext(script, { document: { write: documentWrite } });
+ resume();
+ } catch (error) {
+ parser.emit('error', error);
+ }
+ });
+
+ //NOTE: emulate async input stream behavior
+ for (const chunk of chunks) {
+ parser.write(chunk);
+ await pause();
+ }
+
+ parser.end();
+
+ await finished(parser);
+
+ return {
+ node: test.fragmentContext ? parser.getFragment() : parser.document,
+ chunks,
+ };
+ }
+);
+
+generateTestsForEachTreeAdapter('ParserStream', (treeAdapter) => {
+ test('Regression - Synchronously calling resume() leads to crash (GH-98)', (done) => {
+ const parser = new ParserStream({ treeAdapter });
+
+ parser.on('script', (_el, _docWrite, resume) => resume());
+
+ parser.end('');
+
+ process.nextTick(done);
+ });
+
+ test('Regression - Parsing loop lock causes accidental hang ups (GH-101)', () => {
+ const parser = new ParserStream({ treeAdapter });
+
+ parser.on('script', (_scriptElement, _documentWrite, resume) => process.nextTick(resume));
+
+ parser.write('');
+ parser.end('dawg');
+
+ return finished(parser);
+ });
+});
diff --git a/packages/parse5-parser-stream/test/utils/parse-chunked.js b/packages/parse5-parser-stream/test/utils/parse-chunked.js
deleted file mode 100644
index 56dd120..0000000
--- a/packages/parse5-parser-stream/test/utils/parse-chunked.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const ParserStream = require('../../lib');
-const { makeChunks } = require('../../../../test/utils/common');
-
-module.exports = function parseChunked(html, opts, minChunkSize, maxChunkSize) {
- const parserStream = new ParserStream(opts);
- const chunks = makeChunks(html, minChunkSize, maxChunkSize);
-
- // NOTE: set small waterline for testing purposes
- parserStream.parser.tokenizer.preprocessor.bufferWaterline = 8;
-
- for (let i = 0; i < chunks.length - 1; i++) {
- if (typeof chunks[i] !== 'string') {
- throw new TypeError();
- }
- parserStream.write(chunks[i]);
- }
-
- parserStream.end(chunks[chunks.length - 1]);
-
- return {
- node: parserStream.document,
- chunks: chunks
- };
-};
diff --git a/packages/parse5-parser-stream/test/utils/parse-chunked.ts b/packages/parse5-parser-stream/test/utils/parse-chunked.ts
new file mode 100644
index 0000000..f219bc0
--- /dev/null
+++ b/packages/parse5-parser-stream/test/utils/parse-chunked.ts
@@ -0,0 +1,32 @@
+import type { ParserOptions, TreeAdapterTypeMap } from 'parse5';
+import { ParserStream } from '../../lib/index.js';
+import { makeChunks } from 'parse5-test-utils/utils/common.js';
+
+export function parseChunked(
+ test: { input: string; fragmentContext?: T['parentNode'] },
+ opts: ParserOptions,
+ minChunkSize?: number,
+ maxChunkSize?: number
+): { node: TreeAdapterTypeMap['document']; chunks: string[] } {
+ const parserStream = test.fragmentContext
+ ? ParserStream.getFragmentStream(test.fragmentContext, opts)
+ : new ParserStream(opts);
+ const chunks = makeChunks(test.input, minChunkSize, maxChunkSize);
+
+ // NOTE: set small waterline for testing purposes
+ parserStream.parser.tokenizer.preprocessor.bufferWaterline = 8;
+
+ for (let i = 0; i < chunks.length - 1; i++) {
+ if (typeof chunks[i] !== 'string') {
+ throw new TypeError('Expected chunk to be a string');
+ }
+ parserStream.write(chunks[i]);
+ }
+
+ parserStream.end(chunks[chunks.length - 1]);
+
+ return {
+ node: test.fragmentContext ? parserStream.getFragment() : parserStream.document,
+ chunks,
+ };
+}
diff --git a/packages/parse5-parser-stream/tsconfig.json b/packages/parse5-parser-stream/tsconfig.json
new file mode 100644
index 0000000..ebf4d81
--- /dev/null
+++ b/packages/parse5-parser-stream/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "rootDir": "lib",
+ "outDir": "dist"
+ },
+ "include": ["**/*.ts"],
+ "exclude": ["**/*.test.ts", "dist", "test"]
+}
diff --git a/packages/parse5-plain-text-conversion-stream/README.md b/packages/parse5-plain-text-conversion-stream/README.md
index 3cc6b03..ad5f645 100644
--- a/packages/parse5-plain-text-conversion-stream/README.md
+++ b/packages/parse5-plain-text-conversion-stream/README.md
@@ -15,9 +15,8 @@
-
- 📖 Documentation 📖
+ 📖 Documentation 📖
---
@@ -31,5 +30,5 @@
- Version history
+ Changelog
diff --git a/packages/parse5-plain-text-conversion-stream/docs/index.md b/packages/parse5-plain-text-conversion-stream/docs/index.md
deleted file mode 100644
index 9df2f63..0000000
--- a/packages/parse5-plain-text-conversion-stream/docs/index.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Class: PlainTextConversionStream
-
-Converts plain text files into HTML document as required by [HTML specification](https://html.spec.whatwg.org/#read-text). A [writable stream](https://nodejs.org/api/stream.html#stream_class_stream_writable).
-
-*__example__*:
-
-```js
-const PlainTextConversionStream = require('parse5-plain-text-conversion-stream');
-const fs = require('fs');
-
-const file = fs.createReadStream('war_and_peace.txt');
-const converter = new PlainTextConversionStream();
-
-converter.once('finish', () => {
- console.log(converter.document.childNodes[1].childNodes[0].tagName); //> 'head'
-});
-
-file.pipe(converter);
-```
-
-### Constructors
-
-* [constructor](#constructor)
-
-### Properties
-
-* [document](#document)
-
-### Methods and events
-
-See: [writable stream API](https://nodejs.org/api/stream.html#stream_class_stream_writable).
-
----
-
-## Constructors
-
-
-
-### constructor
-
-⊕ **new PlainTextConversionStream**(options?: *[ParserOptions](../../parse5/parser-options.md)*): [PlainTextConversionStream]()
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| `Optional` options | [ParserOptions](../../parse5/parser-options.md) | Parsing options. |
-
-**Returns:** [PlainTextConversionStream]()
-
-___
-
-## Properties
-
-
-
-### document
-
-**● document**: *Document*
-
-The resulting document node.
-
-___
diff --git a/packages/parse5-plain-text-conversion-stream/lib/index.js b/packages/parse5-plain-text-conversion-stream/lib/index.js
deleted file mode 100644
index 46b39c5..0000000
--- a/packages/parse5-plain-text-conversion-stream/lib/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict';
-
-const ParserStream = require('parse5-parser-stream');
-const $ = require('parse5/lib/common/html').TAG_NAMES;
-
-class PlainTextConversionStream extends ParserStream {
- constructor(options) {
- super(options);
-
- // NOTE: see https://html.spec.whatwg.org/#read-text
- this.parser._insertFakeElement($.HTML);
- this.parser._insertFakeElement($.HEAD);
- this.parser.openElements.pop();
- this.parser._insertFakeElement($.BODY);
- this.parser._insertFakeElement($.PRE);
- this.parser.treeAdapter.insertText(this.parser.openElements.current, '\n');
- this.parser.switchToPlaintextParsing();
- }
-}
-
-module.exports = PlainTextConversionStream;
diff --git a/packages/parse5-plain-text-conversion-stream/lib/index.ts b/packages/parse5-plain-text-conversion-stream/lib/index.ts
new file mode 100644
index 0000000..f07946e
--- /dev/null
+++ b/packages/parse5-plain-text-conversion-stream/lib/index.ts
@@ -0,0 +1,40 @@
+import { type ParserOptions, type TreeAdapterTypeMap, html } from 'parse5';
+import { ParserStream } from 'parse5-parser-stream';
+
+const { TAG_ID: $, TAG_NAMES: TN } = html;
+
+/**
+ * Converts plain text files into HTML document as required by [HTML specification](https://html.spec.whatwg.org/#read-text).
+ * A [writable stream](https://nodejs.org/api/stream.html#stream_class_stream_writable).
+ *
+ * @example
+ *
+ * ```js
+ * const PlainTextConversionStream = require('parse5-plain-text-conversion-stream');
+ * const fs = require('fs');
+ * const { finished } = require('node:stream');
+ *
+ * const file = fs.createReadStream('war_and_peace.txt');
+ * const converter = new PlainTextConversionStream();
+ *
+ * finished(converter, () => {
+ * console.log(converter.document.childNodes[1].childNodes[0].tagName); //> 'head'
+ * });
+ *
+ * file.pipe(converter);
+ * ```
+ */
+export class PlainTextConversionStream extends ParserStream {
+ constructor(options?: ParserOptions) {
+ super(options);
+
+ // NOTE: see https://html.spec.whatwg.org/#read-text
+ this.parser._insertFakeElement(TN.HTML, $.HTML);
+ this.parser._insertFakeElement(TN.HEAD, $.HEAD);
+ this.parser.openElements.pop();
+ this.parser._insertFakeElement(TN.BODY, $.BODY);
+ this.parser._insertFakeElement(TN.PRE, $.PRE);
+ this.parser.treeAdapter.insertText(this.parser.openElements.current, '\n');
+ this.parser.switchToPlaintextParsing();
+ }
+}
diff --git a/packages/parse5-plain-text-conversion-stream/package.json b/packages/parse5-plain-text-conversion-stream/package.json
index 974a0d1..9104723 100644
--- a/packages/parse5-plain-text-conversion-stream/package.json
+++ b/packages/parse5-plain-text-conversion-stream/package.json
@@ -1,10 +1,12 @@
{
"name": "parse5-plain-text-conversion-stream",
+ "type": "module",
"description": "Stream that converts plain text files into HTML document.",
- "version": "6.0.1",
+ "version": "7.0.0",
"author": "Ivan Nikulin (https://github.com/inikulin)",
"contributors": "https://github.com/inikulin/parse5/graphs/contributors",
"homepage": "https://github.com/inikulin/parse5",
+ "funding": "https://github.com/inikulin/parse5?sponsor=1",
"keywords": [
"parse5",
"parser",
@@ -15,16 +17,20 @@
"plain text"
],
"license": "MIT",
- "main": "./lib/index.js",
+ "main": "dist/index.js",
+ "module": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "exports": "./dist/index.js",
"dependencies": {
- "parse5": "^6.0.1",
- "parse5-parser-stream": "^6.0.1"
+ "parse5": "^7.0.0",
+ "parse5-parser-stream": "^7.0.0"
},
"repository": {
"type": "git",
"url": "git://github.com/inikulin/parse5.git"
},
"files": [
- "lib"
+ "dist",
+ "!*.map"
]
}
diff --git a/packages/parse5-plain-text-conversion-stream/test/plain-text-conversion-stream.test.js b/packages/parse5-plain-text-conversion-stream/test/plain-text-conversion-stream.test.ts
similarity index 35%
rename from packages/parse5-plain-text-conversion-stream/test/plain-text-conversion-stream.test.js
rename to packages/parse5-plain-text-conversion-stream/test/plain-text-conversion-stream.test.ts
index 47a981c..da8e282 100644
--- a/packages/parse5-plain-text-conversion-stream/test/plain-text-conversion-stream.test.js
+++ b/packages/parse5-plain-text-conversion-stream/test/plain-text-conversion-stream.test.ts
@@ -1,31 +1,31 @@
-'use strict';
+import * as assert from 'node:assert';
+import { serialize } from 'parse5';
+import { PlainTextConversionStream } from '../lib/index.js';
+import { generateTestsForEachTreeAdapter } from 'parse5-test-utils/utils/common.js';
-const assert = require('assert');
-const parse5 = require('parse5');
-const PlainTextConversionStream = require('../lib');
-const { generateTestsForEachTreeAdapter } = require('../../../test/utils/common');
-
-generateTestsForEachTreeAdapter(module.exports, (_test, treeAdapter) => {
- _test['Plain text conversion stream'] = function() {
- const converter = new PlainTextConversionStream({ treeAdapter: treeAdapter });
+generateTestsForEachTreeAdapter('plain-test-conversion-stream', (treeAdapter) => {
+ it('Plain text conversion stream', () => {
+ const converter = new PlainTextConversionStream({ treeAdapter });
converter.write('Hey');
converter.write('\r\nyo');
converter.write('\u0000');
converter.end('');
- const result = parse5.serialize(converter.document, { treeAdapter: treeAdapter });
+ const result = serialize(converter.document, { treeAdapter });
assert.strictEqual(
result,
'\nHey\nyo\uFFFD<html><head><body>
'
);
- };
+ });
});
-exports['Regression - Plain text conversion stream - Should not accept binary input (GH-269)'] = () => {
- const stream = new PlainTextConversionStream();
- const buf = Buffer.from('test');
+describe('plain-text-conversion-stream', () => {
+ it('Should not accept binary input (GH-269)', () => {
+ const stream = new PlainTextConversionStream();
+ const buf = Buffer.from('test');
- assert.throws(() => stream.write(buf), TypeError);
-};
+ assert.throws(() => stream.write(buf), TypeError);
+ });
+});
diff --git a/packages/parse5-plain-text-conversion-stream/tsconfig.json b/packages/parse5-plain-text-conversion-stream/tsconfig.json
new file mode 100644
index 0000000..ebf4d81
--- /dev/null
+++ b/packages/parse5-plain-text-conversion-stream/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "rootDir": "lib",
+ "outDir": "dist"
+ },
+ "include": ["**/*.ts"],
+ "exclude": ["**/*.test.ts", "dist", "test"]
+}
diff --git a/packages/parse5-sax-parser/README.md b/packages/parse5-sax-parser/README.md
index d695faf..d59744a 100644
--- a/packages/parse5-sax-parser/README.md
+++ b/packages/parse5-sax-parser/README.md
@@ -16,7 +16,7 @@
- 📖 Documentation 📖
+ 📖 Documentation 📖
---
@@ -30,5 +30,5 @@
- Version history
+ Changelog
diff --git a/packages/parse5-sax-parser/docs/index.md b/packages/parse5-sax-parser/docs/index.md
deleted file mode 100644
index a089a95..0000000
--- a/packages/parse5-sax-parser/docs/index.md
+++ /dev/null
@@ -1,198 +0,0 @@
-# Class: SAXParser
-
-Streaming [SAX](https://en.wikipedia.org/wiki/Simple_API_for_XML)-style HTML parser. A [transform stream](https://nodejs.org/api/stream.html#stream_class_stream_transform) (which means you can pipe _through_ it, see example).
-
-*__example__*:
-
-```js
- const SAXParser = require('parse5-sax-parser');
- const http = require('http');
- const fs = require('fs');
-
- const file = fs.createWriteStream('/home/google.com.html');
- const parser = new SAXParser();
-
- parser.on('text', text => {
- // Handle page text content
- ...
- });
-
- http.get('http://google.com', res => {
- // SAXParser is the Transform stream, which means you can pipe
- // through it. So, you can analyze page content and, e.g., save it
- // to the file at the same time:
- res.pipe(parser).pipe(file);
- });
-```
-
-### Constructors
-
-* [constructor](#constructor)
-
-### Methods
-
-* [stop](#stop)
-
-See also: [transform stream API](https://nodejs.org/api/stream.html#stream_class_stream_transform).
-
-### Events
-
-* [on("startTag")](#on_startag)
-* [on("endTag")](#on_startag)
-* [on("comment")](#on_comment)
-* [on("text")](#on_text)
-* [on("doctype")](#on_doctype)
-
-See also: [transform stream API](https://nodejs.org/api/stream.html#stream_class_stream_transform).
-
----
-
-## Constructors
-
-
-
-### constructor
-
-⊕ **new SAXParser**(options?: *[SAXParserOptions](sax-parser-options.md)*): [SAXParser]()
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| `Optional` options | [SAXParserOptions](sax-parser-options.md) | Parsing options. |
-
-**Returns:** [SAXParser]()
-
-___
-
-
-## Methods
-
-
-
-
-### stop
-
-▸ **stop**(): `void`
-
-Stops parsing. Useful if you want the parser to stop consuming CPU time once you've obtained the desired info from the input stream. Doesn't prevent piping, so that data will flow through the parser as usual.
-
-*__example__*:
-
-```js
-const SAXParser = require('parse5-sax-parser');
-const http = require('http');
-const fs = require('fs');
-
-const file = fs.createWriteStream('google.com.html');
-const parser = new SAXParser();
-
-parser.on('doctype', ({ name, publicId, systemId }) => {
- // Process doctype info and stop parsing
- ...
- parser.stop();
-});
-
-http.get('http://google.com', res => {
- // Despite the fact that parser.stop() was called whole
- // content of the page will be written to the file
- res.pipe(parser).pipe(file);
-});
-```
-
-**Returns:** `void`
-
-___
-
-## Events
-
-
-
-### on("startTag")
-
-▸ **on**(event: *"startTag"*, listener: *`function`*): `this`
-
-Raised when the parser encounters a start tag.
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "startTag" |
-| listener | function (startTag: *[StartTagToken](./tokens/start-tag.md)*) |
-
-**Returns:** `this`
-
-___
-
-
-### on("endTag")
-
-▸ **on**(event: *"endTag"*, listener: *`function`*): `this`
-
-Raised when parser encounters an end tag.
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "endTag" |
-| listener | function (endTag: *[EndTagToken](./tokens/end-tag.md)*) |
-
-**Returns:** `this`
-
-___
-
-
-### on("comment")
-
-▸ **on**(event: *"comment"*, listener: *`function`*): `this`
-
-Raised when parser encounters a comment.
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "comment" |
-| listener | function (comment: *[CommentToken](./tokens/comment.md)*) |
-
-**Returns:** `this`
-
-___
-
-
-### on("text")
-
-▸ **on**(event: *"text"*, listener: *`function`*): `this`
-
-Raised when parser encounters text content.
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "text" |
-| listener | function (text: *[TextToken](./tokens/text.md)*)|
-
-**Returns:** `this`
-
-___
-
-
-### on("doctype")
-
-▸ **on**(event: *"doctype"*, listener: *`function`*): `this`
-
-Raised when parser encounters a [document type declaration](https://en.wikipedia.org/wiki/Document_type_declaration).
-
-**Parameters:**
-
-| Param | Type |
-| ------ | ------ |
-| event | "doctype" |
-| listener | function (doctype: *[DoctypeToken](./tokens/doctype.md)*) |
-
-**Returns:** `this`
-
-___
diff --git a/packages/parse5-sax-parser/docs/sax-parser-options.md b/packages/parse5-sax-parser/docs/sax-parser-options.md
deleted file mode 100644
index 25afc41..0000000
--- a/packages/parse5-sax-parser/docs/sax-parser-options.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Interface: SAXParserOptions
-
-### Properties
-
-* [sourceCodeLocationInfo](#locationinfo)
-
----
-
-## Properties
-
-
-
-### `` sourceCodeLocationInfo
-
-**● sourceCodeLocationInfo**: *`boolean`*
-
-Enables source code location information for the tokens. When enabled, each token will have
-`sourceCodeLocation` property.
-
-___
diff --git a/packages/parse5-sax-parser/docs/tokens/comment.md b/packages/parse5-sax-parser/docs/tokens/comment.md
deleted file mode 100644
index bb0d562..0000000
--- a/packages/parse5-sax-parser/docs/tokens/comment.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Interface: CommentToken
-
-### Properties
-
-* [text](#text)
-* [sourceCodeLocation](#sourcecodelocation)
-
----
-
-## Properties
-
-
-
-### text
-
-**● text**: *`string`*
-
-Comment text
-
-___
-
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[Location](../../../parse5/docs/source-code-location/location.md)*
-
-Comment source code location info. Available if location info is enabled via [SAXParserOptions](../sax-parser-options.md)
-
-___
diff --git a/packages/parse5-sax-parser/docs/tokens/doctype.md b/packages/parse5-sax-parser/docs/tokens/doctype.md
deleted file mode 100644
index 3a2df7f..0000000
--- a/packages/parse5-sax-parser/docs/tokens/doctype.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Interface: DoctypeToken
-
-### Properties
-
-* [name](#name)
-* [publicId](#publicid)
-* [systemId](#systemid)
-* [sourceCodeLocation](#sourcecodelocation)
-
----
-
-## Properties
-
-
-
-### name
-
-**● name**: *`string`*
-
-Document type name.
-
-___
-
-
-### publicId
-
-**● publicId**: *`string`*
-
-Document type public identifier.
-
-___
-
-
-### systemId
-
-**● systemId**: *`string`*
-
-Document type system identifier.
-
-___
-
-
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[Location](../../../parse5/docs/source-code-location/location.md)*
-
-Text content source code location info. Available if location info is enabled via [SAXParserOptions](../sax-parser-options.md)
-
-___
diff --git a/packages/parse5-sax-parser/docs/tokens/end-tag.md b/packages/parse5-sax-parser/docs/tokens/end-tag.md
deleted file mode 100644
index 7c6d012..0000000
--- a/packages/parse5-sax-parser/docs/tokens/end-tag.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Interface: EndTagToken
-
-### Properties
-
-* [sourceCodeLocation](#sourcecodelocation)
-* [tagName](#tagname)
-
----
-
-## Properties
-
-
-
-### tagName
-
-**● tagName**: *`string`*
-
-Tag name
-
-___
-
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[Location](../../../parse5/docs/source-code-location/location.md)*
-
-End tag source code location info. Available if location info is enabled via [SAXParserOptions](../sax-parser-options.md)
-
-___
diff --git a/packages/parse5-sax-parser/docs/tokens/start-tag.md b/packages/parse5-sax-parser/docs/tokens/start-tag.md
deleted file mode 100644
index fd42f46..0000000
--- a/packages/parse5-sax-parser/docs/tokens/start-tag.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Interface: StartTagToken
-
-### Properties
-
-* [attrs](#attrs)
-* [selfClosing](#selfclosing)
-* [sourceCodeLocation](#sourcecodelocation)
-* [tagName](#tagname)
-
----
-
-## Properties
-
-
-
-### attrs
-
-**● attrs**: *Attribute*[]
-
-List of attributes
-
-___
-
-
-### tagName
-
-**● tagName**: *`string`*
-
-Tag name
-
-___
-
-
-### selfClosing
-
-**● selfClosing**: *`boolean`*
-
-Indicates if the tag is self-closing
-
-___
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[StartTagLocation](../../../parse5/docs/source-code-location/start-tag-location.md)*
-
-Start tag source code location info. Available if location info is enabled via [SAXParserOptions](../sax-parser-options.md)
-
-___
diff --git a/packages/parse5-sax-parser/docs/tokens/text.md b/packages/parse5-sax-parser/docs/tokens/text.md
deleted file mode 100644
index ea58eb9..0000000
--- a/packages/parse5-sax-parser/docs/tokens/text.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Interface: TextToken
-
-### Properties
-
-* [text](#text)
-* [sourceCodeLocation](#sourcecodelocation)
-
----
-
-## Properties
-
-
-
-### text
-
-**● text**: *`string`*
-
-Text content
-
-___
-
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[Location](../../../parse5/docs/source-code-location/location.md)*
-
-Text content source code location info. Available if location info is enabled via [SAXParserOptions](../sax-parser-options.md)
-
-___
diff --git a/packages/parse5-sax-parser/lib/dev-null-stream.js b/packages/parse5-sax-parser/lib/dev-null-stream.js
deleted file mode 100644
index 95661c4..0000000
--- a/packages/parse5-sax-parser/lib/dev-null-stream.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-
-const { Writable } = require('stream');
-
-class DevNullStream extends Writable {
- _write(chunk, encoding, cb) {
- cb();
- }
-}
-
-module.exports = DevNullStream;
diff --git a/packages/parse5-sax-parser/lib/dev-null-stream.ts b/packages/parse5-sax-parser/lib/dev-null-stream.ts
new file mode 100644
index 0000000..c734513
--- /dev/null
+++ b/packages/parse5-sax-parser/lib/dev-null-stream.ts
@@ -0,0 +1,7 @@
+import { Writable } from 'node:stream';
+
+export class DevNullStream extends Writable {
+ override _write(_chunk: string, _encoding: string, cb: () => void): void {
+ cb();
+ }
+}
diff --git a/packages/parse5-sax-parser/lib/index.js b/packages/parse5-sax-parser/lib/index.js
deleted file mode 100644
index cbdd582..0000000
--- a/packages/parse5-sax-parser/lib/index.js
+++ /dev/null
@@ -1,166 +0,0 @@
-'use strict';
-
-const { Transform } = require('stream');
-const Tokenizer = require('parse5/lib/tokenizer');
-const LocationInfoTokenizerMixin = require('parse5/lib/extensions/location-info/tokenizer-mixin');
-const Mixin = require('parse5/lib/utils/mixin');
-const mergeOptions = require('parse5/lib/utils/merge-options');
-const DevNullStream = require('./dev-null-stream');
-const ParserFeedbackSimulator = require('./parser-feedback-simulator');
-
-const DEFAULT_OPTIONS = {
- sourceCodeLocationInfo: false
-};
-
-class SAXParser extends Transform {
- constructor(options) {
- super({ encoding: 'utf8', decodeStrings: false });
-
- this.options = mergeOptions(DEFAULT_OPTIONS, options);
-
- this.tokenizer = new Tokenizer(options);
- this.locInfoMixin = null;
-
- if (this.options.sourceCodeLocationInfo) {
- this.locInfoMixin = Mixin.install(this.tokenizer, LocationInfoTokenizerMixin);
- }
-
- this.parserFeedbackSimulator = new ParserFeedbackSimulator(this.tokenizer);
-
- this.pendingText = null;
-
- this.lastChunkWritten = false;
- this.stopped = false;
-
- // NOTE: always pipe stream to the /dev/null stream to avoid
- // `highWaterMark` hit even if we don't have consumers.
- // (see: https://github.com/inikulin/parse5/issues/97#issuecomment-171940774)
- this.pipe(new DevNullStream());
- }
-
- //TransformStream implementation
- _transform(chunk, encoding, callback) {
- if (typeof chunk !== 'string') {
- throw new TypeError('Parser can work only with string streams.');
- }
-
- callback(null, this._transformChunk(chunk));
- }
-
- _final(callback) {
- this.lastChunkWritten = true;
- callback(null, this._transformChunk(''));
- }
-
- stop() {
- this.stopped = true;
- }
-
- //Internals
- _transformChunk(chunk) {
- if (!this.stopped) {
- this.tokenizer.write(chunk, this.lastChunkWritten);
- this._runParsingLoop();
- }
- return chunk;
- }
-
- _runParsingLoop() {
- let token = null;
-
- do {
- token = this.parserFeedbackSimulator.getNextToken();
-
- if (token.type === Tokenizer.HIBERNATION_TOKEN) {
- break;
- }
-
- if (
- token.type === Tokenizer.CHARACTER_TOKEN ||
- token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN ||
- token.type === Tokenizer.NULL_CHARACTER_TOKEN
- ) {
- if (this.pendingText === null) {
- token.type = Tokenizer.CHARACTER_TOKEN;
- this.pendingText = token;
- } else {
- this.pendingText.chars += token.chars;
-
- if (this.options.sourceCodeLocationInfo) {
- const { endLine, endCol, endOffset } = token.location;
- Object.assign(this.pendingText.location, {
- endLine,
- endCol,
- endOffset
- });
- }
- }
- } else {
- this._emitPendingText();
- this._handleToken(token);
- }
- } while (!this.stopped && token.type !== Tokenizer.EOF_TOKEN);
- }
-
- _handleToken(token) {
- if (token.type === Tokenizer.EOF_TOKEN) {
- return true;
- }
-
- const { eventName, reshapeToken } = TOKEN_EMISSION_HELPERS[token.type];
-
- if (this.listenerCount(eventName) === 0) {
- return false;
- }
-
- this._emitToken(eventName, reshapeToken(token));
-
- return true;
- }
-
- _emitToken(eventName, token) {
- this.emit(eventName, token);
- }
-
- _emitPendingText() {
- if (this.pendingText !== null) {
- this._handleToken(this.pendingText);
- this.pendingText = null;
- }
- }
-}
-
-const TOKEN_EMISSION_HELPERS = {
- [Tokenizer.START_TAG_TOKEN]: {
- eventName: 'startTag',
- reshapeToken: origToken => ({
- tagName: origToken.tagName,
- attrs: origToken.attrs,
- selfClosing: origToken.selfClosing,
- sourceCodeLocation: origToken.location
- })
- },
- [Tokenizer.END_TAG_TOKEN]: {
- eventName: 'endTag',
- reshapeToken: origToken => ({ tagName: origToken.tagName, sourceCodeLocation: origToken.location })
- },
- [Tokenizer.COMMENT_TOKEN]: {
- eventName: 'comment',
- reshapeToken: origToken => ({ text: origToken.data, sourceCodeLocation: origToken.location })
- },
- [Tokenizer.DOCTYPE_TOKEN]: {
- eventName: 'doctype',
- reshapeToken: origToken => ({
- name: origToken.name,
- publicId: origToken.publicId,
- systemId: origToken.systemId,
- sourceCodeLocation: origToken.location
- })
- },
- [Tokenizer.CHARACTER_TOKEN]: {
- eventName: 'text',
- reshapeToken: origToken => ({ text: origToken.chars, sourceCodeLocation: origToken.location })
- }
-};
-
-module.exports = SAXParser;
diff --git a/packages/parse5-sax-parser/lib/index.ts b/packages/parse5-sax-parser/lib/index.ts
new file mode 100644
index 0000000..8b51209
--- /dev/null
+++ b/packages/parse5-sax-parser/lib/index.ts
@@ -0,0 +1,294 @@
+import { Transform } from 'node:stream';
+import type { Tokenizer, TokenHandler, Token } from 'parse5';
+import { DevNullStream } from './dev-null-stream.js';
+import { ParserFeedbackSimulator } from './parser-feedback-simulator.js';
+
+export interface SAXParserOptions {
+ /**
+ * Enables source code location information for tokens.
+ *
+ * When enabled, each token will have a `sourceCodeLocation` property.
+ */
+ sourceCodeLocationInfo?: boolean;
+}
+
+/**
+ * Streaming [SAX](https://en.wikipedia.org/wiki/Simple_API_for_XML)-style HTML parser.
+ * A [transform stream](https://nodejs.org/api/stream.html#stream_class_stream_transform) (which means you can pipe _through_ it, see example).
+ *
+ * @example
+ *
+ * ```js
+ * const SAXParser = require('parse5-sax-parser');
+ * const http = require('http');
+ * const fs = require('fs');
+ *
+ * const file = fs.createWriteStream('/home/google.com.html');
+ * const parser = new SAXParser();
+ *
+ * parser.on('text', text => {
+ * // Handle page text content
+ * ...
+ * });
+ *
+ * http.get('http://google.com', res => {
+ * // `SAXParser` is the `Transform` stream, which means you can pipe
+ * // through it. So, you can analyze the page content and, e.g., save it
+ * // to the file at the same time:
+ * res.pipe(parser).pipe(file);
+ * });
+ * ```
+ */
+export class SAXParser extends Transform implements TokenHandler {
+ protected options: SAXParserOptions;
+ protected parserFeedbackSimulator: ParserFeedbackSimulator;
+ private pendingText: Text | null = null;
+ private lastChunkWritten = false;
+ private stopped = false;
+ protected tokenizer: Tokenizer;
+
+ /**
+ * @param options Parsing options.
+ */
+ constructor(options: SAXParserOptions = {}) {
+ super({ encoding: 'utf8', decodeStrings: false });
+
+ this.options = {
+ sourceCodeLocationInfo: false,
+ ...options,
+ };
+
+ this.parserFeedbackSimulator = new ParserFeedbackSimulator(this.options, this);
+ this.tokenizer = this.parserFeedbackSimulator.tokenizer;
+
+ // NOTE: always pipe the stream to the /dev/null stream to avoid
+ // the `highWaterMark` to be hit even if we don't have consumers.
+ // (see: https://github.com/inikulin/parse5/issues/97#issuecomment-171940774)
+ this.pipe(new DevNullStream());
+ }
+
+ //`Transform` implementation
+ override _transform(
+ chunk: string,
+ _encoding: string,
+ callback: (error?: Error | null, data?: string) => void
+ ): void {
+ if (typeof chunk !== 'string') {
+ throw new TypeError('Parser can work only with string streams.');
+ }
+
+ callback(null, this._transformChunk(chunk));
+ }
+
+ override _final(callback: (error?: Error | null, data?: string) => void): void {
+ this.lastChunkWritten = true;
+ callback(null, this._transformChunk(''));
+ }
+
+ /**
+ * Stops parsing. Useful if you want the parser to stop consuming CPU time
+ * once you've obtained the desired info from the input stream. Doesn't
+ * prevent piping, so that data will flow through the parser as usual.
+ *
+ * @example
+ *
+ * ```js
+ * const SAXParser = require('parse5-sax-parser');
+ * const http = require('http');
+ * const fs = require('fs');
+ *
+ * const file = fs.createWriteStream('google.com.html');
+ * const parser = new SAXParser();
+ *
+ * parser.on('doctype', ({ name, publicId, systemId }) => {
+ * // Process doctype info and stop parsing
+ * ...
+ * parser.stop();
+ * });
+ *
+ * http.get('http://google.com', res => {
+ * // Despite the fact that parser.stop() was called whole
+ * // content of the page will be written to the file
+ * res.pipe(parser).pipe(file);
+ * });
+ * ```
+ */
+ public stop(): void {
+ this.stopped = true;
+ this.tokenizer.pause();
+ }
+
+ //Internals
+ protected _transformChunk(chunk: string): string {
+ if (!this.stopped) {
+ this.tokenizer.write(chunk, this.lastChunkWritten);
+ }
+ return chunk;
+ }
+
+ /** @internal */
+ onCharacter({ chars, location }: Token.CharacterToken): void {
+ if (this.pendingText === null) {
+ this.pendingText = { text: chars, sourceCodeLocation: location };
+ } else {
+ this.pendingText.text += chars;
+
+ if (location && this.pendingText.sourceCodeLocation) {
+ const { endLine, endCol, endOffset } = location;
+ this.pendingText.sourceCodeLocation = {
+ ...this.pendingText.sourceCodeLocation,
+ endLine,
+ endCol,
+ endOffset,
+ };
+ }
+ }
+
+ if (this.tokenizer.preprocessor.willDropParsedChunk()) {
+ this._emitPendingText();
+ }
+ }
+
+ /** @internal */
+ onWhitespaceCharacter(token: Token.CharacterToken): void {
+ this.onCharacter(token);
+ }
+
+ /** @internal */
+ onNullCharacter(token: Token.CharacterToken): void {
+ this.onCharacter(token);
+ }
+
+ /** @internal */
+ onEof(): void {
+ this._emitPendingText();
+ this.stopped = true;
+ }
+
+ /** @internal */
+ onStartTag(token: Token.TagToken): void {
+ this._emitPendingText();
+
+ const startTag: StartTag = {
+ tagName: token.tagName,
+ attrs: token.attrs,
+ selfClosing: token.selfClosing,
+ sourceCodeLocation: token.location,
+ };
+ this.emitIfListenerExists('startTag', startTag);
+ }
+
+ /** @internal */
+ onEndTag(token: Token.TagToken): void {
+ this._emitPendingText();
+
+ const endTag: EndTag = {
+ tagName: token.tagName,
+ sourceCodeLocation: token.location,
+ };
+ this.emitIfListenerExists('endTag', endTag);
+ }
+
+ /** @internal */
+ onDoctype(token: Token.DoctypeToken): void {
+ this._emitPendingText();
+
+ const doctype: Doctype = {
+ name: token.name,
+ publicId: token.publicId,
+ systemId: token.systemId,
+ sourceCodeLocation: token.location,
+ };
+ this.emitIfListenerExists('doctype', doctype);
+ }
+
+ /** @internal */
+ onComment(token: Token.CommentToken): void {
+ this._emitPendingText();
+
+ const comment: Comment = {
+ text: token.data,
+ sourceCodeLocation: token.location,
+ };
+ this.emitIfListenerExists('comment', comment);
+ }
+
+ protected emitIfListenerExists(eventName: string, token: SaxToken): boolean {
+ if (this.listenerCount(eventName) === 0) {
+ return false;
+ }
+
+ this._emitToken(eventName, token);
+
+ return true;
+ }
+
+ protected _emitToken(eventName: string, token: SaxToken): void {
+ this.emit(eventName, token);
+ }
+
+ private _emitPendingText(): void {
+ if (this.pendingText !== null) {
+ this.emitIfListenerExists('text', this.pendingText);
+ this.pendingText = null;
+ }
+ }
+}
+
+export interface SaxToken {
+ /** Source code location info. Available if location info is enabled via {@link SAXParserOptions}. */
+ sourceCodeLocation?: Token.Location | null;
+}
+
+export interface StartTag extends SaxToken {
+ /** Tag name */
+ tagName: string;
+ /** List of attributes */
+ attrs: Token.Attribute[];
+ /** Indicates if the tag is self-closing */
+ selfClosing: boolean;
+}
+
+export interface EndTag extends SaxToken {
+ /** Tag name */
+ tagName: string;
+}
+
+export interface Text extends SaxToken {
+ /** Text content. */
+ text: string;
+}
+
+export interface Comment extends SaxToken {
+ /** Comment text. */
+ text: string;
+}
+
+export interface Doctype extends SaxToken {
+ /** Document type name. */
+ name: string | null;
+ /** Document type public identifier. */
+ publicId: string | null;
+ /** Document type system identifier. */
+ systemId: string | null;
+}
+
+export interface SAXParser {
+ /** Raised when the parser encounters a start tag. */
+ on(event: 'startTag', listener: (startTag: StartTag) => void): this;
+ /** Raised when the parser encounters an end tag. */
+ on(event: 'endTag', listener: (endTag: EndTag) => void): this;
+ /** Raised when the parser encounters a comment. */
+ on(event: 'comment', listener: (comment: Comment) => void): this;
+ /** Raised when the parser encounters text content. */
+ on(event: 'text', listener: (text: Text) => void): this;
+ /** Raised when the parser encounters a [document type declaration](https://en.wikipedia.org/wiki/Document_type_declaration) */
+ on(event: 'doctype', listener: (doctype: Doctype) => void): this;
+ /**
+ * Base event handler.
+ *
+ * @param event Name of the event
+ * @param handler Event handler
+ */
+ on(event: string, handler: (...args: any[]) => void): this;
+}
diff --git a/packages/parse5-sax-parser/lib/parser-feedback-simulator.js b/packages/parse5-sax-parser/lib/parser-feedback-simulator.js
deleted file mode 100644
index 3f3a29d..0000000
--- a/packages/parse5-sax-parser/lib/parser-feedback-simulator.js
+++ /dev/null
@@ -1,159 +0,0 @@
-'use strict';
-
-const Tokenizer = require('parse5/lib/tokenizer');
-const foreignContent = require('parse5/lib/common/foreign-content');
-const unicode = require('parse5/lib/common/unicode');
-const HTML = require('parse5/lib/common/html');
-
-//Aliases
-const $ = HTML.TAG_NAMES;
-const NS = HTML.NAMESPACES;
-
-//ParserFeedbackSimulator
-//Simulates adjustment of the Tokenizer which performed by standard parser during tree construction.
-class ParserFeedbackSimulator {
- constructor(tokenizer) {
- this.tokenizer = tokenizer;
-
- this.namespaceStack = [];
- this.namespaceStackTop = -1;
- this._enterNamespace(NS.HTML);
- }
-
- getNextToken() {
- const token = this.tokenizer.getNextToken();
-
- if (token.type === Tokenizer.START_TAG_TOKEN) {
- this._handleStartTagToken(token);
- } else if (token.type === Tokenizer.END_TAG_TOKEN) {
- this._handleEndTagToken(token);
- } else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN && this.inForeignContent) {
- token.type = Tokenizer.CHARACTER_TOKEN;
- token.chars = unicode.REPLACEMENT_CHARACTER;
- } else if (this.skipNextNewLine) {
- if (token.type !== Tokenizer.HIBERNATION_TOKEN) {
- this.skipNextNewLine = false;
- }
-
- if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') {
- if (token.chars.length === 1) {
- return this.getNextToken();
- }
-
- token.chars = token.chars.substr(1);
- }
- }
-
- return token;
- }
-
- //Namespace stack mutations
- _enterNamespace(namespace) {
- this.namespaceStackTop++;
- this.namespaceStack.push(namespace);
-
- this.inForeignContent = namespace !== NS.HTML;
- this.currentNamespace = namespace;
- this.tokenizer.allowCDATA = this.inForeignContent;
- }
-
- _leaveCurrentNamespace() {
- this.namespaceStackTop--;
- this.namespaceStack.pop();
-
- this.currentNamespace = this.namespaceStack[this.namespaceStackTop];
- this.inForeignContent = this.currentNamespace !== NS.HTML;
- this.tokenizer.allowCDATA = this.inForeignContent;
- }
-
- //Token handlers
- _ensureTokenizerMode(tn) {
- if (tn === $.TEXTAREA || tn === $.TITLE) {
- this.tokenizer.state = Tokenizer.MODE.RCDATA;
- } else if (tn === $.PLAINTEXT) {
- this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
- } else if (tn === $.SCRIPT) {
- this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
- } else if (
- tn === $.STYLE ||
- tn === $.IFRAME ||
- tn === $.XMP ||
- tn === $.NOEMBED ||
- tn === $.NOFRAMES ||
- tn === $.NOSCRIPT
- ) {
- this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
- }
- }
-
- _handleStartTagToken(token) {
- let tn = token.tagName;
-
- if (tn === $.SVG) {
- this._enterNamespace(NS.SVG);
- } else if (tn === $.MATH) {
- this._enterNamespace(NS.MATHML);
- }
-
- if (this.inForeignContent) {
- if (foreignContent.causesExit(token)) {
- this._leaveCurrentNamespace();
- return;
- }
-
- const currentNs = this.currentNamespace;
-
- if (currentNs === NS.MATHML) {
- foreignContent.adjustTokenMathMLAttrs(token);
- } else if (currentNs === NS.SVG) {
- foreignContent.adjustTokenSVGTagName(token);
- foreignContent.adjustTokenSVGAttrs(token);
- }
-
- foreignContent.adjustTokenXMLAttrs(token);
-
- tn = token.tagName;
-
- if (!token.selfClosing && foreignContent.isIntegrationPoint(tn, currentNs, token.attrs)) {
- this._enterNamespace(NS.HTML);
- }
- } else {
- if (tn === $.PRE || tn === $.TEXTAREA || tn === $.LISTING) {
- this.skipNextNewLine = true;
- } else if (tn === $.IMAGE) {
- token.tagName = $.IMG;
- }
-
- this._ensureTokenizerMode(tn);
- }
- }
-
- _handleEndTagToken(token) {
- let tn = token.tagName;
-
- if (!this.inForeignContent) {
- const previousNs = this.namespaceStack[this.namespaceStackTop - 1];
-
- if (previousNs === NS.SVG && foreignContent.SVG_TAG_NAMES_ADJUSTMENT_MAP[tn]) {
- tn = foreignContent.SVG_TAG_NAMES_ADJUSTMENT_MAP[tn];
- }
-
- //NOTE: check for exit from integration point
- if (foreignContent.isIntegrationPoint(tn, previousNs, token.attrs)) {
- this._leaveCurrentNamespace();
- }
- } else if (
- (tn === $.SVG && this.currentNamespace === NS.SVG) ||
- (tn === $.MATH && this.currentNamespace === NS.MATHML)
- ) {
- this._leaveCurrentNamespace();
- }
-
- // NOTE: adjust end tag name as well for consistency
- if (this.currentNamespace === NS.SVG) {
- foreignContent.adjustTokenSVGTagName(token);
- }
- }
-}
-
-module.exports = ParserFeedbackSimulator;
diff --git a/packages/parse5-sax-parser/lib/parser-feedback-simulator.ts b/packages/parse5-sax-parser/lib/parser-feedback-simulator.ts
new file mode 100644
index 0000000..116637d
--- /dev/null
+++ b/packages/parse5-sax-parser/lib/parser-feedback-simulator.ts
@@ -0,0 +1,221 @@
+import {
+ Tokenizer,
+ type TokenizerOptions,
+ TokenizerMode,
+ type TokenHandler,
+ Token,
+ foreignContent,
+ html,
+} from 'parse5';
+
+const $ = html.TAG_ID;
+
+const REPLACEMENT_CHARACTER = '\uFFFD';
+const LINE_FEED_CODE_POINT = 0x0a;
+
+/**
+ * Simulates adjustments of the Tokenizer which are performed by the standard parser during tree construction.
+ */
+export class ParserFeedbackSimulator implements TokenHandler {
+ private namespaceStack: html.NS[] = [];
+ public inForeignContent = false;
+ public skipNextNewLine = false;
+ public tokenizer: Tokenizer;
+
+ constructor(options: TokenizerOptions, private handler: TokenHandler) {
+ this.tokenizer = new Tokenizer(options, this);
+ this._enterNamespace(html.NS.HTML);
+ }
+
+ /** @internal */
+ onNullCharacter(token: Token.CharacterToken): void {
+ this.skipNextNewLine = false;
+
+ if (this.inForeignContent) {
+ this.handler.onCharacter({
+ type: Token.TokenType.CHARACTER,
+ chars: REPLACEMENT_CHARACTER,
+ location: token.location,
+ });
+ } else {
+ this.handler.onNullCharacter(token);
+ }
+ }
+
+ /** @internal */
+ onWhitespaceCharacter(token: Token.CharacterToken): void {
+ if (this.skipNextNewLine && token.chars.charCodeAt(0) === LINE_FEED_CODE_POINT) {
+ this.skipNextNewLine = false;
+
+ if (token.chars.length === 1) {
+ return;
+ }
+
+ token.chars = token.chars.substr(1);
+ }
+
+ this.handler.onWhitespaceCharacter(token);
+ }
+
+ /** @internal */
+ onCharacter(token: Token.CharacterToken): void {
+ this.skipNextNewLine = false;
+ this.handler.onCharacter(token);
+ }
+
+ /** @internal */
+ onComment(token: Token.CommentToken): void {
+ this.skipNextNewLine = false;
+ this.handler.onComment(token);
+ }
+
+ /** @internal */
+ onDoctype(token: Token.DoctypeToken): void {
+ this.skipNextNewLine = false;
+ this.handler.onDoctype(token);
+ }
+
+ /** @internal */
+ onEof(token: Token.EOFToken): void {
+ this.skipNextNewLine = false;
+ this.handler.onEof(token);
+ }
+
+ //Namespace stack mutations
+ private _enterNamespace(namespace: html.NS): void {
+ this.namespaceStack.unshift(namespace);
+ this.inForeignContent = namespace !== html.NS.HTML;
+ this.tokenizer.inForeignNode = this.inForeignContent;
+ }
+
+ private _leaveCurrentNamespace(): void {
+ this.namespaceStack.shift();
+ this.inForeignContent = this.namespaceStack[0] !== html.NS.HTML;
+ this.tokenizer.inForeignNode = this.inForeignContent;
+ }
+
+ //Token handlers
+ private _ensureTokenizerMode(tn: html.TAG_ID): void {
+ switch (tn) {
+ case $.TEXTAREA:
+ case $.TITLE: {
+ this.tokenizer.state = TokenizerMode.RCDATA;
+ break;
+ }
+ case $.PLAINTEXT: {
+ this.tokenizer.state = TokenizerMode.PLAINTEXT;
+ break;
+ }
+ case $.SCRIPT: {
+ this.tokenizer.state = TokenizerMode.SCRIPT_DATA;
+ break;
+ }
+ case $.STYLE:
+ case $.IFRAME:
+ case $.XMP:
+ case $.NOEMBED:
+ case $.NOFRAMES:
+ case $.NOSCRIPT: {
+ this.tokenizer.state = TokenizerMode.RAWTEXT;
+ break;
+ }
+ default:
+ // Do nothing
+ }
+ }
+
+ /** @internal */
+ onStartTag(token: Token.TagToken): void {
+ let tn = token.tagID;
+
+ switch (tn) {
+ case $.SVG: {
+ this._enterNamespace(html.NS.SVG);
+ break;
+ }
+ case $.MATH: {
+ this._enterNamespace(html.NS.MATHML);
+ break;
+ }
+ default:
+ // Do nothing
+ }
+
+ if (this.inForeignContent) {
+ if (foreignContent.causesExit(token)) {
+ this._leaveCurrentNamespace();
+ } else {
+ const currentNs = this.namespaceStack[0];
+
+ if (currentNs === html.NS.MATHML) {
+ foreignContent.adjustTokenMathMLAttrs(token);
+ } else if (currentNs === html.NS.SVG) {
+ foreignContent.adjustTokenSVGTagName(token);
+ foreignContent.adjustTokenSVGAttrs(token);
+ }
+
+ foreignContent.adjustTokenXMLAttrs(token);
+
+ tn = token.tagID;
+
+ if (!token.selfClosing && foreignContent.isIntegrationPoint(tn, currentNs, token.attrs)) {
+ this._enterNamespace(html.NS.HTML);
+ }
+ }
+ } else {
+ switch (tn) {
+ case $.PRE:
+ case $.TEXTAREA:
+ case $.LISTING: {
+ this.skipNextNewLine = true;
+ break;
+ }
+ case $.IMAGE: {
+ token.tagName = html.TAG_NAMES.IMG;
+ token.tagID = $.IMG;
+ break;
+ }
+ default:
+ // Do nothing
+ }
+
+ this._ensureTokenizerMode(tn);
+ }
+
+ this.handler.onStartTag(token);
+ }
+
+ /** @internal */
+ onEndTag(token: Token.TagToken): void {
+ let tn = token.tagID;
+
+ if (!this.inForeignContent) {
+ const previousNs = this.namespaceStack[1];
+
+ if (previousNs === html.NS.SVG) {
+ const adjustedTagName = foreignContent.SVG_TAG_NAMES_ADJUSTMENT_MAP.get(token.tagName);
+
+ if (adjustedTagName) {
+ tn = html.getTagID(adjustedTagName);
+ }
+ }
+
+ //NOTE: check for exit from integration point
+ if (foreignContent.isIntegrationPoint(tn, previousNs, token.attrs)) {
+ this._leaveCurrentNamespace();
+ }
+ } else if (
+ (tn === $.SVG && this.namespaceStack[0] === html.NS.SVG) ||
+ (tn === $.MATH && this.namespaceStack[0] === html.NS.MATHML)
+ ) {
+ this._leaveCurrentNamespace();
+ }
+
+ // NOTE: adjust end tag name as well for consistency
+ if (this.namespaceStack[0] === html.NS.SVG) {
+ foreignContent.adjustTokenSVGTagName(token);
+ }
+
+ this.handler.onEndTag(token);
+ }
+}
diff --git a/packages/parse5-sax-parser/package.json b/packages/parse5-sax-parser/package.json
index 0924152..280c178 100644
--- a/packages/parse5-sax-parser/package.json
+++ b/packages/parse5-sax-parser/package.json
@@ -1,10 +1,12 @@
{
"name": "parse5-sax-parser",
+ "type": "module",
"description": "Streaming SAX-style HTML parser.",
- "version": "6.0.1",
+ "version": "7.0.0",
"author": "Ivan Nikulin (https://github.com/inikulin)",
"contributors": "https://github.com/inikulin/parse5/graphs/contributors",
"homepage": "https://github.com/inikulin/parse5",
+ "funding": "https://github.com/inikulin/parse5?sponsor=1",
"keywords": [
"parse5",
"parser",
@@ -13,15 +15,19 @@
"SAX"
],
"license": "MIT",
- "main": "./lib/index.js",
+ "main": "dist/index.js",
+ "module": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "exports": "./dist/index.js",
"dependencies": {
- "parse5": "^6.0.1"
+ "parse5": "^7.0.0"
},
"repository": {
"type": "git",
"url": "git://github.com/inikulin/parse5.git"
},
"files": [
- "lib"
+ "dist",
+ "!*.map"
]
}
diff --git a/packages/parse5-sax-parser/test/location-info.test.js b/packages/parse5-sax-parser/test/location-info.test.js
deleted file mode 100644
index bba6cba..0000000
--- a/packages/parse5-sax-parser/test/location-info.test.js
+++ /dev/null
@@ -1,48 +0,0 @@
-'use strict';
-
-const assert = require('assert');
-const SAXParser = require('../lib');
-const loadSAXParserTestData = require('../../../test/utils/load-sax-parser-test-data');
-const { writeChunkedToStream } = require('../../../test/utils/common');
-
-exports['Location info (SAX)'] = function() {
- loadSAXParserTestData().forEach(test => {
- //NOTE: we've already tested the correctness of the location info with the Tokenizer tests.
- //So here we just check that SAXParser provides this info in the handlers.
- const parser = new SAXParser({ sourceCodeLocationInfo: true });
-
- const handler = ({ sourceCodeLocation }) => {
- assert.strictEqual(typeof sourceCodeLocation.startLine, 'number');
- assert.strictEqual(typeof sourceCodeLocation.startCol, 'number');
- assert.strictEqual(typeof sourceCodeLocation.startOffset, 'number');
- assert.strictEqual(typeof sourceCodeLocation.endOffset, 'number');
- assert.ok(sourceCodeLocation.startOffset < sourceCodeLocation.endOffset);
- };
-
- parser.on('startTag', handler);
- parser.on('endTag', handler);
- parser.on('doctype', handler);
- parser.on('comment', handler);
- parser.on('text', handler);
-
- writeChunkedToStream(test.src, parser);
- });
-};
-
-exports['Regression - location info for text (GH-153, GH-266)'] = function() {
- const html = 'Here is a title';
- const parser = new SAXParser({ sourceCodeLocationInfo: true });
-
- parser.on('text', ({ sourceCodeLocation }) => {
- assert.deepStrictEqual(sourceCodeLocation, {
- startLine: 1,
- startCol: 35,
- startOffset: 34,
- endLine: 1,
- endCol: 50,
- endOffset: 49
- });
- });
-
- parser.end(html);
-};
diff --git a/packages/parse5-sax-parser/test/location-info.test.ts b/packages/parse5-sax-parser/test/location-info.test.ts
new file mode 100644
index 0000000..dba662d
--- /dev/null
+++ b/packages/parse5-sax-parser/test/location-info.test.ts
@@ -0,0 +1,49 @@
+import * as assert from 'node:assert';
+import { SAXParser } from '../lib/index.js';
+import { loadSAXParserTestData } from 'parse5-test-utils/utils/load-sax-parser-test-data.js';
+import { writeChunkedToStream } from 'parse5-test-utils/utils/common.js';
+import type { Token } from 'parse5';
+
+function assertLocation({ sourceCodeLocation }: { sourceCodeLocation: Token.Location }): void {
+ assert.strictEqual(typeof sourceCodeLocation.startLine, 'number');
+ assert.strictEqual(typeof sourceCodeLocation.startCol, 'number');
+ assert.strictEqual(typeof sourceCodeLocation.startOffset, 'number');
+ assert.strictEqual(typeof sourceCodeLocation.endOffset, 'number');
+ assert.ok(sourceCodeLocation.startOffset < sourceCodeLocation.endOffset);
+}
+
+describe('location-info', () => {
+ it('Location info (SAX)', () => {
+ for (const test of loadSAXParserTestData()) {
+ //NOTE: we've already tested the correctness of the location info with the Tokenizer tests.
+ //So here we just check that SAXParser provides this info in the handlers.
+ const parser = new SAXParser({ sourceCodeLocationInfo: true });
+
+ parser.on('startTag', assertLocation);
+ parser.on('endTag', assertLocation);
+ parser.on('doctype', assertLocation);
+ parser.on('comment', assertLocation);
+ parser.on('text', assertLocation);
+
+ writeChunkedToStream(test.src, parser);
+ }
+ });
+
+ it('Regression - location info for text (GH-153, GH-266)', () => {
+ const html = 'Here is a title';
+ const parser = new SAXParser({ sourceCodeLocationInfo: true });
+
+ parser.on('text', ({ sourceCodeLocation }) => {
+ assert.deepStrictEqual(sourceCodeLocation, {
+ startLine: 1,
+ startCol: 35,
+ startOffset: 34,
+ endLine: 1,
+ endCol: 50,
+ endOffset: 49,
+ });
+ });
+
+ parser.end(html);
+ });
+});
diff --git a/packages/parse5-sax-parser/test/parser-feedback-simulator.test.js b/packages/parse5-sax-parser/test/parser-feedback-simulator.test.js
deleted file mode 100644
index 44be6ea..0000000
--- a/packages/parse5-sax-parser/test/parser-feedback-simulator.test.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const path = require('path');
-const Tokenizer = require('parse5/lib/tokenizer');
-const generateTokenizationTests = require('../../../test/utils/generate-tokenization-tests');
-const ParserFeedbackSimulator = require('../lib/parser-feedback-simulator');
-
-generateTokenizationTests(
- exports,
- 'ParserFeedbackSimulator',
- path.join(__dirname, '../../../test/data/parser-feedback'),
- () => {
- const tokenizer = new Tokenizer();
- const feedbackSimulator = new ParserFeedbackSimulator(tokenizer);
-
- return { tokenizer, getNextToken: () => feedbackSimulator.getNextToken() };
- }
-);
diff --git a/packages/parse5-sax-parser/test/parser-feedback-simulator.test.ts b/packages/parse5-sax-parser/test/parser-feedback-simulator.test.ts
new file mode 100644
index 0000000..9b43f3d
--- /dev/null
+++ b/packages/parse5-sax-parser/test/parser-feedback-simulator.test.ts
@@ -0,0 +1,10 @@
+import { generateTokenizationTests } from 'parse5-test-utils/utils/generate-tokenization-tests.js';
+import { ParserFeedbackSimulator } from '../lib/parser-feedback-simulator.js';
+
+const feedbackPath = new URL('../../../test/data/parser-feedback', import.meta.url);
+
+generateTokenizationTests(
+ 'ParserFeedbackSimulator',
+ feedbackPath.pathname,
+ (handler) => new ParserFeedbackSimulator({}, handler).tokenizer
+);
diff --git a/packages/parse5-sax-parser/test/sax-parser.test.js b/packages/parse5-sax-parser/test/sax-parser.test.js
deleted file mode 100644
index b06bf11..0000000
--- a/packages/parse5-sax-parser/test/sax-parser.test.js
+++ /dev/null
@@ -1,151 +0,0 @@
-'use strict';
-
-const assert = require('assert');
-const fs = require('fs');
-const path = require('path');
-const SAXParser = require('../lib');
-const loadSAXParserTestData = require('../../../test/utils/load-sax-parser-test-data');
-const {
- getStringDiffMsg,
- writeChunkedToStream,
- removeNewLines,
- WritableStreamStub
-} = require('../../../test/utils/common');
-
-function sanitizeForComparison(str) {
- return removeNewLines(str)
- .replace(/\s/g, '')
- .replace(/'/g, '"')
- .toLowerCase();
-}
-
-function createBasicTest(html, expected, options) {
- return function() {
- //NOTE: the idea of the test is to serialize back given HTML using SAXParser handlers
- let actual = '';
- const parser = new SAXParser(options);
-
- parser.on('doctype', ({ name, publicId, systemId }) => {
- actual += '';
- });
-
- parser.on('startTag', ({ tagName, attrs, selfClosing }) => {
- actual += '<' + tagName;
-
- if (attrs.length) {
- for (let i = 0; i < attrs.length; i++) {
- actual += ' ' + attrs[i].name + '="' + attrs[i].value + '"';
- }
- }
-
- actual += selfClosing ? '/>' : '>';
- });
-
- parser.on('endTag', ({ tagName }) => {
- actual += '' + tagName + '>';
- });
-
- parser.on('text', ({ text }) => {
- actual += text;
- });
-
- parser.on('comment', ({ text }) => {
- actual += '';
- });
-
- parser.once('finish', () => {
- expected = sanitizeForComparison(expected);
- actual = sanitizeForComparison(actual);
-
- //NOTE: use ok assertion, so output will not be polluted by the whole content of the strings
- assert.ok(actual === expected, getStringDiffMsg(actual, expected));
- });
-
- writeChunkedToStream(html, parser);
- };
-}
-
-//Basic tests
-loadSAXParserTestData().forEach(
- (test, idx) => (exports[`SAX - ${idx + 1}.${test.name}`] = createBasicTest(test.src, test.expected, test.options))
-);
-
-exports['SAX - Piping and .stop()'] = function(done) {
- const parser = new SAXParser();
- const writable = new WritableStreamStub();
- let handlerCallCount = 0;
-
- const handler = function() {
- handlerCallCount++;
-
- if (handlerCallCount === 10) {
- parser.stop();
- }
- };
-
- fs.createReadStream(path.join(__dirname, '../../../test/data/huge-page/huge-page.html'), 'utf8')
- .pipe(parser)
- .pipe(writable);
-
- parser.on('startTag', handler);
- parser.on('endTag', handler);
- parser.on('doctype', handler);
- parser.on('comment', handler);
- parser.on('text', handler);
-
- writable.once('finish', () => {
- const expected = fs
- .readFileSync(path.join(__dirname, '../../../test/data/huge-page/huge-page.html'))
- .toString();
-
- assert.strictEqual(handlerCallCount, 10);
- assert.strictEqual(writable.writtenData, expected);
- done();
- });
-};
-
-exports['Regression - SAX - Parser silently exits on big files (GH-97)'] = function(done) {
- const parser = new SAXParser();
-
- fs.createReadStream(path.join(__dirname, '../../../test/data/huge-page/huge-page.html'), 'utf8').pipe(parser);
-
- //NOTE: This is a smoke test - in case of regression it will fail with timeout.
- parser.once('finish', done);
-};
-
-exports['Regression - SAX - Last text chunk must be flushed (GH-271)'] = done => {
- const parser = new SAXParser();
- let foundText = false;
-
- parser.on('text', ({ text }) => {
- foundText = true;
- assert.strictEqual(text, 'text');
- });
-
- parser.once('finish', () => {
- assert.ok(foundText);
- done();
- });
-
- parser.write('text');
- parser.end();
-};
-
-exports['Regression - SAX - Should not accept binary input (GH-269)'] = () => {
- const stream = new SAXParser();
- const buf = Buffer.from('test');
-
- assert.throws(() => stream.write(buf), TypeError);
-};
diff --git a/packages/parse5-sax-parser/test/sax-parser.test.ts b/packages/parse5-sax-parser/test/sax-parser.test.ts
new file mode 100644
index 0000000..20ee3e6
--- /dev/null
+++ b/packages/parse5-sax-parser/test/sax-parser.test.ts
@@ -0,0 +1,140 @@
+import * as assert from 'node:assert';
+import * as fs from 'node:fs';
+import type { SAXParserOptions } from '../lib/index.js';
+import { SAXParser } from '../lib/index.js';
+import { loadSAXParserTestData } from 'parse5-test-utils/utils/load-sax-parser-test-data.js';
+import {
+ finished,
+ getStringDiffMsg,
+ writeChunkedToStream,
+ removeNewLines,
+ WritableStreamStub,
+} from 'parse5-test-utils/utils/common.js';
+
+function sanitizeForComparison(str: string): string {
+ return removeNewLines(str).replace(/\s/g, '').replace(/'/g, '"').toLowerCase();
+}
+
+function createBasicTest(html: string, expected: string, options?: SAXParserOptions) {
+ return async function (): Promise {
+ //NOTE: the idea of the test is to serialize back given HTML using SAXParser handlers
+ let actual = '';
+ const parser = new SAXParser(options);
+
+ parser.on('doctype', ({ name, publicId, systemId }) => {
+ actual += `';
+ });
+
+ parser.on('startTag', ({ tagName, attrs, selfClosing }) => {
+ actual += `<${tagName}`;
+ for (const attr of attrs) {
+ actual += ` ${attr.name}="${attr.value}"`;
+ }
+ actual += selfClosing ? '/>' : '>';
+ });
+
+ parser.on('endTag', ({ tagName }) => {
+ actual += `${tagName}>`;
+ });
+
+ parser.on('text', ({ text }) => {
+ actual += text;
+ });
+
+ parser.on('comment', ({ text }) => {
+ actual += ``;
+ });
+
+ writeChunkedToStream(html, parser);
+
+ await finished(parser);
+
+ expected = sanitizeForComparison(expected);
+ actual = sanitizeForComparison(actual);
+
+ //NOTE: use ok assertion, so output will not be polluted by the whole content of the strings
+ assert.ok(actual === expected, getStringDiffMsg(actual, expected));
+ };
+}
+
+const hugePage = new URL('../../../test/data/huge-page/huge-page.html', import.meta.url);
+
+describe('SAX parser', () => {
+ //Basic tests
+ for (const [idx, data] of loadSAXParserTestData().entries())
+ it(`${idx + 1}.${data.name}`, createBasicTest(data.src, data.expected));
+
+ it('Piping and .stop()', async () => {
+ const parser = new SAXParser();
+ const writable = new WritableStreamStub();
+ let handlerCallCount = 0;
+
+ function handler(): void {
+ handlerCallCount++;
+
+ if (handlerCallCount === 10) {
+ parser.stop();
+ }
+ }
+
+ fs.createReadStream(hugePage, 'utf8').pipe(parser).pipe(writable);
+
+ parser.on('startTag', handler);
+ parser.on('endTag', handler);
+ parser.on('doctype', handler);
+ parser.on('comment', handler);
+ parser.on('text', handler);
+
+ await finished(writable);
+
+ const expected = fs.readFileSync(hugePage).toString();
+
+ assert.strictEqual(handlerCallCount, 10);
+ assert.strictEqual(writable.writtenData, expected);
+ });
+
+ it('Parser silently exits on big files (GH-97)', () => {
+ const parser = new SAXParser();
+
+ fs.createReadStream(hugePage, 'utf8').pipe(parser);
+
+ //NOTE: This is a smoke test - in case of regression it will fail with timeout.
+ return finished(parser);
+ });
+
+ it('Last text chunk must be flushed (GH-271)', async () => {
+ const parser = new SAXParser();
+ let foundText = false;
+
+ parser.on('text', ({ text }) => {
+ foundText = true;
+ assert.strictEqual(text, 'text');
+ });
+
+ parser.write('text');
+ parser.end();
+
+ await finished(parser);
+
+ assert.ok(foundText);
+ });
+
+ it('Should not accept binary input (GH-269)', () => {
+ const stream = new SAXParser();
+ const buf = Buffer.from('test');
+
+ assert.throws(() => stream.write(buf), TypeError);
+ });
+});
diff --git a/packages/parse5-sax-parser/tsconfig.json b/packages/parse5-sax-parser/tsconfig.json
new file mode 100644
index 0000000..ebf4d81
--- /dev/null
+++ b/packages/parse5-sax-parser/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "rootDir": "lib",
+ "outDir": "dist"
+ },
+ "include": ["**/*.ts"],
+ "exclude": ["**/*.test.ts", "dist", "test"]
+}
diff --git a/packages/parse5-serializer-stream/LICENSE b/packages/parse5-serializer-stream/LICENSE
deleted file mode 100644
index f3265d4..0000000
--- a/packages/parse5-serializer-stream/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2013-2019 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin)
-
-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.
diff --git a/packages/parse5-serializer-stream/README.md b/packages/parse5-serializer-stream/README.md
deleted file mode 100644
index b8aa3c7..0000000
--- a/packages/parse5-serializer-stream/README.md
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
parse5-serializer-stream
-Streaming HTML serializer.
-
-
-
-
-npm install --save parse5-serializer-stream
-
-
-
-
- 📖 Documentation 📖
-
-
----
-
-
- List of parse5 toolset packages
-
-
-
- GitHub
-
-
-
- Version history
-
diff --git a/packages/parse5-serializer-stream/docs/index.md b/packages/parse5-serializer-stream/docs/index.md
deleted file mode 100644
index 9f274da..0000000
--- a/packages/parse5-serializer-stream/docs/index.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Class: SerializerStream
-
-Streaming AST node to an HTML serializer. A [readable stream](https://nodejs.org/api/stream.html#stream_class_stream_readable).
-
-*__example__*:
-
-```js
-const parse5 = require('parse5');
-const SerializerStream = require('parse5-serializer-stream');
-const fs = require('fs');
-
-const file = fs.createWriteStream('/home/index.html');
-
-// Serializes the parsed document to HTML and writes it to the file.
-const document = parse5.parse('Who is John Galt?');
-const serializer = new SerializerStream(document);
-
-serializer.pipe(file);
-```
-
-### Constructors
-
-* [constructor](#constructor)
-
-### Methods and events
-
-See: [readable stream API](https://nodejs.org/api/stream.html#stream_class_stream_readable).
-
----
-
-## Constructors
-
-
-
-### constructor
-
-⊕ **new SerializerStream**(node: *Node*, options?: *[SerializerOptions](../../parse5/docs/options/serializer-options.md)*): [SerializerStream]()
-
-Streaming AST node to an HTML serializer. A readable stream.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | Node | Node to serialize. |
-| `Optional` options | [SerializerOptions](../../parse5/docs/options/serializer-options.md) | Serialization options. |
-
-**Returns:** [SerializerStream]()
-
-___
diff --git a/packages/parse5-serializer-stream/lib/index.js b/packages/parse5-serializer-stream/lib/index.js
deleted file mode 100644
index 08bfb8d..0000000
--- a/packages/parse5-serializer-stream/lib/index.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-
-const { Readable } = require('stream');
-const Serializer = require('parse5/lib/serializer');
-
-class SerializerStream extends Readable {
- constructor(node, options) {
- super({ encoding: 'utf8' });
-
- this.serializer = new Serializer(node, options);
-
- Object.defineProperty(this.serializer, 'html', {
- //NOTE: To make `+=` concat operator work properly we define
- //getter which always returns empty string
- get: function() {
- return '';
- },
- set: this.push.bind(this)
- });
- }
-
- //Readable stream implementation
- _read() {
- this.serializer.serialize();
- this.push(null);
- }
-}
-
-module.exports = SerializerStream;
diff --git a/packages/parse5-serializer-stream/package.json b/packages/parse5-serializer-stream/package.json
deleted file mode 100644
index 2c2948a..0000000
--- a/packages/parse5-serializer-stream/package.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "parse5-serializer-stream",
- "description": "Streaming HTML serializer.",
- "version": "6.0.1",
- "author": "Ivan Nikulin (https://github.com/inikulin)",
- "contributors": "https://github.com/inikulin/parse5/graphs/contributors",
- "homepage": "https://github.com/inikulin/parse5",
- "keywords": [
- "parse5",
- "parser",
- "stream",
- "streaming",
- "serializer",
- "serialiser"
- ],
- "license": "MIT",
- "main": "./lib/index.js",
- "dependencies": {
- "parse5": "^6.0.1"
- },
- "repository": {
- "type": "git",
- "url": "git://github.com/inikulin/parse5.git"
- },
- "files": [
- "lib"
- ]
-}
diff --git a/packages/parse5-serializer-stream/test/serializer-stream.test.js b/packages/parse5-serializer-stream/test/serializer-stream.test.js
deleted file mode 100644
index 71e5161..0000000
--- a/packages/parse5-serializer-stream/test/serializer-stream.test.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-
-const SerializerStream = require('../lib');
-const generateSeriliazerTests = require('../../../test/utils/generate-serializer-tests');
-const { WritableStreamStub } = require('../../../test/utils/common');
-
-generateSeriliazerTests(exports, 'SeriliazerStream', (document, opts) => {
- const stream = new SerializerStream(document, opts);
- const writable = new WritableStreamStub();
-
- stream.pipe(writable);
-
- return new Promise(resolve => {
- writable.once('finish', () => resolve(writable.writtenData));
- });
-});
diff --git a/packages/parse5/README.md b/packages/parse5/README.md
index 32b53be..139f8c6 100644
--- a/packages/parse5/README.md
+++ b/packages/parse5/README.md
@@ -16,7 +16,7 @@
- 📖 Documentation 📖
+ 📖 Documentation 📖
---
@@ -34,5 +34,5 @@
- Version history
+ Changelog
diff --git a/packages/parse5/docs/index.md b/packages/parse5/docs/index.md
deleted file mode 100644
index f869de1..0000000
--- a/packages/parse5/docs/index.md
+++ /dev/null
@@ -1,111 +0,0 @@
-# parse5
-
-> **NOTE:** By default all functions operate with [tree format](tree-adapter/default/interface-list.md) produced
-> by the default tree adapter. Tree format can be changed by providing custom [tree adapter](tree-adapter/interface.md) implementation.
-
-### Functions
-
-* [parse](#parse)
-* [parseFragment](#parsefragment)
-* [serialize](#serialize)
-
-
-
-### parse
-
-▸ **parse**(html: _`string`_, options?: _[ParserOptions](options/parser-options.md)_): Document
-
-Parses an HTML string.
-
-_**example**_:
-
-```js
-const parse5 = require('parse5');
-
-const document = parse5.parse('Hi there!');
-
-console.log(document.childNodes[1].tagName); //> 'html'
-```
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------------------ | -------------------------------------------------------------------------------------------------------------- | ------------------ |
-| html | `string` | Input HTML string. |
-| `Optional` options | [ParserOptions](options/parser-options.md) | Parsing options. |
-
-**Returns:** Document
-
----
-
-
-
-### parseFragment
-
-▸ **parseFragment**(fragmentContext: _Element_, html: _`string`_, options?: _[ParserOptions](options/parser-options.md)_): DocumentFragment
-
-▸ **parseFragment**(html: _`string`_, options?: _[ParserOptions](options/parser-options.md)_): DocumentFragment
-
-Parses an HTML fragment.
-
-_**example**_:
-
-```js
-const parse5 = require('parse5');
-
-const documentFragment = parse5.parseFragment('');
-
-console.log(documentFragment.childNodes[0].tagName); //> 'table'
-
-// Parses the html fragment in the context of the parsed element.
-const trFragment = parser.parseFragment(documentFragment.childNodes[0], '| Shake it, baby |
');
-
-console.log(trFragment.childNodes[0].childNodes[0].tagName); //> 'td'
-```
-
-**Parameters:**
-
-| Param | Type | Description |
-| -------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
-| `Optional` fragmentContext | Element | Parsing context element. If specified, given fragment will be parsed as if it was set to the context element's \`innerHTML\` property. |
-| html | `string` | Input HTML fragment string. |
-| `Optional` options | [ParserOptions](options/parser-options.md) | Parsing options. |
-
-**Returns:** DocumentFragment
-
----
-
-
-
-### serialize
-
-▸ **serialize**(node: _Node_, options?: _[SerializerOptions](options/serializer-options.md)_): `string`
-
-Serializes an AST node to an HTML string.
-
-_**example**_:
-
-```js
-const parse5 = require('parse5');
-
-const document = parse5.parse('Hi there!');
-
-// Serializes a document.
-const html = parse5.serialize(document);
-
-// Serializes the element content.
-const str = parse5.serialize(document.childNodes[1]);
-
-console.log(str); //> 'Hi there!'
-```
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------------------ | ---------------------------------------------------------------------------------------------------------------------- | ---------------------- |
-| node | Node | Node to serialize. |
-| `Optional` options | [SerializerOptions](options/serializer-options.md) | Serialization options. |
-
-**Returns:** `string`
-
----
diff --git a/packages/parse5/docs/options/parser-options.md b/packages/parse5/docs/options/parser-options.md
deleted file mode 100644
index 0c492dd..0000000
--- a/packages/parse5/docs/options/parser-options.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Interface: ParserOptions
-
-### Properties
-
-* [sourceCodeLocationInfo](#sourcecodelocationinfo)
-* [scriptingEnabled](#scriptingenabled)
-* [treeAdapter](#treeadapter)
-
----
-
-## Properties
-
-
-
-### `` sourceCodeLocationInfo
-
-**● sourceCodeLocationInfo**: *`boolean`*
-
-Enables source code location information. When enabled, each node (except the root node) will have a `sourceCodeLocation` property (property name can be different depending on [tree adapter](../tree-adapter/interface.md) that has been used, hereinafter property names for the [DefaultTreeAdapter](../tree-adapter/interface-list.md) will be given). If the node is not an empty element, `sourceCodeLocation` will be a [ElementLocation](../source-code-location/element-location.md) object, otherwise it will be [Location](../source-code-location/location.md). If the element was implicitly created by the parser (as part of [tree correction](https://html.spec.whatwg.org/multipage/syntax.html#an-introduction-to-error-handling-and-strange-cases-in-the-parser)), its `sourceCodeLocation` property will be `undefined`.
-
-**Default:** `false`
-
-___
-
-
-### `` scriptingEnabled
-
-**● scriptingEnabled**: *`boolean`*
-
-The [scripting flag](https://html.spec.whatwg.org/multipage/parsing.html#scripting-flag). If set to
-`true`, `noscript` element content will be parsed as text.
-
-**Default:** `true`
-
-___
-
-
-
-### `` treeAdapter
-
-**● treeAdapter**: *[TreeAdapter](../tree-adapter/interface.md)*
-
-Specifies the resulting tree format.
-
-**Default:** [DefaultTreeAdapter](../tree-adapter/default/interface-list.md)
-
-___
-
diff --git a/packages/parse5/docs/options/serializer-options.md b/packages/parse5/docs/options/serializer-options.md
deleted file mode 100644
index aa55c16..0000000
--- a/packages/parse5/docs/options/serializer-options.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Interface: SerializerOptions
-
-### Properties
-
-* [treeAdapter](#treeadapter)
-
----
-
-## Properties
-
-
-
-### `` treeAdapter
-
-**● treeAdapter**: *[TreeAdapter](../tree-adapter/interface.md)*
-
-Specifies input tree format.
-
-**Default:** [DefaultTreeAdapter](../tree-adapter/default/interface-list.md).
-
-___
-
diff --git a/packages/parse5/docs/source-code-location/element-location.md b/packages/parse5/docs/source-code-location/element-location.md
deleted file mode 100644
index c05bd67..0000000
--- a/packages/parse5/docs/source-code-location/element-location.md
+++ /dev/null
@@ -1,100 +0,0 @@
-# Interface: ElementLocation
-
-### Properties
-
-* [attrs](#attrs)
-* [endCol](#endcol)
-* [endOffset](#endoffset)
-* [endLine](#endline)
-* [endTag](#endtag)
-* [startCol](#startcol)
-* [startOffset](#startoffset)
-* [startLine](#startline)
-* [startTag](#starttag)
-
----
-
-## Properties
-
-
-
-### attrs
-
-**● attrs**: *\[attributeName: `string`\]: [Location](location.md)*
-
-Start tag attributes' location info
-
-___
-
-
-### endCol
-
-**● endCol**: *`number`*
-
-One-based column index of the last character
-
-___
-
-
-### endOffset
-
-**● endOffset**: *`number`*
-
-Zero-based last character index
-
-___
-
-
-### endLine
-
-**● endLine**: *`number`*
-
-One-based line index of the last character
-
-___
-
-
-### endTag
-
-**● endTag**: *[Location](location.md)*
-
-Element's end tag location info.
-
-___
-
-
-### startCol
-
-**● startCol**: *`number`*
-
-One-based column index of the first character
-
-___
-
-
-### startOffset
-
-**● startOffset**: *`number`*
-
-Zero-based first character index
-
-___
-
-
-### startLine
-
-**● startLine**: *`number`*
-
-One-based line index of the first character
-
-___
-
-
-### startTag
-
-**● startTag**: *[StartTagLocation](start-tag-location.md)*
-
-Element's start tag location info.
-
-___
-
diff --git a/packages/parse5/docs/source-code-location/end-location.md b/packages/parse5/docs/source-code-location/end-location.md
deleted file mode 100644
index 8b3bd57..0000000
--- a/packages/parse5/docs/source-code-location/end-location.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Interface: EndLocation
-
-### Properties
-
-* [endCol](#endcol)
-* [endOffset](#endoffset)
-* [endLine](#endline)
-* [endTag](#endtag)
-
----
-
-## Properties
-
-
-
-### endCol
-
-**● endCol**: *`number`*
-
-One-based column index of the last character
-
-___
-
-
-### endOffset
-
-**● endOffset**: *`number`*
-
-Zero-based last character index
-
-___
-
-
-### endLine
-
-**● endLine**: *`number`*
-
-One-based line index of the last character
-
-___
-
-
-### endTag
-
-**● endTag**: *[Location](location.md)|undefined*
-
-Element's end tag location info.
-This property is undefined, if the element has no closing tag.
\ No newline at end of file
diff --git a/packages/parse5/docs/source-code-location/location.md b/packages/parse5/docs/source-code-location/location.md
deleted file mode 100644
index 316f49c..0000000
--- a/packages/parse5/docs/source-code-location/location.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Interface: Location
-
-### Properties
-
-* [endCol](#endcol)
-* [endOffset](#endoffset)
-* [endLine](#endline)
-* [startCol](#startcol)
-* [startOffset](#startoffset)
-* [startLine](#startline)
-
----
-
-## Properties
-
-
-
-### endCol
-
-**● endCol**: *`number`*
-
-One-based column index of the last character
-
-___
-
-
-### endOffset
-
-**● endOffset**: *`number`*
-
-Zero-based last character index
-
-___
-
-
-### endLine
-
-**● endLine**: *`number`*
-
-One-based line index of the last character
-
-___
-
-
-### startCol
-
-**● startCol**: *`number`*
-
-One-based column index of the first character
-
-___
-
-
-### startOffset
-
-**● startOffset**: *`number`*
-
-Zero-based first character index
-
-___
-
-
-### startLine
-
-**● startLine**: *`number`*
-
-One-based line index of the first character
-
-___
diff --git a/packages/parse5/docs/source-code-location/start-tag-location.md b/packages/parse5/docs/source-code-location/start-tag-location.md
deleted file mode 100644
index 7fc08e5..0000000
--- a/packages/parse5/docs/source-code-location/start-tag-location.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# Interface: StartTagLocation
-
-### Properties
-
-* [attrs](#attrs)
-* [endCol](#endcol)
-* [endOffset](#endoffset)
-* [endLine](#endline)
-* [startCol](#startcol)
-* [startOffset](#startoffset)
-* [startLine](#startline)
-
----
-
-## Properties
-
-
-
-### attrs
-
-**● attrs**: *\[attributeName: `string`\]: [Location](location.md)*
-
-Start tag attributes' location info
-
-___
-
-
-### endCol
-
-**● endCol**: *`number`*
-
-One-based column index of the last character
-
-___
-
-
-### endOffset
-
-**● endOffset**: *`number`*
-
-Zero-based last character index
-
-___
-
-
-### endLine
-
-**● endLine**: *`number`*
-
-One-based line index of the last character
-
-___
-
-
-### startCol
-
-**● startCol**: *`number`*
-
-One-based column index of the first character
-
-___
-
-
-### startOffset
-
-**● startOffset**: *`number`*
-
-Zero-based first character index
-
-___
-
-
-### startLine
-
-**● startLine**: *`number`*
-
-One-based line index of the first character
-
-___
diff --git a/packages/parse5/docs/tree-adapter/default/attribute.md b/packages/parse5/docs/tree-adapter/default/attribute.md
deleted file mode 100644
index f1915d7..0000000
--- a/packages/parse5/docs/tree-adapter/default/attribute.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Interface: Attribute
-
-### Properties
-
-* [name](#name)
-* [namespace](#namespace)
-* [prefix](#prefix)
-* [value](#value)
-
----
-
-## Properties
-
-
-
-### name
-
-**● name**: *`string`*
-
-The name of the attribute.
-
-___
-
-
-### `` namespace
-
-**● namespace**: *`string`*
-
-The namespace of the attribute.
-
-___
-
-
-### `` prefix
-
-**● prefix**: *`string`*
-
-The namespace-related prefix of the attribute.
-
-___
-
-
-### value
-
-**● value**: *`string`*
-
-The value of the attribute.
-
-___
-
diff --git a/packages/parse5/docs/tree-adapter/default/comment-node.md b/packages/parse5/docs/tree-adapter/default/comment-node.md
deleted file mode 100644
index bc2d5ac..0000000
--- a/packages/parse5/docs/tree-adapter/default/comment-node.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Interface: CommentNode
-
-### Properties
-
-* [data](#data)
-* [nodeName](#nodename)
-* [parentNode](#parentnode)
-* [sourceCodeLocation](#sourcecodelocation)
-
----
-
-## Properties
-
-
-
-### data
-
-**● data**: *`string`*
-
-Comment text.
-
-___
-
-
-### nodeName
-
-**● nodeName**: *"#comment"*
-
-The name of the node.
-
-___
-
-
-### parentNode
-
-**● parentNode**: *Node*
-
-Parent node.
-
-___
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[Location](../../source-code-location/location.md)*
-
-Comment source code location info. Available if location info is enabled via [ParserOptions](../../options/parser-options.md).
-
-___
diff --git a/packages/parse5/docs/tree-adapter/default/document-fragment.md b/packages/parse5/docs/tree-adapter/default/document-fragment.md
deleted file mode 100644
index 30514ce..0000000
--- a/packages/parse5/docs/tree-adapter/default/document-fragment.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Interface: DocumentFragment
-
-### Properties
-
-* [childNodes](#childnodes)
-* [nodeName](#nodename)
-
----
-
-## Properties
-
-
-
-### childNodes
-
-**● childNodes**: *Node[]*
-
-Child nodes.
-
-___
-
-
-### nodeName
-
-**● nodeName**: *"#document-fragment"*
-
-The name of the node.
-
-___
-
diff --git a/packages/parse5/docs/tree-adapter/default/document-type.md b/packages/parse5/docs/tree-adapter/default/document-type.md
deleted file mode 100644
index f8f05bd..0000000
--- a/packages/parse5/docs/tree-adapter/default/document-type.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Interface: DocumentType
-
-### Properties
-
-* [name](#name)
-* [nodeName](#nodename)
-* [publicId](#publicid)
-* [systemId](#systemid)
-
----
-
-## Properties
-
-
-
-### name
-
-**● name**: *`string`*
-
-Document type name.
-
-___
-
-
-### nodeName
-
-**● nodeName**: *"#documentType"*
-
-The name of the node.
-
-___
-
-
-### publicId
-
-**● publicId**: *`string`*
-
-Document type public identifier.
-
-___
-
-
-### systemId
-
-**● systemId**: *`string`*
-
-Document type system identifier.
-
-___
-
diff --git a/packages/parse5/docs/tree-adapter/default/document.md b/packages/parse5/docs/tree-adapter/default/document.md
deleted file mode 100644
index 18b2d69..0000000
--- a/packages/parse5/docs/tree-adapter/default/document.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Interface: Document
-
-### Properties
-
-* [childNodes](#childnodes)
-* [mode](#mode)
-* [nodeName](#nodename)
-
----
-
-## Properties
-
-
-
-### childNodes
-
-**● childNodes**: *Node[]*
-
-Child nodes.
-
-___
-
-
-### mode
-
-**● mode**: *"no-quirks" | "quirks" | "limited-quirks"*
-
-[Document mode](https://dom.spec.whatwg.org/#concept-document-limited-quirks).
-
-___
-
-
-### nodeName
-
-**● nodeName**: *"#document"*
-
-The name of the node.
-
-___
-
diff --git a/packages/parse5/docs/tree-adapter/default/element.md b/packages/parse5/docs/tree-adapter/default/element.md
deleted file mode 100644
index df24926..0000000
--- a/packages/parse5/docs/tree-adapter/default/element.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# Interface: Element
-
-### Properties
-
-* [attrs](#attrs)
-* [childNodes](#childnodes)
-* [namespaceURI](#namespaceuri)
-* [nodeName](#nodename)
-* [parentNode](#parentnode)
-* [sourceCodeLocation](#sourcecodelocation)
-* [tagName](#tagname)
-
----
-
-## Properties
-
-
-
-### attrs
-
-**● attrs**: *[Attribute](attribute.md)[]*
-
-List of element attributes.
-
-___
-
-
-### childNodes
-
-**● childNodes**: *Node[]*
-
-Child nodes.
-
-___
-
-
-### namespaceURI
-
-**● namespaceURI**: *`string`*
-
-Element namespace.
-
-___
-
-
-### nodeName
-
-**● nodeName**: *`string`*
-
-The name of the node. Equals to element [tagName](#tagname).
-
-___
-
-
-### parentNode
-
-**● parentNode**: *Node*
-
-Parent node.
-
-___
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[ElementLocation](../../source-code-location/element-location.md)*
-
-Element source code location info. Available if location info is enabled via [ParserOptions](../../options/parser-options.md).
-
-___
-
-
-### tagName
-
-**● tagName**: *`string`*
-
-Element tag name.
-
-___
-
diff --git a/packages/parse5/docs/tree-adapter/default/interface-list.md b/packages/parse5/docs/tree-adapter/default/interface-list.md
deleted file mode 100644
index 78e0ea6..0000000
--- a/packages/parse5/docs/tree-adapter/default/interface-list.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# List of tree interfaces produced by default [tree adapter](../interface.md)
-
-* [Attribute](attribute.md)
-* [CommentNode](comment-node.md)
-* [Document](document.md)
-* [DocumentFragment](document-fragment.md)
-* [DocumentType](document-type.md)
-* [Element](element.md)
-* [TextNode](text-node.md)
-
----
-
diff --git a/packages/parse5/docs/tree-adapter/default/text-node.md b/packages/parse5/docs/tree-adapter/default/text-node.md
deleted file mode 100644
index 7fc08be..0000000
--- a/packages/parse5/docs/tree-adapter/default/text-node.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Interface: TextNode
-
-### Properties
-
-* [nodeName](#nodename)
-* [parentNode](#parentnode)
-* [sourceCodeLocation](#sourcecodelocation)
-* [value](#value)
-
----
-
-## Properties
-
-
-
-### nodeName
-
-**● nodeName**: *"#text"*
-
-The name of the node.
-
-___
-
-
-### parentNode
-
-**● parentNode**: *Node*
-
-Parent node.
-
-___
-
-
-### `` sourceCodeLocation
-
-**● sourceCodeLocation**: *[Location](../../source-code-location/location.md)*
-
-Text node source code location info. Available if location info is enabled via [ParserOptions](../../optiona/parser-options.md).
-
-___
-
-
-
-### value
-
-**● value**: *`string`*
-
-Text content.
-
-___
-
diff --git a/packages/parse5/docs/tree-adapter/interface.md b/packages/parse5/docs/tree-adapter/interface.md
deleted file mode 100644
index 238fb19..0000000
--- a/packages/parse5/docs/tree-adapter/interface.md
+++ /dev/null
@@ -1,608 +0,0 @@
-# Interface: TreeAdapter
-
-Tree adapter is a set of utility functions that provides minimal required abstraction layer beetween parser and a specific AST format. Note that `TreeAdapter` is not designed to be a general purpose AST manipulation library. You can build such library on top of existing `TreeAdapter` or use one of the existing libraries from npm.
-
-*__See__*: [default implementation](https://github.com/inikulin/parse5/blob/master/packages/parse5/lib/tree-adapters/default.js)
-
-### Methods
-
-* [adoptAttributes](#adoptattributes)
-* [appendChild](#appendchild)
-* [createCommentNode](#createcommentnode)
-* [createDocument](#createdocument)
-* [createDocumentFragment](#createdocumentfragment)
-* [createElement](#createelement)
-* [detachNode](#detachnode)
-* [getAttrList](#getattrlist)
-* [getChildNodes](#getchildnodes)
-* [getCommentNodeContent](#getcommentnodecontent)
-* [getDocumentMode](#getdocumentmode)
-* [getDocumentTypeNodeName](#getdocumenttypenodename)
-* [getDocumentTypeNodePublicId](#getdocumenttypenodepublicid)
-* [getDocumentTypeNodeSystemId](#getdocumenttypenodesystemid)
-* [getFirstChild](#getfirstchild)
-* [getNamespaceURI](#getnamespaceuri)
-* [getNodeSourceCodeLocation](#getnodesourcecodelocation)
-* [getParentNode](#getparentnode)
-* [getTagName](#gettagname)
-* [getTemplateContent](#gettemplatecontent)
-* [getTextNodeContent](#gettextnodecontent)
-* [insertBefore](#insertbefore)
-* [insertText](#inserttext)
-* [insertTextBefore](#inserttextbefore)
-* [isCommentNode](#iscommentnode)
-* [isDocumentTypeNode](#isdocumenttypenode)
-* [isElementNode](#iselementnode)
-* [isTextNode](#istextnode)
-* [setDocumentMode](#setdocumentmode)
-* [setDocumentType](#setdocumenttype)
-* [setNodeSourceCodeLocation](#setnodesourcecodelocation)
-* [setTemplateContent](#settemplatecontent)
-* [updateNodeSourceCodeLocation](#updatenodesourcecodelocation)
----
-
-## Methods
-
-
-
-### adoptAttributes
-
-▸ **adoptAttributes**(recipient: *Element*, attrs: *Attribute[]*): `void`
-
-Copies attributes to the given element. Only attributes that are not yet present in the element are copied.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| recipient | Element | Element to copy attributes into. |
-| attrs | Attribute[] | Attributes to copy. |
-
-**Returns:** `void`
-
-___
-
-
-### appendChild
-
-▸ **appendChild**(parentNode: *Node*, newNode: *Node*): `void`
-
-Appends a child node to the given parent node.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| parentNode | ParentNode | Parent node. |
-| newNode | Node | Child node. |
-
-**Returns:** `void`
-
-___
-
-
-### createCommentNode
-
-▸ **createCommentNode**(data: *`string`*): CommentNode
-
-Creates a comment node.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| data | `string` | Comment text. |
-
-**Returns:** CommentNode
-
-___
-
-
-### createDocument
-
-▸ **createDocument**(): Document
-
-Creates a document node.
-
-**Returns:** Document
-
-___
-
-
-### createDocumentFragment
-
-▸ **createDocumentFragment**(): DocumentFragment
-
-Creates a document fragment node.
-
-**Returns:** DocumentFragment
-
-___
-
-
-### createElement
-
-▸ **createElement**(tagName: *`string`*, namespaceURI: *`string`*, attrs: *Attribute[]*): Element
-
-Creates an element node.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| tagName | `string` | Tag name of the element. |
-| namespaceURI | `string` | Namespace of the element. |
-| attrs | Attribute[] | Attribute name-value pair array. Foreign attributes may contain \`namespace\` and \`prefix\` fields as well. |
-
-**Returns:** Element
-
-___
-
-
-### detachNode
-
-▸ **detachNode**(node: *Node*): `void`
-
-Removes a node from its parent.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | Node | Node to remove. |
-
-**Returns:** `void`
-
-___
-
-
-### getAttrList
-
-▸ **getAttrList**(element: *Element*): Attribute[]
-
-Returns the given element's attributes in an array, in the form of name-value pairs. Foreign attributes may contain `namespace` and `prefix` fields as well.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| element | Element | Element. |
-
-**Returns:** Attribute[]
-
-___
-
-
-### getChildNodes
-
-▸ **getChildNodes**(node: *Node*): Node[]
-
-Returns the given node's children in an array.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | ParentNode | Node. |
-
-**Returns:** Node[]
-
-___
-
-
-### getCommentNodeContent
-
-▸ **getCommentNodeContent**(commentNode: *CommentNode*): `string`
-
-Returns the given comment node's content.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| commentNode | CommentNode | Comment node. |
-
-**Returns:** `string`
-
-___
-
-
-### getDocumentMode
-
-▸ **getDocumentMode**(document: *Document*): *"no-quirks" | "quirks" | "limited-quirks"*
-
-Returns [document mode](https://dom.spec.whatwg.org/#concept-document-limited-quirks).
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| document | Document | Document node. |
-
-**Returns:** *"no-quirks" | "quirks" | "limited-quirks"*
-
-___
-
-
-### getDocumentTypeNodeName
-
-▸ **getDocumentTypeNodeName**(doctypeNode: *DocumentType*): `string`
-
-Returns the given document type node's name.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| doctypeNode | DocumentType | Document type node. |
-
-**Returns:** `string`
-
-___
-
-
-### getDocumentTypeNodePublicId
-
-▸ **getDocumentTypeNodePublicId**(doctypeNode: *DocumentType*): `string`
-
-Returns the given document type node's public identifier.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| doctypeNode | DocumentType | Document type node. |
-
-**Returns:** `string`
-
-___
-
-
-### getDocumentTypeNodeSystemId
-
-▸ **getDocumentTypeNodeSystemId**(doctypeNode: *DocumentType*): `string`
-
-Returns the given document type node's system identifier.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| doctypeNode | DocumentType | Document type node. |
-
-**Returns:** `string`
-
-___
-
-
-### getFirstChild
-
-▸ **getFirstChild**(node: *Node*): Node
-
-Returns the first child of the given node.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | ParentNode | Node. |
-
-**Returns:** Node
-
-___
-
-
-### getNamespaceURI
-
-▸ **getNamespaceURI**(element: *Element*): `string`
-
-Returns the given element's namespace.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| element | Element | Element. |
-
-**Returns:** `string`
-
-___
-
-
-### getNodeSourceCodeLocation
-
-▸ **getNodeSourceCodeLocation**(node: *Node*): [Location](../source-code-location/location.md) | [ElementLocation](../source-code-location/element-location.md)
-
-Returns the given node's source code location information.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | Node | Node. |
-
-**Returns:** [Location](../source-code-location/location.md) | [ElementLocation](../source-code-location/element-location.md)
-
-___
-
-
-### getParentNode
-
-▸ **getParentNode**(node: *Node*): ParentNode
-
-Returns the given node's parent.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | Node | Node. |
-
-**Returns:** ParentNode
-
-___
-
-
-### getTagName
-
-▸ **getTagName**(element: *Element*): `string`
-
-Returns the given element's tag name.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| element | Element | Element. |
-
-**Returns:** `string`
-
-___
-
-
-### getTemplateContent
-
-▸ **getTemplateContent**(templateElement: *Element*): DocumentFragment
-
-Returns the `` element content element.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| templateElement | Element | `` element. |
-
-**Returns:** DocumentFragment
-
-___
-
-
-### getTextNodeContent
-
-▸ **getTextNodeContent**(textNode: *TextNode*): `string`
-
-Returns the given text node's content.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| textNode | TextNode | Text node. |
-
-**Returns:** `string`
-
-___
-
-
-### insertBefore
-
-▸ **insertBefore**(parentNode: *Node*, newNode: *Node*, referenceNode: *Node*): `void`
-
-Inserts a child node to the given parent node before the given reference node.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| parentNode | ParentNode | Parent node. |
-| newNode | Node | Child node. |
-| referenceNode | Node | Reference node. |
-
-**Returns:** `void`
-
-___
-
-
-### insertText
-
-▸ **insertText**(parentNode: *Node*, text: *`string`*): `void`
-
-Inserts text into a node. If the last child of the node is a text node, the provided text will be appended to the text node content. Otherwise, inserts a new text node with the given text.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| parentNode | ParentNode | Node to insert text into. |
-| text | `string` | Text to insert. |
-
-**Returns:** `void`
-
-___
-
-
-### insertTextBefore
-
-▸ **insertTextBefore**(parentNode: *Node*, text: *`string`*, referenceNode: *Node*): `void`
-
-Inserts text into a sibling node that goes before the reference node. If this sibling node is the text node, the provided text will be appended to the text node content. Otherwise, inserts a new sibling text node with the given text before the reference node.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| parentNode | ParentNode | Node to insert text into. |
-| text | `string` | Text to insert. |
-| referenceNode | Node | Node to insert text before. |
-
-**Returns:** `void`
-
-___
-
-
-### isCommentNode
-
-▸ **isCommentNode**(node: *Node*): `boolean`
-
-Determines if the given node is a comment node.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | Node | Node. |
-
-**Returns:** `boolean`
-
-___
-
-
-### isDocumentTypeNode
-
-▸ **isDocumentTypeNode**(node: *Node*): `boolean`
-
-Determines if the given node is a document type node.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | Node | Node. |
-
-**Returns:** `boolean`
-
-___
-
-
-### isElementNode
-
-▸ **isElementNode**(node: *Node*): `boolean`
-
-Determines if the given node is an element.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | Node | Node. |
-
-**Returns:** `boolean`
-
-___
-
-
-### isTextNode
-
-▸ **isTextNode**(node: *Node*): `boolean`
-
-Determines if the given node is a text node.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | Node | Node. |
-
-**Returns:** `boolean`
-
-___
-
-
-### setDocumentMode
-
-▸ **setDocumentMode**(document: *Document*, mode: *"no-quirks" | "quirks" | "limited-quirks"*): `void`
-
-Sets the [document mode](https://dom.spec.whatwg.org/#concept-document-limited-quirks).
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| document | Document | Document node. |
-| mode | *"no-quirks" | "quirks" | "limited-quirks"* | Document mode. |
-
-**Returns:** `void`
-
-___
-
-
-### setDocumentType
-
-▸ **setDocumentType**(document: *Document*, name: *`string`*, publicId: *`string`*, systemId: *`string`*): `void`
-
-Sets the document type. If the `document` already contains a document type node, the `name`, `publicId` and `systemId` properties of this node will be updated with the provided values. Otherwise, creates a new document type node with the given properties and inserts it into the `document`.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| document | Document | Document node. |
-| name | `string` | Document type name. |
-| publicId | `string` | Document type public identifier. |
-| systemId | `string` | Document type system identifier. |
-
-**Returns:** `void`
-
-___
-
-
-### setNodeSourceCodeLocation
-
-▸ **setNodeSourceCodeLocation**(node: *Node*, location: *[Location](../source-code-location/location.md) | [ElementLocation](../source-code-location/element-location.md)*): `void`
-
-Attaches source code location information to the node.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | Node | Node. |
-| location | [Location](../source-code-location/location.md) | [ElementLocation](../source-code-location/element-location.md) | Source code location information. |
-
-**Returns:** `void`
-
-___
-
-
-### setTemplateContent
-
-▸ **setTemplateContent**(templateElement: *Element*, contentElement: *DocumentFragment*): `void`
-
-Sets the `` element content element.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| templateElement | Element | `` element. |
-| contentElement | DocumentFragment | Content element. |
-
-**Returns:** `void`
-___
-
-
-### updateNodeSourceCodeLocation
-
-▸ **updateNodeSourceCodeLocation**(node: *Node*, endLocation: *[EndLocation](../source-code-location/end-location.md)*): `void`
-
-Updates the source code location of nodes.
-
-**Parameters:**
-
-| Param | Type | Description |
-| ------ | ------ | ------ |
-| node | Node | Node. |
-| endLocation | [EndLocation](../source-code-location/end-location.md) | Source code location information of the end of the node. |
-
-**Returns:** `void`
-___
diff --git a/packages/parse5/lib/common/doctype.d.ts b/packages/parse5/lib/common/doctype.d.ts
new file mode 100644
index 0000000..8c56fd7
--- /dev/null
+++ b/packages/parse5/lib/common/doctype.d.ts
@@ -0,0 +1,5 @@
+import { DOCUMENT_MODE } from './html.js';
+import type { DoctypeToken } from './token.js';
+export declare function isConforming(token: DoctypeToken): boolean;
+export declare function getDocumentMode(token: DoctypeToken): DOCUMENT_MODE;
+//# sourceMappingURL=doctype.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/doctype.d.ts.map b/packages/parse5/lib/common/doctype.d.ts.map
new file mode 100644
index 0000000..ecbeda6
--- /dev/null
+++ b/packages/parse5/lib/common/doctype.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"doctype.d.ts","sourceRoot":"","sources":["../../../lib/common/doctype.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA0F/C,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAMzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAmClE"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/doctype.js b/packages/parse5/lib/common/doctype.js
index e9dfb67..cd287f7 100644
--- a/packages/parse5/lib/common/doctype.js
+++ b/packages/parse5/lib/common/doctype.js
@@ -1,12 +1,11 @@
-'use strict';
-
-const { DOCUMENT_MODE } = require('./html');
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getDocumentMode = exports.isConforming = void 0;
+const html_js_1 = require("./html.js");
//Const
const VALID_DOCTYPE_NAME = 'html';
const VALID_SYSTEM_ID = 'about:legacy-compat';
const QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd';
-
const QUIRKS_MODE_PUBLIC_ID_PREFIXES = [
'+//silmaril//dtd html pro v0r11 19970101//',
'-//as//dtd html 3.0 aswedit + extensions//',
@@ -62,101 +61,60 @@ const QUIRKS_MODE_PUBLIC_ID_PREFIXES = [
'-//w3c//dtd w3 html//',
'-//w3o//dtd w3 html 3.0//',
'-//webtechs//dtd mozilla html 2.0//',
- '-//webtechs//dtd mozilla html//'
+ '-//webtechs//dtd mozilla html//',
];
-
-const QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = QUIRKS_MODE_PUBLIC_ID_PREFIXES.concat([
+const QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = [
+ ...QUIRKS_MODE_PUBLIC_ID_PREFIXES,
'-//w3c//dtd html 4.01 frameset//',
- '-//w3c//dtd html 4.01 transitional//'
+ '-//w3c//dtd html 4.01 transitional//',
+];
+const QUIRKS_MODE_PUBLIC_IDS = new Set([
+ '-//w3o//dtd w3 html strict 3.0//en//',
+ '-/w3c/dtd html 4.0 transitional/en',
+ 'html',
]);
-
-const QUIRKS_MODE_PUBLIC_IDS = ['-//w3o//dtd w3 html strict 3.0//en//', '-/w3c/dtd html 4.0 transitional/en', 'html'];
const LIMITED_QUIRKS_PUBLIC_ID_PREFIXES = ['-//w3c//dtd xhtml 1.0 frameset//', '-//w3c//dtd xhtml 1.0 transitional//'];
-
-const LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES = LIMITED_QUIRKS_PUBLIC_ID_PREFIXES.concat([
+const LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES = [
+ ...LIMITED_QUIRKS_PUBLIC_ID_PREFIXES,
'-//w3c//dtd html 4.01 frameset//',
- '-//w3c//dtd html 4.01 transitional//'
-]);
-
+ '-//w3c//dtd html 4.01 transitional//',
+];
//Utils
-function enquoteDoctypeId(id) {
- const quote = id.indexOf('"') !== -1 ? "'" : '"';
-
- return quote + id + quote;
-}
-
function hasPrefix(publicId, prefixes) {
- for (let i = 0; i < prefixes.length; i++) {
- if (publicId.indexOf(prefixes[i]) === 0) {
- return true;
- }
- }
-
- return false;
+ return prefixes.some((prefix) => publicId.startsWith(prefix));
}
-
//API
-exports.isConforming = function(token) {
- return (
- token.name === VALID_DOCTYPE_NAME &&
+function isConforming(token) {
+ return (token.name === VALID_DOCTYPE_NAME &&
token.publicId === null &&
- (token.systemId === null || token.systemId === VALID_SYSTEM_ID)
- );
-};
-
-exports.getDocumentMode = function(token) {
+ (token.systemId === null || token.systemId === VALID_SYSTEM_ID));
+}
+exports.isConforming = isConforming;
+function getDocumentMode(token) {
if (token.name !== VALID_DOCTYPE_NAME) {
- return DOCUMENT_MODE.QUIRKS;
+ return html_js_1.DOCUMENT_MODE.QUIRKS;
}
-
- const systemId = token.systemId;
-
+ const { systemId } = token;
if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID) {
- return DOCUMENT_MODE.QUIRKS;
+ return html_js_1.DOCUMENT_MODE.QUIRKS;
}
-
- let publicId = token.publicId;
-
+ let { publicId } = token;
if (publicId !== null) {
publicId = publicId.toLowerCase();
-
- if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1) {
- return DOCUMENT_MODE.QUIRKS;
+ if (QUIRKS_MODE_PUBLIC_IDS.has(publicId)) {
+ return html_js_1.DOCUMENT_MODE.QUIRKS;
}
-
let prefixes = systemId === null ? QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES : QUIRKS_MODE_PUBLIC_ID_PREFIXES;
-
if (hasPrefix(publicId, prefixes)) {
- return DOCUMENT_MODE.QUIRKS;
+ return html_js_1.DOCUMENT_MODE.QUIRKS;
}
-
prefixes =
systemId === null ? LIMITED_QUIRKS_PUBLIC_ID_PREFIXES : LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES;
-
if (hasPrefix(publicId, prefixes)) {
- return DOCUMENT_MODE.LIMITED_QUIRKS;
+ return html_js_1.DOCUMENT_MODE.LIMITED_QUIRKS;
}
}
-
- return DOCUMENT_MODE.NO_QUIRKS;
-};
-
-exports.serializeContent = function(name, publicId, systemId) {
- let str = '!DOCTYPE ';
-
- if (name) {
- str += name;
- }
-
- if (publicId) {
- str += ' PUBLIC ' + enquoteDoctypeId(publicId);
- } else if (systemId) {
- str += ' SYSTEM';
- }
-
- if (systemId !== null) {
- str += ' ' + enquoteDoctypeId(systemId);
- }
-
- return str;
-};
+ return html_js_1.DOCUMENT_MODE.NO_QUIRKS;
+}
+exports.getDocumentMode = getDocumentMode;
+//# sourceMappingURL=doctype.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/doctype.js.map b/packages/parse5/lib/common/doctype.js.map
new file mode 100644
index 0000000..9e3cec4
--- /dev/null
+++ b/packages/parse5/lib/common/doctype.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"doctype.js","sourceRoot":"","sources":["../../../lib/common/doctype.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/error-codes.d.ts b/packages/parse5/lib/common/error-codes.d.ts
new file mode 100644
index 0000000..13b0658
--- /dev/null
+++ b/packages/parse5/lib/common/error-codes.d.ts
@@ -0,0 +1,68 @@
+import type { Location } from './token.js';
+export interface ParserError extends Location {
+ code: ERR;
+}
+export declare type ParserErrorHandler = (error: ParserError) => void;
+export declare enum ERR {
+ controlCharacterInInputStream = "control-character-in-input-stream",
+ noncharacterInInputStream = "noncharacter-in-input-stream",
+ surrogateInInputStream = "surrogate-in-input-stream",
+ nonVoidHtmlElementStartTagWithTrailingSolidus = "non-void-html-element-start-tag-with-trailing-solidus",
+ endTagWithAttributes = "end-tag-with-attributes",
+ endTagWithTrailingSolidus = "end-tag-with-trailing-solidus",
+ unexpectedSolidusInTag = "unexpected-solidus-in-tag",
+ unexpectedNullCharacter = "unexpected-null-character",
+ unexpectedQuestionMarkInsteadOfTagName = "unexpected-question-mark-instead-of-tag-name",
+ invalidFirstCharacterOfTagName = "invalid-first-character-of-tag-name",
+ unexpectedEqualsSignBeforeAttributeName = "unexpected-equals-sign-before-attribute-name",
+ missingEndTagName = "missing-end-tag-name",
+ unexpectedCharacterInAttributeName = "unexpected-character-in-attribute-name",
+ unknownNamedCharacterReference = "unknown-named-character-reference",
+ missingSemicolonAfterCharacterReference = "missing-semicolon-after-character-reference",
+ unexpectedCharacterAfterDoctypeSystemIdentifier = "unexpected-character-after-doctype-system-identifier",
+ unexpectedCharacterInUnquotedAttributeValue = "unexpected-character-in-unquoted-attribute-value",
+ eofBeforeTagName = "eof-before-tag-name",
+ eofInTag = "eof-in-tag",
+ missingAttributeValue = "missing-attribute-value",
+ missingWhitespaceBetweenAttributes = "missing-whitespace-between-attributes",
+ missingWhitespaceAfterDoctypePublicKeyword = "missing-whitespace-after-doctype-public-keyword",
+ missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers = "missing-whitespace-between-doctype-public-and-system-identifiers",
+ missingWhitespaceAfterDoctypeSystemKeyword = "missing-whitespace-after-doctype-system-keyword",
+ missingQuoteBeforeDoctypePublicIdentifier = "missing-quote-before-doctype-public-identifier",
+ missingQuoteBeforeDoctypeSystemIdentifier = "missing-quote-before-doctype-system-identifier",
+ missingDoctypePublicIdentifier = "missing-doctype-public-identifier",
+ missingDoctypeSystemIdentifier = "missing-doctype-system-identifier",
+ abruptDoctypePublicIdentifier = "abrupt-doctype-public-identifier",
+ abruptDoctypeSystemIdentifier = "abrupt-doctype-system-identifier",
+ cdataInHtmlContent = "cdata-in-html-content",
+ incorrectlyOpenedComment = "incorrectly-opened-comment",
+ eofInScriptHtmlCommentLikeText = "eof-in-script-html-comment-like-text",
+ eofInDoctype = "eof-in-doctype",
+ nestedComment = "nested-comment",
+ abruptClosingOfEmptyComment = "abrupt-closing-of-empty-comment",
+ eofInComment = "eof-in-comment",
+ incorrectlyClosedComment = "incorrectly-closed-comment",
+ eofInCdata = "eof-in-cdata",
+ absenceOfDigitsInNumericCharacterReference = "absence-of-digits-in-numeric-character-reference",
+ nullCharacterReference = "null-character-reference",
+ surrogateCharacterReference = "surrogate-character-reference",
+ characterReferenceOutsideUnicodeRange = "character-reference-outside-unicode-range",
+ controlCharacterReference = "control-character-reference",
+ noncharacterCharacterReference = "noncharacter-character-reference",
+ missingWhitespaceBeforeDoctypeName = "missing-whitespace-before-doctype-name",
+ missingDoctypeName = "missing-doctype-name",
+ invalidCharacterSequenceAfterDoctypeName = "invalid-character-sequence-after-doctype-name",
+ duplicateAttribute = "duplicate-attribute",
+ nonConformingDoctype = "non-conforming-doctype",
+ missingDoctype = "missing-doctype",
+ misplacedDoctype = "misplaced-doctype",
+ endTagWithoutMatchingOpenElement = "end-tag-without-matching-open-element",
+ closingOfElementWithOpenChildElements = "closing-of-element-with-open-child-elements",
+ disallowedContentInNoscriptInHead = "disallowed-content-in-noscript-in-head",
+ openElementsLeftAfterEof = "open-elements-left-after-eof",
+ abandonedHeadElementChild = "abandoned-head-element-child",
+ misplacedStartTagForHeadElement = "misplaced-start-tag-for-head-element",
+ nestedNoscriptInHead = "nested-noscript-in-head",
+ eofInElementThatCanContainOnlyText = "eof-in-element-that-can-contain-only-text"
+}
+//# sourceMappingURL=error-codes.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/error-codes.d.ts.map b/packages/parse5/lib/common/error-codes.d.ts.map
new file mode 100644
index 0000000..8e535ee
--- /dev/null
+++ b/packages/parse5/lib/common/error-codes.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../../../lib/common/error-codes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,WAAY,SAAQ,QAAQ;IACzC,IAAI,EAAE,GAAG,CAAC;CACb;AAED,oBAAY,kBAAkB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAE9D,oBAAY,GAAG;IACX,6BAA6B,sCAAsC;IACnE,yBAAyB,iCAAiC;IAC1D,sBAAsB,8BAA8B;IACpD,6CAA6C,0DAA0D;IACvG,oBAAoB,4BAA4B;IAChD,yBAAyB,kCAAkC;IAC3D,sBAAsB,8BAA8B;IACpD,uBAAuB,8BAA8B;IACrD,sCAAsC,iDAAiD;IACvF,8BAA8B,wCAAwC;IACtE,uCAAuC,iDAAiD;IACxF,iBAAiB,yBAAyB;IAC1C,kCAAkC,2CAA2C;IAC7E,8BAA8B,sCAAsC;IACpE,uCAAuC,gDAAgD;IACvF,+CAA+C,yDAAyD;IACxG,2CAA2C,qDAAqD;IAChG,gBAAgB,wBAAwB;IACxC,QAAQ,eAAe;IACvB,qBAAqB,4BAA4B;IACjD,kCAAkC,0CAA0C;IAC5E,0CAA0C,oDAAoD;IAC9F,yDAAyD,qEAAqE;IAC9H,0CAA0C,oDAAoD;IAC9F,yCAAyC,mDAAmD;IAC5F,yCAAyC,mDAAmD;IAC5F,8BAA8B,sCAAsC;IACpE,8BAA8B,sCAAsC;IACpE,6BAA6B,qCAAqC;IAClE,6BAA6B,qCAAqC;IAClE,kBAAkB,0BAA0B;IAC5C,wBAAwB,+BAA+B;IACvD,8BAA8B,yCAAyC;IACvE,YAAY,mBAAmB;IAC/B,aAAa,mBAAmB;IAChC,2BAA2B,oCAAoC;IAC/D,YAAY,mBAAmB;IAC/B,wBAAwB,+BAA+B;IACvD,UAAU,iBAAiB;IAC3B,0CAA0C,qDAAqD;IAC/F,sBAAsB,6BAA6B;IACnD,2BAA2B,kCAAkC;IAC7D,qCAAqC,8CAA8C;IACnF,yBAAyB,gCAAgC;IACzD,8BAA8B,qCAAqC;IACnE,kCAAkC,2CAA2C;IAC7E,kBAAkB,yBAAyB;IAC3C,wCAAwC,kDAAkD;IAC1F,kBAAkB,wBAAwB;IAC1C,oBAAoB,2BAA2B;IAC/C,cAAc,oBAAoB;IAClC,gBAAgB,sBAAsB;IACtC,gCAAgC,0CAA0C;IAC1E,qCAAqC,gDAAgD;IACrF,iCAAiC,2CAA2C;IAC5E,wBAAwB,iCAAiC;IACzD,yBAAyB,iCAAiC;IAC1D,+BAA+B,yCAAyC;IACxE,oBAAoB,4BAA4B;IAChD,kCAAkC,8CAA8C;CACnF"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/error-codes.js b/packages/parse5/lib/common/error-codes.js
index 25f3cfd..9fa3c8a 100644
--- a/packages/parse5/lib/common/error-codes.js
+++ b/packages/parse5/lib/common/error-codes.js
@@ -1,65 +1,67 @@
-'use strict';
-
-module.exports = {
- controlCharacterInInputStream: 'control-character-in-input-stream',
- noncharacterInInputStream: 'noncharacter-in-input-stream',
- surrogateInInputStream: 'surrogate-in-input-stream',
- nonVoidHtmlElementStartTagWithTrailingSolidus: 'non-void-html-element-start-tag-with-trailing-solidus',
- endTagWithAttributes: 'end-tag-with-attributes',
- endTagWithTrailingSolidus: 'end-tag-with-trailing-solidus',
- unexpectedSolidusInTag: 'unexpected-solidus-in-tag',
- unexpectedNullCharacter: 'unexpected-null-character',
- unexpectedQuestionMarkInsteadOfTagName: 'unexpected-question-mark-instead-of-tag-name',
- invalidFirstCharacterOfTagName: 'invalid-first-character-of-tag-name',
- unexpectedEqualsSignBeforeAttributeName: 'unexpected-equals-sign-before-attribute-name',
- missingEndTagName: 'missing-end-tag-name',
- unexpectedCharacterInAttributeName: 'unexpected-character-in-attribute-name',
- unknownNamedCharacterReference: 'unknown-named-character-reference',
- missingSemicolonAfterCharacterReference: 'missing-semicolon-after-character-reference',
- unexpectedCharacterAfterDoctypeSystemIdentifier: 'unexpected-character-after-doctype-system-identifier',
- unexpectedCharacterInUnquotedAttributeValue: 'unexpected-character-in-unquoted-attribute-value',
- eofBeforeTagName: 'eof-before-tag-name',
- eofInTag: 'eof-in-tag',
- missingAttributeValue: 'missing-attribute-value',
- missingWhitespaceBetweenAttributes: 'missing-whitespace-between-attributes',
- missingWhitespaceAfterDoctypePublicKeyword: 'missing-whitespace-after-doctype-public-keyword',
- missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers:
- 'missing-whitespace-between-doctype-public-and-system-identifiers',
- missingWhitespaceAfterDoctypeSystemKeyword: 'missing-whitespace-after-doctype-system-keyword',
- missingQuoteBeforeDoctypePublicIdentifier: 'missing-quote-before-doctype-public-identifier',
- missingQuoteBeforeDoctypeSystemIdentifier: 'missing-quote-before-doctype-system-identifier',
- missingDoctypePublicIdentifier: 'missing-doctype-public-identifier',
- missingDoctypeSystemIdentifier: 'missing-doctype-system-identifier',
- abruptDoctypePublicIdentifier: 'abrupt-doctype-public-identifier',
- abruptDoctypeSystemIdentifier: 'abrupt-doctype-system-identifier',
- cdataInHtmlContent: 'cdata-in-html-content',
- incorrectlyOpenedComment: 'incorrectly-opened-comment',
- eofInScriptHtmlCommentLikeText: 'eof-in-script-html-comment-like-text',
- eofInDoctype: 'eof-in-doctype',
- nestedComment: 'nested-comment',
- abruptClosingOfEmptyComment: 'abrupt-closing-of-empty-comment',
- eofInComment: 'eof-in-comment',
- incorrectlyClosedComment: 'incorrectly-closed-comment',
- eofInCdata: 'eof-in-cdata',
- absenceOfDigitsInNumericCharacterReference: 'absence-of-digits-in-numeric-character-reference',
- nullCharacterReference: 'null-character-reference',
- surrogateCharacterReference: 'surrogate-character-reference',
- characterReferenceOutsideUnicodeRange: 'character-reference-outside-unicode-range',
- controlCharacterReference: 'control-character-reference',
- noncharacterCharacterReference: 'noncharacter-character-reference',
- missingWhitespaceBeforeDoctypeName: 'missing-whitespace-before-doctype-name',
- missingDoctypeName: 'missing-doctype-name',
- invalidCharacterSequenceAfterDoctypeName: 'invalid-character-sequence-after-doctype-name',
- duplicateAttribute: 'duplicate-attribute',
- nonConformingDoctype: 'non-conforming-doctype',
- missingDoctype: 'missing-doctype',
- misplacedDoctype: 'misplaced-doctype',
- endTagWithoutMatchingOpenElement: 'end-tag-without-matching-open-element',
- closingOfElementWithOpenChildElements: 'closing-of-element-with-open-child-elements',
- disallowedContentInNoscriptInHead: 'disallowed-content-in-noscript-in-head',
- openElementsLeftAfterEof: 'open-elements-left-after-eof',
- abandonedHeadElementChild: 'abandoned-head-element-child',
- misplacedStartTagForHeadElement: 'misplaced-start-tag-for-head-element',
- nestedNoscriptInHead: 'nested-noscript-in-head',
- eofInElementThatCanContainOnlyText: 'eof-in-element-that-can-contain-only-text'
-};
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ERR = void 0;
+var ERR;
+(function (ERR) {
+ ERR["controlCharacterInInputStream"] = "control-character-in-input-stream";
+ ERR["noncharacterInInputStream"] = "noncharacter-in-input-stream";
+ ERR["surrogateInInputStream"] = "surrogate-in-input-stream";
+ ERR["nonVoidHtmlElementStartTagWithTrailingSolidus"] = "non-void-html-element-start-tag-with-trailing-solidus";
+ ERR["endTagWithAttributes"] = "end-tag-with-attributes";
+ ERR["endTagWithTrailingSolidus"] = "end-tag-with-trailing-solidus";
+ ERR["unexpectedSolidusInTag"] = "unexpected-solidus-in-tag";
+ ERR["unexpectedNullCharacter"] = "unexpected-null-character";
+ ERR["unexpectedQuestionMarkInsteadOfTagName"] = "unexpected-question-mark-instead-of-tag-name";
+ ERR["invalidFirstCharacterOfTagName"] = "invalid-first-character-of-tag-name";
+ ERR["unexpectedEqualsSignBeforeAttributeName"] = "unexpected-equals-sign-before-attribute-name";
+ ERR["missingEndTagName"] = "missing-end-tag-name";
+ ERR["unexpectedCharacterInAttributeName"] = "unexpected-character-in-attribute-name";
+ ERR["unknownNamedCharacterReference"] = "unknown-named-character-reference";
+ ERR["missingSemicolonAfterCharacterReference"] = "missing-semicolon-after-character-reference";
+ ERR["unexpectedCharacterAfterDoctypeSystemIdentifier"] = "unexpected-character-after-doctype-system-identifier";
+ ERR["unexpectedCharacterInUnquotedAttributeValue"] = "unexpected-character-in-unquoted-attribute-value";
+ ERR["eofBeforeTagName"] = "eof-before-tag-name";
+ ERR["eofInTag"] = "eof-in-tag";
+ ERR["missingAttributeValue"] = "missing-attribute-value";
+ ERR["missingWhitespaceBetweenAttributes"] = "missing-whitespace-between-attributes";
+ ERR["missingWhitespaceAfterDoctypePublicKeyword"] = "missing-whitespace-after-doctype-public-keyword";
+ ERR["missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers"] = "missing-whitespace-between-doctype-public-and-system-identifiers";
+ ERR["missingWhitespaceAfterDoctypeSystemKeyword"] = "missing-whitespace-after-doctype-system-keyword";
+ ERR["missingQuoteBeforeDoctypePublicIdentifier"] = "missing-quote-before-doctype-public-identifier";
+ ERR["missingQuoteBeforeDoctypeSystemIdentifier"] = "missing-quote-before-doctype-system-identifier";
+ ERR["missingDoctypePublicIdentifier"] = "missing-doctype-public-identifier";
+ ERR["missingDoctypeSystemIdentifier"] = "missing-doctype-system-identifier";
+ ERR["abruptDoctypePublicIdentifier"] = "abrupt-doctype-public-identifier";
+ ERR["abruptDoctypeSystemIdentifier"] = "abrupt-doctype-system-identifier";
+ ERR["cdataInHtmlContent"] = "cdata-in-html-content";
+ ERR["incorrectlyOpenedComment"] = "incorrectly-opened-comment";
+ ERR["eofInScriptHtmlCommentLikeText"] = "eof-in-script-html-comment-like-text";
+ ERR["eofInDoctype"] = "eof-in-doctype";
+ ERR["nestedComment"] = "nested-comment";
+ ERR["abruptClosingOfEmptyComment"] = "abrupt-closing-of-empty-comment";
+ ERR["eofInComment"] = "eof-in-comment";
+ ERR["incorrectlyClosedComment"] = "incorrectly-closed-comment";
+ ERR["eofInCdata"] = "eof-in-cdata";
+ ERR["absenceOfDigitsInNumericCharacterReference"] = "absence-of-digits-in-numeric-character-reference";
+ ERR["nullCharacterReference"] = "null-character-reference";
+ ERR["surrogateCharacterReference"] = "surrogate-character-reference";
+ ERR["characterReferenceOutsideUnicodeRange"] = "character-reference-outside-unicode-range";
+ ERR["controlCharacterReference"] = "control-character-reference";
+ ERR["noncharacterCharacterReference"] = "noncharacter-character-reference";
+ ERR["missingWhitespaceBeforeDoctypeName"] = "missing-whitespace-before-doctype-name";
+ ERR["missingDoctypeName"] = "missing-doctype-name";
+ ERR["invalidCharacterSequenceAfterDoctypeName"] = "invalid-character-sequence-after-doctype-name";
+ ERR["duplicateAttribute"] = "duplicate-attribute";
+ ERR["nonConformingDoctype"] = "non-conforming-doctype";
+ ERR["missingDoctype"] = "missing-doctype";
+ ERR["misplacedDoctype"] = "misplaced-doctype";
+ ERR["endTagWithoutMatchingOpenElement"] = "end-tag-without-matching-open-element";
+ ERR["closingOfElementWithOpenChildElements"] = "closing-of-element-with-open-child-elements";
+ ERR["disallowedContentInNoscriptInHead"] = "disallowed-content-in-noscript-in-head";
+ ERR["openElementsLeftAfterEof"] = "open-elements-left-after-eof";
+ ERR["abandonedHeadElementChild"] = "abandoned-head-element-child";
+ ERR["misplacedStartTagForHeadElement"] = "misplaced-start-tag-for-head-element";
+ ERR["nestedNoscriptInHead"] = "nested-noscript-in-head";
+ ERR["eofInElementThatCanContainOnlyText"] = "eof-in-element-that-can-contain-only-text";
+})(ERR = exports.ERR || (exports.ERR = {}));
+//# sourceMappingURL=error-codes.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/error-codes.js.map b/packages/parse5/lib/common/error-codes.js.map
new file mode 100644
index 0000000..f3b65ae
--- /dev/null
+++ b/packages/parse5/lib/common/error-codes.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"error-codes.js","sourceRoot":"","sources":["../../../lib/common/error-codes.ts"],"names":[],"mappings":";;;AAQA,IAAY,GA6DX;AA7DD,WAAY,GAAG;IACX,0EAAmE,CAAA;IACnE,iEAA0D,CAAA;IAC1D,2DAAoD,CAAA;IACpD,8GAAuG,CAAA;IACvG,uDAAgD,CAAA;IAChD,kEAA2D,CAAA;IAC3D,2DAAoD,CAAA;IACpD,4DAAqD,CAAA;IACrD,8FAAuF,CAAA;IACvF,6EAAsE,CAAA;IACtE,+FAAwF,CAAA;IACxF,iDAA0C,CAAA;IAC1C,oFAA6E,CAAA;IAC7E,2EAAoE,CAAA;IACpE,8FAAuF,CAAA;IACvF,+GAAwG,CAAA;IACxG,uGAAgG,CAAA;IAChG,+CAAwC,CAAA;IACxC,8BAAuB,CAAA;IACvB,wDAAiD,CAAA;IACjD,mFAA4E,CAAA;IAC5E,qGAA8F,CAAA;IAC9F,qIAA8H,CAAA;IAC9H,qGAA8F,CAAA;IAC9F,mGAA4F,CAAA;IAC5F,mGAA4F,CAAA;IAC5F,2EAAoE,CAAA;IACpE,2EAAoE,CAAA;IACpE,yEAAkE,CAAA;IAClE,yEAAkE,CAAA;IAClE,mDAA4C,CAAA;IAC5C,8DAAuD,CAAA;IACvD,8EAAuE,CAAA;IACvE,sCAA+B,CAAA;IAC/B,uCAAgC,CAAA;IAChC,sEAA+D,CAAA;IAC/D,sCAA+B,CAAA;IAC/B,8DAAuD,CAAA;IACvD,kCAA2B,CAAA;IAC3B,sGAA+F,CAAA;IAC/F,0DAAmD,CAAA;IACnD,oEAA6D,CAAA;IAC7D,0FAAmF,CAAA;IACnF,gEAAyD,CAAA;IACzD,0EAAmE,CAAA;IACnE,oFAA6E,CAAA;IAC7E,kDAA2C,CAAA;IAC3C,iGAA0F,CAAA;IAC1F,iDAA0C,CAAA;IAC1C,sDAA+C,CAAA;IAC/C,yCAAkC,CAAA;IAClC,6CAAsC,CAAA;IACtC,iFAA0E,CAAA;IAC1E,4FAAqF,CAAA;IACrF,mFAA4E,CAAA;IAC5E,gEAAyD,CAAA;IACzD,iEAA0D,CAAA;IAC1D,+EAAwE,CAAA;IACxE,uDAAgD,CAAA;IAChD,uFAAgF,CAAA;AACpF,CAAC,EA7DW,GAAG,GAAH,WAAG,KAAH,WAAG,QA6Dd"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/foreign-content.d.ts b/packages/parse5/lib/common/foreign-content.d.ts
new file mode 100644
index 0000000..8d9f182
--- /dev/null
+++ b/packages/parse5/lib/common/foreign-content.d.ts
@@ -0,0 +1,10 @@
+import { TAG_ID as $, NS } from './html.js';
+import type { TagToken, Attribute } from './token.js';
+export declare const SVG_TAG_NAMES_ADJUSTMENT_MAP: Map;
+export declare function causesExit(startTagToken: TagToken): boolean;
+export declare function adjustTokenMathMLAttrs(token: TagToken): void;
+export declare function adjustTokenSVGAttrs(token: TagToken): void;
+export declare function adjustTokenXMLAttrs(token: TagToken): void;
+export declare function adjustTokenSVGTagName(token: TagToken): void;
+export declare function isIntegrationPoint(tn: $, ns: NS, attrs: Attribute[], foreignNS?: NS): boolean;
+//# sourceMappingURL=foreign-content.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/foreign-content.d.ts.map b/packages/parse5/lib/common/foreign-content.d.ts.map
new file mode 100644
index 0000000..d34d722
--- /dev/null
+++ b/packages/parse5/lib/common/foreign-content.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"foreign-content.d.ts","sourceRoot":"","sources":["../../../lib/common/foreign-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,EAAE,EAAmB,MAAM,WAAW,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA0FtD,eAAO,MAAM,4BAA4B,qBAuCxC,CAAC;AAmDF,wBAAgB,UAAU,CAAC,aAAa,EAAE,QAAQ,GAAG,OAAO,CAO3D;AAGD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAO5D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAQzD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAUzD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAO3D;AAqBD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,OAAO,CAK7F"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/foreign-content.js b/packages/parse5/lib/common/foreign-content.js
index 10f008b..2a60b13 100644
--- a/packages/parse5/lib/common/foreign-content.js
+++ b/packages/parse5/lib/common/foreign-content.js
@@ -1,265 +1,239 @@
-'use strict';
-
-const Tokenizer = require('../tokenizer');
-const HTML = require('./html');
-
-//Aliases
-const $ = HTML.TAG_NAMES;
-const NS = HTML.NAMESPACES;
-const ATTRS = HTML.ATTRS;
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isIntegrationPoint = exports.adjustTokenSVGTagName = exports.adjustTokenXMLAttrs = exports.adjustTokenSVGAttrs = exports.adjustTokenMathMLAttrs = exports.causesExit = exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = void 0;
+const html_js_1 = require("./html.js");
//MIME types
const MIME_TYPES = {
TEXT_HTML: 'text/html',
- APPLICATION_XML: 'application/xhtml+xml'
+ APPLICATION_XML: 'application/xhtml+xml',
};
-
//Attributes
const DEFINITION_URL_ATTR = 'definitionurl';
const ADJUSTED_DEFINITION_URL_ATTR = 'definitionURL';
-const SVG_ATTRS_ADJUSTMENT_MAP = {
- attributename: 'attributeName',
- attributetype: 'attributeType',
- basefrequency: 'baseFrequency',
- baseprofile: 'baseProfile',
- calcmode: 'calcMode',
- clippathunits: 'clipPathUnits',
- diffuseconstant: 'diffuseConstant',
- edgemode: 'edgeMode',
- filterunits: 'filterUnits',
- glyphref: 'glyphRef',
- gradienttransform: 'gradientTransform',
- gradientunits: 'gradientUnits',
- kernelmatrix: 'kernelMatrix',
- kernelunitlength: 'kernelUnitLength',
- keypoints: 'keyPoints',
- keysplines: 'keySplines',
- keytimes: 'keyTimes',
- lengthadjust: 'lengthAdjust',
- limitingconeangle: 'limitingConeAngle',
- markerheight: 'markerHeight',
- markerunits: 'markerUnits',
- markerwidth: 'markerWidth',
- maskcontentunits: 'maskContentUnits',
- maskunits: 'maskUnits',
- numoctaves: 'numOctaves',
- pathlength: 'pathLength',
- patterncontentunits: 'patternContentUnits',
- patterntransform: 'patternTransform',
- patternunits: 'patternUnits',
- pointsatx: 'pointsAtX',
- pointsaty: 'pointsAtY',
- pointsatz: 'pointsAtZ',
- preservealpha: 'preserveAlpha',
- preserveaspectratio: 'preserveAspectRatio',
- primitiveunits: 'primitiveUnits',
- refx: 'refX',
- refy: 'refY',
- repeatcount: 'repeatCount',
- repeatdur: 'repeatDur',
- requiredextensions: 'requiredExtensions',
- requiredfeatures: 'requiredFeatures',
- specularconstant: 'specularConstant',
- specularexponent: 'specularExponent',
- spreadmethod: 'spreadMethod',
- startoffset: 'startOffset',
- stddeviation: 'stdDeviation',
- stitchtiles: 'stitchTiles',
- surfacescale: 'surfaceScale',
- systemlanguage: 'systemLanguage',
- tablevalues: 'tableValues',
- targetx: 'targetX',
- targety: 'targetY',
- textlength: 'textLength',
- viewbox: 'viewBox',
- viewtarget: 'viewTarget',
- xchannelselector: 'xChannelSelector',
- ychannelselector: 'yChannelSelector',
- zoomandpan: 'zoomAndPan'
-};
-
-const XML_ATTRS_ADJUSTMENT_MAP = {
- 'xlink:actuate': { prefix: 'xlink', name: 'actuate', namespace: NS.XLINK },
- 'xlink:arcrole': { prefix: 'xlink', name: 'arcrole', namespace: NS.XLINK },
- 'xlink:href': { prefix: 'xlink', name: 'href', namespace: NS.XLINK },
- 'xlink:role': { prefix: 'xlink', name: 'role', namespace: NS.XLINK },
- 'xlink:show': { prefix: 'xlink', name: 'show', namespace: NS.XLINK },
- 'xlink:title': { prefix: 'xlink', name: 'title', namespace: NS.XLINK },
- 'xlink:type': { prefix: 'xlink', name: 'type', namespace: NS.XLINK },
- 'xml:base': { prefix: 'xml', name: 'base', namespace: NS.XML },
- 'xml:lang': { prefix: 'xml', name: 'lang', namespace: NS.XML },
- 'xml:space': { prefix: 'xml', name: 'space', namespace: NS.XML },
- xmlns: { prefix: '', name: 'xmlns', namespace: NS.XMLNS },
- 'xmlns:xlink': { prefix: 'xmlns', name: 'xlink', namespace: NS.XMLNS }
-};
-
+const SVG_ATTRS_ADJUSTMENT_MAP = new Map([
+ 'attributeName',
+ 'attributeType',
+ 'baseFrequency',
+ 'baseProfile',
+ 'calcMode',
+ 'clipPathUnits',
+ 'diffuseConstant',
+ 'edgeMode',
+ 'filterUnits',
+ 'glyphRef',
+ 'gradientTransform',
+ 'gradientUnits',
+ 'kernelMatrix',
+ 'kernelUnitLength',
+ 'keyPoints',
+ 'keySplines',
+ 'keyTimes',
+ 'lengthAdjust',
+ 'limitingConeAngle',
+ 'markerHeight',
+ 'markerUnits',
+ 'markerWidth',
+ 'maskContentUnits',
+ 'maskUnits',
+ 'numOctaves',
+ 'pathLength',
+ 'patternContentUnits',
+ 'patternTransform',
+ 'patternUnits',
+ 'pointsAtX',
+ 'pointsAtY',
+ 'pointsAtZ',
+ 'preserveAlpha',
+ 'preserveAspectRatio',
+ 'primitiveUnits',
+ 'refX',
+ 'refY',
+ 'repeatCount',
+ 'repeatDur',
+ 'requiredExtensions',
+ 'requiredFeatures',
+ 'specularConstant',
+ 'specularExponent',
+ 'spreadMethod',
+ 'startOffset',
+ 'stdDeviation',
+ 'stitchTiles',
+ 'surfaceScale',
+ 'systemLanguage',
+ 'tableValues',
+ 'targetX',
+ 'targetY',
+ 'textLength',
+ 'viewBox',
+ 'viewTarget',
+ 'xChannelSelector',
+ 'yChannelSelector',
+ 'zoomAndPan',
+].map((attr) => [attr.toLowerCase(), attr]));
+const XML_ATTRS_ADJUSTMENT_MAP = new Map([
+ ['xlink:actuate', { prefix: 'xlink', name: 'actuate', namespace: html_js_1.NS.XLINK }],
+ ['xlink:arcrole', { prefix: 'xlink', name: 'arcrole', namespace: html_js_1.NS.XLINK }],
+ ['xlink:href', { prefix: 'xlink', name: 'href', namespace: html_js_1.NS.XLINK }],
+ ['xlink:role', { prefix: 'xlink', name: 'role', namespace: html_js_1.NS.XLINK }],
+ ['xlink:show', { prefix: 'xlink', name: 'show', namespace: html_js_1.NS.XLINK }],
+ ['xlink:title', { prefix: 'xlink', name: 'title', namespace: html_js_1.NS.XLINK }],
+ ['xlink:type', { prefix: 'xlink', name: 'type', namespace: html_js_1.NS.XLINK }],
+ ['xml:base', { prefix: 'xml', name: 'base', namespace: html_js_1.NS.XML }],
+ ['xml:lang', { prefix: 'xml', name: 'lang', namespace: html_js_1.NS.XML }],
+ ['xml:space', { prefix: 'xml', name: 'space', namespace: html_js_1.NS.XML }],
+ ['xmlns', { prefix: '', name: 'xmlns', namespace: html_js_1.NS.XMLNS }],
+ ['xmlns:xlink', { prefix: 'xmlns', name: 'xlink', namespace: html_js_1.NS.XMLNS }],
+]);
//SVG tag names adjustment map
-const SVG_TAG_NAMES_ADJUSTMENT_MAP = (exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = {
- altglyph: 'altGlyph',
- altglyphdef: 'altGlyphDef',
- altglyphitem: 'altGlyphItem',
- animatecolor: 'animateColor',
- animatemotion: 'animateMotion',
- animatetransform: 'animateTransform',
- clippath: 'clipPath',
- feblend: 'feBlend',
- fecolormatrix: 'feColorMatrix',
- fecomponenttransfer: 'feComponentTransfer',
- fecomposite: 'feComposite',
- feconvolvematrix: 'feConvolveMatrix',
- fediffuselighting: 'feDiffuseLighting',
- fedisplacementmap: 'feDisplacementMap',
- fedistantlight: 'feDistantLight',
- feflood: 'feFlood',
- fefunca: 'feFuncA',
- fefuncb: 'feFuncB',
- fefuncg: 'feFuncG',
- fefuncr: 'feFuncR',
- fegaussianblur: 'feGaussianBlur',
- feimage: 'feImage',
- femerge: 'feMerge',
- femergenode: 'feMergeNode',
- femorphology: 'feMorphology',
- feoffset: 'feOffset',
- fepointlight: 'fePointLight',
- fespecularlighting: 'feSpecularLighting',
- fespotlight: 'feSpotLight',
- fetile: 'feTile',
- feturbulence: 'feTurbulence',
- foreignobject: 'foreignObject',
- glyphref: 'glyphRef',
- lineargradient: 'linearGradient',
- radialgradient: 'radialGradient',
- textpath: 'textPath'
-});
-
+exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = new Map([
+ 'altGlyph',
+ 'altGlyphDef',
+ 'altGlyphItem',
+ 'animateColor',
+ 'animateMotion',
+ 'animateTransform',
+ 'clipPath',
+ 'feBlend',
+ 'feColorMatrix',
+ 'feComponentTransfer',
+ 'feComposite',
+ 'feConvolveMatrix',
+ 'feDiffuseLighting',
+ 'feDisplacementMap',
+ 'feDistantLight',
+ 'feFlood',
+ 'feFuncA',
+ 'feFuncB',
+ 'feFuncG',
+ 'feFuncR',
+ 'feGaussianBlur',
+ 'feImage',
+ 'feMerge',
+ 'feMergeNode',
+ 'feMorphology',
+ 'feOffset',
+ 'fePointLight',
+ 'feSpecularLighting',
+ 'feSpotLight',
+ 'feTile',
+ 'feTurbulence',
+ 'foreignObject',
+ 'glyphRef',
+ 'linearGradient',
+ 'radialGradient',
+ 'textPath',
+].map((tn) => [tn.toLowerCase(), tn]));
//Tags that causes exit from foreign content
-const EXITS_FOREIGN_CONTENT = {
- [$.B]: true,
- [$.BIG]: true,
- [$.BLOCKQUOTE]: true,
- [$.BODY]: true,
- [$.BR]: true,
- [$.CENTER]: true,
- [$.CODE]: true,
- [$.DD]: true,
- [$.DIV]: true,
- [$.DL]: true,
- [$.DT]: true,
- [$.EM]: true,
- [$.EMBED]: true,
- [$.H1]: true,
- [$.H2]: true,
- [$.H3]: true,
- [$.H4]: true,
- [$.H5]: true,
- [$.H6]: true,
- [$.HEAD]: true,
- [$.HR]: true,
- [$.I]: true,
- [$.IMG]: true,
- [$.LI]: true,
- [$.LISTING]: true,
- [$.MENU]: true,
- [$.META]: true,
- [$.NOBR]: true,
- [$.OL]: true,
- [$.P]: true,
- [$.PRE]: true,
- [$.RUBY]: true,
- [$.S]: true,
- [$.SMALL]: true,
- [$.SPAN]: true,
- [$.STRONG]: true,
- [$.STRIKE]: true,
- [$.SUB]: true,
- [$.SUP]: true,
- [$.TABLE]: true,
- [$.TT]: true,
- [$.U]: true,
- [$.UL]: true,
- [$.VAR]: true
-};
-
+const EXITS_FOREIGN_CONTENT = new Set([
+ html_js_1.TAG_ID.B,
+ html_js_1.TAG_ID.BIG,
+ html_js_1.TAG_ID.BLOCKQUOTE,
+ html_js_1.TAG_ID.BODY,
+ html_js_1.TAG_ID.BR,
+ html_js_1.TAG_ID.CENTER,
+ html_js_1.TAG_ID.CODE,
+ html_js_1.TAG_ID.DD,
+ html_js_1.TAG_ID.DIV,
+ html_js_1.TAG_ID.DL,
+ html_js_1.TAG_ID.DT,
+ html_js_1.TAG_ID.EM,
+ html_js_1.TAG_ID.EMBED,
+ html_js_1.TAG_ID.H1,
+ html_js_1.TAG_ID.H2,
+ html_js_1.TAG_ID.H3,
+ html_js_1.TAG_ID.H4,
+ html_js_1.TAG_ID.H5,
+ html_js_1.TAG_ID.H6,
+ html_js_1.TAG_ID.HEAD,
+ html_js_1.TAG_ID.HR,
+ html_js_1.TAG_ID.I,
+ html_js_1.TAG_ID.IMG,
+ html_js_1.TAG_ID.LI,
+ html_js_1.TAG_ID.LISTING,
+ html_js_1.TAG_ID.MENU,
+ html_js_1.TAG_ID.META,
+ html_js_1.TAG_ID.NOBR,
+ html_js_1.TAG_ID.OL,
+ html_js_1.TAG_ID.P,
+ html_js_1.TAG_ID.PRE,
+ html_js_1.TAG_ID.RUBY,
+ html_js_1.TAG_ID.S,
+ html_js_1.TAG_ID.SMALL,
+ html_js_1.TAG_ID.SPAN,
+ html_js_1.TAG_ID.STRONG,
+ html_js_1.TAG_ID.STRIKE,
+ html_js_1.TAG_ID.SUB,
+ html_js_1.TAG_ID.SUP,
+ html_js_1.TAG_ID.TABLE,
+ html_js_1.TAG_ID.TT,
+ html_js_1.TAG_ID.U,
+ html_js_1.TAG_ID.UL,
+ html_js_1.TAG_ID.VAR,
+]);
//Check exit from foreign content
-exports.causesExit = function(startTagToken) {
- const tn = startTagToken.tagName;
- const isFontWithAttrs =
- tn === $.FONT &&
- (Tokenizer.getTokenAttr(startTagToken, ATTRS.COLOR) !== null ||
- Tokenizer.getTokenAttr(startTagToken, ATTRS.SIZE) !== null ||
- Tokenizer.getTokenAttr(startTagToken, ATTRS.FACE) !== null);
-
- return isFontWithAttrs ? true : EXITS_FOREIGN_CONTENT[tn];
-};
-
+function causesExit(startTagToken) {
+ const tn = startTagToken.tagID;
+ const isFontWithAttrs = tn === html_js_1.TAG_ID.FONT &&
+ startTagToken.attrs.some(({ name }) => name === html_js_1.ATTRS.COLOR || name === html_js_1.ATTRS.SIZE || name === html_js_1.ATTRS.FACE);
+ return isFontWithAttrs || EXITS_FOREIGN_CONTENT.has(tn);
+}
+exports.causesExit = causesExit;
//Token adjustments
-exports.adjustTokenMathMLAttrs = function(token) {
+function adjustTokenMathMLAttrs(token) {
for (let i = 0; i < token.attrs.length; i++) {
if (token.attrs[i].name === DEFINITION_URL_ATTR) {
token.attrs[i].name = ADJUSTED_DEFINITION_URL_ATTR;
break;
}
}
-};
-
-exports.adjustTokenSVGAttrs = function(token) {
+}
+exports.adjustTokenMathMLAttrs = adjustTokenMathMLAttrs;
+function adjustTokenSVGAttrs(token) {
for (let i = 0; i < token.attrs.length; i++) {
- const adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name];
-
- if (adjustedAttrName) {
+ const adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name);
+ if (adjustedAttrName != null) {
token.attrs[i].name = adjustedAttrName;
}
}
-};
-
-exports.adjustTokenXMLAttrs = function(token) {
+}
+exports.adjustTokenSVGAttrs = adjustTokenSVGAttrs;
+function adjustTokenXMLAttrs(token) {
for (let i = 0; i < token.attrs.length; i++) {
- const adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name];
-
+ const adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name);
if (adjustedAttrEntry) {
token.attrs[i].prefix = adjustedAttrEntry.prefix;
token.attrs[i].name = adjustedAttrEntry.name;
token.attrs[i].namespace = adjustedAttrEntry.namespace;
}
}
-};
-
-exports.adjustTokenSVGTagName = function(token) {
- const adjustedTagName = SVG_TAG_NAMES_ADJUSTMENT_MAP[token.tagName];
-
- if (adjustedTagName) {
+}
+exports.adjustTokenXMLAttrs = adjustTokenXMLAttrs;
+function adjustTokenSVGTagName(token) {
+ const adjustedTagName = exports.SVG_TAG_NAMES_ADJUSTMENT_MAP.get(token.tagName);
+ if (adjustedTagName != null) {
token.tagName = adjustedTagName;
+ token.tagID = (0, html_js_1.getTagID)(token.tagName);
}
-};
-
+}
+exports.adjustTokenSVGTagName = adjustTokenSVGTagName;
//Integration points
function isMathMLTextIntegrationPoint(tn, ns) {
- return ns === NS.MATHML && (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS || tn === $.MTEXT);
+ return ns === html_js_1.NS.MATHML && (tn === html_js_1.TAG_ID.MI || tn === html_js_1.TAG_ID.MO || tn === html_js_1.TAG_ID.MN || tn === html_js_1.TAG_ID.MS || tn === html_js_1.TAG_ID.MTEXT);
}
-
function isHtmlIntegrationPoint(tn, ns, attrs) {
- if (ns === NS.MATHML && tn === $.ANNOTATION_XML) {
+ if (ns === html_js_1.NS.MATHML && tn === html_js_1.TAG_ID.ANNOTATION_XML) {
for (let i = 0; i < attrs.length; i++) {
- if (attrs[i].name === ATTRS.ENCODING) {
+ if (attrs[i].name === html_js_1.ATTRS.ENCODING) {
const value = attrs[i].value.toLowerCase();
-
return value === MIME_TYPES.TEXT_HTML || value === MIME_TYPES.APPLICATION_XML;
}
}
}
-
- return ns === NS.SVG && (tn === $.FOREIGN_OBJECT || tn === $.DESC || tn === $.TITLE);
+ return ns === html_js_1.NS.SVG && (tn === html_js_1.TAG_ID.FOREIGN_OBJECT || tn === html_js_1.TAG_ID.DESC || tn === html_js_1.TAG_ID.TITLE);
}
-
-exports.isIntegrationPoint = function(tn, ns, attrs, foreignNS) {
- if ((!foreignNS || foreignNS === NS.HTML) && isHtmlIntegrationPoint(tn, ns, attrs)) {
- return true;
- }
-
- if ((!foreignNS || foreignNS === NS.MATHML) && isMathMLTextIntegrationPoint(tn, ns)) {
- return true;
- }
-
- return false;
-};
+function isIntegrationPoint(tn, ns, attrs, foreignNS) {
+ return (((!foreignNS || foreignNS === html_js_1.NS.HTML) && isHtmlIntegrationPoint(tn, ns, attrs)) ||
+ ((!foreignNS || foreignNS === html_js_1.NS.MATHML) && isMathMLTextIntegrationPoint(tn, ns)));
+}
+exports.isIntegrationPoint = isIntegrationPoint;
+//# sourceMappingURL=foreign-content.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/foreign-content.js.map b/packages/parse5/lib/common/foreign-content.js.map
new file mode 100644
index 0000000..9adde79
--- /dev/null
+++ b/packages/parse5/lib/common/foreign-content.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"foreign-content.js","sourceRoot":"","sources":["../../../lib/common/foreign-content.ts"],"names":[],"mappings":";;;AAAA,uCAA6D;AAG7D,YAAY;AACZ,MAAM,UAAU,GAAG;IACf,SAAS,EAAE,WAAW;IACtB,eAAe,EAAE,uBAAuB;CAC3C,CAAC;AAEF,YAAY;AACZ,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAC5C,MAAM,4BAA4B,GAAG,eAAe,CAAC;AACrD,MAAM,wBAAwB,GAAG,IAAI,GAAG,CACpC;IACI,eAAe;IACf,eAAe;IACf,eAAe;IACf,aAAa;IACb,UAAU;IACV,eAAe;IACf,iBAAiB;IACjB,UAAU;IACV,aAAa;IACb,UAAU;IACV,mBAAmB;IACnB,eAAe;IACf,cAAc;IACd,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,UAAU;IACV,cAAc;IACd,mBAAmB;IACnB,cAAc;IACd,aAAa;IACb,aAAa;IACb,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,qBAAqB;IACrB,kBAAkB;IAClB,cAAc;IACd,WAAW;IACX,WAAW;IACX,WAAW;IACX,eAAe;IACf,qBAAqB;IACrB,gBAAgB;IAChB,MAAM;IACN,MAAM;IACN,aAAa;IACb,WAAW;IACX,oBAAoB;IACpB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,cAAc;IACd,aAAa;IACb,cAAc;IACd,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,SAAS;IACT,SAAS;IACT,YAAY;IACZ,SAAS;IACT,YAAY;IACZ,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;CACf,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC,CAC9C,CAAC;AAEF,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC;IACrC,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,YAAE,CAAC,KAAK,EAAE,CAAC;IAC5E,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,YAAE,CAAC,KAAK,EAAE,CAAC;IAC5E,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAE,CAAC,KAAK,EAAE,CAAC;IACtE,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAE,CAAC,KAAK,EAAE,CAAC;IACtE,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAE,CAAC,KAAK,EAAE,CAAC;IACtE,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAE,CAAC,KAAK,EAAE,CAAC;IACxE,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAE,CAAC,KAAK,EAAE,CAAC;IACtE,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAE,CAAC,GAAG,EAAE,CAAC;IAChE,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAE,CAAC,GAAG,EAAE,CAAC;IAChE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAE,CAAC,GAAG,EAAE,CAAC;IAClE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAE,CAAC,KAAK,EAAE,CAAC;IAC7D,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAE,CAAC,KAAK,EAAE,CAAC;CAC3E,CAAC,CAAC;AAEH,8BAA8B;AACjB,QAAA,4BAA4B,GAAG,IAAI,GAAG,CAC/C;IACI,UAAU;IACV,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,kBAAkB;IAClB,UAAU;IACV,SAAS;IACT,eAAe;IACf,qBAAqB;IACrB,aAAa;IACb,kBAAkB;IAClB,mBAAmB;IACnB,mBAAmB;IACnB,gBAAgB;IAChB,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,gBAAgB;IAChB,SAAS;IACT,SAAS;IACT,aAAa;IACb,cAAc;IACd,UAAU;IACV,cAAc;IACd,oBAAoB;IACpB,aAAa;IACb,QAAQ;IACR,cAAc;IACd,eAAe;IACf,UAAU;IACV,gBAAgB;IAChB,gBAAgB;IAChB,UAAU;CACb,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CACxC,CAAC;AAEF,4CAA4C;AAC5C,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IAClC,gBAAC,CAAC,CAAC;IACH,gBAAC,CAAC,GAAG;IACL,gBAAC,CAAC,UAAU;IACZ,gBAAC,CAAC,IAAI;IACN,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,MAAM;IACR,gBAAC,CAAC,IAAI;IACN,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,GAAG;IACL,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,KAAK;IACP,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,IAAI;IACN,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,CAAC;IACH,gBAAC,CAAC,GAAG;IACL,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,OAAO;IACT,gBAAC,CAAC,IAAI;IACN,gBAAC,CAAC,IAAI;IACN,gBAAC,CAAC,IAAI;IACN,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,CAAC;IACH,gBAAC,CAAC,GAAG;IACL,gBAAC,CAAC,IAAI;IACN,gBAAC,CAAC,CAAC;IACH,gBAAC,CAAC,KAAK;IACP,gBAAC,CAAC,IAAI;IACN,gBAAC,CAAC,MAAM;IACR,gBAAC,CAAC,MAAM;IACR,gBAAC,CAAC,GAAG;IACL,gBAAC,CAAC,GAAG;IACL,gBAAC,CAAC,KAAK;IACP,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,CAAC;IACH,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,GAAG;CACR,CAAC,CAAC;AAEH,iCAAiC;AACjC,SAAgB,UAAU,CAAC,aAAuB;IAC9C,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;IAC/B,MAAM,eAAe,GACjB,EAAE,KAAK,gBAAC,CAAC,IAAI;QACb,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,eAAK,CAAC,KAAK,IAAI,IAAI,KAAK,eAAK,CAAC,IAAI,IAAI,IAAI,KAAK,eAAK,CAAC,IAAI,CAAC,CAAC;IAE/G,OAAO,eAAe,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAPD,gCAOC;AAED,mBAAmB;AACnB,SAAgB,sBAAsB,CAAC,KAAe;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACzC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,EAAE;YAC7C,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,4BAA4B,CAAC;YACnD,MAAM;SACT;KACJ;AACL,CAAC;AAPD,wDAOC;AAED,SAAgB,mBAAmB,CAAC,KAAe;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAE3E,IAAI,gBAAgB,IAAI,IAAI,EAAE;YAC1B,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,gBAAgB,CAAC;SAC1C;KACJ;AACL,CAAC;AARD,kDAQC;AAED,SAAgB,mBAAmB,CAAC,KAAe;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAE5E,IAAI,iBAAiB,EAAE;YACnB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC;YACjD,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;YAC7C,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;SAC1D;KACJ;AACL,CAAC;AAVD,kDAUC;AAED,SAAgB,qBAAqB,CAAC,KAAe;IACjD,MAAM,eAAe,GAAG,oCAA4B,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAExE,IAAI,eAAe,IAAI,IAAI,EAAE;QACzB,KAAK,CAAC,OAAO,GAAG,eAAe,CAAC;QAChC,KAAK,CAAC,KAAK,GAAG,IAAA,kBAAQ,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;KACzC;AACL,CAAC;AAPD,sDAOC;AAED,oBAAoB;AACpB,SAAS,4BAA4B,CAAC,EAAK,EAAE,EAAM;IAC/C,OAAO,EAAE,KAAK,YAAE,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,gBAAC,CAAC,EAAE,IAAI,EAAE,KAAK,gBAAC,CAAC,EAAE,IAAI,EAAE,KAAK,gBAAC,CAAC,EAAE,IAAI,EAAE,KAAK,gBAAC,CAAC,EAAE,IAAI,EAAE,KAAK,gBAAC,CAAC,KAAK,CAAC,CAAC;AAC5G,CAAC;AAED,SAAS,sBAAsB,CAAC,EAAK,EAAE,EAAM,EAAE,KAAkB;IAC7D,IAAI,EAAE,KAAK,YAAE,CAAC,MAAM,IAAI,EAAE,KAAK,gBAAC,CAAC,cAAc,EAAE;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,eAAK,CAAC,QAAQ,EAAE;gBAClC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBAE3C,OAAO,KAAK,KAAK,UAAU,CAAC,SAAS,IAAI,KAAK,KAAK,UAAU,CAAC,eAAe,CAAC;aACjF;SACJ;KACJ;IAED,OAAO,EAAE,KAAK,YAAE,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,gBAAC,CAAC,cAAc,IAAI,EAAE,KAAK,gBAAC,CAAC,IAAI,IAAI,EAAE,KAAK,gBAAC,CAAC,KAAK,CAAC,CAAC;AACzF,CAAC;AAED,SAAgB,kBAAkB,CAAC,EAAK,EAAE,EAAM,EAAE,KAAkB,EAAE,SAAc;IAChF,OAAO,CACH,CAAC,CAAC,CAAC,SAAS,IAAI,SAAS,KAAK,YAAE,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC,SAAS,IAAI,SAAS,KAAK,YAAE,CAAC,MAAM,CAAC,IAAI,4BAA4B,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CACpF,CAAC;AACN,CAAC;AALD,gDAKC"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/html.d.ts b/packages/parse5/lib/common/html.d.ts
new file mode 100644
index 0000000..0b47095
--- /dev/null
+++ b/packages/parse5/lib/common/html.d.ts
@@ -0,0 +1,288 @@
+/** All valid namespaces in HTML. */
+export declare enum NS {
+ HTML = "http://www.w3.org/1999/xhtml",
+ MATHML = "http://www.w3.org/1998/Math/MathML",
+ SVG = "http://www.w3.org/2000/svg",
+ XLINK = "http://www.w3.org/1999/xlink",
+ XML = "http://www.w3.org/XML/1998/namespace",
+ XMLNS = "http://www.w3.org/2000/xmlns/"
+}
+export declare enum ATTRS {
+ TYPE = "type",
+ ACTION = "action",
+ ENCODING = "encoding",
+ PROMPT = "prompt",
+ NAME = "name",
+ COLOR = "color",
+ FACE = "face",
+ SIZE = "size"
+}
+/**
+ * The mode of the document.
+ *
+ * @see {@link https://dom.spec.whatwg.org/#concept-document-limited-quirks}
+ */
+export declare enum DOCUMENT_MODE {
+ NO_QUIRKS = "no-quirks",
+ QUIRKS = "quirks",
+ LIMITED_QUIRKS = "limited-quirks"
+}
+export declare enum TAG_NAMES {
+ A = "a",
+ ADDRESS = "address",
+ ANNOTATION_XML = "annotation-xml",
+ APPLET = "applet",
+ AREA = "area",
+ ARTICLE = "article",
+ ASIDE = "aside",
+ B = "b",
+ BASE = "base",
+ BASEFONT = "basefont",
+ BGSOUND = "bgsound",
+ BIG = "big",
+ BLOCKQUOTE = "blockquote",
+ BODY = "body",
+ BR = "br",
+ BUTTON = "button",
+ CAPTION = "caption",
+ CENTER = "center",
+ CODE = "code",
+ COL = "col",
+ COLGROUP = "colgroup",
+ DD = "dd",
+ DESC = "desc",
+ DETAILS = "details",
+ DIALOG = "dialog",
+ DIR = "dir",
+ DIV = "div",
+ DL = "dl",
+ DT = "dt",
+ EM = "em",
+ EMBED = "embed",
+ FIELDSET = "fieldset",
+ FIGCAPTION = "figcaption",
+ FIGURE = "figure",
+ FONT = "font",
+ FOOTER = "footer",
+ FOREIGN_OBJECT = "foreignObject",
+ FORM = "form",
+ FRAME = "frame",
+ FRAMESET = "frameset",
+ H1 = "h1",
+ H2 = "h2",
+ H3 = "h3",
+ H4 = "h4",
+ H5 = "h5",
+ H6 = "h6",
+ HEAD = "head",
+ HEADER = "header",
+ HGROUP = "hgroup",
+ HR = "hr",
+ HTML = "html",
+ I = "i",
+ IMG = "img",
+ IMAGE = "image",
+ INPUT = "input",
+ IFRAME = "iframe",
+ KEYGEN = "keygen",
+ LABEL = "label",
+ LI = "li",
+ LINK = "link",
+ LISTING = "listing",
+ MAIN = "main",
+ MALIGNMARK = "malignmark",
+ MARQUEE = "marquee",
+ MATH = "math",
+ MENU = "menu",
+ META = "meta",
+ MGLYPH = "mglyph",
+ MI = "mi",
+ MO = "mo",
+ MN = "mn",
+ MS = "ms",
+ MTEXT = "mtext",
+ NAV = "nav",
+ NOBR = "nobr",
+ NOFRAMES = "noframes",
+ NOEMBED = "noembed",
+ NOSCRIPT = "noscript",
+ OBJECT = "object",
+ OL = "ol",
+ OPTGROUP = "optgroup",
+ OPTION = "option",
+ P = "p",
+ PARAM = "param",
+ PLAINTEXT = "plaintext",
+ PRE = "pre",
+ RB = "rb",
+ RP = "rp",
+ RT = "rt",
+ RTC = "rtc",
+ RUBY = "ruby",
+ S = "s",
+ SCRIPT = "script",
+ SECTION = "section",
+ SELECT = "select",
+ SOURCE = "source",
+ SMALL = "small",
+ SPAN = "span",
+ STRIKE = "strike",
+ STRONG = "strong",
+ STYLE = "style",
+ SUB = "sub",
+ SUMMARY = "summary",
+ SUP = "sup",
+ TABLE = "table",
+ TBODY = "tbody",
+ TEMPLATE = "template",
+ TEXTAREA = "textarea",
+ TFOOT = "tfoot",
+ TD = "td",
+ TH = "th",
+ THEAD = "thead",
+ TITLE = "title",
+ TR = "tr",
+ TRACK = "track",
+ TT = "tt",
+ U = "u",
+ UL = "ul",
+ SVG = "svg",
+ VAR = "var",
+ WBR = "wbr",
+ XMP = "xmp"
+}
+/**
+ * Tag IDs are numeric IDs for known tag names.
+ *
+ * We use tag IDs to improve the performance of tag name comparisons.
+ */
+export declare enum TAG_ID {
+ UNKNOWN = 0,
+ A = 1,
+ ADDRESS = 2,
+ ANNOTATION_XML = 3,
+ APPLET = 4,
+ AREA = 5,
+ ARTICLE = 6,
+ ASIDE = 7,
+ B = 8,
+ BASE = 9,
+ BASEFONT = 10,
+ BGSOUND = 11,
+ BIG = 12,
+ BLOCKQUOTE = 13,
+ BODY = 14,
+ BR = 15,
+ BUTTON = 16,
+ CAPTION = 17,
+ CENTER = 18,
+ CODE = 19,
+ COL = 20,
+ COLGROUP = 21,
+ DD = 22,
+ DESC = 23,
+ DETAILS = 24,
+ DIALOG = 25,
+ DIR = 26,
+ DIV = 27,
+ DL = 28,
+ DT = 29,
+ EM = 30,
+ EMBED = 31,
+ FIELDSET = 32,
+ FIGCAPTION = 33,
+ FIGURE = 34,
+ FONT = 35,
+ FOOTER = 36,
+ FOREIGN_OBJECT = 37,
+ FORM = 38,
+ FRAME = 39,
+ FRAMESET = 40,
+ H1 = 41,
+ H2 = 42,
+ H3 = 43,
+ H4 = 44,
+ H5 = 45,
+ H6 = 46,
+ HEAD = 47,
+ HEADER = 48,
+ HGROUP = 49,
+ HR = 50,
+ HTML = 51,
+ I = 52,
+ IMG = 53,
+ IMAGE = 54,
+ INPUT = 55,
+ IFRAME = 56,
+ KEYGEN = 57,
+ LABEL = 58,
+ LI = 59,
+ LINK = 60,
+ LISTING = 61,
+ MAIN = 62,
+ MALIGNMARK = 63,
+ MARQUEE = 64,
+ MATH = 65,
+ MENU = 66,
+ META = 67,
+ MGLYPH = 68,
+ MI = 69,
+ MO = 70,
+ MN = 71,
+ MS = 72,
+ MTEXT = 73,
+ NAV = 74,
+ NOBR = 75,
+ NOFRAMES = 76,
+ NOEMBED = 77,
+ NOSCRIPT = 78,
+ OBJECT = 79,
+ OL = 80,
+ OPTGROUP = 81,
+ OPTION = 82,
+ P = 83,
+ PARAM = 84,
+ PLAINTEXT = 85,
+ PRE = 86,
+ RB = 87,
+ RP = 88,
+ RT = 89,
+ RTC = 90,
+ RUBY = 91,
+ S = 92,
+ SCRIPT = 93,
+ SECTION = 94,
+ SELECT = 95,
+ SOURCE = 96,
+ SMALL = 97,
+ SPAN = 98,
+ STRIKE = 99,
+ STRONG = 100,
+ STYLE = 101,
+ SUB = 102,
+ SUMMARY = 103,
+ SUP = 104,
+ TABLE = 105,
+ TBODY = 106,
+ TEMPLATE = 107,
+ TEXTAREA = 108,
+ TFOOT = 109,
+ TD = 110,
+ TH = 111,
+ THEAD = 112,
+ TITLE = 113,
+ TR = 114,
+ TRACK = 115,
+ TT = 116,
+ U = 117,
+ UL = 118,
+ SVG = 119,
+ VAR = 120,
+ WBR = 121,
+ XMP = 122
+}
+export declare function getTagID(tagName: string): TAG_ID;
+export declare const SPECIAL_ELEMENTS: Record>;
+export declare function isNumberedHeader(tn: TAG_ID): boolean;
+export declare function hasUnescapedText(tn: string, scriptingEnabled: boolean): boolean;
+//# sourceMappingURL=html.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/html.d.ts.map b/packages/parse5/lib/common/html.d.ts.map
new file mode 100644
index 0000000..1482f1e
--- /dev/null
+++ b/packages/parse5/lib/common/html.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../lib/common/html.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/html.js b/packages/parse5/lib/common/html.js
index f33646f..cd361d4 100644
--- a/packages/parse5/lib/common/html.js
+++ b/packages/parse5/lib/common/html.js
@@ -1,272 +1,529 @@
-'use strict';
-
-const NS = (exports.NAMESPACES = {
- HTML: 'http://www.w3.org/1999/xhtml',
- MATHML: 'http://www.w3.org/1998/Math/MathML',
- SVG: 'http://www.w3.org/2000/svg',
- XLINK: 'http://www.w3.org/1999/xlink',
- XML: 'http://www.w3.org/XML/1998/namespace',
- XMLNS: 'http://www.w3.org/2000/xmlns/'
-});
-
-exports.ATTRS = {
- TYPE: 'type',
- ACTION: 'action',
- ENCODING: 'encoding',
- PROMPT: 'prompt',
- NAME: 'name',
- COLOR: 'color',
- FACE: 'face',
- SIZE: 'size'
-};
-
-exports.DOCUMENT_MODE = {
- NO_QUIRKS: 'no-quirks',
- QUIRKS: 'quirks',
- LIMITED_QUIRKS: 'limited-quirks'
-};
-
-const $ = (exports.TAG_NAMES = {
- A: 'a',
- ADDRESS: 'address',
- ANNOTATION_XML: 'annotation-xml',
- APPLET: 'applet',
- AREA: 'area',
- ARTICLE: 'article',
- ASIDE: 'aside',
-
- B: 'b',
- BASE: 'base',
- BASEFONT: 'basefont',
- BGSOUND: 'bgsound',
- BIG: 'big',
- BLOCKQUOTE: 'blockquote',
- BODY: 'body',
- BR: 'br',
- BUTTON: 'button',
-
- CAPTION: 'caption',
- CENTER: 'center',
- CODE: 'code',
- COL: 'col',
- COLGROUP: 'colgroup',
-
- DD: 'dd',
- DESC: 'desc',
- DETAILS: 'details',
- DIALOG: 'dialog',
- DIR: 'dir',
- DIV: 'div',
- DL: 'dl',
- DT: 'dt',
-
- EM: 'em',
- EMBED: 'embed',
-
- FIELDSET: 'fieldset',
- FIGCAPTION: 'figcaption',
- FIGURE: 'figure',
- FONT: 'font',
- FOOTER: 'footer',
- FOREIGN_OBJECT: 'foreignObject',
- FORM: 'form',
- FRAME: 'frame',
- FRAMESET: 'frameset',
-
- H1: 'h1',
- H2: 'h2',
- H3: 'h3',
- H4: 'h4',
- H5: 'h5',
- H6: 'h6',
- HEAD: 'head',
- HEADER: 'header',
- HGROUP: 'hgroup',
- HR: 'hr',
- HTML: 'html',
-
- I: 'i',
- IMG: 'img',
- IMAGE: 'image',
- INPUT: 'input',
- IFRAME: 'iframe',
-
- KEYGEN: 'keygen',
-
- LABEL: 'label',
- LI: 'li',
- LINK: 'link',
- LISTING: 'listing',
-
- MAIN: 'main',
- MALIGNMARK: 'malignmark',
- MARQUEE: 'marquee',
- MATH: 'math',
- MENU: 'menu',
- META: 'meta',
- MGLYPH: 'mglyph',
- MI: 'mi',
- MO: 'mo',
- MN: 'mn',
- MS: 'ms',
- MTEXT: 'mtext',
-
- NAV: 'nav',
- NOBR: 'nobr',
- NOFRAMES: 'noframes',
- NOEMBED: 'noembed',
- NOSCRIPT: 'noscript',
-
- OBJECT: 'object',
- OL: 'ol',
- OPTGROUP: 'optgroup',
- OPTION: 'option',
-
- P: 'p',
- PARAM: 'param',
- PLAINTEXT: 'plaintext',
- PRE: 'pre',
-
- RB: 'rb',
- RP: 'rp',
- RT: 'rt',
- RTC: 'rtc',
- RUBY: 'ruby',
-
- S: 's',
- SCRIPT: 'script',
- SECTION: 'section',
- SELECT: 'select',
- SOURCE: 'source',
- SMALL: 'small',
- SPAN: 'span',
- STRIKE: 'strike',
- STRONG: 'strong',
- STYLE: 'style',
- SUB: 'sub',
- SUMMARY: 'summary',
- SUP: 'sup',
-
- TABLE: 'table',
- TBODY: 'tbody',
- TEMPLATE: 'template',
- TEXTAREA: 'textarea',
- TFOOT: 'tfoot',
- TD: 'td',
- TH: 'th',
- THEAD: 'thead',
- TITLE: 'title',
- TR: 'tr',
- TRACK: 'track',
- TT: 'tt',
-
- U: 'u',
- UL: 'ul',
-
- SVG: 'svg',
-
- VAR: 'var',
-
- WBR: 'wbr',
-
- XMP: 'xmp'
-});
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.hasUnescapedText = exports.isNumberedHeader = exports.SPECIAL_ELEMENTS = exports.getTagID = exports.TAG_ID = exports.TAG_NAMES = exports.DOCUMENT_MODE = exports.ATTRS = exports.NS = void 0;
+/** All valid namespaces in HTML. */
+var NS;
+(function (NS) {
+ NS["HTML"] = "http://www.w3.org/1999/xhtml";
+ NS["MATHML"] = "http://www.w3.org/1998/Math/MathML";
+ NS["SVG"] = "http://www.w3.org/2000/svg";
+ NS["XLINK"] = "http://www.w3.org/1999/xlink";
+ NS["XML"] = "http://www.w3.org/XML/1998/namespace";
+ NS["XMLNS"] = "http://www.w3.org/2000/xmlns/";
+})(NS = exports.NS || (exports.NS = {}));
+var ATTRS;
+(function (ATTRS) {
+ ATTRS["TYPE"] = "type";
+ ATTRS["ACTION"] = "action";
+ ATTRS["ENCODING"] = "encoding";
+ ATTRS["PROMPT"] = "prompt";
+ ATTRS["NAME"] = "name";
+ ATTRS["COLOR"] = "color";
+ ATTRS["FACE"] = "face";
+ ATTRS["SIZE"] = "size";
+})(ATTRS = exports.ATTRS || (exports.ATTRS = {}));
+/**
+ * The mode of the document.
+ *
+ * @see {@link https://dom.spec.whatwg.org/#concept-document-limited-quirks}
+ */
+var DOCUMENT_MODE;
+(function (DOCUMENT_MODE) {
+ DOCUMENT_MODE["NO_QUIRKS"] = "no-quirks";
+ DOCUMENT_MODE["QUIRKS"] = "quirks";
+ DOCUMENT_MODE["LIMITED_QUIRKS"] = "limited-quirks";
+})(DOCUMENT_MODE = exports.DOCUMENT_MODE || (exports.DOCUMENT_MODE = {}));
+var TAG_NAMES;
+(function (TAG_NAMES) {
+ TAG_NAMES["A"] = "a";
+ TAG_NAMES["ADDRESS"] = "address";
+ TAG_NAMES["ANNOTATION_XML"] = "annotation-xml";
+ TAG_NAMES["APPLET"] = "applet";
+ TAG_NAMES["AREA"] = "area";
+ TAG_NAMES["ARTICLE"] = "article";
+ TAG_NAMES["ASIDE"] = "aside";
+ TAG_NAMES["B"] = "b";
+ TAG_NAMES["BASE"] = "base";
+ TAG_NAMES["BASEFONT"] = "basefont";
+ TAG_NAMES["BGSOUND"] = "bgsound";
+ TAG_NAMES["BIG"] = "big";
+ TAG_NAMES["BLOCKQUOTE"] = "blockquote";
+ TAG_NAMES["BODY"] = "body";
+ TAG_NAMES["BR"] = "br";
+ TAG_NAMES["BUTTON"] = "button";
+ TAG_NAMES["CAPTION"] = "caption";
+ TAG_NAMES["CENTER"] = "center";
+ TAG_NAMES["CODE"] = "code";
+ TAG_NAMES["COL"] = "col";
+ TAG_NAMES["COLGROUP"] = "colgroup";
+ TAG_NAMES["DD"] = "dd";
+ TAG_NAMES["DESC"] = "desc";
+ TAG_NAMES["DETAILS"] = "details";
+ TAG_NAMES["DIALOG"] = "dialog";
+ TAG_NAMES["DIR"] = "dir";
+ TAG_NAMES["DIV"] = "div";
+ TAG_NAMES["DL"] = "dl";
+ TAG_NAMES["DT"] = "dt";
+ TAG_NAMES["EM"] = "em";
+ TAG_NAMES["EMBED"] = "embed";
+ TAG_NAMES["FIELDSET"] = "fieldset";
+ TAG_NAMES["FIGCAPTION"] = "figcaption";
+ TAG_NAMES["FIGURE"] = "figure";
+ TAG_NAMES["FONT"] = "font";
+ TAG_NAMES["FOOTER"] = "footer";
+ TAG_NAMES["FOREIGN_OBJECT"] = "foreignObject";
+ TAG_NAMES["FORM"] = "form";
+ TAG_NAMES["FRAME"] = "frame";
+ TAG_NAMES["FRAMESET"] = "frameset";
+ TAG_NAMES["H1"] = "h1";
+ TAG_NAMES["H2"] = "h2";
+ TAG_NAMES["H3"] = "h3";
+ TAG_NAMES["H4"] = "h4";
+ TAG_NAMES["H5"] = "h5";
+ TAG_NAMES["H6"] = "h6";
+ TAG_NAMES["HEAD"] = "head";
+ TAG_NAMES["HEADER"] = "header";
+ TAG_NAMES["HGROUP"] = "hgroup";
+ TAG_NAMES["HR"] = "hr";
+ TAG_NAMES["HTML"] = "html";
+ TAG_NAMES["I"] = "i";
+ TAG_NAMES["IMG"] = "img";
+ TAG_NAMES["IMAGE"] = "image";
+ TAG_NAMES["INPUT"] = "input";
+ TAG_NAMES["IFRAME"] = "iframe";
+ TAG_NAMES["KEYGEN"] = "keygen";
+ TAG_NAMES["LABEL"] = "label";
+ TAG_NAMES["LI"] = "li";
+ TAG_NAMES["LINK"] = "link";
+ TAG_NAMES["LISTING"] = "listing";
+ TAG_NAMES["MAIN"] = "main";
+ TAG_NAMES["MALIGNMARK"] = "malignmark";
+ TAG_NAMES["MARQUEE"] = "marquee";
+ TAG_NAMES["MATH"] = "math";
+ TAG_NAMES["MENU"] = "menu";
+ TAG_NAMES["META"] = "meta";
+ TAG_NAMES["MGLYPH"] = "mglyph";
+ TAG_NAMES["MI"] = "mi";
+ TAG_NAMES["MO"] = "mo";
+ TAG_NAMES["MN"] = "mn";
+ TAG_NAMES["MS"] = "ms";
+ TAG_NAMES["MTEXT"] = "mtext";
+ TAG_NAMES["NAV"] = "nav";
+ TAG_NAMES["NOBR"] = "nobr";
+ TAG_NAMES["NOFRAMES"] = "noframes";
+ TAG_NAMES["NOEMBED"] = "noembed";
+ TAG_NAMES["NOSCRIPT"] = "noscript";
+ TAG_NAMES["OBJECT"] = "object";
+ TAG_NAMES["OL"] = "ol";
+ TAG_NAMES["OPTGROUP"] = "optgroup";
+ TAG_NAMES["OPTION"] = "option";
+ TAG_NAMES["P"] = "p";
+ TAG_NAMES["PARAM"] = "param";
+ TAG_NAMES["PLAINTEXT"] = "plaintext";
+ TAG_NAMES["PRE"] = "pre";
+ TAG_NAMES["RB"] = "rb";
+ TAG_NAMES["RP"] = "rp";
+ TAG_NAMES["RT"] = "rt";
+ TAG_NAMES["RTC"] = "rtc";
+ TAG_NAMES["RUBY"] = "ruby";
+ TAG_NAMES["S"] = "s";
+ TAG_NAMES["SCRIPT"] = "script";
+ TAG_NAMES["SECTION"] = "section";
+ TAG_NAMES["SELECT"] = "select";
+ TAG_NAMES["SOURCE"] = "source";
+ TAG_NAMES["SMALL"] = "small";
+ TAG_NAMES["SPAN"] = "span";
+ TAG_NAMES["STRIKE"] = "strike";
+ TAG_NAMES["STRONG"] = "strong";
+ TAG_NAMES["STYLE"] = "style";
+ TAG_NAMES["SUB"] = "sub";
+ TAG_NAMES["SUMMARY"] = "summary";
+ TAG_NAMES["SUP"] = "sup";
+ TAG_NAMES["TABLE"] = "table";
+ TAG_NAMES["TBODY"] = "tbody";
+ TAG_NAMES["TEMPLATE"] = "template";
+ TAG_NAMES["TEXTAREA"] = "textarea";
+ TAG_NAMES["TFOOT"] = "tfoot";
+ TAG_NAMES["TD"] = "td";
+ TAG_NAMES["TH"] = "th";
+ TAG_NAMES["THEAD"] = "thead";
+ TAG_NAMES["TITLE"] = "title";
+ TAG_NAMES["TR"] = "tr";
+ TAG_NAMES["TRACK"] = "track";
+ TAG_NAMES["TT"] = "tt";
+ TAG_NAMES["U"] = "u";
+ TAG_NAMES["UL"] = "ul";
+ TAG_NAMES["SVG"] = "svg";
+ TAG_NAMES["VAR"] = "var";
+ TAG_NAMES["WBR"] = "wbr";
+ TAG_NAMES["XMP"] = "xmp";
+})(TAG_NAMES = exports.TAG_NAMES || (exports.TAG_NAMES = {}));
+/**
+ * Tag IDs are numeric IDs for known tag names.
+ *
+ * We use tag IDs to improve the performance of tag name comparisons.
+ */
+var TAG_ID;
+(function (TAG_ID) {
+ TAG_ID[TAG_ID["UNKNOWN"] = 0] = "UNKNOWN";
+ TAG_ID[TAG_ID["A"] = 1] = "A";
+ TAG_ID[TAG_ID["ADDRESS"] = 2] = "ADDRESS";
+ TAG_ID[TAG_ID["ANNOTATION_XML"] = 3] = "ANNOTATION_XML";
+ TAG_ID[TAG_ID["APPLET"] = 4] = "APPLET";
+ TAG_ID[TAG_ID["AREA"] = 5] = "AREA";
+ TAG_ID[TAG_ID["ARTICLE"] = 6] = "ARTICLE";
+ TAG_ID[TAG_ID["ASIDE"] = 7] = "ASIDE";
+ TAG_ID[TAG_ID["B"] = 8] = "B";
+ TAG_ID[TAG_ID["BASE"] = 9] = "BASE";
+ TAG_ID[TAG_ID["BASEFONT"] = 10] = "BASEFONT";
+ TAG_ID[TAG_ID["BGSOUND"] = 11] = "BGSOUND";
+ TAG_ID[TAG_ID["BIG"] = 12] = "BIG";
+ TAG_ID[TAG_ID["BLOCKQUOTE"] = 13] = "BLOCKQUOTE";
+ TAG_ID[TAG_ID["BODY"] = 14] = "BODY";
+ TAG_ID[TAG_ID["BR"] = 15] = "BR";
+ TAG_ID[TAG_ID["BUTTON"] = 16] = "BUTTON";
+ TAG_ID[TAG_ID["CAPTION"] = 17] = "CAPTION";
+ TAG_ID[TAG_ID["CENTER"] = 18] = "CENTER";
+ TAG_ID[TAG_ID["CODE"] = 19] = "CODE";
+ TAG_ID[TAG_ID["COL"] = 20] = "COL";
+ TAG_ID[TAG_ID["COLGROUP"] = 21] = "COLGROUP";
+ TAG_ID[TAG_ID["DD"] = 22] = "DD";
+ TAG_ID[TAG_ID["DESC"] = 23] = "DESC";
+ TAG_ID[TAG_ID["DETAILS"] = 24] = "DETAILS";
+ TAG_ID[TAG_ID["DIALOG"] = 25] = "DIALOG";
+ TAG_ID[TAG_ID["DIR"] = 26] = "DIR";
+ TAG_ID[TAG_ID["DIV"] = 27] = "DIV";
+ TAG_ID[TAG_ID["DL"] = 28] = "DL";
+ TAG_ID[TAG_ID["DT"] = 29] = "DT";
+ TAG_ID[TAG_ID["EM"] = 30] = "EM";
+ TAG_ID[TAG_ID["EMBED"] = 31] = "EMBED";
+ TAG_ID[TAG_ID["FIELDSET"] = 32] = "FIELDSET";
+ TAG_ID[TAG_ID["FIGCAPTION"] = 33] = "FIGCAPTION";
+ TAG_ID[TAG_ID["FIGURE"] = 34] = "FIGURE";
+ TAG_ID[TAG_ID["FONT"] = 35] = "FONT";
+ TAG_ID[TAG_ID["FOOTER"] = 36] = "FOOTER";
+ TAG_ID[TAG_ID["FOREIGN_OBJECT"] = 37] = "FOREIGN_OBJECT";
+ TAG_ID[TAG_ID["FORM"] = 38] = "FORM";
+ TAG_ID[TAG_ID["FRAME"] = 39] = "FRAME";
+ TAG_ID[TAG_ID["FRAMESET"] = 40] = "FRAMESET";
+ TAG_ID[TAG_ID["H1"] = 41] = "H1";
+ TAG_ID[TAG_ID["H2"] = 42] = "H2";
+ TAG_ID[TAG_ID["H3"] = 43] = "H3";
+ TAG_ID[TAG_ID["H4"] = 44] = "H4";
+ TAG_ID[TAG_ID["H5"] = 45] = "H5";
+ TAG_ID[TAG_ID["H6"] = 46] = "H6";
+ TAG_ID[TAG_ID["HEAD"] = 47] = "HEAD";
+ TAG_ID[TAG_ID["HEADER"] = 48] = "HEADER";
+ TAG_ID[TAG_ID["HGROUP"] = 49] = "HGROUP";
+ TAG_ID[TAG_ID["HR"] = 50] = "HR";
+ TAG_ID[TAG_ID["HTML"] = 51] = "HTML";
+ TAG_ID[TAG_ID["I"] = 52] = "I";
+ TAG_ID[TAG_ID["IMG"] = 53] = "IMG";
+ TAG_ID[TAG_ID["IMAGE"] = 54] = "IMAGE";
+ TAG_ID[TAG_ID["INPUT"] = 55] = "INPUT";
+ TAG_ID[TAG_ID["IFRAME"] = 56] = "IFRAME";
+ TAG_ID[TAG_ID["KEYGEN"] = 57] = "KEYGEN";
+ TAG_ID[TAG_ID["LABEL"] = 58] = "LABEL";
+ TAG_ID[TAG_ID["LI"] = 59] = "LI";
+ TAG_ID[TAG_ID["LINK"] = 60] = "LINK";
+ TAG_ID[TAG_ID["LISTING"] = 61] = "LISTING";
+ TAG_ID[TAG_ID["MAIN"] = 62] = "MAIN";
+ TAG_ID[TAG_ID["MALIGNMARK"] = 63] = "MALIGNMARK";
+ TAG_ID[TAG_ID["MARQUEE"] = 64] = "MARQUEE";
+ TAG_ID[TAG_ID["MATH"] = 65] = "MATH";
+ TAG_ID[TAG_ID["MENU"] = 66] = "MENU";
+ TAG_ID[TAG_ID["META"] = 67] = "META";
+ TAG_ID[TAG_ID["MGLYPH"] = 68] = "MGLYPH";
+ TAG_ID[TAG_ID["MI"] = 69] = "MI";
+ TAG_ID[TAG_ID["MO"] = 70] = "MO";
+ TAG_ID[TAG_ID["MN"] = 71] = "MN";
+ TAG_ID[TAG_ID["MS"] = 72] = "MS";
+ TAG_ID[TAG_ID["MTEXT"] = 73] = "MTEXT";
+ TAG_ID[TAG_ID["NAV"] = 74] = "NAV";
+ TAG_ID[TAG_ID["NOBR"] = 75] = "NOBR";
+ TAG_ID[TAG_ID["NOFRAMES"] = 76] = "NOFRAMES";
+ TAG_ID[TAG_ID["NOEMBED"] = 77] = "NOEMBED";
+ TAG_ID[TAG_ID["NOSCRIPT"] = 78] = "NOSCRIPT";
+ TAG_ID[TAG_ID["OBJECT"] = 79] = "OBJECT";
+ TAG_ID[TAG_ID["OL"] = 80] = "OL";
+ TAG_ID[TAG_ID["OPTGROUP"] = 81] = "OPTGROUP";
+ TAG_ID[TAG_ID["OPTION"] = 82] = "OPTION";
+ TAG_ID[TAG_ID["P"] = 83] = "P";
+ TAG_ID[TAG_ID["PARAM"] = 84] = "PARAM";
+ TAG_ID[TAG_ID["PLAINTEXT"] = 85] = "PLAINTEXT";
+ TAG_ID[TAG_ID["PRE"] = 86] = "PRE";
+ TAG_ID[TAG_ID["RB"] = 87] = "RB";
+ TAG_ID[TAG_ID["RP"] = 88] = "RP";
+ TAG_ID[TAG_ID["RT"] = 89] = "RT";
+ TAG_ID[TAG_ID["RTC"] = 90] = "RTC";
+ TAG_ID[TAG_ID["RUBY"] = 91] = "RUBY";
+ TAG_ID[TAG_ID["S"] = 92] = "S";
+ TAG_ID[TAG_ID["SCRIPT"] = 93] = "SCRIPT";
+ TAG_ID[TAG_ID["SECTION"] = 94] = "SECTION";
+ TAG_ID[TAG_ID["SELECT"] = 95] = "SELECT";
+ TAG_ID[TAG_ID["SOURCE"] = 96] = "SOURCE";
+ TAG_ID[TAG_ID["SMALL"] = 97] = "SMALL";
+ TAG_ID[TAG_ID["SPAN"] = 98] = "SPAN";
+ TAG_ID[TAG_ID["STRIKE"] = 99] = "STRIKE";
+ TAG_ID[TAG_ID["STRONG"] = 100] = "STRONG";
+ TAG_ID[TAG_ID["STYLE"] = 101] = "STYLE";
+ TAG_ID[TAG_ID["SUB"] = 102] = "SUB";
+ TAG_ID[TAG_ID["SUMMARY"] = 103] = "SUMMARY";
+ TAG_ID[TAG_ID["SUP"] = 104] = "SUP";
+ TAG_ID[TAG_ID["TABLE"] = 105] = "TABLE";
+ TAG_ID[TAG_ID["TBODY"] = 106] = "TBODY";
+ TAG_ID[TAG_ID["TEMPLATE"] = 107] = "TEMPLATE";
+ TAG_ID[TAG_ID["TEXTAREA"] = 108] = "TEXTAREA";
+ TAG_ID[TAG_ID["TFOOT"] = 109] = "TFOOT";
+ TAG_ID[TAG_ID["TD"] = 110] = "TD";
+ TAG_ID[TAG_ID["TH"] = 111] = "TH";
+ TAG_ID[TAG_ID["THEAD"] = 112] = "THEAD";
+ TAG_ID[TAG_ID["TITLE"] = 113] = "TITLE";
+ TAG_ID[TAG_ID["TR"] = 114] = "TR";
+ TAG_ID[TAG_ID["TRACK"] = 115] = "TRACK";
+ TAG_ID[TAG_ID["TT"] = 116] = "TT";
+ TAG_ID[TAG_ID["U"] = 117] = "U";
+ TAG_ID[TAG_ID["UL"] = 118] = "UL";
+ TAG_ID[TAG_ID["SVG"] = 119] = "SVG";
+ TAG_ID[TAG_ID["VAR"] = 120] = "VAR";
+ TAG_ID[TAG_ID["WBR"] = 121] = "WBR";
+ TAG_ID[TAG_ID["XMP"] = 122] = "XMP";
+})(TAG_ID = exports.TAG_ID || (exports.TAG_ID = {}));
+const TAG_NAME_TO_ID = new Map([
+ [TAG_NAMES.A, TAG_ID.A],
+ [TAG_NAMES.ADDRESS, TAG_ID.ADDRESS],
+ [TAG_NAMES.ANNOTATION_XML, TAG_ID.ANNOTATION_XML],
+ [TAG_NAMES.APPLET, TAG_ID.APPLET],
+ [TAG_NAMES.AREA, TAG_ID.AREA],
+ [TAG_NAMES.ARTICLE, TAG_ID.ARTICLE],
+ [TAG_NAMES.ASIDE, TAG_ID.ASIDE],
+ [TAG_NAMES.B, TAG_ID.B],
+ [TAG_NAMES.BASE, TAG_ID.BASE],
+ [TAG_NAMES.BASEFONT, TAG_ID.BASEFONT],
+ [TAG_NAMES.BGSOUND, TAG_ID.BGSOUND],
+ [TAG_NAMES.BIG, TAG_ID.BIG],
+ [TAG_NAMES.BLOCKQUOTE, TAG_ID.BLOCKQUOTE],
+ [TAG_NAMES.BODY, TAG_ID.BODY],
+ [TAG_NAMES.BR, TAG_ID.BR],
+ [TAG_NAMES.BUTTON, TAG_ID.BUTTON],
+ [TAG_NAMES.CAPTION, TAG_ID.CAPTION],
+ [TAG_NAMES.CENTER, TAG_ID.CENTER],
+ [TAG_NAMES.CODE, TAG_ID.CODE],
+ [TAG_NAMES.COL, TAG_ID.COL],
+ [TAG_NAMES.COLGROUP, TAG_ID.COLGROUP],
+ [TAG_NAMES.DD, TAG_ID.DD],
+ [TAG_NAMES.DESC, TAG_ID.DESC],
+ [TAG_NAMES.DETAILS, TAG_ID.DETAILS],
+ [TAG_NAMES.DIALOG, TAG_ID.DIALOG],
+ [TAG_NAMES.DIR, TAG_ID.DIR],
+ [TAG_NAMES.DIV, TAG_ID.DIV],
+ [TAG_NAMES.DL, TAG_ID.DL],
+ [TAG_NAMES.DT, TAG_ID.DT],
+ [TAG_NAMES.EM, TAG_ID.EM],
+ [TAG_NAMES.EMBED, TAG_ID.EMBED],
+ [TAG_NAMES.FIELDSET, TAG_ID.FIELDSET],
+ [TAG_NAMES.FIGCAPTION, TAG_ID.FIGCAPTION],
+ [TAG_NAMES.FIGURE, TAG_ID.FIGURE],
+ [TAG_NAMES.FONT, TAG_ID.FONT],
+ [TAG_NAMES.FOOTER, TAG_ID.FOOTER],
+ [TAG_NAMES.FOREIGN_OBJECT, TAG_ID.FOREIGN_OBJECT],
+ [TAG_NAMES.FORM, TAG_ID.FORM],
+ [TAG_NAMES.FRAME, TAG_ID.FRAME],
+ [TAG_NAMES.FRAMESET, TAG_ID.FRAMESET],
+ [TAG_NAMES.H1, TAG_ID.H1],
+ [TAG_NAMES.H2, TAG_ID.H2],
+ [TAG_NAMES.H3, TAG_ID.H3],
+ [TAG_NAMES.H4, TAG_ID.H4],
+ [TAG_NAMES.H5, TAG_ID.H5],
+ [TAG_NAMES.H6, TAG_ID.H6],
+ [TAG_NAMES.HEAD, TAG_ID.HEAD],
+ [TAG_NAMES.HEADER, TAG_ID.HEADER],
+ [TAG_NAMES.HGROUP, TAG_ID.HGROUP],
+ [TAG_NAMES.HR, TAG_ID.HR],
+ [TAG_NAMES.HTML, TAG_ID.HTML],
+ [TAG_NAMES.I, TAG_ID.I],
+ [TAG_NAMES.IMG, TAG_ID.IMG],
+ [TAG_NAMES.IMAGE, TAG_ID.IMAGE],
+ [TAG_NAMES.INPUT, TAG_ID.INPUT],
+ [TAG_NAMES.IFRAME, TAG_ID.IFRAME],
+ [TAG_NAMES.KEYGEN, TAG_ID.KEYGEN],
+ [TAG_NAMES.LABEL, TAG_ID.LABEL],
+ [TAG_NAMES.LI, TAG_ID.LI],
+ [TAG_NAMES.LINK, TAG_ID.LINK],
+ [TAG_NAMES.LISTING, TAG_ID.LISTING],
+ [TAG_NAMES.MAIN, TAG_ID.MAIN],
+ [TAG_NAMES.MALIGNMARK, TAG_ID.MALIGNMARK],
+ [TAG_NAMES.MARQUEE, TAG_ID.MARQUEE],
+ [TAG_NAMES.MATH, TAG_ID.MATH],
+ [TAG_NAMES.MENU, TAG_ID.MENU],
+ [TAG_NAMES.META, TAG_ID.META],
+ [TAG_NAMES.MGLYPH, TAG_ID.MGLYPH],
+ [TAG_NAMES.MI, TAG_ID.MI],
+ [TAG_NAMES.MO, TAG_ID.MO],
+ [TAG_NAMES.MN, TAG_ID.MN],
+ [TAG_NAMES.MS, TAG_ID.MS],
+ [TAG_NAMES.MTEXT, TAG_ID.MTEXT],
+ [TAG_NAMES.NAV, TAG_ID.NAV],
+ [TAG_NAMES.NOBR, TAG_ID.NOBR],
+ [TAG_NAMES.NOFRAMES, TAG_ID.NOFRAMES],
+ [TAG_NAMES.NOEMBED, TAG_ID.NOEMBED],
+ [TAG_NAMES.NOSCRIPT, TAG_ID.NOSCRIPT],
+ [TAG_NAMES.OBJECT, TAG_ID.OBJECT],
+ [TAG_NAMES.OL, TAG_ID.OL],
+ [TAG_NAMES.OPTGROUP, TAG_ID.OPTGROUP],
+ [TAG_NAMES.OPTION, TAG_ID.OPTION],
+ [TAG_NAMES.P, TAG_ID.P],
+ [TAG_NAMES.PARAM, TAG_ID.PARAM],
+ [TAG_NAMES.PLAINTEXT, TAG_ID.PLAINTEXT],
+ [TAG_NAMES.PRE, TAG_ID.PRE],
+ [TAG_NAMES.RB, TAG_ID.RB],
+ [TAG_NAMES.RP, TAG_ID.RP],
+ [TAG_NAMES.RT, TAG_ID.RT],
+ [TAG_NAMES.RTC, TAG_ID.RTC],
+ [TAG_NAMES.RUBY, TAG_ID.RUBY],
+ [TAG_NAMES.S, TAG_ID.S],
+ [TAG_NAMES.SCRIPT, TAG_ID.SCRIPT],
+ [TAG_NAMES.SECTION, TAG_ID.SECTION],
+ [TAG_NAMES.SELECT, TAG_ID.SELECT],
+ [TAG_NAMES.SOURCE, TAG_ID.SOURCE],
+ [TAG_NAMES.SMALL, TAG_ID.SMALL],
+ [TAG_NAMES.SPAN, TAG_ID.SPAN],
+ [TAG_NAMES.STRIKE, TAG_ID.STRIKE],
+ [TAG_NAMES.STRONG, TAG_ID.STRONG],
+ [TAG_NAMES.STYLE, TAG_ID.STYLE],
+ [TAG_NAMES.SUB, TAG_ID.SUB],
+ [TAG_NAMES.SUMMARY, TAG_ID.SUMMARY],
+ [TAG_NAMES.SUP, TAG_ID.SUP],
+ [TAG_NAMES.TABLE, TAG_ID.TABLE],
+ [TAG_NAMES.TBODY, TAG_ID.TBODY],
+ [TAG_NAMES.TEMPLATE, TAG_ID.TEMPLATE],
+ [TAG_NAMES.TEXTAREA, TAG_ID.TEXTAREA],
+ [TAG_NAMES.TFOOT, TAG_ID.TFOOT],
+ [TAG_NAMES.TD, TAG_ID.TD],
+ [TAG_NAMES.TH, TAG_ID.TH],
+ [TAG_NAMES.THEAD, TAG_ID.THEAD],
+ [TAG_NAMES.TITLE, TAG_ID.TITLE],
+ [TAG_NAMES.TR, TAG_ID.TR],
+ [TAG_NAMES.TRACK, TAG_ID.TRACK],
+ [TAG_NAMES.TT, TAG_ID.TT],
+ [TAG_NAMES.U, TAG_ID.U],
+ [TAG_NAMES.UL, TAG_ID.UL],
+ [TAG_NAMES.SVG, TAG_ID.SVG],
+ [TAG_NAMES.VAR, TAG_ID.VAR],
+ [TAG_NAMES.WBR, TAG_ID.WBR],
+ [TAG_NAMES.XMP, TAG_ID.XMP],
+]);
+function getTagID(tagName) {
+ var _a;
+ return (_a = TAG_NAME_TO_ID.get(tagName)) !== null && _a !== void 0 ? _a : TAG_ID.UNKNOWN;
+}
+exports.getTagID = getTagID;
+const $ = TAG_ID;
exports.SPECIAL_ELEMENTS = {
- [NS.HTML]: {
- [$.ADDRESS]: true,
- [$.APPLET]: true,
- [$.AREA]: true,
- [$.ARTICLE]: true,
- [$.ASIDE]: true,
- [$.BASE]: true,
- [$.BASEFONT]: true,
- [$.BGSOUND]: true,
- [$.BLOCKQUOTE]: true,
- [$.BODY]: true,
- [$.BR]: true,
- [$.BUTTON]: true,
- [$.CAPTION]: true,
- [$.CENTER]: true,
- [$.COL]: true,
- [$.COLGROUP]: true,
- [$.DD]: true,
- [$.DETAILS]: true,
- [$.DIR]: true,
- [$.DIV]: true,
- [$.DL]: true,
- [$.DT]: true,
- [$.EMBED]: true,
- [$.FIELDSET]: true,
- [$.FIGCAPTION]: true,
- [$.FIGURE]: true,
- [$.FOOTER]: true,
- [$.FORM]: true,
- [$.FRAME]: true,
- [$.FRAMESET]: true,
- [$.H1]: true,
- [$.H2]: true,
- [$.H3]: true,
- [$.H4]: true,
- [$.H5]: true,
- [$.H6]: true,
- [$.HEAD]: true,
- [$.HEADER]: true,
- [$.HGROUP]: true,
- [$.HR]: true,
- [$.HTML]: true,
- [$.IFRAME]: true,
- [$.IMG]: true,
- [$.INPUT]: true,
- [$.LI]: true,
- [$.LINK]: true,
- [$.LISTING]: true,
- [$.MAIN]: true,
- [$.MARQUEE]: true,
- [$.MENU]: true,
- [$.META]: true,
- [$.NAV]: true,
- [$.NOEMBED]: true,
- [$.NOFRAMES]: true,
- [$.NOSCRIPT]: true,
- [$.OBJECT]: true,
- [$.OL]: true,
- [$.P]: true,
- [$.PARAM]: true,
- [$.PLAINTEXT]: true,
- [$.PRE]: true,
- [$.SCRIPT]: true,
- [$.SECTION]: true,
- [$.SELECT]: true,
- [$.SOURCE]: true,
- [$.STYLE]: true,
- [$.SUMMARY]: true,
- [$.TABLE]: true,
- [$.TBODY]: true,
- [$.TD]: true,
- [$.TEMPLATE]: true,
- [$.TEXTAREA]: true,
- [$.TFOOT]: true,
- [$.TH]: true,
- [$.THEAD]: true,
- [$.TITLE]: true,
- [$.TR]: true,
- [$.TRACK]: true,
- [$.UL]: true,
- [$.WBR]: true,
- [$.XMP]: true
- },
- [NS.MATHML]: {
- [$.MI]: true,
- [$.MO]: true,
- [$.MN]: true,
- [$.MS]: true,
- [$.MTEXT]: true,
- [$.ANNOTATION_XML]: true
- },
- [NS.SVG]: {
- [$.TITLE]: true,
- [$.FOREIGN_OBJECT]: true,
- [$.DESC]: true
- }
+ [NS.HTML]: new Set([
+ $.ADDRESS,
+ $.APPLET,
+ $.AREA,
+ $.ARTICLE,
+ $.ASIDE,
+ $.BASE,
+ $.BASEFONT,
+ $.BGSOUND,
+ $.BLOCKQUOTE,
+ $.BODY,
+ $.BR,
+ $.BUTTON,
+ $.CAPTION,
+ $.CENTER,
+ $.COL,
+ $.COLGROUP,
+ $.DD,
+ $.DETAILS,
+ $.DIR,
+ $.DIV,
+ $.DL,
+ $.DT,
+ $.EMBED,
+ $.FIELDSET,
+ $.FIGCAPTION,
+ $.FIGURE,
+ $.FOOTER,
+ $.FORM,
+ $.FRAME,
+ $.FRAMESET,
+ $.H1,
+ $.H2,
+ $.H3,
+ $.H4,
+ $.H5,
+ $.H6,
+ $.HEAD,
+ $.HEADER,
+ $.HGROUP,
+ $.HR,
+ $.HTML,
+ $.IFRAME,
+ $.IMG,
+ $.INPUT,
+ $.LI,
+ $.LINK,
+ $.LISTING,
+ $.MAIN,
+ $.MARQUEE,
+ $.MENU,
+ $.META,
+ $.NAV,
+ $.NOEMBED,
+ $.NOFRAMES,
+ $.NOSCRIPT,
+ $.OBJECT,
+ $.OL,
+ $.P,
+ $.PARAM,
+ $.PLAINTEXT,
+ $.PRE,
+ $.SCRIPT,
+ $.SECTION,
+ $.SELECT,
+ $.SOURCE,
+ $.STYLE,
+ $.SUMMARY,
+ $.TABLE,
+ $.TBODY,
+ $.TD,
+ $.TEMPLATE,
+ $.TEXTAREA,
+ $.TFOOT,
+ $.TH,
+ $.THEAD,
+ $.TITLE,
+ $.TR,
+ $.TRACK,
+ $.UL,
+ $.WBR,
+ $.XMP,
+ ]),
+ [NS.MATHML]: new Set([$.MI, $.MO, $.MN, $.MS, $.MTEXT, $.ANNOTATION_XML]),
+ [NS.SVG]: new Set([$.TITLE, $.FOREIGN_OBJECT, $.DESC]),
+ [NS.XLINK]: new Set(),
+ [NS.XML]: new Set(),
+ [NS.XMLNS]: new Set(),
};
+function isNumberedHeader(tn) {
+ return tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6;
+}
+exports.isNumberedHeader = isNumberedHeader;
+const UNESCAPED_TEXT = new Set([
+ TAG_NAMES.STYLE,
+ TAG_NAMES.SCRIPT,
+ TAG_NAMES.XMP,
+ TAG_NAMES.IFRAME,
+ TAG_NAMES.NOEMBED,
+ TAG_NAMES.NOFRAMES,
+ TAG_NAMES.PLAINTEXT,
+]);
+function hasUnescapedText(tn, scriptingEnabled) {
+ return UNESCAPED_TEXT.has(tn) || (scriptingEnabled && tn === TAG_NAMES.NOSCRIPT);
+}
+exports.hasUnescapedText = hasUnescapedText;
+//# sourceMappingURL=html.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/html.js.map b/packages/parse5/lib/common/html.js.map
new file mode 100644
index 0000000..a0c2929
--- /dev/null
+++ b/packages/parse5/lib/common/html.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"html.js","sourceRoot":"","sources":["../../../lib/common/html.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/token.d.ts b/packages/parse5/lib/common/token.d.ts
new file mode 100644
index 0000000..fb36ee1
--- /dev/null
+++ b/packages/parse5/lib/common/token.d.ts
@@ -0,0 +1,85 @@
+import type { TAG_ID } from './html.js';
+export declare enum TokenType {
+ CHARACTER = 0,
+ NULL_CHARACTER = 1,
+ WHITESPACE_CHARACTER = 2,
+ START_TAG = 3,
+ END_TAG = 4,
+ COMMENT = 5,
+ DOCTYPE = 6,
+ EOF = 7,
+ HIBERNATION = 8
+}
+export interface Location {
+ /** One-based line index of the first character. */
+ startLine: number;
+ /** One-based column index of the first character. */
+ startCol: number;
+ /** Zero-based first character index. */
+ startOffset: number;
+ /** One-based line index of the last character. */
+ endLine: number;
+ /** One-based column index of the last character. Points directly *after* the last character. */
+ endCol: number;
+ /** Zero-based last character index. Points directly *after* the last character. */
+ endOffset: number;
+}
+export interface LocationWithAttributes extends Location {
+ /** Start tag attributes' location info. */
+ attrs?: Record;
+}
+export interface ElementLocation extends LocationWithAttributes {
+ /** Element's start tag location info. */
+ startTag?: Location;
+ /**
+ * Element's end tag location info.
+ * This property is undefined, if the element has no closing tag.
+ */
+ endTag?: Location;
+}
+interface TokenBase {
+ readonly type: TokenType;
+ location: Location | null;
+}
+export interface DoctypeToken extends TokenBase {
+ readonly type: TokenType.DOCTYPE;
+ name: string | null;
+ forceQuirks: boolean;
+ publicId: string | null;
+ systemId: string | null;
+}
+export interface Attribute {
+ /** The name of the attribute. */
+ name: string;
+ /** The namespace of the attribute. */
+ namespace?: string;
+ /** The namespace-related prefix of the attribute. */
+ prefix?: string;
+ /** The value of the attribute. */
+ value: string;
+}
+export interface TagToken extends TokenBase {
+ readonly type: TokenType.START_TAG | TokenType.END_TAG;
+ tagName: string;
+ /** Used to cache the ID of the tag name. */
+ tagID: TAG_ID;
+ selfClosing: boolean;
+ ackSelfClosing: boolean;
+ attrs: Attribute[];
+ location: LocationWithAttributes | null;
+}
+export declare function getTokenAttr(token: TagToken, attrName: string): string | null;
+export interface CommentToken extends TokenBase {
+ readonly type: TokenType.COMMENT;
+ data: string;
+}
+export interface EOFToken extends TokenBase {
+ readonly type: TokenType.EOF;
+}
+export interface CharacterToken extends TokenBase {
+ type: TokenType.CHARACTER | TokenType.NULL_CHARACTER | TokenType.WHITESPACE_CHARACTER;
+ chars: string;
+}
+export declare type Token = DoctypeToken | TagToken | CommentToken | EOFToken | CharacterToken;
+export {};
+//# sourceMappingURL=token.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/token.d.ts.map b/packages/parse5/lib/common/token.d.ts.map
new file mode 100644
index 0000000..87ef293
--- /dev/null
+++ b/packages/parse5/lib/common/token.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../lib/common/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,oBAAY,SAAS;IACjB,SAAS,IAAA;IACT,cAAc,IAAA;IACd,oBAAoB,IAAA;IACpB,SAAS,IAAA;IACT,OAAO,IAAA;IACP,OAAO,IAAA;IACP,OAAO,IAAA;IACP,GAAG,IAAA;IACH,WAAW,IAAA;CACd;AAED,MAAM,WAAW,QAAQ;IACrB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,gGAAgG;IAChG,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAuB,SAAQ,QAAQ;IACpD,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAgB,SAAQ,sBAAsB;IAC3D,yCAAyC;IACzC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,UAAU,SAAS;IACf,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC;IACjC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACtB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAS,SAAQ,SAAS;IACvC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ7E;AAED,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAS,SAAQ,SAAS;IACvC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;CAChC;AAED,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC7C,IAAI,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,oBAAoB,CAAC;IACtF,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,oBAAY,KAAK,GAAG,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,cAAc,CAAC"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/token.js b/packages/parse5/lib/common/token.js
new file mode 100644
index 0000000..1875411
--- /dev/null
+++ b/packages/parse5/lib/common/token.js
@@ -0,0 +1,25 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getTokenAttr = exports.TokenType = void 0;
+var TokenType;
+(function (TokenType) {
+ TokenType[TokenType["CHARACTER"] = 0] = "CHARACTER";
+ TokenType[TokenType["NULL_CHARACTER"] = 1] = "NULL_CHARACTER";
+ TokenType[TokenType["WHITESPACE_CHARACTER"] = 2] = "WHITESPACE_CHARACTER";
+ TokenType[TokenType["START_TAG"] = 3] = "START_TAG";
+ TokenType[TokenType["END_TAG"] = 4] = "END_TAG";
+ TokenType[TokenType["COMMENT"] = 5] = "COMMENT";
+ TokenType[TokenType["DOCTYPE"] = 6] = "DOCTYPE";
+ TokenType[TokenType["EOF"] = 7] = "EOF";
+ TokenType[TokenType["HIBERNATION"] = 8] = "HIBERNATION";
+})(TokenType = exports.TokenType || (exports.TokenType = {}));
+function getTokenAttr(token, attrName) {
+ for (let i = token.attrs.length - 1; i >= 0; i--) {
+ if (token.attrs[i].name === attrName) {
+ return token.attrs[i].value;
+ }
+ }
+ return null;
+}
+exports.getTokenAttr = getTokenAttr;
+//# sourceMappingURL=token.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/token.js.map b/packages/parse5/lib/common/token.js.map
new file mode 100644
index 0000000..c71cc4e
--- /dev/null
+++ b/packages/parse5/lib/common/token.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../lib/common/token.ts"],"names":[],"mappings":";;;AAEA,IAAY,SAUX;AAVD,WAAY,SAAS;IACjB,mDAAS,CAAA;IACT,6DAAc,CAAA;IACd,yEAAoB,CAAA;IACpB,mDAAS,CAAA;IACT,+CAAO,CAAA;IACP,+CAAO,CAAA;IACP,+CAAO,CAAA;IACP,uCAAG,CAAA;IACH,uDAAW,CAAA;AACf,CAAC,EAVW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAUpB;AAmED,SAAgB,YAAY,CAAC,KAAe,EAAE,QAAgB;IAC1D,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9C,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;YAClC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SAC/B;KACJ;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AARD,oCAQC"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/unicode.d.ts b/packages/parse5/lib/common/unicode.d.ts
new file mode 100644
index 0000000..9713197
--- /dev/null
+++ b/packages/parse5/lib/common/unicode.d.ts
@@ -0,0 +1,49 @@
+export declare const REPLACEMENT_CHARACTER = "\uFFFD";
+export declare enum CODE_POINTS {
+ EOF = -1,
+ NULL = 0,
+ TABULATION = 9,
+ CARRIAGE_RETURN = 13,
+ LINE_FEED = 10,
+ FORM_FEED = 12,
+ SPACE = 32,
+ EXCLAMATION_MARK = 33,
+ QUOTATION_MARK = 34,
+ NUMBER_SIGN = 35,
+ AMPERSAND = 38,
+ APOSTROPHE = 39,
+ HYPHEN_MINUS = 45,
+ SOLIDUS = 47,
+ DIGIT_0 = 48,
+ DIGIT_9 = 57,
+ SEMICOLON = 59,
+ LESS_THAN_SIGN = 60,
+ EQUALS_SIGN = 61,
+ GREATER_THAN_SIGN = 62,
+ QUESTION_MARK = 63,
+ LATIN_CAPITAL_A = 65,
+ LATIN_CAPITAL_F = 70,
+ LATIN_CAPITAL_X = 88,
+ LATIN_CAPITAL_Z = 90,
+ RIGHT_SQUARE_BRACKET = 93,
+ GRAVE_ACCENT = 96,
+ LATIN_SMALL_A = 97,
+ LATIN_SMALL_F = 102,
+ LATIN_SMALL_X = 120,
+ LATIN_SMALL_Z = 122,
+ REPLACEMENT_CHARACTER = 65533
+}
+export declare const SEQUENCES: {
+ DASH_DASH: string;
+ CDATA_START: string;
+ DOCTYPE: string;
+ SCRIPT: string;
+ PUBLIC: string;
+ SYSTEM: string;
+};
+export declare function isSurrogate(cp: number): boolean;
+export declare function isSurrogatePair(cp: number): boolean;
+export declare function getSurrogatePairCodePoint(cp1: number, cp2: number): number;
+export declare function isControlCodePoint(cp: number): boolean;
+export declare function isUndefinedCodePoint(cp: number): boolean;
+//# sourceMappingURL=unicode.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/unicode.d.ts.map b/packages/parse5/lib/common/unicode.d.ts.map
new file mode 100644
index 0000000..4793c44
--- /dev/null
+++ b/packages/parse5/lib/common/unicode.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"unicode.d.ts","sourceRoot":"","sources":["../../../lib/common/unicode.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAE9C,oBAAY,WAAW;IACnB,GAAG,KAAK;IACR,IAAI,IAAO;IACX,UAAU,IAAO;IACjB,eAAe,KAAO;IACtB,SAAS,KAAO;IAChB,SAAS,KAAO;IAChB,KAAK,KAAO;IACZ,gBAAgB,KAAO;IACvB,cAAc,KAAO;IACrB,WAAW,KAAO;IAClB,SAAS,KAAO;IAChB,UAAU,KAAO;IACjB,YAAY,KAAO;IACnB,OAAO,KAAO;IACd,OAAO,KAAO;IACd,OAAO,KAAO;IACd,SAAS,KAAO;IAChB,cAAc,KAAO;IACrB,WAAW,KAAO;IAClB,iBAAiB,KAAO;IACxB,aAAa,KAAO;IACpB,eAAe,KAAO;IACtB,eAAe,KAAO;IACtB,eAAe,KAAO;IACtB,eAAe,KAAO;IACtB,oBAAoB,KAAO;IAC3B,YAAY,KAAO;IACnB,aAAa,KAAO;IACpB,aAAa,MAAO;IACpB,aAAa,MAAO;IACpB,aAAa,MAAO;IACpB,qBAAqB,QAAU;CAClC;AAED,eAAO,MAAM,SAAS;;;;;;;CAOrB,CAAC;AAGF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1E;AAGD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAKtD;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAExD"}
\ No newline at end of file
diff --git a/packages/parse5/lib/common/unicode.js b/packages/parse5/lib/common/unicode.js
index 8d8234f..2187bc9 100644
--- a/packages/parse5/lib/common/unicode.js
+++ b/packages/parse5/lib/common/unicode.js
@@ -1,109 +1,77 @@
-'use strict';
-
-const UNDEFINED_CODE_POINTS = [
- 0xfffe,
- 0xffff,
- 0x1fffe,
- 0x1ffff,
- 0x2fffe,
- 0x2ffff,
- 0x3fffe,
- 0x3ffff,
- 0x4fffe,
- 0x4ffff,
- 0x5fffe,
- 0x5ffff,
- 0x6fffe,
- 0x6ffff,
- 0x7fffe,
- 0x7ffff,
- 0x8fffe,
- 0x8ffff,
- 0x9fffe,
- 0x9ffff,
- 0xafffe,
- 0xaffff,
- 0xbfffe,
- 0xbffff,
- 0xcfffe,
- 0xcffff,
- 0xdfffe,
- 0xdffff,
- 0xefffe,
- 0xeffff,
- 0xffffe,
- 0xfffff,
- 0x10fffe,
- 0x10ffff
-];
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isUndefinedCodePoint = exports.isControlCodePoint = exports.getSurrogatePairCodePoint = exports.isSurrogatePair = exports.isSurrogate = exports.SEQUENCES = exports.CODE_POINTS = exports.REPLACEMENT_CHARACTER = void 0;
+const UNDEFINED_CODE_POINTS = new Set([
+ 65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143, 327678, 327679, 393214,
+ 393215, 458750, 458751, 524286, 524287, 589822, 589823, 655358, 655359, 720894,
+ 720895, 786430, 786431, 851966, 851967, 917502, 917503, 983038, 983039, 1048574,
+ 1048575, 1114110, 1114111,
+]);
exports.REPLACEMENT_CHARACTER = '\uFFFD';
-
-exports.CODE_POINTS = {
- EOF: -1,
- NULL: 0x00,
- TABULATION: 0x09,
- CARRIAGE_RETURN: 0x0d,
- LINE_FEED: 0x0a,
- FORM_FEED: 0x0c,
- SPACE: 0x20,
- EXCLAMATION_MARK: 0x21,
- QUOTATION_MARK: 0x22,
- NUMBER_SIGN: 0x23,
- AMPERSAND: 0x26,
- APOSTROPHE: 0x27,
- HYPHEN_MINUS: 0x2d,
- SOLIDUS: 0x2f,
- DIGIT_0: 0x30,
- DIGIT_9: 0x39,
- SEMICOLON: 0x3b,
- LESS_THAN_SIGN: 0x3c,
- EQUALS_SIGN: 0x3d,
- GREATER_THAN_SIGN: 0x3e,
- QUESTION_MARK: 0x3f,
- LATIN_CAPITAL_A: 0x41,
- LATIN_CAPITAL_F: 0x46,
- LATIN_CAPITAL_X: 0x58,
- LATIN_CAPITAL_Z: 0x5a,
- RIGHT_SQUARE_BRACKET: 0x5d,
- GRAVE_ACCENT: 0x60,
- LATIN_SMALL_A: 0x61,
- LATIN_SMALL_F: 0x66,
- LATIN_SMALL_X: 0x78,
- LATIN_SMALL_Z: 0x7a,
- REPLACEMENT_CHARACTER: 0xfffd
+var CODE_POINTS;
+(function (CODE_POINTS) {
+ CODE_POINTS[CODE_POINTS["EOF"] = -1] = "EOF";
+ CODE_POINTS[CODE_POINTS["NULL"] = 0] = "NULL";
+ CODE_POINTS[CODE_POINTS["TABULATION"] = 9] = "TABULATION";
+ CODE_POINTS[CODE_POINTS["CARRIAGE_RETURN"] = 13] = "CARRIAGE_RETURN";
+ CODE_POINTS[CODE_POINTS["LINE_FEED"] = 10] = "LINE_FEED";
+ CODE_POINTS[CODE_POINTS["FORM_FEED"] = 12] = "FORM_FEED";
+ CODE_POINTS[CODE_POINTS["SPACE"] = 32] = "SPACE";
+ CODE_POINTS[CODE_POINTS["EXCLAMATION_MARK"] = 33] = "EXCLAMATION_MARK";
+ CODE_POINTS[CODE_POINTS["QUOTATION_MARK"] = 34] = "QUOTATION_MARK";
+ CODE_POINTS[CODE_POINTS["NUMBER_SIGN"] = 35] = "NUMBER_SIGN";
+ CODE_POINTS[CODE_POINTS["AMPERSAND"] = 38] = "AMPERSAND";
+ CODE_POINTS[CODE_POINTS["APOSTROPHE"] = 39] = "APOSTROPHE";
+ CODE_POINTS[CODE_POINTS["HYPHEN_MINUS"] = 45] = "HYPHEN_MINUS";
+ CODE_POINTS[CODE_POINTS["SOLIDUS"] = 47] = "SOLIDUS";
+ CODE_POINTS[CODE_POINTS["DIGIT_0"] = 48] = "DIGIT_0";
+ CODE_POINTS[CODE_POINTS["DIGIT_9"] = 57] = "DIGIT_9";
+ CODE_POINTS[CODE_POINTS["SEMICOLON"] = 59] = "SEMICOLON";
+ CODE_POINTS[CODE_POINTS["LESS_THAN_SIGN"] = 60] = "LESS_THAN_SIGN";
+ CODE_POINTS[CODE_POINTS["EQUALS_SIGN"] = 61] = "EQUALS_SIGN";
+ CODE_POINTS[CODE_POINTS["GREATER_THAN_SIGN"] = 62] = "GREATER_THAN_SIGN";
+ CODE_POINTS[CODE_POINTS["QUESTION_MARK"] = 63] = "QUESTION_MARK";
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_A"] = 65] = "LATIN_CAPITAL_A";
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_F"] = 70] = "LATIN_CAPITAL_F";
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_X"] = 88] = "LATIN_CAPITAL_X";
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_Z"] = 90] = "LATIN_CAPITAL_Z";
+ CODE_POINTS[CODE_POINTS["RIGHT_SQUARE_BRACKET"] = 93] = "RIGHT_SQUARE_BRACKET";
+ CODE_POINTS[CODE_POINTS["GRAVE_ACCENT"] = 96] = "GRAVE_ACCENT";
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_A"] = 97] = "LATIN_SMALL_A";
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_F"] = 102] = "LATIN_SMALL_F";
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_X"] = 120] = "LATIN_SMALL_X";
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_Z"] = 122] = "LATIN_SMALL_Z";
+ CODE_POINTS[CODE_POINTS["REPLACEMENT_CHARACTER"] = 65533] = "REPLACEMENT_CHARACTER";
+})(CODE_POINTS = exports.CODE_POINTS || (exports.CODE_POINTS = {}));
+exports.SEQUENCES = {
+ DASH_DASH: '--',
+ CDATA_START: '[CDATA[',
+ DOCTYPE: 'doctype',
+ SCRIPT: 'script',
+ PUBLIC: 'public',
+ SYSTEM: 'system',
};
-
-exports.CODE_POINT_SEQUENCES = {
- DASH_DASH_STRING: [0x2d, 0x2d], //--
- DOCTYPE_STRING: [0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45], //DOCTYPE
- CDATA_START_STRING: [0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b], //[CDATA[
- SCRIPT_STRING: [0x73, 0x63, 0x72, 0x69, 0x70, 0x74], //script
- PUBLIC_STRING: [0x50, 0x55, 0x42, 0x4c, 0x49, 0x43], //PUBLIC
- SYSTEM_STRING: [0x53, 0x59, 0x53, 0x54, 0x45, 0x4d] //SYSTEM
-};
-
//Surrogates
-exports.isSurrogate = function(cp) {
- return cp >= 0xd800 && cp <= 0xdfff;
-};
-
-exports.isSurrogatePair = function(cp) {
- return cp >= 0xdc00 && cp <= 0xdfff;
-};
-
-exports.getSurrogatePairCodePoint = function(cp1, cp2) {
- return (cp1 - 0xd800) * 0x400 + 0x2400 + cp2;
-};
-
+function isSurrogate(cp) {
+ return cp >= 55296 && cp <= 57343;
+}
+exports.isSurrogate = isSurrogate;
+function isSurrogatePair(cp) {
+ return cp >= 56320 && cp <= 57343;
+}
+exports.isSurrogatePair = isSurrogatePair;
+function getSurrogatePairCodePoint(cp1, cp2) {
+ return (cp1 - 55296) * 1024 + 9216 + cp2;
+}
+exports.getSurrogatePairCodePoint = getSurrogatePairCodePoint;
//NOTE: excluding NULL and ASCII whitespace
-exports.isControlCodePoint = function(cp) {
- return (
- (cp !== 0x20 && cp !== 0x0a && cp !== 0x0d && cp !== 0x09 && cp !== 0x0c && cp >= 0x01 && cp <= 0x1f) ||
- (cp >= 0x7f && cp <= 0x9f)
- );
-};
-
-exports.isUndefinedCodePoint = function(cp) {
- return (cp >= 0xfdd0 && cp <= 0xfdef) || UNDEFINED_CODE_POINTS.indexOf(cp) > -1;
-};
+function isControlCodePoint(cp) {
+ return ((cp !== 0x20 && cp !== 0x0a && cp !== 0x0d && cp !== 0x09 && cp !== 0x0c && cp >= 0x01 && cp <= 0x1f) ||
+ (cp >= 0x7f && cp <= 0x9f));
+}
+exports.isControlCodePoint = isControlCodePoint;
+function isUndefinedCodePoint(cp) {
+ return (cp >= 64976 && cp <= 65007) || UNDEFINED_CODE_POINTS.has(cp);
+}
+exports.isUndefinedCodePoint = isUndefinedCodePoint;
+//# sourceMappingURL=unicode.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/common/unicode.js.map b/packages/parse5/lib/common/unicode.js.map
new file mode 100644
index 0000000..1fde95b
--- /dev/null
+++ b/packages/parse5/lib/common/unicode.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"unicode.js","sourceRoot":"","sources":["../../../lib/common/unicode.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/extensions/error-reporting/mixin-base.js b/packages/parse5/lib/extensions/error-reporting/mixin-base.js
deleted file mode 100644
index 1e30cfc..0000000
--- a/packages/parse5/lib/extensions/error-reporting/mixin-base.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict';
-
-const Mixin = require('../../utils/mixin');
-
-class ErrorReportingMixinBase extends Mixin {
- constructor(host, opts) {
- super(host);
-
- this.posTracker = null;
- this.onParseError = opts.onParseError;
- }
-
- _setErrorLocation(err) {
- err.startLine = err.endLine = this.posTracker.line;
- err.startCol = err.endCol = this.posTracker.col;
- err.startOffset = err.endOffset = this.posTracker.offset;
- }
-
- _reportError(code) {
- const err = {
- code: code,
- startLine: -1,
- startCol: -1,
- startOffset: -1,
- endLine: -1,
- endCol: -1,
- endOffset: -1
- };
-
- this._setErrorLocation(err);
- this.onParseError(err);
- }
-
- _getOverriddenMethods(mxn) {
- return {
- _err(code) {
- mxn._reportError(code);
- }
- };
- }
-}
-
-module.exports = ErrorReportingMixinBase;
diff --git a/packages/parse5/lib/extensions/error-reporting/parser-mixin.js b/packages/parse5/lib/extensions/error-reporting/parser-mixin.js
deleted file mode 100644
index 107ec5a..0000000
--- a/packages/parse5/lib/extensions/error-reporting/parser-mixin.js
+++ /dev/null
@@ -1,52 +0,0 @@
-'use strict';
-
-const ErrorReportingMixinBase = require('./mixin-base');
-const ErrorReportingTokenizerMixin = require('./tokenizer-mixin');
-const LocationInfoTokenizerMixin = require('../location-info/tokenizer-mixin');
-const Mixin = require('../../utils/mixin');
-
-class ErrorReportingParserMixin extends ErrorReportingMixinBase {
- constructor(parser, opts) {
- super(parser, opts);
-
- this.opts = opts;
- this.ctLoc = null;
- this.locBeforeToken = false;
- }
-
- _setErrorLocation(err) {
- if (this.ctLoc) {
- err.startLine = this.ctLoc.startLine;
- err.startCol = this.ctLoc.startCol;
- err.startOffset = this.ctLoc.startOffset;
-
- err.endLine = this.locBeforeToken ? this.ctLoc.startLine : this.ctLoc.endLine;
- err.endCol = this.locBeforeToken ? this.ctLoc.startCol : this.ctLoc.endCol;
- err.endOffset = this.locBeforeToken ? this.ctLoc.startOffset : this.ctLoc.endOffset;
- }
- }
-
- _getOverriddenMethods(mxn, orig) {
- return {
- _bootstrap(document, fragmentContext) {
- orig._bootstrap.call(this, document, fragmentContext);
-
- Mixin.install(this.tokenizer, ErrorReportingTokenizerMixin, mxn.opts);
- Mixin.install(this.tokenizer, LocationInfoTokenizerMixin);
- },
-
- _processInputToken(token) {
- mxn.ctLoc = token.location;
-
- orig._processInputToken.call(this, token);
- },
-
- _err(code, options) {
- mxn.locBeforeToken = options && options.beforeToken;
- mxn._reportError(code);
- }
- };
- }
-}
-
-module.exports = ErrorReportingParserMixin;
diff --git a/packages/parse5/lib/extensions/error-reporting/preprocessor-mixin.js b/packages/parse5/lib/extensions/error-reporting/preprocessor-mixin.js
deleted file mode 100644
index 398c966..0000000
--- a/packages/parse5/lib/extensions/error-reporting/preprocessor-mixin.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-
-const ErrorReportingMixinBase = require('./mixin-base');
-const PositionTrackingPreprocessorMixin = require('../position-tracking/preprocessor-mixin');
-const Mixin = require('../../utils/mixin');
-
-class ErrorReportingPreprocessorMixin extends ErrorReportingMixinBase {
- constructor(preprocessor, opts) {
- super(preprocessor, opts);
-
- this.posTracker = Mixin.install(preprocessor, PositionTrackingPreprocessorMixin);
- this.lastErrOffset = -1;
- }
-
- _reportError(code) {
- //NOTE: avoid reporting error twice on advance/retreat
- if (this.lastErrOffset !== this.posTracker.offset) {
- this.lastErrOffset = this.posTracker.offset;
- super._reportError(code);
- }
- }
-}
-
-module.exports = ErrorReportingPreprocessorMixin;
diff --git a/packages/parse5/lib/extensions/error-reporting/tokenizer-mixin.js b/packages/parse5/lib/extensions/error-reporting/tokenizer-mixin.js
deleted file mode 100644
index 219fcab..0000000
--- a/packages/parse5/lib/extensions/error-reporting/tokenizer-mixin.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-const ErrorReportingMixinBase = require('./mixin-base');
-const ErrorReportingPreprocessorMixin = require('./preprocessor-mixin');
-const Mixin = require('../../utils/mixin');
-
-class ErrorReportingTokenizerMixin extends ErrorReportingMixinBase {
- constructor(tokenizer, opts) {
- super(tokenizer, opts);
-
- const preprocessorMixin = Mixin.install(tokenizer.preprocessor, ErrorReportingPreprocessorMixin, opts);
-
- this.posTracker = preprocessorMixin.posTracker;
- }
-}
-
-module.exports = ErrorReportingTokenizerMixin;
diff --git a/packages/parse5/lib/extensions/location-info/open-element-stack-mixin.js b/packages/parse5/lib/extensions/location-info/open-element-stack-mixin.js
deleted file mode 100644
index 765fe77..0000000
--- a/packages/parse5/lib/extensions/location-info/open-element-stack-mixin.js
+++ /dev/null
@@ -1,35 +0,0 @@
-'use strict';
-
-const Mixin = require('../../utils/mixin');
-
-class LocationInfoOpenElementStackMixin extends Mixin {
- constructor(stack, opts) {
- super(stack);
-
- this.onItemPop = opts.onItemPop;
- }
-
- _getOverriddenMethods(mxn, orig) {
- return {
- pop() {
- mxn.onItemPop(this.current);
- orig.pop.call(this);
- },
-
- popAllUpToHtmlElement() {
- for (let i = this.stackTop; i > 0; i--) {
- mxn.onItemPop(this.items[i]);
- }
-
- orig.popAllUpToHtmlElement.call(this);
- },
-
- remove(element) {
- mxn.onItemPop(this.current);
- orig.remove.call(this, element);
- }
- };
- }
-}
-
-module.exports = LocationInfoOpenElementStackMixin;
diff --git a/packages/parse5/lib/extensions/location-info/parser-mixin.js b/packages/parse5/lib/extensions/location-info/parser-mixin.js
deleted file mode 100644
index e7d3e2d..0000000
--- a/packages/parse5/lib/extensions/location-info/parser-mixin.js
+++ /dev/null
@@ -1,223 +0,0 @@
-'use strict';
-
-const Mixin = require('../../utils/mixin');
-const Tokenizer = require('../../tokenizer');
-const LocationInfoTokenizerMixin = require('./tokenizer-mixin');
-const LocationInfoOpenElementStackMixin = require('./open-element-stack-mixin');
-const HTML = require('../../common/html');
-
-//Aliases
-const $ = HTML.TAG_NAMES;
-
-class LocationInfoParserMixin extends Mixin {
- constructor(parser) {
- super(parser);
-
- this.parser = parser;
- this.treeAdapter = this.parser.treeAdapter;
- this.posTracker = null;
- this.lastStartTagToken = null;
- this.lastFosterParentingLocation = null;
- this.currentToken = null;
- }
-
- _setStartLocation(element) {
- let loc = null;
-
- if (this.lastStartTagToken) {
- loc = Object.assign({}, this.lastStartTagToken.location);
- loc.startTag = this.lastStartTagToken.location;
- }
-
- this.treeAdapter.setNodeSourceCodeLocation(element, loc);
- }
-
- _setEndLocation(element, closingToken) {
- const loc = this.treeAdapter.getNodeSourceCodeLocation(element);
-
- if (loc) {
- if (closingToken.location) {
- const ctLoc = closingToken.location;
- const tn = this.treeAdapter.getTagName(element);
-
- // NOTE: For cases like
- First 'p' closes without a closing
- // tag and for cases like | - 'p' closes without a closing tag.
- const isClosingEndTag = closingToken.type === Tokenizer.END_TAG_TOKEN && tn === closingToken.tagName;
- const endLoc = {};
- if (isClosingEndTag) {
- endLoc.endTag = Object.assign({}, ctLoc);
- endLoc.endLine = ctLoc.endLine;
- endLoc.endCol = ctLoc.endCol;
- endLoc.endOffset = ctLoc.endOffset;
- } else {
- endLoc.endLine = ctLoc.startLine;
- endLoc.endCol = ctLoc.startCol;
- endLoc.endOffset = ctLoc.startOffset;
- }
-
- this.treeAdapter.updateNodeSourceCodeLocation(element, endLoc);
- }
- }
- }
-
- _getOverriddenMethods(mxn, orig) {
- return {
- _bootstrap(document, fragmentContext) {
- orig._bootstrap.call(this, document, fragmentContext);
-
- mxn.lastStartTagToken = null;
- mxn.lastFosterParentingLocation = null;
- mxn.currentToken = null;
-
- const tokenizerMixin = Mixin.install(this.tokenizer, LocationInfoTokenizerMixin);
-
- mxn.posTracker = tokenizerMixin.posTracker;
-
- Mixin.install(this.openElements, LocationInfoOpenElementStackMixin, {
- onItemPop: function(element) {
- mxn._setEndLocation(element, mxn.currentToken);
- }
- });
- },
-
- _runParsingLoop(scriptHandler) {
- orig._runParsingLoop.call(this, scriptHandler);
-
- // NOTE: generate location info for elements
- // that remains on open element stack
- for (let i = this.openElements.stackTop; i >= 0; i--) {
- mxn._setEndLocation(this.openElements.items[i], mxn.currentToken);
- }
- },
-
- //Token processing
- _processTokenInForeignContent(token) {
- mxn.currentToken = token;
- orig._processTokenInForeignContent.call(this, token);
- },
-
- _processToken(token) {
- mxn.currentToken = token;
- orig._processToken.call(this, token);
-
- //NOTE: and are never popped from the stack, so we need to updated
- //their end location explicitly.
- const requireExplicitUpdate =
- token.type === Tokenizer.END_TAG_TOKEN &&
- (token.tagName === $.HTML || (token.tagName === $.BODY && this.openElements.hasInScope($.BODY)));
-
- if (requireExplicitUpdate) {
- for (let i = this.openElements.stackTop; i >= 0; i--) {
- const element = this.openElements.items[i];
-
- if (this.treeAdapter.getTagName(element) === token.tagName) {
- mxn._setEndLocation(element, token);
- break;
- }
- }
- }
- },
-
- //Doctype
- _setDocumentType(token) {
- orig._setDocumentType.call(this, token);
-
- const documentChildren = this.treeAdapter.getChildNodes(this.document);
- const cnLength = documentChildren.length;
-
- for (let i = 0; i < cnLength; i++) {
- const node = documentChildren[i];
-
- if (this.treeAdapter.isDocumentTypeNode(node)) {
- this.treeAdapter.setNodeSourceCodeLocation(node, token.location);
- break;
- }
- }
- },
-
- //Elements
- _attachElementToTree(element) {
- //NOTE: _attachElementToTree is called from _appendElement, _insertElement and _insertTemplate methods.
- //So we will use token location stored in this methods for the element.
- mxn._setStartLocation(element);
- mxn.lastStartTagToken = null;
- orig._attachElementToTree.call(this, element);
- },
-
- _appendElement(token, namespaceURI) {
- mxn.lastStartTagToken = token;
- orig._appendElement.call(this, token, namespaceURI);
- },
-
- _insertElement(token, namespaceURI) {
- mxn.lastStartTagToken = token;
- orig._insertElement.call(this, token, namespaceURI);
- },
-
- _insertTemplate(token) {
- mxn.lastStartTagToken = token;
- orig._insertTemplate.call(this, token);
-
- const tmplContent = this.treeAdapter.getTemplateContent(this.openElements.current);
-
- this.treeAdapter.setNodeSourceCodeLocation(tmplContent, null);
- },
-
- _insertFakeRootElement() {
- orig._insertFakeRootElement.call(this);
- this.treeAdapter.setNodeSourceCodeLocation(this.openElements.current, null);
- },
-
- //Comments
- _appendCommentNode(token, parent) {
- orig._appendCommentNode.call(this, token, parent);
-
- const children = this.treeAdapter.getChildNodes(parent);
- const commentNode = children[children.length - 1];
-
- this.treeAdapter.setNodeSourceCodeLocation(commentNode, token.location);
- },
-
- //Text
- _findFosterParentingLocation() {
- //NOTE: store last foster parenting location, so we will be able to find inserted text
- //in case of foster parenting
- mxn.lastFosterParentingLocation = orig._findFosterParentingLocation.call(this);
-
- return mxn.lastFosterParentingLocation;
- },
-
- _insertCharacters(token) {
- orig._insertCharacters.call(this, token);
-
- const hasFosterParent = this._shouldFosterParentOnInsertion();
-
- const parent =
- (hasFosterParent && mxn.lastFosterParentingLocation.parent) ||
- this.openElements.currentTmplContent ||
- this.openElements.current;
-
- const siblings = this.treeAdapter.getChildNodes(parent);
-
- const textNodeIdx =
- hasFosterParent && mxn.lastFosterParentingLocation.beforeElement
- ? siblings.indexOf(mxn.lastFosterParentingLocation.beforeElement) - 1
- : siblings.length - 1;
-
- const textNode = siblings[textNodeIdx];
-
- //NOTE: if we have location assigned by another token, then just update end position
- const tnLoc = this.treeAdapter.getNodeSourceCodeLocation(textNode);
-
- if (tnLoc) {
- const { endLine, endCol, endOffset } = token.location;
- this.treeAdapter.updateNodeSourceCodeLocation(textNode, { endLine, endCol, endOffset });
- } else {
- this.treeAdapter.setNodeSourceCodeLocation(textNode, token.location);
- }
- }
- };
- }
-}
-
-module.exports = LocationInfoParserMixin;
diff --git a/packages/parse5/lib/extensions/location-info/tokenizer-mixin.js b/packages/parse5/lib/extensions/location-info/tokenizer-mixin.js
deleted file mode 100644
index 3c1ef5f..0000000
--- a/packages/parse5/lib/extensions/location-info/tokenizer-mixin.js
+++ /dev/null
@@ -1,146 +0,0 @@
-'use strict';
-
-const Mixin = require('../../utils/mixin');
-const Tokenizer = require('../../tokenizer');
-const PositionTrackingPreprocessorMixin = require('../position-tracking/preprocessor-mixin');
-
-class LocationInfoTokenizerMixin extends Mixin {
- constructor(tokenizer) {
- super(tokenizer);
-
- this.tokenizer = tokenizer;
- this.posTracker = Mixin.install(tokenizer.preprocessor, PositionTrackingPreprocessorMixin);
- this.currentAttrLocation = null;
- this.ctLoc = null;
- }
-
- _getCurrentLocation() {
- return {
- startLine: this.posTracker.line,
- startCol: this.posTracker.col,
- startOffset: this.posTracker.offset,
- endLine: -1,
- endCol: -1,
- endOffset: -1
- };
- }
-
- _attachCurrentAttrLocationInfo() {
- this.currentAttrLocation.endLine = this.posTracker.line;
- this.currentAttrLocation.endCol = this.posTracker.col;
- this.currentAttrLocation.endOffset = this.posTracker.offset;
-
- const currentToken = this.tokenizer.currentToken;
- const currentAttr = this.tokenizer.currentAttr;
-
- if (!currentToken.location.attrs) {
- currentToken.location.attrs = Object.create(null);
- }
-
- currentToken.location.attrs[currentAttr.name] = this.currentAttrLocation;
- }
-
- _getOverriddenMethods(mxn, orig) {
- const methods = {
- _createStartTagToken() {
- orig._createStartTagToken.call(this);
- this.currentToken.location = mxn.ctLoc;
- },
-
- _createEndTagToken() {
- orig._createEndTagToken.call(this);
- this.currentToken.location = mxn.ctLoc;
- },
-
- _createCommentToken() {
- orig._createCommentToken.call(this);
- this.currentToken.location = mxn.ctLoc;
- },
-
- _createDoctypeToken(initialName) {
- orig._createDoctypeToken.call(this, initialName);
- this.currentToken.location = mxn.ctLoc;
- },
-
- _createCharacterToken(type, ch) {
- orig._createCharacterToken.call(this, type, ch);
- this.currentCharacterToken.location = mxn.ctLoc;
- },
-
- _createEOFToken() {
- orig._createEOFToken.call(this);
- this.currentToken.location = mxn._getCurrentLocation();
- },
-
- _createAttr(attrNameFirstCh) {
- orig._createAttr.call(this, attrNameFirstCh);
- mxn.currentAttrLocation = mxn._getCurrentLocation();
- },
-
- _leaveAttrName(toState) {
- orig._leaveAttrName.call(this, toState);
- mxn._attachCurrentAttrLocationInfo();
- },
-
- _leaveAttrValue(toState) {
- orig._leaveAttrValue.call(this, toState);
- mxn._attachCurrentAttrLocationInfo();
- },
-
- _emitCurrentToken() {
- const ctLoc = this.currentToken.location;
-
- //NOTE: if we have pending character token make it's end location equal to the
- //current token's start location.
- if (this.currentCharacterToken) {
- this.currentCharacterToken.location.endLine = ctLoc.startLine;
- this.currentCharacterToken.location.endCol = ctLoc.startCol;
- this.currentCharacterToken.location.endOffset = ctLoc.startOffset;
- }
-
- if (this.currentToken.type === Tokenizer.EOF_TOKEN) {
- ctLoc.endLine = ctLoc.startLine;
- ctLoc.endCol = ctLoc.startCol;
- ctLoc.endOffset = ctLoc.startOffset;
- } else {
- ctLoc.endLine = mxn.posTracker.line;
- ctLoc.endCol = mxn.posTracker.col + 1;
- ctLoc.endOffset = mxn.posTracker.offset + 1;
- }
-
- orig._emitCurrentToken.call(this);
- },
-
- _emitCurrentCharacterToken() {
- const ctLoc = this.currentCharacterToken && this.currentCharacterToken.location;
-
- //NOTE: if we have character token and it's location wasn't set in the _emitCurrentToken(),
- //then set it's location at the current preprocessor position.
- //We don't need to increment preprocessor position, since character token
- //emission is always forced by the start of the next character token here.
- //So, we already have advanced position.
- if (ctLoc && ctLoc.endOffset === -1) {
- ctLoc.endLine = mxn.posTracker.line;
- ctLoc.endCol = mxn.posTracker.col;
- ctLoc.endOffset = mxn.posTracker.offset;
- }
-
- orig._emitCurrentCharacterToken.call(this);
- }
- };
-
- //NOTE: patch initial states for each mode to obtain token start position
- Object.keys(Tokenizer.MODE).forEach(modeName => {
- const state = Tokenizer.MODE[modeName];
-
- methods[state] = function(cp) {
- mxn.ctLoc = mxn._getCurrentLocation();
- orig[state].call(this, cp);
- };
- });
-
- return methods;
- }
-}
-
-module.exports = LocationInfoTokenizerMixin;
diff --git a/packages/parse5/lib/extensions/position-tracking/preprocessor-mixin.js b/packages/parse5/lib/extensions/position-tracking/preprocessor-mixin.js
deleted file mode 100644
index 3a07d78..0000000
--- a/packages/parse5/lib/extensions/position-tracking/preprocessor-mixin.js
+++ /dev/null
@@ -1,64 +0,0 @@
-'use strict';
-
-const Mixin = require('../../utils/mixin');
-
-class PositionTrackingPreprocessorMixin extends Mixin {
- constructor(preprocessor) {
- super(preprocessor);
-
- this.preprocessor = preprocessor;
- this.isEol = false;
- this.lineStartPos = 0;
- this.droppedBufferSize = 0;
-
- this.offset = 0;
- this.col = 0;
- this.line = 1;
- }
-
- _getOverriddenMethods(mxn, orig) {
- return {
- advance() {
- const pos = this.pos + 1;
- const ch = this.html[pos];
-
- //NOTE: LF should be in the last column of the line
- if (mxn.isEol) {
- mxn.isEol = false;
- mxn.line++;
- mxn.lineStartPos = pos;
- }
-
- if (ch === '\n' || (ch === '\r' && this.html[pos + 1] !== '\n')) {
- mxn.isEol = true;
- }
-
- mxn.col = pos - mxn.lineStartPos + 1;
- mxn.offset = mxn.droppedBufferSize + pos;
-
- return orig.advance.call(this);
- },
-
- retreat() {
- orig.retreat.call(this);
-
- mxn.isEol = false;
- mxn.col = this.pos - mxn.lineStartPos + 1;
- },
-
- dropParsedChunk() {
- const prevPos = this.pos;
-
- orig.dropParsedChunk.call(this);
-
- const reduction = prevPos - this.pos;
-
- mxn.lineStartPos -= reduction;
- mxn.droppedBufferSize += reduction;
- mxn.offset = mxn.droppedBufferSize + this.pos;
- }
- };
- }
-}
-
-module.exports = PositionTrackingPreprocessorMixin;
diff --git a/packages/parse5/lib/index.d.ts b/packages/parse5/lib/index.d.ts
new file mode 100644
index 0000000..81253d3
--- /dev/null
+++ b/packages/parse5/lib/index.d.ts
@@ -0,0 +1,60 @@
+import { type ParserOptions } from './parser/index.js';
+import type { DefaultTreeAdapterMap } from './tree-adapters/default.js';
+import type { TreeAdapterTypeMap } from './tree-adapters/interface.js';
+export { type DefaultTreeAdapterMap, defaultTreeAdapter } from './tree-adapters/default.js';
+export type { TreeAdapter, TreeAdapterTypeMap } from './tree-adapters/interface.js';
+export { type ParserOptions, /** @internal */ Parser } from './parser/index.js';
+export { serialize, serializeOuter, type SerializerOptions } from './serializer/index.js';
+export type { ParserError } from './common/error-codes.js';
+/** @internal */
+export * as foreignContent from './common/foreign-content.js';
+/** @internal */
+export * as html from './common/html.js';
+/** @internal */
+export * as Token from './common/token.js';
+/** @internal */
+export { Tokenizer, type TokenizerOptions, TokenizerMode, type TokenHandler } from './tokenizer/index.js';
+/**
+ * Parses an HTML string.
+ *
+ * @param html Input HTML string.
+ * @param options Parsing options.
+ * @returns Document
+ *
+ * @example
+ *
+ * ```js
+ * const parse5 = require('parse5');
+ *
+ * const document = parse5.parse('Hi there!');
+ *
+ * console.log(document.childNodes[1].tagName); //> 'html'
+ *```
+ */
+export declare function parse(html: string, options?: ParserOptions): T['document'];
+/**
+ * Parses an HTML fragment.
+ *
+ * @example
+ *
+ * ```js
+ * const parse5 = require('parse5');
+ *
+ * const documentFragment = parse5.parseFragment('');
+ *
+ * console.log(documentFragment.childNodes[0].tagName); //> 'table'
+ *
+ * // Parses the html fragment in the context of the parsed element.
+ * const trFragment = parser.parseFragment(documentFragment.childNodes[0], '| Shake it, baby |
');
+ *
+ * console.log(trFragment.childNodes[0].childNodes[0].tagName); //> 'td'
+ * ```
+ *
+ * @param fragmentContext Parsing context element. If specified, given fragment will be parsed as if it was set to the context element's `innerHTML` property.
+ * @param html Input HTML fragment string.
+ * @param options Parsing options.
+ * @returns DocumentFragment
+ */
+export declare function parseFragment(fragmentContext: T['parentNode'] | null, html: string, options: ParserOptions): T['documentFragment'];
+export declare function parseFragment(html: string, options?: ParserOptions): T['documentFragment'];
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/index.d.ts.map b/packages/parse5/lib/index.d.ts.map
new file mode 100644
index 0000000..16400be
--- /dev/null
+++ b/packages/parse5/lib/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,EAAE,KAAK,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,KAAK,aAAa,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,gBAAgB;AAChB,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAC;AAC9D,gBAAgB;AAChB,OAAO,KAAK,IAAI,MAAM,kBAAkB,CAAC;AACzC,gBAAgB;AAChB,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAC3C,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAI1G;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,kBAAkB,GAAG,qBAAqB,EACtE,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAC3B,CAAC,CAAC,UAAU,CAAC,CAEf;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,kBAAkB,GAAG,qBAAqB,EAC9E,eAAe,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI,EACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAC1B,CAAC,CAAC,kBAAkB,CAAC,CAAC;AACzB,wBAAgB,aAAa,CAAC,CAAC,SAAS,kBAAkB,GAAG,qBAAqB,EAC9E,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAC3B,CAAC,CAAC,kBAAkB,CAAC,CAAC"}
\ No newline at end of file
diff --git a/packages/parse5/lib/index.js b/packages/parse5/lib/index.js
index 09c8e33..fa5945e 100644
--- a/packages/parse5/lib/index.js
+++ b/packages/parse5/lib/index.js
@@ -1,29 +1,55 @@
-'use strict';
-
-const Parser = require('./parser');
-const Serializer = require('./serializer');
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.parseFragment = exports.parse = exports.TokenizerMode = exports.Tokenizer = exports.Token = exports.html = exports.foreignContent = exports.serializeOuter = exports.serialize = exports.Parser = exports.defaultTreeAdapter = void 0;
+const index_js_1 = require("./parser/index.js");
+var default_js_1 = require("./tree-adapters/default.js");
+Object.defineProperty(exports, "defaultTreeAdapter", { enumerable: true, get: function () { return default_js_1.defaultTreeAdapter; } });
+var index_js_2 = require("./parser/index.js");
+Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return index_js_2.Parser; } });
+var index_js_3 = require("./serializer/index.js");
+Object.defineProperty(exports, "serialize", { enumerable: true, get: function () { return index_js_3.serialize; } });
+Object.defineProperty(exports, "serializeOuter", { enumerable: true, get: function () { return index_js_3.serializeOuter; } });
+/** @internal */
+exports.foreignContent = require("./common/foreign-content.js");
+/** @internal */
+exports.html = require("./common/html.js");
+/** @internal */
+exports.Token = require("./common/token.js");
+/** @internal */
+var index_js_4 = require("./tokenizer/index.js");
+Object.defineProperty(exports, "Tokenizer", { enumerable: true, get: function () { return index_js_4.Tokenizer; } });
+Object.defineProperty(exports, "TokenizerMode", { enumerable: true, get: function () { return index_js_4.TokenizerMode; } });
// Shorthands
-exports.parse = function parse(html, options) {
- const parser = new Parser(options);
-
- return parser.parse(html);
-};
-
-exports.parseFragment = function parseFragment(fragmentContext, html, options) {
+/**
+ * Parses an HTML string.
+ *
+ * @param html Input HTML string.
+ * @param options Parsing options.
+ * @returns Document
+ *
+ * @example
+ *
+ * ```js
+ * const parse5 = require('parse5');
+ *
+ * const document = parse5.parse('Hi there!');
+ *
+ * console.log(document.childNodes[1].tagName); //> 'html'
+ *```
+ */
+function parse(html, options) {
+ return index_js_1.Parser.parse(html, options);
+}
+exports.parse = parse;
+function parseFragment(fragmentContext, html, options) {
if (typeof fragmentContext === 'string') {
options = html;
html = fragmentContext;
fragmentContext = null;
}
-
- const parser = new Parser(options);
-
- return parser.parseFragment(html, fragmentContext);
-};
-
-exports.serialize = function(node, options) {
- const serializer = new Serializer(node, options);
-
- return serializer.serialize();
-};
+ const parser = index_js_1.Parser.getFragmentParser(fragmentContext, options);
+ parser.tokenizer.write(html, true);
+ return parser.getFragment();
+}
+exports.parseFragment = parseFragment;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/index.js.map b/packages/parse5/lib/index.js.map
new file mode 100644
index 0000000..4627fb3
--- /dev/null
+++ b/packages/parse5/lib/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":";;;AAAA,gDAA+D;AAK/D,yDAA4F;AAAvD,gHAAA,kBAAkB,OAAA;AAEvD,8CAAgF;AAAlC,kGAAA,MAAM,OAAA;AACpD,kDAA0F;AAAjF,qGAAA,SAAS,OAAA;AAAE,0GAAA,cAAc,OAAA;AAGlC,gBAAgB;AAChB,gEAA8D;AAC9D,gBAAgB;AAChB,2CAAyC;AACzC,gBAAgB;AAChB,6CAA2C;AAC3C,gBAAgB;AAChB,iDAA0G;AAAjG,qGAAA,SAAS,OAAA;AAAyB,yGAAA,aAAa,OAAA;AAExD,aAAa;AAEb;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,KAAK,CACjB,IAAY,EACZ,OAA0B;IAE1B,OAAO,iBAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AALD,sBAKC;AAkCD,SAAgB,aAAa,CACzB,eAAgD,EAChD,IAAgC,EAChC,OAA0B;IAE1B,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE;QACrC,OAAO,GAAG,IAAwB,CAAC;QACnC,IAAI,GAAG,eAAe,CAAC;QACvB,eAAe,GAAG,IAAI,CAAC;KAC1B;IAED,MAAM,MAAM,GAAG,iBAAM,CAAC,iBAAiB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAElE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAc,EAAE,IAAI,CAAC,CAAC;IAE7C,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC;AAhBD,sCAgBC"}
\ No newline at end of file
diff --git a/packages/parse5/lib/package.json b/packages/parse5/lib/package.json
new file mode 100644
index 0000000..729ac4d
--- /dev/null
+++ b/packages/parse5/lib/package.json
@@ -0,0 +1 @@
+{"type":"commonjs"}
diff --git a/packages/parse5/lib/parser/formatting-element-list.d.ts b/packages/parse5/lib/parser/formatting-element-list.d.ts
new file mode 100644
index 0000000..2757ca7
--- /dev/null
+++ b/packages/parse5/lib/parser/formatting-element-list.d.ts
@@ -0,0 +1,32 @@
+import type { TagToken } from '../common/token.js';
+import type { TreeAdapter, TreeAdapterTypeMap } from '../tree-adapters/interface';
+export declare enum EntryType {
+ Marker = 0,
+ Element = 1
+}
+interface MarkerEntry {
+ type: EntryType.Marker;
+}
+export interface ElementEntry {
+ type: EntryType.Element;
+ element: T['element'];
+ token: TagToken;
+}
+export declare type Entry = MarkerEntry | ElementEntry;
+export declare class FormattingElementList {
+ private treeAdapter;
+ entries: Entry[];
+ bookmark: Entry | null;
+ constructor(treeAdapter: TreeAdapter);
+ private _getNoahArkConditionCandidates;
+ private _ensureNoahArkCondition;
+ insertMarker(): void;
+ pushElement(element: T['element'], token: TagToken): void;
+ insertElementAfterBookmark(element: T['element'], token: TagToken): void;
+ removeEntry(entry: Entry): void;
+ clearToLastMarker(): void;
+ getElementEntryInScopeWithTagName(tagName: string): ElementEntry | null;
+ getElementEntry(element: T['element']): ElementEntry | undefined;
+}
+export {};
+//# sourceMappingURL=formatting-element-list.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/formatting-element-list.d.ts.map b/packages/parse5/lib/parser/formatting-element-list.d.ts.map
new file mode 100644
index 0000000..e96ac5f
--- /dev/null
+++ b/packages/parse5/lib/parser/formatting-element-list.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"formatting-element-list.d.ts","sourceRoot":"","sources":["../../../lib/parser/formatting-element-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAKlF,oBAAY,SAAS;IACjB,MAAM,IAAA;IACN,OAAO,IAAA;CACV;AAED,UAAU,WAAW;IACjB,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,kBAAkB;IACtD,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IACtB,KAAK,EAAE,QAAQ,CAAC;CACnB;AAED,oBAAY,KAAK,CAAC,CAAC,SAAS,kBAAkB,IAAI,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;AAKhF,qBAAa,qBAAqB,CAAC,CAAC,SAAS,kBAAkB;IAI/C,OAAO,CAAC,WAAW;IAH/B,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAM;IACzB,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAQ;gBAEb,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IAK/C,OAAO,CAAC,8BAA8B;IAkCtC,OAAO,CAAC,uBAAuB;IA4B/B,YAAY,IAAI,IAAI;IAIpB,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI;IAUzD,0BAA0B,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI;IAUxE,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;IAQlC,iBAAiB,IAAI,IAAI;IAWzB,iCAAiC,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAQ1E,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS;CAKtE"}
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/formatting-element-list.js b/packages/parse5/lib/parser/formatting-element-list.js
index 0e241db..3b34e36 100644
--- a/packages/parse5/lib/parser/formatting-element-list.js
+++ b/packages/parse5/lib/parser/formatting-element-list.js
@@ -1,181 +1,110 @@
-'use strict';
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.FormattingElementList = exports.EntryType = void 0;
//Const
const NOAH_ARK_CAPACITY = 3;
-
+var EntryType;
+(function (EntryType) {
+ EntryType[EntryType["Marker"] = 0] = "Marker";
+ EntryType[EntryType["Element"] = 1] = "Element";
+})(EntryType = exports.EntryType || (exports.EntryType = {}));
+const MARKER = { type: EntryType.Marker };
//List of formatting elements
class FormattingElementList {
constructor(treeAdapter) {
- this.length = 0;
- this.entries = [];
this.treeAdapter = treeAdapter;
+ this.entries = [];
this.bookmark = null;
}
-
//Noah Ark's condition
//OPTIMIZATION: at first we try to find possible candidates for exclusion using
//lightweight heuristics without thorough attributes check.
- _getNoahArkConditionCandidates(newElement) {
+ _getNoahArkConditionCandidates(newElement, neAttrs) {
const candidates = [];
-
- if (this.length >= NOAH_ARK_CAPACITY) {
- const neAttrsLength = this.treeAdapter.getAttrList(newElement).length;
- const neTagName = this.treeAdapter.getTagName(newElement);
- const neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement);
-
- for (let i = this.length - 1; i >= 0; i--) {
- const entry = this.entries[i];
-
- if (entry.type === FormattingElementList.MARKER_ENTRY) {
- break;
- }
-
- const element = entry.element;
+ const neAttrsLength = neAttrs.length;
+ const neTagName = this.treeAdapter.getTagName(newElement);
+ const neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement);
+ for (let i = 0; i < this.entries.length; i++) {
+ const entry = this.entries[i];
+ if (entry.type === EntryType.Marker) {
+ break;
+ }
+ const { element } = entry;
+ if (this.treeAdapter.getTagName(element) === neTagName &&
+ this.treeAdapter.getNamespaceURI(element) === neNamespaceURI) {
const elementAttrs = this.treeAdapter.getAttrList(element);
-
- const isCandidate =
- this.treeAdapter.getTagName(element) === neTagName &&
- this.treeAdapter.getNamespaceURI(element) === neNamespaceURI &&
- elementAttrs.length === neAttrsLength;
-
- if (isCandidate) {
+ if (elementAttrs.length === neAttrsLength) {
candidates.push({ idx: i, attrs: elementAttrs });
}
}
}
-
- return candidates.length < NOAH_ARK_CAPACITY ? [] : candidates;
+ return candidates;
}
-
_ensureNoahArkCondition(newElement) {
- const candidates = this._getNoahArkConditionCandidates(newElement);
- let cLength = candidates.length;
-
- if (cLength) {
- const neAttrs = this.treeAdapter.getAttrList(newElement);
- const neAttrsLength = neAttrs.length;
- const neAttrsMap = Object.create(null);
-
- //NOTE: build attrs map for the new element so we can perform fast lookups
- for (let i = 0; i < neAttrsLength; i++) {
- const neAttr = neAttrs[i];
-
- neAttrsMap[neAttr.name] = neAttr.value;
- }
-
- for (let i = 0; i < neAttrsLength; i++) {
- for (let j = 0; j < cLength; j++) {
- const cAttr = candidates[j].attrs[i];
-
- if (neAttrsMap[cAttr.name] !== cAttr.value) {
- candidates.splice(j, 1);
- cLength--;
- }
-
- if (candidates.length < NOAH_ARK_CAPACITY) {
- return;
- }
+ if (this.entries.length < NOAH_ARK_CAPACITY)
+ return;
+ const neAttrs = this.treeAdapter.getAttrList(newElement);
+ const candidates = this._getNoahArkConditionCandidates(newElement, neAttrs);
+ if (candidates.length < NOAH_ARK_CAPACITY)
+ return;
+ //NOTE: build attrs map for the new element, so we can perform fast lookups
+ const neAttrsMap = new Map(neAttrs.map((neAttr) => [neAttr.name, neAttr.value]));
+ let validCandidates = 0;
+ //NOTE: remove bottommost candidates, until Noah's Ark condition will not be met
+ for (let i = 0; i < candidates.length; i++) {
+ const candidate = candidates[i];
+ // We know that `candidate.attrs.length === neAttrs.length`
+ if (candidate.attrs.every((cAttr) => neAttrsMap.get(cAttr.name) === cAttr.value)) {
+ validCandidates += 1;
+ if (validCandidates >= NOAH_ARK_CAPACITY) {
+ this.entries.splice(candidate.idx, 1);
}
}
-
- //NOTE: remove bottommost candidates until Noah's Ark condition will not be met
- for (let i = cLength - 1; i >= NOAH_ARK_CAPACITY - 1; i--) {
- this.entries.splice(candidates[i].idx, 1);
- this.length--;
- }
}
}
-
//Mutations
insertMarker() {
- this.entries.push({ type: FormattingElementList.MARKER_ENTRY });
- this.length++;
+ this.entries.unshift(MARKER);
}
-
pushElement(element, token) {
this._ensureNoahArkCondition(element);
-
- this.entries.push({
- type: FormattingElementList.ELEMENT_ENTRY,
- element: element,
- token: token
+ this.entries.unshift({
+ type: EntryType.Element,
+ element,
+ token,
});
-
- this.length++;
}
-
insertElementAfterBookmark(element, token) {
- let bookmarkIdx = this.length - 1;
-
- for (; bookmarkIdx >= 0; bookmarkIdx--) {
- if (this.entries[bookmarkIdx] === this.bookmark) {
- break;
- }
- }
-
- this.entries.splice(bookmarkIdx + 1, 0, {
- type: FormattingElementList.ELEMENT_ENTRY,
- element: element,
- token: token
+ const bookmarkIdx = this.entries.indexOf(this.bookmark);
+ this.entries.splice(bookmarkIdx, 0, {
+ type: EntryType.Element,
+ element,
+ token,
});
-
- this.length++;
}
-
removeEntry(entry) {
- for (let i = this.length - 1; i >= 0; i--) {
- if (this.entries[i] === entry) {
- this.entries.splice(i, 1);
- this.length--;
- break;
- }
+ const entryIndex = this.entries.indexOf(entry);
+ if (entryIndex >= 0) {
+ this.entries.splice(entryIndex, 1);
}
}
-
clearToLastMarker() {
- while (this.length) {
- const entry = this.entries.pop();
-
- this.length--;
-
- if (entry.type === FormattingElementList.MARKER_ENTRY) {
- break;
- }
+ const markerIdx = this.entries.indexOf(MARKER);
+ if (markerIdx >= 0) {
+ this.entries.splice(0, markerIdx + 1);
+ }
+ else {
+ this.entries.length = 0;
}
}
-
//Search
getElementEntryInScopeWithTagName(tagName) {
- for (let i = this.length - 1; i >= 0; i--) {
- const entry = this.entries[i];
-
- if (entry.type === FormattingElementList.MARKER_ENTRY) {
- return null;
- }
-
- if (this.treeAdapter.getTagName(entry.element) === tagName) {
- return entry;
- }
- }
-
- return null;
+ const entry = this.entries.find((entry) => entry.type === EntryType.Marker || this.treeAdapter.getTagName(entry.element) === tagName);
+ return entry && entry.type === EntryType.Element ? entry : null;
}
-
getElementEntry(element) {
- for (let i = this.length - 1; i >= 0; i--) {
- const entry = this.entries[i];
-
- if (entry.type === FormattingElementList.ELEMENT_ENTRY && entry.element === element) {
- return entry;
- }
- }
-
- return null;
+ return this.entries.find((entry) => entry.type === EntryType.Element && entry.element === element);
}
}
-
-//Entry types
-FormattingElementList.MARKER_ENTRY = 'MARKER_ENTRY';
-FormattingElementList.ELEMENT_ENTRY = 'ELEMENT_ENTRY';
-
-module.exports = FormattingElementList;
+exports.FormattingElementList = FormattingElementList;
+//# sourceMappingURL=formatting-element-list.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/formatting-element-list.js.map b/packages/parse5/lib/parser/formatting-element-list.js.map
new file mode 100644
index 0000000..b4d4a3a
--- /dev/null
+++ b/packages/parse5/lib/parser/formatting-element-list.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"formatting-element-list.js","sourceRoot":"","sources":["../../../lib/parser/formatting-element-list.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/index.d.ts b/packages/parse5/lib/parser/index.d.ts
new file mode 100644
index 0000000..50a9bd0
--- /dev/null
+++ b/packages/parse5/lib/parser/index.d.ts
@@ -0,0 +1,157 @@
+import { Tokenizer, TokenizerMode, type TokenHandler } from '../tokenizer/index.js';
+import { OpenElementStack, type StackHandler } from './open-element-stack.js';
+import { FormattingElementList } from './formatting-element-list.js';
+import { ERR, type ParserErrorHandler } from '../common/error-codes.js';
+import { TAG_ID as $, NS } from '../common/html.js';
+import type { TreeAdapter, TreeAdapterTypeMap } from '../tree-adapters/interface.js';
+import { type Token, type CommentToken, type CharacterToken, type TagToken, type DoctypeToken, type EOFToken, type LocationWithAttributes } from '../common/token.js';
+declare enum InsertionMode {
+ INITIAL = 0,
+ BEFORE_HTML = 1,
+ BEFORE_HEAD = 2,
+ IN_HEAD = 3,
+ IN_HEAD_NO_SCRIPT = 4,
+ AFTER_HEAD = 5,
+ IN_BODY = 6,
+ TEXT = 7,
+ IN_TABLE = 8,
+ IN_TABLE_TEXT = 9,
+ IN_CAPTION = 10,
+ IN_COLUMN_GROUP = 11,
+ IN_TABLE_BODY = 12,
+ IN_ROW = 13,
+ IN_CELL = 14,
+ IN_SELECT = 15,
+ IN_SELECT_IN_TABLE = 16,
+ IN_TEMPLATE = 17,
+ AFTER_BODY = 18,
+ IN_FRAMESET = 19,
+ AFTER_FRAMESET = 20,
+ AFTER_AFTER_BODY = 21,
+ AFTER_AFTER_FRAMESET = 22
+}
+export interface ParserOptions {
+ /**
+ * The [scripting flag](https://html.spec.whatwg.org/multipage/parsing.html#scripting-flag). If set
+ * to `true`, `noscript` element content will be parsed as text.
+ *
+ * @default `true`
+ */
+ scriptingEnabled?: boolean;
+ /**
+ * Enables source code location information. When enabled, each node (except the root node)
+ * will have a `sourceCodeLocation` property. If the node is not an empty element, `sourceCodeLocation` will
+ * be a {@link ElementLocation} object, otherwise it will be {@link Location}.
+ * If the element was implicitly created by the parser (as part of
+ * [tree correction](https://html.spec.whatwg.org/multipage/syntax.html#an-introduction-to-error-handling-and-strange-cases-in-the-parser)),
+ * its `sourceCodeLocation` property will be `undefined`.
+ *
+ * @default `false`
+ */
+ sourceCodeLocationInfo?: boolean;
+ /**
+ * Specifies the resulting tree format.
+ *
+ * @default `treeAdapters.default`
+ */
+ treeAdapter?: TreeAdapter;
+ /**
+ * Callback for parse errors.
+ *
+ * @default `null`
+ */
+ onParseError?: ParserErrorHandler | null;
+}
+export declare class Parser implements TokenHandler, StackHandler {
+ fragmentContext: T['element'] | null;
+ scriptHandler: null | ((pendingScript: T['element']) => void);
+ treeAdapter: TreeAdapter;
+ onParseError: ParserErrorHandler | null;
+ private currentToken;
+ options: Required>;
+ document: T['document'];
+ constructor(options?: ParserOptions, document?: T['document'], fragmentContext?: T['element'] | null, scriptHandler?: null | ((pendingScript: T['element']) => void));
+ static parse(html: string, options?: ParserOptions): T['document'];
+ static getFragmentParser(fragmentContext?: T['parentNode'] | null, options?: ParserOptions): Parser;
+ getFragment(): T['documentFragment'];
+ tokenizer: Tokenizer;
+ stopped: boolean;
+ insertionMode: InsertionMode;
+ originalInsertionMode: InsertionMode;
+ fragmentContextID: $;
+ headElement: null | T['element'];
+ formElement: null | T['element'];
+ openElements: OpenElementStack;
+ activeFormattingElements: FormattingElementList;
+ /** Indicates that the current node is not an element in the HTML namespace */
+ private currentNotInHTML;
+ /**
+ * The template insertion mode stack is maintained from the left.
+ * Ie. the topmost element will always have index 0.
+ */
+ tmplInsertionModeStack: InsertionMode[];
+ pendingCharacterTokens: CharacterToken[];
+ hasNonWhitespacePendingCharacterToken: boolean;
+ framesetOk: boolean;
+ skipNextNewLine: boolean;
+ fosterParentingEnabled: boolean;
+ _err(token: Token, code: ERR, beforeToken?: boolean): void;
+ onItemPush(node: T['parentNode'], tid: number, isTop: boolean): void;
+ onItemPop(node: T['parentNode'], isTop: boolean): void;
+ private _setContextModes;
+ _switchToTextParsing(currentToken: TagToken, nextTokenizerState: typeof TokenizerMode[keyof typeof TokenizerMode]): void;
+ switchToPlaintextParsing(): void;
+ _getAdjustedCurrentElement(): T['element'];
+ _findFormInFragmentContext(): void;
+ private _initTokenizerForFragmentParsing;
+ _setDocumentType(token: DoctypeToken): void;
+ _attachElementToTree(element: T['element'], location: LocationWithAttributes | null): void;
+ _appendElement(token: TagToken, namespaceURI: NS): void;
+ _insertElement(token: TagToken, namespaceURI: NS): void;
+ _insertFakeElement(tagName: string, tagID: $): void;
+ _insertTemplate(token: TagToken): void;
+ _insertFakeRootElement(): void;
+ _appendCommentNode(token: CommentToken, parent: T['parentNode']): void;
+ _insertCharacters(token: CharacterToken): void;
+ _adoptNodes(donor: T['parentNode'], recipient: T['parentNode']): void;
+ _setEndLocation(element: T['element'], closingToken: Token): void;
+ private shouldProcessStartTagTokenInForeignContent;
+ _processToken(token: Token): void;
+ _isIntegrationPoint(tid: $, element: T['element'], foreignNS?: NS): boolean;
+ _reconstructActiveFormattingElements(): void;
+ _closeTableCell(): void;
+ _closePElement(): void;
+ _resetInsertionMode(): void;
+ _resetInsertionModeForSelect(selectIdx: number): void;
+ _isElementCausesFosterParenting(tn: $): boolean;
+ _shouldFosterParentOnInsertion(): boolean;
+ _findFosterParentingLocation(): {
+ parent: T['parentNode'];
+ beforeElement: T['element'] | null;
+ };
+ _fosterParentElement(element: T['element']): void;
+ _isSpecialElement(element: T['element'], id: $): boolean;
+ onCharacter(token: CharacterToken): void;
+ onNullCharacter(token: CharacterToken): void;
+ onComment(token: CommentToken): void;
+ onDoctype(token: DoctypeToken): void;
+ onStartTag(token: TagToken): void;
+ /**
+ * Processes a given start tag.
+ *
+ * `onStartTag` checks if a self-closing tag was recognized. When a token
+ * is moved inbetween multiple insertion modes, this check for self-closing
+ * could lead to false positives. To avoid this, `_processStartTag` is used
+ * for nested calls.
+ *
+ * @param token The token to process.
+ */
+ _processStartTag(token: TagToken): void;
+ _startTagOutsideForeignContent(token: TagToken): void;
+ onEndTag(token: TagToken): void;
+ _endTagOutsideForeignContent(token: TagToken): void;
+ onEof(token: EOFToken): void;
+ onWhitespaceCharacter(token: CharacterToken): void;
+}
+export {};
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/index.d.ts.map b/packages/parse5/lib/parser/index.d.ts.map
new file mode 100644
index 0000000..13f6736
--- /dev/null
+++ b/packages/parse5/lib/parser/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/parser/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/index.js b/packages/parse5/lib/parser/index.js
index 8760b44..3feb635 100644
--- a/packages/parse5/lib/parser/index.js
+++ b/packages/parse5/lib/parser/index.js
@@ -1,3034 +1,3059 @@
-'use strict';
-
-const Tokenizer = require('../tokenizer');
-const OpenElementStack = require('./open-element-stack');
-const FormattingElementList = require('./formatting-element-list');
-const LocationInfoParserMixin = require('../extensions/location-info/parser-mixin');
-const ErrorReportingParserMixin = require('../extensions/error-reporting/parser-mixin');
-const Mixin = require('../utils/mixin');
-const defaultTreeAdapter = require('../tree-adapters/default');
-const mergeOptions = require('../utils/merge-options');
-const doctype = require('../common/doctype');
-const foreignContent = require('../common/foreign-content');
-const ERR = require('../common/error-codes');
-const unicode = require('../common/unicode');
-const HTML = require('../common/html');
-
-//Aliases
-const $ = HTML.TAG_NAMES;
-const NS = HTML.NAMESPACES;
-const ATTRS = HTML.ATTRS;
-
-const DEFAULT_OPTIONS = {
- scriptingEnabled: true,
- sourceCodeLocationInfo: false,
- onParseError: null,
- treeAdapter: defaultTreeAdapter
-};
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Parser = void 0;
+const index_js_1 = require("../tokenizer/index.js");
+const open_element_stack_js_1 = require("./open-element-stack.js");
+const formatting_element_list_js_1 = require("./formatting-element-list.js");
+const default_js_1 = require("../tree-adapters/default.js");
+const doctype = require("../common/doctype.js");
+const foreignContent = require("../common/foreign-content.js");
+const error_codes_js_1 = require("../common/error-codes.js");
+const unicode = require("../common/unicode.js");
+const html_js_1 = require("../common/html.js");
+const token_js_1 = require("../common/token.js");
//Misc constants
const HIDDEN_INPUT_TYPE = 'hidden';
-
//Adoption agency loops iteration count
const AA_OUTER_LOOP_ITER = 8;
const AA_INNER_LOOP_ITER = 3;
-
//Insertion modes
-const INITIAL_MODE = 'INITIAL_MODE';
-const BEFORE_HTML_MODE = 'BEFORE_HTML_MODE';
-const BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE';
-const IN_HEAD_MODE = 'IN_HEAD_MODE';
-const IN_HEAD_NO_SCRIPT_MODE = 'IN_HEAD_NO_SCRIPT_MODE';
-const AFTER_HEAD_MODE = 'AFTER_HEAD_MODE';
-const IN_BODY_MODE = 'IN_BODY_MODE';
-const TEXT_MODE = 'TEXT_MODE';
-const IN_TABLE_MODE = 'IN_TABLE_MODE';
-const IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE';
-const IN_CAPTION_MODE = 'IN_CAPTION_MODE';
-const IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE';
-const IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE';
-const IN_ROW_MODE = 'IN_ROW_MODE';
-const IN_CELL_MODE = 'IN_CELL_MODE';
-const IN_SELECT_MODE = 'IN_SELECT_MODE';
-const IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE';
-const IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE';
-const AFTER_BODY_MODE = 'AFTER_BODY_MODE';
-const IN_FRAMESET_MODE = 'IN_FRAMESET_MODE';
-const AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE';
-const AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE';
-const AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE';
-
-//Insertion mode reset map
-const INSERTION_MODE_RESET_MAP = {
- [$.TR]: IN_ROW_MODE,
- [$.TBODY]: IN_TABLE_BODY_MODE,
- [$.THEAD]: IN_TABLE_BODY_MODE,
- [$.TFOOT]: IN_TABLE_BODY_MODE,
- [$.CAPTION]: IN_CAPTION_MODE,
- [$.COLGROUP]: IN_COLUMN_GROUP_MODE,
- [$.TABLE]: IN_TABLE_MODE,
- [$.BODY]: IN_BODY_MODE,
- [$.FRAMESET]: IN_FRAMESET_MODE
-};
-
-//Template insertion mode switch map
-const TEMPLATE_INSERTION_MODE_SWITCH_MAP = {
- [$.CAPTION]: IN_TABLE_MODE,
- [$.COLGROUP]: IN_TABLE_MODE,
- [$.TBODY]: IN_TABLE_MODE,
- [$.TFOOT]: IN_TABLE_MODE,
- [$.THEAD]: IN_TABLE_MODE,
- [$.COL]: IN_COLUMN_GROUP_MODE,
- [$.TR]: IN_TABLE_BODY_MODE,
- [$.TD]: IN_ROW_MODE,
- [$.TH]: IN_ROW_MODE
+var InsertionMode;
+(function (InsertionMode) {
+ InsertionMode[InsertionMode["INITIAL"] = 0] = "INITIAL";
+ InsertionMode[InsertionMode["BEFORE_HTML"] = 1] = "BEFORE_HTML";
+ InsertionMode[InsertionMode["BEFORE_HEAD"] = 2] = "BEFORE_HEAD";
+ InsertionMode[InsertionMode["IN_HEAD"] = 3] = "IN_HEAD";
+ InsertionMode[InsertionMode["IN_HEAD_NO_SCRIPT"] = 4] = "IN_HEAD_NO_SCRIPT";
+ InsertionMode[InsertionMode["AFTER_HEAD"] = 5] = "AFTER_HEAD";
+ InsertionMode[InsertionMode["IN_BODY"] = 6] = "IN_BODY";
+ InsertionMode[InsertionMode["TEXT"] = 7] = "TEXT";
+ InsertionMode[InsertionMode["IN_TABLE"] = 8] = "IN_TABLE";
+ InsertionMode[InsertionMode["IN_TABLE_TEXT"] = 9] = "IN_TABLE_TEXT";
+ InsertionMode[InsertionMode["IN_CAPTION"] = 10] = "IN_CAPTION";
+ InsertionMode[InsertionMode["IN_COLUMN_GROUP"] = 11] = "IN_COLUMN_GROUP";
+ InsertionMode[InsertionMode["IN_TABLE_BODY"] = 12] = "IN_TABLE_BODY";
+ InsertionMode[InsertionMode["IN_ROW"] = 13] = "IN_ROW";
+ InsertionMode[InsertionMode["IN_CELL"] = 14] = "IN_CELL";
+ InsertionMode[InsertionMode["IN_SELECT"] = 15] = "IN_SELECT";
+ InsertionMode[InsertionMode["IN_SELECT_IN_TABLE"] = 16] = "IN_SELECT_IN_TABLE";
+ InsertionMode[InsertionMode["IN_TEMPLATE"] = 17] = "IN_TEMPLATE";
+ InsertionMode[InsertionMode["AFTER_BODY"] = 18] = "AFTER_BODY";
+ InsertionMode[InsertionMode["IN_FRAMESET"] = 19] = "IN_FRAMESET";
+ InsertionMode[InsertionMode["AFTER_FRAMESET"] = 20] = "AFTER_FRAMESET";
+ InsertionMode[InsertionMode["AFTER_AFTER_BODY"] = 21] = "AFTER_AFTER_BODY";
+ InsertionMode[InsertionMode["AFTER_AFTER_FRAMESET"] = 22] = "AFTER_AFTER_FRAMESET";
+})(InsertionMode || (InsertionMode = {}));
+const BASE_LOC = {
+ startLine: -1,
+ startCol: -1,
+ startOffset: -1,
+ endLine: -1,
+ endCol: -1,
+ endOffset: -1,
};
-
-//Token handlers map for insertion modes
-const TOKEN_HANDLERS = {
- [INITIAL_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: tokenInInitialMode,
- [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInInitialMode,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: doctypeInInitialMode,
- [Tokenizer.START_TAG_TOKEN]: tokenInInitialMode,
- [Tokenizer.END_TAG_TOKEN]: tokenInInitialMode,
- [Tokenizer.EOF_TOKEN]: tokenInInitialMode
- },
- [BEFORE_HTML_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: tokenBeforeHtml,
- [Tokenizer.NULL_CHARACTER_TOKEN]: tokenBeforeHtml,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagBeforeHtml,
- [Tokenizer.END_TAG_TOKEN]: endTagBeforeHtml,
- [Tokenizer.EOF_TOKEN]: tokenBeforeHtml
- },
- [BEFORE_HEAD_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: tokenBeforeHead,
- [Tokenizer.NULL_CHARACTER_TOKEN]: tokenBeforeHead,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype,
- [Tokenizer.START_TAG_TOKEN]: startTagBeforeHead,
- [Tokenizer.END_TAG_TOKEN]: endTagBeforeHead,
- [Tokenizer.EOF_TOKEN]: tokenBeforeHead
- },
- [IN_HEAD_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: tokenInHead,
- [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInHead,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype,
- [Tokenizer.START_TAG_TOKEN]: startTagInHead,
- [Tokenizer.END_TAG_TOKEN]: endTagInHead,
- [Tokenizer.EOF_TOKEN]: tokenInHead
- },
- [IN_HEAD_NO_SCRIPT_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: tokenInHeadNoScript,
- [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInHeadNoScript,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype,
- [Tokenizer.START_TAG_TOKEN]: startTagInHeadNoScript,
- [Tokenizer.END_TAG_TOKEN]: endTagInHeadNoScript,
- [Tokenizer.EOF_TOKEN]: tokenInHeadNoScript
- },
- [AFTER_HEAD_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: tokenAfterHead,
- [Tokenizer.NULL_CHARACTER_TOKEN]: tokenAfterHead,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype,
- [Tokenizer.START_TAG_TOKEN]: startTagAfterHead,
- [Tokenizer.END_TAG_TOKEN]: endTagAfterHead,
- [Tokenizer.EOF_TOKEN]: tokenAfterHead
- },
- [IN_BODY_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: characterInBody,
- [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInBody,
- [Tokenizer.END_TAG_TOKEN]: endTagInBody,
- [Tokenizer.EOF_TOKEN]: eofInBody
- },
- [TEXT_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.NULL_CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.COMMENT_TOKEN]: ignoreToken,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: ignoreToken,
- [Tokenizer.END_TAG_TOKEN]: endTagInText,
- [Tokenizer.EOF_TOKEN]: eofInText
- },
- [IN_TABLE_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: characterInTable,
- [Tokenizer.NULL_CHARACTER_TOKEN]: characterInTable,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: characterInTable,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInTable,
- [Tokenizer.END_TAG_TOKEN]: endTagInTable,
- [Tokenizer.EOF_TOKEN]: eofInBody
- },
- [IN_TABLE_TEXT_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: characterInTableText,
- [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInTableText,
- [Tokenizer.COMMENT_TOKEN]: tokenInTableText,
- [Tokenizer.DOCTYPE_TOKEN]: tokenInTableText,
- [Tokenizer.START_TAG_TOKEN]: tokenInTableText,
- [Tokenizer.END_TAG_TOKEN]: tokenInTableText,
- [Tokenizer.EOF_TOKEN]: tokenInTableText
- },
- [IN_CAPTION_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: characterInBody,
- [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInCaption,
- [Tokenizer.END_TAG_TOKEN]: endTagInCaption,
- [Tokenizer.EOF_TOKEN]: eofInBody
- },
- [IN_COLUMN_GROUP_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: tokenInColumnGroup,
- [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInColumnGroup,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInColumnGroup,
- [Tokenizer.END_TAG_TOKEN]: endTagInColumnGroup,
- [Tokenizer.EOF_TOKEN]: eofInBody
- },
- [IN_TABLE_BODY_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: characterInTable,
- [Tokenizer.NULL_CHARACTER_TOKEN]: characterInTable,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: characterInTable,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInTableBody,
- [Tokenizer.END_TAG_TOKEN]: endTagInTableBody,
- [Tokenizer.EOF_TOKEN]: eofInBody
- },
- [IN_ROW_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: characterInTable,
- [Tokenizer.NULL_CHARACTER_TOKEN]: characterInTable,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: characterInTable,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInRow,
- [Tokenizer.END_TAG_TOKEN]: endTagInRow,
- [Tokenizer.EOF_TOKEN]: eofInBody
- },
- [IN_CELL_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: characterInBody,
- [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInCell,
- [Tokenizer.END_TAG_TOKEN]: endTagInCell,
- [Tokenizer.EOF_TOKEN]: eofInBody
- },
- [IN_SELECT_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInSelect,
- [Tokenizer.END_TAG_TOKEN]: endTagInSelect,
- [Tokenizer.EOF_TOKEN]: eofInBody
- },
- [IN_SELECT_IN_TABLE_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInSelectInTable,
- [Tokenizer.END_TAG_TOKEN]: endTagInSelectInTable,
- [Tokenizer.EOF_TOKEN]: eofInBody
- },
- [IN_TEMPLATE_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: characterInBody,
- [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInTemplate,
- [Tokenizer.END_TAG_TOKEN]: endTagInTemplate,
- [Tokenizer.EOF_TOKEN]: eofInTemplate
- },
- [AFTER_BODY_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: tokenAfterBody,
- [Tokenizer.NULL_CHARACTER_TOKEN]: tokenAfterBody,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody,
- [Tokenizer.COMMENT_TOKEN]: appendCommentToRootHtmlElement,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagAfterBody,
- [Tokenizer.END_TAG_TOKEN]: endTagAfterBody,
- [Tokenizer.EOF_TOKEN]: stopParsing
- },
- [IN_FRAMESET_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagInFrameset,
- [Tokenizer.END_TAG_TOKEN]: endTagInFrameset,
- [Tokenizer.EOF_TOKEN]: stopParsing
- },
- [AFTER_FRAMESET_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters,
- [Tokenizer.COMMENT_TOKEN]: appendComment,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagAfterFrameset,
- [Tokenizer.END_TAG_TOKEN]: endTagAfterFrameset,
- [Tokenizer.EOF_TOKEN]: stopParsing
- },
- [AFTER_AFTER_BODY_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: tokenAfterAfterBody,
- [Tokenizer.NULL_CHARACTER_TOKEN]: tokenAfterAfterBody,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody,
- [Tokenizer.COMMENT_TOKEN]: appendCommentToDocument,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagAfterAfterBody,
- [Tokenizer.END_TAG_TOKEN]: tokenAfterAfterBody,
- [Tokenizer.EOF_TOKEN]: stopParsing
- },
- [AFTER_AFTER_FRAMESET_MODE]: {
- [Tokenizer.CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken,
- [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody,
- [Tokenizer.COMMENT_TOKEN]: appendCommentToDocument,
- [Tokenizer.DOCTYPE_TOKEN]: ignoreToken,
- [Tokenizer.START_TAG_TOKEN]: startTagAfterAfterFrameset,
- [Tokenizer.END_TAG_TOKEN]: ignoreToken,
- [Tokenizer.EOF_TOKEN]: stopParsing
- }
+const TABLE_STRUCTURE_TAGS = new Set([html_js_1.TAG_ID.TABLE, html_js_1.TAG_ID.TBODY, html_js_1.TAG_ID.TFOOT, html_js_1.TAG_ID.THEAD, html_js_1.TAG_ID.TR]);
+const defaultParserOptions = {
+ scriptingEnabled: true,
+ sourceCodeLocationInfo: false,
+ treeAdapter: default_js_1.defaultTreeAdapter,
+ onParseError: null,
};
-
//Parser
class Parser {
- constructor(options) {
- this.options = mergeOptions(DEFAULT_OPTIONS, options);
-
- this.treeAdapter = this.options.treeAdapter;
- this.pendingScript = null;
- this.nodeInfo = {};
-
- if(this.options.componentValidator){
- this.validator = this.options.componentValidator;
- }
-
- if(this.options.compileResult){
- this.compileResult = this.options.compileResult;
- }
-
- if (this.options.sourceCodeLocationInfo) {
- Mixin.install(this, LocationInfoParserMixin);
- }
-
- if (this.options.onParseError) {
- Mixin.install(this, ErrorReportingParserMixin, { onParseError: this.options.onParseError });
- }
- }
-
- // API
- parse(html) {
- const document = this.treeAdapter.createDocument();
-
- this._bootstrap(document, null);
- this.tokenizer.write(html, true);
- this._runParsingLoop(null);
-
- return document;
- }
-
- parseFragment(html, fragmentContext) {
- //NOTE: use element as a fragment context if context element was not provided,
- //so we will parse in "forgiving" manner
- if (!fragmentContext) {
- fragmentContext = this.treeAdapter.createElement($.TEMPLATE, NS.HTML, []);
- }
-
- //NOTE: create fake element which will be used as 'document' for fragment parsing.
- //This is important for jsdom there 'document' can't be recreated, therefore
- //fragment parsing causes messing of the main `document`.
- const documentMock = this.treeAdapter.createElement('documentmock', NS.HTML, []);
-
- this._bootstrap(documentMock, fragmentContext);
-
- if (this.treeAdapter.getTagName(fragmentContext) === $.TEMPLATE) {
- this._pushTmplInsertionMode(IN_TEMPLATE_MODE);
- }
-
- this._initTokenizerForFragmentParsing();
- this._insertFakeRootElement();
- this._resetInsertionMode();
- this._findFormInFragmentContext();
- this.tokenizer.write(html, true);
- this._runParsingLoop(null);
-
- const rootElement = this.treeAdapter.getFirstChild(documentMock);
- const fragment = this.treeAdapter.createDocumentFragment();
-
- this._adoptNodes(rootElement, fragment);
-
- return fragment;
- }
-
- //Bootstrap parser
- _bootstrap(document, fragmentContext) {
- this.tokenizer = new Tokenizer(this.options);
-
- this.stopped = false;
-
- this.insertionMode = INITIAL_MODE;
- this.originalInsertionMode = '';
-
- this.document = document;
+ constructor(options, document, fragmentContext = null, scriptHandler = null) {
this.fragmentContext = fragmentContext;
-
+ this.scriptHandler = scriptHandler;
+ this.currentToken = null;
+ this.stopped = false;
+ this.insertionMode = InsertionMode.INITIAL;
+ this.originalInsertionMode = InsertionMode.INITIAL;
this.headElement = null;
this.formElement = null;
-
- this.openElements = new OpenElementStack(this.document, this.treeAdapter);
- this.activeFormattingElements = new FormattingElementList(this.treeAdapter);
-
+ /** Indicates that the current node is not an element in the HTML namespace */
+ this.currentNotInHTML = false;
+ /**
+ * The template insertion mode stack is maintained from the left.
+ * Ie. the topmost element will always have index 0.
+ */
this.tmplInsertionModeStack = [];
- this.tmplInsertionModeStackTop = -1;
- this.currentTmplInsertionMode = null;
-
this.pendingCharacterTokens = [];
this.hasNonWhitespacePendingCharacterToken = false;
-
this.framesetOk = true;
this.skipNextNewLine = false;
this.fosterParentingEnabled = false;
+ this.options = Object.assign(Object.assign({}, defaultParserOptions), options);
+ this.treeAdapter = this.options.treeAdapter;
+ this.onParseError = this.options.onParseError;
+ // Always enable location info if we report parse errors.
+ if (this.onParseError) {
+ this.options.sourceCodeLocationInfo = true;
+ }
+ this.document = document !== null && document !== void 0 ? document : this.treeAdapter.createDocument();
+ this.tokenizer = new index_js_1.Tokenizer(this.options, this);
+ this.activeFormattingElements = new formatting_element_list_js_1.FormattingElementList(this.treeAdapter);
+ this.fragmentContextID = fragmentContext ? (0, html_js_1.getTagID)(this.treeAdapter.getTagName(fragmentContext)) : html_js_1.TAG_ID.UNKNOWN;
+ this._setContextModes(fragmentContext !== null && fragmentContext !== void 0 ? fragmentContext : this.document, this.fragmentContextID);
+ this.openElements = new open_element_stack_js_1.OpenElementStack(this.document, this.treeAdapter, this);
+ }
+ // API
+ static parse(html, options) {
+ const parser = new this(options);
+ parser.tokenizer.write(html, true);
+ return parser.document;
+ }
+ static getFragmentParser(fragmentContext, options) {
+ const opts = Object.assign(Object.assign({}, defaultParserOptions), options);
+ //NOTE: use a element as the fragment context if no context element was provided,
+ //so we will parse in a "forgiving" manner
+ fragmentContext !== null && fragmentContext !== void 0 ? fragmentContext : (fragmentContext = opts.treeAdapter.createElement(html_js_1.TAG_NAMES.TEMPLATE, html_js_1.NS.HTML, []));
+ //NOTE: create a fake element which will be used as the `document` for fragment parsing.
+ //This is important for jsdom, where a new `document` cannot be created. This led to
+ //fragment parsing messing with the main `document`.
+ const documentMock = opts.treeAdapter.createElement('documentmock', html_js_1.NS.HTML, []);
+ const parser = new this(opts, documentMock, fragmentContext);
+ if (parser.fragmentContextID === html_js_1.TAG_ID.TEMPLATE) {
+ parser.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE);
+ }
+ parser._initTokenizerForFragmentParsing();
+ parser._insertFakeRootElement();
+ parser._resetInsertionMode();
+ parser._findFormInFragmentContext();
+ return parser;
+ }
+ parseFragment(html, fragmentContext, options = {}) {
+ if (typeof fragmentContext === 'string') {
+ options = html;
+ html = fragmentContext;
+ fragmentContext = null;
+ }
+ const parser = index_js_1.Parser.getFragmentParser(fragmentContext, options);
+ parser.tokenizer.write(html, true);
+ return parser.getFragment();
+ }
+ getFragment() {
+ const rootElement = this.treeAdapter.getFirstChild(this.document);
+ const fragment = this.treeAdapter.createDocumentFragment();
+ this._adoptNodes(rootElement, fragment);
+ return fragment;
}
-
//Errors
- _err() {
- // NOTE: err reporting is noop by default. Enabled by mixin.
- }
-
- //Parsing loop
- _runParsingLoop(scriptHandler) {
- let lastToken = {};
- while (!this.stopped) {
- this._setupTokenizerCDATAMode();
-
- const token = this.tokenizer.getNextToken();
-
- if (token.type === Tokenizer.HIBERNATION_TOKEN) {
- break;
- }
- if (token.type !== Tokenizer.EOF_TOKEN && token.type !== Tokenizer.WHITESPACE_CHARACTER_TOKEN) {
- lastToken =token;
- }
- checkselfClosingNode(this, token);
- if (this.skipNextNewLine) {
- this.skipNextNewLine = false;
-
- if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') {
- if (token.chars.length === 1) {
- continue;
- }
-
- token.chars = token.chars.substr(1);
- }
+ _err(token, code, beforeToken) {
+ var _a;
+ if (!this.onParseError)
+ return;
+ const loc = (_a = token.location) !== null && _a !== void 0 ? _a : BASE_LOC;
+ const err = {
+ code,
+ startLine: loc.startLine,
+ startCol: loc.startCol,
+ startOffset: loc.startOffset,
+ endLine: beforeToken ? loc.startLine : loc.endLine,
+ endCol: beforeToken ? loc.startCol : loc.endCol,
+ endOffset: beforeToken ? loc.startOffset : loc.endOffset,
+ };
+ this.onParseError(err);
+ }
+ //Stack events
+ onItemPush(node, tid, isTop) {
+ var _a, _b;
+ (_b = (_a = this.treeAdapter).onItemPush) === null || _b === void 0 ? void 0 : _b.call(_a, node);
+ if (isTop && this.openElements.stackTop > 0)
+ this._setContextModes(node, tid);
+ }
+ onItemPop(node, isTop) {
+ var _a, _b;
+ if (this.options.sourceCodeLocationInfo) {
+ this._setEndLocation(node, this.currentToken);
+ }
+ (_b = (_a = this.treeAdapter).onItemPop) === null || _b === void 0 ? void 0 : _b.call(_a, node, this.openElements.current);
+ if (isTop) {
+ let current;
+ let currentTagId;
+ if (this.openElements.stackTop === 0 && this.fragmentContext) {
+ current = this.fragmentContext;
+ currentTagId = this.fragmentContextID;
}
-
- this._processInputToken(token);
-
- if (scriptHandler && this.pendingScript) {
- break;
+ else {
+ ({ current, currentTagId } = this.openElements);
}
- }
- checkInvalid(this, lastToken);
- }
-
- runParsingLoopForCurrentChunk(writeCallback, scriptHandler) {
- this._runParsingLoop(scriptHandler);
-
- if (scriptHandler && this.pendingScript) {
- const script = this.pendingScript;
-
- this.pendingScript = null;
-
- scriptHandler(script);
-
- return;
- }
-
- if (writeCallback) {
- writeCallback();
+ this._setContextModes(current, currentTagId);
}
}
-
- //Text parsing
- _setupTokenizerCDATAMode() {
- const current = this._getAdjustedCurrentElement();
-
- this.tokenizer.allowCDATA =
- current &&
- current !== this.document &&
- this.treeAdapter.getNamespaceURI(current) !== NS.HTML &&
- !this._isIntegrationPoint(current);
+ _setContextModes(current, tid) {
+ const isHTML = current === this.document || this.treeAdapter.getNamespaceURI(current) === html_js_1.NS.HTML;
+ this.currentNotInHTML = !isHTML;
+ this.tokenizer.inForeignNode = !isHTML && !this._isIntegrationPoint(tid, current);
}
-
_switchToTextParsing(currentToken, nextTokenizerState) {
- this._insertElement(currentToken, NS.HTML);
+ this._insertElement(currentToken, html_js_1.NS.HTML);
this.tokenizer.state = nextTokenizerState;
this.originalInsertionMode = this.insertionMode;
- this.insertionMode = TEXT_MODE;
+ this.insertionMode = InsertionMode.TEXT;
}
-
switchToPlaintextParsing() {
- this.insertionMode = TEXT_MODE;
- this.originalInsertionMode = IN_BODY_MODE;
- this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
+ this.insertionMode = InsertionMode.TEXT;
+ this.originalInsertionMode = InsertionMode.IN_BODY;
+ this.tokenizer.state = index_js_1.TokenizerMode.PLAINTEXT;
}
-
//Fragment parsing
_getAdjustedCurrentElement() {
return this.openElements.stackTop === 0 && this.fragmentContext
? this.fragmentContext
: this.openElements.current;
}
-
_findFormInFragmentContext() {
let node = this.fragmentContext;
-
- do {
- if (this.treeAdapter.getTagName(node) === $.FORM) {
+ while (node) {
+ if (this.treeAdapter.getTagName(node) === html_js_1.TAG_NAMES.FORM) {
this.formElement = node;
break;
}
-
node = this.treeAdapter.getParentNode(node);
- } while (node);
+ }
}
-
_initTokenizerForFragmentParsing() {
- if (this.treeAdapter.getNamespaceURI(this.fragmentContext) === NS.HTML) {
- const tn = this.treeAdapter.getTagName(this.fragmentContext);
-
- if (tn === $.TITLE || tn === $.TEXTAREA) {
- this.tokenizer.state = Tokenizer.MODE.RCDATA;
- } else if (
- tn === $.STYLE ||
- tn === $.XMP ||
- tn === $.IFRAME ||
- tn === $.NOEMBED ||
- tn === $.NOFRAMES ||
- tn === $.NOSCRIPT
- ) {
- this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
- } else if (tn === $.SCRIPT) {
- this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
- } else if (tn === $.PLAINTEXT) {
- this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
+ if (!this.fragmentContext || this.treeAdapter.getNamespaceURI(this.fragmentContext) !== html_js_1.NS.HTML) {
+ return;
+ }
+ switch (this.fragmentContextID) {
+ case html_js_1.TAG_ID.TITLE:
+ case html_js_1.TAG_ID.TEXTAREA: {
+ this.tokenizer.state = index_js_1.TokenizerMode.RCDATA;
+ break;
+ }
+ case html_js_1.TAG_ID.STYLE:
+ case html_js_1.TAG_ID.XMP:
+ case html_js_1.TAG_ID.IFRAME:
+ case html_js_1.TAG_ID.NOEMBED:
+ case html_js_1.TAG_ID.NOFRAMES:
+ case html_js_1.TAG_ID.NOSCRIPT: {
+ this.tokenizer.state = index_js_1.TokenizerMode.RAWTEXT;
+ break;
+ }
+ case html_js_1.TAG_ID.SCRIPT: {
+ this.tokenizer.state = index_js_1.TokenizerMode.SCRIPT_DATA;
+ break;
+ }
+ case html_js_1.TAG_ID.PLAINTEXT: {
+ this.tokenizer.state = index_js_1.TokenizerMode.PLAINTEXT;
+ break;
}
+ default:
+ // Do nothing
}
}
-
//Tree mutation
_setDocumentType(token) {
const name = token.name || '';
const publicId = token.publicId || '';
const systemId = token.systemId || '';
-
this.treeAdapter.setDocumentType(this.document, name, publicId, systemId);
+ if (token.location) {
+ const documentChildren = this.treeAdapter.getChildNodes(this.document);
+ const docTypeNode = documentChildren.find((node) => this.treeAdapter.isDocumentTypeNode(node));
+ if (docTypeNode) {
+ this.treeAdapter.setNodeSourceCodeLocation(docTypeNode, token.location);
+ }
+ }
}
-
- _attachElementToTree(element) {
+ _attachElementToTree(element, location) {
+ if (this.options.sourceCodeLocationInfo) {
+ const loc = location && Object.assign(Object.assign({}, location), { startTag: location });
+ this.treeAdapter.setNodeSourceCodeLocation(element, loc);
+ }
if (this._shouldFosterParentOnInsertion()) {
this._fosterParentElement(element);
- } else {
- const parent = this.openElements.currentTmplContent || this.openElements.current;
-
+ }
+ else {
+ const parent = this.openElements.currentTmplContentOrNode;
this.treeAdapter.appendChild(parent, element);
}
}
-
_appendElement(token, namespaceURI) {
const element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
-
- this._attachElementToTree(element);
+ this._attachElementToTree(element, token.location);
}
-
_insertElement(token, namespaceURI) {
const element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
-
- this._attachElementToTree(element);
- this.openElements.push(element);
- }
-
- _insertFakeElement(tagName) {
- const element = this.treeAdapter.createElement(tagName, NS.HTML, []);
-
- this._attachElementToTree(element);
- this.openElements.push(element);
- }
-
+ this._attachElementToTree(element, token.location);
+ this.openElements.push(element, token.tagID);
+ }
+ _insertFakeElement(tagName, tagID) {
+ const element = this.treeAdapter.createElement(tagName, html_js_1.NS.HTML, []);
+ this._attachElementToTree(element, null);
+ this.openElements.push(element, tagID);
+ }
_insertTemplate(token) {
- const tmpl = this.treeAdapter.createElement(token.tagName, NS.HTML, token.attrs);
+ const tmpl = this.treeAdapter.createElement(token.tagName, html_js_1.NS.HTML, token.attrs);
const content = this.treeAdapter.createDocumentFragment();
-
this.treeAdapter.setTemplateContent(tmpl, content);
- this._attachElementToTree(tmpl);
- this.openElements.push(tmpl);
+ this._attachElementToTree(tmpl, token.location);
+ this.openElements.push(tmpl, token.tagID);
+ if (this.options.sourceCodeLocationInfo)
+ this.treeAdapter.setNodeSourceCodeLocation(content, null);
}
-
_insertFakeRootElement() {
- const element = this.treeAdapter.createElement($.HTML, NS.HTML, []);
-
+ const element = this.treeAdapter.createElement(html_js_1.TAG_NAMES.HTML, html_js_1.NS.HTML, []);
+ if (this.options.sourceCodeLocationInfo)
+ this.treeAdapter.setNodeSourceCodeLocation(element, null);
this.treeAdapter.appendChild(this.openElements.current, element);
- this.openElements.push(element);
+ this.openElements.push(element, html_js_1.TAG_ID.HTML);
}
-
_appendCommentNode(token, parent) {
const commentNode = this.treeAdapter.createCommentNode(token.data);
-
this.treeAdapter.appendChild(parent, commentNode);
+ if (this.options.sourceCodeLocationInfo) {
+ this.treeAdapter.setNodeSourceCodeLocation(commentNode, token.location);
+ }
}
-
_insertCharacters(token) {
+ let parent;
+ let beforeElement;
if (this._shouldFosterParentOnInsertion()) {
- this._fosterParentText(token.chars);
- } else {
- const parent = this.openElements.currentTmplContent || this.openElements.current;
-
+ ({ parent, beforeElement } = this._findFosterParentingLocation());
+ if (beforeElement) {
+ this.treeAdapter.insertTextBefore(parent, token.chars, beforeElement);
+ }
+ else {
+ this.treeAdapter.insertText(parent, token.chars);
+ }
+ }
+ else {
+ parent = this.openElements.currentTmplContentOrNode;
this.treeAdapter.insertText(parent, token.chars);
}
+ if (!token.location)
+ return;
+ const siblings = this.treeAdapter.getChildNodes(parent);
+ const textNodeIdx = beforeElement ? siblings.lastIndexOf(beforeElement) : siblings.length;
+ const textNode = siblings[textNodeIdx - 1];
+ //NOTE: if we have a location assigned by another token, then just update the end position
+ const tnLoc = this.treeAdapter.getNodeSourceCodeLocation(textNode);
+ if (tnLoc) {
+ const { endLine, endCol, endOffset } = token.location;
+ this.treeAdapter.updateNodeSourceCodeLocation(textNode, { endLine, endCol, endOffset });
+ }
+ else if (this.options.sourceCodeLocationInfo) {
+ this.treeAdapter.setNodeSourceCodeLocation(textNode, token.location);
+ }
}
-
_adoptNodes(donor, recipient) {
for (let child = this.treeAdapter.getFirstChild(donor); child; child = this.treeAdapter.getFirstChild(donor)) {
this.treeAdapter.detachNode(child);
this.treeAdapter.appendChild(recipient, child);
}
}
-
- //Token processing
- _shouldProcessTokenInForeignContent(token) {
- const current = this._getAdjustedCurrentElement();
-
- if (!current || current === this.document) {
- return false;
- }
-
- const ns = this.treeAdapter.getNamespaceURI(current);
-
- if (ns === NS.HTML) {
- return false;
+ _setEndLocation(element, closingToken) {
+ if (this.treeAdapter.getNodeSourceCodeLocation(element) && closingToken.location) {
+ const ctLoc = closingToken.location;
+ const tn = this.treeAdapter.getTagName(element);
+ const endLoc =
+ // NOTE: For cases like
- First 'p' closes without a closing
+ // tag and for cases like | - 'p' closes without a closing tag.
+ closingToken.type === token_js_1.TokenType.END_TAG && tn === closingToken.tagName
+ ? {
+ endTag: Object.assign({}, ctLoc),
+ endLine: ctLoc.endLine,
+ endCol: ctLoc.endCol,
+ endOffset: ctLoc.endOffset,
+ }
+ : {
+ endLine: ctLoc.startLine,
+ endCol: ctLoc.startCol,
+ endOffset: ctLoc.startOffset,
+ };
+ this.treeAdapter.updateNodeSourceCodeLocation(element, endLoc);
}
-
- if (
- this.treeAdapter.getTagName(current) === $.ANNOTATION_XML &&
- ns === NS.MATHML &&
- token.type === Tokenizer.START_TAG_TOKEN &&
- token.tagName === $.SVG
- ) {
+ }
+ //Token processing
+ shouldProcessStartTagTokenInForeignContent(token) {
+ // Check that neither current === document, or ns === NS.HTML
+ if (!this.currentNotInHTML)
return false;
- }
-
- const isCharacterToken =
- token.type === Tokenizer.CHARACTER_TOKEN ||
- token.type === Tokenizer.NULL_CHARACTER_TOKEN ||
- token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN;
-
- const isMathMLTextStartTag =
- token.type === Tokenizer.START_TAG_TOKEN && token.tagName !== $.MGLYPH && token.tagName !== $.MALIGNMARK;
-
- if ((isMathMLTextStartTag || isCharacterToken) && this._isIntegrationPoint(current, NS.MATHML)) {
+ let current;
+ let currentTagId;
+ if (this.openElements.stackTop === 0 && this.fragmentContext) {
+ current = this.fragmentContext;
+ currentTagId = this.fragmentContextID;
+ }
+ else {
+ ({ current, currentTagId } = this.openElements);
+ }
+ if (token.tagID === html_js_1.TAG_ID.SVG &&
+ this.treeAdapter.getTagName(current) === html_js_1.TAG_NAMES.ANNOTATION_XML &&
+ this.treeAdapter.getNamespaceURI(current) === html_js_1.NS.MATHML) {
return false;
}
-
- if (
- (token.type === Tokenizer.START_TAG_TOKEN || isCharacterToken) &&
- this._isIntegrationPoint(current, NS.HTML)
- ) {
- return false;
- }
-
- return token.type !== Tokenizer.EOF_TOKEN;
+ return (
+ // Check that `current` is not an integration point for HTML or MathML elements.
+ this.tokenizer.inForeignNode ||
+ // If it _is_ an integration point, then we might have to check that it is not an HTML
+ // integration point.
+ ((token.tagID === html_js_1.TAG_ID.MGLYPH || token.tagID === html_js_1.TAG_ID.MALIGNMARK) &&
+ !this._isIntegrationPoint(currentTagId, current, html_js_1.NS.HTML)));
}
-
_processToken(token) {
- TOKEN_HANDLERS[this.insertionMode][token.type](this, token);
- }
-
- _processTokenInBodyMode(token) {
- TOKEN_HANDLERS[IN_BODY_MODE][token.type](this, token);
- }
-
- _processTokenInForeignContent(token) {
- if (token.type === Tokenizer.CHARACTER_TOKEN) {
- characterInForeignContent(this, token);
- } else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN) {
- nullCharacterInForeignContent(this, token);
- } else if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN) {
- insertCharacters(this, token);
- } else if (token.type === Tokenizer.COMMENT_TOKEN) {
- appendComment(this, token);
- } else if (token.type === Tokenizer.START_TAG_TOKEN) {
- startTagInForeignContent(this, token);
- } else if (token.type === Tokenizer.END_TAG_TOKEN) {
- endTagInForeignContent(this, token);
- }
- }
-
- _processInputToken(token) {
- if (this._shouldProcessTokenInForeignContent(token)) {
- this._processTokenInForeignContent(token);
- } else {
- this._processToken(token);
- }
-
- if (token.type === Tokenizer.START_TAG_TOKEN && token.selfClosing && !token.ackSelfClosing) {
- this._err(ERR.nonVoidHtmlElementStartTagWithTrailingSolidus);
+ switch (token.type) {
+ case token_js_1.TokenType.CHARACTER: {
+ this.onCharacter(token);
+ break;
+ }
+ case token_js_1.TokenType.NULL_CHARACTER: {
+ this.onNullCharacter(token);
+ break;
+ }
+ case token_js_1.TokenType.COMMENT: {
+ this.onComment(token);
+ break;
+ }
+ case token_js_1.TokenType.DOCTYPE: {
+ this.onDoctype(token);
+ break;
+ }
+ case token_js_1.TokenType.START_TAG: {
+ this._processStartTag(token);
+ break;
+ }
+ case token_js_1.TokenType.END_TAG: {
+ this.onEndTag(token);
+ break;
+ }
+ case token_js_1.TokenType.EOF: {
+ this.onEof(token);
+ break;
+ }
+ case token_js_1.TokenType.WHITESPACE_CHARACTER: {
+ this.onWhitespaceCharacter(token);
+ break;
+ }
}
}
-
//Integration points
- _isIntegrationPoint(element, foreignNS) {
- const tn = this.treeAdapter.getTagName(element);
+ _isIntegrationPoint(tid, element, foreignNS) {
const ns = this.treeAdapter.getNamespaceURI(element);
const attrs = this.treeAdapter.getAttrList(element);
-
- return foreignContent.isIntegrationPoint(tn, ns, attrs, foreignNS);
+ return foreignContent.isIntegrationPoint(tid, ns, attrs, foreignNS);
}
-
//Active formatting elements reconstruction
_reconstructActiveFormattingElements() {
- const listLength = this.activeFormattingElements.length;
-
+ const listLength = this.activeFormattingElements.entries.length;
if (listLength) {
- let unopenIdx = listLength;
- let entry = null;
-
- do {
- unopenIdx--;
- entry = this.activeFormattingElements.entries[unopenIdx];
-
- if (entry.type === FormattingElementList.MARKER_ENTRY || this.openElements.contains(entry.element)) {
- unopenIdx++;
- break;
- }
- } while (unopenIdx > 0);
-
- for (let i = unopenIdx; i < listLength; i++) {
- entry = this.activeFormattingElements.entries[i];
+ const endIndex = this.activeFormattingElements.entries.findIndex((entry) => entry.type === formatting_element_list_js_1.EntryType.Marker || this.openElements.contains(entry.element));
+ const unopenIdx = endIndex < 0 ? listLength - 1 : endIndex - 1;
+ for (let i = unopenIdx; i >= 0; i--) {
+ const entry = this.activeFormattingElements.entries[i];
this._insertElement(entry.token, this.treeAdapter.getNamespaceURI(entry.element));
entry.element = this.openElements.current;
}
}
}
-
//Close elements
_closeTableCell() {
this.openElements.generateImpliedEndTags();
this.openElements.popUntilTableCellPopped();
this.activeFormattingElements.clearToLastMarker();
- this.insertionMode = IN_ROW_MODE;
+ this.insertionMode = InsertionMode.IN_ROW;
}
-
_closePElement() {
- this.openElements.generateImpliedEndTagsWithExclusion($.P);
- this.openElements.popUntilTagNamePopped($.P);
+ this.openElements.generateImpliedEndTagsWithExclusion(html_js_1.TAG_ID.P);
+ this.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.P);
}
-
//Insertion modes
_resetInsertionMode() {
- for (let i = this.openElements.stackTop, last = false; i >= 0; i--) {
- let element = this.openElements.items[i];
-
- if (i === 0) {
- last = true;
-
- if (this.fragmentContext) {
- element = this.fragmentContext;
- }
- }
-
- const tn = this.treeAdapter.getTagName(element);
- const newInsertionMode = INSERTION_MODE_RESET_MAP[tn];
-
- if (newInsertionMode) {
- this.insertionMode = newInsertionMode;
- break;
- } else if (!last && (tn === $.TD || tn === $.TH)) {
- this.insertionMode = IN_CELL_MODE;
- break;
- } else if (!last && tn === $.HEAD) {
- this.insertionMode = IN_HEAD_MODE;
- break;
- } else if (tn === $.SELECT) {
- this._resetInsertionModeForSelect(i);
- break;
- } else if (tn === $.TEMPLATE) {
- this.insertionMode = this.currentTmplInsertionMode;
- break;
- } else if (tn === $.HTML) {
- this.insertionMode = this.headElement ? AFTER_HEAD_MODE : BEFORE_HEAD_MODE;
- break;
- } else if (last) {
- this.insertionMode = IN_BODY_MODE;
- break;
+ for (let i = this.openElements.stackTop; i >= 0; i--) {
+ //Insertion mode reset map
+ switch (i === 0 && this.fragmentContext ? this.fragmentContextID : this.openElements.tagIDs[i]) {
+ case html_js_1.TAG_ID.TR:
+ this.insertionMode = InsertionMode.IN_ROW;
+ return;
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.THEAD:
+ case html_js_1.TAG_ID.TFOOT:
+ this.insertionMode = InsertionMode.IN_TABLE_BODY;
+ return;
+ case html_js_1.TAG_ID.CAPTION:
+ this.insertionMode = InsertionMode.IN_CAPTION;
+ return;
+ case html_js_1.TAG_ID.COLGROUP:
+ this.insertionMode = InsertionMode.IN_COLUMN_GROUP;
+ return;
+ case html_js_1.TAG_ID.TABLE:
+ this.insertionMode = InsertionMode.IN_TABLE;
+ return;
+ case html_js_1.TAG_ID.BODY:
+ this.insertionMode = InsertionMode.IN_BODY;
+ return;
+ case html_js_1.TAG_ID.FRAMESET:
+ this.insertionMode = InsertionMode.IN_FRAMESET;
+ return;
+ case html_js_1.TAG_ID.SELECT:
+ this._resetInsertionModeForSelect(i);
+ return;
+ case html_js_1.TAG_ID.TEMPLATE:
+ this.insertionMode = this.tmplInsertionModeStack[0];
+ return;
+ case html_js_1.TAG_ID.HTML:
+ this.insertionMode = this.headElement ? InsertionMode.AFTER_HEAD : InsertionMode.BEFORE_HEAD;
+ return;
+ case html_js_1.TAG_ID.TD:
+ case html_js_1.TAG_ID.TH:
+ if (i > 0) {
+ this.insertionMode = InsertionMode.IN_CELL;
+ return;
+ }
+ break;
+ case html_js_1.TAG_ID.HEAD:
+ if (i > 0) {
+ this.insertionMode = InsertionMode.IN_HEAD;
+ return;
+ }
+ break;
}
}
+ this.insertionMode = InsertionMode.IN_BODY;
}
-
_resetInsertionModeForSelect(selectIdx) {
if (selectIdx > 0) {
for (let i = selectIdx - 1; i > 0; i--) {
- const ancestor = this.openElements.items[i];
- const tn = this.treeAdapter.getTagName(ancestor);
-
- if (tn === $.TEMPLATE) {
+ const tn = this.openElements.tagIDs[i];
+ if (tn === html_js_1.TAG_ID.TEMPLATE) {
break;
- } else if (tn === $.TABLE) {
- this.insertionMode = IN_SELECT_IN_TABLE_MODE;
+ }
+ else if (tn === html_js_1.TAG_ID.TABLE) {
+ this.insertionMode = InsertionMode.IN_SELECT_IN_TABLE;
return;
}
}
}
-
- this.insertionMode = IN_SELECT_MODE;
+ this.insertionMode = InsertionMode.IN_SELECT;
}
-
- _pushTmplInsertionMode(mode) {
- this.tmplInsertionModeStack.push(mode);
- this.tmplInsertionModeStackTop++;
- this.currentTmplInsertionMode = mode;
- }
-
- _popTmplInsertionMode() {
- this.tmplInsertionModeStack.pop();
- this.tmplInsertionModeStackTop--;
- this.currentTmplInsertionMode = this.tmplInsertionModeStack[this.tmplInsertionModeStackTop];
- }
-
//Foster parenting
- _isElementCausesFosterParenting(element) {
- const tn = this.treeAdapter.getTagName(element);
-
- return tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR;
+ _isElementCausesFosterParenting(tn) {
+ return TABLE_STRUCTURE_TAGS.has(tn);
}
-
_shouldFosterParentOnInsertion() {
- return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.current);
+ return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.currentTagId);
}
-
_findFosterParentingLocation() {
- const location = {
- parent: null,
- beforeElement: null
- };
-
for (let i = this.openElements.stackTop; i >= 0; i--) {
const openElement = this.openElements.items[i];
- const tn = this.treeAdapter.getTagName(openElement);
- const ns = this.treeAdapter.getNamespaceURI(openElement);
-
- if (tn === $.TEMPLATE && ns === NS.HTML) {
- location.parent = this.treeAdapter.getTemplateContent(openElement);
- break;
- } else if (tn === $.TABLE) {
- location.parent = this.treeAdapter.getParentNode(openElement);
-
- if (location.parent) {
- location.beforeElement = openElement;
- } else {
- location.parent = this.openElements.items[i - 1];
+ switch (this.openElements.tagIDs[i]) {
+ case html_js_1.TAG_ID.TEMPLATE:
+ if (this.treeAdapter.getNamespaceURI(openElement) === html_js_1.NS.HTML) {
+ return { parent: this.treeAdapter.getTemplateContent(openElement), beforeElement: null };
+ }
+ break;
+ case html_js_1.TAG_ID.TABLE: {
+ const parent = this.treeAdapter.getParentNode(openElement);
+ if (parent) {
+ return { parent, beforeElement: openElement };
+ }
+ return { parent: this.openElements.items[i - 1], beforeElement: null };
}
-
- break;
+ default:
+ // Do nothing
}
}
-
- if (!location.parent) {
- location.parent = this.openElements.items[0];
- }
-
- return location;
+ return { parent: this.openElements.items[0], beforeElement: null };
}
-
_fosterParentElement(element) {
const location = this._findFosterParentingLocation();
-
if (location.beforeElement) {
this.treeAdapter.insertBefore(location.parent, element, location.beforeElement);
- } else {
+ }
+ else {
this.treeAdapter.appendChild(location.parent, element);
}
- }
-
- _fosterParentText(chars) {
- const location = this._findFosterParentingLocation();
-
- if (location.beforeElement) {
- this.treeAdapter.insertTextBefore(location.parent, chars, location.beforeElement);
- } else {
- this.treeAdapter.insertText(location.parent, chars);
+ }
+ //Special elements
+ _isSpecialElement(element, id) {
+ const ns = this.treeAdapter.getNamespaceURI(element);
+ return html_js_1.SPECIAL_ELEMENTS[ns].has(id);
+ }
+ onCharacter(token) {
+ this.skipNextNewLine = false;
+ if (this.tokenizer.inForeignNode) {
+ characterInForeignContent(this, token);
+ return;
+ }
+ switch (this.insertionMode) {
+ case InsertionMode.INITIAL:
+ tokenInInitialMode(this, token);
+ break;
+ case InsertionMode.BEFORE_HTML:
+ tokenBeforeHtml(this, token);
+ break;
+ case InsertionMode.BEFORE_HEAD:
+ tokenBeforeHead(this, token);
+ break;
+ case InsertionMode.IN_HEAD:
+ tokenInHead(this, token);
+ break;
+ case InsertionMode.IN_HEAD_NO_SCRIPT:
+ tokenInHeadNoScript(this, token);
+ break;
+ case InsertionMode.AFTER_HEAD:
+ tokenAfterHead(this, token);
+ break;
+ case InsertionMode.IN_BODY:
+ case InsertionMode.IN_CAPTION:
+ case InsertionMode.IN_CELL:
+ case InsertionMode.IN_TEMPLATE:
+ characterInBody(this, token);
+ break;
+ case InsertionMode.TEXT:
+ case InsertionMode.IN_SELECT:
+ case InsertionMode.IN_SELECT_IN_TABLE:
+ this._insertCharacters(token);
+ break;
+ case InsertionMode.IN_TABLE:
+ case InsertionMode.IN_TABLE_BODY:
+ case InsertionMode.IN_ROW:
+ characterInTable(this, token);
+ break;
+ case InsertionMode.IN_TABLE_TEXT:
+ characterInTableText(this, token);
+ break;
+ case InsertionMode.IN_COLUMN_GROUP:
+ tokenInColumnGroup(this, token);
+ break;
+ case InsertionMode.AFTER_BODY:
+ tokenAfterBody(this, token);
+ break;
+ case InsertionMode.AFTER_AFTER_BODY:
+ tokenAfterAfterBody(this, token);
+ break;
+ default:
+ // Do nothing
+ }
+ }
+ onNullCharacter(token) {
+ this.skipNextNewLine = false;
+ if (this.tokenizer.inForeignNode) {
+ nullCharacterInForeignContent(this, token);
+ return;
+ }
+ switch (this.insertionMode) {
+ case InsertionMode.INITIAL:
+ tokenInInitialMode(this, token);
+ break;
+ case InsertionMode.BEFORE_HTML:
+ tokenBeforeHtml(this, token);
+ break;
+ case InsertionMode.BEFORE_HEAD:
+ tokenBeforeHead(this, token);
+ break;
+ case InsertionMode.IN_HEAD:
+ tokenInHead(this, token);
+ break;
+ case InsertionMode.IN_HEAD_NO_SCRIPT:
+ tokenInHeadNoScript(this, token);
+ break;
+ case InsertionMode.AFTER_HEAD:
+ tokenAfterHead(this, token);
+ break;
+ case InsertionMode.TEXT:
+ this._insertCharacters(token);
+ break;
+ case InsertionMode.IN_TABLE:
+ case InsertionMode.IN_TABLE_BODY:
+ case InsertionMode.IN_ROW:
+ characterInTable(this, token);
+ break;
+ case InsertionMode.IN_COLUMN_GROUP:
+ tokenInColumnGroup(this, token);
+ break;
+ case InsertionMode.AFTER_BODY:
+ tokenAfterBody(this, token);
+ break;
+ case InsertionMode.AFTER_AFTER_BODY:
+ tokenAfterAfterBody(this, token);
+ break;
+ default:
+ // Do nothing
+ }
+ }
+ onComment(token) {
+ this.skipNextNewLine = false;
+ if (this.currentNotInHTML) {
+ appendComment(this, token);
+ return;
+ }
+ switch (this.insertionMode) {
+ case InsertionMode.INITIAL:
+ case InsertionMode.BEFORE_HTML:
+ case InsertionMode.BEFORE_HEAD:
+ case InsertionMode.IN_HEAD:
+ case InsertionMode.IN_HEAD_NO_SCRIPT:
+ case InsertionMode.AFTER_HEAD:
+ case InsertionMode.IN_BODY:
+ case InsertionMode.IN_TABLE:
+ case InsertionMode.IN_CAPTION:
+ case InsertionMode.IN_COLUMN_GROUP:
+ case InsertionMode.IN_TABLE_BODY:
+ case InsertionMode.IN_ROW:
+ case InsertionMode.IN_CELL:
+ case InsertionMode.IN_SELECT:
+ case InsertionMode.IN_SELECT_IN_TABLE:
+ case InsertionMode.IN_TEMPLATE:
+ case InsertionMode.IN_FRAMESET:
+ case InsertionMode.AFTER_FRAMESET:
+ appendComment(this, token);
+ break;
+ case InsertionMode.IN_TABLE_TEXT:
+ tokenInTableText(this, token);
+ break;
+ case InsertionMode.AFTER_BODY:
+ appendCommentToRootHtmlElement(this, token);
+ break;
+ case InsertionMode.AFTER_AFTER_BODY:
+ case InsertionMode.AFTER_AFTER_FRAMESET:
+ appendCommentToDocument(this, token);
+ break;
+ default:
+ // Do nothing
+ }
+ }
+ onDoctype(token) {
+ this.skipNextNewLine = false;
+ switch (this.insertionMode) {
+ case InsertionMode.INITIAL:
+ doctypeInInitialMode(this, token);
+ break;
+ case InsertionMode.BEFORE_HEAD:
+ case InsertionMode.IN_HEAD:
+ case InsertionMode.IN_HEAD_NO_SCRIPT:
+ case InsertionMode.AFTER_HEAD:
+ this._err(token, error_codes_js_1.ERR.misplacedDoctype);
+ break;
+ case InsertionMode.IN_TABLE_TEXT:
+ tokenInTableText(this, token);
+ break;
+ default:
+ // Do nothing
+ }
+ }
+ onStartTag(token) {
+ this.skipNextNewLine = false;
+ this.currentToken = token;
+ this._processStartTag(token);
+ if (token.selfClosing && !token.ackSelfClosing) {
+ this._err(token, error_codes_js_1.ERR.nonVoidHtmlElementStartTagWithTrailingSolidus);
+ }
+ }
+ /**
+ * Processes a given start tag.
+ *
+ * `onStartTag` checks if a self-closing tag was recognized. When a token
+ * is moved inbetween multiple insertion modes, this check for self-closing
+ * could lead to false positives. To avoid this, `_processStartTag` is used
+ * for nested calls.
+ *
+ * @param token The token to process.
+ */
+ _processStartTag(token) {
+ if (this.shouldProcessStartTagTokenInForeignContent(token)) {
+ startTagInForeignContent(this, token);
+ }
+ else {
+ this._startTagOutsideForeignContent(token);
+ }
+ }
+ _startTagOutsideForeignContent(token) {
+ switch (this.insertionMode) {
+ case InsertionMode.INITIAL:
+ tokenInInitialMode(this, token);
+ break;
+ case InsertionMode.BEFORE_HTML:
+ startTagBeforeHtml(this, token);
+ break;
+ case InsertionMode.BEFORE_HEAD:
+ startTagBeforeHead(this, token);
+ break;
+ case InsertionMode.IN_HEAD:
+ startTagInHead(this, token);
+ break;
+ case InsertionMode.IN_HEAD_NO_SCRIPT:
+ startTagInHeadNoScript(this, token);
+ break;
+ case InsertionMode.AFTER_HEAD:
+ startTagAfterHead(this, token);
+ break;
+ case InsertionMode.IN_BODY:
+ startTagInBody(this, token);
+ break;
+ case InsertionMode.IN_TABLE:
+ startTagInTable(this, token);
+ break;
+ case InsertionMode.IN_TABLE_TEXT:
+ tokenInTableText(this, token);
+ break;
+ case InsertionMode.IN_CAPTION:
+ startTagInCaption(this, token);
+ break;
+ case InsertionMode.IN_COLUMN_GROUP:
+ startTagInColumnGroup(this, token);
+ break;
+ case InsertionMode.IN_TABLE_BODY:
+ startTagInTableBody(this, token);
+ break;
+ case InsertionMode.IN_ROW:
+ startTagInRow(this, token);
+ break;
+ case InsertionMode.IN_CELL:
+ startTagInCell(this, token);
+ break;
+ case InsertionMode.IN_SELECT:
+ startTagInSelect(this, token);
+ break;
+ case InsertionMode.IN_SELECT_IN_TABLE:
+ startTagInSelectInTable(this, token);
+ break;
+ case InsertionMode.IN_TEMPLATE:
+ startTagInTemplate(this, token);
+ break;
+ case InsertionMode.AFTER_BODY:
+ startTagAfterBody(this, token);
+ break;
+ case InsertionMode.IN_FRAMESET:
+ startTagInFrameset(this, token);
+ break;
+ case InsertionMode.AFTER_FRAMESET:
+ startTagAfterFrameset(this, token);
+ break;
+ case InsertionMode.AFTER_AFTER_BODY:
+ startTagAfterAfterBody(this, token);
+ break;
+ case InsertionMode.AFTER_AFTER_FRAMESET:
+ startTagAfterAfterFrameset(this, token);
+ break;
+ default:
+ // Do nothing
+ }
+ }
+ onEndTag(token) {
+ this.skipNextNewLine = false;
+ this.currentToken = token;
+ if (this.currentNotInHTML) {
+ endTagInForeignContent(this, token);
+ }
+ else {
+ this._endTagOutsideForeignContent(token);
+ }
+ }
+ _endTagOutsideForeignContent(token) {
+ switch (this.insertionMode) {
+ case InsertionMode.INITIAL:
+ tokenInInitialMode(this, token);
+ break;
+ case InsertionMode.BEFORE_HTML:
+ endTagBeforeHtml(this, token);
+ break;
+ case InsertionMode.BEFORE_HEAD:
+ endTagBeforeHead(this, token);
+ break;
+ case InsertionMode.IN_HEAD:
+ endTagInHead(this, token);
+ break;
+ case InsertionMode.IN_HEAD_NO_SCRIPT:
+ endTagInHeadNoScript(this, token);
+ break;
+ case InsertionMode.AFTER_HEAD:
+ endTagAfterHead(this, token);
+ break;
+ case InsertionMode.IN_BODY:
+ endTagInBody(this, token);
+ break;
+ case InsertionMode.TEXT:
+ endTagInText(this, token);
+ break;
+ case InsertionMode.IN_TABLE:
+ endTagInTable(this, token);
+ break;
+ case InsertionMode.IN_TABLE_TEXT:
+ tokenInTableText(this, token);
+ break;
+ case InsertionMode.IN_CAPTION:
+ endTagInCaption(this, token);
+ break;
+ case InsertionMode.IN_COLUMN_GROUP:
+ endTagInColumnGroup(this, token);
+ break;
+ case InsertionMode.IN_TABLE_BODY:
+ endTagInTableBody(this, token);
+ break;
+ case InsertionMode.IN_ROW:
+ endTagInRow(this, token);
+ break;
+ case InsertionMode.IN_CELL:
+ endTagInCell(this, token);
+ break;
+ case InsertionMode.IN_SELECT:
+ endTagInSelect(this, token);
+ break;
+ case InsertionMode.IN_SELECT_IN_TABLE:
+ endTagInSelectInTable(this, token);
+ break;
+ case InsertionMode.IN_TEMPLATE:
+ endTagInTemplate(this, token);
+ break;
+ case InsertionMode.AFTER_BODY:
+ endTagAfterBody(this, token);
+ break;
+ case InsertionMode.IN_FRAMESET:
+ endTagInFrameset(this, token);
+ break;
+ case InsertionMode.AFTER_FRAMESET:
+ endTagAfterFrameset(this, token);
+ break;
+ case InsertionMode.AFTER_AFTER_BODY:
+ tokenAfterAfterBody(this, token);
+ break;
+ default:
+ // Do nothing
+ }
+ }
+ onEof(token) {
+ switch (this.insertionMode) {
+ case InsertionMode.INITIAL:
+ tokenInInitialMode(this, token);
+ break;
+ case InsertionMode.BEFORE_HTML:
+ tokenBeforeHtml(this, token);
+ break;
+ case InsertionMode.BEFORE_HEAD:
+ tokenBeforeHead(this, token);
+ break;
+ case InsertionMode.IN_HEAD:
+ tokenInHead(this, token);
+ break;
+ case InsertionMode.IN_HEAD_NO_SCRIPT:
+ tokenInHeadNoScript(this, token);
+ break;
+ case InsertionMode.AFTER_HEAD:
+ tokenAfterHead(this, token);
+ break;
+ case InsertionMode.IN_BODY:
+ case InsertionMode.IN_TABLE:
+ case InsertionMode.IN_CAPTION:
+ case InsertionMode.IN_COLUMN_GROUP:
+ case InsertionMode.IN_TABLE_BODY:
+ case InsertionMode.IN_ROW:
+ case InsertionMode.IN_CELL:
+ case InsertionMode.IN_SELECT:
+ case InsertionMode.IN_SELECT_IN_TABLE:
+ eofInBody(this, token);
+ break;
+ case InsertionMode.TEXT:
+ eofInText(this, token);
+ break;
+ case InsertionMode.IN_TABLE_TEXT:
+ tokenInTableText(this, token);
+ break;
+ case InsertionMode.IN_TEMPLATE:
+ eofInTemplate(this, token);
+ break;
+ case InsertionMode.AFTER_BODY:
+ case InsertionMode.IN_FRAMESET:
+ case InsertionMode.AFTER_FRAMESET:
+ case InsertionMode.AFTER_AFTER_BODY:
+ case InsertionMode.AFTER_AFTER_FRAMESET:
+ stopParsing(this, token);
+ break;
+ default:
+ // Do nothing
+ }
+ }
+ onWhitespaceCharacter(token) {
+ if (this.skipNextNewLine) {
+ this.skipNextNewLine = false;
+ if (token.chars.charCodeAt(0) === unicode.CODE_POINTS.LINE_FEED) {
+ if (token.chars.length === 1) {
+ return;
+ }
+ token.chars = token.chars.substr(1);
+ }
+ }
+ if (this.tokenizer.inForeignNode) {
+ this._insertCharacters(token);
+ return;
+ }
+ switch (this.insertionMode) {
+ case InsertionMode.IN_HEAD:
+ case InsertionMode.IN_HEAD_NO_SCRIPT:
+ case InsertionMode.AFTER_HEAD:
+ case InsertionMode.TEXT:
+ case InsertionMode.IN_COLUMN_GROUP:
+ case InsertionMode.IN_SELECT:
+ case InsertionMode.IN_SELECT_IN_TABLE:
+ case InsertionMode.IN_FRAMESET:
+ case InsertionMode.AFTER_FRAMESET:
+ this._insertCharacters(token);
+ break;
+ case InsertionMode.IN_BODY:
+ case InsertionMode.IN_CAPTION:
+ case InsertionMode.IN_CELL:
+ case InsertionMode.IN_TEMPLATE:
+ case InsertionMode.AFTER_BODY:
+ case InsertionMode.AFTER_AFTER_BODY:
+ case InsertionMode.AFTER_AFTER_FRAMESET:
+ whitespaceCharacterInBody(this, token);
+ break;
+ case InsertionMode.IN_TABLE:
+ case InsertionMode.IN_TABLE_BODY:
+ case InsertionMode.IN_ROW:
+ characterInTable(this, token);
+ break;
+ case InsertionMode.IN_TABLE_TEXT:
+ whitespaceCharacterInTableText(this, token);
+ break;
+ default:
+ // Do nothing
}
}
-
- //Special elements
- _isSpecialElement(element) {
- const tn = this.treeAdapter.getTagName(element);
- const ns = this.treeAdapter.getNamespaceURI(element);
-
- return HTML.SPECIAL_ELEMENTS[ns][tn];
- }
-}
-
-/**
- * Check if the node is self closing.
- * @param {Object} parse parse5 object.
- * @param {Object} token Hml text token information.
- */
- function checkselfClosingNode(parse, token) {
- const tagName = (token.tagName || "").toLowerCase();
- const selfClosing = token.selfClosing;
- const flag = parse.validator.isSupportedSelfClosing(tagName);
- if (parse.nodeInfo.tn && tagName && !parse.nodeInfo.sc) {
- const loc =
- String(token.location.startLine) + String(token.location.startCol);
- if (
- !flag ||
- (loc !== parse.nodeInfo.pos && token.type === Tokenizer.START_TAG_TOKEN)
- ) {
- parse.compileResult.log.push({
- line: String(token.location.startLine) || 1,
- column: String(token.location.startCol) || 1,
- reason: 'ERROR: tag `' + parse.nodeInfo.tn + '` must be closed, please follow norm',
- });
- parse.nodeInfo = {};
- }
- }
- if (tagName && flag) {
- if (token.type === Tokenizer.START_TAG_TOKEN && !selfClosing) {
- parse.nodeInfo.tn = tagName;
- parse.nodeInfo.sc = false;
- parse.nodeInfo.pos =
- String(token.location.line) + String(token.location.col);
- }
- if (
- token.type === Tokenizer.END_TAG_TOKEN &&
- tagName === parse.nodeInfo.tn
- ) {
- parse.nodeInfo.sc = true;
- }
- }
- if (!flag && selfClosing && token.type === Tokenizer.START_TAG_TOKEN) {
- parse.compileResult.log.push({
- line: token.location.startLine || 1,
- column: token.location.startCol || 1,
- reason: "ERROR: tag `" + tagName + "` can not use selfClosing",
- });
- }
- }
-
- /**
- * Check if the html text is legal.
- * @param {Object} lastToken Hml text last token information.
- */
- function checkInvalid(lastToken) {
- if (
- lastToken.type && lastToken.type !== Tokenizer.END_TAG_TOKEN &&
- lastToken.type !== Tokenizer.COMMENT_TOKEN
- ) {
- compileResult.log.push({
- line: lastToken.location.startLine || 1,
- column: lastToken.location.startCol || 1,
- reason: "ERROR: hml content is invalid. Please check it.",
- });
- }
- }
-
-module.exports = Parser;
-
+}
+exports.Parser = Parser;
//Adoption agency algorithm
//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#adoptionAgency)
//------------------------------------------------------------------
-
//Steps 5-8 of the algorithm
function aaObtainFormattingElementEntry(p, token) {
let formattingElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(token.tagName);
-
if (formattingElementEntry) {
if (!p.openElements.contains(formattingElementEntry.element)) {
p.activeFormattingElements.removeEntry(formattingElementEntry);
formattingElementEntry = null;
- } else if (!p.openElements.hasInScope(token.tagName)) {
+ }
+ else if (!p.openElements.hasInScope(token.tagID)) {
formattingElementEntry = null;
}
- } else {
+ }
+ else {
genericEndTagInBody(p, token);
}
-
return formattingElementEntry;
}
-
//Steps 9 and 10 of the algorithm
function aaObtainFurthestBlock(p, formattingElementEntry) {
let furthestBlock = null;
-
- for (let i = p.openElements.stackTop; i >= 0; i--) {
- const element = p.openElements.items[i];
-
+ let idx = p.openElements.stackTop;
+ for (; idx >= 0; idx--) {
+ const element = p.openElements.items[idx];
if (element === formattingElementEntry.element) {
break;
}
-
- if (p._isSpecialElement(element)) {
+ if (p._isSpecialElement(element, p.openElements.tagIDs[idx])) {
furthestBlock = element;
}
}
-
if (!furthestBlock) {
- p.openElements.popUntilElementPopped(formattingElementEntry.element);
+ p.openElements.shortenToLength(idx < 0 ? 0 : idx);
p.activeFormattingElements.removeEntry(formattingElementEntry);
}
-
return furthestBlock;
}
-
//Step 13 of the algorithm
function aaInnerLoop(p, furthestBlock, formattingElement) {
let lastElement = furthestBlock;
let nextElement = p.openElements.getCommonAncestor(furthestBlock);
-
for (let i = 0, element = nextElement; element !== formattingElement; i++, element = nextElement) {
- //NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5)
+ //NOTE: store the next element for the next loop iteration (it may be deleted from the stack by step 9.5)
nextElement = p.openElements.getCommonAncestor(element);
-
const elementEntry = p.activeFormattingElements.getElementEntry(element);
const counterOverflow = elementEntry && i >= AA_INNER_LOOP_ITER;
const shouldRemoveFromOpenElements = !elementEntry || counterOverflow;
-
if (shouldRemoveFromOpenElements) {
if (counterOverflow) {
p.activeFormattingElements.removeEntry(elementEntry);
}
-
p.openElements.remove(element);
- } else {
+ }
+ else {
element = aaRecreateElementFromEntry(p, elementEntry);
-
if (lastElement === furthestBlock) {
p.activeFormattingElements.bookmark = elementEntry;
}
-
p.treeAdapter.detachNode(lastElement);
p.treeAdapter.appendChild(element, lastElement);
lastElement = element;
}
}
-
return lastElement;
}
-
//Step 13.7 of the algorithm
function aaRecreateElementFromEntry(p, elementEntry) {
const ns = p.treeAdapter.getNamespaceURI(elementEntry.element);
const newElement = p.treeAdapter.createElement(elementEntry.token.tagName, ns, elementEntry.token.attrs);
-
p.openElements.replace(elementEntry.element, newElement);
elementEntry.element = newElement;
-
return newElement;
}
-
//Step 14 of the algorithm
function aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement) {
- if (p._isElementCausesFosterParenting(commonAncestor)) {
+ const tn = p.treeAdapter.getTagName(commonAncestor);
+ const tid = (0, html_js_1.getTagID)(tn);
+ if (p._isElementCausesFosterParenting(tid)) {
p._fosterParentElement(lastElement);
- } else {
- const tn = p.treeAdapter.getTagName(commonAncestor);
+ }
+ else {
const ns = p.treeAdapter.getNamespaceURI(commonAncestor);
-
- if (tn === $.TEMPLATE && ns === NS.HTML) {
+ if (tid === html_js_1.TAG_ID.TEMPLATE && ns === html_js_1.NS.HTML) {
commonAncestor = p.treeAdapter.getTemplateContent(commonAncestor);
}
-
p.treeAdapter.appendChild(commonAncestor, lastElement);
}
}
-
//Steps 15-19 of the algorithm
function aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry) {
const ns = p.treeAdapter.getNamespaceURI(formattingElementEntry.element);
- const token = formattingElementEntry.token;
+ const { token } = formattingElementEntry;
const newElement = p.treeAdapter.createElement(token.tagName, ns, token.attrs);
-
p._adoptNodes(furthestBlock, newElement);
p.treeAdapter.appendChild(furthestBlock, newElement);
-
- p.activeFormattingElements.insertElementAfterBookmark(newElement, formattingElementEntry.token);
+ p.activeFormattingElements.insertElementAfterBookmark(newElement, token);
p.activeFormattingElements.removeEntry(formattingElementEntry);
-
p.openElements.remove(formattingElementEntry.element);
- p.openElements.insertAfter(furthestBlock, newElement);
+ p.openElements.insertAfter(furthestBlock, newElement, token.tagID);
}
-
//Algorithm entry point
function callAdoptionAgency(p, token) {
- let formattingElementEntry;
-
for (let i = 0; i < AA_OUTER_LOOP_ITER; i++) {
- formattingElementEntry = aaObtainFormattingElementEntry(p, token, formattingElementEntry);
-
+ const formattingElementEntry = aaObtainFormattingElementEntry(p, token);
if (!formattingElementEntry) {
break;
}
-
const furthestBlock = aaObtainFurthestBlock(p, formattingElementEntry);
-
if (!furthestBlock) {
break;
}
-
p.activeFormattingElements.bookmark = formattingElementEntry;
-
const lastElement = aaInnerLoop(p, furthestBlock, formattingElementEntry.element);
const commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element);
-
p.treeAdapter.detachNode(lastElement);
- aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement);
+ if (commonAncestor)
+ aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement);
aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry);
}
}
-
//Generic token handlers
//------------------------------------------------------------------
-function ignoreToken() {
- //NOTE: do nothing =)
-}
-
-function misplacedDoctype(p) {
- p._err(ERR.misplacedDoctype);
-}
-
function appendComment(p, token) {
- p._appendCommentNode(token, p.openElements.currentTmplContent || p.openElements.current);
+ p._appendCommentNode(token, p.openElements.currentTmplContentOrNode);
}
-
function appendCommentToRootHtmlElement(p, token) {
p._appendCommentNode(token, p.openElements.items[0]);
}
-
function appendCommentToDocument(p, token) {
p._appendCommentNode(token, p.document);
}
-
-function insertCharacters(p, token) {
- p._insertCharacters(token);
-}
-
-function stopParsing(p) {
+function stopParsing(p, token) {
p.stopped = true;
+ // NOTE: Set end locations for elements that remain on the open element stack.
+ if (token.location) {
+ // NOTE: If we are not in a fragment, `html` and `body` will stay on the stack.
+ // This is a problem, as we might overwrite their end position here.
+ const target = p.fragmentContext ? 0 : 2;
+ for (let i = p.openElements.stackTop; i >= target; i--) {
+ p._setEndLocation(p.openElements.items[i], token);
+ }
+ // Handle `html` and `body`
+ if (!p.fragmentContext && p.openElements.stackTop >= 0) {
+ const htmlElement = p.openElements.items[0];
+ const htmlLocation = p.treeAdapter.getNodeSourceCodeLocation(htmlElement);
+ if (htmlLocation && !htmlLocation.endTag) {
+ p._setEndLocation(htmlElement, token);
+ if (p.openElements.stackTop >= 1) {
+ const bodyElement = p.openElements.items[1];
+ const bodyLocation = p.treeAdapter.getNodeSourceCodeLocation(bodyElement);
+ if (bodyLocation && !bodyLocation.endTag) {
+ p._setEndLocation(bodyElement, token);
+ }
+ }
+ }
+ }
+ }
}
-
// The "initial" insertion mode
//------------------------------------------------------------------
function doctypeInInitialMode(p, token) {
p._setDocumentType(token);
-
- const mode = token.forceQuirks ? HTML.DOCUMENT_MODE.QUIRKS : doctype.getDocumentMode(token);
-
+ const mode = token.forceQuirks ? html_js_1.DOCUMENT_MODE.QUIRKS : doctype.getDocumentMode(token);
if (!doctype.isConforming(token)) {
- p._err(ERR.nonConformingDoctype);
+ p._err(token, error_codes_js_1.ERR.nonConformingDoctype);
}
-
p.treeAdapter.setDocumentMode(p.document, mode);
-
- p.insertionMode = BEFORE_HTML_MODE;
+ p.insertionMode = InsertionMode.BEFORE_HTML;
}
-
function tokenInInitialMode(p, token) {
- p._err(ERR.missingDoctype, { beforeToken: true });
- p.treeAdapter.setDocumentMode(p.document, HTML.DOCUMENT_MODE.QUIRKS);
- p.insertionMode = BEFORE_HTML_MODE;
+ p._err(token, error_codes_js_1.ERR.missingDoctype, true);
+ p.treeAdapter.setDocumentMode(p.document, html_js_1.DOCUMENT_MODE.QUIRKS);
+ p.insertionMode = InsertionMode.BEFORE_HTML;
p._processToken(token);
}
-
// The "before html" insertion mode
//------------------------------------------------------------------
function startTagBeforeHtml(p, token) {
- if (token.tagName === $.HTML) {
- p._insertElement(token, NS.HTML);
- p.insertionMode = BEFORE_HEAD_MODE;
- } else {
+ if (token.tagID === html_js_1.TAG_ID.HTML) {
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.insertionMode = InsertionMode.BEFORE_HEAD;
+ }
+ else {
tokenBeforeHtml(p, token);
}
}
-
function endTagBeforeHtml(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HTML || tn === $.HEAD || tn === $.BODY || tn === $.BR) {
+ const tn = token.tagID;
+ if (tn === html_js_1.TAG_ID.HTML || tn === html_js_1.TAG_ID.HEAD || tn === html_js_1.TAG_ID.BODY || tn === html_js_1.TAG_ID.BR) {
tokenBeforeHtml(p, token);
}
}
-
function tokenBeforeHtml(p, token) {
p._insertFakeRootElement();
- p.insertionMode = BEFORE_HEAD_MODE;
+ p.insertionMode = InsertionMode.BEFORE_HEAD;
p._processToken(token);
}
-
// The "before head" insertion mode
//------------------------------------------------------------------
function startTagBeforeHead(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HTML) {
- startTagInBody(p, token);
- } else if (tn === $.HEAD) {
- p._insertElement(token, NS.HTML);
- p.headElement = p.openElements.current;
- p.insertionMode = IN_HEAD_MODE;
- } else {
- tokenBeforeHead(p, token);
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.HTML: {
+ startTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.HEAD: {
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.headElement = p.openElements.current;
+ p.insertionMode = InsertionMode.IN_HEAD;
+ break;
+ }
+ default: {
+ tokenBeforeHead(p, token);
+ }
}
}
-
function endTagBeforeHead(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HEAD || tn === $.BODY || tn === $.HTML || tn === $.BR) {
+ const tn = token.tagID;
+ if (tn === html_js_1.TAG_ID.HEAD || tn === html_js_1.TAG_ID.BODY || tn === html_js_1.TAG_ID.HTML || tn === html_js_1.TAG_ID.BR) {
tokenBeforeHead(p, token);
- } else {
- p._err(ERR.endTagWithoutMatchingOpenElement);
+ }
+ else {
+ p._err(token, error_codes_js_1.ERR.endTagWithoutMatchingOpenElement);
}
}
-
function tokenBeforeHead(p, token) {
- p._insertFakeElement($.HEAD);
+ p._insertFakeElement(html_js_1.TAG_NAMES.HEAD, html_js_1.TAG_ID.HEAD);
p.headElement = p.openElements.current;
- p.insertionMode = IN_HEAD_MODE;
+ p.insertionMode = InsertionMode.IN_HEAD;
p._processToken(token);
}
-
// The "in head" insertion mode
//------------------------------------------------------------------
function startTagInHead(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HTML) {
- startTagInBody(p, token);
- } else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META) {
- p._appendElement(token, NS.HTML);
- token.ackSelfClosing = true;
- } else if (tn === $.TITLE) {
- p._switchToTextParsing(token, Tokenizer.MODE.RCDATA);
- } else if (tn === $.NOSCRIPT) {
- if (p.options.scriptingEnabled) {
- p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
- } else {
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_HEAD_NO_SCRIPT_MODE;
- }
- } else if (tn === $.NOFRAMES || tn === $.STYLE) {
- p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
- } else if (tn === $.SCRIPT) {
- p._switchToTextParsing(token, Tokenizer.MODE.SCRIPT_DATA);
- } else if (tn === $.TEMPLATE) {
- p._insertTemplate(token, NS.HTML);
- p.activeFormattingElements.insertMarker();
- p.framesetOk = false;
- p.insertionMode = IN_TEMPLATE_MODE;
- p._pushTmplInsertionMode(IN_TEMPLATE_MODE);
- } else if (tn === $.HEAD) {
- p._err(ERR.misplacedStartTagForHeadElement);
- } else {
- tokenInHead(p, token);
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.HTML: {
+ startTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.BASE:
+ case html_js_1.TAG_ID.BASEFONT:
+ case html_js_1.TAG_ID.BGSOUND:
+ case html_js_1.TAG_ID.LINK:
+ case html_js_1.TAG_ID.META: {
+ p._appendElement(token, html_js_1.NS.HTML);
+ token.ackSelfClosing = true;
+ break;
+ }
+ case html_js_1.TAG_ID.TITLE: {
+ p._switchToTextParsing(token, index_js_1.TokenizerMode.RCDATA);
+ break;
+ }
+ case html_js_1.TAG_ID.NOSCRIPT: {
+ if (p.options.scriptingEnabled) {
+ p._switchToTextParsing(token, index_js_1.TokenizerMode.RAWTEXT);
+ }
+ else {
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.insertionMode = InsertionMode.IN_HEAD_NO_SCRIPT;
+ }
+ break;
+ }
+ case html_js_1.TAG_ID.NOFRAMES:
+ case html_js_1.TAG_ID.STYLE: {
+ p._switchToTextParsing(token, index_js_1.TokenizerMode.RAWTEXT);
+ break;
+ }
+ case html_js_1.TAG_ID.SCRIPT: {
+ p._switchToTextParsing(token, index_js_1.TokenizerMode.SCRIPT_DATA);
+ break;
+ }
+ case html_js_1.TAG_ID.TEMPLATE: {
+ p._insertTemplate(token);
+ p.activeFormattingElements.insertMarker();
+ p.framesetOk = false;
+ p.insertionMode = InsertionMode.IN_TEMPLATE;
+ p.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE);
+ break;
+ }
+ case html_js_1.TAG_ID.HEAD: {
+ p._err(token, error_codes_js_1.ERR.misplacedStartTagForHeadElement);
+ break;
+ }
+ default: {
+ tokenInHead(p, token);
+ }
}
}
-
function endTagInHead(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HEAD) {
- p.openElements.pop();
- p.insertionMode = AFTER_HEAD_MODE;
- } else if (tn === $.BODY || tn === $.BR || tn === $.HTML) {
- tokenInHead(p, token);
- } else if (tn === $.TEMPLATE) {
- if (p.openElements.tmplCount > 0) {
- p.openElements.generateImpliedEndTagsThoroughly();
-
- if (p.openElements.currentTagName !== $.TEMPLATE) {
- p._err(ERR.closingOfElementWithOpenChildElements);
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.HEAD: {
+ p.openElements.pop();
+ p.insertionMode = InsertionMode.AFTER_HEAD;
+ break;
+ }
+ case html_js_1.TAG_ID.BODY:
+ case html_js_1.TAG_ID.BR:
+ case html_js_1.TAG_ID.HTML: {
+ tokenInHead(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.TEMPLATE: {
+ if (p.openElements.tmplCount > 0) {
+ p.openElements.generateImpliedEndTagsThoroughly();
+ if (p.openElements.currentTagId !== html_js_1.TAG_ID.TEMPLATE) {
+ p._err(token, error_codes_js_1.ERR.closingOfElementWithOpenChildElements);
+ }
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.TEMPLATE);
+ p.activeFormattingElements.clearToLastMarker();
+ p.tmplInsertionModeStack.shift();
+ p._resetInsertionMode();
}
-
- p.openElements.popUntilTagNamePopped($.TEMPLATE);
- p.activeFormattingElements.clearToLastMarker();
- p._popTmplInsertionMode();
- p._resetInsertionMode();
- } else {
- p._err(ERR.endTagWithoutMatchingOpenElement);
+ else {
+ p._err(token, error_codes_js_1.ERR.endTagWithoutMatchingOpenElement);
+ }
+ break;
+ }
+ default: {
+ p._err(token, error_codes_js_1.ERR.endTagWithoutMatchingOpenElement);
}
- } else {
- p._err(ERR.endTagWithoutMatchingOpenElement);
}
}
-
function tokenInHead(p, token) {
p.openElements.pop();
- p.insertionMode = AFTER_HEAD_MODE;
+ p.insertionMode = InsertionMode.AFTER_HEAD;
p._processToken(token);
}
-
// The "in head no script" insertion mode
//------------------------------------------------------------------
function startTagInHeadNoScript(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HTML) {
- startTagInBody(p, token);
- } else if (
- tn === $.BASEFONT ||
- tn === $.BGSOUND ||
- tn === $.HEAD ||
- tn === $.LINK ||
- tn === $.META ||
- tn === $.NOFRAMES ||
- tn === $.STYLE
- ) {
- startTagInHead(p, token);
- } else if (tn === $.NOSCRIPT) {
- p._err(ERR.nestedNoscriptInHead);
- } else {
- tokenInHeadNoScript(p, token);
- }
-}
-
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.HTML: {
+ startTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.BASEFONT:
+ case html_js_1.TAG_ID.BGSOUND:
+ case html_js_1.TAG_ID.HEAD:
+ case html_js_1.TAG_ID.LINK:
+ case html_js_1.TAG_ID.META:
+ case html_js_1.TAG_ID.NOFRAMES:
+ case html_js_1.TAG_ID.STYLE: {
+ startTagInHead(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.NOSCRIPT: {
+ p._err(token, error_codes_js_1.ERR.nestedNoscriptInHead);
+ break;
+ }
+ default: {
+ tokenInHeadNoScript(p, token);
+ }
+ }
+}
function endTagInHeadNoScript(p, token) {
- const tn = token.tagName;
-
- if (tn === $.NOSCRIPT) {
- p.openElements.pop();
- p.insertionMode = IN_HEAD_MODE;
- } else if (tn === $.BR) {
- tokenInHeadNoScript(p, token);
- } else {
- p._err(ERR.endTagWithoutMatchingOpenElement);
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.NOSCRIPT: {
+ p.openElements.pop();
+ p.insertionMode = InsertionMode.IN_HEAD;
+ break;
+ }
+ case html_js_1.TAG_ID.BR: {
+ tokenInHeadNoScript(p, token);
+ break;
+ }
+ default: {
+ p._err(token, error_codes_js_1.ERR.endTagWithoutMatchingOpenElement);
+ }
}
}
-
function tokenInHeadNoScript(p, token) {
- const errCode =
- token.type === Tokenizer.EOF_TOKEN ? ERR.openElementsLeftAfterEof : ERR.disallowedContentInNoscriptInHead;
-
- p._err(errCode);
+ const errCode = token.type === token_js_1.TokenType.EOF ? error_codes_js_1.ERR.openElementsLeftAfterEof : error_codes_js_1.ERR.disallowedContentInNoscriptInHead;
+ p._err(token, errCode);
p.openElements.pop();
- p.insertionMode = IN_HEAD_MODE;
+ p.insertionMode = InsertionMode.IN_HEAD;
p._processToken(token);
}
-
// The "after head" insertion mode
//------------------------------------------------------------------
function startTagAfterHead(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HTML) {
- startTagInBody(p, token);
- } else if (tn === $.BODY) {
- p._insertElement(token, NS.HTML);
- p.framesetOk = false;
- p.insertionMode = IN_BODY_MODE;
- } else if (tn === $.FRAMESET) {
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_FRAMESET_MODE;
- } else if (
- tn === $.BASE ||
- tn === $.BASEFONT ||
- tn === $.BGSOUND ||
- tn === $.LINK ||
- tn === $.META ||
- tn === $.NOFRAMES ||
- tn === $.SCRIPT ||
- tn === $.STYLE ||
- tn === $.TEMPLATE ||
- tn === $.TITLE
- ) {
- p._err(ERR.abandonedHeadElementChild);
- p.openElements.push(p.headElement);
- startTagInHead(p, token);
- p.openElements.remove(p.headElement);
- } else if (tn === $.HEAD) {
- p._err(ERR.misplacedStartTagForHeadElement);
- } else {
- tokenAfterHead(p, token);
- }
-}
-
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.HTML: {
+ startTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.BODY: {
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.framesetOk = false;
+ p.insertionMode = InsertionMode.IN_BODY;
+ break;
+ }
+ case html_js_1.TAG_ID.FRAMESET: {
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.insertionMode = InsertionMode.IN_FRAMESET;
+ break;
+ }
+ case html_js_1.TAG_ID.BASE:
+ case html_js_1.TAG_ID.BASEFONT:
+ case html_js_1.TAG_ID.BGSOUND:
+ case html_js_1.TAG_ID.LINK:
+ case html_js_1.TAG_ID.META:
+ case html_js_1.TAG_ID.NOFRAMES:
+ case html_js_1.TAG_ID.SCRIPT:
+ case html_js_1.TAG_ID.STYLE:
+ case html_js_1.TAG_ID.TEMPLATE:
+ case html_js_1.TAG_ID.TITLE: {
+ p._err(token, error_codes_js_1.ERR.abandonedHeadElementChild);
+ p.openElements.push(p.headElement, html_js_1.TAG_ID.HEAD);
+ startTagInHead(p, token);
+ p.openElements.remove(p.headElement);
+ break;
+ }
+ case html_js_1.TAG_ID.HEAD: {
+ p._err(token, error_codes_js_1.ERR.misplacedStartTagForHeadElement);
+ break;
+ }
+ default: {
+ tokenAfterHead(p, token);
+ }
+ }
+}
function endTagAfterHead(p, token) {
- const tn = token.tagName;
-
- if (tn === $.BODY || tn === $.HTML || tn === $.BR) {
- tokenAfterHead(p, token);
- } else if (tn === $.TEMPLATE) {
- endTagInHead(p, token);
- } else {
- p._err(ERR.endTagWithoutMatchingOpenElement);
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.BODY:
+ case html_js_1.TAG_ID.HTML:
+ case html_js_1.TAG_ID.BR: {
+ tokenAfterHead(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.TEMPLATE: {
+ endTagInHead(p, token);
+ break;
+ }
+ default: {
+ p._err(token, error_codes_js_1.ERR.endTagWithoutMatchingOpenElement);
+ }
}
}
-
function tokenAfterHead(p, token) {
- p._insertFakeElement($.BODY);
- p.insertionMode = IN_BODY_MODE;
- p._processToken(token);
+ p._insertFakeElement(html_js_1.TAG_NAMES.BODY, html_js_1.TAG_ID.BODY);
+ p.insertionMode = InsertionMode.IN_BODY;
+ modeInBody(p, token);
}
-
// The "in body" insertion mode
//------------------------------------------------------------------
+function modeInBody(p, token) {
+ switch (token.type) {
+ case token_js_1.TokenType.CHARACTER: {
+ characterInBody(p, token);
+ break;
+ }
+ case token_js_1.TokenType.WHITESPACE_CHARACTER: {
+ whitespaceCharacterInBody(p, token);
+ break;
+ }
+ case token_js_1.TokenType.COMMENT: {
+ appendComment(p, token);
+ break;
+ }
+ case token_js_1.TokenType.START_TAG: {
+ startTagInBody(p, token);
+ break;
+ }
+ case token_js_1.TokenType.END_TAG: {
+ endTagInBody(p, token);
+ break;
+ }
+ case token_js_1.TokenType.EOF: {
+ eofInBody(p, token);
+ break;
+ }
+ default:
+ // Do nothing
+ }
+}
function whitespaceCharacterInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertCharacters(token);
}
-
function characterInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertCharacters(token);
p.framesetOk = false;
}
-
function htmlStartTagInBody(p, token) {
if (p.openElements.tmplCount === 0) {
p.treeAdapter.adoptAttributes(p.openElements.items[0], token.attrs);
}
}
-
function bodyStartTagInBody(p, token) {
const bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
-
if (bodyElement && p.openElements.tmplCount === 0) {
p.framesetOk = false;
p.treeAdapter.adoptAttributes(bodyElement, token.attrs);
}
}
-
function framesetStartTagInBody(p, token) {
const bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
-
if (p.framesetOk && bodyElement) {
p.treeAdapter.detachNode(bodyElement);
p.openElements.popAllUpToHtmlElement();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_FRAMESET_MODE;
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.insertionMode = InsertionMode.IN_FRAMESET;
}
}
-
function addressStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P)) {
+ if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) {
p._closePElement();
}
-
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
}
-
function numberedHeaderStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P)) {
+ if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) {
p._closePElement();
}
-
- const tn = p.openElements.currentTagName;
-
- if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) {
+ if ((0, html_js_1.isNumberedHeader)(p.openElements.currentTagId)) {
p.openElements.pop();
}
-
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
}
-
function preStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P)) {
+ if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) {
p._closePElement();
}
-
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
//NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move
//on to the next one. (Newlines at the start of pre blocks are ignored as an authoring convenience.)
p.skipNextNewLine = true;
p.framesetOk = false;
}
-
function formStartTagInBody(p, token) {
const inTemplate = p.openElements.tmplCount > 0;
-
if (!p.formElement || inTemplate) {
- if (p.openElements.hasInButtonScope($.P)) {
+ if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) {
p._closePElement();
}
-
- p._insertElement(token, NS.HTML);
-
+ p._insertElement(token, html_js_1.NS.HTML);
if (!inTemplate) {
p.formElement = p.openElements.current;
}
}
}
-
function listItemStartTagInBody(p, token) {
p.framesetOk = false;
-
- const tn = token.tagName;
-
+ const tn = token.tagID;
for (let i = p.openElements.stackTop; i >= 0; i--) {
- const element = p.openElements.items[i];
- const elementTn = p.treeAdapter.getTagName(element);
- let closeTn = null;
-
- if (tn === $.LI && elementTn === $.LI) {
- closeTn = $.LI;
- } else if ((tn === $.DD || tn === $.DT) && (elementTn === $.DD || elementTn === $.DT)) {
- closeTn = elementTn;
- }
-
- if (closeTn) {
- p.openElements.generateImpliedEndTagsWithExclusion(closeTn);
- p.openElements.popUntilTagNamePopped(closeTn);
+ const elementId = p.openElements.tagIDs[i];
+ if ((tn === html_js_1.TAG_ID.LI && elementId === html_js_1.TAG_ID.LI) ||
+ ((tn === html_js_1.TAG_ID.DD || tn === html_js_1.TAG_ID.DT) && (elementId === html_js_1.TAG_ID.DD || elementId === html_js_1.TAG_ID.DT))) {
+ p.openElements.generateImpliedEndTagsWithExclusion(elementId);
+ p.openElements.popUntilTagNamePopped(elementId);
break;
}
-
- if (elementTn !== $.ADDRESS && elementTn !== $.DIV && elementTn !== $.P && p._isSpecialElement(element)) {
+ if (elementId !== html_js_1.TAG_ID.ADDRESS &&
+ elementId !== html_js_1.TAG_ID.DIV &&
+ elementId !== html_js_1.TAG_ID.P &&
+ p._isSpecialElement(p.openElements.items[i], elementId)) {
break;
}
}
-
- if (p.openElements.hasInButtonScope($.P)) {
+ if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) {
p._closePElement();
}
-
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
}
-
function plaintextStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P)) {
+ if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) {
p._closePElement();
}
-
- p._insertElement(token, NS.HTML);
- p.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.tokenizer.state = index_js_1.TokenizerMode.PLAINTEXT;
}
-
function buttonStartTagInBody(p, token) {
- if (p.openElements.hasInScope($.BUTTON)) {
+ if (p.openElements.hasInScope(html_js_1.TAG_ID.BUTTON)) {
p.openElements.generateImpliedEndTags();
- p.openElements.popUntilTagNamePopped($.BUTTON);
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.BUTTON);
}
-
p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
p.framesetOk = false;
}
-
function aStartTagInBody(p, token) {
- const activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName($.A);
-
+ const activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(html_js_1.TAG_NAMES.A);
if (activeElementEntry) {
callAdoptionAgency(p, token);
p.openElements.remove(activeElementEntry.element);
p.activeFormattingElements.removeEntry(activeElementEntry);
}
-
p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
p.activeFormattingElements.pushElement(p.openElements.current, token);
}
-
function bStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
p.activeFormattingElements.pushElement(p.openElements.current, token);
}
-
function nobrStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
-
- if (p.openElements.hasInScope($.NOBR)) {
+ if (p.openElements.hasInScope(html_js_1.TAG_ID.NOBR)) {
callAdoptionAgency(p, token);
p._reconstructActiveFormattingElements();
}
-
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
p.activeFormattingElements.pushElement(p.openElements.current, token);
}
-
function appletStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
p.activeFormattingElements.insertMarker();
p.framesetOk = false;
}
-
function tableStartTagInBody(p, token) {
- if (
- p.treeAdapter.getDocumentMode(p.document) !== HTML.DOCUMENT_MODE.QUIRKS &&
- p.openElements.hasInButtonScope($.P)
- ) {
+ if (p.treeAdapter.getDocumentMode(p.document) !== html_js_1.DOCUMENT_MODE.QUIRKS && p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) {
p._closePElement();
}
-
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
p.framesetOk = false;
- p.insertionMode = IN_TABLE_MODE;
+ p.insertionMode = InsertionMode.IN_TABLE;
}
-
function areaStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
- p._appendElement(token, NS.HTML);
+ p._appendElement(token, html_js_1.NS.HTML);
p.framesetOk = false;
token.ackSelfClosing = true;
}
-
+function isHiddenInput(token) {
+ const inputType = (0, token_js_1.getTokenAttr)(token, html_js_1.ATTRS.TYPE);
+ return inputType != null && inputType.toLowerCase() === HIDDEN_INPUT_TYPE;
+}
function inputStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
- p._appendElement(token, NS.HTML);
-
- const inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
-
- if (!inputType || inputType.toLowerCase() !== HIDDEN_INPUT_TYPE) {
+ p._appendElement(token, html_js_1.NS.HTML);
+ if (!isHiddenInput(token)) {
p.framesetOk = false;
}
-
token.ackSelfClosing = true;
}
-
function paramStartTagInBody(p, token) {
- p._appendElement(token, NS.HTML);
+ p._appendElement(token, html_js_1.NS.HTML);
token.ackSelfClosing = true;
}
-
function hrStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P)) {
+ if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) {
p._closePElement();
}
-
- p._appendElement(token, NS.HTML);
+ p._appendElement(token, html_js_1.NS.HTML);
p.framesetOk = false;
- p.ackSelfClosing = true;
+ token.ackSelfClosing = true;
}
-
function imageStartTagInBody(p, token) {
- token.tagName = $.IMG;
+ token.tagName = html_js_1.TAG_NAMES.IMG;
+ token.tagID = html_js_1.TAG_ID.IMG;
areaStartTagInBody(p, token);
}
-
function textareaStartTagInBody(p, token) {
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
//NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move
//on to the next one. (Newlines at the start of textarea elements are ignored as an authoring convenience.)
p.skipNextNewLine = true;
- p.tokenizer.state = Tokenizer.MODE.RCDATA;
+ p.tokenizer.state = index_js_1.TokenizerMode.RCDATA;
p.originalInsertionMode = p.insertionMode;
p.framesetOk = false;
- p.insertionMode = TEXT_MODE;
+ p.insertionMode = InsertionMode.TEXT;
}
-
function xmpStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P)) {
+ if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) {
p._closePElement();
}
-
p._reconstructActiveFormattingElements();
p.framesetOk = false;
- p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
+ p._switchToTextParsing(token, index_js_1.TokenizerMode.RAWTEXT);
}
-
function iframeStartTagInBody(p, token) {
p.framesetOk = false;
- p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
+ p._switchToTextParsing(token, index_js_1.TokenizerMode.RAWTEXT);
}
-
//NOTE: here we assume that we always act as an user agent with enabled plugins, so we parse
-// as a rawtext.
+// as rawtext.
function noembedStartTagInBody(p, token) {
- p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
+ p._switchToTextParsing(token, index_js_1.TokenizerMode.RAWTEXT);
}
-
function selectStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
p.framesetOk = false;
-
- if (
- p.insertionMode === IN_TABLE_MODE ||
- p.insertionMode === IN_CAPTION_MODE ||
- p.insertionMode === IN_TABLE_BODY_MODE ||
- p.insertionMode === IN_ROW_MODE ||
- p.insertionMode === IN_CELL_MODE
- ) {
- p.insertionMode = IN_SELECT_IN_TABLE_MODE;
- } else {
- p.insertionMode = IN_SELECT_MODE;
- }
-}
-
+ p.insertionMode =
+ p.insertionMode === InsertionMode.IN_TABLE ||
+ p.insertionMode === InsertionMode.IN_CAPTION ||
+ p.insertionMode === InsertionMode.IN_TABLE_BODY ||
+ p.insertionMode === InsertionMode.IN_ROW ||
+ p.insertionMode === InsertionMode.IN_CELL
+ ? InsertionMode.IN_SELECT_IN_TABLE
+ : InsertionMode.IN_SELECT;
+}
function optgroupStartTagInBody(p, token) {
- if (p.openElements.currentTagName === $.OPTION) {
+ if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTION) {
p.openElements.pop();
}
-
p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
}
-
function rbStartTagInBody(p, token) {
- if (p.openElements.hasInScope($.RUBY)) {
+ if (p.openElements.hasInScope(html_js_1.TAG_ID.RUBY)) {
p.openElements.generateImpliedEndTags();
}
-
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
}
-
function rtStartTagInBody(p, token) {
- if (p.openElements.hasInScope($.RUBY)) {
- p.openElements.generateImpliedEndTagsWithExclusion($.RTC);
- }
-
- p._insertElement(token, NS.HTML);
-}
-
-function menuStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P)) {
- p._closePElement();
+ if (p.openElements.hasInScope(html_js_1.TAG_ID.RUBY)) {
+ p.openElements.generateImpliedEndTagsWithExclusion(html_js_1.TAG_ID.RTC);
}
-
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
}
-
function mathStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
-
foreignContent.adjustTokenMathMLAttrs(token);
foreignContent.adjustTokenXMLAttrs(token);
-
if (token.selfClosing) {
- p._appendElement(token, NS.MATHML);
- } else {
- p._insertElement(token, NS.MATHML);
+ p._appendElement(token, html_js_1.NS.MATHML);
+ }
+ else {
+ p._insertElement(token, html_js_1.NS.MATHML);
}
-
token.ackSelfClosing = true;
}
-
function svgStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
-
foreignContent.adjustTokenSVGAttrs(token);
foreignContent.adjustTokenXMLAttrs(token);
-
if (token.selfClosing) {
- p._appendElement(token, NS.SVG);
- } else {
- p._insertElement(token, NS.SVG);
+ p._appendElement(token, html_js_1.NS.SVG);
+ }
+ else {
+ p._insertElement(token, html_js_1.NS.SVG);
}
-
token.ackSelfClosing = true;
}
-
function genericStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
}
-
-//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
-//It's faster than using dictionary.
function startTagInBody(p, token) {
- const tn = token.tagName;
-
- switch (tn.length) {
- case 1:
- if (tn === $.I || tn === $.S || tn === $.B || tn === $.U) {
- bStartTagInBody(p, token);
- } else if (tn === $.P) {
- addressStartTagInBody(p, token);
- } else if (tn === $.A) {
- aStartTagInBody(p, token);
- } else {
- genericStartTagInBody(p, token);
- }
-
- break;
-
- case 2:
- if (tn === $.DL || tn === $.OL || tn === $.UL) {
- addressStartTagInBody(p, token);
- } else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) {
- numberedHeaderStartTagInBody(p, token);
- } else if (tn === $.LI || tn === $.DD || tn === $.DT) {
- listItemStartTagInBody(p, token);
- } else if (tn === $.EM || tn === $.TT) {
- bStartTagInBody(p, token);
- } else if (tn === $.BR) {
- areaStartTagInBody(p, token);
- } else if (tn === $.HR) {
- hrStartTagInBody(p, token);
- } else if (tn === $.RB) {
- rbStartTagInBody(p, token);
- } else if (tn === $.RT || tn === $.RP) {
- rtStartTagInBody(p, token);
- } else if (tn !== $.TH && tn !== $.TD && tn !== $.TR) {
- genericStartTagInBody(p, token);
- }
-
- break;
-
- case 3:
- if (tn === $.DIV || tn === $.DIR || tn === $.NAV) {
- addressStartTagInBody(p, token);
- } else if (tn === $.PRE) {
- preStartTagInBody(p, token);
- } else if (tn === $.BIG) {
- bStartTagInBody(p, token);
- } else if (tn === $.IMG || tn === $.WBR) {
- areaStartTagInBody(p, token);
- } else if (tn === $.XMP) {
- xmpStartTagInBody(p, token);
- } else if (tn === $.SVG) {
- svgStartTagInBody(p, token);
- } else if (tn === $.RTC) {
- rbStartTagInBody(p, token);
- } else if (tn !== $.COL) {
- genericStartTagInBody(p, token);
- }
-
- break;
-
- case 4:
- if (tn === $.HTML) {
- htmlStartTagInBody(p, token);
- } else if (tn === $.BASE || tn === $.LINK || tn === $.META) {
- startTagInHead(p, token);
- } else if (tn === $.BODY) {
- bodyStartTagInBody(p, token);
- } else if (tn === $.MAIN || tn === $.MENU) {
- addressStartTagInBody(p, token);
- } else if (tn === $.FORM) {
- formStartTagInBody(p, token);
- } else if (tn === $.CODE || tn === $.FONT) {
- bStartTagInBody(p, token);
- } else if (tn === $.NOBR) {
- nobrStartTagInBody(p, token);
- } else if (tn === $.AREA) {
- areaStartTagInBody(p, token);
- } else if (tn === $.MATH) {
- mathStartTagInBody(p, token);
- } else if (tn === $.MENU) {
- menuStartTagInBody(p, token);
- } else if (tn !== $.HEAD) {
- genericStartTagInBody(p, token);
- }
-
- break;
-
- case 5:
- if (tn === $.STYLE || tn === $.TITLE) {
- startTagInHead(p, token);
- } else if (tn === $.ASIDE) {
- addressStartTagInBody(p, token);
- } else if (tn === $.SMALL) {
- bStartTagInBody(p, token);
- } else if (tn === $.TABLE) {
- tableStartTagInBody(p, token);
- } else if (tn === $.EMBED) {
- areaStartTagInBody(p, token);
- } else if (tn === $.INPUT) {
- inputStartTagInBody(p, token);
- } else if (tn === $.PARAM || tn === $.TRACK) {
- paramStartTagInBody(p, token);
- } else if (tn === $.IMAGE) {
- imageStartTagInBody(p, token);
- } else if (tn !== $.FRAME && tn !== $.TBODY && tn !== $.TFOOT && tn !== $.THEAD) {
- genericStartTagInBody(p, token);
- }
-
- break;
-
- case 6:
- if (tn === $.SCRIPT) {
- startTagInHead(p, token);
- } else if (
- tn === $.CENTER ||
- tn === $.FIGURE ||
- tn === $.FOOTER ||
- tn === $.HEADER ||
- tn === $.HGROUP ||
- tn === $.DIALOG
- ) {
- addressStartTagInBody(p, token);
- } else if (tn === $.BUTTON) {
- buttonStartTagInBody(p, token);
- } else if (tn === $.STRIKE || tn === $.STRONG) {
- bStartTagInBody(p, token);
- } else if (tn === $.APPLET || tn === $.OBJECT) {
- appletStartTagInBody(p, token);
- } else if (tn === $.KEYGEN) {
- areaStartTagInBody(p, token);
- } else if (tn === $.SOURCE) {
- paramStartTagInBody(p, token);
- } else if (tn === $.IFRAME) {
- iframeStartTagInBody(p, token);
- } else if (tn === $.SELECT) {
- selectStartTagInBody(p, token);
- } else if (tn === $.OPTION) {
- optgroupStartTagInBody(p, token);
- } else {
- genericStartTagInBody(p, token);
- }
-
- break;
-
- case 7:
- if (tn === $.BGSOUND) {
- startTagInHead(p, token);
- } else if (
- tn === $.DETAILS ||
- tn === $.ADDRESS ||
- tn === $.ARTICLE ||
- tn === $.SECTION ||
- tn === $.SUMMARY
- ) {
- addressStartTagInBody(p, token);
- } else if (tn === $.LISTING) {
- preStartTagInBody(p, token);
- } else if (tn === $.MARQUEE) {
- appletStartTagInBody(p, token);
- } else if (tn === $.NOEMBED) {
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.I:
+ case html_js_1.TAG_ID.S:
+ case html_js_1.TAG_ID.B:
+ case html_js_1.TAG_ID.U:
+ case html_js_1.TAG_ID.EM:
+ case html_js_1.TAG_ID.TT:
+ case html_js_1.TAG_ID.BIG:
+ case html_js_1.TAG_ID.CODE:
+ case html_js_1.TAG_ID.FONT:
+ case html_js_1.TAG_ID.SMALL:
+ case html_js_1.TAG_ID.STRIKE:
+ case html_js_1.TAG_ID.STRONG: {
+ bStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.A: {
+ aStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.H1:
+ case html_js_1.TAG_ID.H2:
+ case html_js_1.TAG_ID.H3:
+ case html_js_1.TAG_ID.H4:
+ case html_js_1.TAG_ID.H5:
+ case html_js_1.TAG_ID.H6: {
+ numberedHeaderStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.P:
+ case html_js_1.TAG_ID.DL:
+ case html_js_1.TAG_ID.OL:
+ case html_js_1.TAG_ID.UL:
+ case html_js_1.TAG_ID.DIV:
+ case html_js_1.TAG_ID.DIR:
+ case html_js_1.TAG_ID.NAV:
+ case html_js_1.TAG_ID.MAIN:
+ case html_js_1.TAG_ID.MENU:
+ case html_js_1.TAG_ID.ASIDE:
+ case html_js_1.TAG_ID.CENTER:
+ case html_js_1.TAG_ID.FIGURE:
+ case html_js_1.TAG_ID.FOOTER:
+ case html_js_1.TAG_ID.HEADER:
+ case html_js_1.TAG_ID.HGROUP:
+ case html_js_1.TAG_ID.DIALOG:
+ case html_js_1.TAG_ID.DETAILS:
+ case html_js_1.TAG_ID.ADDRESS:
+ case html_js_1.TAG_ID.ARTICLE:
+ case html_js_1.TAG_ID.SECTION:
+ case html_js_1.TAG_ID.SUMMARY:
+ case html_js_1.TAG_ID.FIELDSET:
+ case html_js_1.TAG_ID.BLOCKQUOTE:
+ case html_js_1.TAG_ID.FIGCAPTION: {
+ addressStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.LI:
+ case html_js_1.TAG_ID.DD:
+ case html_js_1.TAG_ID.DT: {
+ listItemStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.BR:
+ case html_js_1.TAG_ID.IMG:
+ case html_js_1.TAG_ID.WBR:
+ case html_js_1.TAG_ID.AREA:
+ case html_js_1.TAG_ID.EMBED:
+ case html_js_1.TAG_ID.KEYGEN: {
+ areaStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.HR: {
+ hrStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.RB:
+ case html_js_1.TAG_ID.RTC: {
+ rbStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.RT:
+ case html_js_1.TAG_ID.RP: {
+ rtStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.PRE:
+ case html_js_1.TAG_ID.LISTING: {
+ preStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.XMP: {
+ xmpStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.SVG: {
+ svgStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.HTML: {
+ htmlStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.BASE:
+ case html_js_1.TAG_ID.LINK:
+ case html_js_1.TAG_ID.META:
+ case html_js_1.TAG_ID.STYLE:
+ case html_js_1.TAG_ID.TITLE:
+ case html_js_1.TAG_ID.SCRIPT:
+ case html_js_1.TAG_ID.BGSOUND:
+ case html_js_1.TAG_ID.BASEFONT:
+ case html_js_1.TAG_ID.TEMPLATE: {
+ startTagInHead(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.BODY: {
+ bodyStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.FORM: {
+ formStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.NOBR: {
+ nobrStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.MATH: {
+ mathStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.TABLE: {
+ tableStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.INPUT: {
+ inputStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.PARAM:
+ case html_js_1.TAG_ID.TRACK:
+ case html_js_1.TAG_ID.SOURCE: {
+ paramStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.IMAGE: {
+ imageStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.BUTTON: {
+ buttonStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.APPLET:
+ case html_js_1.TAG_ID.OBJECT:
+ case html_js_1.TAG_ID.MARQUEE: {
+ appletStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.IFRAME: {
+ iframeStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.SELECT: {
+ selectStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.OPTION:
+ case html_js_1.TAG_ID.OPTGROUP: {
+ optgroupStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.NOEMBED: {
+ noembedStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.FRAMESET: {
+ framesetStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.TEXTAREA: {
+ textareaStartTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.NOSCRIPT: {
+ if (p.options.scriptingEnabled) {
noembedStartTagInBody(p, token);
- } else if (tn !== $.CAPTION) {
- genericStartTagInBody(p, token);
}
-
- break;
-
- case 8:
- if (tn === $.BASEFONT) {
- startTagInHead(p, token);
- } else if (tn === $.FRAMESET) {
- framesetStartTagInBody(p, token);
- } else if (tn === $.FIELDSET) {
- addressStartTagInBody(p, token);
- } else if (tn === $.TEXTAREA) {
- textareaStartTagInBody(p, token);
- } else if (tn === $.TEMPLATE) {
- startTagInHead(p, token);
- } else if (tn === $.NOSCRIPT) {
- if (p.options.scriptingEnabled) {
- noembedStartTagInBody(p, token);
- } else {
- genericStartTagInBody(p, token);
- }
- } else if (tn === $.OPTGROUP) {
- optgroupStartTagInBody(p, token);
- } else if (tn !== $.COLGROUP) {
+ else {
genericStartTagInBody(p, token);
}
-
break;
-
- case 9:
- if (tn === $.PLAINTEXT) {
- plaintextStartTagInBody(p, token);
- } else {
- genericStartTagInBody(p, token);
- }
-
+ }
+ case html_js_1.TAG_ID.PLAINTEXT: {
+ plaintextStartTagInBody(p, token);
break;
-
- case 10:
- if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION) {
- addressStartTagInBody(p, token);
- } else {
- genericStartTagInBody(p, token);
- }
-
+ }
+ case html_js_1.TAG_ID.COL:
+ case html_js_1.TAG_ID.TH:
+ case html_js_1.TAG_ID.TD:
+ case html_js_1.TAG_ID.TR:
+ case html_js_1.TAG_ID.HEAD:
+ case html_js_1.TAG_ID.FRAME:
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.TFOOT:
+ case html_js_1.TAG_ID.THEAD:
+ case html_js_1.TAG_ID.CAPTION:
+ case html_js_1.TAG_ID.COLGROUP: {
+ // Ignore token
break;
-
- default:
+ }
+ default: {
genericStartTagInBody(p, token);
+ }
}
}
-
-function bodyEndTagInBody(p) {
- if (p.openElements.hasInScope($.BODY)) {
- p.insertionMode = AFTER_BODY_MODE;
+function bodyEndTagInBody(p, token) {
+ if (p.openElements.hasInScope(html_js_1.TAG_ID.BODY)) {
+ p.insertionMode = InsertionMode.AFTER_BODY;
+ //NOTE: is never popped from the stack, so we need to updated
+ //the end location explicitly.
+ if (p.options.sourceCodeLocationInfo) {
+ const bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
+ if (bodyElement) {
+ p._setEndLocation(bodyElement, token);
+ }
+ }
}
}
-
function htmlEndTagInBody(p, token) {
- if (p.openElements.hasInScope($.BODY)) {
- p.insertionMode = AFTER_BODY_MODE;
- p._processToken(token);
+ if (p.openElements.hasInScope(html_js_1.TAG_ID.BODY)) {
+ p.insertionMode = InsertionMode.AFTER_BODY;
+ endTagAfterBody(p, token);
}
}
-
function addressEndTagInBody(p, token) {
- const tn = token.tagName;
-
+ const tn = token.tagID;
if (p.openElements.hasInScope(tn)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped(tn);
}
}
-
function formEndTagInBody(p) {
const inTemplate = p.openElements.tmplCount > 0;
- const formElement = p.formElement;
-
+ const { formElement } = p;
if (!inTemplate) {
p.formElement = null;
}
-
- if ((formElement || inTemplate) && p.openElements.hasInScope($.FORM)) {
+ if ((formElement || inTemplate) && p.openElements.hasInScope(html_js_1.TAG_ID.FORM)) {
p.openElements.generateImpliedEndTags();
-
if (inTemplate) {
- p.openElements.popUntilTagNamePopped($.FORM);
- } else {
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.FORM);
+ }
+ else if (formElement) {
p.openElements.remove(formElement);
}
}
}
-
function pEndTagInBody(p) {
- if (!p.openElements.hasInButtonScope($.P)) {
- p._insertFakeElement($.P);
+ if (!p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) {
+ p._insertFakeElement(html_js_1.TAG_NAMES.P, html_js_1.TAG_ID.P);
}
-
p._closePElement();
}
-
function liEndTagInBody(p) {
- if (p.openElements.hasInListItemScope($.LI)) {
- p.openElements.generateImpliedEndTagsWithExclusion($.LI);
- p.openElements.popUntilTagNamePopped($.LI);
+ if (p.openElements.hasInListItemScope(html_js_1.TAG_ID.LI)) {
+ p.openElements.generateImpliedEndTagsWithExclusion(html_js_1.TAG_ID.LI);
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.LI);
}
}
-
function ddEndTagInBody(p, token) {
- const tn = token.tagName;
-
+ const tn = token.tagID;
if (p.openElements.hasInScope(tn)) {
p.openElements.generateImpliedEndTagsWithExclusion(tn);
p.openElements.popUntilTagNamePopped(tn);
}
}
-
function numberedHeaderEndTagInBody(p) {
if (p.openElements.hasNumberedHeaderInScope()) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilNumberedHeaderPopped();
}
}
-
function appletEndTagInBody(p, token) {
- const tn = token.tagName;
-
+ const tn = token.tagID;
if (p.openElements.hasInScope(tn)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped(tn);
p.activeFormattingElements.clearToLastMarker();
}
}
-
function brEndTagInBody(p) {
p._reconstructActiveFormattingElements();
- p._insertFakeElement($.BR);
+ p._insertFakeElement(html_js_1.TAG_NAMES.BR, html_js_1.TAG_ID.BR);
p.openElements.pop();
p.framesetOk = false;
}
-
function genericEndTagInBody(p, token) {
const tn = token.tagName;
-
+ const tid = token.tagID;
for (let i = p.openElements.stackTop; i > 0; i--) {
const element = p.openElements.items[i];
-
- if (p.treeAdapter.getTagName(element) === tn) {
- p.openElements.generateImpliedEndTagsWithExclusion(tn);
- p.openElements.popUntilElementPopped(element);
+ const elementId = p.openElements.tagIDs[i];
+ // Compare the tag name here, as the tag might not be a known tag with an ID.
+ if (tid === elementId && (tid !== html_js_1.TAG_ID.UNKNOWN || p.treeAdapter.getTagName(element) === tn)) {
+ p.openElements.generateImpliedEndTagsWithExclusion(tid);
+ if (p.openElements.stackTop >= i)
+ p.openElements.shortenToLength(i);
+ break;
+ }
+ if (p._isSpecialElement(element, elementId)) {
+ break;
+ }
+ }
+}
+function endTagInBody(p, token) {
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.A:
+ case html_js_1.TAG_ID.B:
+ case html_js_1.TAG_ID.I:
+ case html_js_1.TAG_ID.S:
+ case html_js_1.TAG_ID.U:
+ case html_js_1.TAG_ID.EM:
+ case html_js_1.TAG_ID.TT:
+ case html_js_1.TAG_ID.BIG:
+ case html_js_1.TAG_ID.CODE:
+ case html_js_1.TAG_ID.FONT:
+ case html_js_1.TAG_ID.NOBR:
+ case html_js_1.TAG_ID.SMALL:
+ case html_js_1.TAG_ID.STRIKE:
+ case html_js_1.TAG_ID.STRONG: {
+ callAdoptionAgency(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.P: {
+ pEndTagInBody(p);
+ break;
+ }
+ case html_js_1.TAG_ID.DL:
+ case html_js_1.TAG_ID.UL:
+ case html_js_1.TAG_ID.OL:
+ case html_js_1.TAG_ID.DIR:
+ case html_js_1.TAG_ID.DIV:
+ case html_js_1.TAG_ID.NAV:
+ case html_js_1.TAG_ID.PRE:
+ case html_js_1.TAG_ID.MAIN:
+ case html_js_1.TAG_ID.MENU:
+ case html_js_1.TAG_ID.ASIDE:
+ case html_js_1.TAG_ID.CENTER:
+ case html_js_1.TAG_ID.FIGURE:
+ case html_js_1.TAG_ID.FOOTER:
+ case html_js_1.TAG_ID.HEADER:
+ case html_js_1.TAG_ID.HGROUP:
+ case html_js_1.TAG_ID.DIALOG:
+ case html_js_1.TAG_ID.ADDRESS:
+ case html_js_1.TAG_ID.ARTICLE:
+ case html_js_1.TAG_ID.DETAILS:
+ case html_js_1.TAG_ID.SECTION:
+ case html_js_1.TAG_ID.SUMMARY:
+ case html_js_1.TAG_ID.LISTING:
+ case html_js_1.TAG_ID.FIELDSET:
+ case html_js_1.TAG_ID.BLOCKQUOTE:
+ case html_js_1.TAG_ID.FIGCAPTION: {
+ addressEndTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.LI: {
+ liEndTagInBody(p);
+ break;
+ }
+ case html_js_1.TAG_ID.DD:
+ case html_js_1.TAG_ID.DT: {
+ ddEndTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.H1:
+ case html_js_1.TAG_ID.H2:
+ case html_js_1.TAG_ID.H3:
+ case html_js_1.TAG_ID.H4:
+ case html_js_1.TAG_ID.H5:
+ case html_js_1.TAG_ID.H6: {
+ numberedHeaderEndTagInBody(p);
+ break;
+ }
+ case html_js_1.TAG_ID.BR: {
+ brEndTagInBody(p);
+ break;
+ }
+ case html_js_1.TAG_ID.BODY: {
+ bodyEndTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.HTML: {
+ htmlEndTagInBody(p, token);
break;
}
-
- if (p._isSpecialElement(element)) {
+ case html_js_1.TAG_ID.FORM: {
+ formEndTagInBody(p);
break;
}
- }
-}
-
-//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
-//It's faster than using dictionary.
-function endTagInBody(p, token) {
- const tn = token.tagName;
-
- switch (tn.length) {
- case 1:
- if (tn === $.A || tn === $.B || tn === $.I || tn === $.S || tn === $.U) {
- callAdoptionAgency(p, token);
- } else if (tn === $.P) {
- pEndTagInBody(p, token);
- } else {
- genericEndTagInBody(p, token);
- }
-
- break;
-
- case 2:
- if (tn === $.DL || tn === $.UL || tn === $.OL) {
- addressEndTagInBody(p, token);
- } else if (tn === $.LI) {
- liEndTagInBody(p, token);
- } else if (tn === $.DD || tn === $.DT) {
- ddEndTagInBody(p, token);
- } else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) {
- numberedHeaderEndTagInBody(p, token);
- } else if (tn === $.BR) {
- brEndTagInBody(p, token);
- } else if (tn === $.EM || tn === $.TT) {
- callAdoptionAgency(p, token);
- } else {
- genericEndTagInBody(p, token);
- }
-
- break;
-
- case 3:
- if (tn === $.BIG) {
- callAdoptionAgency(p, token);
- } else if (tn === $.DIR || tn === $.DIV || tn === $.NAV || tn === $.PRE) {
- addressEndTagInBody(p, token);
- } else {
- genericEndTagInBody(p, token);
- }
-
- break;
-
- case 4:
- if (tn === $.BODY) {
- bodyEndTagInBody(p, token);
- } else if (tn === $.HTML) {
- htmlEndTagInBody(p, token);
- } else if (tn === $.FORM) {
- formEndTagInBody(p, token);
- } else if (tn === $.CODE || tn === $.FONT || tn === $.NOBR) {
- callAdoptionAgency(p, token);
- } else if (tn === $.MAIN || tn === $.MENU) {
- addressEndTagInBody(p, token);
- } else {
- genericEndTagInBody(p, token);
- }
-
- break;
-
- case 5:
- if (tn === $.ASIDE) {
- addressEndTagInBody(p, token);
- } else if (tn === $.SMALL) {
- callAdoptionAgency(p, token);
- } else {
- genericEndTagInBody(p, token);
- }
-
- break;
-
- case 6:
- if (
- tn === $.CENTER ||
- tn === $.FIGURE ||
- tn === $.FOOTER ||
- tn === $.HEADER ||
- tn === $.HGROUP ||
- tn === $.DIALOG
- ) {
- addressEndTagInBody(p, token);
- } else if (tn === $.APPLET || tn === $.OBJECT) {
- appletEndTagInBody(p, token);
- } else if (tn === $.STRIKE || tn === $.STRONG) {
- callAdoptionAgency(p, token);
- } else {
- genericEndTagInBody(p, token);
- }
-
- break;
-
- case 7:
- if (
- tn === $.ADDRESS ||
- tn === $.ARTICLE ||
- tn === $.DETAILS ||
- tn === $.SECTION ||
- tn === $.SUMMARY ||
- tn === $.LISTING
- ) {
- addressEndTagInBody(p, token);
- } else if (tn === $.MARQUEE) {
- appletEndTagInBody(p, token);
- } else {
- genericEndTagInBody(p, token);
- }
-
- break;
-
- case 8:
- if (tn === $.FIELDSET) {
- addressEndTagInBody(p, token);
- } else if (tn === $.TEMPLATE) {
- endTagInHead(p, token);
- } else {
- genericEndTagInBody(p, token);
- }
-
- break;
-
- case 10:
- if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION) {
- addressEndTagInBody(p, token);
- } else {
- genericEndTagInBody(p, token);
- }
-
+ case html_js_1.TAG_ID.APPLET:
+ case html_js_1.TAG_ID.OBJECT:
+ case html_js_1.TAG_ID.MARQUEE: {
+ appletEndTagInBody(p, token);
break;
-
- default:
+ }
+ case html_js_1.TAG_ID.TEMPLATE: {
+ endTagInHead(p, token);
+ break;
+ }
+ default: {
genericEndTagInBody(p, token);
+ }
}
}
-
function eofInBody(p, token) {
- if (p.tmplInsertionModeStackTop > -1) {
+ if (p.tmplInsertionModeStack.length > 0) {
eofInTemplate(p, token);
- } else {
- p.stopped = true;
+ }
+ else {
+ stopParsing(p, token);
}
}
-
// The "text" insertion mode
//------------------------------------------------------------------
function endTagInText(p, token) {
- if (token.tagName === $.SCRIPT) {
- p.pendingScript = p.openElements.current;
+ var _a;
+ if (token.tagID === html_js_1.TAG_ID.SCRIPT) {
+ (_a = p.scriptHandler) === null || _a === void 0 ? void 0 : _a.call(p, p.openElements.current);
}
-
p.openElements.pop();
p.insertionMode = p.originalInsertionMode;
}
-
function eofInText(p, token) {
- p._err(ERR.eofInElementThatCanContainOnlyText);
+ p._err(token, error_codes_js_1.ERR.eofInElementThatCanContainOnlyText);
p.openElements.pop();
p.insertionMode = p.originalInsertionMode;
- p._processToken(token);
+ p.onEof(token);
}
-
// The "in table" insertion mode
//------------------------------------------------------------------
function characterInTable(p, token) {
- const curTn = p.openElements.currentTagName;
-
- if (curTn === $.TABLE || curTn === $.TBODY || curTn === $.TFOOT || curTn === $.THEAD || curTn === $.TR) {
- p.pendingCharacterTokens = [];
+ if (TABLE_STRUCTURE_TAGS.has(p.openElements.currentTagId)) {
+ p.pendingCharacterTokens.length = 0;
p.hasNonWhitespacePendingCharacterToken = false;
p.originalInsertionMode = p.insertionMode;
- p.insertionMode = IN_TABLE_TEXT_MODE;
- p._processToken(token);
- } else {
+ p.insertionMode = InsertionMode.IN_TABLE_TEXT;
+ switch (token.type) {
+ case token_js_1.TokenType.CHARACTER: {
+ characterInTableText(p, token);
+ break;
+ }
+ case token_js_1.TokenType.WHITESPACE_CHARACTER: {
+ whitespaceCharacterInTableText(p, token);
+ break;
+ }
+ // Ignore null
+ }
+ }
+ else {
tokenInTable(p, token);
}
}
-
function captionStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
p.activeFormattingElements.insertMarker();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_CAPTION_MODE;
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.insertionMode = InsertionMode.IN_CAPTION;
}
-
function colgroupStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_COLUMN_GROUP_MODE;
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.insertionMode = InsertionMode.IN_COLUMN_GROUP;
}
-
function colStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
- p._insertFakeElement($.COLGROUP);
- p.insertionMode = IN_COLUMN_GROUP_MODE;
- p._processToken(token);
+ p._insertFakeElement(html_js_1.TAG_NAMES.COLGROUP, html_js_1.TAG_ID.COLGROUP);
+ p.insertionMode = InsertionMode.IN_COLUMN_GROUP;
+ startTagInColumnGroup(p, token);
}
-
function tbodyStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_TABLE_BODY_MODE;
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.insertionMode = InsertionMode.IN_TABLE_BODY;
}
-
function tdStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
- p._insertFakeElement($.TBODY);
- p.insertionMode = IN_TABLE_BODY_MODE;
- p._processToken(token);
+ p._insertFakeElement(html_js_1.TAG_NAMES.TBODY, html_js_1.TAG_ID.TBODY);
+ p.insertionMode = InsertionMode.IN_TABLE_BODY;
+ startTagInTableBody(p, token);
}
-
function tableStartTagInTable(p, token) {
- if (p.openElements.hasInTableScope($.TABLE)) {
- p.openElements.popUntilTagNamePopped($.TABLE);
+ if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TABLE)) {
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.TABLE);
p._resetInsertionMode();
- p._processToken(token);
+ p._processStartTag(token);
}
}
-
function inputStartTagInTable(p, token) {
- const inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
-
- if (inputType && inputType.toLowerCase() === HIDDEN_INPUT_TYPE) {
- p._appendElement(token, NS.HTML);
- } else {
+ if (isHiddenInput(token)) {
+ p._appendElement(token, html_js_1.NS.HTML);
+ }
+ else {
tokenInTable(p, token);
}
-
token.ackSelfClosing = true;
}
-
function formStartTagInTable(p, token) {
if (!p.formElement && p.openElements.tmplCount === 0) {
- p._insertElement(token, NS.HTML);
+ p._insertElement(token, html_js_1.NS.HTML);
p.formElement = p.openElements.current;
p.openElements.pop();
}
}
-
function startTagInTable(p, token) {
- const tn = token.tagName;
-
- switch (tn.length) {
- case 2:
- if (tn === $.TD || tn === $.TH || tn === $.TR) {
- tdStartTagInTable(p, token);
- } else {
- tokenInTable(p, token);
- }
-
- break;
-
- case 3:
- if (tn === $.COL) {
- colStartTagInTable(p, token);
- } else {
- tokenInTable(p, token);
- }
-
- break;
-
- case 4:
- if (tn === $.FORM) {
- formStartTagInTable(p, token);
- } else {
- tokenInTable(p, token);
- }
-
- break;
-
- case 5:
- if (tn === $.TABLE) {
- tableStartTagInTable(p, token);
- } else if (tn === $.STYLE) {
- startTagInHead(p, token);
- } else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
- tbodyStartTagInTable(p, token);
- } else if (tn === $.INPUT) {
- inputStartTagInTable(p, token);
- } else {
- tokenInTable(p, token);
- }
-
- break;
-
- case 6:
- if (tn === $.SCRIPT) {
- startTagInHead(p, token);
- } else {
- tokenInTable(p, token);
- }
-
- break;
-
- case 7:
- if (tn === $.CAPTION) {
- captionStartTagInTable(p, token);
- } else {
- tokenInTable(p, token);
- }
-
- break;
-
- case 8:
- if (tn === $.COLGROUP) {
- colgroupStartTagInTable(p, token);
- } else if (tn === $.TEMPLATE) {
- startTagInHead(p, token);
- } else {
- tokenInTable(p, token);
- }
-
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.TD:
+ case html_js_1.TAG_ID.TH:
+ case html_js_1.TAG_ID.TR: {
+ tdStartTagInTable(p, token);
break;
-
- default:
+ }
+ case html_js_1.TAG_ID.STYLE:
+ case html_js_1.TAG_ID.SCRIPT:
+ case html_js_1.TAG_ID.TEMPLATE: {
+ startTagInHead(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.COL: {
+ colStartTagInTable(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.FORM: {
+ formStartTagInTable(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.TABLE: {
+ tableStartTagInTable(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.TFOOT:
+ case html_js_1.TAG_ID.THEAD: {
+ tbodyStartTagInTable(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.INPUT: {
+ inputStartTagInTable(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.CAPTION: {
+ captionStartTagInTable(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.COLGROUP: {
+ colgroupStartTagInTable(p, token);
+ break;
+ }
+ default: {
tokenInTable(p, token);
+ }
}
}
-
function endTagInTable(p, token) {
- const tn = token.tagName;
-
- if (tn === $.TABLE) {
- if (p.openElements.hasInTableScope($.TABLE)) {
- p.openElements.popUntilTagNamePopped($.TABLE);
- p._resetInsertionMode();
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.TABLE: {
+ if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TABLE)) {
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.TABLE);
+ p._resetInsertionMode();
+ }
+ break;
+ }
+ case html_js_1.TAG_ID.TEMPLATE: {
+ endTagInHead(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.BODY:
+ case html_js_1.TAG_ID.CAPTION:
+ case html_js_1.TAG_ID.COL:
+ case html_js_1.TAG_ID.COLGROUP:
+ case html_js_1.TAG_ID.HTML:
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.TD:
+ case html_js_1.TAG_ID.TFOOT:
+ case html_js_1.TAG_ID.TH:
+ case html_js_1.TAG_ID.THEAD:
+ case html_js_1.TAG_ID.TR: {
+ // Ignore token
+ break;
+ }
+ default: {
+ tokenInTable(p, token);
}
- } else if (tn === $.TEMPLATE) {
- endTagInHead(p, token);
- } else if (
- tn !== $.BODY &&
- tn !== $.CAPTION &&
- tn !== $.COL &&
- tn !== $.COLGROUP &&
- tn !== $.HTML &&
- tn !== $.TBODY &&
- tn !== $.TD &&
- tn !== $.TFOOT &&
- tn !== $.TH &&
- tn !== $.THEAD &&
- tn !== $.TR
- ) {
- tokenInTable(p, token);
}
}
-
function tokenInTable(p, token) {
const savedFosterParentingState = p.fosterParentingEnabled;
-
p.fosterParentingEnabled = true;
- p._processTokenInBodyMode(token);
+ // Process token in `In Body` mode
+ modeInBody(p, token);
p.fosterParentingEnabled = savedFosterParentingState;
}
-
// The "in table text" insertion mode
//------------------------------------------------------------------
function whitespaceCharacterInTableText(p, token) {
p.pendingCharacterTokens.push(token);
}
-
function characterInTableText(p, token) {
p.pendingCharacterTokens.push(token);
p.hasNonWhitespacePendingCharacterToken = true;
}
-
function tokenInTableText(p, token) {
let i = 0;
-
if (p.hasNonWhitespacePendingCharacterToken) {
for (; i < p.pendingCharacterTokens.length; i++) {
tokenInTable(p, p.pendingCharacterTokens[i]);
}
- } else {
+ }
+ else {
for (; i < p.pendingCharacterTokens.length; i++) {
p._insertCharacters(p.pendingCharacterTokens[i]);
}
}
-
p.insertionMode = p.originalInsertionMode;
p._processToken(token);
}
-
// The "in caption" insertion mode
//------------------------------------------------------------------
+const TABLE_VOID_ELEMENTS = new Set([html_js_1.TAG_ID.CAPTION, html_js_1.TAG_ID.COL, html_js_1.TAG_ID.COLGROUP, html_js_1.TAG_ID.TBODY, html_js_1.TAG_ID.TD, html_js_1.TAG_ID.TFOOT, html_js_1.TAG_ID.TH, html_js_1.TAG_ID.THEAD, html_js_1.TAG_ID.TR]);
function startTagInCaption(p, token) {
- const tn = token.tagName;
-
- if (
- tn === $.CAPTION ||
- tn === $.COL ||
- tn === $.COLGROUP ||
- tn === $.TBODY ||
- tn === $.TD ||
- tn === $.TFOOT ||
- tn === $.TH ||
- tn === $.THEAD ||
- tn === $.TR
- ) {
- if (p.openElements.hasInTableScope($.CAPTION)) {
+ const tn = token.tagID;
+ if (TABLE_VOID_ELEMENTS.has(tn)) {
+ if (p.openElements.hasInTableScope(html_js_1.TAG_ID.CAPTION)) {
p.openElements.generateImpliedEndTags();
- p.openElements.popUntilTagNamePopped($.CAPTION);
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.CAPTION);
p.activeFormattingElements.clearToLastMarker();
- p.insertionMode = IN_TABLE_MODE;
- p._processToken(token);
+ p.insertionMode = InsertionMode.IN_TABLE;
+ startTagInTable(p, token);
}
- } else {
+ }
+ else {
startTagInBody(p, token);
}
}
-
function endTagInCaption(p, token) {
- const tn = token.tagName;
-
- if (tn === $.CAPTION || tn === $.TABLE) {
- if (p.openElements.hasInTableScope($.CAPTION)) {
- p.openElements.generateImpliedEndTags();
- p.openElements.popUntilTagNamePopped($.CAPTION);
- p.activeFormattingElements.clearToLastMarker();
- p.insertionMode = IN_TABLE_MODE;
-
- if (tn === $.TABLE) {
- p._processToken(token);
+ const tn = token.tagID;
+ switch (tn) {
+ case html_js_1.TAG_ID.CAPTION:
+ case html_js_1.TAG_ID.TABLE: {
+ if (p.openElements.hasInTableScope(html_js_1.TAG_ID.CAPTION)) {
+ p.openElements.generateImpliedEndTags();
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.CAPTION);
+ p.activeFormattingElements.clearToLastMarker();
+ p.insertionMode = InsertionMode.IN_TABLE;
+ if (tn === html_js_1.TAG_ID.TABLE) {
+ endTagInTable(p, token);
+ }
}
+ break;
+ }
+ case html_js_1.TAG_ID.BODY:
+ case html_js_1.TAG_ID.COL:
+ case html_js_1.TAG_ID.COLGROUP:
+ case html_js_1.TAG_ID.HTML:
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.TD:
+ case html_js_1.TAG_ID.TFOOT:
+ case html_js_1.TAG_ID.TH:
+ case html_js_1.TAG_ID.THEAD:
+ case html_js_1.TAG_ID.TR: {
+ // Ignore token
+ break;
+ }
+ default: {
+ endTagInBody(p, token);
}
- } else if (
- tn !== $.BODY &&
- tn !== $.COL &&
- tn !== $.COLGROUP &&
- tn !== $.HTML &&
- tn !== $.TBODY &&
- tn !== $.TD &&
- tn !== $.TFOOT &&
- tn !== $.TH &&
- tn !== $.THEAD &&
- tn !== $.TR
- ) {
- endTagInBody(p, token);
- }
-}
-
+ }
+}
// The "in column group" insertion mode
//------------------------------------------------------------------
function startTagInColumnGroup(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HTML) {
- startTagInBody(p, token);
- } else if (tn === $.COL) {
- p._appendElement(token, NS.HTML);
- token.ackSelfClosing = true;
- } else if (tn === $.TEMPLATE) {
- startTagInHead(p, token);
- } else {
- tokenInColumnGroup(p, token);
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.HTML: {
+ startTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.COL: {
+ p._appendElement(token, html_js_1.NS.HTML);
+ token.ackSelfClosing = true;
+ break;
+ }
+ case html_js_1.TAG_ID.TEMPLATE: {
+ startTagInHead(p, token);
+ break;
+ }
+ default: {
+ tokenInColumnGroup(p, token);
+ }
}
}
-
function endTagInColumnGroup(p, token) {
- const tn = token.tagName;
-
- if (tn === $.COLGROUP) {
- if (p.openElements.currentTagName === $.COLGROUP) {
- p.openElements.pop();
- p.insertionMode = IN_TABLE_MODE;
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.COLGROUP: {
+ if (p.openElements.currentTagId === html_js_1.TAG_ID.COLGROUP) {
+ p.openElements.pop();
+ p.insertionMode = InsertionMode.IN_TABLE;
+ }
+ break;
+ }
+ case html_js_1.TAG_ID.TEMPLATE: {
+ endTagInHead(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.COL: {
+ // Ignore token
+ break;
+ }
+ default: {
+ tokenInColumnGroup(p, token);
}
- } else if (tn === $.TEMPLATE) {
- endTagInHead(p, token);
- } else if (tn !== $.COL) {
- tokenInColumnGroup(p, token);
}
}
-
function tokenInColumnGroup(p, token) {
- if (p.openElements.currentTagName === $.COLGROUP) {
+ if (p.openElements.currentTagId === html_js_1.TAG_ID.COLGROUP) {
p.openElements.pop();
- p.insertionMode = IN_TABLE_MODE;
+ p.insertionMode = InsertionMode.IN_TABLE;
p._processToken(token);
}
}
-
// The "in table body" insertion mode
//------------------------------------------------------------------
function startTagInTableBody(p, token) {
- const tn = token.tagName;
-
- if (tn === $.TR) {
- p.openElements.clearBackToTableBodyContext();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_ROW_MODE;
- } else if (tn === $.TH || tn === $.TD) {
- p.openElements.clearBackToTableBodyContext();
- p._insertFakeElement($.TR);
- p.insertionMode = IN_ROW_MODE;
- p._processToken(token);
- } else if (
- tn === $.CAPTION ||
- tn === $.COL ||
- tn === $.COLGROUP ||
- tn === $.TBODY ||
- tn === $.TFOOT ||
- tn === $.THEAD
- ) {
- if (p.openElements.hasTableBodyContextInTableScope()) {
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.TR: {
p.openElements.clearBackToTableBodyContext();
- p.openElements.pop();
- p.insertionMode = IN_TABLE_MODE;
- p._processToken(token);
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.insertionMode = InsertionMode.IN_ROW;
+ break;
+ }
+ case html_js_1.TAG_ID.TH:
+ case html_js_1.TAG_ID.TD: {
+ p.openElements.clearBackToTableBodyContext();
+ p._insertFakeElement(html_js_1.TAG_NAMES.TR, html_js_1.TAG_ID.TR);
+ p.insertionMode = InsertionMode.IN_ROW;
+ startTagInRow(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.CAPTION:
+ case html_js_1.TAG_ID.COL:
+ case html_js_1.TAG_ID.COLGROUP:
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.TFOOT:
+ case html_js_1.TAG_ID.THEAD: {
+ if (p.openElements.hasTableBodyContextInTableScope()) {
+ p.openElements.clearBackToTableBodyContext();
+ p.openElements.pop();
+ p.insertionMode = InsertionMode.IN_TABLE;
+ startTagInTable(p, token);
+ }
+ break;
+ }
+ default: {
+ startTagInTable(p, token);
}
- } else {
- startTagInTable(p, token);
}
}
-
function endTagInTableBody(p, token) {
- const tn = token.tagName;
-
- if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
- if (p.openElements.hasInTableScope(tn)) {
- p.openElements.clearBackToTableBodyContext();
- p.openElements.pop();
- p.insertionMode = IN_TABLE_MODE;
+ const tn = token.tagID;
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.TFOOT:
+ case html_js_1.TAG_ID.THEAD: {
+ if (p.openElements.hasInTableScope(tn)) {
+ p.openElements.clearBackToTableBodyContext();
+ p.openElements.pop();
+ p.insertionMode = InsertionMode.IN_TABLE;
+ }
+ break;
}
- } else if (tn === $.TABLE) {
- if (p.openElements.hasTableBodyContextInTableScope()) {
- p.openElements.clearBackToTableBodyContext();
- p.openElements.pop();
- p.insertionMode = IN_TABLE_MODE;
- p._processToken(token);
+ case html_js_1.TAG_ID.TABLE: {
+ if (p.openElements.hasTableBodyContextInTableScope()) {
+ p.openElements.clearBackToTableBodyContext();
+ p.openElements.pop();
+ p.insertionMode = InsertionMode.IN_TABLE;
+ endTagInTable(p, token);
+ }
+ break;
+ }
+ case html_js_1.TAG_ID.BODY:
+ case html_js_1.TAG_ID.CAPTION:
+ case html_js_1.TAG_ID.COL:
+ case html_js_1.TAG_ID.COLGROUP:
+ case html_js_1.TAG_ID.HTML:
+ case html_js_1.TAG_ID.TD:
+ case html_js_1.TAG_ID.TH:
+ case html_js_1.TAG_ID.TR: {
+ // Ignore token
+ break;
+ }
+ default: {
+ endTagInTable(p, token);
}
- } else if (
- (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP) ||
- (tn !== $.HTML && tn !== $.TD && tn !== $.TH && tn !== $.TR)
- ) {
- endTagInTable(p, token);
}
}
-
// The "in row" insertion mode
//------------------------------------------------------------------
function startTagInRow(p, token) {
- const tn = token.tagName;
-
- if (tn === $.TH || tn === $.TD) {
- p.openElements.clearBackToTableRowContext();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_CELL_MODE;
- p.activeFormattingElements.insertMarker();
- } else if (
- tn === $.CAPTION ||
- tn === $.COL ||
- tn === $.COLGROUP ||
- tn === $.TBODY ||
- tn === $.TFOOT ||
- tn === $.THEAD ||
- tn === $.TR
- ) {
- if (p.openElements.hasInTableScope($.TR)) {
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.TH:
+ case html_js_1.TAG_ID.TD: {
p.openElements.clearBackToTableRowContext();
- p.openElements.pop();
- p.insertionMode = IN_TABLE_BODY_MODE;
- p._processToken(token);
+ p._insertElement(token, html_js_1.NS.HTML);
+ p.insertionMode = InsertionMode.IN_CELL;
+ p.activeFormattingElements.insertMarker();
+ break;
+ }
+ case html_js_1.TAG_ID.CAPTION:
+ case html_js_1.TAG_ID.COL:
+ case html_js_1.TAG_ID.COLGROUP:
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.TFOOT:
+ case html_js_1.TAG_ID.THEAD:
+ case html_js_1.TAG_ID.TR: {
+ if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TR)) {
+ p.openElements.clearBackToTableRowContext();
+ p.openElements.pop();
+ p.insertionMode = InsertionMode.IN_TABLE_BODY;
+ startTagInTableBody(p, token);
+ }
+ break;
+ }
+ default: {
+ startTagInTable(p, token);
}
- } else {
- startTagInTable(p, token);
}
}
-
function endTagInRow(p, token) {
- const tn = token.tagName;
-
- if (tn === $.TR) {
- if (p.openElements.hasInTableScope($.TR)) {
- p.openElements.clearBackToTableRowContext();
- p.openElements.pop();
- p.insertionMode = IN_TABLE_BODY_MODE;
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.TR: {
+ if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TR)) {
+ p.openElements.clearBackToTableRowContext();
+ p.openElements.pop();
+ p.insertionMode = InsertionMode.IN_TABLE_BODY;
+ }
+ break;
}
- } else if (tn === $.TABLE) {
- if (p.openElements.hasInTableScope($.TR)) {
- p.openElements.clearBackToTableRowContext();
- p.openElements.pop();
- p.insertionMode = IN_TABLE_BODY_MODE;
- p._processToken(token);
+ case html_js_1.TAG_ID.TABLE: {
+ if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TR)) {
+ p.openElements.clearBackToTableRowContext();
+ p.openElements.pop();
+ p.insertionMode = InsertionMode.IN_TABLE_BODY;
+ endTagInTableBody(p, token);
+ }
+ break;
}
- } else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
- if (p.openElements.hasInTableScope(tn) || p.openElements.hasInTableScope($.TR)) {
- p.openElements.clearBackToTableRowContext();
- p.openElements.pop();
- p.insertionMode = IN_TABLE_BODY_MODE;
- p._processToken(token);
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.TFOOT:
+ case html_js_1.TAG_ID.THEAD: {
+ if (p.openElements.hasInTableScope(token.tagID) || p.openElements.hasInTableScope(html_js_1.TAG_ID.TR)) {
+ p.openElements.clearBackToTableRowContext();
+ p.openElements.pop();
+ p.insertionMode = InsertionMode.IN_TABLE_BODY;
+ endTagInTableBody(p, token);
+ }
+ break;
}
- } else if (
- (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP) ||
- (tn !== $.HTML && tn !== $.TD && tn !== $.TH)
- ) {
- endTagInTable(p, token);
+ case html_js_1.TAG_ID.BODY:
+ case html_js_1.TAG_ID.CAPTION:
+ case html_js_1.TAG_ID.COL:
+ case html_js_1.TAG_ID.COLGROUP:
+ case html_js_1.TAG_ID.HTML:
+ case html_js_1.TAG_ID.TD:
+ case html_js_1.TAG_ID.TH: {
+ // Ignore end tag
+ break;
+ }
+ default:
+ endTagInTable(p, token);
}
}
-
// The "in cell" insertion mode
//------------------------------------------------------------------
function startTagInCell(p, token) {
- const tn = token.tagName;
-
- if (
- tn === $.CAPTION ||
- tn === $.COL ||
- tn === $.COLGROUP ||
- tn === $.TBODY ||
- tn === $.TD ||
- tn === $.TFOOT ||
- tn === $.TH ||
- tn === $.THEAD ||
- tn === $.TR
- ) {
- if (p.openElements.hasInTableScope($.TD) || p.openElements.hasInTableScope($.TH)) {
+ const tn = token.tagID;
+ if (TABLE_VOID_ELEMENTS.has(tn)) {
+ if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TD) || p.openElements.hasInTableScope(html_js_1.TAG_ID.TH)) {
p._closeTableCell();
- p._processToken(token);
+ startTagInRow(p, token);
}
- } else {
+ }
+ else {
startTagInBody(p, token);
}
}
-
function endTagInCell(p, token) {
- const tn = token.tagName;
-
- if (tn === $.TD || tn === $.TH) {
- if (p.openElements.hasInTableScope(tn)) {
- p.openElements.generateImpliedEndTags();
- p.openElements.popUntilTagNamePopped(tn);
- p.activeFormattingElements.clearToLastMarker();
- p.insertionMode = IN_ROW_MODE;
+ const tn = token.tagID;
+ switch (tn) {
+ case html_js_1.TAG_ID.TD:
+ case html_js_1.TAG_ID.TH: {
+ if (p.openElements.hasInTableScope(tn)) {
+ p.openElements.generateImpliedEndTags();
+ p.openElements.popUntilTagNamePopped(tn);
+ p.activeFormattingElements.clearToLastMarker();
+ p.insertionMode = InsertionMode.IN_ROW;
+ }
+ break;
}
- } else if (tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR) {
- if (p.openElements.hasInTableScope(tn)) {
- p._closeTableCell();
- p._processToken(token);
+ case html_js_1.TAG_ID.TABLE:
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.TFOOT:
+ case html_js_1.TAG_ID.THEAD:
+ case html_js_1.TAG_ID.TR: {
+ if (p.openElements.hasInTableScope(tn)) {
+ p._closeTableCell();
+ endTagInRow(p, token);
+ }
+ break;
+ }
+ case html_js_1.TAG_ID.BODY:
+ case html_js_1.TAG_ID.CAPTION:
+ case html_js_1.TAG_ID.COL:
+ case html_js_1.TAG_ID.COLGROUP:
+ case html_js_1.TAG_ID.HTML: {
+ // Ignore token
+ break;
+ }
+ default: {
+ endTagInBody(p, token);
}
- } else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML) {
- endTagInBody(p, token);
}
}
-
// The "in select" insertion mode
//------------------------------------------------------------------
function startTagInSelect(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HTML) {
- startTagInBody(p, token);
- } else if (tn === $.OPTION) {
- if (p.openElements.currentTagName === $.OPTION) {
- p.openElements.pop();
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.HTML: {
+ startTagInBody(p, token);
+ break;
}
-
- p._insertElement(token, NS.HTML);
- } else if (tn === $.OPTGROUP) {
- if (p.openElements.currentTagName === $.OPTION) {
- p.openElements.pop();
+ case html_js_1.TAG_ID.OPTION: {
+ if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTION) {
+ p.openElements.pop();
+ }
+ p._insertElement(token, html_js_1.NS.HTML);
+ break;
}
-
- if (p.openElements.currentTagName === $.OPTGROUP) {
- p.openElements.pop();
+ case html_js_1.TAG_ID.OPTGROUP: {
+ if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTION) {
+ p.openElements.pop();
+ }
+ if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTGROUP) {
+ p.openElements.pop();
+ }
+ p._insertElement(token, html_js_1.NS.HTML);
+ break;
}
-
- p._insertElement(token, NS.HTML);
- } else if (tn === $.INPUT || tn === $.KEYGEN || tn === $.TEXTAREA || tn === $.SELECT) {
- if (p.openElements.hasInSelectScope($.SELECT)) {
- p.openElements.popUntilTagNamePopped($.SELECT);
- p._resetInsertionMode();
-
- if (tn !== $.SELECT) {
- p._processToken(token);
+ case html_js_1.TAG_ID.INPUT:
+ case html_js_1.TAG_ID.KEYGEN:
+ case html_js_1.TAG_ID.TEXTAREA:
+ case html_js_1.TAG_ID.SELECT: {
+ if (p.openElements.hasInSelectScope(html_js_1.TAG_ID.SELECT)) {
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.SELECT);
+ p._resetInsertionMode();
+ if (token.tagID !== html_js_1.TAG_ID.SELECT) {
+ p._processStartTag(token);
+ }
}
+ break;
}
- } else if (tn === $.SCRIPT || tn === $.TEMPLATE) {
- startTagInHead(p, token);
+ case html_js_1.TAG_ID.SCRIPT:
+ case html_js_1.TAG_ID.TEMPLATE: {
+ startTagInHead(p, token);
+ break;
+ }
+ default:
+ // Do nothing
}
}
-
function endTagInSelect(p, token) {
- const tn = token.tagName;
-
- if (tn === $.OPTGROUP) {
- const prevOpenElement = p.openElements.items[p.openElements.stackTop - 1];
- const prevOpenElementTn = prevOpenElement && p.treeAdapter.getTagName(prevOpenElement);
-
- if (p.openElements.currentTagName === $.OPTION && prevOpenElementTn === $.OPTGROUP) {
- p.openElements.pop();
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.OPTGROUP: {
+ if (p.openElements.stackTop > 0 &&
+ p.openElements.currentTagId === html_js_1.TAG_ID.OPTION &&
+ p.openElements.tagIDs[p.openElements.stackTop - 1] === html_js_1.TAG_ID.OPTGROUP) {
+ p.openElements.pop();
+ }
+ if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTGROUP) {
+ p.openElements.pop();
+ }
+ break;
}
-
- if (p.openElements.currentTagName === $.OPTGROUP) {
- p.openElements.pop();
+ case html_js_1.TAG_ID.OPTION: {
+ if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTION) {
+ p.openElements.pop();
+ }
+ break;
}
- } else if (tn === $.OPTION) {
- if (p.openElements.currentTagName === $.OPTION) {
- p.openElements.pop();
+ case html_js_1.TAG_ID.SELECT: {
+ if (p.openElements.hasInSelectScope(html_js_1.TAG_ID.SELECT)) {
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.SELECT);
+ p._resetInsertionMode();
+ }
+ break;
}
- } else if (tn === $.SELECT && p.openElements.hasInSelectScope($.SELECT)) {
- p.openElements.popUntilTagNamePopped($.SELECT);
- p._resetInsertionMode();
- } else if (tn === $.TEMPLATE) {
- endTagInHead(p, token);
+ case html_js_1.TAG_ID.TEMPLATE: {
+ endTagInHead(p, token);
+ break;
+ }
+ default:
+ // Do nothing
}
}
-
-//12.2.5.4.17 The "in select in table" insertion mode
+// The "in select in table" insertion mode
//------------------------------------------------------------------
function startTagInSelectInTable(p, token) {
- const tn = token.tagName;
-
- if (
- tn === $.CAPTION ||
- tn === $.TABLE ||
- tn === $.TBODY ||
- tn === $.TFOOT ||
- tn === $.THEAD ||
- tn === $.TR ||
- tn === $.TD ||
- tn === $.TH
- ) {
- p.openElements.popUntilTagNamePopped($.SELECT);
+ const tn = token.tagID;
+ if (tn === html_js_1.TAG_ID.CAPTION ||
+ tn === html_js_1.TAG_ID.TABLE ||
+ tn === html_js_1.TAG_ID.TBODY ||
+ tn === html_js_1.TAG_ID.TFOOT ||
+ tn === html_js_1.TAG_ID.THEAD ||
+ tn === html_js_1.TAG_ID.TR ||
+ tn === html_js_1.TAG_ID.TD ||
+ tn === html_js_1.TAG_ID.TH) {
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.SELECT);
p._resetInsertionMode();
- p._processToken(token);
- } else {
+ p._processStartTag(token);
+ }
+ else {
startTagInSelect(p, token);
}
}
-
function endTagInSelectInTable(p, token) {
- const tn = token.tagName;
-
- if (
- tn === $.CAPTION ||
- tn === $.TABLE ||
- tn === $.TBODY ||
- tn === $.TFOOT ||
- tn === $.THEAD ||
- tn === $.TR ||
- tn === $.TD ||
- tn === $.TH
- ) {
+ const tn = token.tagID;
+ if (tn === html_js_1.TAG_ID.CAPTION ||
+ tn === html_js_1.TAG_ID.TABLE ||
+ tn === html_js_1.TAG_ID.TBODY ||
+ tn === html_js_1.TAG_ID.TFOOT ||
+ tn === html_js_1.TAG_ID.THEAD ||
+ tn === html_js_1.TAG_ID.TR ||
+ tn === html_js_1.TAG_ID.TD ||
+ tn === html_js_1.TAG_ID.TH) {
if (p.openElements.hasInTableScope(tn)) {
- p.openElements.popUntilTagNamePopped($.SELECT);
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.SELECT);
p._resetInsertionMode();
- p._processToken(token);
+ p.onEndTag(token);
}
- } else {
+ }
+ else {
endTagInSelect(p, token);
}
}
-
// The "in template" insertion mode
//------------------------------------------------------------------
function startTagInTemplate(p, token) {
- const tn = token.tagName;
-
- if (
- tn === $.BASE ||
- tn === $.BASEFONT ||
- tn === $.BGSOUND ||
- tn === $.LINK ||
- tn === $.META ||
- tn === $.NOFRAMES ||
- tn === $.SCRIPT ||
- tn === $.STYLE ||
- tn === $.TEMPLATE ||
- tn === $.TITLE
- ) {
- startTagInHead(p, token);
- } else {
- const newInsertionMode = TEMPLATE_INSERTION_MODE_SWITCH_MAP[tn] || IN_BODY_MODE;
-
- p._popTmplInsertionMode();
- p._pushTmplInsertionMode(newInsertionMode);
- p.insertionMode = newInsertionMode;
- p._processToken(token);
+ switch (token.tagID) {
+ // First, handle tags that can start without a mode change
+ case html_js_1.TAG_ID.BASE:
+ case html_js_1.TAG_ID.BASEFONT:
+ case html_js_1.TAG_ID.BGSOUND:
+ case html_js_1.TAG_ID.LINK:
+ case html_js_1.TAG_ID.META:
+ case html_js_1.TAG_ID.NOFRAMES:
+ case html_js_1.TAG_ID.SCRIPT:
+ case html_js_1.TAG_ID.STYLE:
+ case html_js_1.TAG_ID.TEMPLATE:
+ case html_js_1.TAG_ID.TITLE:
+ startTagInHead(p, token);
+ break;
+ // Re-process the token in the appropriate mode
+ case html_js_1.TAG_ID.CAPTION:
+ case html_js_1.TAG_ID.COLGROUP:
+ case html_js_1.TAG_ID.TBODY:
+ case html_js_1.TAG_ID.TFOOT:
+ case html_js_1.TAG_ID.THEAD:
+ p.tmplInsertionModeStack[0] = InsertionMode.IN_TABLE;
+ p.insertionMode = InsertionMode.IN_TABLE;
+ startTagInTable(p, token);
+ break;
+ case html_js_1.TAG_ID.COL:
+ p.tmplInsertionModeStack[0] = InsertionMode.IN_COLUMN_GROUP;
+ p.insertionMode = InsertionMode.IN_COLUMN_GROUP;
+ startTagInColumnGroup(p, token);
+ break;
+ case html_js_1.TAG_ID.TR:
+ p.tmplInsertionModeStack[0] = InsertionMode.IN_TABLE_BODY;
+ p.insertionMode = InsertionMode.IN_TABLE_BODY;
+ startTagInTableBody(p, token);
+ break;
+ case html_js_1.TAG_ID.TD:
+ case html_js_1.TAG_ID.TH:
+ p.tmplInsertionModeStack[0] = InsertionMode.IN_ROW;
+ p.insertionMode = InsertionMode.IN_ROW;
+ startTagInRow(p, token);
+ break;
+ default:
+ p.tmplInsertionModeStack[0] = InsertionMode.IN_BODY;
+ p.insertionMode = InsertionMode.IN_BODY;
+ startTagInBody(p, token);
}
}
-
function endTagInTemplate(p, token) {
- if (token.tagName === $.TEMPLATE) {
+ if (token.tagID === html_js_1.TAG_ID.TEMPLATE) {
endTagInHead(p, token);
}
}
-
function eofInTemplate(p, token) {
if (p.openElements.tmplCount > 0) {
- p.openElements.popUntilTagNamePopped($.TEMPLATE);
+ p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.TEMPLATE);
p.activeFormattingElements.clearToLastMarker();
- p._popTmplInsertionMode();
+ p.tmplInsertionModeStack.shift();
p._resetInsertionMode();
- p._processToken(token);
- } else {
- p.stopped = true;
+ p.onEof(token);
+ }
+ else {
+ stopParsing(p, token);
}
}
-
// The "after body" insertion mode
//------------------------------------------------------------------
function startTagAfterBody(p, token) {
- if (token.tagName === $.HTML) {
+ if (token.tagID === html_js_1.TAG_ID.HTML) {
startTagInBody(p, token);
- } else {
+ }
+ else {
tokenAfterBody(p, token);
}
}
-
function endTagAfterBody(p, token) {
- if (token.tagName === $.HTML) {
+ var _a;
+ if (token.tagID === html_js_1.TAG_ID.HTML) {
if (!p.fragmentContext) {
- p.insertionMode = AFTER_AFTER_BODY_MODE;
+ p.insertionMode = InsertionMode.AFTER_AFTER_BODY;
+ }
+ //NOTE: is never popped from the stack, so we need to updated
+ //the end location explicitly.
+ if (p.options.sourceCodeLocationInfo && p.openElements.tagIDs[0] === html_js_1.TAG_ID.HTML) {
+ p._setEndLocation(p.openElements.items[0], token);
+ // Update the body element, if it doesn't have an end tag
+ const bodyElement = p.openElements.items[1];
+ if (bodyElement && !((_a = p.treeAdapter.getNodeSourceCodeLocation(bodyElement)) === null || _a === void 0 ? void 0 : _a.endTag)) {
+ p._setEndLocation(bodyElement, token);
+ }
}
- } else {
+ }
+ else {
tokenAfterBody(p, token);
}
}
-
function tokenAfterBody(p, token) {
- p.insertionMode = IN_BODY_MODE;
- p._processToken(token);
+ p.insertionMode = InsertionMode.IN_BODY;
+ modeInBody(p, token);
}
-
// The "in frameset" insertion mode
//------------------------------------------------------------------
function startTagInFrameset(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HTML) {
- startTagInBody(p, token);
- } else if (tn === $.FRAMESET) {
- p._insertElement(token, NS.HTML);
- } else if (tn === $.FRAME) {
- p._appendElement(token, NS.HTML);
- token.ackSelfClosing = true;
- } else if (tn === $.NOFRAMES) {
- startTagInHead(p, token);
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.HTML: {
+ startTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.FRAMESET: {
+ p._insertElement(token, html_js_1.NS.HTML);
+ break;
+ }
+ case html_js_1.TAG_ID.FRAME: {
+ p._appendElement(token, html_js_1.NS.HTML);
+ token.ackSelfClosing = true;
+ break;
+ }
+ case html_js_1.TAG_ID.NOFRAMES: {
+ startTagInHead(p, token);
+ break;
+ }
+ default:
+ // Do nothing
}
}
-
function endTagInFrameset(p, token) {
- if (token.tagName === $.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) {
+ if (token.tagID === html_js_1.TAG_ID.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) {
p.openElements.pop();
-
- if (!p.fragmentContext && p.openElements.currentTagName !== $.FRAMESET) {
- p.insertionMode = AFTER_FRAMESET_MODE;
+ if (!p.fragmentContext && p.openElements.currentTagId !== html_js_1.TAG_ID.FRAMESET) {
+ p.insertionMode = InsertionMode.AFTER_FRAMESET;
}
}
}
-
// The "after frameset" insertion mode
//------------------------------------------------------------------
function startTagAfterFrameset(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HTML) {
- startTagInBody(p, token);
- } else if (tn === $.NOFRAMES) {
- startTagInHead(p, token);
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.HTML: {
+ startTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.NOFRAMES: {
+ startTagInHead(p, token);
+ break;
+ }
+ default:
+ // Do nothing
}
}
-
function endTagAfterFrameset(p, token) {
- if (token.tagName === $.HTML) {
- p.insertionMode = AFTER_AFTER_FRAMESET_MODE;
+ if (token.tagID === html_js_1.TAG_ID.HTML) {
+ p.insertionMode = InsertionMode.AFTER_AFTER_FRAMESET;
}
}
-
// The "after after body" insertion mode
//------------------------------------------------------------------
function startTagAfterAfterBody(p, token) {
- if (token.tagName === $.HTML) {
+ if (token.tagID === html_js_1.TAG_ID.HTML) {
startTagInBody(p, token);
- } else {
+ }
+ else {
tokenAfterAfterBody(p, token);
}
}
-
function tokenAfterAfterBody(p, token) {
- p.insertionMode = IN_BODY_MODE;
- p._processToken(token);
+ p.insertionMode = InsertionMode.IN_BODY;
+ modeInBody(p, token);
}
-
// The "after after frameset" insertion mode
//------------------------------------------------------------------
function startTagAfterAfterFrameset(p, token) {
- const tn = token.tagName;
-
- if (tn === $.HTML) {
- startTagInBody(p, token);
- } else if (tn === $.NOFRAMES) {
- startTagInHead(p, token);
+ switch (token.tagID) {
+ case html_js_1.TAG_ID.HTML: {
+ startTagInBody(p, token);
+ break;
+ }
+ case html_js_1.TAG_ID.NOFRAMES: {
+ startTagInHead(p, token);
+ break;
+ }
+ default:
+ // Do nothing
}
}
-
// The rules for parsing tokens in foreign content
//------------------------------------------------------------------
function nullCharacterInForeignContent(p, token) {
token.chars = unicode.REPLACEMENT_CHARACTER;
p._insertCharacters(token);
}
-
function characterInForeignContent(p, token) {
p._insertCharacters(token);
p.framesetOk = false;
}
-
+function popUntilHtmlOrIntegrationPoint(p) {
+ while (p.treeAdapter.getNamespaceURI(p.openElements.current) !== html_js_1.NS.HTML &&
+ !p._isIntegrationPoint(p.openElements.currentTagId, p.openElements.current)) {
+ p.openElements.pop();
+ }
+}
function startTagInForeignContent(p, token) {
- if (foreignContent.causesExit(token) && !p.fragmentContext) {
- while (
- p.treeAdapter.getNamespaceURI(p.openElements.current) !== NS.HTML &&
- !p._isIntegrationPoint(p.openElements.current)
- ) {
- p.openElements.pop();
- }
-
- p._processToken(token);
- } else {
+ if (foreignContent.causesExit(token)) {
+ popUntilHtmlOrIntegrationPoint(p);
+ p._startTagOutsideForeignContent(token);
+ }
+ else {
const current = p._getAdjustedCurrentElement();
const currentNs = p.treeAdapter.getNamespaceURI(current);
-
- if (currentNs === NS.MATHML) {
+ if (currentNs === html_js_1.NS.MATHML) {
foreignContent.adjustTokenMathMLAttrs(token);
- } else if (currentNs === NS.SVG) {
+ }
+ else if (currentNs === html_js_1.NS.SVG) {
foreignContent.adjustTokenSVGTagName(token);
foreignContent.adjustTokenSVGAttrs(token);
}
-
foreignContent.adjustTokenXMLAttrs(token);
-
if (token.selfClosing) {
p._appendElement(token, currentNs);
- } else {
+ }
+ else {
p._insertElement(token, currentNs);
}
-
token.ackSelfClosing = true;
}
}
-
function endTagInForeignContent(p, token) {
+ if (token.tagID === html_js_1.TAG_ID.P || token.tagID === html_js_1.TAG_ID.BR) {
+ popUntilHtmlOrIntegrationPoint(p);
+ p._endTagOutsideForeignContent(token);
+ return;
+ }
for (let i = p.openElements.stackTop; i > 0; i--) {
const element = p.openElements.items[i];
-
- if (p.treeAdapter.getNamespaceURI(element) === NS.HTML) {
- p._processToken(token);
+ if (p.treeAdapter.getNamespaceURI(element) === html_js_1.NS.HTML) {
+ p._endTagOutsideForeignContent(token);
break;
}
-
- if (p.treeAdapter.getTagName(element).toLowerCase() === token.tagName) {
- p.openElements.popUntilElementPopped(element);
+ const tagName = p.treeAdapter.getTagName(element);
+ if (tagName.toLowerCase() === token.tagName) {
+ //NOTE: update the token tag name for `_setEndLocation`.
+ token.tagName = tagName;
+ p.openElements.shortenToLength(i);
break;
}
}
}
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/index.js.map b/packages/parse5/lib/parser/index.js.map
new file mode 100644
index 0000000..2c620fa
--- /dev/null
+++ b/packages/parse5/lib/parser/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/parser/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/open-element-stack.d.ts b/packages/parse5/lib/parser/open-element-stack.d.ts
new file mode 100644
index 0000000..7531aa6
--- /dev/null
+++ b/packages/parse5/lib/parser/open-element-stack.d.ts
@@ -0,0 +1,53 @@
+import { TAG_ID as $ } from '../common/html.js';
+import type { TreeAdapter, TreeAdapterTypeMap } from '../tree-adapters/interface';
+export interface StackHandler {
+ onItemPush: (node: T['parentNode'], tid: number, isTop: boolean) => void;
+ onItemPop: (node: T['parentNode'], isTop: boolean) => void;
+}
+export declare class OpenElementStack {
+ private treeAdapter;
+ private handler;
+ items: T['parentNode'][];
+ tagIDs: $[];
+ current: T['parentNode'];
+ stackTop: number;
+ tmplCount: number;
+ currentTagId: $;
+ get currentTmplContentOrNode(): T['parentNode'];
+ constructor(document: T['document'], treeAdapter: TreeAdapter, handler: StackHandler);
+ private _indexOf;
+ private _isInTemplate;
+ private _updateCurrentElement;
+ push(element: T['element'], tagID: $): void;
+ pop(): void;
+ replace(oldElement: T['element'], newElement: T['element']): void;
+ insertAfter(referenceElement: T['element'], newElement: T['element'], newElementID: $): void;
+ popUntilTagNamePopped(tagName: $): void;
+ shortenToLength(idx: number): void;
+ popUntilElementPopped(element: T['element']): void;
+ private popUntilPopped;
+ popUntilNumberedHeaderPopped(): void;
+ popUntilTableCellPopped(): void;
+ popAllUpToHtmlElement(): void;
+ private _indexOfTagNames;
+ private clearBackTo;
+ clearBackToTableContext(): void;
+ clearBackToTableBodyContext(): void;
+ clearBackToTableRowContext(): void;
+ remove(element: T['element']): void;
+ tryPeekProperlyNestedBodyElement(): T['element'] | null;
+ contains(element: T['element']): boolean;
+ getCommonAncestor(element: T['element']): T['element'] | null;
+ isRootHtmlElementCurrent(): boolean;
+ hasInScope(tagName: $): boolean;
+ hasNumberedHeaderInScope(): boolean;
+ hasInListItemScope(tagName: $): boolean;
+ hasInButtonScope(tagName: $): boolean;
+ hasInTableScope(tagName: $): boolean;
+ hasTableBodyContextInTableScope(): boolean;
+ hasInSelectScope(tagName: $): boolean;
+ generateImpliedEndTags(): void;
+ generateImpliedEndTagsThoroughly(): void;
+ generateImpliedEndTagsWithExclusion(exclusionId: $): void;
+}
+//# sourceMappingURL=open-element-stack.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/open-element-stack.d.ts.map b/packages/parse5/lib/parser/open-element-stack.d.ts.map
new file mode 100644
index 0000000..fb6f87a
--- /dev/null
+++ b/packages/parse5/lib/parser/open-element-stack.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"open-element-stack.d.ts","sourceRoot":"","sources":["../../../lib/parser/open-element-stack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAwB,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AA0ClF,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,kBAAkB;IACtD,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzE,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9D;AAGD,qBAAa,gBAAgB,CAAC,CAAC,SAAS,kBAAkB;IAajB,OAAO,CAAC,WAAW;IAAkB,OAAO,CAAC,OAAO;IAZzF,KAAK,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,CAAM;IAC9B,MAAM,EAAE,CAAC,EAAE,CAAM;IACjB,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;IACzB,QAAQ,SAAM;IACd,SAAS,SAAK;IAEd,YAAY,IAAa;IAEzB,IAAI,wBAAwB,IAAI,CAAC,CAAC,YAAY,CAAC,CAE9C;gBAEW,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,EAAU,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,EAAU,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAK1G,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,qBAAqB;IAM7B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAe3C,GAAG,IAAI,IAAI;IAYX,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI;IAUjE,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,IAAI;IAc5F,qBAAqB,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI;IAUvC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAelC,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI;IAKlD,OAAO,CAAC,cAAc;IAKtB,4BAA4B,IAAI,IAAI;IAIpC,uBAAuB,IAAI,IAAI;IAI/B,qBAAqB,IAAI,IAAI;IAO7B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,WAAW;IAKnB,uBAAuB,IAAI,IAAI;IAI/B,2BAA2B,IAAI,IAAI;IAInC,0BAA0B,IAAI,IAAI;IAIlC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI;IAiBnC,gCAAgC,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI;IAKvD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,OAAO;IAIxC,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI;IAM7D,wBAAwB,IAAI,OAAO;IAKnC,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAiB/B,wBAAwB,IAAI,OAAO;IAiBnC,kBAAkB,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAiBvC,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAiBrC,eAAe,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAqBpC,+BAA+B,IAAI,OAAO;IAqB1C,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAsBrC,sBAAsB,IAAI,IAAI;IAM9B,gCAAgC,IAAI,IAAI;IAMxC,mCAAmC,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI;CAK5D"}
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/open-element-stack.js b/packages/parse5/lib/parser/open-element-stack.js
index c10880a..c36c892 100644
--- a/packages/parse5/lib/parser/open-element-stack.js
+++ b/packages/parse5/lib/parser/open-element-stack.js
@@ -1,482 +1,316 @@
-'use strict';
-
-const HTML = require('../common/html');
-
-//Aliases
-const $ = HTML.TAG_NAMES;
-const NS = HTML.NAMESPACES;
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.OpenElementStack = void 0;
+const html_js_1 = require("../common/html.js");
//Element utils
-
-//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
-//It's faster than using dictionary.
-function isImpliedEndTagRequired(tn) {
- switch (tn.length) {
- case 1:
- return tn === $.P;
-
- case 2:
- return tn === $.RB || tn === $.RP || tn === $.RT || tn === $.DD || tn === $.DT || tn === $.LI;
-
- case 3:
- return tn === $.RTC;
-
- case 6:
- return tn === $.OPTION;
-
- case 8:
- return tn === $.OPTGROUP;
- }
-
- return false;
-}
-
-function isImpliedEndTagRequiredThoroughly(tn) {
- switch (tn.length) {
- case 1:
- return tn === $.P;
-
- case 2:
- return (
- tn === $.RB ||
- tn === $.RP ||
- tn === $.RT ||
- tn === $.DD ||
- tn === $.DT ||
- tn === $.LI ||
- tn === $.TD ||
- tn === $.TH ||
- tn === $.TR
- );
-
- case 3:
- return tn === $.RTC;
-
- case 5:
- return tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD;
-
- case 6:
- return tn === $.OPTION;
-
- case 7:
- return tn === $.CAPTION;
-
- case 8:
- return tn === $.OPTGROUP || tn === $.COLGROUP;
- }
-
- return false;
-}
-
-function isScopingElement(tn, ns) {
- switch (tn.length) {
- case 2:
- if (tn === $.TD || tn === $.TH) {
- return ns === NS.HTML;
- } else if (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS) {
- return ns === NS.MATHML;
- }
-
- break;
-
- case 4:
- if (tn === $.HTML) {
- return ns === NS.HTML;
- } else if (tn === $.DESC) {
- return ns === NS.SVG;
- }
-
- break;
-
- case 5:
- if (tn === $.TABLE) {
- return ns === NS.HTML;
- } else if (tn === $.MTEXT) {
- return ns === NS.MATHML;
- } else if (tn === $.TITLE) {
- return ns === NS.SVG;
- }
-
- break;
-
- case 6:
- return (tn === $.APPLET || tn === $.OBJECT) && ns === NS.HTML;
-
- case 7:
- return (tn === $.CAPTION || tn === $.MARQUEE) && ns === NS.HTML;
-
- case 8:
- return tn === $.TEMPLATE && ns === NS.HTML;
-
- case 13:
- return tn === $.FOREIGN_OBJECT && ns === NS.SVG;
-
- case 14:
- return tn === $.ANNOTATION_XML && ns === NS.MATHML;
- }
-
- return false;
-}
-
+const IMPLICIT_END_TAG_REQUIRED = new Set([html_js_1.TAG_ID.DD, html_js_1.TAG_ID.DT, html_js_1.TAG_ID.LI, html_js_1.TAG_ID.OPTGROUP, html_js_1.TAG_ID.OPTION, html_js_1.TAG_ID.P, html_js_1.TAG_ID.RB, html_js_1.TAG_ID.RP, html_js_1.TAG_ID.RT, html_js_1.TAG_ID.RTC]);
+const IMPLICIT_END_TAG_REQUIRED_THOROUGHLY = new Set([
+ ...IMPLICIT_END_TAG_REQUIRED,
+ html_js_1.TAG_ID.CAPTION,
+ html_js_1.TAG_ID.COLGROUP,
+ html_js_1.TAG_ID.TBODY,
+ html_js_1.TAG_ID.TD,
+ html_js_1.TAG_ID.TFOOT,
+ html_js_1.TAG_ID.TH,
+ html_js_1.TAG_ID.THEAD,
+ html_js_1.TAG_ID.TR,
+]);
+const SCOPING_ELEMENT_NS = new Map([
+ [html_js_1.TAG_ID.APPLET, html_js_1.NS.HTML],
+ [html_js_1.TAG_ID.CAPTION, html_js_1.NS.HTML],
+ [html_js_1.TAG_ID.HTML, html_js_1.NS.HTML],
+ [html_js_1.TAG_ID.MARQUEE, html_js_1.NS.HTML],
+ [html_js_1.TAG_ID.OBJECT, html_js_1.NS.HTML],
+ [html_js_1.TAG_ID.TABLE, html_js_1.NS.HTML],
+ [html_js_1.TAG_ID.TD, html_js_1.NS.HTML],
+ [html_js_1.TAG_ID.TEMPLATE, html_js_1.NS.HTML],
+ [html_js_1.TAG_ID.TH, html_js_1.NS.HTML],
+ [html_js_1.TAG_ID.ANNOTATION_XML, html_js_1.NS.MATHML],
+ [html_js_1.TAG_ID.MI, html_js_1.NS.MATHML],
+ [html_js_1.TAG_ID.MN, html_js_1.NS.MATHML],
+ [html_js_1.TAG_ID.MO, html_js_1.NS.MATHML],
+ [html_js_1.TAG_ID.MS, html_js_1.NS.MATHML],
+ [html_js_1.TAG_ID.MTEXT, html_js_1.NS.MATHML],
+ [html_js_1.TAG_ID.DESC, html_js_1.NS.SVG],
+ [html_js_1.TAG_ID.FOREIGN_OBJECT, html_js_1.NS.SVG],
+ [html_js_1.TAG_ID.TITLE, html_js_1.NS.SVG],
+]);
+const NAMED_HEADERS = [html_js_1.TAG_ID.H1, html_js_1.TAG_ID.H2, html_js_1.TAG_ID.H3, html_js_1.TAG_ID.H4, html_js_1.TAG_ID.H5, html_js_1.TAG_ID.H6];
+const TABLE_ROW_CONTEXT = [html_js_1.TAG_ID.TR, html_js_1.TAG_ID.TEMPLATE, html_js_1.TAG_ID.HTML];
+const TABLE_BODY_CONTEXT = [html_js_1.TAG_ID.TBODY, html_js_1.TAG_ID.TFOOT, html_js_1.TAG_ID.THEAD, html_js_1.TAG_ID.TEMPLATE, html_js_1.TAG_ID.HTML];
+const TABLE_CONTEXT = [html_js_1.TAG_ID.TABLE, html_js_1.TAG_ID.TEMPLATE, html_js_1.TAG_ID.HTML];
+const TABLE_CELLS = [html_js_1.TAG_ID.TD, html_js_1.TAG_ID.TH];
//Stack of open elements
class OpenElementStack {
- constructor(document, treeAdapter) {
- this.stackTop = -1;
+ constructor(document, treeAdapter, handler) {
+ this.treeAdapter = treeAdapter;
+ this.handler = handler;
this.items = [];
- this.current = document;
- this.currentTagName = null;
- this.currentTmplContent = null;
+ this.tagIDs = [];
+ this.stackTop = -1;
this.tmplCount = 0;
- this.treeAdapter = treeAdapter;
+ this.currentTagId = html_js_1.TAG_ID.UNKNOWN;
+ this.current = document;
+ }
+ get currentTmplContentOrNode() {
+ return this._isInTemplate() ? this.treeAdapter.getTemplateContent(this.current) : this.current;
}
-
//Index of element
_indexOf(element) {
- let idx = -1;
-
- for (let i = this.stackTop; i >= 0; i--) {
- if (this.items[i] === element) {
- idx = i;
- break;
- }
- }
- return idx;
+ return this.items.lastIndexOf(element, this.stackTop);
}
-
//Update current element
_isInTemplate() {
- return this.currentTagName === $.TEMPLATE && this.treeAdapter.getNamespaceURI(this.current) === NS.HTML;
+ return this.currentTagId === html_js_1.TAG_ID.TEMPLATE && this.treeAdapter.getNamespaceURI(this.current) === html_js_1.NS.HTML;
}
-
_updateCurrentElement() {
this.current = this.items[this.stackTop];
- this.currentTagName = this.current && this.treeAdapter.getTagName(this.current);
-
- this.currentTmplContent = this._isInTemplate() ? this.treeAdapter.getTemplateContent(this.current) : null;
+ this.currentTagId = this.tagIDs[this.stackTop];
}
-
//Mutations
- push(element) {
- this.items[++this.stackTop] = element;
- this._updateCurrentElement();
-
+ push(element, tagID) {
+ this.stackTop++;
+ this.items[this.stackTop] = element;
+ this.current = element;
+ this.tagIDs[this.stackTop] = tagID;
+ this.currentTagId = tagID;
if (this._isInTemplate()) {
this.tmplCount++;
}
+ this.handler.onItemPush(element, tagID, true);
}
-
pop() {
- this.stackTop--;
-
+ const popped = this.current;
if (this.tmplCount > 0 && this._isInTemplate()) {
this.tmplCount--;
}
-
+ this.stackTop--;
this._updateCurrentElement();
+ this.handler.onItemPop(popped, true);
}
-
replace(oldElement, newElement) {
const idx = this._indexOf(oldElement);
-
this.items[idx] = newElement;
-
if (idx === this.stackTop) {
- this._updateCurrentElement();
+ this.current = newElement;
}
}
-
- insertAfter(referenceElement, newElement) {
+ insertAfter(referenceElement, newElement, newElementID) {
const insertionIdx = this._indexOf(referenceElement) + 1;
-
this.items.splice(insertionIdx, 0, newElement);
-
- if (insertionIdx === ++this.stackTop) {
+ this.tagIDs.splice(insertionIdx, 0, newElementID);
+ this.stackTop++;
+ if (insertionIdx === this.stackTop) {
this._updateCurrentElement();
}
+ this.handler.onItemPush(this.current, this.currentTagId, insertionIdx === this.stackTop);
}
-
popUntilTagNamePopped(tagName) {
- while (this.stackTop > -1) {
- const tn = this.currentTagName;
- const ns = this.treeAdapter.getNamespaceURI(this.current);
-
- this.pop();
-
- if (tn === tagName && ns === NS.HTML) {
- break;
+ let targetIdx = this.stackTop + 1;
+ do {
+ targetIdx = this.tagIDs.lastIndexOf(tagName, targetIdx - 1);
+ } while (targetIdx > 0 && this.treeAdapter.getNamespaceURI(this.items[targetIdx]) !== html_js_1.NS.HTML);
+ this.shortenToLength(targetIdx < 0 ? 0 : targetIdx);
+ }
+ shortenToLength(idx) {
+ while (this.stackTop >= idx) {
+ const popped = this.current;
+ if (this.tmplCount > 0 && this._isInTemplate()) {
+ this.tmplCount -= 1;
}
+ this.stackTop--;
+ this._updateCurrentElement();
+ this.handler.onItemPop(popped, this.stackTop < idx);
}
}
-
popUntilElementPopped(element) {
- while (this.stackTop > -1) {
- const poppedElement = this.current;
-
- this.pop();
-
- if (poppedElement === element) {
- break;
- }
- }
+ const idx = this._indexOf(element);
+ this.shortenToLength(idx < 0 ? 0 : idx);
+ }
+ popUntilPopped(tagNames, targetNS) {
+ const idx = this._indexOfTagNames(tagNames, targetNS);
+ this.shortenToLength(idx < 0 ? 0 : idx);
}
-
popUntilNumberedHeaderPopped() {
- while (this.stackTop > -1) {
- const tn = this.currentTagName;
- const ns = this.treeAdapter.getNamespaceURI(this.current);
-
- this.pop();
-
- if (
- tn === $.H1 ||
- tn === $.H2 ||
- tn === $.H3 ||
- tn === $.H4 ||
- tn === $.H5 ||
- (tn === $.H6 && ns === NS.HTML)
- ) {
- break;
- }
- }
+ this.popUntilPopped(NAMED_HEADERS, html_js_1.NS.HTML);
}
-
popUntilTableCellPopped() {
- while (this.stackTop > -1) {
- const tn = this.currentTagName;
- const ns = this.treeAdapter.getNamespaceURI(this.current);
-
- this.pop();
-
- if (tn === $.TD || (tn === $.TH && ns === NS.HTML)) {
- break;
- }
- }
+ this.popUntilPopped(TABLE_CELLS, html_js_1.NS.HTML);
}
-
popAllUpToHtmlElement() {
- //NOTE: here we assume that root element is always first in the open element stack, so
+ //NOTE: here we assume that the root element is always first in the open element stack, so
//we perform this fast stack clean up.
- this.stackTop = 0;
- this._updateCurrentElement();
+ this.tmplCount = 0;
+ this.shortenToLength(1);
}
-
- clearBackToTableContext() {
- while (
- (this.currentTagName !== $.TABLE && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML) ||
- this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML
- ) {
- this.pop();
+ _indexOfTagNames(tagNames, namespace) {
+ for (let i = this.stackTop; i >= 0; i--) {
+ if (tagNames.includes(this.tagIDs[i]) && this.treeAdapter.getNamespaceURI(this.items[i]) === namespace) {
+ return i;
+ }
}
+ return -1;
+ }
+ clearBackTo(tagNames, targetNS) {
+ const idx = this._indexOfTagNames(tagNames, targetNS);
+ this.shortenToLength(idx + 1);
+ }
+ clearBackToTableContext() {
+ this.clearBackTo(TABLE_CONTEXT, html_js_1.NS.HTML);
}
-
clearBackToTableBodyContext() {
- while (
- (this.currentTagName !== $.TBODY &&
- this.currentTagName !== $.TFOOT &&
- this.currentTagName !== $.THEAD &&
- this.currentTagName !== $.TEMPLATE &&
- this.currentTagName !== $.HTML) ||
- this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML
- ) {
- this.pop();
- }
+ this.clearBackTo(TABLE_BODY_CONTEXT, html_js_1.NS.HTML);
}
-
clearBackToTableRowContext() {
- while (
- (this.currentTagName !== $.TR && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML) ||
- this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML
- ) {
- this.pop();
- }
+ this.clearBackTo(TABLE_ROW_CONTEXT, html_js_1.NS.HTML);
}
-
remove(element) {
- for (let i = this.stackTop; i >= 0; i--) {
- if (this.items[i] === element) {
- this.items.splice(i, 1);
+ const idx = this._indexOf(element);
+ if (idx >= 0) {
+ if (idx === this.stackTop) {
+ this.pop();
+ }
+ else {
+ this.items.splice(idx, 1);
+ this.tagIDs.splice(idx, 1);
this.stackTop--;
this._updateCurrentElement();
- break;
+ this.handler.onItemPop(element, false);
}
}
}
-
//Search
tryPeekProperlyNestedBodyElement() {
//Properly nested element (should be second element in stack).
- const element = this.items[1];
-
- return element && this.treeAdapter.getTagName(element) === $.BODY ? element : null;
+ return this.stackTop >= 1 && this.tagIDs[1] === html_js_1.TAG_ID.BODY ? this.items[1] : null;
}
-
contains(element) {
return this._indexOf(element) > -1;
}
-
getCommonAncestor(element) {
- let elementIdx = this._indexOf(element);
-
- return --elementIdx >= 0 ? this.items[elementIdx] : null;
+ const elementIdx = this._indexOf(element) - 1;
+ return elementIdx >= 0 ? this.items[elementIdx] : null;
}
-
isRootHtmlElementCurrent() {
- return this.stackTop === 0 && this.currentTagName === $.HTML;
+ return this.stackTop === 0 && this.tagIDs[0] === html_js_1.TAG_ID.HTML;
}
-
//Element in scope
hasInScope(tagName) {
for (let i = this.stackTop; i >= 0; i--) {
- const tn = this.treeAdapter.getTagName(this.items[i]);
+ const tn = this.tagIDs[i];
const ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if (tn === tagName && ns === NS.HTML) {
+ if (tn === tagName && ns === html_js_1.NS.HTML) {
return true;
}
-
- if (isScopingElement(tn, ns)) {
+ if (SCOPING_ELEMENT_NS.get(tn) === ns) {
return false;
}
}
-
return true;
}
-
hasNumberedHeaderInScope() {
for (let i = this.stackTop; i >= 0; i--) {
- const tn = this.treeAdapter.getTagName(this.items[i]);
+ const tn = this.tagIDs[i];
const ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if (
- (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) &&
- ns === NS.HTML
- ) {
+ if ((0, html_js_1.isNumberedHeader)(tn) && ns === html_js_1.NS.HTML) {
return true;
}
-
- if (isScopingElement(tn, ns)) {
+ if (SCOPING_ELEMENT_NS.get(tn) === ns) {
return false;
}
}
-
return true;
}
-
hasInListItemScope(tagName) {
for (let i = this.stackTop; i >= 0; i--) {
- const tn = this.treeAdapter.getTagName(this.items[i]);
+ const tn = this.tagIDs[i];
const ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if (tn === tagName && ns === NS.HTML) {
+ if (tn === tagName && ns === html_js_1.NS.HTML) {
return true;
}
-
- if (((tn === $.UL || tn === $.OL) && ns === NS.HTML) || isScopingElement(tn, ns)) {
+ if (((tn === html_js_1.TAG_ID.UL || tn === html_js_1.TAG_ID.OL) && ns === html_js_1.NS.HTML) || SCOPING_ELEMENT_NS.get(tn) === ns) {
return false;
}
}
-
return true;
}
-
hasInButtonScope(tagName) {
for (let i = this.stackTop; i >= 0; i--) {
- const tn = this.treeAdapter.getTagName(this.items[i]);
+ const tn = this.tagIDs[i];
const ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if (tn === tagName && ns === NS.HTML) {
+ if (tn === tagName && ns === html_js_1.NS.HTML) {
return true;
}
-
- if ((tn === $.BUTTON && ns === NS.HTML) || isScopingElement(tn, ns)) {
+ if ((tn === html_js_1.TAG_ID.BUTTON && ns === html_js_1.NS.HTML) || SCOPING_ELEMENT_NS.get(tn) === ns) {
return false;
}
}
-
return true;
}
-
hasInTableScope(tagName) {
for (let i = this.stackTop; i >= 0; i--) {
- const tn = this.treeAdapter.getTagName(this.items[i]);
+ const tn = this.tagIDs[i];
const ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if (ns !== NS.HTML) {
+ if (ns !== html_js_1.NS.HTML) {
continue;
}
-
if (tn === tagName) {
return true;
}
-
- if (tn === $.TABLE || tn === $.TEMPLATE || tn === $.HTML) {
+ if (tn === html_js_1.TAG_ID.TABLE || tn === html_js_1.TAG_ID.TEMPLATE || tn === html_js_1.TAG_ID.HTML) {
return false;
}
}
-
return true;
}
-
hasTableBodyContextInTableScope() {
for (let i = this.stackTop; i >= 0; i--) {
- const tn = this.treeAdapter.getTagName(this.items[i]);
+ const tn = this.tagIDs[i];
const ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if (ns !== NS.HTML) {
+ if (ns !== html_js_1.NS.HTML) {
continue;
}
-
- if (tn === $.TBODY || tn === $.THEAD || tn === $.TFOOT) {
+ if (tn === html_js_1.TAG_ID.TBODY || tn === html_js_1.TAG_ID.THEAD || tn === html_js_1.TAG_ID.TFOOT) {
return true;
}
-
- if (tn === $.TABLE || tn === $.HTML) {
+ if (tn === html_js_1.TAG_ID.TABLE || tn === html_js_1.TAG_ID.HTML) {
return false;
}
}
-
return true;
}
-
hasInSelectScope(tagName) {
for (let i = this.stackTop; i >= 0; i--) {
- const tn = this.treeAdapter.getTagName(this.items[i]);
+ const tn = this.tagIDs[i];
const ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if (ns !== NS.HTML) {
+ if (ns !== html_js_1.NS.HTML) {
continue;
}
-
if (tn === tagName) {
return true;
}
-
- if (tn !== $.OPTION && tn !== $.OPTGROUP) {
+ if (tn !== html_js_1.TAG_ID.OPTION && tn !== html_js_1.TAG_ID.OPTGROUP) {
return false;
}
}
-
return true;
}
-
//Implied end tags
generateImpliedEndTags() {
- while (isImpliedEndTagRequired(this.currentTagName)) {
+ while (IMPLICIT_END_TAG_REQUIRED.has(this.currentTagId)) {
this.pop();
}
}
-
generateImpliedEndTagsThoroughly() {
- while (isImpliedEndTagRequiredThoroughly(this.currentTagName)) {
+ while (IMPLICIT_END_TAG_REQUIRED_THOROUGHLY.has(this.currentTagId)) {
this.pop();
}
}
-
- generateImpliedEndTagsWithExclusion(exclusionTagName) {
- while (isImpliedEndTagRequired(this.currentTagName) && this.currentTagName !== exclusionTagName) {
+ generateImpliedEndTagsWithExclusion(exclusionId) {
+ while (this.currentTagId !== exclusionId && IMPLICIT_END_TAG_REQUIRED_THOROUGHLY.has(this.currentTagId)) {
this.pop();
}
}
}
-
-module.exports = OpenElementStack;
+exports.OpenElementStack = OpenElementStack;
+//# sourceMappingURL=open-element-stack.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/parser/open-element-stack.js.map b/packages/parse5/lib/parser/open-element-stack.js.map
new file mode 100644
index 0000000..62fce38
--- /dev/null
+++ b/packages/parse5/lib/parser/open-element-stack.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"open-element-stack.js","sourceRoot":"","sources":["../../../lib/parser/open-element-stack.ts"],"names":[],"mappings":";;;AAAA,+CAAsE;AAGtE,eAAe;AACf,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,QAAQ,EAAE,gBAAC,CAAC,MAAM,EAAE,gBAAC,CAAC,CAAC,EAAE,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClH,MAAM,oCAAoC,GAAG,IAAI,GAAG,CAAC;IACjD,GAAG,yBAAyB;IAC5B,gBAAC,CAAC,OAAO;IACT,gBAAC,CAAC,QAAQ;IACV,gBAAC,CAAC,KAAK;IACP,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,KAAK;IACP,gBAAC,CAAC,EAAE;IACJ,gBAAC,CAAC,KAAK;IACP,gBAAC,CAAC,EAAE;CACP,CAAC,CAAC;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAQ;IACtC,CAAC,gBAAC,CAAC,MAAM,EAAE,YAAE,CAAC,IAAI,CAAC;IACnB,CAAC,gBAAC,CAAC,OAAO,EAAE,YAAE,CAAC,IAAI,CAAC;IACpB,CAAC,gBAAC,CAAC,IAAI,EAAE,YAAE,CAAC,IAAI,CAAC;IACjB,CAAC,gBAAC,CAAC,OAAO,EAAE,YAAE,CAAC,IAAI,CAAC;IACpB,CAAC,gBAAC,CAAC,MAAM,EAAE,YAAE,CAAC,IAAI,CAAC;IACnB,CAAC,gBAAC,CAAC,KAAK,EAAE,YAAE,CAAC,IAAI,CAAC;IAClB,CAAC,gBAAC,CAAC,EAAE,EAAE,YAAE,CAAC,IAAI,CAAC;IACf,CAAC,gBAAC,CAAC,QAAQ,EAAE,YAAE,CAAC,IAAI,CAAC;IACrB,CAAC,gBAAC,CAAC,EAAE,EAAE,YAAE,CAAC,IAAI,CAAC;IACf,CAAC,gBAAC,CAAC,cAAc,EAAE,YAAE,CAAC,MAAM,CAAC;IAC7B,CAAC,gBAAC,CAAC,EAAE,EAAE,YAAE,CAAC,MAAM,CAAC;IACjB,CAAC,gBAAC,CAAC,EAAE,EAAE,YAAE,CAAC,MAAM,CAAC;IACjB,CAAC,gBAAC,CAAC,EAAE,EAAE,YAAE,CAAC,MAAM,CAAC;IACjB,CAAC,gBAAC,CAAC,EAAE,EAAE,YAAE,CAAC,MAAM,CAAC;IACjB,CAAC,gBAAC,CAAC,KAAK,EAAE,YAAE,CAAC,MAAM,CAAC;IACpB,CAAC,gBAAC,CAAC,IAAI,EAAE,YAAE,CAAC,GAAG,CAAC;IAChB,CAAC,gBAAC,CAAC,cAAc,EAAE,YAAE,CAAC,GAAG,CAAC;IAC1B,CAAC,gBAAC,CAAC,KAAK,EAAE,YAAE,CAAC,GAAG,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,EAAE,CAAC,CAAC;AAC3D,MAAM,iBAAiB,GAAG,CAAC,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,QAAQ,EAAE,gBAAC,CAAC,IAAI,CAAC,CAAC;AACrD,MAAM,kBAAkB,GAAG,CAAC,gBAAC,CAAC,KAAK,EAAE,gBAAC,CAAC,KAAK,EAAE,gBAAC,CAAC,KAAK,EAAE,gBAAC,CAAC,QAAQ,EAAE,gBAAC,CAAC,IAAI,CAAC,CAAC;AAC3E,MAAM,aAAa,GAAG,CAAC,gBAAC,CAAC,KAAK,EAAE,gBAAC,CAAC,QAAQ,EAAE,gBAAC,CAAC,IAAI,CAAC,CAAC;AACpD,MAAM,WAAW,GAAG,CAAC,gBAAC,CAAC,EAAE,EAAE,gBAAC,CAAC,EAAE,CAAC,CAAC;AAOjC,wBAAwB;AACxB,MAAa,gBAAgB;IAazB,YAAY,QAAuB,EAAU,WAA2B,EAAU,OAAwB;QAA7D,gBAAW,GAAX,WAAW,CAAgB;QAAU,YAAO,GAAP,OAAO,CAAiB;QAZ1G,UAAK,GAAsB,EAAE,CAAC;QAC9B,WAAM,GAAQ,EAAE,CAAC;QAEjB,aAAQ,GAAG,CAAC,CAAC,CAAC;QACd,cAAS,GAAG,CAAC,CAAC;QAEd,iBAAY,GAAG,gBAAC,CAAC,OAAO,CAAC;QAOrB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAND,IAAI,wBAAwB;QACxB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IACnG,CAAC;IAMD,kBAAkB;IACV,QAAQ,CAAC,OAAqB;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,wBAAwB;IAChB,aAAa;QACjB,OAAO,IAAI,CAAC,YAAY,KAAK,gBAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,YAAE,CAAC,IAAI,CAAC;IAC1G,CAAC;IAEO,qBAAqB;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,WAAW;IACX,IAAI,CAAC,OAAqB,EAAE,KAAQ;QAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACtB,IAAI,CAAC,SAAS,EAAE,CAAC;SACpB;QAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,GAAG;QACC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;SACpB;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,UAAwB,EAAE,UAAwB;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAEtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;QAE7B,IAAI,GAAG,KAAK,IAAI,CAAC,QAAQ,EAAE;YACvB,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;SAC7B;IACL,CAAC;IAED,WAAW,CAAC,gBAA8B,EAAE,UAAwB,EAAE,YAAe;QACjF,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEzD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,IAAI,YAAY,KAAK,IAAI,CAAC,QAAQ,EAAE;YAChC,IAAI,CAAC,qBAAqB,EAAE,CAAC;SAChC;QAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7F,CAAC;IAED,qBAAqB,CAAC,OAAU;QAC5B,IAAI,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAElC,GAAG;YACC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;SAC/D,QAAQ,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,YAAE,CAAC,IAAI,EAAE;QAE/F,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,eAAe,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,QAAQ,IAAI,GAAG,EAAE;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;YAE5B,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;gBAC5C,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;aACvB;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAE7B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;SACvD;IACL,CAAC;IAED,qBAAqB,CAAC,OAAqB;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAEO,cAAc,CAAC,QAAa,EAAE,QAAY;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,4BAA4B;QACxB,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,YAAE,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,uBAAuB;QACnB,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,YAAE,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,qBAAqB;QACjB,iGAAiG;QACjG,sCAAsC;QACtC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAEO,gBAAgB,CAAC,QAAa,EAAE,SAAa;QACjD,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;gBACpG,OAAO,CAAC,CAAC;aACZ;SACJ;QACD,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IAEO,WAAW,CAAC,QAAa,EAAE,QAAY;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,uBAAuB;QACnB,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,YAAE,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,2BAA2B;QACvB,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,YAAE,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,0BAA0B;QACtB,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,YAAE,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,OAAqB;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEnC,IAAI,GAAG,IAAI,CAAC,EAAE;YACV,IAAI,GAAG,KAAK,IAAI,CAAC,QAAQ,EAAE;gBACvB,IAAI,CAAC,GAAG,EAAE,CAAC;aACd;iBAAM;gBACH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC7B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;aAC1C;SACJ;IACL,CAAC;IAED,QAAQ;IACR,gCAAgC;QAC5B,qEAAqE;QACrE,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,gBAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,CAAC;IAED,QAAQ,CAAC,OAAqB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,iBAAiB,CAAC,OAAqB;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE9C,OAAO,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,CAAC;IAED,wBAAwB;QACpB,OAAO,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,gBAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IAED,kBAAkB;IAClB,UAAU,CAAC,OAAU;QACjB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3D,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,YAAE,CAAC,IAAI,EAAE;gBAClC,OAAO,IAAI,CAAC;aACf;YAED,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnC,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,wBAAwB;QACpB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3D,IAAI,IAAA,0BAAgB,EAAC,EAAE,CAAC,IAAI,EAAE,KAAK,YAAE,CAAC,IAAI,EAAE;gBACxC,OAAO,IAAI,CAAC;aACf;YAED,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnC,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,kBAAkB,CAAC,OAAU;QACzB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3D,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,YAAE,CAAC,IAAI,EAAE;gBAClC,OAAO,IAAI,CAAC;aACf;YAED,IAAI,CAAC,CAAC,EAAE,KAAK,gBAAC,CAAC,EAAE,IAAI,EAAE,KAAK,gBAAC,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,YAAE,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvF,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB,CAAC,OAAU;QACvB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3D,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,YAAE,CAAC,IAAI,EAAE;gBAClC,OAAO,IAAI,CAAC;aACf;YAED,IAAI,CAAC,EAAE,KAAK,gBAAC,CAAC,MAAM,IAAI,EAAE,KAAK,YAAE,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC1E,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,eAAe,CAAC,OAAU;QACtB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3D,IAAI,EAAE,KAAK,YAAE,CAAC,IAAI,EAAE;gBAChB,SAAS;aACZ;YAED,IAAI,EAAE,KAAK,OAAO,EAAE;gBAChB,OAAO,IAAI,CAAC;aACf;YAED,IAAI,EAAE,KAAK,gBAAC,CAAC,KAAK,IAAI,EAAE,KAAK,gBAAC,CAAC,QAAQ,IAAI,EAAE,KAAK,gBAAC,CAAC,IAAI,EAAE;gBACtD,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,+BAA+B;QAC3B,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3D,IAAI,EAAE,KAAK,YAAE,CAAC,IAAI,EAAE;gBAChB,SAAS;aACZ;YAED,IAAI,EAAE,KAAK,gBAAC,CAAC,KAAK,IAAI,EAAE,KAAK,gBAAC,CAAC,KAAK,IAAI,EAAE,KAAK,gBAAC,CAAC,KAAK,EAAE;gBACpD,OAAO,IAAI,CAAC;aACf;YAED,IAAI,EAAE,KAAK,gBAAC,CAAC,KAAK,IAAI,EAAE,KAAK,gBAAC,CAAC,IAAI,EAAE;gBACjC,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB,CAAC,OAAU;QACvB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3D,IAAI,EAAE,KAAK,YAAE,CAAC,IAAI,EAAE;gBAChB,SAAS;aACZ;YAED,IAAI,EAAE,KAAK,OAAO,EAAE;gBAChB,OAAO,IAAI,CAAC;aACf;YAED,IAAI,EAAE,KAAK,gBAAC,CAAC,MAAM,IAAI,EAAE,KAAK,gBAAC,CAAC,QAAQ,EAAE;gBACtC,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,kBAAkB;IAClB,sBAAsB;QAClB,OAAO,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YACrD,IAAI,CAAC,GAAG,EAAE,CAAC;SACd;IACL,CAAC;IAED,gCAAgC;QAC5B,OAAO,oCAAoC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YAChE,IAAI,CAAC,GAAG,EAAE,CAAC;SACd;IACL,CAAC;IAED,mCAAmC,CAAC,WAAc;QAC9C,OAAO,IAAI,CAAC,YAAY,KAAK,WAAW,IAAI,oCAAoC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YACrG,IAAI,CAAC,GAAG,EAAE,CAAC;SACd;IACL,CAAC;CACJ;AA1VD,4CA0VC"}
\ No newline at end of file
diff --git a/packages/parse5/lib/serializer/index.d.ts b/packages/parse5/lib/serializer/index.d.ts
new file mode 100644
index 0000000..d944fae
--- /dev/null
+++ b/packages/parse5/lib/serializer/index.d.ts
@@ -0,0 +1,61 @@
+import type { TreeAdapter, TreeAdapterTypeMap } from '../tree-adapters/interface';
+import { type DefaultTreeAdapterMap } from '../tree-adapters/default.js';
+export interface SerializerOptions {
+ /**
+ * Specifies input tree format.
+ *
+ * @default `treeAdapters.default`
+ */
+ treeAdapter?: TreeAdapter;
+ /**
+ * The [scripting flag](https://html.spec.whatwg.org/multipage/parsing.html#scripting-flag). If set
+ * to `true`, `noscript` element content will not be escaped.
+ *
+ * @default `true`
+ */
+ scriptingEnabled?: boolean;
+}
+/**
+ * Serializes an AST node to an HTML string.
+ *
+ * @example
+ *
+ * ```js
+ * const parse5 = require('parse5');
+ *
+ * const document = parse5.parse('Hi there!');
+ *
+ * // Serializes a document.
+ * const html = parse5.serialize(document);
+ *
+ * // Serializes the element content.
+ * const str = parse5.serialize(document.childNodes[1]);
+ *
+ * console.log(str); //> 'Hi there!'
+ * ```
+ *
+ * @param node Node to serialize.
+ * @param options Serialization options.
+ */
+export declare function serialize(node: T['parentNode'], options?: SerializerOptions): string;
+/**
+ * Serializes an AST element node to an HTML string, including the element node.
+ *
+ * @example
+ *
+ * ```js
+ * const parse5 = require('parse5');
+ *
+ * const document = parse5.parseFragment('Hello, world!
');
+ *
+ * // Serializes the element.
+ * const html = parse5.serializeOuter(document.childNodes[0]);
+ *
+ * console.log(str); //> '
Hello, world!
'
+ * ```
+ *
+ * @param node Node to serialize.
+ * @param options Serialization options.
+ */
+export declare function serializeOuter
(node: T['node'], options?: SerializerOptions): string;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/serializer/index.d.ts.map b/packages/parse5/lib/serializer/index.d.ts.map
new file mode 100644
index 0000000..5466921
--- /dev/null
+++ b/packages/parse5/lib/serializer/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/serializer/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAgC7F,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,kBAAkB;IAC3D;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,kBAAkB,GAAG,qBAAqB,EAC1E,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,EACrB,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC/B,MAAM,CAQR;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,kBAAkB,GAAG,qBAAqB,EAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EACf,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC/B,MAAM,CAGR"}
\ No newline at end of file
diff --git a/packages/parse5/lib/serializer/index.js b/packages/parse5/lib/serializer/index.js
index 659ef60..a6b1226 100644
--- a/packages/parse5/lib/serializer/index.js
+++ b/packages/parse5/lib/serializer/index.js
@@ -1,176 +1,173 @@
-'use strict';
-
-const defaultTreeAdapter = require('../tree-adapters/default');
-const mergeOptions = require('../utils/merge-options');
-const doctype = require('../common/doctype');
-const HTML = require('../common/html');
-
-//Aliases
-const $ = HTML.TAG_NAMES;
-const NS = HTML.NAMESPACES;
-
-//Default serializer options
-const DEFAULT_OPTIONS = {
- treeAdapter: defaultTreeAdapter
-};
-
-//Escaping regexes
-const AMP_REGEX = /&/g;
-const NBSP_REGEX = /\u00a0/g;
-const DOUBLE_QUOTE_REGEX = /"/g;
-const LT_REGEX = //g;
-
-//Serializer
-class Serializer {
- constructor(node, options) {
- this.options = mergeOptions(DEFAULT_OPTIONS, options);
- this.treeAdapter = this.options.treeAdapter;
-
- this.html = '';
- this.startNode = node;
- }
-
- //API
- serialize() {
- this._serializeChildNodes(this.startNode);
-
- return this.html;
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.serializeOuter = exports.serialize = void 0;
+const html_js_1 = require("../common/html.js");
+const escape_js_1 = require("entities/lib/escape.js");
+const default_js_1 = require("../tree-adapters/default.js");
+// Sets
+const VOID_ELEMENTS = new Set([
+ html_js_1.TAG_NAMES.AREA,
+ html_js_1.TAG_NAMES.BASE,
+ html_js_1.TAG_NAMES.BASEFONT,
+ html_js_1.TAG_NAMES.BGSOUND,
+ html_js_1.TAG_NAMES.BR,
+ html_js_1.TAG_NAMES.COL,
+ html_js_1.TAG_NAMES.EMBED,
+ html_js_1.TAG_NAMES.FRAME,
+ html_js_1.TAG_NAMES.HR,
+ html_js_1.TAG_NAMES.IMG,
+ html_js_1.TAG_NAMES.INPUT,
+ html_js_1.TAG_NAMES.KEYGEN,
+ html_js_1.TAG_NAMES.LINK,
+ html_js_1.TAG_NAMES.META,
+ html_js_1.TAG_NAMES.PARAM,
+ html_js_1.TAG_NAMES.SOURCE,
+ html_js_1.TAG_NAMES.TRACK,
+ html_js_1.TAG_NAMES.WBR,
+]);
+function isVoidElement(node, options) {
+ return (options.treeAdapter.isElementNode(node) &&
+ options.treeAdapter.getNamespaceURI(node) === html_js_1.NS.HTML &&
+ VOID_ELEMENTS.has(options.treeAdapter.getTagName(node)));
+}
+const defaultOpts = { treeAdapter: default_js_1.defaultTreeAdapter, scriptingEnabled: true };
+/**
+ * Serializes an AST node to an HTML string.
+ *
+ * @example
+ *
+ * ```js
+ * const parse5 = require('parse5');
+ *
+ * const document = parse5.parse('Hi there!');
+ *
+ * // Serializes a document.
+ * const html = parse5.serialize(document);
+ *
+ * // Serializes the element content.
+ * const str = parse5.serialize(document.childNodes[1]);
+ *
+ * console.log(str); //> 'Hi there!'
+ * ```
+ *
+ * @param node Node to serialize.
+ * @param options Serialization options.
+ */
+function serialize(node, options) {
+ const opts = Object.assign(Object.assign({}, defaultOpts), options);
+ if (isVoidElement(node, opts)) {
+ return '';
}
-
- //Internals
- _serializeChildNodes(parentNode) {
- const childNodes = this.treeAdapter.getChildNodes(parentNode);
-
- if (childNodes) {
- for (let i = 0, cnLength = childNodes.length; i < cnLength; i++) {
- const currentNode = childNodes[i];
-
- if (this.treeAdapter.isElementNode(currentNode)) {
- this._serializeElement(currentNode);
- } else if (this.treeAdapter.isTextNode(currentNode)) {
- this._serializeTextNode(currentNode);
- } else if (this.treeAdapter.isCommentNode(currentNode)) {
- this._serializeCommentNode(currentNode);
- } else if (this.treeAdapter.isDocumentTypeNode(currentNode)) {
- this._serializeDocumentTypeNode(currentNode);
- }
- }
+ return serializeChildNodes(node, opts);
+}
+exports.serialize = serialize;
+/**
+ * Serializes an AST element node to an HTML string, including the element node.
+ *
+ * @example
+ *
+ * ```js
+ * const parse5 = require('parse5');
+ *
+ * const document = parse5.parseFragment('Hello, world!
');
+ *
+ * // Serializes the element.
+ * const html = parse5.serializeOuter(document.childNodes[0]);
+ *
+ * console.log(str); //> '
Hello, world!
'
+ * ```
+ *
+ * @param node Node to serialize.
+ * @param options Serialization options.
+ */
+function serializeOuter(node, options) {
+ const opts = Object.assign(Object.assign({}, defaultOpts), options);
+ return serializeNode(node, opts);
+}
+exports.serializeOuter = serializeOuter;
+function serializeChildNodes(parentNode, options) {
+ let html = '';
+ // Get container of the child nodes
+ const container = options.treeAdapter.isElementNode(parentNode) &&
+ options.treeAdapter.getTagName(parentNode) === html_js_1.TAG_NAMES.TEMPLATE &&
+ options.treeAdapter.getNamespaceURI(parentNode) === html_js_1.NS.HTML
+ ? options.treeAdapter.getTemplateContent(parentNode)
+ : parentNode;
+ const childNodes = options.treeAdapter.getChildNodes(container);
+ if (childNodes) {
+ for (const currentNode of childNodes) {
+ html += serializeNode(currentNode, options);
}
}
-
- _serializeElement(node) {
- const tn = this.treeAdapter.getTagName(node);
- const ns = this.treeAdapter.getNamespaceURI(node);
-
- this.html += '<' + tn;
- this._serializeAttributes(node);
- this.html += '>';
-
- if (
- tn !== $.AREA &&
- tn !== $.BASE &&
- tn !== $.BASEFONT &&
- tn !== $.BGSOUND &&
- tn !== $.BR &&
- tn !== $.COL &&
- tn !== $.EMBED &&
- tn !== $.FRAME &&
- tn !== $.HR &&
- tn !== $.IMG &&
- tn !== $.INPUT &&
- tn !== $.KEYGEN &&
- tn !== $.LINK &&
- tn !== $.META &&
- tn !== $.PARAM &&
- tn !== $.SOURCE &&
- tn !== $.TRACK &&
- tn !== $.WBR
- ) {
- const childNodesHolder =
- tn === $.TEMPLATE && ns === NS.HTML ? this.treeAdapter.getTemplateContent(node) : node;
-
- this._serializeChildNodes(childNodesHolder);
- this.html += '' + tn + '>';
- }
+ return html;
+}
+function serializeNode(node, options) {
+ if (options.treeAdapter.isElementNode(node)) {
+ return serializeElement(node, options);
}
-
- _serializeAttributes(node) {
- const attrs = this.treeAdapter.getAttrList(node);
-
- for (let i = 0, attrsLength = attrs.length; i < attrsLength; i++) {
- const attr = attrs[i];
- const value = Serializer.escapeString(attr.value, true);
-
- this.html += ' ';
-
- if (!attr.namespace) {
- this.html += attr.name;
- } else if (attr.namespace === NS.XML) {
- this.html += 'xml:' + attr.name;
- } else if (attr.namespace === NS.XMLNS) {
- if (attr.name !== 'xmlns') {
- this.html += 'xmlns:';
- }
-
- this.html += attr.name;
- } else if (attr.namespace === NS.XLINK) {
- this.html += 'xlink:' + attr.name;
- } else {
- this.html += attr.prefix + ':' + attr.name;
- }
-
- this.html += '="' + value + '"';
- }
+ if (options.treeAdapter.isTextNode(node)) {
+ return serializeTextNode(node, options);
}
-
- _serializeTextNode(node) {
- const content = this.treeAdapter.getTextNodeContent(node);
- const parent = this.treeAdapter.getParentNode(node);
- let parentTn = void 0;
-
- if (parent && this.treeAdapter.isElementNode(parent)) {
- parentTn = this.treeAdapter.getTagName(parent);
- }
-
- if (
- parentTn === $.STYLE ||
- parentTn === $.SCRIPT ||
- parentTn === $.XMP ||
- parentTn === $.IFRAME ||
- parentTn === $.NOEMBED ||
- parentTn === $.NOFRAMES ||
- parentTn === $.PLAINTEXT ||
- parentTn === $.NOSCRIPT
- ) {
- this.html += content;
- } else {
- this.html += Serializer.escapeString(content, false);
- }
+ if (options.treeAdapter.isCommentNode(node)) {
+ return serializeCommentNode(node, options);
}
-
- _serializeCommentNode(node) {
- this.html += '';
- }
-
- _serializeDocumentTypeNode(node) {
- const name = this.treeAdapter.getDocumentTypeNodeName(node);
-
- this.html += '<' + doctype.serializeContent(name, null, null) + '>';
+ if (options.treeAdapter.isDocumentTypeNode(node)) {
+ return serializeDocumentTypeNode(node, options);
}
+ // Return an empty string for unknown nodes
+ return '';
+}
+function serializeElement(node, options) {
+ const tn = options.treeAdapter.getTagName(node);
+ return `<${tn}${serializeAttributes(node, options)}>${isVoidElement(node, options) ? '' : `${serializeChildNodes(node, options)}${tn}>`}`;
}
-
-// NOTE: used in tests and by rewriting stream
-Serializer.escapeString = function(str, attrMode) {
- str = str.replace(AMP_REGEX, '&').replace(NBSP_REGEX, ' ');
-
- if (attrMode) {
- str = str.replace(DOUBLE_QUOTE_REGEX, '"');
- } else {
- str = str.replace(LT_REGEX, '<').replace(GT_REGEX, '>');
+function serializeAttributes(node, { treeAdapter }) {
+ let html = '';
+ for (const attr of treeAdapter.getAttrList(node)) {
+ html += ' ';
+ if (!attr.namespace) {
+ html += attr.name;
+ }
+ else
+ switch (attr.namespace) {
+ case html_js_1.NS.XML: {
+ html += `xml:${attr.name}`;
+ break;
+ }
+ case html_js_1.NS.XMLNS: {
+ if (attr.name !== 'xmlns') {
+ html += 'xmlns:';
+ }
+ html += attr.name;
+ break;
+ }
+ case html_js_1.NS.XLINK: {
+ html += `xlink:${attr.name}`;
+ break;
+ }
+ default: {
+ html += `${attr.prefix}:${attr.name}`;
+ }
+ }
+ html += `="${(0, escape_js_1.escapeAttribute)(attr.value)}"`;
}
-
- return str;
-};
-
-module.exports = Serializer;
+ return html;
+}
+function serializeTextNode(node, options) {
+ const { treeAdapter } = options;
+ const content = treeAdapter.getTextNodeContent(node);
+ const parent = treeAdapter.getParentNode(node);
+ const parentTn = parent && treeAdapter.isElementNode(parent) && treeAdapter.getTagName(parent);
+ return parentTn &&
+ treeAdapter.getNamespaceURI(parent) === html_js_1.NS.HTML &&
+ (0, html_js_1.hasUnescapedText)(parentTn, options.scriptingEnabled)
+ ? content
+ : (0, escape_js_1.escapeText)(content);
+}
+function serializeCommentNode(node, { treeAdapter }) {
+ return ``;
+}
+function serializeDocumentTypeNode(node, { treeAdapter }) {
+ return ``;
+}
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/serializer/index.js.map b/packages/parse5/lib/serializer/index.js.map
new file mode 100644
index 0000000..4d25410
--- /dev/null
+++ b/packages/parse5/lib/serializer/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/serializer/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/tokenizer/index.d.ts b/packages/parse5/lib/tokenizer/index.d.ts
new file mode 100644
index 0000000..de6e234
--- /dev/null
+++ b/packages/parse5/lib/tokenizer/index.d.ts
@@ -0,0 +1,250 @@
+import { Preprocessor } from './preprocessor.js';
+import { type CharacterToken, type DoctypeToken, type TagToken, type EOFToken, type CommentToken } from '../common/token.js';
+import { type ParserErrorHandler } from '../common/error-codes.js';
+declare const enum State {
+ DATA = 0,
+ RCDATA = 1,
+ RAWTEXT = 2,
+ SCRIPT_DATA = 3,
+ PLAINTEXT = 4,
+ TAG_OPEN = 5,
+ END_TAG_OPEN = 6,
+ TAG_NAME = 7,
+ RCDATA_LESS_THAN_SIGN = 8,
+ RCDATA_END_TAG_OPEN = 9,
+ RCDATA_END_TAG_NAME = 10,
+ RAWTEXT_LESS_THAN_SIGN = 11,
+ RAWTEXT_END_TAG_OPEN = 12,
+ RAWTEXT_END_TAG_NAME = 13,
+ SCRIPT_DATA_LESS_THAN_SIGN = 14,
+ SCRIPT_DATA_END_TAG_OPEN = 15,
+ SCRIPT_DATA_END_TAG_NAME = 16,
+ SCRIPT_DATA_ESCAPE_START = 17,
+ SCRIPT_DATA_ESCAPE_START_DASH = 18,
+ SCRIPT_DATA_ESCAPED = 19,
+ SCRIPT_DATA_ESCAPED_DASH = 20,
+ SCRIPT_DATA_ESCAPED_DASH_DASH = 21,
+ SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN = 22,
+ SCRIPT_DATA_ESCAPED_END_TAG_OPEN = 23,
+ SCRIPT_DATA_ESCAPED_END_TAG_NAME = 24,
+ SCRIPT_DATA_DOUBLE_ESCAPE_START = 25,
+ SCRIPT_DATA_DOUBLE_ESCAPED = 26,
+ SCRIPT_DATA_DOUBLE_ESCAPED_DASH = 27,
+ SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH = 28,
+ SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN = 29,
+ SCRIPT_DATA_DOUBLE_ESCAPE_END = 30,
+ BEFORE_ATTRIBUTE_NAME = 31,
+ ATTRIBUTE_NAME = 32,
+ AFTER_ATTRIBUTE_NAME = 33,
+ BEFORE_ATTRIBUTE_VALUE = 34,
+ ATTRIBUTE_VALUE_DOUBLE_QUOTED = 35,
+ ATTRIBUTE_VALUE_SINGLE_QUOTED = 36,
+ ATTRIBUTE_VALUE_UNQUOTED = 37,
+ AFTER_ATTRIBUTE_VALUE_QUOTED = 38,
+ SELF_CLOSING_START_TAG = 39,
+ BOGUS_COMMENT = 40,
+ MARKUP_DECLARATION_OPEN = 41,
+ COMMENT_START = 42,
+ COMMENT_START_DASH = 43,
+ COMMENT = 44,
+ COMMENT_LESS_THAN_SIGN = 45,
+ COMMENT_LESS_THAN_SIGN_BANG = 46,
+ COMMENT_LESS_THAN_SIGN_BANG_DASH = 47,
+ COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH = 48,
+ COMMENT_END_DASH = 49,
+ COMMENT_END = 50,
+ COMMENT_END_BANG = 51,
+ DOCTYPE = 52,
+ BEFORE_DOCTYPE_NAME = 53,
+ DOCTYPE_NAME = 54,
+ AFTER_DOCTYPE_NAME = 55,
+ AFTER_DOCTYPE_PUBLIC_KEYWORD = 56,
+ BEFORE_DOCTYPE_PUBLIC_IDENTIFIER = 57,
+ DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED = 58,
+ DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED = 59,
+ AFTER_DOCTYPE_PUBLIC_IDENTIFIER = 60,
+ BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS = 61,
+ AFTER_DOCTYPE_SYSTEM_KEYWORD = 62,
+ BEFORE_DOCTYPE_SYSTEM_IDENTIFIER = 63,
+ DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED = 64,
+ DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED = 65,
+ AFTER_DOCTYPE_SYSTEM_IDENTIFIER = 66,
+ BOGUS_DOCTYPE = 67,
+ CDATA_SECTION = 68,
+ CDATA_SECTION_BRACKET = 69,
+ CDATA_SECTION_END = 70,
+ CHARACTER_REFERENCE = 71,
+ NAMED_CHARACTER_REFERENCE = 72,
+ AMBIGUOUS_AMPERSAND = 73,
+ NUMERIC_CHARACTER_REFERENCE = 74,
+ HEXADEMICAL_CHARACTER_REFERENCE_START = 75,
+ DECIMAL_CHARACTER_REFERENCE_START = 76,
+ HEXADEMICAL_CHARACTER_REFERENCE = 77,
+ DECIMAL_CHARACTER_REFERENCE = 78,
+ NUMERIC_CHARACTER_REFERENCE_END = 79
+}
+export declare const TokenizerMode: {
+ readonly DATA: State.DATA;
+ readonly RCDATA: State.RCDATA;
+ readonly RAWTEXT: State.RAWTEXT;
+ readonly SCRIPT_DATA: State.SCRIPT_DATA;
+ readonly PLAINTEXT: State.PLAINTEXT;
+ readonly CDATA_SECTION: State.CDATA_SECTION;
+};
+export interface TokenizerOptions {
+ sourceCodeLocationInfo?: boolean;
+}
+export interface TokenHandler {
+ onComment(token: CommentToken): void;
+ onDoctype(token: DoctypeToken): void;
+ onStartTag(token: TagToken): void;
+ onEndTag(token: TagToken): void;
+ onEof(token: EOFToken): void;
+ onCharacter(token: CharacterToken): void;
+ onNullCharacter(token: CharacterToken): void;
+ onWhitespaceCharacter(token: CharacterToken): void;
+ onParseError?: ParserErrorHandler | null;
+}
+export declare class Tokenizer {
+ private options;
+ private handler;
+ preprocessor: Preprocessor;
+ private paused;
+ /** Ensures that the parsing loop isn't run multiple times at once. */
+ private inLoop;
+ /**
+ * Indicates that the current adjusted node exists, is not an element in the HTML namespace,
+ * and that it is not an integration point for either MathML or HTML.
+ *
+ * @see {@link https://html.spec.whatwg.org/multipage/parsing.html#tree-construction}
+ */
+ inForeignNode: boolean;
+ lastStartTagName: string;
+ active: boolean;
+ state: State;
+ private returnState;
+ private charRefCode;
+ private consumedAfterSnapshot;
+ private currentLocation;
+ private currentCharacterToken;
+ private currentToken;
+ private currentAttr;
+ constructor(options: TokenizerOptions, handler: TokenHandler);
+ private _err;
+ private getCurrentLocation;
+ private _runParsingLoop;
+ pause(): void;
+ resume(writeCallback?: () => void): void;
+ write(chunk: string, isLastChunk: boolean, writeCallback?: () => void): void;
+ insertHtmlAtCurrentPos(chunk: string): void;
+ private _ensureHibernation;
+ private _consume;
+ private _unconsume;
+ private _reconsumeInState;
+ private _advanceBy;
+ private _consumeSequenceIfMatch;
+ private _createStartTagToken;
+ private _createEndTagToken;
+ private _createCommentToken;
+ private _createDoctypeToken;
+ private _createCharacterToken;
+ private _createAttr;
+ private _leaveAttrName;
+ private _leaveAttrValue;
+ private prepareToken;
+ private emitCurrentTagToken;
+ private emitCurrentComment;
+ private emitCurrentDoctype;
+ private _emitCurrentCharacterToken;
+ private _emitEOFToken;
+ private _appendCharToCurrentCharacterToken;
+ private _emitCodePoint;
+ private _emitChars;
+ private _matchNamedCharacterReference;
+ private _isCharacterReferenceInAttribute;
+ private _flushCodePointConsumedAsCharacterReference;
+ private _callState;
+ private _stateData;
+ private _stateRcdata;
+ private _stateRawtext;
+ private _stateScriptData;
+ private _statePlaintext;
+ private _stateTagOpen;
+ private _stateEndTagOpen;
+ private _stateTagName;
+ private _stateRcdataLessThanSign;
+ private _stateRcdataEndTagOpen;
+ private handleSpecialEndTag;
+ private _stateRcdataEndTagName;
+ private _stateRawtextLessThanSign;
+ private _stateRawtextEndTagOpen;
+ private _stateRawtextEndTagName;
+ private _stateScriptDataLessThanSign;
+ private _stateScriptDataEndTagOpen;
+ private _stateScriptDataEndTagName;
+ private _stateScriptDataEscapeStart;
+ private _stateScriptDataEscapeStartDash;
+ private _stateScriptDataEscaped;
+ private _stateScriptDataEscapedDash;
+ private _stateScriptDataEscapedDashDash;
+ private _stateScriptDataEscapedLessThanSign;
+ private _stateScriptDataEscapedEndTagOpen;
+ private _stateScriptDataEscapedEndTagName;
+ private _stateScriptDataDoubleEscapeStart;
+ private _stateScriptDataDoubleEscaped;
+ private _stateScriptDataDoubleEscapedDash;
+ private _stateScriptDataDoubleEscapedDashDash;
+ private _stateScriptDataDoubleEscapedLessThanSign;
+ private _stateScriptDataDoubleEscapeEnd;
+ private _stateBeforeAttributeName;
+ private _stateAttributeName;
+ private _stateAfterAttributeName;
+ private _stateBeforeAttributeValue;
+ private _stateAttributeValueDoubleQuoted;
+ private _stateAttributeValueSingleQuoted;
+ private _stateAttributeValueUnquoted;
+ private _stateAfterAttributeValueQuoted;
+ private _stateSelfClosingStartTag;
+ private _stateBogusComment;
+ private _stateMarkupDeclarationOpen;
+ private _stateCommentStart;
+ private _stateCommentStartDash;
+ private _stateComment;
+ private _stateCommentLessThanSign;
+ private _stateCommentLessThanSignBang;
+ private _stateCommentLessThanSignBangDash;
+ private _stateCommentLessThanSignBangDashDash;
+ private _stateCommentEndDash;
+ private _stateCommentEnd;
+ private _stateCommentEndBang;
+ private _stateDoctype;
+ private _stateBeforeDoctypeName;
+ private _stateDoctypeName;
+ private _stateAfterDoctypeName;
+ private _stateAfterDoctypePublicKeyword;
+ private _stateBeforeDoctypePublicIdentifier;
+ private _stateDoctypePublicIdentifierDoubleQuoted;
+ private _stateDoctypePublicIdentifierSingleQuoted;
+ private _stateAfterDoctypePublicIdentifier;
+ private _stateBetweenDoctypePublicAndSystemIdentifiers;
+ private _stateAfterDoctypeSystemKeyword;
+ private _stateBeforeDoctypeSystemIdentifier;
+ private _stateDoctypeSystemIdentifierDoubleQuoted;
+ private _stateDoctypeSystemIdentifierSingleQuoted;
+ private _stateAfterDoctypeSystemIdentifier;
+ private _stateBogusDoctype;
+ private _stateCdataSection;
+ private _stateCdataSectionBracket;
+ private _stateCdataSectionEnd;
+ private _stateCharacterReference;
+ private _stateNamedCharacterReference;
+ private _stateAmbiguousAmpersand;
+ private _stateNumericCharacterReference;
+ private _stateHexademicalCharacterReferenceStart;
+ private _stateDecimalCharacterReferenceStart;
+ private _stateHexademicalCharacterReference;
+ private _stateDecimalCharacterReference;
+ private _stateNumericCharacterReferenceEnd;
+}
+export {};
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/tokenizer/index.d.ts.map b/packages/parse5/lib/tokenizer/index.d.ts.map
new file mode 100644
index 0000000..a9b9a48
--- /dev/null
+++ b/packages/parse5/lib/tokenizer/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/tokenizer/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/tokenizer/index.js b/packages/parse5/lib/tokenizer/index.js
index c18d55c..e0912ef 100644
--- a/packages/parse5/lib/tokenizer/index.js
+++ b/packages/parse5/lib/tokenizer/index.js
@@ -1,2196 +1,2921 @@
-'use strict';
-
-const Preprocessor = require('./preprocessor');
-const unicode = require('../common/unicode');
-const neTree = require('./named-entity-data');
-const ERR = require('../common/error-codes');
-
-//Aliases
-const $ = unicode.CODE_POINTS;
-const $$ = unicode.CODE_POINT_SEQUENCES;
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Tokenizer = exports.TokenizerMode = void 0;
+const preprocessor_js_1 = require("./preprocessor.js");
+const unicode_js_1 = require("../common/unicode.js");
+const token_js_1 = require("../common/token.js");
+const decode_js_1 = require("entities/lib/decode.js");
+const error_codes_js_1 = require("../common/error-codes.js");
+const html_js_1 = require("../common/html.js");
//C1 Unicode control character reference replacements
-const C1_CONTROLS_REFERENCE_REPLACEMENTS = {
- 0x80: 0x20ac,
- 0x82: 0x201a,
- 0x83: 0x0192,
- 0x84: 0x201e,
- 0x85: 0x2026,
- 0x86: 0x2020,
- 0x87: 0x2021,
- 0x88: 0x02c6,
- 0x89: 0x2030,
- 0x8a: 0x0160,
- 0x8b: 0x2039,
- 0x8c: 0x0152,
- 0x8e: 0x017d,
- 0x91: 0x2018,
- 0x92: 0x2019,
- 0x93: 0x201c,
- 0x94: 0x201d,
- 0x95: 0x2022,
- 0x96: 0x2013,
- 0x97: 0x2014,
- 0x98: 0x02dc,
- 0x99: 0x2122,
- 0x9a: 0x0161,
- 0x9b: 0x203a,
- 0x9c: 0x0153,
- 0x9e: 0x017e,
- 0x9f: 0x0178
-};
-
-// Named entity tree flags
-const HAS_DATA_FLAG = 1 << 0;
-const DATA_DUPLET_FLAG = 1 << 1;
-const HAS_BRANCHES_FLAG = 1 << 2;
-const MAX_BRANCH_MARKER_VALUE = HAS_DATA_FLAG | DATA_DUPLET_FLAG | HAS_BRANCHES_FLAG;
-
+const C1_CONTROLS_REFERENCE_REPLACEMENTS = new Map([
+ [0x80, 8364],
+ [0x82, 8218],
+ [0x83, 402],
+ [0x84, 8222],
+ [0x85, 8230],
+ [0x86, 8224],
+ [0x87, 8225],
+ [0x88, 710],
+ [0x89, 8240],
+ [0x8a, 352],
+ [0x8b, 8249],
+ [0x8c, 338],
+ [0x8e, 381],
+ [0x91, 8216],
+ [0x92, 8217],
+ [0x93, 8220],
+ [0x94, 8221],
+ [0x95, 8226],
+ [0x96, 8211],
+ [0x97, 8212],
+ [0x98, 732],
+ [0x99, 8482],
+ [0x9a, 353],
+ [0x9b, 8250],
+ [0x9c, 339],
+ [0x9e, 382],
+ [0x9f, 376],
+]);
//States
-const DATA_STATE = 'DATA_STATE';
-const RCDATA_STATE = 'RCDATA_STATE';
-const RAWTEXT_STATE = 'RAWTEXT_STATE';
-const SCRIPT_DATA_STATE = 'SCRIPT_DATA_STATE';
-const PLAINTEXT_STATE = 'PLAINTEXT_STATE';
-const TAG_OPEN_STATE = 'TAG_OPEN_STATE';
-const END_TAG_OPEN_STATE = 'END_TAG_OPEN_STATE';
-const TAG_NAME_STATE = 'TAG_NAME_STATE';
-const RCDATA_LESS_THAN_SIGN_STATE = 'RCDATA_LESS_THAN_SIGN_STATE';
-const RCDATA_END_TAG_OPEN_STATE = 'RCDATA_END_TAG_OPEN_STATE';
-const RCDATA_END_TAG_NAME_STATE = 'RCDATA_END_TAG_NAME_STATE';
-const RAWTEXT_LESS_THAN_SIGN_STATE = 'RAWTEXT_LESS_THAN_SIGN_STATE';
-const RAWTEXT_END_TAG_OPEN_STATE = 'RAWTEXT_END_TAG_OPEN_STATE';
-const RAWTEXT_END_TAG_NAME_STATE = 'RAWTEXT_END_TAG_NAME_STATE';
-const SCRIPT_DATA_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_LESS_THAN_SIGN_STATE';
-const SCRIPT_DATA_END_TAG_OPEN_STATE = 'SCRIPT_DATA_END_TAG_OPEN_STATE';
-const SCRIPT_DATA_END_TAG_NAME_STATE = 'SCRIPT_DATA_END_TAG_NAME_STATE';
-const SCRIPT_DATA_ESCAPE_START_STATE = 'SCRIPT_DATA_ESCAPE_START_STATE';
-const SCRIPT_DATA_ESCAPE_START_DASH_STATE = 'SCRIPT_DATA_ESCAPE_START_DASH_STATE';
-const SCRIPT_DATA_ESCAPED_STATE = 'SCRIPT_DATA_ESCAPED_STATE';
-const SCRIPT_DATA_ESCAPED_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_STATE';
-const SCRIPT_DATA_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_DASH_STATE';
-const SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE';
-const SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE';
-const SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE';
-const SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE';
-const SCRIPT_DATA_DOUBLE_ESCAPED_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_STATE';
-const SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE';
-const SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE';
-const SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE';
-const SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE';
-const BEFORE_ATTRIBUTE_NAME_STATE = 'BEFORE_ATTRIBUTE_NAME_STATE';
-const ATTRIBUTE_NAME_STATE = 'ATTRIBUTE_NAME_STATE';
-const AFTER_ATTRIBUTE_NAME_STATE = 'AFTER_ATTRIBUTE_NAME_STATE';
-const BEFORE_ATTRIBUTE_VALUE_STATE = 'BEFORE_ATTRIBUTE_VALUE_STATE';
-const ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE';
-const ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE';
-const ATTRIBUTE_VALUE_UNQUOTED_STATE = 'ATTRIBUTE_VALUE_UNQUOTED_STATE';
-const AFTER_ATTRIBUTE_VALUE_QUOTED_STATE = 'AFTER_ATTRIBUTE_VALUE_QUOTED_STATE';
-const SELF_CLOSING_START_TAG_STATE = 'SELF_CLOSING_START_TAG_STATE';
-const BOGUS_COMMENT_STATE = 'BOGUS_COMMENT_STATE';
-const MARKUP_DECLARATION_OPEN_STATE = 'MARKUP_DECLARATION_OPEN_STATE';
-const COMMENT_START_STATE = 'COMMENT_START_STATE';
-const COMMENT_START_DASH_STATE = 'COMMENT_START_DASH_STATE';
-const COMMENT_STATE = 'COMMENT_STATE';
-const COMMENT_LESS_THAN_SIGN_STATE = 'COMMENT_LESS_THAN_SIGN_STATE';
-const COMMENT_LESS_THAN_SIGN_BANG_STATE = 'COMMENT_LESS_THAN_SIGN_BANG_STATE';
-const COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE = 'COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE';
-const COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE = 'COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE';
-const COMMENT_END_DASH_STATE = 'COMMENT_END_DASH_STATE';
-const COMMENT_END_STATE = 'COMMENT_END_STATE';
-const COMMENT_END_BANG_STATE = 'COMMENT_END_BANG_STATE';
-const DOCTYPE_STATE = 'DOCTYPE_STATE';
-const BEFORE_DOCTYPE_NAME_STATE = 'BEFORE_DOCTYPE_NAME_STATE';
-const DOCTYPE_NAME_STATE = 'DOCTYPE_NAME_STATE';
-const AFTER_DOCTYPE_NAME_STATE = 'AFTER_DOCTYPE_NAME_STATE';
-const AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE = 'AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE';
-const BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE';
-const DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE';
-const DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE';
-const AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE';
-const BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE';
-const AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE = 'AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE';
-const BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE';
-const DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE';
-const DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE';
-const AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE';
-const BOGUS_DOCTYPE_STATE = 'BOGUS_DOCTYPE_STATE';
-const CDATA_SECTION_STATE = 'CDATA_SECTION_STATE';
-const CDATA_SECTION_BRACKET_STATE = 'CDATA_SECTION_BRACKET_STATE';
-const CDATA_SECTION_END_STATE = 'CDATA_SECTION_END_STATE';
-const CHARACTER_REFERENCE_STATE = 'CHARACTER_REFERENCE_STATE';
-const NAMED_CHARACTER_REFERENCE_STATE = 'NAMED_CHARACTER_REFERENCE_STATE';
-const AMBIGUOUS_AMPERSAND_STATE = 'AMBIGUOS_AMPERSAND_STATE';
-const NUMERIC_CHARACTER_REFERENCE_STATE = 'NUMERIC_CHARACTER_REFERENCE_STATE';
-const HEXADEMICAL_CHARACTER_REFERENCE_START_STATE = 'HEXADEMICAL_CHARACTER_REFERENCE_START_STATE';
-const DECIMAL_CHARACTER_REFERENCE_START_STATE = 'DECIMAL_CHARACTER_REFERENCE_START_STATE';
-const HEXADEMICAL_CHARACTER_REFERENCE_STATE = 'HEXADEMICAL_CHARACTER_REFERENCE_STATE';
-const DECIMAL_CHARACTER_REFERENCE_STATE = 'DECIMAL_CHARACTER_REFERENCE_STATE';
-const NUMERIC_CHARACTER_REFERENCE_END_STATE = 'NUMERIC_CHARACTER_REFERENCE_END_STATE';
-
+var State;
+(function (State) {
+ State[State["DATA"] = 0] = "DATA";
+ State[State["RCDATA"] = 1] = "RCDATA";
+ State[State["RAWTEXT"] = 2] = "RAWTEXT";
+ State[State["SCRIPT_DATA"] = 3] = "SCRIPT_DATA";
+ State[State["PLAINTEXT"] = 4] = "PLAINTEXT";
+ State[State["TAG_OPEN"] = 5] = "TAG_OPEN";
+ State[State["END_TAG_OPEN"] = 6] = "END_TAG_OPEN";
+ State[State["TAG_NAME"] = 7] = "TAG_NAME";
+ State[State["RCDATA_LESS_THAN_SIGN"] = 8] = "RCDATA_LESS_THAN_SIGN";
+ State[State["RCDATA_END_TAG_OPEN"] = 9] = "RCDATA_END_TAG_OPEN";
+ State[State["RCDATA_END_TAG_NAME"] = 10] = "RCDATA_END_TAG_NAME";
+ State[State["RAWTEXT_LESS_THAN_SIGN"] = 11] = "RAWTEXT_LESS_THAN_SIGN";
+ State[State["RAWTEXT_END_TAG_OPEN"] = 12] = "RAWTEXT_END_TAG_OPEN";
+ State[State["RAWTEXT_END_TAG_NAME"] = 13] = "RAWTEXT_END_TAG_NAME";
+ State[State["SCRIPT_DATA_LESS_THAN_SIGN"] = 14] = "SCRIPT_DATA_LESS_THAN_SIGN";
+ State[State["SCRIPT_DATA_END_TAG_OPEN"] = 15] = "SCRIPT_DATA_END_TAG_OPEN";
+ State[State["SCRIPT_DATA_END_TAG_NAME"] = 16] = "SCRIPT_DATA_END_TAG_NAME";
+ State[State["SCRIPT_DATA_ESCAPE_START"] = 17] = "SCRIPT_DATA_ESCAPE_START";
+ State[State["SCRIPT_DATA_ESCAPE_START_DASH"] = 18] = "SCRIPT_DATA_ESCAPE_START_DASH";
+ State[State["SCRIPT_DATA_ESCAPED"] = 19] = "SCRIPT_DATA_ESCAPED";
+ State[State["SCRIPT_DATA_ESCAPED_DASH"] = 20] = "SCRIPT_DATA_ESCAPED_DASH";
+ State[State["SCRIPT_DATA_ESCAPED_DASH_DASH"] = 21] = "SCRIPT_DATA_ESCAPED_DASH_DASH";
+ State[State["SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN"] = 22] = "SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN";
+ State[State["SCRIPT_DATA_ESCAPED_END_TAG_OPEN"] = 23] = "SCRIPT_DATA_ESCAPED_END_TAG_OPEN";
+ State[State["SCRIPT_DATA_ESCAPED_END_TAG_NAME"] = 24] = "SCRIPT_DATA_ESCAPED_END_TAG_NAME";
+ State[State["SCRIPT_DATA_DOUBLE_ESCAPE_START"] = 25] = "SCRIPT_DATA_DOUBLE_ESCAPE_START";
+ State[State["SCRIPT_DATA_DOUBLE_ESCAPED"] = 26] = "SCRIPT_DATA_DOUBLE_ESCAPED";
+ State[State["SCRIPT_DATA_DOUBLE_ESCAPED_DASH"] = 27] = "SCRIPT_DATA_DOUBLE_ESCAPED_DASH";
+ State[State["SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH"] = 28] = "SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH";
+ State[State["SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN"] = 29] = "SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN";
+ State[State["SCRIPT_DATA_DOUBLE_ESCAPE_END"] = 30] = "SCRIPT_DATA_DOUBLE_ESCAPE_END";
+ State[State["BEFORE_ATTRIBUTE_NAME"] = 31] = "BEFORE_ATTRIBUTE_NAME";
+ State[State["ATTRIBUTE_NAME"] = 32] = "ATTRIBUTE_NAME";
+ State[State["AFTER_ATTRIBUTE_NAME"] = 33] = "AFTER_ATTRIBUTE_NAME";
+ State[State["BEFORE_ATTRIBUTE_VALUE"] = 34] = "BEFORE_ATTRIBUTE_VALUE";
+ State[State["ATTRIBUTE_VALUE_DOUBLE_QUOTED"] = 35] = "ATTRIBUTE_VALUE_DOUBLE_QUOTED";
+ State[State["ATTRIBUTE_VALUE_SINGLE_QUOTED"] = 36] = "ATTRIBUTE_VALUE_SINGLE_QUOTED";
+ State[State["ATTRIBUTE_VALUE_UNQUOTED"] = 37] = "ATTRIBUTE_VALUE_UNQUOTED";
+ State[State["AFTER_ATTRIBUTE_VALUE_QUOTED"] = 38] = "AFTER_ATTRIBUTE_VALUE_QUOTED";
+ State[State["SELF_CLOSING_START_TAG"] = 39] = "SELF_CLOSING_START_TAG";
+ State[State["BOGUS_COMMENT"] = 40] = "BOGUS_COMMENT";
+ State[State["MARKUP_DECLARATION_OPEN"] = 41] = "MARKUP_DECLARATION_OPEN";
+ State[State["COMMENT_START"] = 42] = "COMMENT_START";
+ State[State["COMMENT_START_DASH"] = 43] = "COMMENT_START_DASH";
+ State[State["COMMENT"] = 44] = "COMMENT";
+ State[State["COMMENT_LESS_THAN_SIGN"] = 45] = "COMMENT_LESS_THAN_SIGN";
+ State[State["COMMENT_LESS_THAN_SIGN_BANG"] = 46] = "COMMENT_LESS_THAN_SIGN_BANG";
+ State[State["COMMENT_LESS_THAN_SIGN_BANG_DASH"] = 47] = "COMMENT_LESS_THAN_SIGN_BANG_DASH";
+ State[State["COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH"] = 48] = "COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH";
+ State[State["COMMENT_END_DASH"] = 49] = "COMMENT_END_DASH";
+ State[State["COMMENT_END"] = 50] = "COMMENT_END";
+ State[State["COMMENT_END_BANG"] = 51] = "COMMENT_END_BANG";
+ State[State["DOCTYPE"] = 52] = "DOCTYPE";
+ State[State["BEFORE_DOCTYPE_NAME"] = 53] = "BEFORE_DOCTYPE_NAME";
+ State[State["DOCTYPE_NAME"] = 54] = "DOCTYPE_NAME";
+ State[State["AFTER_DOCTYPE_NAME"] = 55] = "AFTER_DOCTYPE_NAME";
+ State[State["AFTER_DOCTYPE_PUBLIC_KEYWORD"] = 56] = "AFTER_DOCTYPE_PUBLIC_KEYWORD";
+ State[State["BEFORE_DOCTYPE_PUBLIC_IDENTIFIER"] = 57] = "BEFORE_DOCTYPE_PUBLIC_IDENTIFIER";
+ State[State["DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED"] = 58] = "DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED";
+ State[State["DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED"] = 59] = "DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED";
+ State[State["AFTER_DOCTYPE_PUBLIC_IDENTIFIER"] = 60] = "AFTER_DOCTYPE_PUBLIC_IDENTIFIER";
+ State[State["BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS"] = 61] = "BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS";
+ State[State["AFTER_DOCTYPE_SYSTEM_KEYWORD"] = 62] = "AFTER_DOCTYPE_SYSTEM_KEYWORD";
+ State[State["BEFORE_DOCTYPE_SYSTEM_IDENTIFIER"] = 63] = "BEFORE_DOCTYPE_SYSTEM_IDENTIFIER";
+ State[State["DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED"] = 64] = "DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED";
+ State[State["DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED"] = 65] = "DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED";
+ State[State["AFTER_DOCTYPE_SYSTEM_IDENTIFIER"] = 66] = "AFTER_DOCTYPE_SYSTEM_IDENTIFIER";
+ State[State["BOGUS_DOCTYPE"] = 67] = "BOGUS_DOCTYPE";
+ State[State["CDATA_SECTION"] = 68] = "CDATA_SECTION";
+ State[State["CDATA_SECTION_BRACKET"] = 69] = "CDATA_SECTION_BRACKET";
+ State[State["CDATA_SECTION_END"] = 70] = "CDATA_SECTION_END";
+ State[State["CHARACTER_REFERENCE"] = 71] = "CHARACTER_REFERENCE";
+ State[State["NAMED_CHARACTER_REFERENCE"] = 72] = "NAMED_CHARACTER_REFERENCE";
+ State[State["AMBIGUOUS_AMPERSAND"] = 73] = "AMBIGUOUS_AMPERSAND";
+ State[State["NUMERIC_CHARACTER_REFERENCE"] = 74] = "NUMERIC_CHARACTER_REFERENCE";
+ State[State["HEXADEMICAL_CHARACTER_REFERENCE_START"] = 75] = "HEXADEMICAL_CHARACTER_REFERENCE_START";
+ State[State["DECIMAL_CHARACTER_REFERENCE_START"] = 76] = "DECIMAL_CHARACTER_REFERENCE_START";
+ State[State["HEXADEMICAL_CHARACTER_REFERENCE"] = 77] = "HEXADEMICAL_CHARACTER_REFERENCE";
+ State[State["DECIMAL_CHARACTER_REFERENCE"] = 78] = "DECIMAL_CHARACTER_REFERENCE";
+ State[State["NUMERIC_CHARACTER_REFERENCE_END"] = 79] = "NUMERIC_CHARACTER_REFERENCE_END";
+})(State || (State = {}));
+//Tokenizer initial states for different modes
+exports.TokenizerMode = {
+ DATA: State.DATA,
+ RCDATA: State.RCDATA,
+ RAWTEXT: State.RAWTEXT,
+ SCRIPT_DATA: State.SCRIPT_DATA,
+ PLAINTEXT: State.PLAINTEXT,
+ CDATA_SECTION: State.CDATA_SECTION,
+};
//Utils
-
//OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline
//this functions if they will be situated in another module due to context switch.
//Always perform inlining check before modifying this functions ('node --trace-inlining').
-function isWhitespace(cp) {
- return cp === $.SPACE || cp === $.LINE_FEED || cp === $.TABULATION || cp === $.FORM_FEED;
-}
-
function isAsciiDigit(cp) {
- return cp >= $.DIGIT_0 && cp <= $.DIGIT_9;
+ return cp >= unicode_js_1.CODE_POINTS.DIGIT_0 && cp <= unicode_js_1.CODE_POINTS.DIGIT_9;
}
-
function isAsciiUpper(cp) {
- return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_Z;
+ return cp >= unicode_js_1.CODE_POINTS.LATIN_CAPITAL_A && cp <= unicode_js_1.CODE_POINTS.LATIN_CAPITAL_Z;
}
-
function isAsciiLower(cp) {
- return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_Z;
+ return cp >= unicode_js_1.CODE_POINTS.LATIN_SMALL_A && cp <= unicode_js_1.CODE_POINTS.LATIN_SMALL_Z;
}
-
function isAsciiLetter(cp) {
return isAsciiLower(cp) || isAsciiUpper(cp);
}
-
function isAsciiAlphaNumeric(cp) {
return isAsciiLetter(cp) || isAsciiDigit(cp);
}
-
function isAsciiUpperHexDigit(cp) {
- return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_F;
+ return cp >= unicode_js_1.CODE_POINTS.LATIN_CAPITAL_A && cp <= unicode_js_1.CODE_POINTS.LATIN_CAPITAL_F;
}
-
function isAsciiLowerHexDigit(cp) {
- return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_F;
+ return cp >= unicode_js_1.CODE_POINTS.LATIN_SMALL_A && cp <= unicode_js_1.CODE_POINTS.LATIN_SMALL_F;
}
-
function isAsciiHexDigit(cp) {
return isAsciiDigit(cp) || isAsciiUpperHexDigit(cp) || isAsciiLowerHexDigit(cp);
}
-
-function toAsciiLowerCodePoint(cp) {
- return cp + 0x0020;
+function toAsciiLower(cp) {
+ return cp + 32;
}
-
-//NOTE: String.fromCharCode() function can handle only characters from BMP subset.
-//So, we need to workaround this manually.
-//(see: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/fromCharCode#Getting_it_to_work_with_higher_values)
-function toChar(cp) {
- if (cp <= 0xffff) {
- return String.fromCharCode(cp);
- }
-
- cp -= 0x10000;
- return String.fromCharCode(((cp >>> 10) & 0x3ff) | 0xd800) + String.fromCharCode(0xdc00 | (cp & 0x3ff));
+function isWhitespace(cp) {
+ return cp === unicode_js_1.CODE_POINTS.SPACE || cp === unicode_js_1.CODE_POINTS.LINE_FEED || cp === unicode_js_1.CODE_POINTS.TABULATION || cp === unicode_js_1.CODE_POINTS.FORM_FEED;
}
-
-function toAsciiLowerChar(cp) {
- return String.fromCharCode(toAsciiLowerCodePoint(cp));
+function isEntityInAttributeInvalidEnd(nextCp) {
+ return nextCp === unicode_js_1.CODE_POINTS.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp);
}
-
-function findNamedEntityTreeBranch(nodeIx, cp) {
- const branchCount = neTree[++nodeIx];
- let lo = ++nodeIx;
- let hi = lo + branchCount - 1;
-
- while (lo <= hi) {
- const mid = (lo + hi) >>> 1;
- const midCp = neTree[mid];
-
- if (midCp < cp) {
- lo = mid + 1;
- } else if (midCp > cp) {
- hi = mid - 1;
- } else {
- return neTree[mid + branchCount];
- }
- }
-
- return -1;
+function isScriptDataDoubleEscapeSequenceEnd(cp) {
+ return isWhitespace(cp) || cp === unicode_js_1.CODE_POINTS.SOLIDUS || cp === unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN;
}
-
//Tokenizer
class Tokenizer {
- constructor() {
- this.preprocessor = new Preprocessor();
-
- this.tokenQueue = [];
-
- this.allowCDATA = false;
-
- this.state = DATA_STATE;
- this.returnState = '';
-
- this.charRefCode = -1;
- this.tempBuff = [];
+ constructor(options, handler) {
+ this.options = options;
+ this.handler = handler;
+ this.paused = false;
+ /** Ensures that the parsing loop isn't run multiple times at once. */
+ this.inLoop = false;
+ /**
+ * Indicates that the current adjusted node exists, is not an element in the HTML namespace,
+ * and that it is not an integration point for either MathML or HTML.
+ *
+ * @see {@link https://html.spec.whatwg.org/multipage/parsing.html#tree-construction}
+ */
+ this.inForeignNode = false;
this.lastStartTagName = '';
-
- this.consumedAfterSnapshot = -1;
this.active = false;
-
+ this.state = State.DATA;
+ this.returnState = State.DATA;
+ this.charRefCode = -1;
+ this.consumedAfterSnapshot = -1;
this.currentCharacterToken = null;
this.currentToken = null;
- this.currentAttr = null;
+ this.currentAttr = { name: '', value: '' };
+ this.preprocessor = new preprocessor_js_1.Preprocessor(handler);
+ this.currentLocation = this.getCurrentLocation(-1);
}
-
//Errors
- _err() {
- // NOTE: err reporting is noop by default. Enabled by mixin.
- }
-
- _errOnNextCodePoint(err) {
- this._consume();
- this._err(err);
- this._unconsume();
+ _err(code) {
+ var _a, _b;
+ (_b = (_a = this.handler).onParseError) === null || _b === void 0 ? void 0 : _b.call(_a, this.preprocessor.getError(code));
+ }
+ // NOTE: `offset` may never run across line boundaries.
+ getCurrentLocation(offset) {
+ if (!this.options.sourceCodeLocationInfo) {
+ return null;
+ }
+ return {
+ startLine: this.preprocessor.line,
+ startCol: this.preprocessor.col - offset,
+ startOffset: this.preprocessor.offset - offset,
+ endLine: -1,
+ endCol: -1,
+ endOffset: -1,
+ };
}
-
- //API
- getNextToken() {
- while (!this.tokenQueue.length && this.active) {
+ _runParsingLoop() {
+ if (this.inLoop)
+ return;
+ this.inLoop = true;
+ while (this.active && !this.paused) {
this.consumedAfterSnapshot = 0;
-
const cp = this._consume();
-
if (!this._ensureHibernation()) {
- this[this.state](cp);
+ this._callState(cp);
}
}
-
- return this.tokenQueue.shift();
+ this.inLoop = false;
+ }
+ //API
+ pause() {
+ this.paused = true;
+ }
+ resume(writeCallback) {
+ if (!this.paused) {
+ throw new Error('Parser was already resumed');
+ }
+ this.paused = false;
+ // Necessary for synchronous resume.
+ if (this.inLoop)
+ return;
+ this._runParsingLoop();
+ if (!this.paused) {
+ writeCallback === null || writeCallback === void 0 ? void 0 : writeCallback();
+ }
}
-
- write(chunk, isLastChunk) {
+ write(chunk, isLastChunk, writeCallback) {
this.active = true;
this.preprocessor.write(chunk, isLastChunk);
+ this._runParsingLoop();
+ if (!this.paused) {
+ writeCallback === null || writeCallback === void 0 ? void 0 : writeCallback();
+ }
}
-
insertHtmlAtCurrentPos(chunk) {
this.active = true;
this.preprocessor.insertHtmlAtCurrentPos(chunk);
+ this._runParsingLoop();
}
-
//Hibernation
_ensureHibernation() {
if (this.preprocessor.endOfChunkHit) {
- for (; this.consumedAfterSnapshot > 0; this.consumedAfterSnapshot--) {
- this.preprocessor.retreat();
- }
-
+ this._unconsume(this.consumedAfterSnapshot);
this.active = false;
- this.tokenQueue.push({ type: Tokenizer.HIBERNATION_TOKEN });
-
return true;
}
-
return false;
}
-
//Consumption
_consume() {
this.consumedAfterSnapshot++;
return this.preprocessor.advance();
}
-
- _unconsume() {
- this.consumedAfterSnapshot--;
- this.preprocessor.retreat();
+ _unconsume(count) {
+ this.consumedAfterSnapshot -= count;
+ this.preprocessor.retreat(count);
}
-
_reconsumeInState(state) {
this.state = state;
- this._unconsume();
+ this._unconsume(1);
}
-
- _consumeSequenceIfMatch(pattern, startCp, caseSensitive) {
- let consumedCount = 0;
- let isMatch = true;
- const patternLength = pattern.length;
- let patternPos = 0;
- let cp = startCp;
- let patternCp = void 0;
-
- for (; patternPos < patternLength; patternPos++) {
- if (patternPos > 0) {
- cp = this._consume();
- consumedCount++;
- }
-
- if (cp === $.EOF) {
- isMatch = false;
- break;
- }
-
- patternCp = pattern[patternPos];
-
- if (cp !== patternCp && (caseSensitive || cp !== toAsciiLowerCodePoint(patternCp))) {
- isMatch = false;
- break;
- }
- }
-
- if (!isMatch) {
- while (consumedCount--) {
- this._unconsume();
- }
+ _advanceBy(count) {
+ this.consumedAfterSnapshot += count;
+ for (let i = 0; i < count; i++) {
+ this.preprocessor.advance();
}
-
- return isMatch;
}
-
- //Temp buffer
- _isTempBufferEqualToScriptString() {
- if (this.tempBuff.length !== $$.SCRIPT_STRING.length) {
- return false;
- }
-
- for (let i = 0; i < this.tempBuff.length; i++) {
- if (this.tempBuff[i] !== $$.SCRIPT_STRING[i]) {
- return false;
- }
+ _consumeSequenceIfMatch(pattern, caseSensitive) {
+ if (this.preprocessor.startsWith(pattern, caseSensitive)) {
+ // We will already have consumed one character before calling this method.
+ this._advanceBy(pattern.length - 1);
+ return true;
}
-
- return true;
+ return false;
}
-
//Token creation
_createStartTagToken() {
this.currentToken = {
- type: Tokenizer.START_TAG_TOKEN,
+ type: token_js_1.TokenType.START_TAG,
tagName: '',
+ tagID: html_js_1.TAG_ID.UNKNOWN,
selfClosing: false,
ackSelfClosing: false,
- attrs: []
+ attrs: [],
+ location: this.getCurrentLocation(1),
};
}
-
_createEndTagToken() {
this.currentToken = {
- type: Tokenizer.END_TAG_TOKEN,
+ type: token_js_1.TokenType.END_TAG,
tagName: '',
+ tagID: html_js_1.TAG_ID.UNKNOWN,
selfClosing: false,
- attrs: []
+ ackSelfClosing: false,
+ attrs: [],
+ location: this.getCurrentLocation(2),
};
}
-
- _createCommentToken() {
+ _createCommentToken(offset) {
this.currentToken = {
- type: Tokenizer.COMMENT_TOKEN,
- data: ''
+ type: token_js_1.TokenType.COMMENT,
+ data: '',
+ location: this.getCurrentLocation(offset),
};
}
-
_createDoctypeToken(initialName) {
this.currentToken = {
- type: Tokenizer.DOCTYPE_TOKEN,
+ type: token_js_1.TokenType.DOCTYPE,
name: initialName,
forceQuirks: false,
publicId: null,
- systemId: null
+ systemId: null,
+ location: this.currentLocation,
};
}
-
- _createCharacterToken(type, ch) {
+ _createCharacterToken(type, chars) {
this.currentCharacterToken = {
- type: type,
- chars: ch
+ type,
+ chars,
+ location: this.currentLocation,
};
}
-
- _createEOFToken() {
- this.currentToken = { type: Tokenizer.EOF_TOKEN };
- }
-
//Tag attributes
_createAttr(attrNameFirstCh) {
this.currentAttr = {
name: attrNameFirstCh,
- value: ''
+ value: '',
};
- }
-
- _leaveAttrName(toState) {
- if (Tokenizer.getTokenAttr(this.currentToken, this.currentAttr.name) === null) {
- this.currentToken.attrs.push(this.currentAttr);
- } else {
- this._err(ERR.duplicateAttribute);
+ this.currentLocation = this.getCurrentLocation(0);
+ }
+ _leaveAttrName() {
+ var _a;
+ var _b;
+ const token = this.currentToken;
+ if ((0, token_js_1.getTokenAttr)(token, this.currentAttr.name) === null) {
+ token.attrs.push(this.currentAttr);
+ if (token.location && this.currentLocation) {
+ const attrLocations = ((_a = (_b = token.location).attrs) !== null && _a !== void 0 ? _a : (_b.attrs = Object.create(null)));
+ attrLocations[this.currentAttr.name] = this.currentLocation;
+ // Set end location
+ this._leaveAttrValue();
+ }
+ }
+ else {
+ this._err(error_codes_js_1.ERR.duplicateAttribute);
}
-
- this.state = toState;
}
-
- _leaveAttrValue(toState) {
- this.state = toState;
+ _leaveAttrValue() {
+ if (this.currentLocation) {
+ this.currentLocation.endLine = this.preprocessor.line;
+ this.currentLocation.endCol = this.preprocessor.col;
+ this.currentLocation.endOffset = this.preprocessor.offset;
+ }
}
-
//Token emission
- _emitCurrentToken() {
- this._emitCurrentCharacterToken();
-
- const ct = this.currentToken;
-
+ prepareToken(ct) {
+ this._emitCurrentCharacterToken(ct.location);
this.currentToken = null;
-
- //NOTE: store emited start tag's tagName to determine is the following end tag token is appropriate.
- if (ct.type === Tokenizer.START_TAG_TOKEN) {
+ if (ct.location) {
+ ct.location.endLine = this.preprocessor.line;
+ ct.location.endCol = this.preprocessor.col + 1;
+ ct.location.endOffset = this.preprocessor.offset + 1;
+ }
+ this.currentLocation = this.getCurrentLocation(-1);
+ }
+ emitCurrentTagToken() {
+ const ct = this.currentToken;
+ this.prepareToken(ct);
+ ct.tagID = (0, html_js_1.getTagID)(ct.tagName);
+ if (ct.type === token_js_1.TokenType.START_TAG) {
this.lastStartTagName = ct.tagName;
- } else if (ct.type === Tokenizer.END_TAG_TOKEN) {
+ this.handler.onStartTag(ct);
+ }
+ else {
if (ct.attrs.length > 0) {
- this._err(ERR.endTagWithAttributes);
+ this._err(error_codes_js_1.ERR.endTagWithAttributes);
}
-
if (ct.selfClosing) {
- this._err(ERR.endTagWithTrailingSolidus);
+ this._err(error_codes_js_1.ERR.endTagWithTrailingSolidus);
}
+ this.handler.onEndTag(ct);
}
-
- this.tokenQueue.push(ct);
+ this.preprocessor.dropParsedChunk();
+ }
+ emitCurrentComment(ct) {
+ this.prepareToken(ct);
+ this.handler.onComment(ct);
+ this.preprocessor.dropParsedChunk();
}
-
- _emitCurrentCharacterToken() {
+ emitCurrentDoctype(ct) {
+ this.prepareToken(ct);
+ this.handler.onDoctype(ct);
+ this.preprocessor.dropParsedChunk();
+ }
+ _emitCurrentCharacterToken(nextLocation) {
if (this.currentCharacterToken) {
- this.tokenQueue.push(this.currentCharacterToken);
+ //NOTE: if we have a pending character token, make it's end location equal to the
+ //current token's start location.
+ if (nextLocation && this.currentCharacterToken.location) {
+ this.currentCharacterToken.location.endLine = nextLocation.startLine;
+ this.currentCharacterToken.location.endCol = nextLocation.startCol;
+ this.currentCharacterToken.location.endOffset = nextLocation.startOffset;
+ }
+ switch (this.currentCharacterToken.type) {
+ case token_js_1.TokenType.CHARACTER: {
+ this.handler.onCharacter(this.currentCharacterToken);
+ break;
+ }
+ case token_js_1.TokenType.NULL_CHARACTER: {
+ this.handler.onNullCharacter(this.currentCharacterToken);
+ break;
+ }
+ case token_js_1.TokenType.WHITESPACE_CHARACTER: {
+ this.handler.onWhitespaceCharacter(this.currentCharacterToken);
+ break;
+ }
+ }
this.currentCharacterToken = null;
}
}
-
_emitEOFToken() {
- this._createEOFToken();
- this._emitCurrentToken();
+ const location = this.getCurrentLocation(0);
+ if (location) {
+ location.endLine = location.startLine;
+ location.endCol = location.startCol;
+ location.endOffset = location.startOffset;
+ }
+ this._emitCurrentCharacterToken(location);
+ this.handler.onEof({ type: token_js_1.TokenType.EOF, location });
+ this.active = false;
}
-
//Characters emission
-
//OPTIMIZATION: specification uses only one type of character tokens (one token per character).
//This causes a huge memory overhead and a lot of unnecessary parser loops. parse5 uses 3 groups of characters.
- //If we have a sequence of characters that belong to the same group, parser can process it
+ //If we have a sequence of characters that belong to the same group, the parser can process it
//as a single solid character token.
//So, there are 3 types of character tokens in parse5:
- //1)NULL_CHARACTER_TOKEN - \u0000-character sequences (e.g. '\u0000\u0000\u0000')
- //2)WHITESPACE_CHARACTER_TOKEN - any whitespace/new-line character sequences (e.g. '\n \r\t \f')
- //3)CHARACTER_TOKEN - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^')
+ //1)TokenType.NULL_CHARACTER - \u0000-character sequences (e.g. '\u0000\u0000\u0000')
+ //2)TokenType.WHITESPACE_CHARACTER - any whitespace/new-line character sequences (e.g. '\n \r\t \f')
+ //3)TokenType.CHARACTER - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^')
_appendCharToCurrentCharacterToken(type, ch) {
- if (this.currentCharacterToken && this.currentCharacterToken.type !== type) {
- this._emitCurrentCharacterToken();
- }
-
if (this.currentCharacterToken) {
- this.currentCharacterToken.chars += ch;
- } else {
- this._createCharacterToken(type, ch);
+ if (this.currentCharacterToken.type !== type) {
+ this.currentLocation = this.getCurrentLocation(0);
+ this._emitCurrentCharacterToken(this.currentLocation);
+ this.preprocessor.dropParsedChunk();
+ }
+ else {
+ this.currentCharacterToken.chars += ch;
+ return;
+ }
}
+ this._createCharacterToken(type, ch);
}
-
_emitCodePoint(cp) {
- let type = Tokenizer.CHARACTER_TOKEN;
-
+ let type = token_js_1.TokenType.CHARACTER;
if (isWhitespace(cp)) {
- type = Tokenizer.WHITESPACE_CHARACTER_TOKEN;
- } else if (cp === $.NULL) {
- type = Tokenizer.NULL_CHARACTER_TOKEN;
+ type = token_js_1.TokenType.WHITESPACE_CHARACTER;
}
-
- this._appendCharToCurrentCharacterToken(type, toChar(cp));
- }
-
- _emitSeveralCodePoints(codePoints) {
- for (let i = 0; i < codePoints.length; i++) {
- this._emitCodePoint(codePoints[i]);
+ else if (cp === unicode_js_1.CODE_POINTS.NULL) {
+ type = token_js_1.TokenType.NULL_CHARACTER;
}
+ this._appendCharToCurrentCharacterToken(type, String.fromCodePoint(cp));
}
-
- //NOTE: used then we emit character explicitly. This is always a non-whitespace and a non-null character.
- //So we can avoid additional checks here.
+ //NOTE: used when we emit characters explicitly.
+ //This is always for non-whitespace and non-null characters, which allows us to avoid additional checks.
_emitChars(ch) {
- this._appendCharToCurrentCharacterToken(Tokenizer.CHARACTER_TOKEN, ch);
+ this._appendCharToCurrentCharacterToken(token_js_1.TokenType.CHARACTER, ch);
}
-
// Character reference helpers
- _matchNamedCharacterReference(startCp) {
+ _matchNamedCharacterReference(cp) {
let result = null;
- let excess = 1;
- let i = findNamedEntityTreeBranch(0, startCp);
-
- this.tempBuff.push(startCp);
-
- while (i > -1) {
- const current = neTree[i];
- const inNode = current < MAX_BRANCH_MARKER_VALUE;
- const nodeWithData = inNode && current & HAS_DATA_FLAG;
-
- if (nodeWithData) {
- //NOTE: we use greedy search, so we continue lookup at this point
- result = current & DATA_DUPLET_FLAG ? [neTree[++i], neTree[++i]] : [neTree[++i]];
- excess = 0;
- }
-
- const cp = this._consume();
-
- this.tempBuff.push(cp);
- excess++;
-
- if (cp === $.EOF) {
+ let excess = 0;
+ let withoutSemicolon = false;
+ for (let i = 0, current = decode_js_1.htmlDecodeTree[0]; i >= 0; cp = this._consume()) {
+ i = (0, decode_js_1.determineBranch)(decode_js_1.htmlDecodeTree, current, i + 1, cp);
+ if (i < 0)
break;
- }
-
- if (inNode) {
- i = current & HAS_BRANCHES_FLAG ? findNamedEntityTreeBranch(i, cp) : -1;
- } else {
- i = cp === current ? ++i : -1;
+ excess += 1;
+ current = decode_js_1.htmlDecodeTree[i];
+ const masked = current & decode_js_1.BinTrieFlags.VALUE_LENGTH;
+ // If the branch is a value, store it and continue
+ if (masked) {
+ // The mask is the number of bytes of the value, including the current byte.
+ const valueLength = (masked >> 14) - 1;
+ // Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.
+ // See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state
+ if (cp !== unicode_js_1.CODE_POINTS.SEMICOLON &&
+ this._isCharacterReferenceInAttribute() &&
+ isEntityInAttributeInvalidEnd(this.preprocessor.peek(1))) {
+ //NOTE: we don't flush all consumed code points here, and instead switch back to the original state after
+ //emitting an ampersand. This is fine, as alphanumeric characters won't be parsed differently in attributes.
+ result = [unicode_js_1.CODE_POINTS.AMPERSAND];
+ // Skip over the value.
+ i += valueLength;
+ }
+ else {
+ // If this is a surrogate pair, consume the next two bytes.
+ result =
+ valueLength === 0
+ ? [decode_js_1.htmlDecodeTree[i] & ~decode_js_1.BinTrieFlags.VALUE_LENGTH]
+ : valueLength === 1
+ ? [decode_js_1.htmlDecodeTree[++i]]
+ : [decode_js_1.htmlDecodeTree[++i], decode_js_1.htmlDecodeTree[++i]];
+ excess = 0;
+ withoutSemicolon = cp !== unicode_js_1.CODE_POINTS.SEMICOLON;
+ }
+ if (valueLength === 0) {
+ // If the value is zero-length, we're done.
+ this._consume();
+ break;
+ }
}
}
-
- while (excess--) {
- this.tempBuff.pop();
- this._unconsume();
+ this._unconsume(excess);
+ if (withoutSemicolon && !this.preprocessor.endOfChunkHit) {
+ this._err(error_codes_js_1.ERR.missingSemicolonAfterCharacterReference);
}
-
+ // We want to emit the error above on the code point after the entity.
+ // We always consume one code point too many in the loop, and we wait to
+ // unconsume it until after the error is emitted.
+ this._unconsume(1);
return result;
}
-
_isCharacterReferenceInAttribute() {
- return (
- this.returnState === ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE ||
- this.returnState === ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE ||
- this.returnState === ATTRIBUTE_VALUE_UNQUOTED_STATE
- );
- }
-
- _isCharacterReferenceAttributeQuirk(withSemicolon) {
- if (!withSemicolon && this._isCharacterReferenceInAttribute()) {
- const nextCp = this._consume();
-
- this._unconsume();
-
- return nextCp === $.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp);
- }
-
- return false;
+ return (this.returnState === State.ATTRIBUTE_VALUE_DOUBLE_QUOTED ||
+ this.returnState === State.ATTRIBUTE_VALUE_SINGLE_QUOTED ||
+ this.returnState === State.ATTRIBUTE_VALUE_UNQUOTED);
}
-
- _flushCodePointsConsumedAsCharacterReference() {
+ _flushCodePointConsumedAsCharacterReference(cp) {
if (this._isCharacterReferenceInAttribute()) {
- for (let i = 0; i < this.tempBuff.length; i++) {
- this.currentAttr.value += toChar(this.tempBuff[i]);
+ this.currentAttr.value += String.fromCodePoint(cp);
+ }
+ else {
+ this._emitCodePoint(cp);
+ }
+ }
+ // Calling states this way turns out to be much faster than any other approach.
+ _callState(cp) {
+ switch (this.state) {
+ case State.DATA: {
+ this._stateData(cp);
+ break;
+ }
+ case State.RCDATA: {
+ this._stateRcdata(cp);
+ break;
+ }
+ case State.RAWTEXT: {
+ this._stateRawtext(cp);
+ break;
+ }
+ case State.SCRIPT_DATA: {
+ this._stateScriptData(cp);
+ break;
+ }
+ case State.PLAINTEXT: {
+ this._statePlaintext(cp);
+ break;
+ }
+ case State.TAG_OPEN: {
+ this._stateTagOpen(cp);
+ break;
+ }
+ case State.END_TAG_OPEN: {
+ this._stateEndTagOpen(cp);
+ break;
+ }
+ case State.TAG_NAME: {
+ this._stateTagName(cp);
+ break;
+ }
+ case State.RCDATA_LESS_THAN_SIGN: {
+ this._stateRcdataLessThanSign(cp);
+ break;
+ }
+ case State.RCDATA_END_TAG_OPEN: {
+ this._stateRcdataEndTagOpen(cp);
+ break;
+ }
+ case State.RCDATA_END_TAG_NAME: {
+ this._stateRcdataEndTagName(cp);
+ break;
+ }
+ case State.RAWTEXT_LESS_THAN_SIGN: {
+ this._stateRawtextLessThanSign(cp);
+ break;
+ }
+ case State.RAWTEXT_END_TAG_OPEN: {
+ this._stateRawtextEndTagOpen(cp);
+ break;
+ }
+ case State.RAWTEXT_END_TAG_NAME: {
+ this._stateRawtextEndTagName(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_LESS_THAN_SIGN: {
+ this._stateScriptDataLessThanSign(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_END_TAG_OPEN: {
+ this._stateScriptDataEndTagOpen(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_END_TAG_NAME: {
+ this._stateScriptDataEndTagName(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_ESCAPE_START: {
+ this._stateScriptDataEscapeStart(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_ESCAPE_START_DASH: {
+ this._stateScriptDataEscapeStartDash(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_ESCAPED: {
+ this._stateScriptDataEscaped(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_ESCAPED_DASH: {
+ this._stateScriptDataEscapedDash(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_ESCAPED_DASH_DASH: {
+ this._stateScriptDataEscapedDashDash(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: {
+ this._stateScriptDataEscapedLessThanSign(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_ESCAPED_END_TAG_OPEN: {
+ this._stateScriptDataEscapedEndTagOpen(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_ESCAPED_END_TAG_NAME: {
+ this._stateScriptDataEscapedEndTagName(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_DOUBLE_ESCAPE_START: {
+ this._stateScriptDataDoubleEscapeStart(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_DOUBLE_ESCAPED: {
+ this._stateScriptDataDoubleEscaped(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH: {
+ this._stateScriptDataDoubleEscapedDash(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH: {
+ this._stateScriptDataDoubleEscapedDashDash(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN: {
+ this._stateScriptDataDoubleEscapedLessThanSign(cp);
+ break;
+ }
+ case State.SCRIPT_DATA_DOUBLE_ESCAPE_END: {
+ this._stateScriptDataDoubleEscapeEnd(cp);
+ break;
+ }
+ case State.BEFORE_ATTRIBUTE_NAME: {
+ this._stateBeforeAttributeName(cp);
+ break;
+ }
+ case State.ATTRIBUTE_NAME: {
+ this._stateAttributeName(cp);
+ break;
+ }
+ case State.AFTER_ATTRIBUTE_NAME: {
+ this._stateAfterAttributeName(cp);
+ break;
+ }
+ case State.BEFORE_ATTRIBUTE_VALUE: {
+ this._stateBeforeAttributeValue(cp);
+ break;
+ }
+ case State.ATTRIBUTE_VALUE_DOUBLE_QUOTED: {
+ this._stateAttributeValueDoubleQuoted(cp);
+ break;
+ }
+ case State.ATTRIBUTE_VALUE_SINGLE_QUOTED: {
+ this._stateAttributeValueSingleQuoted(cp);
+ break;
+ }
+ case State.ATTRIBUTE_VALUE_UNQUOTED: {
+ this._stateAttributeValueUnquoted(cp);
+ break;
+ }
+ case State.AFTER_ATTRIBUTE_VALUE_QUOTED: {
+ this._stateAfterAttributeValueQuoted(cp);
+ break;
+ }
+ case State.SELF_CLOSING_START_TAG: {
+ this._stateSelfClosingStartTag(cp);
+ break;
+ }
+ case State.BOGUS_COMMENT: {
+ this._stateBogusComment(cp);
+ break;
+ }
+ case State.MARKUP_DECLARATION_OPEN: {
+ this._stateMarkupDeclarationOpen(cp);
+ break;
+ }
+ case State.COMMENT_START: {
+ this._stateCommentStart(cp);
+ break;
+ }
+ case State.COMMENT_START_DASH: {
+ this._stateCommentStartDash(cp);
+ break;
+ }
+ case State.COMMENT: {
+ this._stateComment(cp);
+ break;
+ }
+ case State.COMMENT_LESS_THAN_SIGN: {
+ this._stateCommentLessThanSign(cp);
+ break;
+ }
+ case State.COMMENT_LESS_THAN_SIGN_BANG: {
+ this._stateCommentLessThanSignBang(cp);
+ break;
+ }
+ case State.COMMENT_LESS_THAN_SIGN_BANG_DASH: {
+ this._stateCommentLessThanSignBangDash(cp);
+ break;
+ }
+ case State.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH: {
+ this._stateCommentLessThanSignBangDashDash(cp);
+ break;
+ }
+ case State.COMMENT_END_DASH: {
+ this._stateCommentEndDash(cp);
+ break;
+ }
+ case State.COMMENT_END: {
+ this._stateCommentEnd(cp);
+ break;
+ }
+ case State.COMMENT_END_BANG: {
+ this._stateCommentEndBang(cp);
+ break;
+ }
+ case State.DOCTYPE: {
+ this._stateDoctype(cp);
+ break;
+ }
+ case State.BEFORE_DOCTYPE_NAME: {
+ this._stateBeforeDoctypeName(cp);
+ break;
+ }
+ case State.DOCTYPE_NAME: {
+ this._stateDoctypeName(cp);
+ break;
+ }
+ case State.AFTER_DOCTYPE_NAME: {
+ this._stateAfterDoctypeName(cp);
+ break;
+ }
+ case State.AFTER_DOCTYPE_PUBLIC_KEYWORD: {
+ this._stateAfterDoctypePublicKeyword(cp);
+ break;
+ }
+ case State.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: {
+ this._stateBeforeDoctypePublicIdentifier(cp);
+ break;
+ }
+ case State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED: {
+ this._stateDoctypePublicIdentifierDoubleQuoted(cp);
+ break;
+ }
+ case State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED: {
+ this._stateDoctypePublicIdentifierSingleQuoted(cp);
+ break;
+ }
+ case State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER: {
+ this._stateAfterDoctypePublicIdentifier(cp);
+ break;
+ }
+ case State.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: {
+ this._stateBetweenDoctypePublicAndSystemIdentifiers(cp);
+ break;
+ }
+ case State.AFTER_DOCTYPE_SYSTEM_KEYWORD: {
+ this._stateAfterDoctypeSystemKeyword(cp);
+ break;
+ }
+ case State.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER: {
+ this._stateBeforeDoctypeSystemIdentifier(cp);
+ break;
+ }
+ case State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED: {
+ this._stateDoctypeSystemIdentifierDoubleQuoted(cp);
+ break;
+ }
+ case State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: {
+ this._stateDoctypeSystemIdentifierSingleQuoted(cp);
+ break;
+ }
+ case State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER: {
+ this._stateAfterDoctypeSystemIdentifier(cp);
+ break;
+ }
+ case State.BOGUS_DOCTYPE: {
+ this._stateBogusDoctype(cp);
+ break;
+ }
+ case State.CDATA_SECTION: {
+ this._stateCdataSection(cp);
+ break;
+ }
+ case State.CDATA_SECTION_BRACKET: {
+ this._stateCdataSectionBracket(cp);
+ break;
+ }
+ case State.CDATA_SECTION_END: {
+ this._stateCdataSectionEnd(cp);
+ break;
+ }
+ case State.CHARACTER_REFERENCE: {
+ this._stateCharacterReference(cp);
+ break;
+ }
+ case State.NAMED_CHARACTER_REFERENCE: {
+ this._stateNamedCharacterReference(cp);
+ break;
+ }
+ case State.AMBIGUOUS_AMPERSAND: {
+ this._stateAmbiguousAmpersand(cp);
+ break;
+ }
+ case State.NUMERIC_CHARACTER_REFERENCE: {
+ this._stateNumericCharacterReference(cp);
+ break;
+ }
+ case State.HEXADEMICAL_CHARACTER_REFERENCE_START: {
+ this._stateHexademicalCharacterReferenceStart(cp);
+ break;
+ }
+ case State.DECIMAL_CHARACTER_REFERENCE_START: {
+ this._stateDecimalCharacterReferenceStart(cp);
+ break;
+ }
+ case State.HEXADEMICAL_CHARACTER_REFERENCE: {
+ this._stateHexademicalCharacterReference(cp);
+ break;
+ }
+ case State.DECIMAL_CHARACTER_REFERENCE: {
+ this._stateDecimalCharacterReference(cp);
+ break;
+ }
+ case State.NUMERIC_CHARACTER_REFERENCE_END: {
+ this._stateNumericCharacterReferenceEnd();
+ break;
+ }
+ default: {
+ throw new Error('Unknown state');
}
- } else {
- this._emitSeveralCodePoints(this.tempBuff);
}
-
- this.tempBuff = [];
}
-
// State machine
-
// Data state
//------------------------------------------------------------------
- [DATA_STATE](cp) {
- this.preprocessor.dropParsedChunk();
-
- if (cp === $.LESS_THAN_SIGN) {
- this.state = TAG_OPEN_STATE;
- } else if (cp === $.AMPERSAND) {
- this.returnState = DATA_STATE;
- this.state = CHARACTER_REFERENCE_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this._emitCodePoint(cp);
- } else if (cp === $.EOF) {
- this._emitEOFToken();
- } else {
- this._emitCodePoint(cp);
+ _stateData(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ this.state = State.TAG_OPEN;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.AMPERSAND: {
+ this.returnState = State.DATA;
+ this.state = State.CHARACTER_REFERENCE;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this._emitCodePoint(cp);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._emitCodePoint(cp);
+ }
}
}
-
// RCDATA state
//------------------------------------------------------------------
- [RCDATA_STATE](cp) {
- this.preprocessor.dropParsedChunk();
-
- if (cp === $.AMPERSAND) {
- this.returnState = RCDATA_STATE;
- this.state = CHARACTER_REFERENCE_STATE;
- } else if (cp === $.LESS_THAN_SIGN) {
- this.state = RCDATA_LESS_THAN_SIGN_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this._emitChars(unicode.REPLACEMENT_CHARACTER);
- } else if (cp === $.EOF) {
- this._emitEOFToken();
- } else {
- this._emitCodePoint(cp);
+ _stateRcdata(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.AMPERSAND: {
+ this.returnState = State.RCDATA;
+ this.state = State.CHARACTER_REFERENCE;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ this.state = State.RCDATA_LESS_THAN_SIGN;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._emitCodePoint(cp);
+ }
}
}
-
// RAWTEXT state
//------------------------------------------------------------------
- [RAWTEXT_STATE](cp) {
- this.preprocessor.dropParsedChunk();
-
- if (cp === $.LESS_THAN_SIGN) {
- this.state = RAWTEXT_LESS_THAN_SIGN_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this._emitChars(unicode.REPLACEMENT_CHARACTER);
- } else if (cp === $.EOF) {
- this._emitEOFToken();
- } else {
- this._emitCodePoint(cp);
+ _stateRawtext(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ this.state = State.RAWTEXT_LESS_THAN_SIGN;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._emitCodePoint(cp);
+ }
}
}
-
// Script data state
//------------------------------------------------------------------
- [SCRIPT_DATA_STATE](cp) {
- this.preprocessor.dropParsedChunk();
-
- if (cp === $.LESS_THAN_SIGN) {
- this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this._emitChars(unicode.REPLACEMENT_CHARACTER);
- } else if (cp === $.EOF) {
- this._emitEOFToken();
- } else {
- this._emitCodePoint(cp);
+ _stateScriptData(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ this.state = State.SCRIPT_DATA_LESS_THAN_SIGN;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._emitCodePoint(cp);
+ }
}
}
-
// PLAINTEXT state
//------------------------------------------------------------------
- [PLAINTEXT_STATE](cp) {
- this.preprocessor.dropParsedChunk();
-
- if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this._emitChars(unicode.REPLACEMENT_CHARACTER);
- } else if (cp === $.EOF) {
- this._emitEOFToken();
- } else {
- this._emitCodePoint(cp);
+ _statePlaintext(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._emitCodePoint(cp);
+ }
}
}
-
// Tag open state
//------------------------------------------------------------------
- [TAG_OPEN_STATE](cp) {
- if (cp === $.EXCLAMATION_MARK) {
- this.state = MARKUP_DECLARATION_OPEN_STATE;
- } else if (cp === $.SOLIDUS) {
- this.state = END_TAG_OPEN_STATE;
- } else if (isAsciiLetter(cp)) {
+ _stateTagOpen(cp) {
+ if (isAsciiLetter(cp)) {
this._createStartTagToken();
- this._reconsumeInState(TAG_NAME_STATE);
- } else if (cp === $.QUESTION_MARK) {
- this._err(ERR.unexpectedQuestionMarkInsteadOfTagName);
- this._createCommentToken();
- this._reconsumeInState(BOGUS_COMMENT_STATE);
- } else if (cp === $.EOF) {
- this._err(ERR.eofBeforeTagName);
- this._emitChars('<');
- this._emitEOFToken();
- } else {
- this._err(ERR.invalidFirstCharacterOfTagName);
- this._emitChars('<');
- this._reconsumeInState(DATA_STATE);
- }
+ this.state = State.TAG_NAME;
+ this._stateTagName(cp);
+ }
+ else
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.EXCLAMATION_MARK: {
+ this.state = State.MARKUP_DECLARATION_OPEN;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.SOLIDUS: {
+ this.state = State.END_TAG_OPEN;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.QUESTION_MARK: {
+ this._err(error_codes_js_1.ERR.unexpectedQuestionMarkInsteadOfTagName);
+ this._createCommentToken(1);
+ this.state = State.BOGUS_COMMENT;
+ this._stateBogusComment(cp);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofBeforeTagName);
+ this._emitChars('<');
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.invalidFirstCharacterOfTagName);
+ this._emitChars('<');
+ this.state = State.DATA;
+ this._stateData(cp);
+ }
+ }
}
-
// End tag open state
//------------------------------------------------------------------
- [END_TAG_OPEN_STATE](cp) {
+ _stateEndTagOpen(cp) {
if (isAsciiLetter(cp)) {
this._createEndTagToken();
- this._reconsumeInState(TAG_NAME_STATE);
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.missingEndTagName);
- this.state = DATA_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofBeforeTagName);
- this._emitChars('');
- this._emitEOFToken();
- } else {
- this._err(ERR.invalidFirstCharacterOfTagName);
- this._createCommentToken();
- this._reconsumeInState(BOGUS_COMMENT_STATE);
- }
+ this.state = State.TAG_NAME;
+ this._stateTagName(cp);
+ }
+ else
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.missingEndTagName);
+ this.state = State.DATA;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofBeforeTagName);
+ this._emitChars('');
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.invalidFirstCharacterOfTagName);
+ this._createCommentToken(2);
+ this.state = State.BOGUS_COMMENT;
+ this._stateBogusComment(cp);
+ }
+ }
}
-
// Tag name state
//------------------------------------------------------------------
- [TAG_NAME_STATE](cp) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
- } else if (cp === $.SOLIDUS) {
- this.state = SELF_CLOSING_START_TAG_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (isAsciiUpper(cp)) {
- this.currentToken.tagName += toAsciiLowerChar(cp);
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentToken.tagName += unicode.REPLACEMENT_CHARACTER;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInTag);
- this._emitEOFToken();
- } else {
- this.currentToken.tagName += toChar(cp);
- }
- }
-
+ _stateTagName(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ this.state = State.BEFORE_ATTRIBUTE_NAME;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.SOLIDUS: {
+ this.state = State.SELF_CLOSING_START_TAG;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.DATA;
+ this.emitCurrentTagToken();
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ token.tagName += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInTag);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.tagName += String.fromCodePoint(isAsciiUpper(cp) ? toAsciiLower(cp) : cp);
+ }
+ }
+ }
// RCDATA less-than sign state
//------------------------------------------------------------------
- [RCDATA_LESS_THAN_SIGN_STATE](cp) {
- if (cp === $.SOLIDUS) {
- this.tempBuff = [];
- this.state = RCDATA_END_TAG_OPEN_STATE;
- } else {
+ _stateRcdataLessThanSign(cp) {
+ if (cp === unicode_js_1.CODE_POINTS.SOLIDUS) {
+ this.state = State.RCDATA_END_TAG_OPEN;
+ }
+ else {
this._emitChars('<');
- this._reconsumeInState(RCDATA_STATE);
+ this.state = State.RCDATA;
+ this._stateRcdata(cp);
}
}
-
// RCDATA end tag open state
//------------------------------------------------------------------
- [RCDATA_END_TAG_OPEN_STATE](cp) {
+ _stateRcdataEndTagOpen(cp) {
if (isAsciiLetter(cp)) {
- this._createEndTagToken();
- this._reconsumeInState(RCDATA_END_TAG_NAME_STATE);
- } else {
+ this.state = State.RCDATA_END_TAG_NAME;
+ this._stateRcdataEndTagName(cp);
+ }
+ else {
this._emitChars('');
- this._reconsumeInState(RCDATA_STATE);
+ this.state = State.RCDATA;
+ this._stateRcdata(cp);
+ }
+ }
+ handleSpecialEndTag(_cp) {
+ if (!this.preprocessor.startsWith(this.lastStartTagName, false)) {
+ return !this._ensureHibernation();
+ }
+ this._createEndTagToken();
+ const token = this.currentToken;
+ token.tagName = this.lastStartTagName;
+ const cp = this.preprocessor.peek(this.lastStartTagName.length);
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ this._advanceBy(this.lastStartTagName.length);
+ this.state = State.BEFORE_ATTRIBUTE_NAME;
+ return false;
+ }
+ case unicode_js_1.CODE_POINTS.SOLIDUS: {
+ this._advanceBy(this.lastStartTagName.length);
+ this.state = State.SELF_CLOSING_START_TAG;
+ return false;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._advanceBy(this.lastStartTagName.length);
+ this.emitCurrentTagToken();
+ this.state = State.DATA;
+ return false;
+ }
+ default: {
+ return !this._ensureHibernation();
+ }
}
}
-
// RCDATA end tag name state
//------------------------------------------------------------------
- [RCDATA_END_TAG_NAME_STATE](cp) {
- if (isAsciiUpper(cp)) {
- this.currentToken.tagName += toAsciiLowerChar(cp);
- this.tempBuff.push(cp);
- } else if (isAsciiLower(cp)) {
- this.currentToken.tagName += toChar(cp);
- this.tempBuff.push(cp);
- } else {
- if (this.lastStartTagName === this.currentToken.tagName) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
- return;
- }
-
- if (cp === $.SOLIDUS) {
- this.state = SELF_CLOSING_START_TAG_STATE;
- return;
- }
-
- if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- return;
- }
- }
-
+ _stateRcdataEndTagName(cp) {
+ if (this.handleSpecialEndTag(cp)) {
this._emitChars('');
- this._emitSeveralCodePoints(this.tempBuff);
- this._reconsumeInState(RCDATA_STATE);
+ this.state = State.RCDATA;
+ this._stateRcdata(cp);
}
}
-
// RAWTEXT less-than sign state
//------------------------------------------------------------------
- [RAWTEXT_LESS_THAN_SIGN_STATE](cp) {
- if (cp === $.SOLIDUS) {
- this.tempBuff = [];
- this.state = RAWTEXT_END_TAG_OPEN_STATE;
- } else {
+ _stateRawtextLessThanSign(cp) {
+ if (cp === unicode_js_1.CODE_POINTS.SOLIDUS) {
+ this.state = State.RAWTEXT_END_TAG_OPEN;
+ }
+ else {
this._emitChars('<');
- this._reconsumeInState(RAWTEXT_STATE);
+ this.state = State.RAWTEXT;
+ this._stateRawtext(cp);
}
}
-
// RAWTEXT end tag open state
//------------------------------------------------------------------
- [RAWTEXT_END_TAG_OPEN_STATE](cp) {
+ _stateRawtextEndTagOpen(cp) {
if (isAsciiLetter(cp)) {
- this._createEndTagToken();
- this._reconsumeInState(RAWTEXT_END_TAG_NAME_STATE);
- } else {
+ this.state = State.RAWTEXT_END_TAG_NAME;
+ this._stateRawtextEndTagName(cp);
+ }
+ else {
this._emitChars('');
- this._reconsumeInState(RAWTEXT_STATE);
+ this.state = State.RAWTEXT;
+ this._stateRawtext(cp);
}
}
-
// RAWTEXT end tag name state
//------------------------------------------------------------------
- [RAWTEXT_END_TAG_NAME_STATE](cp) {
- if (isAsciiUpper(cp)) {
- this.currentToken.tagName += toAsciiLowerChar(cp);
- this.tempBuff.push(cp);
- } else if (isAsciiLower(cp)) {
- this.currentToken.tagName += toChar(cp);
- this.tempBuff.push(cp);
- } else {
- if (this.lastStartTagName === this.currentToken.tagName) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
- return;
- }
-
- if (cp === $.SOLIDUS) {
- this.state = SELF_CLOSING_START_TAG_STATE;
- return;
- }
-
- if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- return;
- }
- }
-
+ _stateRawtextEndTagName(cp) {
+ if (this.handleSpecialEndTag(cp)) {
this._emitChars('');
- this._emitSeveralCodePoints(this.tempBuff);
- this._reconsumeInState(RAWTEXT_STATE);
+ this.state = State.RAWTEXT;
+ this._stateRawtext(cp);
}
}
-
// Script data less-than sign state
//------------------------------------------------------------------
- [SCRIPT_DATA_LESS_THAN_SIGN_STATE](cp) {
- if (cp === $.SOLIDUS) {
- this.tempBuff = [];
- this.state = SCRIPT_DATA_END_TAG_OPEN_STATE;
- } else if (cp === $.EXCLAMATION_MARK) {
- this.state = SCRIPT_DATA_ESCAPE_START_STATE;
- this._emitChars('');
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.state = SCRIPT_DATA_ESCAPED_STATE;
- this._emitChars(unicode.REPLACEMENT_CHARACTER);
- } else if (cp === $.EOF) {
- this._err(ERR.eofInScriptHtmlCommentLikeText);
- this._emitEOFToken();
- } else {
- this.state = SCRIPT_DATA_ESCAPED_STATE;
- this._emitCodePoint(cp);
+ _stateScriptDataEscapedDashDash(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: {
+ this._emitChars('-');
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ this.state = State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.SCRIPT_DATA;
+ this._emitChars('>');
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this.state = State.SCRIPT_DATA_ESCAPED;
+ this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInScriptHtmlCommentLikeText);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this.state = State.SCRIPT_DATA_ESCAPED;
+ this._emitCodePoint(cp);
+ }
}
}
-
// Script data escaped less-than sign state
//------------------------------------------------------------------
- [SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE](cp) {
- if (cp === $.SOLIDUS) {
- this.tempBuff = [];
- this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE;
- } else if (isAsciiLetter(cp)) {
- this.tempBuff = [];
+ _stateScriptDataEscapedLessThanSign(cp) {
+ if (cp === unicode_js_1.CODE_POINTS.SOLIDUS) {
+ this.state = State.SCRIPT_DATA_ESCAPED_END_TAG_OPEN;
+ }
+ else if (isAsciiLetter(cp)) {
this._emitChars('<');
- this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE);
- } else {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPE_START;
+ this._stateScriptDataDoubleEscapeStart(cp);
+ }
+ else {
this._emitChars('<');
- this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
+ this.state = State.SCRIPT_DATA_ESCAPED;
+ this._stateScriptDataEscaped(cp);
}
}
-
// Script data escaped end tag open state
//------------------------------------------------------------------
- [SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE](cp) {
+ _stateScriptDataEscapedEndTagOpen(cp) {
if (isAsciiLetter(cp)) {
- this._createEndTagToken();
- this._reconsumeInState(SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE);
- } else {
+ this.state = State.SCRIPT_DATA_ESCAPED_END_TAG_NAME;
+ this._stateScriptDataEscapedEndTagName(cp);
+ }
+ else {
this._emitChars('');
- this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
+ this.state = State.SCRIPT_DATA_ESCAPED;
+ this._stateScriptDataEscaped(cp);
}
}
-
// Script data escaped end tag name state
//------------------------------------------------------------------
- [SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE](cp) {
- if (isAsciiUpper(cp)) {
- this.currentToken.tagName += toAsciiLowerChar(cp);
- this.tempBuff.push(cp);
- } else if (isAsciiLower(cp)) {
- this.currentToken.tagName += toChar(cp);
- this.tempBuff.push(cp);
- } else {
- if (this.lastStartTagName === this.currentToken.tagName) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
- return;
- }
-
- if (cp === $.SOLIDUS) {
- this.state = SELF_CLOSING_START_TAG_STATE;
- return;
- }
-
- if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- return;
- }
- }
-
+ _stateScriptDataEscapedEndTagName(cp) {
+ if (this.handleSpecialEndTag(cp)) {
this._emitChars('');
- this._emitSeveralCodePoints(this.tempBuff);
- this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
+ this.state = State.SCRIPT_DATA_ESCAPED;
+ this._stateScriptDataEscaped(cp);
}
}
-
// Script data double escape start state
//------------------------------------------------------------------
- [SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE](cp) {
- if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) {
- this.state = this._isTempBufferEqualToScriptString()
- ? SCRIPT_DATA_DOUBLE_ESCAPED_STATE
- : SCRIPT_DATA_ESCAPED_STATE;
- this._emitCodePoint(cp);
- } else if (isAsciiUpper(cp)) {
- this.tempBuff.push(toAsciiLowerCodePoint(cp));
+ _stateScriptDataDoubleEscapeStart(cp) {
+ if (this.preprocessor.startsWith(unicode_js_1.SEQUENCES.SCRIPT, false) &&
+ isScriptDataDoubleEscapeSequenceEnd(this.preprocessor.peek(unicode_js_1.SEQUENCES.SCRIPT.length))) {
this._emitCodePoint(cp);
- } else if (isAsciiLower(cp)) {
- this.tempBuff.push(cp);
- this._emitCodePoint(cp);
- } else {
- this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
+ for (let i = 0; i < unicode_js_1.SEQUENCES.SCRIPT.length; i++) {
+ this._emitCodePoint(this._consume());
+ }
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED;
+ }
+ else if (!this._ensureHibernation()) {
+ this.state = State.SCRIPT_DATA_ESCAPED;
+ this._stateScriptDataEscaped(cp);
}
}
-
// Script data double escaped state
//------------------------------------------------------------------
- [SCRIPT_DATA_DOUBLE_ESCAPED_STATE](cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE;
- this._emitChars('-');
- } else if (cp === $.LESS_THAN_SIGN) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
- this._emitChars('<');
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this._emitChars(unicode.REPLACEMENT_CHARACTER);
- } else if (cp === $.EOF) {
- this._err(ERR.eofInScriptHtmlCommentLikeText);
- this._emitEOFToken();
- } else {
- this._emitCodePoint(cp);
+ _stateScriptDataDoubleEscaped(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH;
+ this._emitChars('-');
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN;
+ this._emitChars('<');
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInScriptHtmlCommentLikeText);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._emitCodePoint(cp);
+ }
}
}
-
// Script data double escaped dash state
//------------------------------------------------------------------
- [SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE](cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE;
- this._emitChars('-');
- } else if (cp === $.LESS_THAN_SIGN) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
- this._emitChars('<');
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
- this._emitChars(unicode.REPLACEMENT_CHARACTER);
- } else if (cp === $.EOF) {
- this._err(ERR.eofInScriptHtmlCommentLikeText);
- this._emitEOFToken();
- } else {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
- this._emitCodePoint(cp);
+ _stateScriptDataDoubleEscapedDash(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH;
+ this._emitChars('-');
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN;
+ this._emitChars('<');
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED;
+ this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInScriptHtmlCommentLikeText);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED;
+ this._emitCodePoint(cp);
+ }
}
}
-
// Script data double escaped dash dash state
//------------------------------------------------------------------
- [SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE](cp) {
- if (cp === $.HYPHEN_MINUS) {
- this._emitChars('-');
- } else if (cp === $.LESS_THAN_SIGN) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
- this._emitChars('<');
- } else if (cp === $.GREATER_THAN_SIGN) {
- this.state = SCRIPT_DATA_STATE;
- this._emitChars('>');
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
- this._emitChars(unicode.REPLACEMENT_CHARACTER);
- } else if (cp === $.EOF) {
- this._err(ERR.eofInScriptHtmlCommentLikeText);
- this._emitEOFToken();
- } else {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
- this._emitCodePoint(cp);
+ _stateScriptDataDoubleEscapedDashDash(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: {
+ this._emitChars('-');
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN;
+ this._emitChars('<');
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.SCRIPT_DATA;
+ this._emitChars('>');
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED;
+ this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInScriptHtmlCommentLikeText);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED;
+ this._emitCodePoint(cp);
+ }
}
}
-
// Script data double escaped less-than sign state
//------------------------------------------------------------------
- [SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE](cp) {
- if (cp === $.SOLIDUS) {
- this.tempBuff = [];
- this.state = SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE;
+ _stateScriptDataDoubleEscapedLessThanSign(cp) {
+ if (cp === unicode_js_1.CODE_POINTS.SOLIDUS) {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPE_END;
this._emitChars('/');
- } else {
- this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);
+ }
+ else {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED;
+ this._stateScriptDataDoubleEscaped(cp);
}
}
-
// Script data double escape end state
//------------------------------------------------------------------
- [SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE](cp) {
- if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) {
- this.state = this._isTempBufferEqualToScriptString()
- ? SCRIPT_DATA_ESCAPED_STATE
- : SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
-
+ _stateScriptDataDoubleEscapeEnd(cp) {
+ if (this.preprocessor.startsWith(unicode_js_1.SEQUENCES.SCRIPT, false) &&
+ isScriptDataDoubleEscapeSequenceEnd(this.preprocessor.peek(unicode_js_1.SEQUENCES.SCRIPT.length))) {
this._emitCodePoint(cp);
- } else if (isAsciiUpper(cp)) {
- this.tempBuff.push(toAsciiLowerCodePoint(cp));
- this._emitCodePoint(cp);
- } else if (isAsciiLower(cp)) {
- this.tempBuff.push(cp);
- this._emitCodePoint(cp);
- } else {
- this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);
+ for (let i = 0; i < unicode_js_1.SEQUENCES.SCRIPT.length; i++) {
+ this._emitCodePoint(this._consume());
+ }
+ this.state = State.SCRIPT_DATA_ESCAPED;
+ }
+ else if (!this._ensureHibernation()) {
+ this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED;
+ this._stateScriptDataDoubleEscaped(cp);
}
}
-
// Before attribute name state
//------------------------------------------------------------------
- [BEFORE_ATTRIBUTE_NAME_STATE](cp) {
- if (isWhitespace(cp)) {
- return;
- }
-
- if (cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN || cp === $.EOF) {
- this._reconsumeInState(AFTER_ATTRIBUTE_NAME_STATE);
- } else if (cp === $.EQUALS_SIGN) {
- this._err(ERR.unexpectedEqualsSignBeforeAttributeName);
- this._createAttr('=');
- this.state = ATTRIBUTE_NAME_STATE;
- } else {
- this._createAttr('');
- this._reconsumeInState(ATTRIBUTE_NAME_STATE);
+ _stateBeforeAttributeName(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ // Ignore whitespace
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.SOLIDUS:
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN:
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this.state = State.AFTER_ATTRIBUTE_NAME;
+ this._stateAfterAttributeName(cp);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EQUALS_SIGN: {
+ this._err(error_codes_js_1.ERR.unexpectedEqualsSignBeforeAttributeName);
+ this._createAttr('=');
+ this.state = State.ATTRIBUTE_NAME;
+ break;
+ }
+ default: {
+ this._createAttr('');
+ this.state = State.ATTRIBUTE_NAME;
+ this._stateAttributeName(cp);
+ }
}
}
-
// Attribute name state
//------------------------------------------------------------------
- [ATTRIBUTE_NAME_STATE](cp) {
- if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN || cp === $.EOF) {
- this._leaveAttrName(AFTER_ATTRIBUTE_NAME_STATE);
- this._unconsume();
- } else if (cp === $.EQUALS_SIGN) {
- this._leaveAttrName(BEFORE_ATTRIBUTE_VALUE_STATE);
- } else if (isAsciiUpper(cp)) {
- this.currentAttr.name += toAsciiLowerChar(cp);
- } else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) {
- this._err(ERR.unexpectedCharacterInAttributeName);
- this.currentAttr.name += toChar(cp);
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentAttr.name += unicode.REPLACEMENT_CHARACTER;
- } else {
- this.currentAttr.name += toChar(cp);
- }
- }
-
+ _stateAttributeName(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED:
+ case unicode_js_1.CODE_POINTS.SOLIDUS:
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN:
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._leaveAttrName();
+ this.state = State.AFTER_ATTRIBUTE_NAME;
+ this._stateAfterAttributeName(cp);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EQUALS_SIGN: {
+ this._leaveAttrName();
+ this.state = State.BEFORE_ATTRIBUTE_VALUE;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK:
+ case unicode_js_1.CODE_POINTS.APOSTROPHE:
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.unexpectedCharacterInAttributeName);
+ this.currentAttr.name += String.fromCodePoint(cp);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this.currentAttr.name += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ default: {
+ this.currentAttr.name += String.fromCodePoint(isAsciiUpper(cp) ? toAsciiLower(cp) : cp);
+ }
+ }
+ }
// After attribute name state
//------------------------------------------------------------------
- [AFTER_ATTRIBUTE_NAME_STATE](cp) {
- if (isWhitespace(cp)) {
- return;
+ _stateAfterAttributeName(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ // Ignore whitespace
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.SOLIDUS: {
+ this.state = State.SELF_CLOSING_START_TAG;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EQUALS_SIGN: {
+ this.state = State.BEFORE_ATTRIBUTE_VALUE;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.DATA;
+ this.emitCurrentTagToken();
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInTag);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._createAttr('');
+ this.state = State.ATTRIBUTE_NAME;
+ this._stateAttributeName(cp);
+ }
}
-
- if (cp === $.SOLIDUS) {
- this.state = SELF_CLOSING_START_TAG_STATE;
- } else if (cp === $.EQUALS_SIGN) {
- this.state = BEFORE_ATTRIBUTE_VALUE_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._err(ERR.eofInTag);
- this._emitEOFToken();
- } else {
- this._createAttr('');
- this._reconsumeInState(ATTRIBUTE_NAME_STATE);
- }
- }
-
+ }
// Before attribute value state
//------------------------------------------------------------------
- [BEFORE_ATTRIBUTE_VALUE_STATE](cp) {
- if (isWhitespace(cp)) {
- return;
- }
-
- if (cp === $.QUOTATION_MARK) {
- this.state = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE;
- } else if (cp === $.APOSTROPHE) {
- this.state = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.missingAttributeValue);
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else {
- this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE);
+ _stateBeforeAttributeValue(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ // Ignore whitespace
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK: {
+ this.state = State.ATTRIBUTE_VALUE_DOUBLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.APOSTROPHE: {
+ this.state = State.ATTRIBUTE_VALUE_SINGLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.missingAttributeValue);
+ this.state = State.DATA;
+ this.emitCurrentTagToken();
+ break;
+ }
+ default: {
+ this.state = State.ATTRIBUTE_VALUE_UNQUOTED;
+ this._stateAttributeValueUnquoted(cp);
+ }
}
}
-
// Attribute value (double-quoted) state
//------------------------------------------------------------------
- [ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE](cp) {
- if (cp === $.QUOTATION_MARK) {
- this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;
- } else if (cp === $.AMPERSAND) {
- this.returnState = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE;
- this.state = CHARACTER_REFERENCE_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentAttr.value += unicode.REPLACEMENT_CHARACTER;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInTag);
- this._emitEOFToken();
- } else {
- this.currentAttr.value += toChar(cp);
- }
- }
-
+ _stateAttributeValueDoubleQuoted(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK: {
+ this.state = State.AFTER_ATTRIBUTE_VALUE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.AMPERSAND: {
+ this.returnState = State.ATTRIBUTE_VALUE_DOUBLE_QUOTED;
+ this.state = State.CHARACTER_REFERENCE;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this.currentAttr.value += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInTag);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this.currentAttr.value += String.fromCodePoint(cp);
+ }
+ }
+ }
// Attribute value (single-quoted) state
//------------------------------------------------------------------
- [ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE](cp) {
- if (cp === $.APOSTROPHE) {
- this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;
- } else if (cp === $.AMPERSAND) {
- this.returnState = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE;
- this.state = CHARACTER_REFERENCE_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentAttr.value += unicode.REPLACEMENT_CHARACTER;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInTag);
- this._emitEOFToken();
- } else {
- this.currentAttr.value += toChar(cp);
- }
- }
-
- // Attribute value (unquoted) state
- //------------------------------------------------------------------
- [ATTRIBUTE_VALUE_UNQUOTED_STATE](cp) {
- if (isWhitespace(cp)) {
- this._leaveAttrValue(BEFORE_ATTRIBUTE_NAME_STATE);
- } else if (cp === $.AMPERSAND) {
- this.returnState = ATTRIBUTE_VALUE_UNQUOTED_STATE;
- this.state = CHARACTER_REFERENCE_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._leaveAttrValue(DATA_STATE);
- this._emitCurrentToken();
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentAttr.value += unicode.REPLACEMENT_CHARACTER;
- } else if (
- cp === $.QUOTATION_MARK ||
- cp === $.APOSTROPHE ||
- cp === $.LESS_THAN_SIGN ||
- cp === $.EQUALS_SIGN ||
- cp === $.GRAVE_ACCENT
- ) {
- this._err(ERR.unexpectedCharacterInUnquotedAttributeValue);
- this.currentAttr.value += toChar(cp);
- } else if (cp === $.EOF) {
- this._err(ERR.eofInTag);
- this._emitEOFToken();
- } else {
- this.currentAttr.value += toChar(cp);
- }
- }
-
- // After attribute value (quoted) state
- //------------------------------------------------------------------
- [AFTER_ATTRIBUTE_VALUE_QUOTED_STATE](cp) {
- if (isWhitespace(cp)) {
- this._leaveAttrValue(BEFORE_ATTRIBUTE_NAME_STATE);
- } else if (cp === $.SOLIDUS) {
- this._leaveAttrValue(SELF_CLOSING_START_TAG_STATE);
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._leaveAttrValue(DATA_STATE);
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._err(ERR.eofInTag);
- this._emitEOFToken();
- } else {
- this._err(ERR.missingWhitespaceBetweenAttributes);
- this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);
- }
- }
-
+ _stateAttributeValueSingleQuoted(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.APOSTROPHE: {
+ this.state = State.AFTER_ATTRIBUTE_VALUE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.AMPERSAND: {
+ this.returnState = State.ATTRIBUTE_VALUE_SINGLE_QUOTED;
+ this.state = State.CHARACTER_REFERENCE;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this.currentAttr.value += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInTag);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this.currentAttr.value += String.fromCodePoint(cp);
+ }
+ }
+ }
+ // Attribute value (unquoted) state
+ //------------------------------------------------------------------
+ _stateAttributeValueUnquoted(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ this._leaveAttrValue();
+ this.state = State.BEFORE_ATTRIBUTE_NAME;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.AMPERSAND: {
+ this.returnState = State.ATTRIBUTE_VALUE_UNQUOTED;
+ this.state = State.CHARACTER_REFERENCE;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._leaveAttrValue();
+ this.state = State.DATA;
+ this.emitCurrentTagToken();
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this.currentAttr.value += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK:
+ case unicode_js_1.CODE_POINTS.APOSTROPHE:
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN:
+ case unicode_js_1.CODE_POINTS.EQUALS_SIGN:
+ case unicode_js_1.CODE_POINTS.GRAVE_ACCENT: {
+ this._err(error_codes_js_1.ERR.unexpectedCharacterInUnquotedAttributeValue);
+ this.currentAttr.value += String.fromCodePoint(cp);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInTag);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this.currentAttr.value += String.fromCodePoint(cp);
+ }
+ }
+ }
+ // After attribute value (quoted) state
+ //------------------------------------------------------------------
+ _stateAfterAttributeValueQuoted(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ this._leaveAttrValue();
+ this.state = State.BEFORE_ATTRIBUTE_NAME;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.SOLIDUS: {
+ this._leaveAttrValue();
+ this.state = State.SELF_CLOSING_START_TAG;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._leaveAttrValue();
+ this.state = State.DATA;
+ this.emitCurrentTagToken();
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInTag);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.missingWhitespaceBetweenAttributes);
+ this.state = State.BEFORE_ATTRIBUTE_NAME;
+ this._stateBeforeAttributeName(cp);
+ }
+ }
+ }
// Self-closing start tag state
//------------------------------------------------------------------
- [SELF_CLOSING_START_TAG_STATE](cp) {
- if (cp === $.GREATER_THAN_SIGN) {
- this.currentToken.selfClosing = true;
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._err(ERR.eofInTag);
- this._emitEOFToken();
- } else {
- this._err(ERR.unexpectedSolidusInTag);
- this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);
+ _stateSelfClosingStartTag(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ const token = this.currentToken;
+ token.selfClosing = true;
+ this.state = State.DATA;
+ this.emitCurrentTagToken();
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInTag);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.unexpectedSolidusInTag);
+ this.state = State.BEFORE_ATTRIBUTE_NAME;
+ this._stateBeforeAttributeName(cp);
+ }
}
}
-
// Bogus comment state
//------------------------------------------------------------------
- [BOGUS_COMMENT_STATE](cp) {
- if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._emitCurrentToken();
- this._emitEOFToken();
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentToken.data += unicode.REPLACEMENT_CHARACTER;
- } else {
- this.currentToken.data += toChar(cp);
- }
- }
-
+ _stateBogusComment(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.DATA;
+ this.emitCurrentComment(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this.emitCurrentComment(token);
+ this._emitEOFToken();
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ token.data += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ default: {
+ token.data += String.fromCodePoint(cp);
+ }
+ }
+ }
// Markup declaration open state
//------------------------------------------------------------------
- [MARKUP_DECLARATION_OPEN_STATE](cp) {
- if (this._consumeSequenceIfMatch($$.DASH_DASH_STRING, cp, true)) {
- this._createCommentToken();
- this.state = COMMENT_START_STATE;
- } else if (this._consumeSequenceIfMatch($$.DOCTYPE_STRING, cp, false)) {
- this.state = DOCTYPE_STATE;
- } else if (this._consumeSequenceIfMatch($$.CDATA_START_STRING, cp, true)) {
- if (this.allowCDATA) {
- this.state = CDATA_SECTION_STATE;
- } else {
- this._err(ERR.cdataInHtmlContent);
- this._createCommentToken();
+ _stateMarkupDeclarationOpen(cp) {
+ if (this._consumeSequenceIfMatch(unicode_js_1.SEQUENCES.DASH_DASH, true)) {
+ this._createCommentToken(unicode_js_1.SEQUENCES.DASH_DASH.length + 1);
+ this.state = State.COMMENT_START;
+ }
+ else if (this._consumeSequenceIfMatch(unicode_js_1.SEQUENCES.DOCTYPE, false)) {
+ // NOTE: Doctypes tokens are created without fixed offsets. We keep track of the moment a doctype *might* start here.
+ this.currentLocation = this.getCurrentLocation(unicode_js_1.SEQUENCES.DOCTYPE.length + 1);
+ this.state = State.DOCTYPE;
+ }
+ else if (this._consumeSequenceIfMatch(unicode_js_1.SEQUENCES.CDATA_START, true)) {
+ if (this.inForeignNode) {
+ this.state = State.CDATA_SECTION;
+ }
+ else {
+ this._err(error_codes_js_1.ERR.cdataInHtmlContent);
+ this._createCommentToken(unicode_js_1.SEQUENCES.CDATA_START.length + 1);
this.currentToken.data = '[CDATA[';
- this.state = BOGUS_COMMENT_STATE;
+ this.state = State.BOGUS_COMMENT;
}
}
-
- //NOTE: sequence lookup can be abrupted by hibernation. In that case lookup
+ //NOTE: Sequence lookups can be abrupted by hibernation. In that case, lookup
//results are no longer valid and we will need to start over.
else if (!this._ensureHibernation()) {
- this._err(ERR.incorrectlyOpenedComment);
- this._createCommentToken();
- this._reconsumeInState(BOGUS_COMMENT_STATE);
+ this._err(error_codes_js_1.ERR.incorrectlyOpenedComment);
+ this._createCommentToken(2);
+ this.state = State.BOGUS_COMMENT;
+ this._stateBogusComment(cp);
}
}
-
// Comment start state
//------------------------------------------------------------------
- [COMMENT_START_STATE](cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = COMMENT_START_DASH_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.abruptClosingOfEmptyComment);
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else {
- this._reconsumeInState(COMMENT_STATE);
+ _stateCommentStart(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: {
+ this.state = State.COMMENT_START_DASH;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.abruptClosingOfEmptyComment);
+ this.state = State.DATA;
+ const token = this.currentToken;
+ this.emitCurrentComment(token);
+ break;
+ }
+ default: {
+ this.state = State.COMMENT;
+ this._stateComment(cp);
+ }
}
}
-
// Comment start dash state
//------------------------------------------------------------------
- [COMMENT_START_DASH_STATE](cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = COMMENT_END_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.abruptClosingOfEmptyComment);
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._err(ERR.eofInComment);
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this.currentToken.data += '-';
- this._reconsumeInState(COMMENT_STATE);
- }
- }
-
+ _stateCommentStartDash(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: {
+ this.state = State.COMMENT_END;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.abruptClosingOfEmptyComment);
+ this.state = State.DATA;
+ this.emitCurrentComment(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInComment);
+ this.emitCurrentComment(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.data += '-';
+ this.state = State.COMMENT;
+ this._stateComment(cp);
+ }
+ }
+ }
// Comment state
//------------------------------------------------------------------
- [COMMENT_STATE](cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = COMMENT_END_DASH_STATE;
- } else if (cp === $.LESS_THAN_SIGN) {
- this.currentToken.data += '<';
- this.state = COMMENT_LESS_THAN_SIGN_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentToken.data += unicode.REPLACEMENT_CHARACTER;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInComment);
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this.currentToken.data += toChar(cp);
- }
- }
-
+ _stateComment(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: {
+ this.state = State.COMMENT_END_DASH;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ token.data += '<';
+ this.state = State.COMMENT_LESS_THAN_SIGN;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ token.data += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInComment);
+ this.emitCurrentComment(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.data += String.fromCodePoint(cp);
+ }
+ }
+ }
// Comment less-than sign state
//------------------------------------------------------------------
- [COMMENT_LESS_THAN_SIGN_STATE](cp) {
- if (cp === $.EXCLAMATION_MARK) {
- this.currentToken.data += '!';
- this.state = COMMENT_LESS_THAN_SIGN_BANG_STATE;
- } else if (cp === $.LESS_THAN_SIGN) {
- this.currentToken.data += '!';
- } else {
- this._reconsumeInState(COMMENT_STATE);
+ _stateCommentLessThanSign(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.EXCLAMATION_MARK: {
+ token.data += '!';
+ this.state = State.COMMENT_LESS_THAN_SIGN_BANG;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: {
+ token.data += '<';
+ break;
+ }
+ default: {
+ this.state = State.COMMENT;
+ this._stateComment(cp);
+ }
}
}
-
// Comment less-than sign bang state
//------------------------------------------------------------------
- [COMMENT_LESS_THAN_SIGN_BANG_STATE](cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE;
- } else {
- this._reconsumeInState(COMMENT_STATE);
+ _stateCommentLessThanSignBang(cp) {
+ if (cp === unicode_js_1.CODE_POINTS.HYPHEN_MINUS) {
+ this.state = State.COMMENT_LESS_THAN_SIGN_BANG_DASH;
+ }
+ else {
+ this.state = State.COMMENT;
+ this._stateComment(cp);
}
}
-
// Comment less-than sign bang dash state
//------------------------------------------------------------------
- [COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE](cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE;
- } else {
- this._reconsumeInState(COMMENT_END_DASH_STATE);
+ _stateCommentLessThanSignBangDash(cp) {
+ if (cp === unicode_js_1.CODE_POINTS.HYPHEN_MINUS) {
+ this.state = State.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH;
+ }
+ else {
+ this.state = State.COMMENT_END_DASH;
+ this._stateCommentEndDash(cp);
}
}
-
// Comment less-than sign bang dash dash state
//------------------------------------------------------------------
- [COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE](cp) {
- if (cp !== $.GREATER_THAN_SIGN && cp !== $.EOF) {
- this._err(ERR.nestedComment);
+ _stateCommentLessThanSignBangDashDash(cp) {
+ if (cp !== unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN && cp !== unicode_js_1.CODE_POINTS.EOF) {
+ this._err(error_codes_js_1.ERR.nestedComment);
}
-
- this._reconsumeInState(COMMENT_END_STATE);
+ this.state = State.COMMENT_END;
+ this._stateCommentEnd(cp);
}
-
// Comment end dash state
//------------------------------------------------------------------
- [COMMENT_END_DASH_STATE](cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = COMMENT_END_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInComment);
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this.currentToken.data += '-';
- this._reconsumeInState(COMMENT_STATE);
+ _stateCommentEndDash(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: {
+ this.state = State.COMMENT_END;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInComment);
+ this.emitCurrentComment(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.data += '-';
+ this.state = State.COMMENT;
+ this._stateComment(cp);
+ }
}
}
-
// Comment end state
//------------------------------------------------------------------
- [COMMENT_END_STATE](cp) {
- if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EXCLAMATION_MARK) {
- this.state = COMMENT_END_BANG_STATE;
- } else if (cp === $.HYPHEN_MINUS) {
- this.currentToken.data += '-';
- } else if (cp === $.EOF) {
- this._err(ERR.eofInComment);
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this.currentToken.data += '--';
- this._reconsumeInState(COMMENT_STATE);
- }
- }
-
+ _stateCommentEnd(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.DATA;
+ this.emitCurrentComment(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EXCLAMATION_MARK: {
+ this.state = State.COMMENT_END_BANG;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: {
+ token.data += '-';
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInComment);
+ this.emitCurrentComment(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.data += '--';
+ this.state = State.COMMENT;
+ this._stateComment(cp);
+ }
+ }
+ }
// Comment end bang state
//------------------------------------------------------------------
- [COMMENT_END_BANG_STATE](cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.currentToken.data += '--!';
- this.state = COMMENT_END_DASH_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.incorrectlyClosedComment);
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._err(ERR.eofInComment);
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this.currentToken.data += '--!';
- this._reconsumeInState(COMMENT_STATE);
- }
- }
-
+ _stateCommentEndBang(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: {
+ token.data += '--!';
+ this.state = State.COMMENT_END_DASH;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.incorrectlyClosedComment);
+ this.state = State.DATA;
+ this.emitCurrentComment(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInComment);
+ this.emitCurrentComment(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.data += '--!';
+ this.state = State.COMMENT;
+ this._stateComment(cp);
+ }
+ }
+ }
// DOCTYPE state
//------------------------------------------------------------------
- [DOCTYPE_STATE](cp) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_DOCTYPE_NAME_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE);
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this._createDoctypeToken(null);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this._err(ERR.missingWhitespaceBeforeDoctypeName);
- this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE);
- }
- }
-
+ _stateDoctype(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ this.state = State.BEFORE_DOCTYPE_NAME;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.BEFORE_DOCTYPE_NAME;
+ this._stateBeforeDoctypeName(cp);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ this._createDoctypeToken(null);
+ const token = this.currentToken;
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.missingWhitespaceBeforeDoctypeName);
+ this.state = State.BEFORE_DOCTYPE_NAME;
+ this._stateBeforeDoctypeName(cp);
+ }
+ }
+ }
// Before DOCTYPE name state
//------------------------------------------------------------------
- [BEFORE_DOCTYPE_NAME_STATE](cp) {
- if (isWhitespace(cp)) {
- return;
- }
-
+ _stateBeforeDoctypeName(cp) {
if (isAsciiUpper(cp)) {
- this._createDoctypeToken(toAsciiLowerChar(cp));
- this.state = DOCTYPE_NAME_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this._createDoctypeToken(unicode.REPLACEMENT_CHARACTER);
- this.state = DOCTYPE_NAME_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.missingDoctypeName);
- this._createDoctypeToken(null);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this._createDoctypeToken(null);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this._createDoctypeToken(toChar(cp));
- this.state = DOCTYPE_NAME_STATE;
- }
- }
-
+ this._createDoctypeToken(String.fromCharCode(toAsciiLower(cp)));
+ this.state = State.DOCTYPE_NAME;
+ }
+ else
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ // Ignore whitespace
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ this._createDoctypeToken(unicode_js_1.REPLACEMENT_CHARACTER);
+ this.state = State.DOCTYPE_NAME;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.missingDoctypeName);
+ this._createDoctypeToken(null);
+ const token = this.currentToken;
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this.state = State.DATA;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ this._createDoctypeToken(null);
+ const token = this.currentToken;
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._createDoctypeToken(String.fromCodePoint(cp));
+ this.state = State.DOCTYPE_NAME;
+ }
+ }
+ }
// DOCTYPE name state
//------------------------------------------------------------------
- [DOCTYPE_NAME_STATE](cp) {
- if (isWhitespace(cp)) {
- this.state = AFTER_DOCTYPE_NAME_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (isAsciiUpper(cp)) {
- this.currentToken.name += toAsciiLowerChar(cp);
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentToken.name += unicode.REPLACEMENT_CHARACTER;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this.currentToken.name += toChar(cp);
- }
- }
-
+ _stateDoctypeName(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ this.state = State.AFTER_DOCTYPE_NAME;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.DATA;
+ this.emitCurrentDoctype(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ token.name += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.name += String.fromCodePoint(isAsciiUpper(cp) ? toAsciiLower(cp) : cp);
+ }
+ }
+ }
// After DOCTYPE name state
//------------------------------------------------------------------
- [AFTER_DOCTYPE_NAME_STATE](cp) {
- if (isWhitespace(cp)) {
- return;
- }
-
- if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else if (this._consumeSequenceIfMatch($$.PUBLIC_STRING, cp, false)) {
- this.state = AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE;
- } else if (this._consumeSequenceIfMatch($$.SYSTEM_STRING, cp, false)) {
- this.state = AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE;
- }
- //NOTE: sequence lookup can be abrupted by hibernation. In that case lookup
- //results are no longer valid and we will need to start over.
- else if (!this._ensureHibernation()) {
- this._err(ERR.invalidCharacterSequenceAfterDoctypeName);
- this.currentToken.forceQuirks = true;
- this._reconsumeInState(BOGUS_DOCTYPE_STATE);
+ _stateAfterDoctypeName(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ // Ignore whitespace
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.DATA;
+ this.emitCurrentDoctype(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default:
+ if (this._consumeSequenceIfMatch(unicode_js_1.SEQUENCES.PUBLIC, false)) {
+ this.state = State.AFTER_DOCTYPE_PUBLIC_KEYWORD;
+ }
+ else if (this._consumeSequenceIfMatch(unicode_js_1.SEQUENCES.SYSTEM, false)) {
+ this.state = State.AFTER_DOCTYPE_SYSTEM_KEYWORD;
+ }
+ //NOTE: sequence lookup can be abrupted by hibernation. In that case lookup
+ //results are no longer valid and we will need to start over.
+ else if (!this._ensureHibernation()) {
+ this._err(error_codes_js_1.ERR.invalidCharacterSequenceAfterDoctypeName);
+ token.forceQuirks = true;
+ this.state = State.BOGUS_DOCTYPE;
+ this._stateBogusDoctype(cp);
+ }
}
}
-
// After DOCTYPE public keyword state
//------------------------------------------------------------------
- [AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE](cp) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
- } else if (cp === $.QUOTATION_MARK) {
- this._err(ERR.missingWhitespaceAfterDoctypePublicKeyword);
- this.currentToken.publicId = '';
- this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE;
- } else if (cp === $.APOSTROPHE) {
- this._err(ERR.missingWhitespaceAfterDoctypePublicKeyword);
- this.currentToken.publicId = '';
- this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.missingDoctypePublicIdentifier);
- this.currentToken.forceQuirks = true;
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this._err(ERR.missingQuoteBeforeDoctypePublicIdentifier);
- this.currentToken.forceQuirks = true;
- this._reconsumeInState(BOGUS_DOCTYPE_STATE);
- }
- }
-
+ _stateAfterDoctypePublicKeyword(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ this.state = State.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK: {
+ this._err(error_codes_js_1.ERR.missingWhitespaceAfterDoctypePublicKeyword);
+ token.publicId = '';
+ this.state = State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.APOSTROPHE: {
+ this._err(error_codes_js_1.ERR.missingWhitespaceAfterDoctypePublicKeyword);
+ token.publicId = '';
+ this.state = State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.missingDoctypePublicIdentifier);
+ token.forceQuirks = true;
+ this.state = State.DATA;
+ this.emitCurrentDoctype(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypePublicIdentifier);
+ token.forceQuirks = true;
+ this.state = State.BOGUS_DOCTYPE;
+ this._stateBogusDoctype(cp);
+ }
+ }
+ }
// Before DOCTYPE public identifier state
//------------------------------------------------------------------
- [BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE](cp) {
- if (isWhitespace(cp)) {
- return;
+ _stateBeforeDoctypePublicIdentifier(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ // Ignore whitespace
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK: {
+ token.publicId = '';
+ this.state = State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.APOSTROPHE: {
+ token.publicId = '';
+ this.state = State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.missingDoctypePublicIdentifier);
+ token.forceQuirks = true;
+ this.state = State.DATA;
+ this.emitCurrentDoctype(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypePublicIdentifier);
+ token.forceQuirks = true;
+ this.state = State.BOGUS_DOCTYPE;
+ this._stateBogusDoctype(cp);
+ }
}
-
- if (cp === $.QUOTATION_MARK) {
- this.currentToken.publicId = '';
- this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE;
- } else if (cp === $.APOSTROPHE) {
- this.currentToken.publicId = '';
- this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.missingDoctypePublicIdentifier);
- this.currentToken.forceQuirks = true;
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this._err(ERR.missingQuoteBeforeDoctypePublicIdentifier);
- this.currentToken.forceQuirks = true;
- this._reconsumeInState(BOGUS_DOCTYPE_STATE);
- }
- }
-
+ }
// DOCTYPE public identifier (double-quoted) state
//------------------------------------------------------------------
- [DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE](cp) {
- if (cp === $.QUOTATION_MARK) {
- this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentToken.publicId += unicode.REPLACEMENT_CHARACTER;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.abruptDoctypePublicIdentifier);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this.currentToken.publicId += toChar(cp);
- }
- }
-
+ _stateDoctypePublicIdentifierDoubleQuoted(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK: {
+ this.state = State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ token.publicId += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.abruptDoctypePublicIdentifier);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this.state = State.DATA;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.publicId += String.fromCodePoint(cp);
+ }
+ }
+ }
// DOCTYPE public identifier (single-quoted) state
//------------------------------------------------------------------
- [DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE](cp) {
- if (cp === $.APOSTROPHE) {
- this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentToken.publicId += unicode.REPLACEMENT_CHARACTER;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.abruptDoctypePublicIdentifier);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this.currentToken.publicId += toChar(cp);
- }
- }
-
+ _stateDoctypePublicIdentifierSingleQuoted(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.APOSTROPHE: {
+ this.state = State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ token.publicId += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.abruptDoctypePublicIdentifier);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this.state = State.DATA;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.publicId += String.fromCodePoint(cp);
+ }
+ }
+ }
// After DOCTYPE public identifier state
//------------------------------------------------------------------
- [AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE](cp) {
- if (isWhitespace(cp)) {
- this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.QUOTATION_MARK) {
- this._err(ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers);
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
- } else if (cp === $.APOSTROPHE) {
- this._err(ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers);
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);
- this.currentToken.forceQuirks = true;
- this._reconsumeInState(BOGUS_DOCTYPE_STATE);
- }
- }
-
+ _stateAfterDoctypePublicIdentifier(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ this.state = State.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.DATA;
+ this.emitCurrentDoctype(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK: {
+ this._err(error_codes_js_1.ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers);
+ token.systemId = '';
+ this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.APOSTROPHE: {
+ this._err(error_codes_js_1.ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers);
+ token.systemId = '';
+ this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypeSystemIdentifier);
+ token.forceQuirks = true;
+ this.state = State.BOGUS_DOCTYPE;
+ this._stateBogusDoctype(cp);
+ }
+ }
+ }
// Between DOCTYPE public and system identifiers state
//------------------------------------------------------------------
- [BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE](cp) {
- if (isWhitespace(cp)) {
- return;
+ _stateBetweenDoctypePublicAndSystemIdentifiers(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ // Ignore whitespace
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.emitCurrentDoctype(token);
+ this.state = State.DATA;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK: {
+ token.systemId = '';
+ this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.APOSTROPHE: {
+ token.systemId = '';
+ this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypeSystemIdentifier);
+ token.forceQuirks = true;
+ this.state = State.BOGUS_DOCTYPE;
+ this._stateBogusDoctype(cp);
+ }
}
-
- if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- } else if (cp === $.QUOTATION_MARK) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
- } else if (cp === $.APOSTROPHE) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);
- this.currentToken.forceQuirks = true;
- this._reconsumeInState(BOGUS_DOCTYPE_STATE);
- }
- }
-
+ }
// After DOCTYPE system keyword state
//------------------------------------------------------------------
- [AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE](cp) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
- } else if (cp === $.QUOTATION_MARK) {
- this._err(ERR.missingWhitespaceAfterDoctypeSystemKeyword);
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
- } else if (cp === $.APOSTROPHE) {
- this._err(ERR.missingWhitespaceAfterDoctypeSystemKeyword);
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.missingDoctypeSystemIdentifier);
- this.currentToken.forceQuirks = true;
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);
- this.currentToken.forceQuirks = true;
- this._reconsumeInState(BOGUS_DOCTYPE_STATE);
- }
- }
-
+ _stateAfterDoctypeSystemKeyword(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ this.state = State.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK: {
+ this._err(error_codes_js_1.ERR.missingWhitespaceAfterDoctypeSystemKeyword);
+ token.systemId = '';
+ this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.APOSTROPHE: {
+ this._err(error_codes_js_1.ERR.missingWhitespaceAfterDoctypeSystemKeyword);
+ token.systemId = '';
+ this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.missingDoctypeSystemIdentifier);
+ token.forceQuirks = true;
+ this.state = State.DATA;
+ this.emitCurrentDoctype(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypeSystemIdentifier);
+ token.forceQuirks = true;
+ this.state = State.BOGUS_DOCTYPE;
+ this._stateBogusDoctype(cp);
+ }
+ }
+ }
// Before DOCTYPE system identifier state
//------------------------------------------------------------------
- [BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE](cp) {
- if (isWhitespace(cp)) {
- return;
+ _stateBeforeDoctypeSystemIdentifier(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ // Ignore whitespace
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK: {
+ token.systemId = '';
+ this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.APOSTROPHE: {
+ token.systemId = '';
+ this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.missingDoctypeSystemIdentifier);
+ token.forceQuirks = true;
+ this.state = State.DATA;
+ this.emitCurrentDoctype(token);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypeSystemIdentifier);
+ token.forceQuirks = true;
+ this.state = State.BOGUS_DOCTYPE;
+ this._stateBogusDoctype(cp);
+ }
}
-
- if (cp === $.QUOTATION_MARK) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
- } else if (cp === $.APOSTROPHE) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.missingDoctypeSystemIdentifier);
- this.currentToken.forceQuirks = true;
- this.state = DATA_STATE;
- this._emitCurrentToken();
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);
- this.currentToken.forceQuirks = true;
- this._reconsumeInState(BOGUS_DOCTYPE_STATE);
- }
- }
-
+ }
// DOCTYPE system identifier (double-quoted) state
//------------------------------------------------------------------
- [DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE](cp) {
- if (cp === $.QUOTATION_MARK) {
- this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentToken.systemId += unicode.REPLACEMENT_CHARACTER;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.abruptDoctypeSystemIdentifier);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this.currentToken.systemId += toChar(cp);
- }
- }
-
+ _stateDoctypeSystemIdentifierDoubleQuoted(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.QUOTATION_MARK: {
+ this.state = State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ token.systemId += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.abruptDoctypeSystemIdentifier);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this.state = State.DATA;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.systemId += String.fromCodePoint(cp);
+ }
+ }
+ }
// DOCTYPE system identifier (single-quoted) state
//------------------------------------------------------------------
- [DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE](cp) {
- if (cp === $.APOSTROPHE) {
- this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- this.currentToken.systemId += unicode.REPLACEMENT_CHARACTER;
- } else if (cp === $.GREATER_THAN_SIGN) {
- this._err(ERR.abruptDoctypeSystemIdentifier);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this.currentToken.systemId += toChar(cp);
- }
- }
-
+ _stateDoctypeSystemIdentifierSingleQuoted(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.APOSTROPHE: {
+ this.state = State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ token.systemId += unicode_js_1.REPLACEMENT_CHARACTER;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this._err(error_codes_js_1.ERR.abruptDoctypeSystemIdentifier);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this.state = State.DATA;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ token.systemId += String.fromCodePoint(cp);
+ }
+ }
+ }
// After DOCTYPE system identifier state
//------------------------------------------------------------------
- [AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE](cp) {
- if (isWhitespace(cp)) {
- return;
+ _stateAfterDoctypeSystemIdentifier(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.SPACE:
+ case unicode_js_1.CODE_POINTS.LINE_FEED:
+ case unicode_js_1.CODE_POINTS.TABULATION:
+ case unicode_js_1.CODE_POINTS.FORM_FEED: {
+ // Ignore whitespace
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.emitCurrentDoctype(token);
+ this.state = State.DATA;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInDoctype);
+ token.forceQuirks = true;
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._err(error_codes_js_1.ERR.unexpectedCharacterAfterDoctypeSystemIdentifier);
+ this.state = State.BOGUS_DOCTYPE;
+ this._stateBogusDoctype(cp);
+ }
}
-
- if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInDoctype);
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._emitEOFToken();
- } else {
- this._err(ERR.unexpectedCharacterAfterDoctypeSystemIdentifier);
- this._reconsumeInState(BOGUS_DOCTYPE_STATE);
- }
- }
-
+ }
// Bogus DOCTYPE state
//------------------------------------------------------------------
- [BOGUS_DOCTYPE_STATE](cp) {
- if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- } else if (cp === $.NULL) {
- this._err(ERR.unexpectedNullCharacter);
- } else if (cp === $.EOF) {
- this._emitCurrentToken();
- this._emitEOFToken();
+ _stateBogusDoctype(cp) {
+ const token = this.currentToken;
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.emitCurrentDoctype(token);
+ this.state = State.DATA;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.NULL: {
+ this._err(error_codes_js_1.ERR.unexpectedNullCharacter);
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this.emitCurrentDoctype(token);
+ this._emitEOFToken();
+ break;
+ }
+ default:
+ // Do nothing
}
}
-
// CDATA section state
//------------------------------------------------------------------
- [CDATA_SECTION_STATE](cp) {
- if (cp === $.RIGHT_SQUARE_BRACKET) {
- this.state = CDATA_SECTION_BRACKET_STATE;
- } else if (cp === $.EOF) {
- this._err(ERR.eofInCdata);
- this._emitEOFToken();
- } else {
- this._emitCodePoint(cp);
+ _stateCdataSection(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.RIGHT_SQUARE_BRACKET: {
+ this.state = State.CDATA_SECTION_BRACKET;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.EOF: {
+ this._err(error_codes_js_1.ERR.eofInCdata);
+ this._emitEOFToken();
+ break;
+ }
+ default: {
+ this._emitCodePoint(cp);
+ }
}
}
-
// CDATA section bracket state
//------------------------------------------------------------------
- [CDATA_SECTION_BRACKET_STATE](cp) {
- if (cp === $.RIGHT_SQUARE_BRACKET) {
- this.state = CDATA_SECTION_END_STATE;
- } else {
+ _stateCdataSectionBracket(cp) {
+ if (cp === unicode_js_1.CODE_POINTS.RIGHT_SQUARE_BRACKET) {
+ this.state = State.CDATA_SECTION_END;
+ }
+ else {
this._emitChars(']');
- this._reconsumeInState(CDATA_SECTION_STATE);
+ this.state = State.CDATA_SECTION;
+ this._stateCdataSection(cp);
}
}
-
// CDATA section end state
//------------------------------------------------------------------
- [CDATA_SECTION_END_STATE](cp) {
- if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- } else if (cp === $.RIGHT_SQUARE_BRACKET) {
- this._emitChars(']');
- } else {
- this._emitChars(']]');
- this._reconsumeInState(CDATA_SECTION_STATE);
+ _stateCdataSectionEnd(cp) {
+ switch (cp) {
+ case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: {
+ this.state = State.DATA;
+ break;
+ }
+ case unicode_js_1.CODE_POINTS.RIGHT_SQUARE_BRACKET: {
+ this._emitChars(']');
+ break;
+ }
+ default: {
+ this._emitChars(']]');
+ this.state = State.CDATA_SECTION;
+ this._stateCdataSection(cp);
+ }
}
}
-
// Character reference state
//------------------------------------------------------------------
- [CHARACTER_REFERENCE_STATE](cp) {
- this.tempBuff = [$.AMPERSAND];
-
- if (cp === $.NUMBER_SIGN) {
- this.tempBuff.push(cp);
- this.state = NUMERIC_CHARACTER_REFERENCE_STATE;
- } else if (isAsciiAlphaNumeric(cp)) {
- this._reconsumeInState(NAMED_CHARACTER_REFERENCE_STATE);
- } else {
- this._flushCodePointsConsumedAsCharacterReference();
+ _stateCharacterReference(cp) {
+ if (cp === unicode_js_1.CODE_POINTS.NUMBER_SIGN) {
+ this.state = State.NUMERIC_CHARACTER_REFERENCE;
+ }
+ else if (isAsciiAlphaNumeric(cp)) {
+ this.state = State.NAMED_CHARACTER_REFERENCE;
+ this._stateNamedCharacterReference(cp);
+ }
+ else {
+ this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.AMPERSAND);
this._reconsumeInState(this.returnState);
}
}
-
// Named character reference state
//------------------------------------------------------------------
- [NAMED_CHARACTER_REFERENCE_STATE](cp) {
+ _stateNamedCharacterReference(cp) {
const matchResult = this._matchNamedCharacterReference(cp);
-
- //NOTE: matching can be abrupted by hibernation. In that case match
+ //NOTE: Matching can be abrupted by hibernation. In that case, match
//results are no longer valid and we will need to start over.
if (this._ensureHibernation()) {
- this.tempBuff = [$.AMPERSAND];
- } else if (matchResult) {
- const withSemicolon = this.tempBuff[this.tempBuff.length - 1] === $.SEMICOLON;
-
- if (!this._isCharacterReferenceAttributeQuirk(withSemicolon)) {
- if (!withSemicolon) {
- this._errOnNextCodePoint(ERR.missingSemicolonAfterCharacterReference);
- }
-
- this.tempBuff = matchResult;
+ // Stay in the state, try again.
+ }
+ else if (matchResult) {
+ for (let i = 0; i < matchResult.length; i++) {
+ this._flushCodePointConsumedAsCharacterReference(matchResult[i]);
}
-
- this._flushCodePointsConsumedAsCharacterReference();
this.state = this.returnState;
- } else {
- this._flushCodePointsConsumedAsCharacterReference();
- this.state = AMBIGUOUS_AMPERSAND_STATE;
+ }
+ else {
+ this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.AMPERSAND);
+ this.state = State.AMBIGUOUS_AMPERSAND;
}
}
-
// Ambiguos ampersand state
//------------------------------------------------------------------
- [AMBIGUOUS_AMPERSAND_STATE](cp) {
+ _stateAmbiguousAmpersand(cp) {
if (isAsciiAlphaNumeric(cp)) {
- if (this._isCharacterReferenceInAttribute()) {
- this.currentAttr.value += toChar(cp);
- } else {
- this._emitCodePoint(cp);
- }
- } else {
- if (cp === $.SEMICOLON) {
- this._err(ERR.unknownNamedCharacterReference);
+ this._flushCodePointConsumedAsCharacterReference(cp);
+ }
+ else {
+ if (cp === unicode_js_1.CODE_POINTS.SEMICOLON) {
+ this._err(error_codes_js_1.ERR.unknownNamedCharacterReference);
}
-
this._reconsumeInState(this.returnState);
}
}
-
// Numeric character reference state
//------------------------------------------------------------------
- [NUMERIC_CHARACTER_REFERENCE_STATE](cp) {
+ _stateNumericCharacterReference(cp) {
this.charRefCode = 0;
-
- if (cp === $.LATIN_SMALL_X || cp === $.LATIN_CAPITAL_X) {
- this.tempBuff.push(cp);
- this.state = HEXADEMICAL_CHARACTER_REFERENCE_START_STATE;
- } else {
- this._reconsumeInState(DECIMAL_CHARACTER_REFERENCE_START_STATE);
+ if (cp === unicode_js_1.CODE_POINTS.LATIN_SMALL_X || cp === unicode_js_1.CODE_POINTS.LATIN_CAPITAL_X) {
+ this.state = State.HEXADEMICAL_CHARACTER_REFERENCE_START;
+ }
+ else {
+ this.state = State.DECIMAL_CHARACTER_REFERENCE_START;
+ this._stateDecimalCharacterReferenceStart(cp);
}
}
-
// Hexademical character reference start state
//------------------------------------------------------------------
- [HEXADEMICAL_CHARACTER_REFERENCE_START_STATE](cp) {
+ _stateHexademicalCharacterReferenceStart(cp) {
if (isAsciiHexDigit(cp)) {
- this._reconsumeInState(HEXADEMICAL_CHARACTER_REFERENCE_STATE);
- } else {
- this._err(ERR.absenceOfDigitsInNumericCharacterReference);
- this._flushCodePointsConsumedAsCharacterReference();
- this._reconsumeInState(this.returnState);
+ this.state = State.HEXADEMICAL_CHARACTER_REFERENCE;
+ this._stateHexademicalCharacterReference(cp);
+ }
+ else {
+ this._err(error_codes_js_1.ERR.absenceOfDigitsInNumericCharacterReference);
+ this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.AMPERSAND);
+ this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.NUMBER_SIGN);
+ this._unconsume(2);
+ this.state = this.returnState;
}
}
-
// Decimal character reference start state
//------------------------------------------------------------------
- [DECIMAL_CHARACTER_REFERENCE_START_STATE](cp) {
+ _stateDecimalCharacterReferenceStart(cp) {
if (isAsciiDigit(cp)) {
- this._reconsumeInState(DECIMAL_CHARACTER_REFERENCE_STATE);
- } else {
- this._err(ERR.absenceOfDigitsInNumericCharacterReference);
- this._flushCodePointsConsumedAsCharacterReference();
+ this.state = State.DECIMAL_CHARACTER_REFERENCE;
+ this._stateDecimalCharacterReference(cp);
+ }
+ else {
+ this._err(error_codes_js_1.ERR.absenceOfDigitsInNumericCharacterReference);
+ this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.AMPERSAND);
+ this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.NUMBER_SIGN);
this._reconsumeInState(this.returnState);
}
}
-
// Hexademical character reference state
//------------------------------------------------------------------
- [HEXADEMICAL_CHARACTER_REFERENCE_STATE](cp) {
+ _stateHexademicalCharacterReference(cp) {
if (isAsciiUpperHexDigit(cp)) {
this.charRefCode = this.charRefCode * 16 + cp - 0x37;
- } else if (isAsciiLowerHexDigit(cp)) {
+ }
+ else if (isAsciiLowerHexDigit(cp)) {
this.charRefCode = this.charRefCode * 16 + cp - 0x57;
- } else if (isAsciiDigit(cp)) {
+ }
+ else if (isAsciiDigit(cp)) {
this.charRefCode = this.charRefCode * 16 + cp - 0x30;
- } else if (cp === $.SEMICOLON) {
- this.state = NUMERIC_CHARACTER_REFERENCE_END_STATE;
- } else {
- this._err(ERR.missingSemicolonAfterCharacterReference);
- this._reconsumeInState(NUMERIC_CHARACTER_REFERENCE_END_STATE);
+ }
+ else if (cp === unicode_js_1.CODE_POINTS.SEMICOLON) {
+ this.state = State.NUMERIC_CHARACTER_REFERENCE_END;
+ }
+ else {
+ this._err(error_codes_js_1.ERR.missingSemicolonAfterCharacterReference);
+ this.state = State.NUMERIC_CHARACTER_REFERENCE_END;
+ this._stateNumericCharacterReferenceEnd();
}
}
-
// Decimal character reference state
//------------------------------------------------------------------
- [DECIMAL_CHARACTER_REFERENCE_STATE](cp) {
+ _stateDecimalCharacterReference(cp) {
if (isAsciiDigit(cp)) {
this.charRefCode = this.charRefCode * 10 + cp - 0x30;
- } else if (cp === $.SEMICOLON) {
- this.state = NUMERIC_CHARACTER_REFERENCE_END_STATE;
- } else {
- this._err(ERR.missingSemicolonAfterCharacterReference);
- this._reconsumeInState(NUMERIC_CHARACTER_REFERENCE_END_STATE);
+ }
+ else if (cp === unicode_js_1.CODE_POINTS.SEMICOLON) {
+ this.state = State.NUMERIC_CHARACTER_REFERENCE_END;
+ }
+ else {
+ this._err(error_codes_js_1.ERR.missingSemicolonAfterCharacterReference);
+ this.state = State.NUMERIC_CHARACTER_REFERENCE_END;
+ this._stateNumericCharacterReferenceEnd();
}
}
-
// Numeric character reference end state
//------------------------------------------------------------------
- [NUMERIC_CHARACTER_REFERENCE_END_STATE]() {
- if (this.charRefCode === $.NULL) {
- this._err(ERR.nullCharacterReference);
- this.charRefCode = $.REPLACEMENT_CHARACTER;
- } else if (this.charRefCode > 0x10ffff) {
- this._err(ERR.characterReferenceOutsideUnicodeRange);
- this.charRefCode = $.REPLACEMENT_CHARACTER;
- } else if (unicode.isSurrogate(this.charRefCode)) {
- this._err(ERR.surrogateCharacterReference);
- this.charRefCode = $.REPLACEMENT_CHARACTER;
- } else if (unicode.isUndefinedCodePoint(this.charRefCode)) {
- this._err(ERR.noncharacterCharacterReference);
- } else if (unicode.isControlCodePoint(this.charRefCode) || this.charRefCode === $.CARRIAGE_RETURN) {
- this._err(ERR.controlCharacterReference);
-
- const replacement = C1_CONTROLS_REFERENCE_REPLACEMENTS[this.charRefCode];
-
- if (replacement) {
+ _stateNumericCharacterReferenceEnd() {
+ if (this.charRefCode === unicode_js_1.CODE_POINTS.NULL) {
+ this._err(error_codes_js_1.ERR.nullCharacterReference);
+ this.charRefCode = unicode_js_1.CODE_POINTS.REPLACEMENT_CHARACTER;
+ }
+ else if (this.charRefCode > 1114111) {
+ this._err(error_codes_js_1.ERR.characterReferenceOutsideUnicodeRange);
+ this.charRefCode = unicode_js_1.CODE_POINTS.REPLACEMENT_CHARACTER;
+ }
+ else if ((0, unicode_js_1.isSurrogate)(this.charRefCode)) {
+ this._err(error_codes_js_1.ERR.surrogateCharacterReference);
+ this.charRefCode = unicode_js_1.CODE_POINTS.REPLACEMENT_CHARACTER;
+ }
+ else if ((0, unicode_js_1.isUndefinedCodePoint)(this.charRefCode)) {
+ this._err(error_codes_js_1.ERR.noncharacterCharacterReference);
+ }
+ else if ((0, unicode_js_1.isControlCodePoint)(this.charRefCode) || this.charRefCode === unicode_js_1.CODE_POINTS.CARRIAGE_RETURN) {
+ this._err(error_codes_js_1.ERR.controlCharacterReference);
+ const replacement = C1_CONTROLS_REFERENCE_REPLACEMENTS.get(this.charRefCode);
+ if (replacement !== undefined) {
this.charRefCode = replacement;
}
}
-
- this.tempBuff = [this.charRefCode];
-
- this._flushCodePointsConsumedAsCharacterReference();
+ this._flushCodePointConsumedAsCharacterReference(this.charRefCode);
this._reconsumeInState(this.returnState);
}
}
-
-//Token types
-Tokenizer.CHARACTER_TOKEN = 'CHARACTER_TOKEN';
-Tokenizer.NULL_CHARACTER_TOKEN = 'NULL_CHARACTER_TOKEN';
-Tokenizer.WHITESPACE_CHARACTER_TOKEN = 'WHITESPACE_CHARACTER_TOKEN';
-Tokenizer.START_TAG_TOKEN = 'START_TAG_TOKEN';
-Tokenizer.END_TAG_TOKEN = 'END_TAG_TOKEN';
-Tokenizer.COMMENT_TOKEN = 'COMMENT_TOKEN';
-Tokenizer.DOCTYPE_TOKEN = 'DOCTYPE_TOKEN';
-Tokenizer.EOF_TOKEN = 'EOF_TOKEN';
-Tokenizer.HIBERNATION_TOKEN = 'HIBERNATION_TOKEN';
-
-//Tokenizer initial states for different modes
-Tokenizer.MODE = {
- DATA: DATA_STATE,
- RCDATA: RCDATA_STATE,
- RAWTEXT: RAWTEXT_STATE,
- SCRIPT_DATA: SCRIPT_DATA_STATE,
- PLAINTEXT: PLAINTEXT_STATE
-};
-
-//Static
-Tokenizer.getTokenAttr = function(token, attrName) {
- for (let i = token.attrs.length - 1; i >= 0; i--) {
- if (token.attrs[i].name === attrName) {
- return token.attrs[i].value;
- }
- }
-
- return null;
-};
-
-module.exports = Tokenizer;
+exports.Tokenizer = Tokenizer;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/tokenizer/index.js.map b/packages/parse5/lib/tokenizer/index.js.map
new file mode 100644
index 0000000..c3aafa9
--- /dev/null
+++ b/packages/parse5/lib/tokenizer/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/tokenizer/index.ts"],"names":[],"mappings":";;;AAAA,uDAAiD;AACjD,qDAO8B;AAC9B,iDAW4B;AAC5B,sDAAuF;AACvF,6DAAwE;AACxE,+CAAqD;AAErD,qDAAqD;AACrD,MAAM,kCAAkC,GAAG,IAAI,GAAG,CAAC;IAC/C,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,GAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,GAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,GAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,GAAO,CAAC;IACf,CAAC,IAAI,EAAE,GAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,GAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,GAAO,CAAC;IACf,CAAC,IAAI,EAAE,IAAO,CAAC;IACf,CAAC,IAAI,EAAE,GAAO,CAAC;IACf,CAAC,IAAI,EAAE,GAAO,CAAC;IACf,CAAC,IAAI,EAAE,GAAO,CAAC;CAClB,CAAC,CAAC;AAEH,QAAQ;AACR,IAAW,KAiFV;AAjFD,WAAW,KAAK;IACZ,iCAAI,CAAA;IACJ,qCAAM,CAAA;IACN,uCAAO,CAAA;IACP,+CAAW,CAAA;IACX,2CAAS,CAAA;IACT,yCAAQ,CAAA;IACR,iDAAY,CAAA;IACZ,yCAAQ,CAAA;IACR,mEAAqB,CAAA;IACrB,+DAAmB,CAAA;IACnB,gEAAmB,CAAA;IACnB,sEAAsB,CAAA;IACtB,kEAAoB,CAAA;IACpB,kEAAoB,CAAA;IACpB,8EAA0B,CAAA;IAC1B,0EAAwB,CAAA;IACxB,0EAAwB,CAAA;IACxB,0EAAwB,CAAA;IACxB,oFAA6B,CAAA;IAC7B,gEAAmB,CAAA;IACnB,0EAAwB,CAAA;IACxB,oFAA6B,CAAA;IAC7B,8FAAkC,CAAA;IAClC,0FAAgC,CAAA;IAChC,0FAAgC,CAAA;IAChC,wFAA+B,CAAA;IAC/B,8EAA0B,CAAA;IAC1B,wFAA+B,CAAA;IAC/B,kGAAoC,CAAA;IACpC,4GAAyC,CAAA;IACzC,oFAA6B,CAAA;IAC7B,oEAAqB,CAAA;IACrB,sDAAc,CAAA;IACd,kEAAoB,CAAA;IACpB,sEAAsB,CAAA;IACtB,oFAA6B,CAAA;IAC7B,oFAA6B,CAAA;IAC7B,0EAAwB,CAAA;IACxB,kFAA4B,CAAA;IAC5B,sEAAsB,CAAA;IACtB,oDAAa,CAAA;IACb,wEAAuB,CAAA;IACvB,oDAAa,CAAA;IACb,8DAAkB,CAAA;IAClB,wCAAO,CAAA;IACP,sEAAsB,CAAA;IACtB,gFAA2B,CAAA;IAC3B,0FAAgC,CAAA;IAChC,oGAAqC,CAAA;IACrC,0DAAgB,CAAA;IAChB,gDAAW,CAAA;IACX,0DAAgB,CAAA;IAChB,wCAAO,CAAA;IACP,gEAAmB,CAAA;IACnB,kDAAY,CAAA;IACZ,8DAAkB,CAAA;IAClB,kFAA4B,CAAA;IAC5B,0FAAgC,CAAA;IAChC,wGAAuC,CAAA;IACvC,wGAAuC,CAAA;IACvC,wFAA+B,CAAA;IAC/B,oHAA6C,CAAA;IAC7C,kFAA4B,CAAA;IAC5B,0FAAgC,CAAA;IAChC,wGAAuC,CAAA;IACvC,wGAAuC,CAAA;IACvC,wFAA+B,CAAA;IAC/B,oDAAa,CAAA;IACb,oDAAa,CAAA;IACb,oEAAqB,CAAA;IACrB,4DAAiB,CAAA;IACjB,gEAAmB,CAAA;IACnB,4EAAyB,CAAA;IACzB,gEAAmB,CAAA;IACnB,gFAA2B,CAAA;IAC3B,oGAAqC,CAAA;IACrC,4FAAiC,CAAA;IACjC,wFAA+B,CAAA;IAC/B,gFAA2B,CAAA;IAC3B,wFAA+B,CAAA;AACnC,CAAC,EAjFU,KAAK,KAAL,KAAK,QAiFf;AAED,8CAA8C;AACjC,QAAA,aAAa,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,MAAM,EAAE,KAAK,CAAC,MAAM;IACpB,OAAO,EAAE,KAAK,CAAC,OAAO;IACtB,WAAW,EAAE,KAAK,CAAC,WAAW;IAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;IAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;CAC5B,CAAC;AAEX,OAAO;AAEP,6GAA6G;AAC7G,kFAAkF;AAClF,0FAA0F;AAE1F,SAAS,YAAY,CAAC,EAAU;IAC5B,OAAO,EAAE,IAAI,wBAAC,CAAC,OAAO,IAAI,EAAE,IAAI,wBAAC,CAAC,OAAO,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC5B,OAAO,EAAE,IAAI,wBAAC,CAAC,eAAe,IAAI,EAAE,IAAI,wBAAC,CAAC,eAAe,CAAC;AAC9D,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC5B,OAAO,EAAE,IAAI,wBAAC,CAAC,aAAa,IAAI,EAAE,IAAI,wBAAC,CAAC,aAAa,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa,CAAC,EAAU;IAC7B,OAAO,YAAY,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAU;IACnC,OAAO,aAAa,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,oBAAoB,CAAC,EAAU;IACpC,OAAO,EAAE,IAAI,wBAAC,CAAC,eAAe,IAAI,EAAE,IAAI,wBAAC,CAAC,eAAe,CAAC;AAC9D,CAAC;AAED,SAAS,oBAAoB,CAAC,EAAU;IACpC,OAAO,EAAE,IAAI,wBAAC,CAAC,aAAa,IAAI,EAAE,IAAI,wBAAC,CAAC,aAAa,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe,CAAC,EAAU;IAC/B,OAAO,YAAY,CAAC,EAAE,CAAC,IAAI,oBAAoB,CAAC,EAAE,CAAC,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC5B,OAAO,EAAE,GAAG,EAAO,CAAC;AACxB,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC5B,OAAO,EAAE,KAAK,wBAAC,CAAC,KAAK,IAAI,EAAE,KAAK,wBAAC,CAAC,SAAS,IAAI,EAAE,KAAK,wBAAC,CAAC,UAAU,IAAI,EAAE,KAAK,wBAAC,CAAC,SAAS,CAAC;AAC7F,CAAC;AAED,SAAS,6BAA6B,CAAC,MAAc;IACjD,OAAO,MAAM,KAAK,wBAAC,CAAC,WAAW,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,mCAAmC,CAAC,EAAU;IACnD,OAAO,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,wBAAC,CAAC,OAAO,IAAI,EAAE,KAAK,wBAAC,CAAC,iBAAiB,CAAC;AAC9E,CAAC;AAmBD,WAAW;AACX,MAAa,SAAS;IA6BlB,YAAoB,OAAyB,EAAU,OAAqB;QAAxD,YAAO,GAAP,OAAO,CAAkB;QAAU,YAAO,GAAP,OAAO,CAAc;QA1BpE,WAAM,GAAG,KAAK,CAAC;QACvB,sEAAsE;QAC9D,WAAM,GAAG,KAAK,CAAC;QAEvB;;;;;WAKG;QACI,kBAAa,GAAG,KAAK,CAAC;QACtB,qBAAgB,GAAG,EAAE,CAAC;QACtB,WAAM,GAAG,KAAK,CAAC;QAEf,UAAK,GAAG,KAAK,CAAC,IAAI,CAAC;QAClB,gBAAW,GAAG,KAAK,CAAC,IAAI,CAAC;QAEzB,gBAAW,GAAG,CAAC,CAAC,CAAC;QAEjB,0BAAqB,GAAG,CAAC,CAAC,CAAC;QAG3B,0BAAqB,GAA0B,IAAI,CAAC;QACpD,iBAAY,GAAiB,IAAI,CAAC;QAClC,gBAAW,GAAc,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAGrD,IAAI,CAAC,YAAY,GAAG,IAAI,8BAAY,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,QAAQ;IACA,IAAI,CAAC,IAAS;;QAClB,MAAA,MAAA,IAAI,CAAC,OAAO,EAAC,YAAY,mDAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,uDAAuD;IAC/C,kBAAkB,CAAC,MAAc;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;YACtC,OAAO,IAAI,CAAC;SACf;QAED,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;YACjC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,MAAM;YACxC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM;YAC9C,OAAO,EAAE,CAAC,CAAC;YACX,MAAM,EAAE,CAAC,CAAC;YACV,SAAS,EAAE,CAAC,CAAC;SAChB,CAAC;IACN,CAAC;IAEO,eAAe;QACnB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAExB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChC,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;YAE/B,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE3B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;gBAC5B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;aACvB;SACJ;QAED,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,KAAK;IACE,KAAK;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,aAA0B;QACpC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;SACjD;QAED,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,oCAAoC;QACpC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAExB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACd,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI,CAAC;SACrB;IACL,CAAC;IAEM,KAAK,CAAC,KAAa,EAAE,WAAoB,EAAE,aAA0B;QACxE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACd,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI,CAAC;SACrB;IACL,CAAC;IAEM,sBAAsB,CAAC,KAAa;QACvC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,aAAa;IACL,kBAAkB;QACtB,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAEpB,OAAO,IAAI,CAAC;SACf;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,aAAa;IACL,QAAQ;QACZ,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IACvC,CAAC;IAEO,UAAU,CAAC,KAAa;QAC5B,IAAI,CAAC,qBAAqB,IAAI,KAAK,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAEO,iBAAiB,CAAC,KAAY;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAEO,UAAU,CAAC,KAAa;QAC5B,IAAI,CAAC,qBAAqB,IAAI,KAAK,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC5B,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;SAC/B;IACL,CAAC;IAEO,uBAAuB,CAAC,OAAe,EAAE,aAAsB;QACnE,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE;YACtD,0EAA0E;YAC1E,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,gBAAgB;IACR,oBAAoB;QACxB,IAAI,CAAC,YAAY,GAAG;YAChB,IAAI,EAAE,oBAAS,CAAC,SAAS;YACzB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,gBAAM,CAAC,OAAO;YACrB,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,KAAK;YACrB,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;SACvC,CAAC;IACN,CAAC;IAEO,kBAAkB;QACtB,IAAI,CAAC,YAAY,GAAG;YAChB,IAAI,EAAE,oBAAS,CAAC,OAAO;YACvB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,gBAAM,CAAC,OAAO;YACrB,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,KAAK;YACrB,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;SACvC,CAAC;IACN,CAAC;IAEO,mBAAmB,CAAC,MAAc;QACtC,IAAI,CAAC,YAAY,GAAG;YAChB,IAAI,EAAE,oBAAS,CAAC,OAAO;YACvB,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;SAC5C,CAAC;IACN,CAAC;IAEO,mBAAmB,CAAC,WAA0B;QAClD,IAAI,CAAC,YAAY,GAAG;YAChB,IAAI,EAAE,oBAAS,CAAC,OAAO;YACvB,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,KAAK;YAClB,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI,CAAC,eAAe;SACjC,CAAC;IACN,CAAC;IAEO,qBAAqB,CAAC,IAA4B,EAAE,KAAa;QACrE,IAAI,CAAC,qBAAqB,GAAG;YACzB,IAAI;YACJ,KAAK;YACL,QAAQ,EAAE,IAAI,CAAC,eAAe;SACjC,CAAC;IACN,CAAC;IAED,gBAAgB;IACR,WAAW,CAAC,eAAuB;QACvC,IAAI,CAAC,WAAW,GAAG;YACf,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,EAAE;SACZ,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAEO,cAAc;;;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAwB,CAAC;QAE5C,IAAI,IAAA,uBAAY,EAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACrD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAEnC,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE;gBACxC,MAAM,aAAa,GAAG,aAAC,KAAK,CAAC,QAAQ,EAAC,KAAK,uCAAL,KAAK,GAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAC,CAAC;gBACrE,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;gBAE5D,mBAAmB;gBACnB,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;SACJ;aAAM;YACH,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,kBAAkB,CAAC,CAAC;SACrC;IACL,CAAC;IAEO,eAAe;QACnB,IAAI,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;YACpD,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;SAC7D;IACL,CAAC;IAED,gBAAgB;IACR,YAAY,CAAC,EAAS;QAC1B,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,IAAI,EAAE,CAAC,QAAQ,EAAE;YACb,EAAE,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAC7C,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC;YAC/C,EAAE,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;SACxD;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAEO,mBAAmB;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,YAAwB,CAAC;QAEzC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAEtB,EAAE,CAAC,KAAK,GAAG,IAAA,kBAAQ,EAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAEhC,IAAI,EAAE,CAAC,IAAI,KAAK,oBAAS,CAAC,SAAS,EAAE;YACjC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;SAC/B;aAAM;YACH,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACrB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,oBAAoB,CAAC,CAAC;aACvC;YAED,IAAI,EAAE,CAAC,WAAW,EAAE;gBAChB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,yBAAyB,CAAC,CAAC;aAC5C;YAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC7B;QAED,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC;IAEO,kBAAkB,CAAC,EAAgB;QACvC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAE3B,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC;IAEO,kBAAkB,CAAC,EAAgB;QACvC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAE3B,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC;IAEO,0BAA0B,CAAC,YAA6B;QAC5D,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC5B,iFAAiF;YACjF,iCAAiC;YACjC,IAAI,YAAY,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE;gBACrD,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC;gBACrE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC;gBACnE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC;aAC5E;YAED,QAAQ,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE;gBACrC,KAAK,oBAAS,CAAC,SAAS,CAAC,CAAC;oBACtB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBACrD,MAAM;iBACT;gBACD,KAAK,oBAAS,CAAC,cAAc,CAAC,CAAC;oBAC3B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBACzD,MAAM;iBACT;gBACD,KAAK,oBAAS,CAAC,oBAAoB,CAAC,CAAC;oBACjC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBAC/D,MAAM;iBACT;aACJ;YAED,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;SACrC;IACL,CAAC;IAEO,aAAa;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAE5C,IAAI,QAAQ,EAAE;YACV,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC;YACtC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC;YACpC,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC;SAC7C;QAED,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,oBAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,qBAAqB;IAErB,+FAA+F;IAC/F,+GAA+G;IAC/G,8FAA8F;IAC9F,oCAAoC;IACpC,sDAAsD;IACtD,qFAAqF;IACrF,uGAAuG;IACvG,+GAA+G;IACvG,kCAAkC,CAAC,IAA4B,EAAE,EAAU;QAC/E,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,KAAK,IAAI,EAAE;gBAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBAClD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACtD,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;aACvC;iBAAM;gBACH,IAAI,CAAC,qBAAqB,CAAC,KAAK,IAAI,EAAE,CAAC;gBACvC,OAAO;aACV;SACJ;QAED,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,cAAc,CAAC,EAAU;QAC7B,IAAI,IAAI,GAAG,oBAAS,CAAC,SAAS,CAAC;QAE/B,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE;YAClB,IAAI,GAAG,oBAAS,CAAC,oBAAoB,CAAC;SACzC;aAAM,IAAI,EAAE,KAAK,wBAAC,CAAC,IAAI,EAAE;YACtB,IAAI,GAAG,oBAAS,CAAC,cAAc,CAAC;SACnC;QAED,IAAI,CAAC,kCAAkC,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,gDAAgD;IAChD,wGAAwG;IAChG,UAAU,CAAC,EAAU;QACzB,IAAI,CAAC,kCAAkC,CAAC,oBAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,8BAA8B;IACtB,6BAA6B,CAAC,EAAU;QAC5C,IAAI,MAAM,GAAoB,IAAI,CAAC;QACnC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,0BAAc,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE;YACvE,CAAC,GAAG,IAAA,2BAAe,EAAC,0BAAc,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YAExD,IAAI,CAAC,GAAG,CAAC;gBAAE,MAAM;YAEjB,MAAM,IAAI,CAAC,CAAC;YAEZ,OAAO,GAAG,0BAAc,CAAC,CAAC,CAAC,CAAC;YAE5B,MAAM,MAAM,GAAG,OAAO,GAAG,wBAAY,CAAC,YAAY,CAAC;YAEnD,kDAAkD;YAClD,IAAI,MAAM,EAAE;gBACR,4EAA4E;gBAC5E,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;gBAEvC,wGAAwG;gBACxG,yGAAyG;gBACzG,IACI,EAAE,KAAK,wBAAC,CAAC,SAAS;oBAClB,IAAI,CAAC,gCAAgC,EAAE;oBACvC,6BAA6B,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAC1D;oBACE,yGAAyG;oBACzG,4GAA4G;oBAC5G,MAAM,GAAG,CAAC,wBAAC,CAAC,SAAS,CAAC,CAAC;oBAEvB,uBAAuB;oBACvB,CAAC,IAAI,WAAW,CAAC;iBACpB;qBAAM;oBACH,2DAA2D;oBAC3D,MAAM;wBACF,WAAW,KAAK,CAAC;4BACb,CAAC,CAAC,CAAC,0BAAc,CAAC,CAAC,CAAC,GAAG,CAAC,wBAAY,CAAC,YAAY,CAAC;4BAClD,CAAC,CAAC,WAAW,KAAK,CAAC;gCACnB,CAAC,CAAC,CAAC,0BAAc,CAAC,EAAE,CAAC,CAAC,CAAC;gCACvB,CAAC,CAAC,CAAC,0BAAc,CAAC,EAAE,CAAC,CAAC,EAAE,0BAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACrD,MAAM,GAAG,CAAC,CAAC;oBACX,gBAAgB,GAAG,EAAE,KAAK,wBAAC,CAAC,SAAS,CAAC;iBACzC;gBAED,IAAI,WAAW,KAAK,CAAC,EAAE;oBACnB,2CAA2C;oBAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,MAAM;iBACT;aACJ;SACJ;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAExB,IAAI,gBAAgB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YACtD,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uCAAuC,CAAC,CAAC;SAC1D;QAED,sEAAsE;QACtE,wEAAwE;QACxE,iDAAiD;QACjD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAEnB,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,gCAAgC;QACpC,OAAO,CACH,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,6BAA6B;YACxD,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,6BAA6B;YACxD,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,wBAAwB,CACtD,CAAC;IACN,CAAC;IAEO,2CAA2C,CAAC,EAAU;QAC1D,IAAI,IAAI,CAAC,gCAAgC,EAAE,EAAE;YACzC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;SACtD;aAAM;YACH,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;SAC3B;IACL,CAAC;IAED,+EAA+E;IACvE,UAAU,CAAC,EAAU;QACzB,QAAQ,IAAI,CAAC,KAAK,EAAE;YAChB,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;gBACb,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBACpB,MAAM;aACT;YACD,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;gBACf,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACtB,MAAM;aACT;YACD,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAM;aACT;YACD,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC;gBACpB,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC1B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;gBAClB,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;gBACzB,MAAM;aACT;YACD,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACjB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAM;aACT;YACD,KAAK,KAAK,CAAC,YAAY,CAAC,CAAC;gBACrB,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC1B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACjB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAM;aACT;YACD,KAAK,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAC9B,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;gBAClC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC5B,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;gBAChC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC5B,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;gBAChC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC/B,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;gBACnC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBAC7B,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;gBACjC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBAC7B,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;gBACjC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBACnC,IAAI,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;gBACtC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACjC,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;gBACpC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACjC,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;gBACpC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACjC,IAAI,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;gBACrC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACtC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC5B,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;gBACjC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACjC,IAAI,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;gBACrC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACtC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBAC3C,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;gBAC7C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACzC,IAAI,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;gBAC3C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACzC,IAAI,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;gBAC3C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACxC,IAAI,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;gBAC3C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBACnC,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACxC,IAAI,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;gBAC3C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBAC7C,IAAI,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC;gBAC/C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAClD,IAAI,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM;aACT;YACD,KAAK,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACtC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAC9B,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;gBACnC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,cAAc,CAAC,CAAC;gBACvB,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;gBAC7B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBAC7B,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;gBAClC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC/B,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;gBACpC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACtC,IAAI,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;gBAC1C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACtC,IAAI,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;gBAC1C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACjC,IAAI,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;gBACtC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBACrC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC/B,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;gBACnC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;gBACtB,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBAC5B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAChC,IAAI,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;gBACrC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;gBACtB,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBAC5B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC3B,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;gBAChC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAM;aACT;YACD,KAAK,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC/B,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;gBACnC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBACpC,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACzC,IAAI,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;gBAC3C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBAC9C,IAAI,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC;gBAC/C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBACzB,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;gBAC9B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC;gBACpB,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC1B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBACzB,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;gBAC9B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAM;aACT;YACD,KAAK,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC5B,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;gBACjC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,YAAY,CAAC,CAAC;gBACrB,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBAC3B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC3B,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;gBAChC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBACrC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACzC,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;gBAC7C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAChD,IAAI,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM;aACT;YACD,KAAK,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAChD,IAAI,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM;aACT;YACD,KAAK,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACxC,IAAI,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC;gBAC5C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBACtD,IAAI,CAAC,8CAA8C,CAAC,EAAE,CAAC,CAAC;gBACxD,MAAM;aACT;YACD,KAAK,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBACrC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACzC,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;gBAC7C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAChD,IAAI,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM;aACT;YACD,KAAK,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAChD,IAAI,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM;aACT;YACD,KAAK,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACxC,IAAI,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC;gBAC5C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;gBACtB,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBAC5B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;gBACtB,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBAC5B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAC9B,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;gBACnC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC1B,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC5B,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;gBAClC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAClC,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC5B,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;gBAClC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBACpC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBAC9C,IAAI,CAAC,wCAAwC,CAAC,EAAE,CAAC,CAAC;gBAClD,MAAM;aACT;YACD,KAAK,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAC1C,IAAI,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC;gBAC9C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACxC,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;gBAC7C,MAAM;aACT;YACD,KAAK,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBACpC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACxC,IAAI,CAAC,kCAAkC,EAAE,CAAC;gBAC1C,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;aACpC;SACJ;IACL,CAAC;IAED,gBAAgB;IAEhB,aAAa;IACb,oEAAoE;IAC5D,UAAU,CAAC,EAAU;QACzB,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAC5B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;gBAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,gBAAgB;IAChB,oEAAoE;IAC5D,YAAY,CAAC,EAAU;QAC3B,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;gBAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,qBAAqB,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,kCAAqB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,gBAAgB;IAChB,oEAAoE;IAC5D,aAAa,CAAC,EAAU;QAC5B,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC;gBAC1C,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,kCAAqB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,oBAAoB;IACpB,oEAAoE;IAC5D,gBAAgB,CAAC,EAAU;QAC/B,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,0BAA0B,CAAC;gBAC9C,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,kCAAqB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,kBAAkB;IAClB,oEAAoE;IAC5D,eAAe,CAAC,EAAU;QAC9B,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,kCAAqB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,iBAAiB;IACjB,oEAAoE;IAC5D,aAAa,CAAC,EAAU;QAC5B,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE;YACnB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;SAC1B;;YACG,QAAQ,EAAE,EAAE;gBACR,KAAK,wBAAC,CAAC,gBAAgB,CAAC,CAAC;oBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uBAAuB,CAAC;oBAC3C,MAAM;iBACT;gBACD,KAAK,wBAAC,CAAC,OAAO,CAAC,CAAC;oBACZ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;oBAChC,MAAM;iBACT;gBACD,KAAK,wBAAC,CAAC,aAAa,CAAC,CAAC;oBAClB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,sCAAsC,CAAC,CAAC;oBACtD,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;oBAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;oBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;oBAC5B,MAAM;iBACT;gBACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;oBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,gBAAgB,CAAC,CAAC;oBAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;oBACrB,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,MAAM;iBACT;gBACD,OAAO,CAAC,CAAC;oBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;oBAC9C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;oBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;oBACxB,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;iBACvB;aACJ;IACT,CAAC;IAED,qBAAqB;IACrB,oEAAoE;IAC5D,gBAAgB,CAAC,EAAU;QAC/B,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE;YACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;SAC1B;;YACG,QAAQ,EAAE,EAAE;gBACR,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;oBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,iBAAiB,CAAC,CAAC;oBACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;oBACxB,MAAM;iBACT;gBACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;oBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,gBAAgB,CAAC,CAAC;oBAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACtB,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,MAAM;iBACT;gBACD,OAAO,CAAC,CAAC;oBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;oBAC9C,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;oBAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;oBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;iBAC/B;aACJ;IACT,CAAC;IAED,iBAAiB;IACjB,oEAAoE;IAC5D,aAAa,CAAC,EAAU;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAwB,CAAC;QAE5C,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,qBAAqB,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,OAAO,CAAC,CAAC;gBACZ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC;gBAC1C,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,KAAK,CAAC,OAAO,IAAI,kCAAqB,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACnF;SACJ;IACL,CAAC;IAED,8BAA8B;IAC9B,oEAAoE;IAC5D,wBAAwB,CAAC,EAAU;QACvC,IAAI,EAAE,KAAK,wBAAC,CAAC,OAAO,EAAE;YAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;SAC1C;aAAM;YACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;SACzB;IACL,CAAC;IAED,4BAA4B;IAC5B,oEAAoE;IAC5D,sBAAsB,CAAC,EAAU;QACrC,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE;YACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;YACvC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;SACnC;aAAM;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;SACzB;IACL,CAAC;IAEO,mBAAmB,CAAC,GAAW;QACnC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE;YAC7D,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;SACrC;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAwB,CAAC;QAC5C,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAEtC,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAEhE,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,qBAAqB,CAAC;gBACzC,OAAO,KAAK,CAAC;aAChB;YACD,KAAK,wBAAC,CAAC,OAAO,CAAC,CAAC;gBACZ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC;gBAC1C,OAAO,KAAK,CAAC;aAChB;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC9C,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,OAAO,KAAK,CAAC;aAChB;YACD,OAAO,CAAC,CAAC;gBACL,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;aACrC;SACJ;IACL,CAAC;IAED,4BAA4B;IAC5B,oEAAoE;IAC5D,sBAAsB,CAAC,EAAU;QACrC,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE;YAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;SACzB;IACL,CAAC;IAED,+BAA+B;IAC/B,oEAAoE;IAC5D,yBAAyB,CAAC,EAAU;QACxC,IAAI,EAAE,KAAK,wBAAC,CAAC,OAAO,EAAE;YAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC;SAC3C;aAAM;YACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;SAC1B;IACL,CAAC;IAED,6BAA6B;IAC7B,oEAAoE;IAC5D,uBAAuB,CAAC,EAAU;QACtC,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE;YACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC;YACxC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;SACpC;aAAM;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;SAC1B;IACL,CAAC;IAED,6BAA6B;IAC7B,oEAAoE;IAC5D,uBAAuB,CAAC,EAAU;QACtC,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE;YAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;SAC1B;IACL,CAAC;IAED,mCAAmC;IACnC,oEAAoE;IAC5D,4BAA4B,CAAC,EAAU;QAC3C,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,OAAO,CAAC,CAAC;gBACZ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,wBAAwB,CAAC;gBAC5C,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,gBAAgB,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,wBAAwB,CAAC;gBAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;gBAC/B,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;aAC7B;SACJ;IACL,CAAC;IAED,iCAAiC;IACjC,oEAAoE;IAC5D,0BAA0B,CAAC,EAAU;QACzC,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE;YACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,wBAAwB,CAAC;YAC5C,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;SACvC;aAAM;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;YAC/B,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SAC7B;IACL,CAAC;IAED,iCAAiC;IACjC,oEAAoE;IAC5D,0BAA0B,CAAC,EAAU;QACzC,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE;YAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;YAC/B,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SAC7B;IACL,CAAC;IAED,iCAAiC;IACjC,oEAAoE;IAC5D,2BAA2B,CAAC,EAAU;QAC1C,IAAI,EAAE,KAAK,wBAAC,CAAC,YAAY,EAAE;YACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,6BAA6B,CAAC;YACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SACxB;aAAM;YACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;YAC/B,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SAC7B;IACL,CAAC;IAED,sCAAsC;IACtC,oEAAoE;IAC5D,+BAA+B,CAAC,EAAU;QAC9C,IAAI,EAAE,KAAK,wBAAC,CAAC,YAAY,EAAE;YACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,6BAA6B,CAAC;YACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SACxB;aAAM;YACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;YAC/B,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SAC7B;IACL,CAAC;IAED,4BAA4B;IAC5B,oEAAoE;IAC5D,uBAAuB,CAAC,EAAU;QACtC,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,wBAAwB,CAAC;gBAC5C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,kCAAkC,CAAC;gBACtD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,kCAAqB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,iCAAiC;IACjC,oEAAoE;IAC5D,2BAA2B,CAAC,EAAU;QAC1C,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,6BAA6B,CAAC;gBACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,kCAAkC,CAAC;gBACtD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,kCAAqB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,sCAAsC;IACtC,oEAAoE;IAC5D,+BAA+B,CAAC,EAAU;QAC9C,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,kCAAkC,CAAC;gBACtD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;gBAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,kCAAqB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,2CAA2C;IAC3C,oEAAoE;IAC5D,mCAAmC,CAAC,EAAU;QAClD,IAAI,EAAE,KAAK,wBAAC,CAAC,OAAO,EAAE;YAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gCAAgC,CAAC;SACvD;aAAM,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE;YAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;YACnD,IAAI,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;SAC9C;aAAM;YACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;YACvC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;SACpC;IACL,CAAC;IAED,yCAAyC;IACzC,oEAAoE;IAC5D,iCAAiC,CAAC,EAAU;QAChD,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE;YACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gCAAgC,CAAC;YACpD,IAAI,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;SAC9C;aAAM;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;YACvC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;SACpC;IACL,CAAC;IAED,yCAAyC;IACzC,oEAAoE;IAC5D,iCAAiC,CAAC,EAAU;QAChD,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE;YAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;YACvC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;SACpC;IACL,CAAC;IAED,wCAAwC;IACxC,oEAAoE;IAC5D,iCAAiC,CAAC,EAAU;QAChD,IACI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,sBAAE,CAAC,MAAM,EAAE,KAAK,CAAC;YAC9C,mCAAmC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,sBAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAC/E;YACE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;aACxC;YAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,0BAA0B,CAAC;SACjD;aAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;YACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;YACvC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;SACpC;IACL,CAAC;IAED,mCAAmC;IACnC,oEAAoE;IAC5D,6BAA6B,CAAC,EAAU;QAC5C,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;gBACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,yCAAyC,CAAC;gBAC7D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,kCAAqB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,wCAAwC;IACxC,oEAAoE;IAC5D,iCAAiC,CAAC,EAAU;QAChD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,oCAAoC,CAAC;gBACxD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,yCAAyC,CAAC;gBAC7D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,0BAA0B,CAAC;gBAC9C,IAAI,CAAC,UAAU,CAAC,kCAAqB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,0BAA0B,CAAC;gBAC9C,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,6CAA6C;IAC7C,oEAAoE;IAC5D,qCAAqC,CAAC,EAAU;QACpD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,yCAAyC,CAAC;gBAC7D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;gBAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,0BAA0B,CAAC;gBAC9C,IAAI,CAAC,UAAU,CAAC,kCAAqB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,0BAA0B,CAAC;gBAC9C,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,kDAAkD;IAClD,oEAAoE;IAC5D,yCAAyC,CAAC,EAAU;QACxD,IAAI,EAAE,KAAK,wBAAC,CAAC,OAAO,EAAE;YAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,6BAA6B,CAAC;YACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SACxB;aAAM;YACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,0BAA0B,CAAC;YAC9C,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;SAC1C;IACL,CAAC;IAED,sCAAsC;IACtC,oEAAoE;IAC5D,+BAA+B,CAAC,EAAU;QAC9C,IACI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,sBAAE,CAAC,MAAM,EAAE,KAAK,CAAC;YAC9C,mCAAmC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,sBAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAC/E;YACE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;aACxC;YAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;SAC1C;aAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;YACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,0BAA0B,CAAC;YAC9C,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;SAC1C;IACL,CAAC;IAED,8BAA8B;IAC9B,oEAAoE;IAC5D,yBAAyB,CAAC,EAAU;QACxC,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,oBAAoB;gBACpB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,OAAO,CAAC;YACf,KAAK,wBAAC,CAAC,iBAAiB,CAAC;YACzB,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC;gBACxC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;gBAClC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,WAAW,CAAC,CAAC;gBAChB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uCAAuC,CAAC,CAAC;gBACvD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC;gBAClC,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC;gBAClC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;aAChC;SACJ;IACL,CAAC;IAED,uBAAuB;IACvB,oEAAoE;IAC5D,mBAAmB,CAAC,EAAU;QAClC,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,OAAO,CAAC;YACf,KAAK,wBAAC,CAAC,iBAAiB,CAAC;YACzB,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC;gBACxC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;gBAClC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,WAAW,CAAC,CAAC;gBAChB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC;gBAC1C,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC;YACtB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,kCAAkC,CAAC,CAAC;gBAClD,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBAClD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,kCAAqB,CAAC;gBAC/C,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAC3F;SACJ;IACL,CAAC;IAED,6BAA6B;IAC7B,oEAAoE;IAC5D,wBAAwB,CAAC,EAAU;QACvC,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,oBAAoB;gBACpB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,OAAO,CAAC,CAAC;gBACZ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC;gBAC1C,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,WAAW,CAAC,CAAC;gBAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC;gBAC1C,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC;gBAClC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;aAChC;SACJ;IACL,CAAC;IAED,+BAA+B;IAC/B,oEAAoE;IAC5D,0BAA0B,CAAC,EAAU;QACzC,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,oBAAoB;gBACpB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,6BAA6B,CAAC;gBACjD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,UAAU,CAAC,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,6BAA6B,CAAC;gBACjD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,qBAAqB,CAAC,CAAC;gBACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,wBAAwB,CAAC;gBAC5C,IAAI,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;aACzC;SACJ;IACL,CAAC;IAED,wCAAwC;IACxC,oEAAoE;IAC5D,gCAAgC,CAAC,EAAU;QAC/C,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,4BAA4B,CAAC;gBAChD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,6BAA6B,CAAC;gBACvD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,kCAAqB,CAAC;gBAChD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aACtD;SACJ;IACL,CAAC;IAED,wCAAwC;IACxC,oEAAoE;IAC5D,gCAAgC,CAAC,EAAU;QAC/C,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,UAAU,CAAC,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,4BAA4B,CAAC;gBAChD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,6BAA6B,CAAC;gBACvD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,kCAAqB,CAAC;gBAChD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aACtD;SACJ;IACL,CAAC;IAED,mCAAmC;IACnC,oEAAoE;IAC5D,4BAA4B,CAAC,EAAU;QAC3C,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,qBAAqB,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,wBAAwB,CAAC;gBAClD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,kCAAqB,CAAC;gBAChD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC;YACtB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,cAAc,CAAC;YACtB,KAAK,wBAAC,CAAC,WAAW,CAAC;YACnB,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,2CAA2C,CAAC,CAAC;gBAC3D,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aACtD;SACJ;IACL,CAAC;IAED,uCAAuC;IACvC,oEAAoE;IAC5D,+BAA+B,CAAC,EAAU;QAC9C,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,qBAAqB,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,OAAO,CAAC,CAAC;gBACZ,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC;gBAC1C,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,kCAAkC,CAAC,CAAC;gBAClD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,qBAAqB,CAAC;gBACzC,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;aACtC;SACJ;IACL,CAAC;IAED,+BAA+B;IAC/B,oEAAoE;IAC5D,yBAAyB,CAAC,EAAU;QACxC,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAwB,CAAC;gBAC5C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,sBAAsB,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,qBAAqB,CAAC;gBACzC,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;aACtC;SACJ;IACL,CAAC;IAED,sBAAsB;IACtB,oEAAoE;IAC5D,kBAAkB,CAAC,EAAU;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,KAAK,CAAC,IAAI,IAAI,kCAAqB,CAAC;gBACpC,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC1C;SACJ;IACL,CAAC;IAED,gCAAgC;IAChC,oEAAoE;IAC5D,2BAA2B,CAAC,EAAU;QAC1C,IAAI,IAAI,CAAC,uBAAuB,CAAC,sBAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClD,IAAI,CAAC,mBAAmB,CAAC,sBAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;SACpC;aAAM,IAAI,IAAI,CAAC,uBAAuB,CAAC,sBAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;YACxD,qHAAqH;YACrH,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,sBAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;SAC9B;aAAM,IAAI,IAAI,CAAC,uBAAuB,CAAC,sBAAE,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE;YAC3D,IAAI,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;aACpC;iBAAM;gBACH,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,kBAAkB,CAAC,CAAC;gBAClC,IAAI,CAAC,mBAAmB,CAAC,sBAAE,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACnD,IAAI,CAAC,YAA6B,CAAC,IAAI,GAAG,SAAS,CAAC;gBACrD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;aACpC;SACJ;QAED,6EAA6E;QAC7E,6DAA6D;aACxD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,wBAAwB,CAAC,CAAC;YACxC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;SAC/B;IACL,CAAC;IAED,sBAAsB;IACtB,oEAAoE;IAC5D,kBAAkB,CAAC,EAAU;QACjC,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC;gBACtC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,2BAA2B,CAAC,CAAC;gBAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;gBAChD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC1B;SACJ;IACL,CAAC;IAED,2BAA2B;IAC3B,oEAAoE;IAC5D,sBAAsB,CAAC,EAAU;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAChD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,2BAA2B,CAAC,CAAC;gBAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;gBAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC1B;SACJ;IACL,CAAC;IAED,gBAAgB;IAChB,oEAAoE;IAC5D,aAAa,CAAC,EAAU;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC;gBACpC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;gBAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC;gBAC1C,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,KAAK,CAAC,IAAI,IAAI,kCAAqB,CAAC;gBACpC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC1C;SACJ;IACL,CAAC;IAED,+BAA+B;IAC/B,oEAAoE;IAC5D,yBAAyB,CAAC,EAAU;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,gBAAgB,CAAC,CAAC;gBACrB,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;gBAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,2BAA2B,CAAC;gBAC/C,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;gBAClB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC1B;SACJ;IACL,CAAC;IAED,oCAAoC;IACpC,oEAAoE;IAC5D,6BAA6B,CAAC,EAAU;QAC5C,IAAI,EAAE,KAAK,wBAAC,CAAC,YAAY,EAAE;YACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gCAAgC,CAAC;SACvD;aAAM;YACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;SAC1B;IACL,CAAC;IAED,yCAAyC;IACzC,oEAAoE;IAC5D,iCAAiC,CAAC,EAAU;QAChD,IAAI,EAAE,KAAK,wBAAC,CAAC,YAAY,EAAE;YACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,qCAAqC,CAAC;SAC5D;aAAM;YACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC;YACpC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;SACjC;IACL,CAAC;IAED,8CAA8C;IAC9C,oEAAoE;IAC5D,qCAAqC,CAAC,EAAU;QACpD,IAAI,EAAE,KAAK,wBAAC,CAAC,iBAAiB,IAAI,EAAE,KAAK,wBAAC,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,aAAa,CAAC,CAAC;SAChC;QAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,yBAAyB;IACzB,oEAAoE;IAC5D,oBAAoB,CAAC,EAAU;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAChD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;gBAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC1B;SACJ;IACL,CAAC;IAED,oBAAoB;IACpB,oEAAoE;IAC5D,gBAAgB,CAAC,EAAU;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,gBAAgB,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC;gBACpC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;gBAClB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC1B;SACJ;IACL,CAAC;IAED,yBAAyB;IACzB,oEAAoE;IAC5D,oBAAoB,CAAC,EAAU;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,YAAY,CAAC,CAAC;gBACjB,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC;gBACpC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,wBAAwB,CAAC,CAAC;gBACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC1B;SACJ;IACL,CAAC;IAED,gBAAgB;IAChB,oEAAoE;IAC5D,aAAa,CAAC,EAAU;QAC5B,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;gBACjC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;gBAChD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,kCAAkC,CAAC,CAAC;gBAClD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;gBACvC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;aACpC;SACJ;IACL,CAAC;IAED,4BAA4B;IAC5B,oEAAoE;IAC5D,uBAAuB,CAAC,EAAU;QACtC,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE;YAClB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;SACnC;;YACG,QAAQ,EAAE,EAAE;gBACR,KAAK,wBAAC,CAAC,KAAK,CAAC;gBACb,KAAK,wBAAC,CAAC,SAAS,CAAC;gBACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;gBAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;oBACd,oBAAoB;oBACpB,MAAM;iBACT;gBACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;oBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;oBACvC,IAAI,CAAC,mBAAmB,CAAC,kCAAqB,CAAC,CAAC;oBAChD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;oBAChC,MAAM;iBACT;gBACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;oBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,kBAAkB,CAAC,CAAC;oBAClC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;oBAChD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;oBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;oBAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;oBACxB,MAAM;iBACT;gBACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;oBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;oBAC5B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;oBAChD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;oBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;oBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,MAAM;iBACT;gBACD,OAAO,CAAC,CAAC;oBACL,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;oBACnD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;iBACnC;aACJ;IACT,CAAC;IAED,qBAAqB;IACrB,oEAAoE;IAC5D,iBAAiB,CAAC,EAAU;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC;gBACtC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,KAAK,CAAC,IAAI,IAAI,kCAAqB,CAAC;gBACpC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAChF;SACJ;IACL,CAAC;IAED,2BAA2B;IAC3B,oEAAoE;IAC5D,sBAAsB,CAAC,EAAU;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,oBAAoB;gBACpB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD;gBACI,IAAI,IAAI,CAAC,uBAAuB,CAAC,sBAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;oBAChD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,4BAA4B,CAAC;iBACnD;qBAAM,IAAI,IAAI,CAAC,uBAAuB,CAAC,sBAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;oBACvD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,4BAA4B,CAAC;iBACnD;gBACD,2EAA2E;gBAC3E,6DAA6D;qBACxD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;oBACjC,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,wCAAwC,CAAC,CAAC;oBACxD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;oBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;oBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;iBAC/B;SACR;IACL,CAAC;IAED,qCAAqC;IACrC,oEAAoE;IAC5D,+BAA+B,CAAC,EAAU;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gCAAgC,CAAC;gBACpD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,0CAA0C,CAAC,CAAC;gBAC1D,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,UAAU,CAAC,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,0CAA0C,CAAC,CAAC;gBAC1D,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,yCAAyC,CAAC,CAAC;gBACzD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;aAC/B;SACJ;IACL,CAAC;IAED,yCAAyC;IACzC,oEAAoE;IAC5D,mCAAmC,CAAC,EAAU;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,oBAAoB;gBACpB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,UAAU,CAAC,CAAC;gBACf,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,yCAAyC,CAAC,CAAC;gBACzD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;aAC/B;SACJ;IACL,CAAC;IAED,kDAAkD;IAClD,oEAAoE;IAC5D,yCAAyC,CAAC,EAAU;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;gBACnD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,KAAK,CAAC,QAAQ,IAAI,kCAAqB,CAAC;gBACxC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC9C;SACJ;IACL,CAAC;IAED,kDAAkD;IAClD,oEAAoE;IAC5D,yCAAyC,CAAC,EAAU;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,UAAU,CAAC,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;gBACnD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,KAAK,CAAC,QAAQ,IAAI,kCAAqB,CAAC;gBACxC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC9C;SACJ;IACL,CAAC;IAED,wCAAwC;IACxC,oEAAoE;IAC5D,kCAAkC,CAAC,EAAU;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,6CAA6C,CAAC;gBACjE,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,yDAAyD,CAAC,CAAC;gBACzE,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,UAAU,CAAC,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,yDAAyD,CAAC,CAAC;gBACzE,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,yCAAyC,CAAC,CAAC;gBACzD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;aAC/B;SACJ;IACL,CAAC;IAED,sDAAsD;IACtD,oEAAoE;IAC5D,8CAA8C,CAAC,EAAU;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,oBAAoB;gBACpB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,UAAU,CAAC,CAAC;gBACf,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,yCAAyC,CAAC,CAAC;gBACzD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;aAC/B;SACJ;IACL,CAAC;IAED,qCAAqC;IACrC,oEAAoE;IAC5D,+BAA+B,CAAC,EAAU;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gCAAgC,CAAC;gBACpD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,0CAA0C,CAAC,CAAC;gBAC1D,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,UAAU,CAAC,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,0CAA0C,CAAC,CAAC;gBAC1D,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,yCAAyC,CAAC,CAAC;gBACzD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;aAC/B;SACJ;IACL,CAAC;IAED,yCAAyC;IACzC,oEAAoE;IAC5D,mCAAmC,CAAC,EAAU;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,oBAAoB;gBACpB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,UAAU,CAAC,CAAC;gBACf,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,uCAAuC,CAAC;gBAC3D,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,yCAAyC,CAAC,CAAC;gBACzD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;aAC/B;SACJ;IACL,CAAC;IAED,kDAAkD;IAClD,oEAAoE;IAC5D,yCAAyC,CAAC,EAAU;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,cAAc,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;gBACnD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,KAAK,CAAC,QAAQ,IAAI,kCAAqB,CAAC;gBACxC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC9C;SACJ;IACL,CAAC;IAED,kDAAkD;IAClD,oEAAoE;IAC5D,yCAAyC,CAAC,EAAU;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,UAAU,CAAC,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;gBACnD,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,KAAK,CAAC,QAAQ,IAAI,kCAAqB,CAAC;gBACxC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;aAC9C;SACJ;IACL,CAAC;IAED,wCAAwC;IACxC,oEAAoE;IAC5D,kCAAkC,CAAC,EAAU;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,KAAK,CAAC;YACb,KAAK,wBAAC,CAAC,SAAS,CAAC;YACjB,KAAK,wBAAC,CAAC,UAAU,CAAC;YAClB,KAAK,wBAAC,CAAC,SAAS,CAAC,CAAC;gBACd,oBAAoB;gBACpB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,+CAA+C,CAAC,CAAC;gBAC/D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;aAC/B;SACJ;IACL,CAAC;IAED,sBAAsB;IACtB,oEAAoE;IAC5D,kBAAkB,CAAC,EAAU;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;QAEhD,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,IAAI,CAAC,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,QAAQ;YACR,aAAa;SAChB;IACL,CAAC;IAED,sBAAsB;IACtB,oEAAoE;IAC5D,kBAAkB,CAAC,EAAU;QACjC,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,oBAAoB,CAAC,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,qBAAqB,CAAC;gBACzC,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,GAAG,CAAC,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,UAAU,CAAC,CAAC;gBAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,8BAA8B;IAC9B,oEAAoE;IAC5D,yBAAyB,CAAC,EAAU;QACxC,IAAI,EAAE,KAAK,wBAAC,CAAC,oBAAoB,EAAE;YAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC;SACxC;aAAM;YACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;SAC/B;IACL,CAAC;IAED,0BAA0B;IAC1B,oEAAoE;IAC5D,qBAAqB,CAAC,EAAU;QACpC,QAAQ,EAAE,EAAE;YACR,KAAK,wBAAC,CAAC,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,MAAM;aACT;YACD,KAAK,wBAAC,CAAC,oBAAoB,CAAC,CAAC;gBACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;aAC/B;SACJ;IACL,CAAC;IAED,4BAA4B;IAC5B,oEAAoE;IAC5D,wBAAwB,CAAC,EAAU;QACvC,IAAI,EAAE,KAAK,wBAAC,CAAC,WAAW,EAAE;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,2BAA2B,CAAC;SAClD;aAAM,IAAI,mBAAmB,CAAC,EAAE,CAAC,EAAE;YAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,yBAAyB,CAAC;YAC7C,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;SAC1C;aAAM;YACH,IAAI,CAAC,2CAA2C,CAAC,wBAAC,CAAC,SAAS,CAAC,CAAC;YAC9D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC5C;IACL,CAAC;IAED,kCAAkC;IAClC,oEAAoE;IAC5D,6BAA6B,CAAC,EAAU;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;QAE3D,oEAAoE;QACpE,6DAA6D;QAC7D,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC3B,gCAAgC;SACnC;aAAM,IAAI,WAAW,EAAE;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACzC,IAAI,CAAC,2CAA2C,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;aACpE;YACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;SACjC;aAAM;YACH,IAAI,CAAC,2CAA2C,CAAC,wBAAC,CAAC,SAAS,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC;SAC1C;IACL,CAAC;IAED,2BAA2B;IAC3B,oEAAoE;IAC5D,wBAAwB,CAAC,EAAU;QACvC,IAAI,mBAAmB,CAAC,EAAE,CAAC,EAAE;YACzB,IAAI,CAAC,2CAA2C,CAAC,EAAE,CAAC,CAAC;SACxD;aAAM;YACH,IAAI,EAAE,KAAK,wBAAC,CAAC,SAAS,EAAE;gBACpB,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;aACjD;YAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC5C;IACL,CAAC;IAED,oCAAoC;IACpC,oEAAoE;IAC5D,+BAA+B,CAAC,EAAU;QAC9C,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAErB,IAAI,EAAE,KAAK,wBAAC,CAAC,aAAa,IAAI,EAAE,KAAK,wBAAC,CAAC,eAAe,EAAE;YACpD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,qCAAqC,CAAC;SAC5D;aAAM;YACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,iCAAiC,CAAC;YACrD,IAAI,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC;SACjD;IACL,CAAC;IAED,8CAA8C;IAC9C,oEAAoE;IAC5D,wCAAwC,CAAC,EAAU;QACvD,IAAI,eAAe,CAAC,EAAE,CAAC,EAAE;YACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;YACnD,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;SAChD;aAAM;YACH,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,0CAA0C,CAAC,CAAC;YAC1D,IAAI,CAAC,2CAA2C,CAAC,wBAAC,CAAC,SAAS,CAAC,CAAC;YAC9D,IAAI,CAAC,2CAA2C,CAAC,wBAAC,CAAC,WAAW,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;SACjC;IACL,CAAC;IAED,0CAA0C;IAC1C,oEAAoE;IAC5D,oCAAoC,CAAC,EAAU;QACnD,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE;YAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,2BAA2B,CAAC;YAC/C,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;SAC5C;aAAM;YACH,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,0CAA0C,CAAC,CAAC;YAC1D,IAAI,CAAC,2CAA2C,CAAC,wBAAC,CAAC,SAAS,CAAC,CAAC;YAC9D,IAAI,CAAC,2CAA2C,CAAC,wBAAC,CAAC,WAAW,CAAC,CAAC;YAChE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC5C;IACL,CAAC;IAED,wCAAwC;IACxC,oEAAoE;IAC5D,mCAAmC,CAAC,EAAU;QAClD,IAAI,oBAAoB,CAAC,EAAE,CAAC,EAAE;YAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;SACxD;aAAM,IAAI,oBAAoB,CAAC,EAAE,CAAC,EAAE;YACjC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;SACxD;aAAM,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE;YACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;SACxD;aAAM,IAAI,EAAE,KAAK,wBAAC,CAAC,SAAS,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;SACtD;aAAM;YACH,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uCAAuC,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;YACnD,IAAI,CAAC,kCAAkC,EAAE,CAAC;SAC7C;IACL,CAAC;IAED,oCAAoC;IACpC,oEAAoE;IAC5D,+BAA+B,CAAC,EAAU;QAC9C,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE;YAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;SACxD;aAAM,IAAI,EAAE,KAAK,wBAAC,CAAC,SAAS,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;SACtD;aAAM;YACH,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,uCAAuC,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,+BAA+B,CAAC;YACnD,IAAI,CAAC,kCAAkC,EAAE,CAAC;SAC7C;IACL,CAAC;IAED,wCAAwC;IACxC,oEAAoE;IAC5D,kCAAkC;QACtC,IAAI,IAAI,CAAC,WAAW,KAAK,wBAAC,CAAC,IAAI,EAAE;YAC7B,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,sBAAsB,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,wBAAC,CAAC,qBAAqB,CAAC;SAC9C;aAAM,IAAI,IAAI,CAAC,WAAW,GAAG,OAAU,EAAE;YACtC,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,qCAAqC,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW,GAAG,wBAAC,CAAC,qBAAqB,CAAC;SAC9C;aAAM,IAAI,IAAA,wBAAW,EAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YACtC,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,2BAA2B,CAAC,CAAC;YAC3C,IAAI,CAAC,WAAW,GAAG,wBAAC,CAAC,qBAAqB,CAAC;SAC9C;aAAM,IAAI,IAAA,iCAAoB,EAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YAC/C,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,8BAA8B,CAAC,CAAC;SACjD;aAAM,IAAI,IAAA,+BAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,wBAAC,CAAC,eAAe,EAAE;YACvF,IAAI,CAAC,IAAI,CAAC,oBAAG,CAAC,yBAAyB,CAAC,CAAC;YAEzC,MAAM,WAAW,GAAG,kCAAkC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAE7E,IAAI,WAAW,KAAK,SAAS,EAAE;gBAC3B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;aAClC;SACJ;QAED,IAAI,CAAC,2CAA2C,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;CACJ;AAv1FD,8BAu1FC"}
\ No newline at end of file
diff --git a/packages/parse5/lib/tokenizer/named-entity-data.js b/packages/parse5/lib/tokenizer/named-entity-data.js
deleted file mode 100644
index 36880c8..0000000
--- a/packages/parse5/lib/tokenizer/named-entity-data.js
+++ /dev/null
@@ -1,5 +0,0 @@
-'use strict';
-
-//NOTE: this file contains auto-generated array mapped radix tree that is used for the named entity references consumption
-//(details: https://github.com/inikulin/parse5/tree/master/scripts/generate-named-entity-data/README.md)
-module.exports = new Uint16Array([4,52,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,106,303,412,810,1432,1701,1796,1987,2114,2360,2420,2484,3170,3251,4140,4393,4575,4610,5106,5512,5728,6117,6274,6315,6345,6427,6516,7002,7910,8733,9323,9870,10170,10631,10893,11318,11386,11467,12773,13092,14474,14922,15448,15542,16419,17666,18166,18611,19004,19095,19298,19397,4,16,69,77,97,98,99,102,103,108,109,110,111,112,114,115,116,117,140,150,158,169,176,194,199,210,216,222,226,242,256,266,283,294,108,105,103,5,198,1,59,148,1,198,80,5,38,1,59,156,1,38,99,117,116,101,5,193,1,59,167,1,193,114,101,118,101,59,1,258,4,2,105,121,182,191,114,99,5,194,1,59,189,1,194,59,1,1040,114,59,3,55349,56580,114,97,118,101,5,192,1,59,208,1,192,112,104,97,59,1,913,97,99,114,59,1,256,100,59,1,10835,4,2,103,112,232,237,111,110,59,1,260,102,59,3,55349,56632,112,108,121,70,117,110,99,116,105,111,110,59,1,8289,105,110,103,5,197,1,59,264,1,197,4,2,99,115,272,277,114,59,3,55349,56476,105,103,110,59,1,8788,105,108,100,101,5,195,1,59,292,1,195,109,108,5,196,1,59,301,1,196,4,8,97,99,101,102,111,114,115,117,321,350,354,383,388,394,400,405,4,2,99,114,327,336,107,115,108,97,115,104,59,1,8726,4,2,118,119,342,345,59,1,10983,101,100,59,1,8966,121,59,1,1041,4,3,99,114,116,362,369,379,97,117,115,101,59,1,8757,110,111,117,108,108,105,115,59,1,8492,97,59,1,914,114,59,3,55349,56581,112,102,59,3,55349,56633,101,118,101,59,1,728,99,114,59,1,8492,109,112,101,113,59,1,8782,4,14,72,79,97,99,100,101,102,104,105,108,111,114,115,117,442,447,456,504,542,547,569,573,577,616,678,784,790,796,99,121,59,1,1063,80,89,5,169,1,59,454,1,169,4,3,99,112,121,464,470,497,117,116,101,59,1,262,4,2,59,105,476,478,1,8914,116,97,108,68,105,102,102,101,114,101,110,116,105,97,108,68,59,1,8517,108,101,121,115,59,1,8493,4,4,97,101,105,111,514,520,530,535,114,111,110,59,1,268,100,105,108,5,199,1,59,528,1,199,114,99,59,1,264,110,105,110,116,59,1,8752,111,116,59,1,266,4,2,100,110,553,560,105,108,108,97,59,1,184,116,101,114,68,111,116,59,1,183,114,59,1,8493,105,59,1,935,114,99,108,101,4,4,68,77,80,84,591,596,603,609,111,116,59,1,8857,105,110,117,115,59,1,8854,108,117,115,59,1,8853,105,109,101,115,59,1,8855,111,4,2,99,115,623,646,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8754,101,67,117,114,108,121,4,2,68,81,658,671,111,117,98,108,101,81,117,111,116,101,59,1,8221,117,111,116,101,59,1,8217,4,4,108,110,112,117,688,701,736,753,111,110,4,2,59,101,696,698,1,8759,59,1,10868,4,3,103,105,116,709,717,722,114,117,101,110,116,59,1,8801,110,116,59,1,8751,111,117,114,73,110,116,101,103,114,97,108,59,1,8750,4,2,102,114,742,745,59,1,8450,111,100,117,99,116,59,1,8720,110,116,101,114,67,108,111,99,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8755,111,115,115,59,1,10799,99,114,59,3,55349,56478,112,4,2,59,67,803,805,1,8915,97,112,59,1,8781,4,11,68,74,83,90,97,99,101,102,105,111,115,834,850,855,860,865,888,903,916,921,1011,1415,4,2,59,111,840,842,1,8517,116,114,97,104,100,59,1,10513,99,121,59,1,1026,99,121,59,1,1029,99,121,59,1,1039,4,3,103,114,115,873,879,883,103,101,114,59,1,8225,114,59,1,8609,104,118,59,1,10980,4,2,97,121,894,900,114,111,110,59,1,270,59,1,1044,108,4,2,59,116,910,912,1,8711,97,59,1,916,114,59,3,55349,56583,4,2,97,102,927,998,4,2,99,109,933,992,114,105,116,105,99,97,108,4,4,65,68,71,84,950,957,978,985,99,117,116,101,59,1,180,111,4,2,116,117,964,967,59,1,729,98,108,101,65,99,117,116,101,59,1,733,114,97,118,101,59,1,96,105,108,100,101,59,1,732,111,110,100,59,1,8900,102,101,114,101,110,116,105,97,108,68,59,1,8518,4,4,112,116,117,119,1021,1026,1048,1249,102,59,3,55349,56635,4,3,59,68,69,1034,1036,1041,1,168,111,116,59,1,8412,113,117,97,108,59,1,8784,98,108,101,4,6,67,68,76,82,85,86,1065,1082,1101,1189,1211,1236,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8751,111,4,2,116,119,1089,1092,59,1,168,110,65,114,114,111,119,59,1,8659,4,2,101,111,1107,1141,102,116,4,3,65,82,84,1117,1124,1136,114,114,111,119,59,1,8656,105,103,104,116,65,114,114,111,119,59,1,8660,101,101,59,1,10980,110,103,4,2,76,82,1149,1177,101,102,116,4,2,65,82,1158,1165,114,114,111,119,59,1,10232,105,103,104,116,65,114,114,111,119,59,1,10234,105,103,104,116,65,114,114,111,119,59,1,10233,105,103,104,116,4,2,65,84,1199,1206,114,114,111,119,59,1,8658,101,101,59,1,8872,112,4,2,65,68,1218,1225,114,114,111,119,59,1,8657,111,119,110,65,114,114,111,119,59,1,8661,101,114,116,105,99,97,108,66,97,114,59,1,8741,110,4,6,65,66,76,82,84,97,1264,1292,1299,1352,1391,1408,114,114,111,119,4,3,59,66,85,1276,1278,1283,1,8595,97,114,59,1,10515,112,65,114,114,111,119,59,1,8693,114,101,118,101,59,1,785,101,102,116,4,3,82,84,86,1310,1323,1334,105,103,104,116,86,101,99,116,111,114,59,1,10576,101,101,86,101,99,116,111,114,59,1,10590,101,99,116,111,114,4,2,59,66,1345,1347,1,8637,97,114,59,1,10582,105,103,104,116,4,2,84,86,1362,1373,101,101,86,101,99,116,111,114,59,1,10591,101,99,116,111,114,4,2,59,66,1384,1386,1,8641,97,114,59,1,10583,101,101,4,2,59,65,1399,1401,1,8868,114,114,111,119,59,1,8615,114,114,111,119,59,1,8659,4,2,99,116,1421,1426,114,59,3,55349,56479,114,111,107,59,1,272,4,16,78,84,97,99,100,102,103,108,109,111,112,113,115,116,117,120,1466,1470,1478,1489,1515,1520,1525,1536,1544,1593,1609,1617,1650,1664,1668,1677,71,59,1,330,72,5,208,1,59,1476,1,208,99,117,116,101,5,201,1,59,1487,1,201,4,3,97,105,121,1497,1503,1512,114,111,110,59,1,282,114,99,5,202,1,59,1510,1,202,59,1,1069,111,116,59,1,278,114,59,3,55349,56584,114,97,118,101,5,200,1,59,1534,1,200,101,109,101,110,116,59,1,8712,4,2,97,112,1550,1555,99,114,59,1,274,116,121,4,2,83,86,1563,1576,109,97,108,108,83,113,117,97,114,101,59,1,9723,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,1,9643,4,2,103,112,1599,1604,111,110,59,1,280,102,59,3,55349,56636,115,105,108,111,110,59,1,917,117,4,2,97,105,1624,1640,108,4,2,59,84,1631,1633,1,10869,105,108,100,101,59,1,8770,108,105,98,114,105,117,109,59,1,8652,4,2,99,105,1656,1660,114,59,1,8496,109,59,1,10867,97,59,1,919,109,108,5,203,1,59,1675,1,203,4,2,105,112,1683,1689,115,116,115,59,1,8707,111,110,101,110,116,105,97,108,69,59,1,8519,4,5,99,102,105,111,115,1713,1717,1722,1762,1791,121,59,1,1060,114,59,3,55349,56585,108,108,101,100,4,2,83,86,1732,1745,109,97,108,108,83,113,117,97,114,101,59,1,9724,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,1,9642,4,3,112,114,117,1770,1775,1781,102,59,3,55349,56637,65,108,108,59,1,8704,114,105,101,114,116,114,102,59,1,8497,99,114,59,1,8497,4,12,74,84,97,98,99,100,102,103,111,114,115,116,1822,1827,1834,1848,1855,1877,1882,1887,1890,1896,1978,1984,99,121,59,1,1027,5,62,1,59,1832,1,62,109,109,97,4,2,59,100,1843,1845,1,915,59,1,988,114,101,118,101,59,1,286,4,3,101,105,121,1863,1869,1874,100,105,108,59,1,290,114,99,59,1,284,59,1,1043,111,116,59,1,288,114,59,3,55349,56586,59,1,8921,112,102,59,3,55349,56638,101,97,116,101,114,4,6,69,70,71,76,83,84,1915,1933,1944,1953,1959,1971,113,117,97,108,4,2,59,76,1925,1927,1,8805,101,115,115,59,1,8923,117,108,108,69,113,117,97,108,59,1,8807,114,101,97,116,101,114,59,1,10914,101,115,115,59,1,8823,108,97,110,116,69,113,117,97,108,59,1,10878,105,108,100,101,59,1,8819,99,114,59,3,55349,56482,59,1,8811,4,8,65,97,99,102,105,111,115,117,2005,2012,2026,2032,2036,2049,2073,2089,82,68,99,121,59,1,1066,4,2,99,116,2018,2023,101,107,59,1,711,59,1,94,105,114,99,59,1,292,114,59,1,8460,108,98,101,114,116,83,112,97,99,101,59,1,8459,4,2,112,114,2055,2059,102,59,1,8461,105,122,111,110,116,97,108,76,105,110,101,59,1,9472,4,2,99,116,2079,2083,114,59,1,8459,114,111,107,59,1,294,109,112,4,2,68,69,2097,2107,111,119,110,72,117,109,112,59,1,8782,113,117,97,108,59,1,8783,4,14,69,74,79,97,99,100,102,103,109,110,111,115,116,117,2144,2149,2155,2160,2171,2189,2194,2198,2209,2245,2307,2329,2334,2341,99,121,59,1,1045,108,105,103,59,1,306,99,121,59,1,1025,99,117,116,101,5,205,1,59,2169,1,205,4,2,105,121,2177,2186,114,99,5,206,1,59,2184,1,206,59,1,1048,111,116,59,1,304,114,59,1,8465,114,97,118,101,5,204,1,59,2207,1,204,4,3,59,97,112,2217,2219,2238,1,8465,4,2,99,103,2225,2229,114,59,1,298,105,110,97,114,121,73,59,1,8520,108,105,101,115,59,1,8658,4,2,116,118,2251,2281,4,2,59,101,2257,2259,1,8748,4,2,103,114,2265,2271,114,97,108,59,1,8747,115,101,99,116,105,111,110,59,1,8898,105,115,105,98,108,101,4,2,67,84,2293,2300,111,109,109,97,59,1,8291,105,109,101,115,59,1,8290,4,3,103,112,116,2315,2320,2325,111,110,59,1,302,102,59,3,55349,56640,97,59,1,921,99,114,59,1,8464,105,108,100,101,59,1,296,4,2,107,109,2347,2352,99,121,59,1,1030,108,5,207,1,59,2358,1,207,4,5,99,102,111,115,117,2372,2386,2391,2397,2414,4,2,105,121,2378,2383,114,99,59,1,308,59,1,1049,114,59,3,55349,56589,112,102,59,3,55349,56641,4,2,99,101,2403,2408,114,59,3,55349,56485,114,99,121,59,1,1032,107,99,121,59,1,1028,4,7,72,74,97,99,102,111,115,2436,2441,2446,2452,2467,2472,2478,99,121,59,1,1061,99,121,59,1,1036,112,112,97,59,1,922,4,2,101,121,2458,2464,100,105,108,59,1,310,59,1,1050,114,59,3,55349,56590,112,102,59,3,55349,56642,99,114,59,3,55349,56486,4,11,74,84,97,99,101,102,108,109,111,115,116,2508,2513,2520,2562,2585,2981,2986,3004,3011,3146,3167,99,121,59,1,1033,5,60,1,59,2518,1,60,4,5,99,109,110,112,114,2532,2538,2544,2548,2558,117,116,101,59,1,313,98,100,97,59,1,923,103,59,1,10218,108,97,99,101,116,114,102,59,1,8466,114,59,1,8606,4,3,97,101,121,2570,2576,2582,114,111,110,59,1,317,100,105,108,59,1,315,59,1,1051,4,2,102,115,2591,2907,116,4,10,65,67,68,70,82,84,85,86,97,114,2614,2663,2672,2728,2735,2760,2820,2870,2888,2895,4,2,110,114,2620,2633,103,108,101,66,114,97,99,107,101,116,59,1,10216,114,111,119,4,3,59,66,82,2644,2646,2651,1,8592,97,114,59,1,8676,105,103,104,116,65,114,114,111,119,59,1,8646,101,105,108,105,110,103,59,1,8968,111,4,2,117,119,2679,2692,98,108,101,66,114,97,99,107,101,116,59,1,10214,110,4,2,84,86,2699,2710,101,101,86,101,99,116,111,114,59,1,10593,101,99,116,111,114,4,2,59,66,2721,2723,1,8643,97,114,59,1,10585,108,111,111,114,59,1,8970,105,103,104,116,4,2,65,86,2745,2752,114,114,111,119,59,1,8596,101,99,116,111,114,59,1,10574,4,2,101,114,2766,2792,101,4,3,59,65,86,2775,2777,2784,1,8867,114,114,111,119,59,1,8612,101,99,116,111,114,59,1,10586,105,97,110,103,108,101,4,3,59,66,69,2806,2808,2813,1,8882,97,114,59,1,10703,113,117,97,108,59,1,8884,112,4,3,68,84,86,2829,2841,2852,111,119,110,86,101,99,116,111,114,59,1,10577,101,101,86,101,99,116,111,114,59,1,10592,101,99,116,111,114,4,2,59,66,2863,2865,1,8639,97,114,59,1,10584,101,99,116,111,114,4,2,59,66,2881,2883,1,8636,97,114,59,1,10578,114,114,111,119,59,1,8656,105,103,104,116,97,114,114,111,119,59,1,8660,115,4,6,69,70,71,76,83,84,2922,2936,2947,2956,2962,2974,113,117,97,108,71,114,101,97,116,101,114,59,1,8922,117,108,108,69,113,117,97,108,59,1,8806,114,101,97,116,101,114,59,1,8822,101,115,115,59,1,10913,108,97,110,116,69,113,117,97,108,59,1,10877,105,108,100,101,59,1,8818,114,59,3,55349,56591,4,2,59,101,2992,2994,1,8920,102,116,97,114,114,111,119,59,1,8666,105,100,111,116,59,1,319,4,3,110,112,119,3019,3110,3115,103,4,4,76,82,108,114,3030,3058,3070,3098,101,102,116,4,2,65,82,3039,3046,114,114,111,119,59,1,10229,105,103,104,116,65,114,114,111,119,59,1,10231,105,103,104,116,65,114,114,111,119,59,1,10230,101,102,116,4,2,97,114,3079,3086,114,114,111,119,59,1,10232,105,103,104,116,97,114,114,111,119,59,1,10234,105,103,104,116,97,114,114,111,119,59,1,10233,102,59,3,55349,56643,101,114,4,2,76,82,3123,3134,101,102,116,65,114,114,111,119,59,1,8601,105,103,104,116,65,114,114,111,119,59,1,8600,4,3,99,104,116,3154,3158,3161,114,59,1,8466,59,1,8624,114,111,107,59,1,321,59,1,8810,4,8,97,99,101,102,105,111,115,117,3188,3192,3196,3222,3227,3237,3243,3248,112,59,1,10501,121,59,1,1052,4,2,100,108,3202,3213,105,117,109,83,112,97,99,101,59,1,8287,108,105,110,116,114,102,59,1,8499,114,59,3,55349,56592,110,117,115,80,108,117,115,59,1,8723,112,102,59,3,55349,56644,99,114,59,1,8499,59,1,924,4,9,74,97,99,101,102,111,115,116,117,3271,3276,3283,3306,3422,3427,4120,4126,4137,99,121,59,1,1034,99,117,116,101,59,1,323,4,3,97,101,121,3291,3297,3303,114,111,110,59,1,327,100,105,108,59,1,325,59,1,1053,4,3,103,115,119,3314,3380,3415,97,116,105,118,101,4,3,77,84,86,3327,3340,3365,101,100,105,117,109,83,112,97,99,101,59,1,8203,104,105,4,2,99,110,3348,3357,107,83,112,97,99,101,59,1,8203,83,112,97,99,101,59,1,8203,101,114,121,84,104,105,110,83,112,97,99,101,59,1,8203,116,101,100,4,2,71,76,3389,3405,114,101,97,116,101,114,71,114,101,97,116,101,114,59,1,8811,101,115,115,76,101,115,115,59,1,8810,76,105,110,101,59,1,10,114,59,3,55349,56593,4,4,66,110,112,116,3437,3444,3460,3464,114,101,97,107,59,1,8288,66,114,101,97,107,105,110,103,83,112,97,99,101,59,1,160,102,59,1,8469,4,13,59,67,68,69,71,72,76,78,80,82,83,84,86,3492,3494,3517,3536,3578,3657,3685,3784,3823,3860,3915,4066,4107,1,10988,4,2,111,117,3500,3510,110,103,114,117,101,110,116,59,1,8802,112,67,97,112,59,1,8813,111,117,98,108,101,86,101,114,116,105,99,97,108,66,97,114,59,1,8742,4,3,108,113,120,3544,3552,3571,101,109,101,110,116,59,1,8713,117,97,108,4,2,59,84,3561,3563,1,8800,105,108,100,101,59,3,8770,824,105,115,116,115,59,1,8708,114,101,97,116,101,114,4,7,59,69,70,71,76,83,84,3600,3602,3609,3621,3631,3637,3650,1,8815,113,117,97,108,59,1,8817,117,108,108,69,113,117,97,108,59,3,8807,824,114,101,97,116,101,114,59,3,8811,824,101,115,115,59,1,8825,108,97,110,116,69,113,117,97,108,59,3,10878,824,105,108,100,101,59,1,8821,117,109,112,4,2,68,69,3666,3677,111,119,110,72,117,109,112,59,3,8782,824,113,117,97,108,59,3,8783,824,101,4,2,102,115,3692,3724,116,84,114,105,97,110,103,108,101,4,3,59,66,69,3709,3711,3717,1,8938,97,114,59,3,10703,824,113,117,97,108,59,1,8940,115,4,6,59,69,71,76,83,84,3739,3741,3748,3757,3764,3777,1,8814,113,117,97,108,59,1,8816,114,101,97,116,101,114,59,1,8824,101,115,115,59,3,8810,824,108,97,110,116,69,113,117,97,108,59,3,10877,824,105,108,100,101,59,1,8820,101,115,116,101,100,4,2,71,76,3795,3812,114,101,97,116,101,114,71,114,101,97,116,101,114,59,3,10914,824,101,115,115,76,101,115,115,59,3,10913,824,114,101,99,101,100,101,115,4,3,59,69,83,3838,3840,3848,1,8832,113,117,97,108,59,3,10927,824,108,97,110,116,69,113,117,97,108,59,1,8928,4,2,101,105,3866,3881,118,101,114,115,101,69,108,101,109,101,110,116,59,1,8716,103,104,116,84,114,105,97,110,103,108,101,4,3,59,66,69,3900,3902,3908,1,8939,97,114,59,3,10704,824,113,117,97,108,59,1,8941,4,2,113,117,3921,3973,117,97,114,101,83,117,4,2,98,112,3933,3952,115,101,116,4,2,59,69,3942,3945,3,8847,824,113,117,97,108,59,1,8930,101,114,115,101,116,4,2,59,69,3963,3966,3,8848,824,113,117,97,108,59,1,8931,4,3,98,99,112,3981,4000,4045,115,101,116,4,2,59,69,3990,3993,3,8834,8402,113,117,97,108,59,1,8840,99,101,101,100,115,4,4,59,69,83,84,4015,4017,4025,4037,1,8833,113,117,97,108,59,3,10928,824,108,97,110,116,69,113,117,97,108,59,1,8929,105,108,100,101,59,3,8831,824,101,114,115,101,116,4,2,59,69,4056,4059,3,8835,8402,113,117,97,108,59,1,8841,105,108,100,101,4,4,59,69,70,84,4080,4082,4089,4100,1,8769,113,117,97,108,59,1,8772,117,108,108,69,113,117,97,108,59,1,8775,105,108,100,101,59,1,8777,101,114,116,105,99,97,108,66,97,114,59,1,8740,99,114,59,3,55349,56489,105,108,100,101,5,209,1,59,4135,1,209,59,1,925,4,14,69,97,99,100,102,103,109,111,112,114,115,116,117,118,4170,4176,4187,4205,4212,4217,4228,4253,4259,4292,4295,4316,4337,4346,108,105,103,59,1,338,99,117,116,101,5,211,1,59,4185,1,211,4,2,105,121,4193,4202,114,99,5,212,1,59,4200,1,212,59,1,1054,98,108,97,99,59,1,336,114,59,3,55349,56594,114,97,118,101,5,210,1,59,4226,1,210,4,3,97,101,105,4236,4241,4246,99,114,59,1,332,103,97,59,1,937,99,114,111,110,59,1,927,112,102,59,3,55349,56646,101,110,67,117,114,108,121,4,2,68,81,4272,4285,111,117,98,108,101,81,117,111,116,101,59,1,8220,117,111,116,101,59,1,8216,59,1,10836,4,2,99,108,4301,4306,114,59,3,55349,56490,97,115,104,5,216,1,59,4314,1,216,105,4,2,108,109,4323,4332,100,101,5,213,1,59,4330,1,213,101,115,59,1,10807,109,108,5,214,1,59,4344,1,214,101,114,4,2,66,80,4354,4380,4,2,97,114,4360,4364,114,59,1,8254,97,99,4,2,101,107,4372,4375,59,1,9182,101,116,59,1,9140,97,114,101,110,116,104,101,115,105,115,59,1,9180,4,9,97,99,102,104,105,108,111,114,115,4413,4422,4426,4431,4435,4438,4448,4471,4561,114,116,105,97,108,68,59,1,8706,121,59,1,1055,114,59,3,55349,56595,105,59,1,934,59,1,928,117,115,77,105,110,117,115,59,1,177,4,2,105,112,4454,4467,110,99,97,114,101,112,108,97,110,101,59,1,8460,102,59,1,8473,4,4,59,101,105,111,4481,4483,4526,4531,1,10939,99,101,100,101,115,4,4,59,69,83,84,4498,4500,4507,4519,1,8826,113,117,97,108,59,1,10927,108,97,110,116,69,113,117,97,108,59,1,8828,105,108,100,101,59,1,8830,109,101,59,1,8243,4,2,100,112,4537,4543,117,99,116,59,1,8719,111,114,116,105,111,110,4,2,59,97,4555,4557,1,8759,108,59,1,8733,4,2,99,105,4567,4572,114,59,3,55349,56491,59,1,936,4,4,85,102,111,115,4585,4594,4599,4604,79,84,5,34,1,59,4592,1,34,114,59,3,55349,56596,112,102,59,1,8474,99,114,59,3,55349,56492,4,12,66,69,97,99,101,102,104,105,111,114,115,117,4636,4642,4650,4681,4704,4763,4767,4771,5047,5069,5081,5094,97,114,114,59,1,10512,71,5,174,1,59,4648,1,174,4,3,99,110,114,4658,4664,4668,117,116,101,59,1,340,103,59,1,10219,114,4,2,59,116,4675,4677,1,8608,108,59,1,10518,4,3,97,101,121,4689,4695,4701,114,111,110,59,1,344,100,105,108,59,1,342,59,1,1056,4,2,59,118,4710,4712,1,8476,101,114,115,101,4,2,69,85,4722,4748,4,2,108,113,4728,4736,101,109,101,110,116,59,1,8715,117,105,108,105,98,114,105,117,109,59,1,8651,112,69,113,117,105,108,105,98,114,105,117,109,59,1,10607,114,59,1,8476,111,59,1,929,103,104,116,4,8,65,67,68,70,84,85,86,97,4792,4840,4849,4905,4912,4972,5022,5040,4,2,110,114,4798,4811,103,108,101,66,114,97,99,107,101,116,59,1,10217,114,111,119,4,3,59,66,76,4822,4824,4829,1,8594,97,114,59,1,8677,101,102,116,65,114,114,111,119,59,1,8644,101,105,108,105,110,103,59,1,8969,111,4,2,117,119,4856,4869,98,108,101,66,114,97,99,107,101,116,59,1,10215,110,4,2,84,86,4876,4887,101,101,86,101,99,116,111,114,59,1,10589,101,99,116,111,114,4,2,59,66,4898,4900,1,8642,97,114,59,1,10581,108,111,111,114,59,1,8971,4,2,101,114,4918,4944,101,4,3,59,65,86,4927,4929,4936,1,8866,114,114,111,119,59,1,8614,101,99,116,111,114,59,1,10587,105,97,110,103,108,101,4,3,59,66,69,4958,4960,4965,1,8883,97,114,59,1,10704,113,117,97,108,59,1,8885,112,4,3,68,84,86,4981,4993,5004,111,119,110,86,101,99,116,111,114,59,1,10575,101,101,86,101,99,116,111,114,59,1,10588,101,99,116,111,114,4,2,59,66,5015,5017,1,8638,97,114,59,1,10580,101,99,116,111,114,4,2,59,66,5033,5035,1,8640,97,114,59,1,10579,114,114,111,119,59,1,8658,4,2,112,117,5053,5057,102,59,1,8477,110,100,73,109,112,108,105,101,115,59,1,10608,105,103,104,116,97,114,114,111,119,59,1,8667,4,2,99,104,5087,5091,114,59,1,8475,59,1,8625,108,101,68,101,108,97,121,101,100,59,1,10740,4,13,72,79,97,99,102,104,105,109,111,113,115,116,117,5134,5150,5157,5164,5198,5203,5259,5265,5277,5283,5374,5380,5385,4,2,67,99,5140,5146,72,99,121,59,1,1065,121,59,1,1064,70,84,99,121,59,1,1068,99,117,116,101,59,1,346,4,5,59,97,101,105,121,5176,5178,5184,5190,5195,1,10940,114,111,110,59,1,352,100,105,108,59,1,350,114,99,59,1,348,59,1,1057,114,59,3,55349,56598,111,114,116,4,4,68,76,82,85,5216,5227,5238,5250,111,119,110,65,114,114,111,119,59,1,8595,101,102,116,65,114,114,111,119,59,1,8592,105,103,104,116,65,114,114,111,119,59,1,8594,112,65,114,114,111,119,59,1,8593,103,109,97,59,1,931,97,108,108,67,105,114,99,108,101,59,1,8728,112,102,59,3,55349,56650,4,2,114,117,5289,5293,116,59,1,8730,97,114,101,4,4,59,73,83,85,5306,5308,5322,5367,1,9633,110,116,101,114,115,101,99,116,105,111,110,59,1,8851,117,4,2,98,112,5329,5347,115,101,116,4,2,59,69,5338,5340,1,8847,113,117,97,108,59,1,8849,101,114,115,101,116,4,2,59,69,5358,5360,1,8848,113,117,97,108,59,1,8850,110,105,111,110,59,1,8852,99,114,59,3,55349,56494,97,114,59,1,8902,4,4,98,99,109,112,5395,5420,5475,5478,4,2,59,115,5401,5403,1,8912,101,116,4,2,59,69,5411,5413,1,8912,113,117,97,108,59,1,8838,4,2,99,104,5426,5468,101,101,100,115,4,4,59,69,83,84,5440,5442,5449,5461,1,8827,113,117,97,108,59,1,10928,108,97,110,116,69,113,117,97,108,59,1,8829,105,108,100,101,59,1,8831,84,104,97,116,59,1,8715,59,1,8721,4,3,59,101,115,5486,5488,5507,1,8913,114,115,101,116,4,2,59,69,5498,5500,1,8835,113,117,97,108,59,1,8839,101,116,59,1,8913,4,11,72,82,83,97,99,102,104,105,111,114,115,5536,5546,5552,5567,5579,5602,5607,5655,5695,5701,5711,79,82,78,5,222,1,59,5544,1,222,65,68,69,59,1,8482,4,2,72,99,5558,5563,99,121,59,1,1035,121,59,1,1062,4,2,98,117,5573,5576,59,1,9,59,1,932,4,3,97,101,121,5587,5593,5599,114,111,110,59,1,356,100,105,108,59,1,354,59,1,1058,114,59,3,55349,56599,4,2,101,105,5613,5631,4,2,114,116,5619,5627,101,102,111,114,101,59,1,8756,97,59,1,920,4,2,99,110,5637,5647,107,83,112,97,99,101,59,3,8287,8202,83,112,97,99,101,59,1,8201,108,100,101,4,4,59,69,70,84,5668,5670,5677,5688,1,8764,113,117,97,108,59,1,8771,117,108,108,69,113,117,97,108,59,1,8773,105,108,100,101,59,1,8776,112,102,59,3,55349,56651,105,112,108,101,68,111,116,59,1,8411,4,2,99,116,5717,5722,114,59,3,55349,56495,114,111,107,59,1,358,4,14,97,98,99,100,102,103,109,110,111,112,114,115,116,117,5758,5789,5805,5823,5830,5835,5846,5852,5921,5937,6089,6095,6101,6108,4,2,99,114,5764,5774,117,116,101,5,218,1,59,5772,1,218,114,4,2,59,111,5781,5783,1,8607,99,105,114,59,1,10569,114,4,2,99,101,5796,5800,121,59,1,1038,118,101,59,1,364,4,2,105,121,5811,5820,114,99,5,219,1,59,5818,1,219,59,1,1059,98,108,97,99,59,1,368,114,59,3,55349,56600,114,97,118,101,5,217,1,59,5844,1,217,97,99,114,59,1,362,4,2,100,105,5858,5905,101,114,4,2,66,80,5866,5892,4,2,97,114,5872,5876,114,59,1,95,97,99,4,2,101,107,5884,5887,59,1,9183,101,116,59,1,9141,97,114,101,110,116,104,101,115,105,115,59,1,9181,111,110,4,2,59,80,5913,5915,1,8899,108,117,115,59,1,8846,4,2,103,112,5927,5932,111,110,59,1,370,102,59,3,55349,56652,4,8,65,68,69,84,97,100,112,115,5955,5985,5996,6009,6026,6033,6044,6075,114,114,111,119,4,3,59,66,68,5967,5969,5974,1,8593,97,114,59,1,10514,111,119,110,65,114,114,111,119,59,1,8645,111,119,110,65,114,114,111,119,59,1,8597,113,117,105,108,105,98,114,105,117,109,59,1,10606,101,101,4,2,59,65,6017,6019,1,8869,114,114,111,119,59,1,8613,114,114,111,119,59,1,8657,111,119,110,97,114,114,111,119,59,1,8661,101,114,4,2,76,82,6052,6063,101,102,116,65,114,114,111,119,59,1,8598,105,103,104,116,65,114,114,111,119,59,1,8599,105,4,2,59,108,6082,6084,1,978,111,110,59,1,933,105,110,103,59,1,366,99,114,59,3,55349,56496,105,108,100,101,59,1,360,109,108,5,220,1,59,6115,1,220,4,9,68,98,99,100,101,102,111,115,118,6137,6143,6148,6152,6166,6250,6255,6261,6267,97,115,104,59,1,8875,97,114,59,1,10987,121,59,1,1042,97,115,104,4,2,59,108,6161,6163,1,8873,59,1,10982,4,2,101,114,6172,6175,59,1,8897,4,3,98,116,121,6183,6188,6238,97,114,59,1,8214,4,2,59,105,6194,6196,1,8214,99,97,108,4,4,66,76,83,84,6209,6214,6220,6231,97,114,59,1,8739,105,110,101,59,1,124,101,112,97,114,97,116,111,114,59,1,10072,105,108,100,101,59,1,8768,84,104,105,110,83,112,97,99,101,59,1,8202,114,59,3,55349,56601,112,102,59,3,55349,56653,99,114,59,3,55349,56497,100,97,115,104,59,1,8874,4,5,99,101,102,111,115,6286,6292,6298,6303,6309,105,114,99,59,1,372,100,103,101,59,1,8896,114,59,3,55349,56602,112,102,59,3,55349,56654,99,114,59,3,55349,56498,4,4,102,105,111,115,6325,6330,6333,6339,114,59,3,55349,56603,59,1,926,112,102,59,3,55349,56655,99,114,59,3,55349,56499,4,9,65,73,85,97,99,102,111,115,117,6365,6370,6375,6380,6391,6405,6410,6416,6422,99,121,59,1,1071,99,121,59,1,1031,99,121,59,1,1070,99,117,116,101,5,221,1,59,6389,1,221,4,2,105,121,6397,6402,114,99,59,1,374,59,1,1067,114,59,3,55349,56604,112,102,59,3,55349,56656,99,114,59,3,55349,56500,109,108,59,1,376,4,8,72,97,99,100,101,102,111,115,6445,6450,6457,6472,6477,6501,6505,6510,99,121,59,1,1046,99,117,116,101,59,1,377,4,2,97,121,6463,6469,114,111,110,59,1,381,59,1,1047,111,116,59,1,379,4,2,114,116,6483,6497,111,87,105,100,116,104,83,112,97,99,101,59,1,8203,97,59,1,918,114,59,1,8488,112,102,59,1,8484,99,114,59,3,55349,56501,4,16,97,98,99,101,102,103,108,109,110,111,112,114,115,116,117,119,6550,6561,6568,6612,6622,6634,6645,6672,6699,6854,6870,6923,6933,6963,6974,6983,99,117,116,101,5,225,1,59,6559,1,225,114,101,118,101,59,1,259,4,6,59,69,100,105,117,121,6582,6584,6588,6591,6600,6609,1,8766,59,3,8766,819,59,1,8767,114,99,5,226,1,59,6598,1,226,116,101,5,180,1,59,6607,1,180,59,1,1072,108,105,103,5,230,1,59,6620,1,230,4,2,59,114,6628,6630,1,8289,59,3,55349,56606,114,97,118,101,5,224,1,59,6643,1,224,4,2,101,112,6651,6667,4,2,102,112,6657,6663,115,121,109,59,1,8501,104,59,1,8501,104,97,59,1,945,4,2,97,112,6678,6692,4,2,99,108,6684,6688,114,59,1,257,103,59,1,10815,5,38,1,59,6697,1,38,4,2,100,103,6705,6737,4,5,59,97,100,115,118,6717,6719,6724,6727,6734,1,8743,110,100,59,1,10837,59,1,10844,108,111,112,101,59,1,10840,59,1,10842,4,7,59,101,108,109,114,115,122,6753,6755,6758,6762,6814,6835,6848,1,8736,59,1,10660,101,59,1,8736,115,100,4,2,59,97,6770,6772,1,8737,4,8,97,98,99,100,101,102,103,104,6790,6793,6796,6799,6802,6805,6808,6811,59,1,10664,59,1,10665,59,1,10666,59,1,10667,59,1,10668,59,1,10669,59,1,10670,59,1,10671,116,4,2,59,118,6821,6823,1,8735,98,4,2,59,100,6830,6832,1,8894,59,1,10653,4,2,112,116,6841,6845,104,59,1,8738,59,1,197,97,114,114,59,1,9084,4,2,103,112,6860,6865,111,110,59,1,261,102,59,3,55349,56658,4,7,59,69,97,101,105,111,112,6886,6888,6891,6897,6900,6904,6908,1,8776,59,1,10864,99,105,114,59,1,10863,59,1,8778,100,59,1,8779,115,59,1,39,114,111,120,4,2,59,101,6917,6919,1,8776,113,59,1,8778,105,110,103,5,229,1,59,6931,1,229,4,3,99,116,121,6941,6946,6949,114,59,3,55349,56502,59,1,42,109,112,4,2,59,101,6957,6959,1,8776,113,59,1,8781,105,108,100,101,5,227,1,59,6972,1,227,109,108,5,228,1,59,6981,1,228,4,2,99,105,6989,6997,111,110,105,110,116,59,1,8755,110,116,59,1,10769,4,16,78,97,98,99,100,101,102,105,107,108,110,111,112,114,115,117,7036,7041,7119,7135,7149,7155,7219,7224,7347,7354,7463,7489,7786,7793,7814,7866,111,116,59,1,10989,4,2,99,114,7047,7094,107,4,4,99,101,112,115,7058,7064,7073,7080,111,110,103,59,1,8780,112,115,105,108,111,110,59,1,1014,114,105,109,101,59,1,8245,105,109,4,2,59,101,7088,7090,1,8765,113,59,1,8909,4,2,118,119,7100,7105,101,101,59,1,8893,101,100,4,2,59,103,7113,7115,1,8965,101,59,1,8965,114,107,4,2,59,116,7127,7129,1,9141,98,114,107,59,1,9142,4,2,111,121,7141,7146,110,103,59,1,8780,59,1,1073,113,117,111,59,1,8222,4,5,99,109,112,114,116,7167,7181,7188,7193,7199,97,117,115,4,2,59,101,7176,7178,1,8757,59,1,8757,112,116,121,118,59,1,10672,115,105,59,1,1014,110,111,117,59,1,8492,4,3,97,104,119,7207,7210,7213,59,1,946,59,1,8502,101,101,110,59,1,8812,114,59,3,55349,56607,103,4,7,99,111,115,116,117,118,119,7241,7262,7288,7305,7328,7335,7340,4,3,97,105,117,7249,7253,7258,112,59,1,8898,114,99,59,1,9711,112,59,1,8899,4,3,100,112,116,7270,7275,7281,111,116,59,1,10752,108,117,115,59,1,10753,105,109,101,115,59,1,10754,4,2,113,116,7294,7300,99,117,112,59,1,10758,97,114,59,1,9733,114,105,97,110,103,108,101,4,2,100,117,7318,7324,111,119,110,59,1,9661,112,59,1,9651,112,108,117,115,59,1,10756,101,101,59,1,8897,101,100,103,101,59,1,8896,97,114,111,119,59,1,10509,4,3,97,107,111,7362,7436,7458,4,2,99,110,7368,7432,107,4,3,108,115,116,7377,7386,7394,111,122,101,110,103,101,59,1,10731,113,117,97,114,101,59,1,9642,114,105,97,110,103,108,101,4,4,59,100,108,114,7411,7413,7419,7425,1,9652,111,119,110,59,1,9662,101,102,116,59,1,9666,105,103,104,116,59,1,9656,107,59,1,9251,4,2,49,51,7442,7454,4,2,50,52,7448,7451,59,1,9618,59,1,9617,52,59,1,9619,99,107,59,1,9608,4,2,101,111,7469,7485,4,2,59,113,7475,7478,3,61,8421,117,105,118,59,3,8801,8421,116,59,1,8976,4,4,112,116,119,120,7499,7504,7517,7523,102,59,3,55349,56659,4,2,59,116,7510,7512,1,8869,111,109,59,1,8869,116,105,101,59,1,8904,4,12,68,72,85,86,98,100,104,109,112,116,117,118,7549,7571,7597,7619,7655,7660,7682,7708,7715,7721,7728,7750,4,4,76,82,108,114,7559,7562,7565,7568,59,1,9559,59,1,9556,59,1,9558,59,1,9555,4,5,59,68,85,100,117,7583,7585,7588,7591,7594,1,9552,59,1,9574,59,1,9577,59,1,9572,59,1,9575,4,4,76,82,108,114,7607,7610,7613,7616,59,1,9565,59,1,9562,59,1,9564,59,1,9561,4,7,59,72,76,82,104,108,114,7635,7637,7640,7643,7646,7649,7652,1,9553,59,1,9580,59,1,9571,59,1,9568,59,1,9579,59,1,9570,59,1,9567,111,120,59,1,10697,4,4,76,82,108,114,7670,7673,7676,7679,59,1,9557,59,1,9554,59,1,9488,59,1,9484,4,5,59,68,85,100,117,7694,7696,7699,7702,7705,1,9472,59,1,9573,59,1,9576,59,1,9516,59,1,9524,105,110,117,115,59,1,8863,108,117,115,59,1,8862,105,109,101,115,59,1,8864,4,4,76,82,108,114,7738,7741,7744,7747,59,1,9563,59,1,9560,59,1,9496,59,1,9492,4,7,59,72,76,82,104,108,114,7766,7768,7771,7774,7777,7780,7783,1,9474,59,1,9578,59,1,9569,59,1,9566,59,1,9532,59,1,9508,59,1,9500,114,105,109,101,59,1,8245,4,2,101,118,7799,7804,118,101,59,1,728,98,97,114,5,166,1,59,7812,1,166,4,4,99,101,105,111,7824,7829,7834,7846,114,59,3,55349,56503,109,105,59,1,8271,109,4,2,59,101,7841,7843,1,8765,59,1,8909,108,4,3,59,98,104,7855,7857,7860,1,92,59,1,10693,115,117,98,59,1,10184,4,2,108,109,7872,7885,108,4,2,59,101,7879,7881,1,8226,116,59,1,8226,112,4,3,59,69,101,7894,7896,7899,1,8782,59,1,10926,4,2,59,113,7905,7907,1,8783,59,1,8783,4,15,97,99,100,101,102,104,105,108,111,114,115,116,117,119,121,7942,8021,8075,8080,8121,8126,8157,8279,8295,8430,8446,8485,8491,8707,8726,4,3,99,112,114,7950,7956,8007,117,116,101,59,1,263,4,6,59,97,98,99,100,115,7970,7972,7977,7984,7998,8003,1,8745,110,100,59,1,10820,114,99,117,112,59,1,10825,4,2,97,117,7990,7994,112,59,1,10827,112,59,1,10823,111,116,59,1,10816,59,3,8745,65024,4,2,101,111,8013,8017,116,59,1,8257,110,59,1,711,4,4,97,101,105,117,8031,8046,8056,8061,4,2,112,114,8037,8041,115,59,1,10829,111,110,59,1,269,100,105,108,5,231,1,59,8054,1,231,114,99,59,1,265,112,115,4,2,59,115,8069,8071,1,10828,109,59,1,10832,111,116,59,1,267,4,3,100,109,110,8088,8097,8104,105,108,5,184,1,59,8095,1,184,112,116,121,118,59,1,10674,116,5,162,2,59,101,8112,8114,1,162,114,100,111,116,59,1,183,114,59,3,55349,56608,4,3,99,101,105,8134,8138,8154,121,59,1,1095,99,107,4,2,59,109,8146,8148,1,10003,97,114,107,59,1,10003,59,1,967,114,4,7,59,69,99,101,102,109,115,8174,8176,8179,8258,8261,8268,8273,1,9675,59,1,10691,4,3,59,101,108,8187,8189,8193,1,710,113,59,1,8791,101,4,2,97,100,8200,8223,114,114,111,119,4,2,108,114,8210,8216,101,102,116,59,1,8634,105,103,104,116,59,1,8635,4,5,82,83,97,99,100,8235,8238,8241,8246,8252,59,1,174,59,1,9416,115,116,59,1,8859,105,114,99,59,1,8858,97,115,104,59,1,8861,59,1,8791,110,105,110,116,59,1,10768,105,100,59,1,10991,99,105,114,59,1,10690,117,98,115,4,2,59,117,8288,8290,1,9827,105,116,59,1,9827,4,4,108,109,110,112,8305,8326,8376,8400,111,110,4,2,59,101,8313,8315,1,58,4,2,59,113,8321,8323,1,8788,59,1,8788,4,2,109,112,8332,8344,97,4,2,59,116,8339,8341,1,44,59,1,64,4,3,59,102,108,8352,8354,8358,1,8705,110,59,1,8728,101,4,2,109,120,8365,8371,101,110,116,59,1,8705,101,115,59,1,8450,4,2,103,105,8382,8395,4,2,59,100,8388,8390,1,8773,111,116,59,1,10861,110,116,59,1,8750,4,3,102,114,121,8408,8412,8417,59,3,55349,56660,111,100,59,1,8720,5,169,2,59,115,8424,8426,1,169,114,59,1,8471,4,2,97,111,8436,8441,114,114,59,1,8629,115,115,59,1,10007,4,2,99,117,8452,8457,114,59,3,55349,56504,4,2,98,112,8463,8474,4,2,59,101,8469,8471,1,10959,59,1,10961,4,2,59,101,8480,8482,1,10960,59,1,10962,100,111,116,59,1,8943,4,7,100,101,108,112,114,118,119,8507,8522,8536,8550,8600,8697,8702,97,114,114,4,2,108,114,8516,8519,59,1,10552,59,1,10549,4,2,112,115,8528,8532,114,59,1,8926,99,59,1,8927,97,114,114,4,2,59,112,8545,8547,1,8630,59,1,10557,4,6,59,98,99,100,111,115,8564,8566,8573,8587,8592,8596,1,8746,114,99,97,112,59,1,10824,4,2,97,117,8579,8583,112,59,1,10822,112,59,1,10826,111,116,59,1,8845,114,59,1,10821,59,3,8746,65024,4,4,97,108,114,118,8610,8623,8663,8672,114,114,4,2,59,109,8618,8620,1,8631,59,1,10556,121,4,3,101,118,119,8632,8651,8656,113,4,2,112,115,8639,8645,114,101,99,59,1,8926,117,99,99,59,1,8927,101,101,59,1,8910,101,100,103,101,59,1,8911,101,110,5,164,1,59,8670,1,164,101,97,114,114,111,119,4,2,108,114,8684,8690,101,102,116,59,1,8630,105,103,104,116,59,1,8631,101,101,59,1,8910,101,100,59,1,8911,4,2,99,105,8713,8721,111,110,105,110,116,59,1,8754,110,116,59,1,8753,108,99,116,121,59,1,9005,4,19,65,72,97,98,99,100,101,102,104,105,106,108,111,114,115,116,117,119,122,8773,8778,8783,8821,8839,8854,8887,8914,8930,8944,9036,9041,9058,9197,9227,9258,9281,9297,9305,114,114,59,1,8659,97,114,59,1,10597,4,4,103,108,114,115,8793,8799,8805,8809,103,101,114,59,1,8224,101,116,104,59,1,8504,114,59,1,8595,104,4,2,59,118,8816,8818,1,8208,59,1,8867,4,2,107,108,8827,8834,97,114,111,119,59,1,10511,97,99,59,1,733,4,2,97,121,8845,8851,114,111,110,59,1,271,59,1,1076,4,3,59,97,111,8862,8864,8880,1,8518,4,2,103,114,8870,8876,103,101,114,59,1,8225,114,59,1,8650,116,115,101,113,59,1,10871,4,3,103,108,109,8895,8902,8907,5,176,1,59,8900,1,176,116,97,59,1,948,112,116,121,118,59,1,10673,4,2,105,114,8920,8926,115,104,116,59,1,10623,59,3,55349,56609,97,114,4,2,108,114,8938,8941,59,1,8643,59,1,8642,4,5,97,101,103,115,118,8956,8986,8989,8996,9001,109,4,3,59,111,115,8965,8967,8983,1,8900,110,100,4,2,59,115,8975,8977,1,8900,117,105,116,59,1,9830,59,1,9830,59,1,168,97,109,109,97,59,1,989,105,110,59,1,8946,4,3,59,105,111,9009,9011,9031,1,247,100,101,5,247,2,59,111,9020,9022,1,247,110,116,105,109,101,115,59,1,8903,110,120,59,1,8903,99,121,59,1,1106,99,4,2,111,114,9048,9053,114,110,59,1,8990,111,112,59,1,8973,4,5,108,112,116,117,119,9070,9076,9081,9130,9144,108,97,114,59,1,36,102,59,3,55349,56661,4,5,59,101,109,112,115,9093,9095,9109,9116,9122,1,729,113,4,2,59,100,9102,9104,1,8784,111,116,59,1,8785,105,110,117,115,59,1,8760,108,117,115,59,1,8724,113,117,97,114,101,59,1,8865,98,108,101,98,97,114,119,101,100,103,101,59,1,8966,110,4,3,97,100,104,9153,9160,9172,114,114,111,119,59,1,8595,111,119,110,97,114,114,111,119,115,59,1,8650,97,114,112,111,111,110,4,2,108,114,9184,9190,101,102,116,59,1,8643,105,103,104,116,59,1,8642,4,2,98,99,9203,9211,107,97,114,111,119,59,1,10512,4,2,111,114,9217,9222,114,110,59,1,8991,111,112,59,1,8972,4,3,99,111,116,9235,9248,9252,4,2,114,121,9241,9245,59,3,55349,56505,59,1,1109,108,59,1,10742,114,111,107,59,1,273,4,2,100,114,9264,9269,111,116,59,1,8945,105,4,2,59,102,9276,9278,1,9663,59,1,9662,4,2,97,104,9287,9292,114,114,59,1,8693,97,114,59,1,10607,97,110,103,108,101,59,1,10662,4,2,99,105,9311,9315,121,59,1,1119,103,114,97,114,114,59,1,10239,4,18,68,97,99,100,101,102,103,108,109,110,111,112,113,114,115,116,117,120,9361,9376,9398,9439,9444,9447,9462,9495,9531,9585,9598,9614,9659,9755,9771,9792,9808,9826,4,2,68,111,9367,9372,111,116,59,1,10871,116,59,1,8785,4,2,99,115,9382,9392,117,116,101,5,233,1,59,9390,1,233,116,101,114,59,1,10862,4,4,97,105,111,121,9408,9414,9430,9436,114,111,110,59,1,283,114,4,2,59,99,9421,9423,1,8790,5,234,1,59,9428,1,234,108,111,110,59,1,8789,59,1,1101,111,116,59,1,279,59,1,8519,4,2,68,114,9453,9458,111,116,59,1,8786,59,3,55349,56610,4,3,59,114,115,9470,9472,9482,1,10906,97,118,101,5,232,1,59,9480,1,232,4,2,59,100,9488,9490,1,10902,111,116,59,1,10904,4,4,59,105,108,115,9505,9507,9515,9518,1,10905,110,116,101,114,115,59,1,9191,59,1,8467,4,2,59,100,9524,9526,1,10901,111,116,59,1,10903,4,3,97,112,115,9539,9544,9564,99,114,59,1,275,116,121,4,3,59,115,118,9554,9556,9561,1,8709,101,116,59,1,8709,59,1,8709,112,4,2,49,59,9571,9583,4,2,51,52,9577,9580,59,1,8196,59,1,8197,1,8195,4,2,103,115,9591,9594,59,1,331,112,59,1,8194,4,2,103,112,9604,9609,111,110,59,1,281,102,59,3,55349,56662,4,3,97,108,115,9622,9635,9640,114,4,2,59,115,9629,9631,1,8917,108,59,1,10723,117,115,59,1,10865,105,4,3,59,108,118,9649,9651,9656,1,949,111,110,59,1,949,59,1,1013,4,4,99,115,117,118,9669,9686,9716,9747,4,2,105,111,9675,9680,114,99,59,1,8790,108,111,110,59,1,8789,4,2,105,108,9692,9696,109,59,1,8770,97,110,116,4,2,103,108,9705,9710,116,114,59,1,10902,101,115,115,59,1,10901,4,3,97,101,105,9724,9729,9734,108,115,59,1,61,115,116,59,1,8799,118,4,2,59,68,9741,9743,1,8801,68,59,1,10872,112,97,114,115,108,59,1,10725,4,2,68,97,9761,9766,111,116,59,1,8787,114,114,59,1,10609,4,3,99,100,105,9779,9783,9788,114,59,1,8495,111,116,59,1,8784,109,59,1,8770,4,2,97,104,9798,9801,59,1,951,5,240,1,59,9806,1,240,4,2,109,114,9814,9822,108,5,235,1,59,9820,1,235,111,59,1,8364,4,3,99,105,112,9834,9838,9843,108,59,1,33,115,116,59,1,8707,4,2,101,111,9849,9859,99,116,97,116,105,111,110,59,1,8496,110,101,110,116,105,97,108,101,59,1,8519,4,12,97,99,101,102,105,106,108,110,111,112,114,115,9896,9910,9914,9921,9954,9960,9967,9989,9994,10027,10036,10164,108,108,105,110,103,100,111,116,115,101,113,59,1,8786,121,59,1,1092,109,97,108,101,59,1,9792,4,3,105,108,114,9929,9935,9950,108,105,103,59,1,64259,4,2,105,108,9941,9945,103,59,1,64256,105,103,59,1,64260,59,3,55349,56611,108,105,103,59,1,64257,108,105,103,59,3,102,106,4,3,97,108,116,9975,9979,9984,116,59,1,9837,105,103,59,1,64258,110,115,59,1,9649,111,102,59,1,402,4,2,112,114,10000,10005,102,59,3,55349,56663,4,2,97,107,10011,10016,108,108,59,1,8704,4,2,59,118,10022,10024,1,8916,59,1,10969,97,114,116,105,110,116,59,1,10765,4,2,97,111,10042,10159,4,2,99,115,10048,10155,4,6,49,50,51,52,53,55,10062,10102,10114,10135,10139,10151,4,6,50,51,52,53,54,56,10076,10083,10086,10093,10096,10099,5,189,1,59,10081,1,189,59,1,8531,5,188,1,59,10091,1,188,59,1,8533,59,1,8537,59,1,8539,4,2,51,53,10108,10111,59,1,8532,59,1,8534,4,3,52,53,56,10122,10129,10132,5,190,1,59,10127,1,190,59,1,8535,59,1,8540,53,59,1,8536,4,2,54,56,10145,10148,59,1,8538,59,1,8541,56,59,1,8542,108,59,1,8260,119,110,59,1,8994,99,114,59,3,55349,56507,4,17,69,97,98,99,100,101,102,103,105,106,108,110,111,114,115,116,118,10206,10217,10247,10254,10268,10273,10358,10363,10374,10380,10385,10406,10458,10464,10470,10497,10610,4,2,59,108,10212,10214,1,8807,59,1,10892,4,3,99,109,112,10225,10231,10244,117,116,101,59,1,501,109,97,4,2,59,100,10239,10241,1,947,59,1,989,59,1,10886,114,101,118,101,59,1,287,4,2,105,121,10260,10265,114,99,59,1,285,59,1,1075,111,116,59,1,289,4,4,59,108,113,115,10283,10285,10288,10308,1,8805,59,1,8923,4,3,59,113,115,10296,10298,10301,1,8805,59,1,8807,108,97,110,116,59,1,10878,4,4,59,99,100,108,10318,10320,10324,10345,1,10878,99,59,1,10921,111,116,4,2,59,111,10332,10334,1,10880,4,2,59,108,10340,10342,1,10882,59,1,10884,4,2,59,101,10351,10354,3,8923,65024,115,59,1,10900,114,59,3,55349,56612,4,2,59,103,10369,10371,1,8811,59,1,8921,109,101,108,59,1,8503,99,121,59,1,1107,4,4,59,69,97,106,10395,10397,10400,10403,1,8823,59,1,10898,59,1,10917,59,1,10916,4,4,69,97,101,115,10416,10419,10434,10453,59,1,8809,112,4,2,59,112,10426,10428,1,10890,114,111,120,59,1,10890,4,2,59,113,10440,10442,1,10888,4,2,59,113,10448,10450,1,10888,59,1,8809,105,109,59,1,8935,112,102,59,3,55349,56664,97,118,101,59,1,96,4,2,99,105,10476,10480,114,59,1,8458,109,4,3,59,101,108,10489,10491,10494,1,8819,59,1,10894,59,1,10896,5,62,6,59,99,100,108,113,114,10512,10514,10527,10532,10538,10545,1,62,4,2,99,105,10520,10523,59,1,10919,114,59,1,10874,111,116,59,1,8919,80,97,114,59,1,10645,117,101,115,116,59,1,10876,4,5,97,100,101,108,115,10557,10574,10579,10599,10605,4,2,112,114,10563,10570,112,114,111,120,59,1,10886,114,59,1,10616,111,116,59,1,8919,113,4,2,108,113,10586,10592,101,115,115,59,1,8923,108,101,115,115,59,1,10892,101,115,115,59,1,8823,105,109,59,1,8819,4,2,101,110,10616,10626,114,116,110,101,113,113,59,3,8809,65024,69,59,3,8809,65024,4,10,65,97,98,99,101,102,107,111,115,121,10653,10658,10713,10718,10724,10760,10765,10786,10850,10875,114,114,59,1,8660,4,4,105,108,109,114,10668,10674,10678,10684,114,115,112,59,1,8202,102,59,1,189,105,108,116,59,1,8459,4,2,100,114,10690,10695,99,121,59,1,1098,4,3,59,99,119,10703,10705,10710,1,8596,105,114,59,1,10568,59,1,8621,97,114,59,1,8463,105,114,99,59,1,293,4,3,97,108,114,10732,10748,10754,114,116,115,4,2,59,117,10741,10743,1,9829,105,116,59,1,9829,108,105,112,59,1,8230,99,111,110,59,1,8889,114,59,3,55349,56613,115,4,2,101,119,10772,10779,97,114,111,119,59,1,10533,97,114,111,119,59,1,10534,4,5,97,109,111,112,114,10798,10803,10809,10839,10844,114,114,59,1,8703,116,104,116,59,1,8763,107,4,2,108,114,10816,10827,101,102,116,97,114,114,111,119,59,1,8617,105,103,104,116,97,114,114,111,119,59,1,8618,102,59,3,55349,56665,98,97,114,59,1,8213,4,3,99,108,116,10858,10863,10869,114,59,3,55349,56509,97,115,104,59,1,8463,114,111,107,59,1,295,4,2,98,112,10881,10887,117,108,108,59,1,8259,104,101,110,59,1,8208,4,15,97,99,101,102,103,105,106,109,110,111,112,113,115,116,117,10925,10936,10958,10977,10990,11001,11039,11045,11101,11192,11220,11226,11237,11285,11299,99,117,116,101,5,237,1,59,10934,1,237,4,3,59,105,121,10944,10946,10955,1,8291,114,99,5,238,1,59,10953,1,238,59,1,1080,4,2,99,120,10964,10968,121,59,1,1077,99,108,5,161,1,59,10975,1,161,4,2,102,114,10983,10986,59,1,8660,59,3,55349,56614,114,97,118,101,5,236,1,59,10999,1,236,4,4,59,105,110,111,11011,11013,11028,11034,1,8520,4,2,105,110,11019,11024,110,116,59,1,10764,116,59,1,8749,102,105,110,59,1,10716,116,97,59,1,8489,108,105,103,59,1,307,4,3,97,111,112,11053,11092,11096,4,3,99,103,116,11061,11065,11088,114,59,1,299,4,3,101,108,112,11073,11076,11082,59,1,8465,105,110,101,59,1,8464,97,114,116,59,1,8465,104,59,1,305,102,59,1,8887,101,100,59,1,437,4,5,59,99,102,111,116,11113,11115,11121,11136,11142,1,8712,97,114,101,59,1,8453,105,110,4,2,59,116,11129,11131,1,8734,105,101,59,1,10717,100,111,116,59,1,305,4,5,59,99,101,108,112,11154,11156,11161,11179,11186,1,8747,97,108,59,1,8890,4,2,103,114,11167,11173,101,114,115,59,1,8484,99,97,108,59,1,8890,97,114,104,107,59,1,10775,114,111,100,59,1,10812,4,4,99,103,112,116,11202,11206,11211,11216,121,59,1,1105,111,110,59,1,303,102,59,3,55349,56666,97,59,1,953,114,111,100,59,1,10812,117,101,115,116,5,191,1,59,11235,1,191,4,2,99,105,11243,11248,114,59,3,55349,56510,110,4,5,59,69,100,115,118,11261,11263,11266,11271,11282,1,8712,59,1,8953,111,116,59,1,8949,4,2,59,118,11277,11279,1,8948,59,1,8947,59,1,8712,4,2,59,105,11291,11293,1,8290,108,100,101,59,1,297,4,2,107,109,11305,11310,99,121,59,1,1110,108,5,239,1,59,11316,1,239,4,6,99,102,109,111,115,117,11332,11346,11351,11357,11363,11380,4,2,105,121,11338,11343,114,99,59,1,309,59,1,1081,114,59,3,55349,56615,97,116,104,59,1,567,112,102,59,3,55349,56667,4,2,99,101,11369,11374,114,59,3,55349,56511,114,99,121,59,1,1112,107,99,121,59,1,1108,4,8,97,99,102,103,104,106,111,115,11404,11418,11433,11438,11445,11450,11455,11461,112,112,97,4,2,59,118,11413,11415,1,954,59,1,1008,4,2,101,121,11424,11430,100,105,108,59,1,311,59,1,1082,114,59,3,55349,56616,114,101,101,110,59,1,312,99,121,59,1,1093,99,121,59,1,1116,112,102,59,3,55349,56668,99,114,59,3,55349,56512,4,23,65,66,69,72,97,98,99,100,101,102,103,104,106,108,109,110,111,112,114,115,116,117,118,11515,11538,11544,11555,11560,11721,11780,11818,11868,12136,12160,12171,12203,12208,12246,12275,12327,12509,12523,12569,12641,12732,12752,4,3,97,114,116,11523,11528,11532,114,114,59,1,8666,114,59,1,8656,97,105,108,59,1,10523,97,114,114,59,1,10510,4,2,59,103,11550,11552,1,8806,59,1,10891,97,114,59,1,10594,4,9,99,101,103,109,110,112,113,114,116,11580,11586,11594,11600,11606,11624,11627,11636,11694,117,116,101,59,1,314,109,112,116,121,118,59,1,10676,114,97,110,59,1,8466,98,100,97,59,1,955,103,4,3,59,100,108,11615,11617,11620,1,10216,59,1,10641,101,59,1,10216,59,1,10885,117,111,5,171,1,59,11634,1,171,114,4,8,59,98,102,104,108,112,115,116,11655,11657,11669,11673,11677,11681,11685,11690,1,8592,4,2,59,102,11663,11665,1,8676,115,59,1,10527,115,59,1,10525,107,59,1,8617,112,59,1,8619,108,59,1,10553,105,109,59,1,10611,108,59,1,8610,4,3,59,97,101,11702,11704,11709,1,10923,105,108,59,1,10521,4,2,59,115,11715,11717,1,10925,59,3,10925,65024,4,3,97,98,114,11729,11734,11739,114,114,59,1,10508,114,107,59,1,10098,4,2,97,107,11745,11758,99,4,2,101,107,11752,11755,59,1,123,59,1,91,4,2,101,115,11764,11767,59,1,10635,108,4,2,100,117,11774,11777,59,1,10639,59,1,10637,4,4,97,101,117,121,11790,11796,11811,11815,114,111,110,59,1,318,4,2,100,105,11802,11807,105,108,59,1,316,108,59,1,8968,98,59,1,123,59,1,1083,4,4,99,113,114,115,11828,11832,11845,11864,97,59,1,10550,117,111,4,2,59,114,11840,11842,1,8220,59,1,8222,4,2,100,117,11851,11857,104,97,114,59,1,10599,115,104,97,114,59,1,10571,104,59,1,8626,4,5,59,102,103,113,115,11880,11882,12008,12011,12031,1,8804,116,4,5,97,104,108,114,116,11895,11913,11935,11947,11996,114,114,111,119,4,2,59,116,11905,11907,1,8592,97,105,108,59,1,8610,97,114,112,111,111,110,4,2,100,117,11925,11931,111,119,110,59,1,8637,112,59,1,8636,101,102,116,97,114,114,111,119,115,59,1,8647,105,103,104,116,4,3,97,104,115,11959,11974,11984,114,114,111,119,4,2,59,115,11969,11971,1,8596,59,1,8646,97,114,112,111,111,110,115,59,1,8651,113,117,105,103,97,114,114,111,119,59,1,8621,104,114,101,101,116,105,109,101,115,59,1,8907,59,1,8922,4,3,59,113,115,12019,12021,12024,1,8804,59,1,8806,108,97,110,116,59,1,10877,4,5,59,99,100,103,115,12043,12045,12049,12070,12083,1,10877,99,59,1,10920,111,116,4,2,59,111,12057,12059,1,10879,4,2,59,114,12065,12067,1,10881,59,1,10883,4,2,59,101,12076,12079,3,8922,65024,115,59,1,10899,4,5,97,100,101,103,115,12095,12103,12108,12126,12131,112,112,114,111,120,59,1,10885,111,116,59,1,8918,113,4,2,103,113,12115,12120,116,114,59,1,8922,103,116,114,59,1,10891,116,114,59,1,8822,105,109,59,1,8818,4,3,105,108,114,12144,12150,12156,115,104,116,59,1,10620,111,111,114,59,1,8970,59,3,55349,56617,4,2,59,69,12166,12168,1,8822,59,1,10897,4,2,97,98,12177,12198,114,4,2,100,117,12184,12187,59,1,8637,4,2,59,108,12193,12195,1,8636,59,1,10602,108,107,59,1,9604,99,121,59,1,1113,4,5,59,97,99,104,116,12220,12222,12227,12235,12241,1,8810,114,114,59,1,8647,111,114,110,101,114,59,1,8990,97,114,100,59,1,10603,114,105,59,1,9722,4,2,105,111,12252,12258,100,111,116,59,1,320,117,115,116,4,2,59,97,12267,12269,1,9136,99,104,101,59,1,9136,4,4,69,97,101,115,12285,12288,12303,12322,59,1,8808,112,4,2,59,112,12295,12297,1,10889,114,111,120,59,1,10889,4,2,59,113,12309,12311,1,10887,4,2,59,113,12317,12319,1,10887,59,1,8808,105,109,59,1,8934,4,8,97,98,110,111,112,116,119,122,12345,12359,12364,12421,12446,12467,12474,12490,4,2,110,114,12351,12355,103,59,1,10220,114,59,1,8701,114,107,59,1,10214,103,4,3,108,109,114,12373,12401,12409,101,102,116,4,2,97,114,12382,12389,114,114,111,119,59,1,10229,105,103,104,116,97,114,114,111,119,59,1,10231,97,112,115,116,111,59,1,10236,105,103,104,116,97,114,114,111,119,59,1,10230,112,97,114,114,111,119,4,2,108,114,12433,12439,101,102,116,59,1,8619,105,103,104,116,59,1,8620,4,3,97,102,108,12454,12458,12462,114,59,1,10629,59,3,55349,56669,117,115,59,1,10797,105,109,101,115,59,1,10804,4,2,97,98,12480,12485,115,116,59,1,8727,97,114,59,1,95,4,3,59,101,102,12498,12500,12506,1,9674,110,103,101,59,1,9674,59,1,10731,97,114,4,2,59,108,12517,12519,1,40,116,59,1,10643,4,5,97,99,104,109,116,12535,12540,12548,12561,12564,114,114,59,1,8646,111,114,110,101,114,59,1,8991,97,114,4,2,59,100,12556,12558,1,8651,59,1,10605,59,1,8206,114,105,59,1,8895,4,6,97,99,104,105,113,116,12583,12589,12594,12597,12614,12635,113,117,111,59,1,8249,114,59,3,55349,56513,59,1,8624,109,4,3,59,101,103,12606,12608,12611,1,8818,59,1,10893,59,1,10895,4,2,98,117,12620,12623,59,1,91,111,4,2,59,114,12630,12632,1,8216,59,1,8218,114,111,107,59,1,322,5,60,8,59,99,100,104,105,108,113,114,12660,12662,12675,12680,12686,12692,12698,12705,1,60,4,2,99,105,12668,12671,59,1,10918,114,59,1,10873,111,116,59,1,8918,114,101,101,59,1,8907,109,101,115,59,1,8905,97,114,114,59,1,10614,117,101,115,116,59,1,10875,4,2,80,105,12711,12716,97,114,59,1,10646,4,3,59,101,102,12724,12726,12729,1,9667,59,1,8884,59,1,9666,114,4,2,100,117,12739,12746,115,104,97,114,59,1,10570,104,97,114,59,1,10598,4,2,101,110,12758,12768,114,116,110,101,113,113,59,3,8808,65024,69,59,3,8808,65024,4,14,68,97,99,100,101,102,104,105,108,110,111,112,115,117,12803,12809,12893,12908,12914,12928,12933,12937,13011,13025,13032,13049,13052,13069,68,111,116,59,1,8762,4,4,99,108,112,114,12819,12827,12849,12887,114,5,175,1,59,12825,1,175,4,2,101,116,12833,12836,59,1,9794,4,2,59,101,12842,12844,1,10016,115,101,59,1,10016,4,2,59,115,12855,12857,1,8614,116,111,4,4,59,100,108,117,12869,12871,12877,12883,1,8614,111,119,110,59,1,8615,101,102,116,59,1,8612,112,59,1,8613,107,101,114,59,1,9646,4,2,111,121,12899,12905,109,109,97,59,1,10793,59,1,1084,97,115,104,59,1,8212,97,115,117,114,101,100,97,110,103,108,101,59,1,8737,114,59,3,55349,56618,111,59,1,8487,4,3,99,100,110,12945,12954,12985,114,111,5,181,1,59,12952,1,181,4,4,59,97,99,100,12964,12966,12971,12976,1,8739,115,116,59,1,42,105,114,59,1,10992,111,116,5,183,1,59,12983,1,183,117,115,4,3,59,98,100,12995,12997,13000,1,8722,59,1,8863,4,2,59,117,13006,13008,1,8760,59,1,10794,4,2,99,100,13017,13021,112,59,1,10971,114,59,1,8230,112,108,117,115,59,1,8723,4,2,100,112,13038,13044,101,108,115,59,1,8871,102,59,3,55349,56670,59,1,8723,4,2,99,116,13058,13063,114,59,3,55349,56514,112,111,115,59,1,8766,4,3,59,108,109,13077,13079,13087,1,956,116,105,109,97,112,59,1,8888,97,112,59,1,8888,4,24,71,76,82,86,97,98,99,100,101,102,103,104,105,106,108,109,111,112,114,115,116,117,118,119,13142,13165,13217,13229,13247,13330,13359,13414,13420,13508,13513,13579,13602,13626,13631,13762,13767,13855,13936,13995,14214,14285,14312,14432,4,2,103,116,13148,13152,59,3,8921,824,4,2,59,118,13158,13161,3,8811,8402,59,3,8811,824,4,3,101,108,116,13173,13200,13204,102,116,4,2,97,114,13181,13188,114,114,111,119,59,1,8653,105,103,104,116,97,114,114,111,119,59,1,8654,59,3,8920,824,4,2,59,118,13210,13213,3,8810,8402,59,3,8810,824,105,103,104,116,97,114,114,111,119,59,1,8655,4,2,68,100,13235,13241,97,115,104,59,1,8879,97,115,104,59,1,8878,4,5,98,99,110,112,116,13259,13264,13270,13275,13308,108,97,59,1,8711,117,116,101,59,1,324,103,59,3,8736,8402,4,5,59,69,105,111,112,13287,13289,13293,13298,13302,1,8777,59,3,10864,824,100,59,3,8779,824,115,59,1,329,114,111,120,59,1,8777,117,114,4,2,59,97,13316,13318,1,9838,108,4,2,59,115,13325,13327,1,9838,59,1,8469,4,2,115,117,13336,13344,112,5,160,1,59,13342,1,160,109,112,4,2,59,101,13352,13355,3,8782,824,59,3,8783,824,4,5,97,101,111,117,121,13371,13385,13391,13407,13411,4,2,112,114,13377,13380,59,1,10819,111,110,59,1,328,100,105,108,59,1,326,110,103,4,2,59,100,13399,13401,1,8775,111,116,59,3,10861,824,112,59,1,10818,59,1,1085,97,115,104,59,1,8211,4,7,59,65,97,100,113,115,120,13436,13438,13443,13466,13472,13478,13494,1,8800,114,114,59,1,8663,114,4,2,104,114,13450,13454,107,59,1,10532,4,2,59,111,13460,13462,1,8599,119,59,1,8599,111,116,59,3,8784,824,117,105,118,59,1,8802,4,2,101,105,13484,13489,97,114,59,1,10536,109,59,3,8770,824,105,115,116,4,2,59,115,13503,13505,1,8708,59,1,8708,114,59,3,55349,56619,4,4,69,101,115,116,13523,13527,13563,13568,59,3,8807,824,4,3,59,113,115,13535,13537,13559,1,8817,4,3,59,113,115,13545,13547,13551,1,8817,59,3,8807,824,108,97,110,116,59,3,10878,824,59,3,10878,824,105,109,59,1,8821,4,2,59,114,13574,13576,1,8815,59,1,8815,4,3,65,97,112,13587,13592,13597,114,114,59,1,8654,114,114,59,1,8622,97,114,59,1,10994,4,3,59,115,118,13610,13612,13623,1,8715,4,2,59,100,13618,13620,1,8956,59,1,8954,59,1,8715,99,121,59,1,1114,4,7,65,69,97,100,101,115,116,13647,13652,13656,13661,13665,13737,13742,114,114,59,1,8653,59,3,8806,824,114,114,59,1,8602,114,59,1,8229,4,4,59,102,113,115,13675,13677,13703,13725,1,8816,116,4,2,97,114,13684,13691,114,114,111,119,59,1,8602,105,103,104,116,97,114,114,111,119,59,1,8622,4,3,59,113,115,13711,13713,13717,1,8816,59,3,8806,824,108,97,110,116,59,3,10877,824,4,2,59,115,13731,13734,3,10877,824,59,1,8814,105,109,59,1,8820,4,2,59,114,13748,13750,1,8814,105,4,2,59,101,13757,13759,1,8938,59,1,8940,105,100,59,1,8740,4,2,112,116,13773,13778,102,59,3,55349,56671,5,172,3,59,105,110,13787,13789,13829,1,172,110,4,4,59,69,100,118,13800,13802,13806,13812,1,8713,59,3,8953,824,111,116,59,3,8949,824,4,3,97,98,99,13820,13823,13826,59,1,8713,59,1,8951,59,1,8950,105,4,2,59,118,13836,13838,1,8716,4,3,97,98,99,13846,13849,13852,59,1,8716,59,1,8958,59,1,8957,4,3,97,111,114,13863,13892,13899,114,4,4,59,97,115,116,13874,13876,13883,13888,1,8742,108,108,101,108,59,1,8742,108,59,3,11005,8421,59,3,8706,824,108,105,110,116,59,1,10772,4,3,59,99,101,13907,13909,13914,1,8832,117,101,59,1,8928,4,2,59,99,13920,13923,3,10927,824,4,2,59,101,13929,13931,1,8832,113,59,3,10927,824,4,4,65,97,105,116,13946,13951,13971,13982,114,114,59,1,8655,114,114,4,3,59,99,119,13961,13963,13967,1,8603,59,3,10547,824,59,3,8605,824,103,104,116,97,114,114,111,119,59,1,8603,114,105,4,2,59,101,13990,13992,1,8939,59,1,8941,4,7,99,104,105,109,112,113,117,14011,14036,14060,14080,14085,14090,14106,4,4,59,99,101,114,14021,14023,14028,14032,1,8833,117,101,59,1,8929,59,3,10928,824,59,3,55349,56515,111,114,116,4,2,109,112,14045,14050,105,100,59,1,8740,97,114,97,108,108,101,108,59,1,8742,109,4,2,59,101,14067,14069,1,8769,4,2,59,113,14075,14077,1,8772,59,1,8772,105,100,59,1,8740,97,114,59,1,8742,115,117,4,2,98,112,14098,14102,101,59,1,8930,101,59,1,8931,4,3,98,99,112,14114,14157,14171,4,4,59,69,101,115,14124,14126,14130,14133,1,8836,59,3,10949,824,59,1,8840,101,116,4,2,59,101,14141,14144,3,8834,8402,113,4,2,59,113,14151,14153,1,8840,59,3,10949,824,99,4,2,59,101,14164,14166,1,8833,113,59,3,10928,824,4,4,59,69,101,115,14181,14183,14187,14190,1,8837,59,3,10950,824,59,1,8841,101,116,4,2,59,101,14198,14201,3,8835,8402,113,4,2,59,113,14208,14210,1,8841,59,3,10950,824,4,4,103,105,108,114,14224,14228,14238,14242,108,59,1,8825,108,100,101,5,241,1,59,14236,1,241,103,59,1,8824,105,97,110,103,108,101,4,2,108,114,14254,14269,101,102,116,4,2,59,101,14263,14265,1,8938,113,59,1,8940,105,103,104,116,4,2,59,101,14279,14281,1,8939,113,59,1,8941,4,2,59,109,14291,14293,1,957,4,3,59,101,115,14301,14303,14308,1,35,114,111,59,1,8470,112,59,1,8199,4,9,68,72,97,100,103,105,108,114,115,14332,14338,14344,14349,14355,14369,14376,14408,14426,97,115,104,59,1,8877,97,114,114,59,1,10500,112,59,3,8781,8402,97,115,104,59,1,8876,4,2,101,116,14361,14365,59,3,8805,8402,59,3,62,8402,110,102,105,110,59,1,10718,4,3,65,101,116,14384,14389,14393,114,114,59,1,10498,59,3,8804,8402,4,2,59,114,14399,14402,3,60,8402,105,101,59,3,8884,8402,4,2,65,116,14414,14419,114,114,59,1,10499,114,105,101,59,3,8885,8402,105,109,59,3,8764,8402,4,3,65,97,110,14440,14445,14468,114,114,59,1,8662,114,4,2,104,114,14452,14456,107,59,1,10531,4,2,59,111,14462,14464,1,8598,119,59,1,8598,101,97,114,59,1,10535,4,18,83,97,99,100,101,102,103,104,105,108,109,111,112,114,115,116,117,118,14512,14515,14535,14560,14597,14603,14618,14643,14657,14662,14701,14741,14747,14769,14851,14877,14907,14916,59,1,9416,4,2,99,115,14521,14531,117,116,101,5,243,1,59,14529,1,243,116,59,1,8859,4,2,105,121,14541,14557,114,4,2,59,99,14548,14550,1,8858,5,244,1,59,14555,1,244,59,1,1086,4,5,97,98,105,111,115,14572,14577,14583,14587,14591,115,104,59,1,8861,108,97,99,59,1,337,118,59,1,10808,116,59,1,8857,111,108,100,59,1,10684,108,105,103,59,1,339,4,2,99,114,14609,14614,105,114,59,1,10687,59,3,55349,56620,4,3,111,114,116,14626,14630,14640,110,59,1,731,97,118,101,5,242,1,59,14638,1,242,59,1,10689,4,2,98,109,14649,14654,97,114,59,1,10677,59,1,937,110,116,59,1,8750,4,4,97,99,105,116,14672,14677,14693,14698,114,114,59,1,8634,4,2,105,114,14683,14687,114,59,1,10686,111,115,115,59,1,10683,110,101,59,1,8254,59,1,10688,4,3,97,101,105,14709,14714,14719,99,114,59,1,333,103,97,59,1,969,4,3,99,100,110,14727,14733,14736,114,111,110,59,1,959,59,1,10678,117,115,59,1,8854,112,102,59,3,55349,56672,4,3,97,101,108,14755,14759,14764,114,59,1,10679,114,112,59,1,10681,117,115,59,1,8853,4,7,59,97,100,105,111,115,118,14785,14787,14792,14831,14837,14841,14848,1,8744,114,114,59,1,8635,4,4,59,101,102,109,14802,14804,14817,14824,1,10845,114,4,2,59,111,14811,14813,1,8500,102,59,1,8500,5,170,1,59,14822,1,170,5,186,1,59,14829,1,186,103,111,102,59,1,8886,114,59,1,10838,108,111,112,101,59,1,10839,59,1,10843,4,3,99,108,111,14859,14863,14873,114,59,1,8500,97,115,104,5,248,1,59,14871,1,248,108,59,1,8856,105,4,2,108,109,14884,14893,100,101,5,245,1,59,14891,1,245,101,115,4,2,59,97,14901,14903,1,8855,115,59,1,10806,109,108,5,246,1,59,14914,1,246,98,97,114,59,1,9021,4,12,97,99,101,102,104,105,108,109,111,114,115,117,14948,14992,14996,15033,15038,15068,15090,15189,15192,15222,15427,15441,114,4,4,59,97,115,116,14959,14961,14976,14989,1,8741,5,182,2,59,108,14968,14970,1,182,108,101,108,59,1,8741,4,2,105,108,14982,14986,109,59,1,10995,59,1,11005,59,1,8706,121,59,1,1087,114,4,5,99,105,109,112,116,15009,15014,15019,15024,15027,110,116,59,1,37,111,100,59,1,46,105,108,59,1,8240,59,1,8869,101,110,107,59,1,8241,114,59,3,55349,56621,4,3,105,109,111,15046,15057,15063,4,2,59,118,15052,15054,1,966,59,1,981,109,97,116,59,1,8499,110,101,59,1,9742,4,3,59,116,118,15076,15078,15087,1,960,99,104,102,111,114,107,59,1,8916,59,1,982,4,2,97,117,15096,15119,110,4,2,99,107,15103,15115,107,4,2,59,104,15110,15112,1,8463,59,1,8462,118,59,1,8463,115,4,9,59,97,98,99,100,101,109,115,116,15140,15142,15148,15151,15156,15168,15171,15179,15184,1,43,99,105,114,59,1,10787,59,1,8862,105,114,59,1,10786,4,2,111,117,15162,15165,59,1,8724,59,1,10789,59,1,10866,110,5,177,1,59,15177,1,177,105,109,59,1,10790,119,111,59,1,10791,59,1,177,4,3,105,112,117,15200,15208,15213,110,116,105,110,116,59,1,10773,102,59,3,55349,56673,110,100,5,163,1,59,15220,1,163,4,10,59,69,97,99,101,105,110,111,115,117,15244,15246,15249,15253,15258,15334,15347,15367,15416,15421,1,8826,59,1,10931,112,59,1,10935,117,101,59,1,8828,4,2,59,99,15264,15266,1,10927,4,6,59,97,99,101,110,115,15280,15282,15290,15299,15303,15329,1,8826,112,112,114,111,120,59,1,10935,117,114,108,121,101,113,59,1,8828,113,59,1,10927,4,3,97,101,115,15311,15319,15324,112,112,114,111,120,59,1,10937,113,113,59,1,10933,105,109,59,1,8936,105,109,59,1,8830,109,101,4,2,59,115,15342,15344,1,8242,59,1,8473,4,3,69,97,115,15355,15358,15362,59,1,10933,112,59,1,10937,105,109,59,1,8936,4,3,100,102,112,15375,15378,15404,59,1,8719,4,3,97,108,115,15386,15392,15398,108,97,114,59,1,9006,105,110,101,59,1,8978,117,114,102,59,1,8979,4,2,59,116,15410,15412,1,8733,111,59,1,8733,105,109,59,1,8830,114,101,108,59,1,8880,4,2,99,105,15433,15438,114,59,3,55349,56517,59,1,968,110,99,115,112,59,1,8200,4,6,102,105,111,112,115,117,15462,15467,15472,15478,15485,15491,114,59,3,55349,56622,110,116,59,1,10764,112,102,59,3,55349,56674,114,105,109,101,59,1,8279,99,114,59,3,55349,56518,4,3,97,101,111,15499,15520,15534,116,4,2,101,105,15506,15515,114,110,105,111,110,115,59,1,8461,110,116,59,1,10774,115,116,4,2,59,101,15528,15530,1,63,113,59,1,8799,116,5,34,1,59,15540,1,34,4,21,65,66,72,97,98,99,100,101,102,104,105,108,109,110,111,112,114,115,116,117,120,15586,15609,15615,15620,15796,15855,15893,15931,15977,16001,16039,16183,16204,16222,16228,16285,16312,16318,16363,16408,16416,4,3,97,114,116,15594,15599,15603,114,114,59,1,8667,114,59,1,8658,97,105,108,59,1,10524,97,114,114,59,1,10511,97,114,59,1,10596,4,7,99,100,101,110,113,114,116,15636,15651,15656,15664,15687,15696,15770,4,2,101,117,15642,15646,59,3,8765,817,116,101,59,1,341,105,99,59,1,8730,109,112,116,121,118,59,1,10675,103,4,4,59,100,101,108,15675,15677,15680,15683,1,10217,59,1,10642,59,1,10661,101,59,1,10217,117,111,5,187,1,59,15694,1,187,114,4,11,59,97,98,99,102,104,108,112,115,116,119,15721,15723,15727,15739,15742,15746,15750,15754,15758,15763,15767,1,8594,112,59,1,10613,4,2,59,102,15733,15735,1,8677,115,59,1,10528,59,1,10547,115,59,1,10526,107,59,1,8618,112,59,1,8620,108,59,1,10565,105,109,59,1,10612,108,59,1,8611,59,1,8605,4,2,97,105,15776,15781,105,108,59,1,10522,111,4,2,59,110,15788,15790,1,8758,97,108,115,59,1,8474,4,3,97,98,114,15804,15809,15814,114,114,59,1,10509,114,107,59,1,10099,4,2,97,107,15820,15833,99,4,2,101,107,15827,15830,59,1,125,59,1,93,4,2,101,115,15839,15842,59,1,10636,108,4,2,100,117,15849,15852,59,1,10638,59,1,10640,4,4,97,101,117,121,15865,15871,15886,15890,114,111,110,59,1,345,4,2,100,105,15877,15882,105,108,59,1,343,108,59,1,8969,98,59,1,125,59,1,1088,4,4,99,108,113,115,15903,15907,15914,15927,97,59,1,10551,100,104,97,114,59,1,10601,117,111,4,2,59,114,15922,15924,1,8221,59,1,8221,104,59,1,8627,4,3,97,99,103,15939,15966,15970,108,4,4,59,105,112,115,15950,15952,15957,15963,1,8476,110,101,59,1,8475,97,114,116,59,1,8476,59,1,8477,116,59,1,9645,5,174,1,59,15975,1,174,4,3,105,108,114,15985,15991,15997,115,104,116,59,1,10621,111,111,114,59,1,8971,59,3,55349,56623,4,2,97,111,16007,16028,114,4,2,100,117,16014,16017,59,1,8641,4,2,59,108,16023,16025,1,8640,59,1,10604,4,2,59,118,16034,16036,1,961,59,1,1009,4,3,103,110,115,16047,16167,16171,104,116,4,6,97,104,108,114,115,116,16063,16081,16103,16130,16143,16155,114,114,111,119,4,2,59,116,16073,16075,1,8594,97,105,108,59,1,8611,97,114,112,111,111,110,4,2,100,117,16093,16099,111,119,110,59,1,8641,112,59,1,8640,101,102,116,4,2,97,104,16112,16120,114,114,111,119,115,59,1,8644,97,114,112,111,111,110,115,59,1,8652,105,103,104,116,97,114,114,111,119,115,59,1,8649,113,117,105,103,97,114,114,111,119,59,1,8605,104,114,101,101,116,105,109,101,115,59,1,8908,103,59,1,730,105,110,103,100,111,116,115,101,113,59,1,8787,4,3,97,104,109,16191,16196,16201,114,114,59,1,8644,97,114,59,1,8652,59,1,8207,111,117,115,116,4,2,59,97,16214,16216,1,9137,99,104,101,59,1,9137,109,105,100,59,1,10990,4,4,97,98,112,116,16238,16252,16257,16278,4,2,110,114,16244,16248,103,59,1,10221,114,59,1,8702,114,107,59,1,10215,4,3,97,102,108,16265,16269,16273,114,59,1,10630,59,3,55349,56675,117,115,59,1,10798,105,109,101,115,59,1,10805,4,2,97,112,16291,16304,114,4,2,59,103,16298,16300,1,41,116,59,1,10644,111,108,105,110,116,59,1,10770,97,114,114,59,1,8649,4,4,97,99,104,113,16328,16334,16339,16342,113,117,111,59,1,8250,114,59,3,55349,56519,59,1,8625,4,2,98,117,16348,16351,59,1,93,111,4,2,59,114,16358,16360,1,8217,59,1,8217,4,3,104,105,114,16371,16377,16383,114,101,101,59,1,8908,109,101,115,59,1,8906,105,4,4,59,101,102,108,16394,16396,16399,16402,1,9657,59,1,8885,59,1,9656,116,114,105,59,1,10702,108,117,104,97,114,59,1,10600,59,1,8478,4,19,97,98,99,100,101,102,104,105,108,109,111,112,113,114,115,116,117,119,122,16459,16466,16472,16572,16590,16672,16687,16746,16844,16850,16924,16963,16988,17115,17121,17154,17206,17614,17656,99,117,116,101,59,1,347,113,117,111,59,1,8218,4,10,59,69,97,99,101,105,110,112,115,121,16494,16496,16499,16513,16518,16531,16536,16556,16564,16569,1,8827,59,1,10932,4,2,112,114,16505,16508,59,1,10936,111,110,59,1,353,117,101,59,1,8829,4,2,59,100,16524,16526,1,10928,105,108,59,1,351,114,99,59,1,349,4,3,69,97,115,16544,16547,16551,59,1,10934,112,59,1,10938,105,109,59,1,8937,111,108,105,110,116,59,1,10771,105,109,59,1,8831,59,1,1089,111,116,4,3,59,98,101,16582,16584,16587,1,8901,59,1,8865,59,1,10854,4,7,65,97,99,109,115,116,120,16606,16611,16634,16642,16646,16652,16668,114,114,59,1,8664,114,4,2,104,114,16618,16622,107,59,1,10533,4,2,59,111,16628,16630,1,8600,119,59,1,8600,116,5,167,1,59,16640,1,167,105,59,1,59,119,97,114,59,1,10537,109,4,2,105,110,16659,16665,110,117,115,59,1,8726,59,1,8726,116,59,1,10038,114,4,2,59,111,16679,16682,3,55349,56624,119,110,59,1,8994,4,4,97,99,111,121,16697,16702,16716,16739,114,112,59,1,9839,4,2,104,121,16708,16713,99,121,59,1,1097,59,1,1096,114,116,4,2,109,112,16724,16729,105,100,59,1,8739,97,114,97,108,108,101,108,59,1,8741,5,173,1,59,16744,1,173,4,2,103,109,16752,16770,109,97,4,3,59,102,118,16762,16764,16767,1,963,59,1,962,59,1,962,4,8,59,100,101,103,108,110,112,114,16788,16790,16795,16806,16817,16828,16832,16838,1,8764,111,116,59,1,10858,4,2,59,113,16801,16803,1,8771,59,1,8771,4,2,59,69,16812,16814,1,10910,59,1,10912,4,2,59,69,16823,16825,1,10909,59,1,10911,101,59,1,8774,108,117,115,59,1,10788,97,114,114,59,1,10610,97,114,114,59,1,8592,4,4,97,101,105,116,16860,16883,16891,16904,4,2,108,115,16866,16878,108,115,101,116,109,105,110,117,115,59,1,8726,104,112,59,1,10803,112,97,114,115,108,59,1,10724,4,2,100,108,16897,16900,59,1,8739,101,59,1,8995,4,2,59,101,16910,16912,1,10922,4,2,59,115,16918,16920,1,10924,59,3,10924,65024,4,3,102,108,112,16932,16938,16958,116,99,121,59,1,1100,4,2,59,98,16944,16946,1,47,4,2,59,97,16952,16954,1,10692,114,59,1,9023,102,59,3,55349,56676,97,4,2,100,114,16970,16985,101,115,4,2,59,117,16978,16980,1,9824,105,116,59,1,9824,59,1,8741,4,3,99,115,117,16996,17028,17089,4,2,97,117,17002,17015,112,4,2,59,115,17009,17011,1,8851,59,3,8851,65024,112,4,2,59,115,17022,17024,1,8852,59,3,8852,65024,117,4,2,98,112,17035,17062,4,3,59,101,115,17043,17045,17048,1,8847,59,1,8849,101,116,4,2,59,101,17056,17058,1,8847,113,59,1,8849,4,3,59,101,115,17070,17072,17075,1,8848,59,1,8850,101,116,4,2,59,101,17083,17085,1,8848,113,59,1,8850,4,3,59,97,102,17097,17099,17112,1,9633,114,4,2,101,102,17106,17109,59,1,9633,59,1,9642,59,1,9642,97,114,114,59,1,8594,4,4,99,101,109,116,17131,17136,17142,17148,114,59,3,55349,56520,116,109,110,59,1,8726,105,108,101,59,1,8995,97,114,102,59,1,8902,4,2,97,114,17160,17172,114,4,2,59,102,17167,17169,1,9734,59,1,9733,4,2,97,110,17178,17202,105,103,104,116,4,2,101,112,17188,17197,112,115,105,108,111,110,59,1,1013,104,105,59,1,981,115,59,1,175,4,5,98,99,109,110,112,17218,17351,17420,17423,17427,4,9,59,69,100,101,109,110,112,114,115,17238,17240,17243,17248,17261,17267,17279,17285,17291,1,8834,59,1,10949,111,116,59,1,10941,4,2,59,100,17254,17256,1,8838,111,116,59,1,10947,117,108,116,59,1,10945,4,2,69,101,17273,17276,59,1,10955,59,1,8842,108,117,115,59,1,10943,97,114,114,59,1,10617,4,3,101,105,117,17299,17335,17339,116,4,3,59,101,110,17308,17310,17322,1,8834,113,4,2,59,113,17317,17319,1,8838,59,1,10949,101,113,4,2,59,113,17330,17332,1,8842,59,1,10955,109,59,1,10951,4,2,98,112,17345,17348,59,1,10965,59,1,10963,99,4,6,59,97,99,101,110,115,17366,17368,17376,17385,17389,17415,1,8827,112,112,114,111,120,59,1,10936,117,114,108,121,101,113,59,1,8829,113,59,1,10928,4,3,97,101,115,17397,17405,17410,112,112,114,111,120,59,1,10938,113,113,59,1,10934,105,109,59,1,8937,105,109,59,1,8831,59,1,8721,103,59,1,9834,4,13,49,50,51,59,69,100,101,104,108,109,110,112,115,17455,17462,17469,17476,17478,17481,17496,17509,17524,17530,17536,17548,17554,5,185,1,59,17460,1,185,5,178,1,59,17467,1,178,5,179,1,59,17474,1,179,1,8835,59,1,10950,4,2,111,115,17487,17491,116,59,1,10942,117,98,59,1,10968,4,2,59,100,17502,17504,1,8839,111,116,59,1,10948,115,4,2,111,117,17516,17520,108,59,1,10185,98,59,1,10967,97,114,114,59,1,10619,117,108,116,59,1,10946,4,2,69,101,17542,17545,59,1,10956,59,1,8843,108,117,115,59,1,10944,4,3,101,105,117,17562,17598,17602,116,4,3,59,101,110,17571,17573,17585,1,8835,113,4,2,59,113,17580,17582,1,8839,59,1,10950,101,113,4,2,59,113,17593,17595,1,8843,59,1,10956,109,59,1,10952,4,2,98,112,17608,17611,59,1,10964,59,1,10966,4,3,65,97,110,17622,17627,17650,114,114,59,1,8665,114,4,2,104,114,17634,17638,107,59,1,10534,4,2,59,111,17644,17646,1,8601,119,59,1,8601,119,97,114,59,1,10538,108,105,103,5,223,1,59,17664,1,223,4,13,97,98,99,100,101,102,104,105,111,112,114,115,119,17694,17709,17714,17737,17742,17749,17754,17860,17905,17957,17964,18090,18122,4,2,114,117,17700,17706,103,101,116,59,1,8982,59,1,964,114,107,59,1,9140,4,3,97,101,121,17722,17728,17734,114,111,110,59,1,357,100,105,108,59,1,355,59,1,1090,111,116,59,1,8411,108,114,101,99,59,1,8981,114,59,3,55349,56625,4,4,101,105,107,111,17764,17805,17836,17851,4,2,114,116,17770,17786,101,4,2,52,102,17777,17780,59,1,8756,111,114,101,59,1,8756,97,4,3,59,115,118,17795,17797,17802,1,952,121,109,59,1,977,59,1,977,4,2,99,110,17811,17831,107,4,2,97,115,17818,17826,112,112,114,111,120,59,1,8776,105,109,59,1,8764,115,112,59,1,8201,4,2,97,115,17842,17846,112,59,1,8776,105,109,59,1,8764,114,110,5,254,1,59,17858,1,254,4,3,108,109,110,17868,17873,17901,100,101,59,1,732,101,115,5,215,3,59,98,100,17884,17886,17898,1,215,4,2,59,97,17892,17894,1,8864,114,59,1,10801,59,1,10800,116,59,1,8749,4,3,101,112,115,17913,17917,17953,97,59,1,10536,4,4,59,98,99,102,17927,17929,17934,17939,1,8868,111,116,59,1,9014,105,114,59,1,10993,4,2,59,111,17945,17948,3,55349,56677,114,107,59,1,10970,97,59,1,10537,114,105,109,101,59,1,8244,4,3,97,105,112,17972,17977,18082,100,101,59,1,8482,4,7,97,100,101,109,112,115,116,17993,18051,18056,18059,18066,18072,18076,110,103,108,101,4,5,59,100,108,113,114,18009,18011,18017,18032,18035,1,9653,111,119,110,59,1,9663,101,102,116,4,2,59,101,18026,18028,1,9667,113,59,1,8884,59,1,8796,105,103,104,116,4,2,59,101,18045,18047,1,9657,113,59,1,8885,111,116,59,1,9708,59,1,8796,105,110,117,115,59,1,10810,108,117,115,59,1,10809,98,59,1,10701,105,109,101,59,1,10811,101,122,105,117,109,59,1,9186,4,3,99,104,116,18098,18111,18116,4,2,114,121,18104,18108,59,3,55349,56521,59,1,1094,99,121,59,1,1115,114,111,107,59,1,359,4,2,105,111,18128,18133,120,116,59,1,8812,104,101,97,100,4,2,108,114,18143,18154,101,102,116,97,114,114,111,119,59,1,8606,105,103,104,116,97,114,114,111,119,59,1,8608,4,18,65,72,97,98,99,100,102,103,104,108,109,111,112,114,115,116,117,119,18204,18209,18214,18234,18250,18268,18292,18308,18319,18343,18379,18397,18413,18504,18547,18553,18584,18603,114,114,59,1,8657,97,114,59,1,10595,4,2,99,114,18220,18230,117,116,101,5,250,1,59,18228,1,250,114,59,1,8593,114,4,2,99,101,18241,18245,121,59,1,1118,118,101,59,1,365,4,2,105,121,18256,18265,114,99,5,251,1,59,18263,1,251,59,1,1091,4,3,97,98,104,18276,18281,18287,114,114,59,1,8645,108,97,99,59,1,369,97,114,59,1,10606,4,2,105,114,18298,18304,115,104,116,59,1,10622,59,3,55349,56626,114,97,118,101,5,249,1,59,18317,1,249,4,2,97,98,18325,18338,114,4,2,108,114,18332,18335,59,1,8639,59,1,8638,108,107,59,1,9600,4,2,99,116,18349,18374,4,2,111,114,18355,18369,114,110,4,2,59,101,18363,18365,1,8988,114,59,1,8988,111,112,59,1,8975,114,105,59,1,9720,4,2,97,108,18385,18390,99,114,59,1,363,5,168,1,59,18395,1,168,4,2,103,112,18403,18408,111,110,59,1,371,102,59,3,55349,56678,4,6,97,100,104,108,115,117,18427,18434,18445,18470,18475,18494,114,114,111,119,59,1,8593,111,119,110,97,114,114,111,119,59,1,8597,97,114,112,111,111,110,4,2,108,114,18457,18463,101,102,116,59,1,8639,105,103,104,116,59,1,8638,117,115,59,1,8846,105,4,3,59,104,108,18484,18486,18489,1,965,59,1,978,111,110,59,1,965,112,97,114,114,111,119,115,59,1,8648,4,3,99,105,116,18512,18537,18542,4,2,111,114,18518,18532,114,110,4,2,59,101,18526,18528,1,8989,114,59,1,8989,111,112,59,1,8974,110,103,59,1,367,114,105,59,1,9721,99,114,59,3,55349,56522,4,3,100,105,114,18561,18566,18572,111,116,59,1,8944,108,100,101,59,1,361,105,4,2,59,102,18579,18581,1,9653,59,1,9652,4,2,97,109,18590,18595,114,114,59,1,8648,108,5,252,1,59,18601,1,252,97,110,103,108,101,59,1,10663,4,15,65,66,68,97,99,100,101,102,108,110,111,112,114,115,122,18643,18648,18661,18667,18847,18851,18857,18904,18909,18915,18931,18937,18943,18949,18996,114,114,59,1,8661,97,114,4,2,59,118,18656,18658,1,10984,59,1,10985,97,115,104,59,1,8872,4,2,110,114,18673,18679,103,114,116,59,1,10652,4,7,101,107,110,112,114,115,116,18695,18704,18711,18720,18742,18754,18810,112,115,105,108,111,110,59,1,1013,97,112,112,97,59,1,1008,111,116,104,105,110,103,59,1,8709,4,3,104,105,114,18728,18732,18735,105,59,1,981,59,1,982,111,112,116,111,59,1,8733,4,2,59,104,18748,18750,1,8597,111,59,1,1009,4,2,105,117,18760,18766,103,109,97,59,1,962,4,2,98,112,18772,18791,115,101,116,110,101,113,4,2,59,113,18784,18787,3,8842,65024,59,3,10955,65024,115,101,116,110,101,113,4,2,59,113,18803,18806,3,8843,65024,59,3,10956,65024,4,2,104,114,18816,18822,101,116,97,59,1,977,105,97,110,103,108,101,4,2,108,114,18834,18840,101,102,116,59,1,8882,105,103,104,116,59,1,8883,121,59,1,1074,97,115,104,59,1,8866,4,3,101,108,114,18865,18884,18890,4,3,59,98,101,18873,18875,18880,1,8744,97,114,59,1,8891,113,59,1,8794,108,105,112,59,1,8942,4,2,98,116,18896,18901,97,114,59,1,124,59,1,124,114,59,3,55349,56627,116,114,105,59,1,8882,115,117,4,2,98,112,18923,18927,59,3,8834,8402,59,3,8835,8402,112,102,59,3,55349,56679,114,111,112,59,1,8733,116,114,105,59,1,8883,4,2,99,117,18955,18960,114,59,3,55349,56523,4,2,98,112,18966,18981,110,4,2,69,101,18973,18977,59,3,10955,65024,59,3,8842,65024,110,4,2,69,101,18988,18992,59,3,10956,65024,59,3,8843,65024,105,103,122,97,103,59,1,10650,4,7,99,101,102,111,112,114,115,19020,19026,19061,19066,19072,19075,19089,105,114,99,59,1,373,4,2,100,105,19032,19055,4,2,98,103,19038,19043,97,114,59,1,10847,101,4,2,59,113,19050,19052,1,8743,59,1,8793,101,114,112,59,1,8472,114,59,3,55349,56628,112,102,59,3,55349,56680,59,1,8472,4,2,59,101,19081,19083,1,8768,97,116,104,59,1,8768,99,114,59,3,55349,56524,4,14,99,100,102,104,105,108,109,110,111,114,115,117,118,119,19125,19146,19152,19157,19173,19176,19192,19197,19202,19236,19252,19269,19286,19291,4,3,97,105,117,19133,19137,19142,112,59,1,8898,114,99,59,1,9711,112,59,1,8899,116,114,105,59,1,9661,114,59,3,55349,56629,4,2,65,97,19163,19168,114,114,59,1,10234,114,114,59,1,10231,59,1,958,4,2,65,97,19182,19187,114,114,59,1,10232,114,114,59,1,10229,97,112,59,1,10236,105,115,59,1,8955,4,3,100,112,116,19210,19215,19230,111,116,59,1,10752,4,2,102,108,19221,19225,59,3,55349,56681,117,115,59,1,10753,105,109,101,59,1,10754,4,2,65,97,19242,19247,114,114,59,1,10233,114,114,59,1,10230,4,2,99,113,19258,19263,114,59,3,55349,56525,99,117,112,59,1,10758,4,2,112,116,19275,19281,108,117,115,59,1,10756,114,105,59,1,9651,101,101,59,1,8897,101,100,103,101,59,1,8896,4,8,97,99,101,102,105,111,115,117,19316,19335,19349,19357,19362,19367,19373,19379,99,4,2,117,121,19323,19332,116,101,5,253,1,59,19330,1,253,59,1,1103,4,2,105,121,19341,19346,114,99,59,1,375,59,1,1099,110,5,165,1,59,19355,1,165,114,59,3,55349,56630,99,121,59,1,1111,112,102,59,3,55349,56682,99,114,59,3,55349,56526,4,2,99,109,19385,19389,121,59,1,1102,108,5,255,1,59,19395,1,255,4,10,97,99,100,101,102,104,105,111,115,119,19419,19426,19441,19446,19462,19467,19472,19480,19486,19492,99,117,116,101,59,1,378,4,2,97,121,19432,19438,114,111,110,59,1,382,59,1,1079,111,116,59,1,380,4,2,101,116,19452,19458,116,114,102,59,1,8488,97,59,1,950,114,59,3,55349,56631,99,121,59,1,1078,103,114,97,114,114,59,1,8669,112,102,59,3,55349,56683,99,114,59,3,55349,56527,4,2,106,110,19498,19501,59,1,8205,106,59,1,8204]);
\ No newline at end of file
diff --git a/packages/parse5/lib/tokenizer/preprocessor.d.ts b/packages/parse5/lib/tokenizer/preprocessor.d.ts
new file mode 100644
index 0000000..e74a590
--- /dev/null
+++ b/packages/parse5/lib/tokenizer/preprocessor.d.ts
@@ -0,0 +1,37 @@
+import { ERR, type ParserError, type ParserErrorHandler } from '../common/error-codes.js';
+export declare class Preprocessor {
+ private handler;
+ html: string;
+ private pos;
+ private lastGapPos;
+ private gapStack;
+ private skipNextNewLine;
+ private lastChunkWritten;
+ endOfChunkHit: boolean;
+ bufferWaterline: number;
+ private isEol;
+ private lineStartPos;
+ droppedBufferSize: number;
+ line: number;
+ constructor(handler: {
+ onParseError?: ParserErrorHandler | null;
+ });
+ /** The column on the current line. If we just saw a gap (eg. a surrogate pair), return the index before. */
+ get col(): number;
+ get offset(): number;
+ getError(code: ERR): ParserError;
+ private lastErrOffset;
+ private _err;
+ private _addGap;
+ private _processSurrogate;
+ willDropParsedChunk(): boolean;
+ dropParsedChunk(): void;
+ write(chunk: string, isLastChunk: boolean): void;
+ insertHtmlAtCurrentPos(chunk: string): void;
+ startsWith(pattern: string, caseSensitive: boolean): boolean;
+ peek(offset: number): number;
+ advance(): number;
+ private _checkForProblematicCharacters;
+ retreat(count: number): void;
+}
+//# sourceMappingURL=preprocessor.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/tokenizer/preprocessor.d.ts.map b/packages/parse5/lib/tokenizer/preprocessor.d.ts.map
new file mode 100644
index 0000000..26ab21c
--- /dev/null
+++ b/packages/parse5/lib/tokenizer/preprocessor.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"preprocessor.d.ts","sourceRoot":"","sources":["../../../lib/tokenizer/preprocessor.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,GAAG,EAAE,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAQ1F,qBAAa,YAAY;IAgBT,OAAO,CAAC,OAAO;IAfpB,IAAI,SAAM;IACjB,OAAO,CAAC,GAAG,CAAM;IAEjB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,gBAAgB,CAAS;IAC1B,aAAa,UAAS;IACtB,eAAe,SAA4B;IAElD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAAK;IAClB,iBAAiB,SAAK;IACtB,IAAI,SAAK;gBAEI,OAAO,EAAE;QAAE,YAAY,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;KAAE;IAEzE,4GAA4G;IAC5G,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,IAAW,MAAM,IAAI,MAAM,CAE1B;IAEM,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,WAAW;IAevC,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,iBAAiB;IA4BlB,mBAAmB,IAAI,OAAO;IAI9B,eAAe,IAAI,IAAI;IAWvB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAWhD,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM3C,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,OAAO;IAsB5D,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAW5B,OAAO,IAAI,MAAM;IA6DxB,OAAO,CAAC,8BAA8B;IAQ/B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAUtC"}
\ No newline at end of file
diff --git a/packages/parse5/lib/tokenizer/preprocessor.js b/packages/parse5/lib/tokenizer/preprocessor.js
index 26fde48..9bc9681 100644
--- a/packages/parse5/lib/tokenizer/preprocessor.js
+++ b/packages/parse5/lib/tokenizer/preprocessor.js
@@ -1,159 +1,198 @@
-'use strict';
-
-const unicode = require('../common/unicode');
-const ERR = require('../common/error-codes');
-
-//Aliases
-const $ = unicode.CODE_POINTS;
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Preprocessor = void 0;
+const unicode_js_1 = require("../common/unicode.js");
+const error_codes_js_1 = require("../common/error-codes.js");
//Const
const DEFAULT_BUFFER_WATERLINE = 1 << 16;
-
//Preprocessor
//NOTE: HTML input preprocessing
//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#preprocessing-the-input-stream)
class Preprocessor {
- constructor() {
- this.html = null;
-
+ constructor(handler) {
+ this.handler = handler;
+ this.html = '';
this.pos = -1;
- this.lastGapPos = -1;
- this.lastCharPos = -1;
-
+ // NOTE: Initial `lastGapPos` is -2, to ensure `col` on initialisation is 0
+ this.lastGapPos = -2;
this.gapStack = [];
-
this.skipNextNewLine = false;
-
this.lastChunkWritten = false;
this.endOfChunkHit = false;
this.bufferWaterline = DEFAULT_BUFFER_WATERLINE;
+ this.isEol = false;
+ this.lineStartPos = 0;
+ this.droppedBufferSize = 0;
+ this.line = 1;
+ //NOTE: avoid reporting errors twice on advance/retreat
+ this.lastErrOffset = -1;
}
-
- _err() {
- // NOTE: err reporting is noop by default. Enabled by mixin.
+ /** The column on the current line. If we just saw a gap (eg. a surrogate pair), return the index before. */
+ get col() {
+ return this.pos - this.lineStartPos + Number(this.lastGapPos !== this.pos);
+ }
+ get offset() {
+ return this.droppedBufferSize + this.pos;
+ }
+ getError(code) {
+ const { line, col, offset } = this;
+ return {
+ code,
+ startLine: line,
+ endLine: line,
+ startCol: col,
+ endCol: col,
+ startOffset: offset,
+ endOffset: offset,
+ };
+ }
+ _err(code) {
+ if (this.handler.onParseError && this.lastErrOffset !== this.offset) {
+ this.lastErrOffset = this.offset;
+ this.handler.onParseError(this.getError(code));
+ }
}
-
_addGap() {
this.gapStack.push(this.lastGapPos);
this.lastGapPos = this.pos;
}
-
_processSurrogate(cp) {
//NOTE: try to peek a surrogate pair
- if (this.pos !== this.lastCharPos) {
+ if (this.pos !== this.html.length - 1) {
const nextCp = this.html.charCodeAt(this.pos + 1);
-
- if (unicode.isSurrogatePair(nextCp)) {
+ if ((0, unicode_js_1.isSurrogatePair)(nextCp)) {
//NOTE: we have a surrogate pair. Peek pair character and recalculate code point.
this.pos++;
-
- //NOTE: add gap that should be avoided during retreat
+ //NOTE: add a gap that should be avoided during retreat
this._addGap();
-
- return unicode.getSurrogatePairCodePoint(cp, nextCp);
+ return (0, unicode_js_1.getSurrogatePairCodePoint)(cp, nextCp);
}
}
-
- //NOTE: we are at the end of a chunk, therefore we can't infer surrogate pair yet.
+ //NOTE: we are at the end of a chunk, therefore we can't infer the surrogate pair yet.
else if (!this.lastChunkWritten) {
this.endOfChunkHit = true;
- return $.EOF;
+ return unicode_js_1.CODE_POINTS.EOF;
}
-
//NOTE: isolated surrogate
- this._err(ERR.surrogateInInputStream);
-
+ this._err(error_codes_js_1.ERR.surrogateInInputStream);
return cp;
}
-
+ willDropParsedChunk() {
+ return this.pos > this.bufferWaterline;
+ }
dropParsedChunk() {
- if (this.pos > this.bufferWaterline) {
- this.lastCharPos -= this.pos;
+ if (this.willDropParsedChunk()) {
this.html = this.html.substring(this.pos);
+ this.lineStartPos -= this.pos;
+ this.droppedBufferSize += this.pos;
this.pos = 0;
- this.lastGapPos = -1;
- this.gapStack = [];
+ this.lastGapPos = -2;
+ this.gapStack.length = 0;
}
}
-
write(chunk, isLastChunk) {
- if (this.html) {
+ if (this.html.length > 0) {
this.html += chunk;
- } else {
+ }
+ else {
this.html = chunk;
}
-
- this.lastCharPos = this.html.length - 1;
this.endOfChunkHit = false;
this.lastChunkWritten = isLastChunk;
}
-
insertHtmlAtCurrentPos(chunk) {
- this.html = this.html.substring(0, this.pos + 1) + chunk + this.html.substring(this.pos + 1, this.html.length);
-
- this.lastCharPos = this.html.length - 1;
+ this.html = this.html.substring(0, this.pos + 1) + chunk + this.html.substring(this.pos + 1);
this.endOfChunkHit = false;
}
-
+ startsWith(pattern, caseSensitive) {
+ // Check if our buffer has enough characters
+ if (this.pos + pattern.length > this.html.length) {
+ this.endOfChunkHit = !this.lastChunkWritten;
+ return false;
+ }
+ if (caseSensitive) {
+ return this.html.startsWith(pattern, this.pos);
+ }
+ for (let i = 0; i < pattern.length; i++) {
+ const cp = this.html.charCodeAt(this.pos + i) | 0x20;
+ if (cp !== pattern.charCodeAt(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ peek(offset) {
+ const pos = this.pos + offset;
+ if (pos >= this.html.length) {
+ this.endOfChunkHit = !this.lastChunkWritten;
+ return unicode_js_1.CODE_POINTS.EOF;
+ }
+ return this.html.charCodeAt(pos);
+ }
advance() {
this.pos++;
-
- if (this.pos > this.lastCharPos) {
+ //NOTE: LF should be in the last column of the line
+ if (this.isEol) {
+ this.isEol = false;
+ this.line++;
+ this.lineStartPos = this.pos;
+ }
+ if (this.pos >= this.html.length) {
this.endOfChunkHit = !this.lastChunkWritten;
- return $.EOF;
+ return unicode_js_1.CODE_POINTS.EOF;
}
-
let cp = this.html.charCodeAt(this.pos);
-
- //NOTE: any U+000A LINE FEED (LF) characters that immediately follow a U+000D CARRIAGE RETURN (CR) character
- //must be ignored.
- if (this.skipNextNewLine && cp === $.LINE_FEED) {
- this.skipNextNewLine = false;
- this._addGap();
- return this.advance();
- }
-
//NOTE: all U+000D CARRIAGE RETURN (CR) characters must be converted to U+000A LINE FEED (LF) characters
- if (cp === $.CARRIAGE_RETURN) {
+ if (cp === unicode_js_1.CODE_POINTS.CARRIAGE_RETURN) {
+ this.isEol = true;
this.skipNextNewLine = true;
- return $.LINE_FEED;
+ return unicode_js_1.CODE_POINTS.LINE_FEED;
+ }
+ //NOTE: any U+000A LINE FEED (LF) characters that immediately follow a U+000D CARRIAGE RETURN (CR) character
+ //must be ignored.
+ if (cp === unicode_js_1.CODE_POINTS.LINE_FEED) {
+ this.isEol = true;
+ if (this.skipNextNewLine) {
+ // `line` will be bumped again in the recursive call.
+ this.line--;
+ this.skipNextNewLine = false;
+ this._addGap();
+ return this.advance();
+ }
}
-
this.skipNextNewLine = false;
-
- if (unicode.isSurrogate(cp)) {
+ if ((0, unicode_js_1.isSurrogate)(cp)) {
cp = this._processSurrogate(cp);
}
-
//OPTIMIZATION: first check if code point is in the common allowed
//range (ASCII alphanumeric, whitespaces, big chunk of BMP)
//before going into detailed performance cost validation.
- const isCommonValidRange =
- (cp > 0x1f && cp < 0x7f) || cp === $.LINE_FEED || cp === $.CARRIAGE_RETURN || (cp > 0x9f && cp < 0xfdd0);
-
+ const isCommonValidRange = this.handler.onParseError === null ||
+ (cp > 0x1f && cp < 0x7f) ||
+ cp === unicode_js_1.CODE_POINTS.LINE_FEED ||
+ cp === unicode_js_1.CODE_POINTS.CARRIAGE_RETURN ||
+ (cp > 0x9f && cp < 64976);
if (!isCommonValidRange) {
this._checkForProblematicCharacters(cp);
}
-
return cp;
}
-
_checkForProblematicCharacters(cp) {
- if (unicode.isControlCodePoint(cp)) {
- this._err(ERR.controlCharacterInInputStream);
- } else if (unicode.isUndefinedCodePoint(cp)) {
- this._err(ERR.noncharacterInInputStream);
+ if ((0, unicode_js_1.isControlCodePoint)(cp)) {
+ this._err(error_codes_js_1.ERR.controlCharacterInInputStream);
+ }
+ else if ((0, unicode_js_1.isUndefinedCodePoint)(cp)) {
+ this._err(error_codes_js_1.ERR.noncharacterInInputStream);
}
}
-
- retreat() {
- if (this.pos === this.lastGapPos) {
+ retreat(count) {
+ this.pos -= count;
+ while (this.pos < this.lastGapPos) {
this.lastGapPos = this.gapStack.pop();
this.pos--;
}
-
- this.pos--;
+ this.isEol = false;
}
}
-
-module.exports = Preprocessor;
+exports.Preprocessor = Preprocessor;
+//# sourceMappingURL=preprocessor.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/tokenizer/preprocessor.js.map b/packages/parse5/lib/tokenizer/preprocessor.js.map
new file mode 100644
index 0000000..05c9e03
--- /dev/null
+++ b/packages/parse5/lib/tokenizer/preprocessor.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"preprocessor.js","sourceRoot":"","sources":["../../../lib/tokenizer/preprocessor.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/tree-adapters/default.d.ts b/packages/parse5/lib/tree-adapters/default.d.ts
new file mode 100644
index 0000000..cccdf8f
--- /dev/null
+++ b/packages/parse5/lib/tree-adapters/default.d.ts
@@ -0,0 +1,92 @@
+import { DOCUMENT_MODE, type NS } from '../common/html.js';
+import type { Attribute, Location, ElementLocation } from '../common/token.js';
+import type { TreeAdapter, TreeAdapterTypeMap } from './interface.js';
+export declare enum NodeType {
+ Document = "#document",
+ DocumentFragment = "#document-fragment",
+ Comment = "#comment",
+ Text = "#text",
+ DocumentType = "#documentType"
+}
+export interface Document {
+ /** The name of the node. */
+ nodeName: NodeType.Document;
+ /**
+ * Document mode.
+ *
+ * @see {@link DOCUMENT_MODE} */
+ mode: DOCUMENT_MODE;
+ /** The node's children. */
+ childNodes: ChildNode[];
+ /** Comment source code location info. Available if location info is enabled. */
+ sourceCodeLocation?: Location | null;
+}
+export interface DocumentFragment {
+ /** The name of the node. */
+ nodeName: NodeType.DocumentFragment;
+ /** The node's children. */
+ childNodes: ChildNode[];
+ /** Comment source code location info. Available if location info is enabled. */
+ sourceCodeLocation?: Location | null;
+}
+export interface Element {
+ /** Element tag name. Same as {@link tagName}. */
+ nodeName: string;
+ /** Element tag name. Same as {@link nodeName}. */
+ tagName: string;
+ /** List of element attributes. */
+ attrs: Attribute[];
+ /** Element namespace. */
+ namespaceURI: NS;
+ /** Element source code location info, with attributes. Available if location info is enabled. */
+ sourceCodeLocation?: ElementLocation | null;
+ /** Parent node. */
+ parentNode: ParentNode | null;
+ /** The node's children. */
+ childNodes: ChildNode[];
+}
+export interface CommentNode {
+ /** The name of the node. */
+ nodeName: NodeType.Comment;
+ /** Parent node. */
+ parentNode: ParentNode | null;
+ /** Comment text. */
+ data: string;
+ /** Comment source code location info. Available if location info is enabled. */
+ sourceCodeLocation?: Location | null;
+}
+export interface TextNode {
+ nodeName: NodeType.Text;
+ /** Parent node. */
+ parentNode: ParentNode | null;
+ /** Text content. */
+ value: string;
+ /** Comment source code location info. Available if location info is enabled. */
+ sourceCodeLocation?: Location | null;
+}
+export interface Template extends Element {
+ nodeName: 'template';
+ tagName: 'template';
+ /** The content of a `template` tag. */
+ content: DocumentFragment;
+}
+export interface DocumentType {
+ /** The name of the node. */
+ nodeName: NodeType.DocumentType;
+ /** Parent node. */
+ parentNode: ParentNode | null;
+ /** Document type name. */
+ name: string;
+ /** Document type public identifier. */
+ publicId: string;
+ /** Document type system identifier. */
+ systemId: string;
+ /** Comment source code location info. Available if location info is enabled. */
+ sourceCodeLocation?: Location | null;
+}
+export declare type ParentNode = Document | DocumentFragment | Element | Template;
+export declare type ChildNode = Element | Template | CommentNode | TextNode | DocumentType;
+export declare type Node = ParentNode | ChildNode;
+export declare type DefaultTreeAdapterMap = TreeAdapterTypeMap
;
+export declare const defaultTreeAdapter: TreeAdapter;
+//# sourceMappingURL=default.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/tree-adapters/default.d.ts.map b/packages/parse5/lib/tree-adapters/default.d.ts.map
new file mode 100644
index 0000000..6c04cab
--- /dev/null
+++ b/packages/parse5/lib/tree-adapters/default.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../lib/tree-adapters/default.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/tree-adapters/default.js b/packages/parse5/lib/tree-adapters/default.js
index 14d007a..c613067 100644
--- a/packages/parse5/lib/tree-adapters/default.js
+++ b/packages/parse5/lib/tree-adapters/default.js
@@ -1,221 +1,185 @@
-'use strict';
-
-const { DOCUMENT_MODE } = require('../common/html');
-
-//Node construction
-exports.createDocument = function() {
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.defaultTreeAdapter = exports.NodeType = void 0;
+const html_js_1 = require("../common/html.js");
+var NodeType;
+(function (NodeType) {
+ NodeType["Document"] = "#document";
+ NodeType["DocumentFragment"] = "#document-fragment";
+ NodeType["Comment"] = "#comment";
+ NodeType["Text"] = "#text";
+ NodeType["DocumentType"] = "#documentType";
+})(NodeType = exports.NodeType || (exports.NodeType = {}));
+function createTextNode(value) {
return {
- nodeName: '#document',
- mode: DOCUMENT_MODE.NO_QUIRKS,
- childNodes: []
+ nodeName: NodeType.Text,
+ value,
+ parentNode: null,
};
-};
-
-exports.createDocumentFragment = function() {
- return {
- nodeName: '#document-fragment',
- childNodes: []
- };
-};
-
-exports.createElement = function(tagName, namespaceURI, attrs) {
- return {
- nodeName: tagName,
- tagName: tagName,
- attrs: attrs,
- namespaceURI: namespaceURI,
- childNodes: [],
- parentNode: null
- };
-};
-
-exports.createCommentNode = function(data) {
- return {
- nodeName: '#comment',
- data: data,
- parentNode: null
- };
-};
-
-const createTextNode = function(value) {
- return {
- nodeName: '#text',
- value: value,
- parentNode: null
- };
-};
-
-//Tree mutation
-const appendChild = (exports.appendChild = function(parentNode, newNode) {
- parentNode.childNodes.push(newNode);
- newNode.parentNode = parentNode;
-});
-
-const insertBefore = (exports.insertBefore = function(parentNode, newNode, referenceNode) {
- const insertionIdx = parentNode.childNodes.indexOf(referenceNode);
-
- parentNode.childNodes.splice(insertionIdx, 0, newNode);
- newNode.parentNode = parentNode;
-});
-
-exports.setTemplateContent = function(templateElement, contentElement) {
- templateElement.content = contentElement;
-};
-
-exports.getTemplateContent = function(templateElement) {
- return templateElement.content;
-};
-
-exports.setDocumentType = function(document, name, publicId, systemId) {
- let doctypeNode = null;
-
- for (let i = 0; i < document.childNodes.length; i++) {
- if (document.childNodes[i].nodeName === '#documentType') {
- doctypeNode = document.childNodes[i];
- break;
+}
+exports.defaultTreeAdapter = {
+ //Node construction
+ createDocument() {
+ return {
+ nodeName: NodeType.Document,
+ mode: html_js_1.DOCUMENT_MODE.NO_QUIRKS,
+ childNodes: [],
+ };
+ },
+ createDocumentFragment() {
+ return {
+ nodeName: NodeType.DocumentFragment,
+ childNodes: [],
+ };
+ },
+ createElement(tagName, namespaceURI, attrs) {
+ return {
+ nodeName: tagName,
+ tagName,
+ attrs,
+ namespaceURI,
+ childNodes: [],
+ parentNode: null,
+ };
+ },
+ createCommentNode(data) {
+ return {
+ nodeName: NodeType.Comment,
+ data,
+ parentNode: null,
+ };
+ },
+ //Tree mutation
+ appendChild(parentNode, newNode) {
+ parentNode.childNodes.push(newNode);
+ newNode.parentNode = parentNode;
+ },
+ insertBefore(parentNode, newNode, referenceNode) {
+ const insertionIdx = parentNode.childNodes.indexOf(referenceNode);
+ parentNode.childNodes.splice(insertionIdx, 0, newNode);
+ newNode.parentNode = parentNode;
+ },
+ setTemplateContent(templateElement, contentElement) {
+ templateElement.content = contentElement;
+ },
+ getTemplateContent(templateElement) {
+ return templateElement.content;
+ },
+ setDocumentType(document, name, publicId, systemId) {
+ const doctypeNode = document.childNodes.find((node) => node.nodeName === NodeType.DocumentType);
+ if (doctypeNode) {
+ doctypeNode.name = name;
+ doctypeNode.publicId = publicId;
+ doctypeNode.systemId = systemId;
}
- }
-
- if (doctypeNode) {
- doctypeNode.name = name;
- doctypeNode.publicId = publicId;
- doctypeNode.systemId = systemId;
- } else {
- appendChild(document, {
- nodeName: '#documentType',
- name: name,
- publicId: publicId,
- systemId: systemId
- });
- }
-};
-
-exports.setDocumentMode = function(document, mode) {
- document.mode = mode;
-};
-
-exports.getDocumentMode = function(document) {
- return document.mode;
-};
-
-exports.detachNode = function(node) {
- if (node.parentNode) {
- const idx = node.parentNode.childNodes.indexOf(node);
-
- node.parentNode.childNodes.splice(idx, 1);
- node.parentNode = null;
- }
-};
-
-exports.insertText = function(parentNode, text) {
- if (parentNode.childNodes.length) {
- const prevNode = parentNode.childNodes[parentNode.childNodes.length - 1];
-
- if (prevNode.nodeName === '#text') {
+ else {
+ const node = {
+ nodeName: NodeType.DocumentType,
+ name,
+ publicId,
+ systemId,
+ parentNode: null,
+ };
+ exports.defaultTreeAdapter.appendChild(document, node);
+ }
+ },
+ setDocumentMode(document, mode) {
+ document.mode = mode;
+ },
+ getDocumentMode(document) {
+ return document.mode;
+ },
+ detachNode(node) {
+ if (node.parentNode) {
+ const idx = node.parentNode.childNodes.indexOf(node);
+ node.parentNode.childNodes.splice(idx, 1);
+ node.parentNode = null;
+ }
+ },
+ insertText(parentNode, text) {
+ if (parentNode.childNodes.length > 0) {
+ const prevNode = parentNode.childNodes[parentNode.childNodes.length - 1];
+ if (exports.defaultTreeAdapter.isTextNode(prevNode)) {
+ prevNode.value += text;
+ return;
+ }
+ }
+ exports.defaultTreeAdapter.appendChild(parentNode, createTextNode(text));
+ },
+ insertTextBefore(parentNode, text, referenceNode) {
+ const prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1];
+ if (prevNode && exports.defaultTreeAdapter.isTextNode(prevNode)) {
prevNode.value += text;
- return;
}
- }
-
- appendChild(parentNode, createTextNode(text));
-};
-
-exports.insertTextBefore = function(parentNode, text, referenceNode) {
- const prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1];
-
- if (prevNode && prevNode.nodeName === '#text') {
- prevNode.value += text;
- } else {
- insertBefore(parentNode, createTextNode(text), referenceNode);
- }
-};
-
-exports.adoptAttributes = function(recipient, attrs) {
- const recipientAttrsMap = [];
-
- for (let i = 0; i < recipient.attrs.length; i++) {
- recipientAttrsMap.push(recipient.attrs[i].name);
- }
-
- for (let j = 0; j < attrs.length; j++) {
- if (recipientAttrsMap.indexOf(attrs[j].name) === -1) {
- recipient.attrs.push(attrs[j]);
+ else {
+ exports.defaultTreeAdapter.insertBefore(parentNode, createTextNode(text), referenceNode);
}
- }
-};
-
-//Tree traversing
-exports.getFirstChild = function(node) {
- return node.childNodes[0];
-};
-
-exports.getChildNodes = function(node) {
- return node.childNodes;
-};
-
-exports.getParentNode = function(node) {
- return node.parentNode;
-};
-
-exports.getAttrList = function(element) {
- return element.attrs;
-};
-
-//Node data
-exports.getTagName = function(element) {
- return element.tagName;
-};
-
-exports.getNamespaceURI = function(element) {
- return element.namespaceURI;
-};
-
-exports.getTextNodeContent = function(textNode) {
- return textNode.value;
-};
-
-exports.getCommentNodeContent = function(commentNode) {
- return commentNode.data;
-};
-
-exports.getDocumentTypeNodeName = function(doctypeNode) {
- return doctypeNode.name;
-};
-
-exports.getDocumentTypeNodePublicId = function(doctypeNode) {
- return doctypeNode.publicId;
-};
-
-exports.getDocumentTypeNodeSystemId = function(doctypeNode) {
- return doctypeNode.systemId;
-};
-
-//Node types
-exports.isTextNode = function(node) {
- return node.nodeName === '#text';
-};
-
-exports.isCommentNode = function(node) {
- return node.nodeName === '#comment';
-};
-
-exports.isDocumentTypeNode = function(node) {
- return node.nodeName === '#documentType';
-};
-
-exports.isElementNode = function(node) {
- return !!node.tagName;
-};
-
-// Source code location
-exports.setNodeSourceCodeLocation = function(node, location) {
- node.sourceCodeLocation = location;
-};
-
-exports.getNodeSourceCodeLocation = function(node) {
- return node.sourceCodeLocation;
-};
-
-exports.updateNodeSourceCodeLocation = function(node, endLocation) {
- node.sourceCodeLocation = Object.assign(node.sourceCodeLocation, endLocation);
-};
+ },
+ adoptAttributes(recipient, attrs) {
+ const recipientAttrsMap = new Set(recipient.attrs.map((attr) => attr.name));
+ for (let j = 0; j < attrs.length; j++) {
+ if (!recipientAttrsMap.has(attrs[j].name)) {
+ recipient.attrs.push(attrs[j]);
+ }
+ }
+ },
+ //Tree traversing
+ getFirstChild(node) {
+ return node.childNodes[0];
+ },
+ getChildNodes(node) {
+ return node.childNodes;
+ },
+ getParentNode(node) {
+ return node.parentNode;
+ },
+ getAttrList(element) {
+ return element.attrs;
+ },
+ //Node data
+ getTagName(element) {
+ return element.tagName;
+ },
+ getNamespaceURI(element) {
+ return element.namespaceURI;
+ },
+ getTextNodeContent(textNode) {
+ return textNode.value;
+ },
+ getCommentNodeContent(commentNode) {
+ return commentNode.data;
+ },
+ getDocumentTypeNodeName(doctypeNode) {
+ return doctypeNode.name;
+ },
+ getDocumentTypeNodePublicId(doctypeNode) {
+ return doctypeNode.publicId;
+ },
+ getDocumentTypeNodeSystemId(doctypeNode) {
+ return doctypeNode.systemId;
+ },
+ //Node types
+ isTextNode(node) {
+ return node.nodeName === '#text';
+ },
+ isCommentNode(node) {
+ return node.nodeName === '#comment';
+ },
+ isDocumentTypeNode(node) {
+ return node.nodeName === NodeType.DocumentType;
+ },
+ isElementNode(node) {
+ return Object.prototype.hasOwnProperty.call(node, 'tagName');
+ },
+ // Source code location
+ setNodeSourceCodeLocation(node, location) {
+ node.sourceCodeLocation = location;
+ },
+ getNodeSourceCodeLocation(node) {
+ return node.sourceCodeLocation;
+ },
+ updateNodeSourceCodeLocation(node, endLocation) {
+ node.sourceCodeLocation = Object.assign(Object.assign({}, node.sourceCodeLocation), endLocation);
+ },
+};
+//# sourceMappingURL=default.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/tree-adapters/default.js.map b/packages/parse5/lib/tree-adapters/default.js.map
new file mode 100644
index 0000000..12effe1
--- /dev/null
+++ b/packages/parse5/lib/tree-adapters/default.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"default.js","sourceRoot":"","sources":["../../../lib/tree-adapters/default.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/tree-adapters/interface.d.ts b/packages/parse5/lib/tree-adapters/interface.d.ts
new file mode 100644
index 0000000..8de74ee
--- /dev/null
+++ b/packages/parse5/lib/tree-adapters/interface.d.ts
@@ -0,0 +1,250 @@
+import type { DOCUMENT_MODE, NS } from '../common/html.js';
+import type { Attribute, ElementLocation } from '../common/token.js';
+export interface TreeAdapterTypeMap {
+ node: Node;
+ parentNode: ParentNode;
+ childNode: ChildNode;
+ document: Document;
+ documentFragment: DocumentFragment;
+ element: Element;
+ commentNode: CommentNode;
+ textNode: TextNode;
+ template: Template;
+ documentType: DocumentType;
+}
+/**
+ * Tree adapter is a set of utility functions that provides minimal required abstraction layer beetween parser and a specific AST format.
+ * Note that `TreeAdapter` is not designed to be a general purpose AST manipulation library. You can build such library
+ * on top of existing `TreeAdapter` or use one of the existing libraries from npm.
+ *
+ * @see The default implementation {@link parse5.treeAdapters.default}
+ */
+export interface TreeAdapter {
+ /**
+ * Copies attributes to the given element. Only attributes that are not yet present in the element are copied.
+ *
+ * @param recipient - Element to copy attributes into.
+ * @param attrs - Attributes to copy.
+ */
+ adoptAttributes(recipient: T['element'], attrs: Attribute[]): void;
+ /**
+ * Appends a child node to the given parent node.
+ *
+ * @param parentNode - Parent node.
+ * @param newNode - Child node.
+ */
+ appendChild(parentNode: T['parentNode'], newNode: T['childNode']): void;
+ /**
+ * Creates a comment node.
+ *
+ * @param data - Comment text.
+ */
+ createCommentNode(data: string): T['commentNode'];
+ /**
+ * Creates a document node.
+ */
+ createDocument(): T['document'];
+ /**
+ * Creates a document fragment node.
+ */
+ createDocumentFragment(): T['documentFragment'];
+ /**
+ * Creates an element node.
+ *
+ * @param tagName - Tag name of the element.
+ * @param namespaceURI - Namespace of the element.
+ * @param attrs - Attribute name-value pair array. Foreign attributes may contain `namespace` and `prefix` fields as well.
+ */
+ createElement(tagName: string, namespaceURI: NS, attrs: Attribute[]): T['element'];
+ /**
+ * Removes a node from its parent.
+ *
+ * @param node - Node to remove.
+ */
+ detachNode(node: T['childNode']): void;
+ /**
+ * Returns the given element's attributes in an array, in the form of name-value pairs.
+ * Foreign attributes may contain `namespace` and `prefix` fields as well.
+ *
+ * @param element - Element.
+ */
+ getAttrList(element: T['element']): Attribute[];
+ /**
+ * Returns the given node's children in an array.
+ *
+ * @param node - Node.
+ */
+ getChildNodes(node: T['parentNode']): T['childNode'][];
+ /**
+ * Returns the given comment node's content.
+ *
+ * @param commentNode - Comment node.
+ */
+ getCommentNodeContent(commentNode: T['commentNode']): string;
+ /**
+ * Returns [document mode](https://dom.spec.whatwg.org/#concept-document-limited-quirks).
+ *
+ * @param document - Document node.
+ */
+ getDocumentMode(document: T['document']): DOCUMENT_MODE;
+ /**
+ * Returns the given document type node's name.
+ *
+ * @param doctypeNode - Document type node.
+ */
+ getDocumentTypeNodeName(doctypeNode: T['documentType']): string;
+ /**
+ * Returns the given document type node's public identifier.
+ *
+ * @param doctypeNode - Document type node.
+ */
+ getDocumentTypeNodePublicId(doctypeNode: T['documentType']): string;
+ /**
+ * Returns the given document type node's system identifier.
+ *
+ * @param doctypeNode - Document type node.
+ */
+ getDocumentTypeNodeSystemId(doctypeNode: T['documentType']): string;
+ /**
+ * Returns the first child of the given node.
+ *
+ * @param node - Node.
+ */
+ getFirstChild(node: T['parentNode']): T['childNode'] | null;
+ /**
+ * Returns the given element's namespace.
+ *
+ * @param element - Element.
+ */
+ getNamespaceURI(element: T['element']): NS;
+ /**
+ * Returns the given node's source code location information.
+ *
+ * @param node - Node.
+ */
+ getNodeSourceCodeLocation(node: T['node']): ElementLocation | undefined | null;
+ /**
+ * Returns the given node's parent.
+ *
+ * @param node - Node.
+ */
+ getParentNode(node: T['node']): T['parentNode'] | null;
+ /**
+ * Returns the given element's tag name.
+ *
+ * @param element - Element.
+ */
+ getTagName(element: T['element']): string;
+ /**
+ * Returns the given text node's content.
+ *
+ * @param textNode - Text node.
+ */
+ getTextNodeContent(textNode: T['textNode']): string;
+ /**
+ * Returns the `` element content element.
+ *
+ * @param templateElement - `` element.
+ */
+ getTemplateContent(templateElement: T['template']): T['documentFragment'];
+ /**
+ * Inserts a child node to the given parent node before the given reference node.
+ *
+ * @param parentNode - Parent node.
+ * @param newNode - Child node.
+ * @param referenceNode - Reference node.
+ */
+ insertBefore(parentNode: T['parentNode'], newNode: T['childNode'], referenceNode: T['childNode']): void;
+ /**
+ * Inserts text into a node. If the last child of the node is a text node, the provided text will be appended to the
+ * text node content. Otherwise, inserts a new text node with the given text.
+ *
+ * @param parentNode - Node to insert text into.
+ * @param text - Text to insert.
+ */
+ insertText(parentNode: T['parentNode'], text: string): void;
+ /**
+ * Inserts text into a sibling node that goes before the reference node. If this sibling node is the text node,
+ * the provided text will be appended to the text node content. Otherwise, inserts a new sibling text node with
+ * the given text before the reference node.
+ *
+ * @param parentNode - Node to insert text into.
+ * @param text - Text to insert.
+ * @param referenceNode - Node to insert text before.
+ */
+ insertTextBefore(parentNode: T['parentNode'], text: string, referenceNode: T['childNode']): void;
+ /**
+ * Determines if the given node is a comment node.
+ *
+ * @param node - Node.
+ */
+ isCommentNode(node: T['node']): node is T['commentNode'];
+ /**
+ * Determines if the given node is a document type node.
+ *
+ * @param node - Node.
+ */
+ isDocumentTypeNode(node: T['node']): node is T['documentType'];
+ /**
+ * Determines if the given node is an element.
+ *
+ * @param node - Node.
+ */
+ isElementNode(node: T['node']): node is T['element'];
+ /**
+ * Determines if the given node is a text node.
+ *
+ * @param node - Node.
+ */
+ isTextNode(node: T['node']): node is T['textNode'];
+ /**
+ * Sets the [document mode](https://dom.spec.whatwg.org/#concept-document-limited-quirks).
+ *
+ * @param document - Document node.
+ * @param mode - Document mode.
+ */
+ setDocumentMode(document: T['document'], mode: DOCUMENT_MODE): void;
+ /**
+ * Sets the document type. If the `document` already contains a document type node, the `name`, `publicId` and `systemId`
+ * properties of this node will be updated with the provided values. Otherwise, creates a new document type node
+ * with the given properties and inserts it into the `document`.
+ *
+ * @param document - Document node.
+ * @param name - Document type name.
+ * @param publicId - Document type public identifier.
+ * @param systemId - Document type system identifier.
+ */
+ setDocumentType(document: T['document'], name: string, publicId: string, systemId: string): void;
+ /**
+ * Attaches source code location information to the node.
+ *
+ * @param node - Node.
+ */
+ setNodeSourceCodeLocation(node: T['node'], location: ElementLocation | null): void;
+ /**
+ * Updates the source code location information of the node.
+ *
+ * @param node - Node.
+ */
+ updateNodeSourceCodeLocation(node: T['node'], location: Partial): void;
+ /**
+ * Sets the `` element content element.
+ *
+ * @param templateElement - `` element.
+ * @param contentElement - Content element.
+ */
+ setTemplateContent(templateElement: T['template'], contentElement: T['documentFragment']): void;
+ /**
+ * Optional callback for elements being pushed to the stack of open elements.
+ *
+ * @param element The element being pushed to the stack of open elements.
+ */
+ onItemPush?: (item: T['element']) => void;
+ /**
+ * Optional callback for elements being popped from the stack of open elements.
+ *
+ * @param item The element being popped.
+ */
+ onItemPop?: (item: T['element'], newTop: T['parentNode']) => void;
+}
+//# sourceMappingURL=interface.d.ts.map
\ No newline at end of file
diff --git a/packages/parse5/lib/tree-adapters/interface.d.ts.map b/packages/parse5/lib/tree-adapters/interface.d.ts.map
new file mode 100644
index 0000000..ad047c7
--- /dev/null
+++ b/packages/parse5/lib/tree-adapters/interface.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../lib/tree-adapters/interface.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/parse5/lib/tree-adapters/interface.js b/packages/parse5/lib/tree-adapters/interface.js
new file mode 100644
index 0000000..d549d1f
--- /dev/null
+++ b/packages/parse5/lib/tree-adapters/interface.js
@@ -0,0 +1,3 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+//# sourceMappingURL=interface.js.map
\ No newline at end of file
diff --git a/packages/parse5/lib/tree-adapters/interface.js.map b/packages/parse5/lib/tree-adapters/interface.js.map
new file mode 100644
index 0000000..47742be
--- /dev/null
+++ b/packages/parse5/lib/tree-adapters/interface.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../lib/tree-adapters/interface.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/packages/parse5/lib/utils/merge-options.js b/packages/parse5/lib/utils/merge-options.js
deleted file mode 100644
index 0bbe893..0000000
--- a/packages/parse5/lib/utils/merge-options.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-
-module.exports = function mergeOptions(defaults, options) {
- options = options || Object.create(null);
-
- return [defaults, options].reduce((merged, optObj) => {
- Object.keys(optObj).forEach(key => {
- merged[key] = optObj[key];
- });
-
- return merged;
- }, Object.create(null));
-};
diff --git a/packages/parse5/lib/utils/mixin.js b/packages/parse5/lib/utils/mixin.js
deleted file mode 100644
index 26465c4..0000000
--- a/packages/parse5/lib/utils/mixin.js
+++ /dev/null
@@ -1,39 +0,0 @@
-'use strict';
-
-class Mixin {
- constructor(host) {
- const originalMethods = {};
- const overriddenMethods = this._getOverriddenMethods(this, originalMethods);
-
- for (const key of Object.keys(overriddenMethods)) {
- if (typeof overriddenMethods[key] === 'function') {
- originalMethods[key] = host[key];
- host[key] = overriddenMethods[key];
- }
- }
- }
-
- _getOverriddenMethods() {
- throw new Error('Not implemented');
- }
-}
-
-Mixin.install = function(host, Ctor, opts) {
- if (!host.__mixins) {
- host.__mixins = [];
- }
-
- for (let i = 0; i < host.__mixins.length; i++) {
- if (host.__mixins[i].constructor === Ctor) {
- return host.__mixins[i];
- }
- }
-
- const mixin = new Ctor(host, opts);
-
- host.__mixins.push(mixin);
-
- return mixin;
-};
-
-module.exports = Mixin;
diff --git a/packages/parse5/package.json b/packages/parse5/package.json
index 13a12df..72f5abe 100644
--- a/packages/parse5/package.json
+++ b/packages/parse5/package.json
@@ -1,10 +1,15 @@
{
"name": "parse5",
+ "type": "module",
"description": "HTML parser and serializer.",
- "version": "6.0.1",
+ "version": "7.0.0",
"author": "Ivan Nikulin (https://github.com/inikulin)",
"contributors": "https://github.com/inikulin/parse5/graphs/contributors",
"homepage": "https://github.com/inikulin/parse5",
+ "funding": "https://github.com/inikulin/parse5?sponsor=1",
+ "dependencies": {
+ "entities": "^4.3.0"
+ },
"keywords": [
"html",
"parser",
@@ -23,12 +28,22 @@
"serialize"
],
"license": "MIT",
- "main": "./lib/index.js",
+ "main": "dist/cjs/index.js",
+ "module": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "exports": {
+ "import": "./dist/index.js",
+ "require": "./dist/cjs/index.js"
+ },
+ "scripts": {
+ "build:cjs": "tsc --module CommonJS --target ES6 --outDir dist/cjs && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json"
+ },
"repository": {
"type": "git",
"url": "git://github.com/inikulin/parse5.git"
},
"files": [
- "lib"
+ "dist",
+ "!*.map"
]
}
diff --git a/packages/parse5/test/formatting-element-list.test.js b/packages/parse5/test/formatting-element-list.test.js
deleted file mode 100644
index 6a3e683..0000000
--- a/packages/parse5/test/formatting-element-list.test.js
+++ /dev/null
@@ -1,203 +0,0 @@
-'use strict';
-
-const assert = require('assert');
-const HTML = require('../lib/common/html');
-const FormattingElementList = require('../lib/parser/formatting-element-list');
-const { generateTestsForEachTreeAdapter } = require('../../../test/utils/common');
-
-//Aliases
-const $ = HTML.TAG_NAMES;
-const NS = HTML.NAMESPACES;
-
-generateTestsForEachTreeAdapter(module.exports, (_test, treeAdapter) => {
- _test['Insert marker'] = function() {
- const list = new FormattingElementList(treeAdapter);
-
- list.insertMarker();
- assert.strictEqual(list.length, 1);
- assert.strictEqual(list.entries[0].type, FormattingElementList.MARKER_ENTRY);
-
- list.insertMarker();
- assert.strictEqual(list.length, 2);
- assert.strictEqual(list.entries[1].type, FormattingElementList.MARKER_ENTRY);
- };
-
- _test['Push element'] = function() {
- const list = new FormattingElementList(treeAdapter);
- const element1Token = 'token1';
- const element2Token = 'token2';
- const element1 = treeAdapter.createElement($.DIV, NS.HTML, []);
- const element2 = treeAdapter.createElement($.P, NS.HTML, []);
-
- list.pushElement(element1, element1Token);
- assert.strictEqual(list.length, 1);
- assert.strictEqual(list.entries[0].type, FormattingElementList.ELEMENT_ENTRY);
- assert.strictEqual(list.entries[0].element, element1);
- assert.strictEqual(list.entries[0].token, element1Token);
-
- list.pushElement(element2, element2Token);
- assert.strictEqual(list.length, 2);
- assert.strictEqual(list.entries[1].type, FormattingElementList.ELEMENT_ENTRY);
- assert.strictEqual(list.entries[1].element, element2);
- assert.strictEqual(list.entries[1].token, element2Token);
- };
-
- _test['Insert element after bookmark'] = function() {
- const list = new FormattingElementList(treeAdapter);
- const token = 'token1';
- const element1 = treeAdapter.createElement($.DIV, NS.HTML, []);
- const element2 = treeAdapter.createElement($.P, NS.HTML, []);
- const element3 = treeAdapter.createElement($.SPAN, NS.HTML, []);
- const element4 = treeAdapter.createElement($.TITLE, NS.HTML, []);
-
- list.pushElement(element1, token);
- list.bookmark = list.entries[0];
-
- list.pushElement(element2, token);
- list.pushElement(element3, token);
-
- list.insertElementAfterBookmark(element4, token);
-
- assert.strictEqual(list.length, 4);
- assert.strictEqual(list.entries[1].element, element4);
- };
-
- _test['Push element - Noah Ark condition'] = function() {
- const list = new FormattingElementList(treeAdapter);
- const token1 = 'token1';
- const token2 = 'token2';
- const token3 = 'token3';
- const token4 = 'token4';
- const token5 = 'token5';
- const token6 = 'token6';
-
- const element1 = treeAdapter.createElement($.DIV, NS.HTML, [
- { name: 'attr1', value: 'val1' },
- { name: 'attr2', value: 'val2' }
- ]);
-
- const element2 = treeAdapter.createElement($.DIV, NS.HTML, [
- { name: 'attr1', value: 'val1' },
- { name: 'attr2', value: 'someOtherValue' }
- ]);
-
- list.pushElement(element1, token1);
- list.pushElement(element1, token2);
- list.pushElement(element2, token3);
- list.pushElement(element1, token4);
-
- assert.strictEqual(list.length, 4);
- assert.strictEqual(list.entries[0].token, token1);
- assert.strictEqual(list.entries[1].token, token2);
- assert.strictEqual(list.entries[2].token, token3);
- assert.strictEqual(list.entries[3].token, token4);
-
- list.pushElement(element1, token5);
-
- assert.strictEqual(list.length, 4);
- assert.strictEqual(list.entries[0].token, token2);
- assert.strictEqual(list.entries[1].token, token3);
- assert.strictEqual(list.entries[2].token, token4);
- assert.strictEqual(list.entries[3].token, token5);
-
- list.insertMarker();
- list.pushElement(element1, token6);
-
- assert.strictEqual(list.length, 6);
- assert.strictEqual(list.entries[0].token, token2);
- assert.strictEqual(list.entries[1].token, token3);
- assert.strictEqual(list.entries[2].token, token4);
- assert.strictEqual(list.entries[3].token, token5);
- assert.strictEqual(list.entries[4].type, FormattingElementList.MARKER_ENTRY);
- assert.strictEqual(list.entries[5].token, token6);
- };
-
- _test['Clear to the last marker'] = function() {
- const list = new FormattingElementList(treeAdapter);
- const token = 'token';
-
- const element1 = treeAdapter.createElement($.DIV, NS.HTML, [
- { name: 'attr1', value: 'val1' },
- { name: 'attr2', value: 'val2' }
- ]);
-
- const element2 = treeAdapter.createElement($.DIV, NS.HTML, [
- { name: 'attr1', value: 'val1' },
- { name: 'attr2', value: 'someOtherValue' }
- ]);
-
- list.pushElement(element1, token);
- list.pushElement(element2, token);
- list.insertMarker();
- list.pushElement(element1, token);
- list.pushElement(element1, token);
- list.pushElement(element2, token);
-
- list.clearToLastMarker();
-
- assert.strictEqual(list.length, 2);
- };
-
- _test['Remove entry'] = function() {
- const list = new FormattingElementList(treeAdapter);
- const token = 'token';
-
- const element1 = treeAdapter.createElement($.DIV, NS.HTML, [
- { name: 'attr1', value: 'val1' },
- { name: 'attr2', value: 'val2' }
- ]);
-
- const element2 = treeAdapter.createElement($.DIV, NS.HTML, [
- { name: 'attr1', value: 'val1' },
- { name: 'attr2', value: 'someOtherValue' }
- ]);
-
- list.pushElement(element1, token);
- list.pushElement(element2, token);
- list.pushElement(element2, token);
-
- list.removeEntry(list.entries[0]);
-
- assert.strictEqual(list.length, 2);
-
- for (let i = list.length - 1; i >= 0; i--) {
- assert.notStrictEqual(list.entries[i].element, element1);
- }
- };
-
- _test['Get entry in scope with given tag name'] = function() {
- const list = new FormattingElementList(treeAdapter);
- const token = 'token';
- const element = treeAdapter.createElement($.DIV, NS.HTML, []);
-
- assert.ok(!list.getElementEntryInScopeWithTagName($.DIV));
-
- list.pushElement(element, token);
- list.pushElement(element, token);
- assert.strictEqual(list.getElementEntryInScopeWithTagName($.DIV), list.entries[1]);
-
- list.insertMarker();
- assert.ok(!list.getElementEntryInScopeWithTagName($.DIV));
-
- list.pushElement(element, token);
- assert.strictEqual(list.getElementEntryInScopeWithTagName($.DIV), list.entries[3]);
- };
-
- _test['Get element entry'] = function() {
- const list = new FormattingElementList(treeAdapter);
- const token = 'token';
- const element1 = treeAdapter.createElement($.DIV, NS.HTML, []);
- const element2 = treeAdapter.createElement($.A, NS.HTML, []);
-
- list.pushElement(element2, token);
- list.pushElement(element1, token);
- list.pushElement(element2, token);
- list.insertMarker();
-
- const entry = list.getElementEntry(element1);
-
- assert.strictEqual(entry.type, FormattingElementList.ELEMENT_ENTRY);
- assert.strictEqual(entry.token, token);
- assert.strictEqual(entry.element, element1);
- };
-});
diff --git a/packages/parse5/test/location-info-parser.test.js b/packages/parse5/test/location-info-parser.test.js
deleted file mode 100644
index 4d4ce68..0000000
--- a/packages/parse5/test/location-info-parser.test.js
+++ /dev/null
@@ -1,182 +0,0 @@
-'use strict';
-
-const assert = require('assert');
-const parse5 = require('../lib');
-const generateLocationInfoParserTests = require('../../../test/utils/generate-location-info-parser-tests');
-const {
- assertStartTagLocation,
- assertNodeLocation
-} = require('../../../test/utils/generate-location-info-parser-tests');
-const { generateTestsForEachTreeAdapter, treeAdapters } = require('../../../test/utils/common');
-
-generateLocationInfoParserTests(module.exports, 'Parser', (input, opts) => ({
- node: parse5.parse(input, opts)
-}));
-
-generateTestsForEachTreeAdapter(module.exports, (_test, treeAdapter) => {
- _test['Regression - Incorrect LocationInfo.endOffset for implicitly closed element (GH-109)'] = function() {
- const html = '
1
3';
-
- const opts = {
- treeAdapter: treeAdapter,
- sourceCodeLocationInfo: true
- };
-
- const fragment = parse5.parseFragment(html, opts);
- const firstP = treeAdapter.getChildNodes(fragment)[0];
- const firstPLocation = treeAdapter.getNodeSourceCodeLocation(firstP);
-
- assert.strictEqual(html.substring(firstPLocation.startOffset, firstPLocation.endOffset), '
1');
- };
-
- _test['Regression - Incorrect LocationInfo.endOffset for element with closing tag (GH-159)'] = function() {
- const html = '12';
-
- const opts = {
- treeAdapter: treeAdapter,
- sourceCodeLocationInfo: true
- };
-
- const fragment = parse5.parseFragment(html, opts);
- const firstChild = treeAdapter.getChildNodes(fragment)[0];
- const location = treeAdapter.getNodeSourceCodeLocation(firstChild);
-
- assert.strictEqual(html.substring(location.startOffset, location.endOffset), '1');
- };
-
- _test['Regression - Location info not exposed with parseFragment (GH-82)'] = function() {
- const html = '
foo';
-
- const opts = {
- treeAdapter: treeAdapter,
- sourceCodeLocationInfo: true
- };
-
- const fragment = parse5.parseFragment(html, opts);
- const firstChild = treeAdapter.getChildNodes(fragment)[0];
-
- assert.ok(treeAdapter.getNodeSourceCodeLocation(firstChild));
- };
-
- _test['Regression - location info mixin error when parsing elements (GH-90)'] = function() {
- const html = 'hello';
-
- const opts = {
- treeAdapter: treeAdapter,
- sourceCodeLocationInfo: true
- };
-
- assert.doesNotThrow(() => {
- parse5.parseFragment(html, opts);
- });
- };
-
- _test['Regression - location info not attached for empty attributes (GH-96)'] = function() {
- const html = '';
-
- const opts = {
- treeAdapter: treeAdapter,
- sourceCodeLocationInfo: true
- };
-
- const fragment = parse5.parseFragment(html, opts);
- const firstChild = treeAdapter.getChildNodes(fragment)[0];
-
- assert.ok(treeAdapter.getNodeSourceCodeLocation(firstChild).attrs['test-attr']);
- };
-
- _test['Regression - location line incorrect when a character is unconsumed (GH-151)'] = function() {
- const html = [
- '',
- ''
- ].join('\n');
-
- const opts = {
- treeAdapter: treeAdapter,
- sourceCodeLocationInfo: true
- };
-
- const document = parse5.parse(html, opts);
- const htmlEl = treeAdapter.getChildNodes(document)[0];
- const bodyEl = treeAdapter.getChildNodes(htmlEl)[1];
- const scriptEl = treeAdapter.getChildNodes(bodyEl)[0];
- const scriptLocation = treeAdapter.getNodeSourceCodeLocation(scriptEl);
-
- assert.strictEqual(treeAdapter.getTagName(scriptEl), 'script');
- assert.equal(scriptLocation.endTag.startLine, 4);
- };
-
- _test['Regression - location.startTag should be available if end tag is missing (GH-181)'] = function() {
- const html = 'test';
-
- const opts = {
- treeAdapter: treeAdapter,
- sourceCodeLocationInfo: true
- };
-
- const fragment = parse5.parseFragment(html, opts);
- const p = treeAdapter.getChildNodes(fragment)[0];
- const location = treeAdapter.getNodeSourceCodeLocation(p);
-
- assertNodeLocation(location, html, html, [html]);
- assertStartTagLocation(location, html, html, [html]);
-
- assert.ok(!location.endTag);
- };
-});
-
-exports['Updating node source code location (GH-314)'] = function() {
- const sourceCodeLocationSetter = {
- setNodeSourceCodeLocation(node, location) {
- if (location === null) {
- node.sourceCodeLocation = null;
- } else {
- node.sourceCodeLocation = {
- start: {
- line: location.startLine,
- column: location.startCol,
- offset: location.startOffset
- },
- end: {
- line: location.endLine,
- column: location.endCol,
- offset: location.endOffset
- }
- };
- }
- },
- updateNodeSourceCodeLocation(node, endLocation) {
- node.sourceCodeLocation = {
- start: node.sourceCodeLocation.start,
- end: {
- line: endLocation.endLine,
- column: endLocation.endCol,
- offset: endLocation.endOffset
- }
- };
- }
- };
- const adapter = Object.assign(treeAdapters.default, sourceCodeLocationSetter);
- const document = parse5.parse('
Testing location', { adapter, sourceCodeLocationInfo: true });
- const [doctype, html] = document.childNodes;
- const [head, body] = html.childNodes;
- const [text] = body.childNodes;
-
- assert.deepEqual(doctype.sourceCodeLocation, {
- start: { line: 1, column: 1, offset: 0 },
- end: { line: 1, column: 11, offset: 10 }
- });
- assert.strictEqual(html.sourceCodeLocation, null);
- assert.strictEqual(head.sourceCodeLocation, null);
- assert.deepEqual(body.sourceCodeLocation, {
- start: { line: 1, column: 11, offset: 10 },
- end: { line: 1, column: 40, offset: 39 }
- });
- assert.deepEqual(text.sourceCodeLocation, {
- start: { line: 1, column: 17, offset: 16 },
- end: { line: 1, column: 33, offset: 32 }
- });
-};
diff --git a/packages/parse5/test/location-info-tokenizer.test.js b/packages/parse5/test/location-info-tokenizer.test.js
deleted file mode 100644
index decbbc2..0000000
--- a/packages/parse5/test/location-info-tokenizer.test.js
+++ /dev/null
@@ -1,123 +0,0 @@
-'use strict';
-
-const assert = require('assert');
-const Tokenizer = require('../lib/tokenizer');
-const LocationInfoTokenizerMixin = require('../lib/extensions/location-info/tokenizer-mixin');
-const Mixin = require('../lib/utils/mixin');
-const { getSubstringByLineCol, normalizeNewLine } = require('../../../test/utils/common');
-
-exports['Location info (Tokenizer)'] = function() {
- const testCases = [
- {
- initialMode: Tokenizer.MODE.DATA,
- lastStartTagName: '',
- htmlChunks: [
- '\r\n',
- '',
- '\n',
- '',
- '\n',
- '',
- '\n ',
- '',
- '',
- ' ',
- 'node.js',
- '\u0000',
- '',
- '\n',
- '',
- '\n',
- '',
- '\n',
- '',
- '\n ',
- '
',
- '\n ',
- 'Node.js',
- ' ',
- 'is',
- ' ',
- 'a',
- '\n ',
- 'platform',
- ' ',
- 'built',
- ' ',
- 'on',
- '\n ',
- '',
- '\n ',
- "Chrome's",
- ' ',
- 'JavaScript',
- ' ',
- 'runtime',
- '\n ',
- '',
- '\n',
- '
',
- ''
- ]
- },
- {
- initialMode: Tokenizer.MODE.RCDATA,
- lastStartTagName: 'title',
- htmlChunks: ['