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 2db2bde1c9e370662a2afe04ba4852f3434f060b..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..158e946d8f256d94efc5466bebb4d2138cfd3aab
--- /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 e4bf660d8ac3855841105174c4716ca73bf2c429..4f0997bbabafc64740dd7e0c6c08815c8f26427f 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 2bd2745ed80a0ea09d77b7d56885864f024118d5..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..5c7892a613ee9d91b0ef4f428212428a1646299d
--- /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 0000000000000000000000000000000000000000..35ad9571934e63f9aa195b77011285367c9f9860
--- /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 8b61e658c78aebde5bd9c04956b78b4387e41706..a2d272f9b3a73fc3458fe3fd6ba5a2d9082ceef2 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 4fb2db554c294ab820e70337313ca0b6e0e569ea..0000000000000000000000000000000000000000
--- 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 9ba7f78ca02ae5f3678d8ffb05d795b0c28a545f..0000000000000000000000000000000000000000
--- 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 57e4da4cb16ae9e354cb6c1da13c46ac65929735..0000000000000000000000000000000000000000
--- 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 7f2859181be440f83b707940fd3b3a5c1b9e62ae..0000000000000000000000000000000000000000
--- 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 96e48c7b723706faaa884d9096466ac1573cc24e..0000000000000000000000000000000000000000
--- 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 38cdda431b4a212066102079b388b553ebedf4d2..0000000000000000000000000000000000000000
--- 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 8a9bd00e124911da94d3cf1bfd10ff91383b0a3d..0000000000000000000000000000000000000000
--- 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 58464d78a41e54377eb0c6edd2510e373942a49e..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..4a56897a750ea2d8cc09d4d15c7cca4ecf05c2c7
--- /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 cb8d818a261d1c745f11788e77e809c37671008f..6c2bd8eef7247702372cca5f87ff3ee3717c570c 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 0000000000000000000000000000000000000000..89bf41d30a95aa279838c846e84a49035b087d33
--- /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 f65d4b25ffb39c9700249ea6d754ab72ea0f07a9..cf24e2167c995d24529612732d0928c37ddde641 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 55bd2174979bf9780d3af99da94faefc7b590f47..0000000000000000000000000000000000000000
--- 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 e91a58a20b3c17e15796d919ac04f375368ddfde..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..699005ee48ad02eda7973cd4b8cdd7a432c60123
--- /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 068e07566b83baa4be08069082498770820902d8..48fa6e429f75b849165bc55639a8be98bc1e2c0a 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 4e86ea4d4a97abddcf718bfc834e53d11218b9f8..0000000000000000000000000000000000000000
--- 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 5751f2f99f23740b179d56c5a8c19c8eba392a67..aea24f7362c1d70345d0f61783bf241fe21f796c 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 1a540915ee2144f765bd703498c58fc064a39f1a..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..4653090d2bba9200824bf577bd0798e6bf61c227
--- /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 4da8cc395020c0429d499e6bf57946eaf4cffc8b..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..953ef6e5a897fccae3d4ee749304521c6901a4a7
--- /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 56dd1200f392a6e2eb4258c9703b4fb8295624c1..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..f219bc012b28654a2ff839b4d357ba280d446d18
--- /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 0000000000000000000000000000000000000000..ebf4d81b68956ff9387d6a4e366d3270c4e693d3
--- /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 3cc6b039859f20b366f27d9c6fa93b2e88f17f13..ad5f6452b895e872560780a2d860bedd73bc6f59 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 9df2f6399393f292f0669a51e4623cece60af65a..0000000000000000000000000000000000000000
--- 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 46b39c5c80c848dfcd25f5b043f1fec4158996db..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..f07946e6ca2c081c43c3415f1fe269d400cde856
--- /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 974a0d13f031f4f85e128c4ef6fb2d1f6476b4bb..9104723447bc4ea366d8f7db8c2dea9204371408 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 47a981c4d9fb6ea974de65783d9abc29854d8db0..da8e28201486bb58eb8cbfe6081bb10784c2c538 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 0000000000000000000000000000000000000000..ebf4d81b68956ff9387d6a4e366d3270c4e693d3
--- /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 d695fafe7bad6acb0becd7e83f41bf3335e079cc..d59744a7667cdf9799d73f75a5e6225fc0754310 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 a089a954ad96e0416fbb883d084cd9cefa7590e2..0000000000000000000000000000000000000000
--- 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 25afc413f1d2cbebd27fcce9af63b7191185f0c4..0000000000000000000000000000000000000000
--- 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 bb0d56242b538f796325117af7353013e3451262..0000000000000000000000000000000000000000
--- 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 3a2df7f13d69eb476598315cb633ea6e6ffc88fe..0000000000000000000000000000000000000000
--- 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 7c6d01230148ff301cf94a8444bc7bc9557174cd..0000000000000000000000000000000000000000
--- 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 fd42f461205510225fcf7924f28ff16ae4ec180f..0000000000000000000000000000000000000000
--- 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 ea58eb9147b80e7e1f47c4b8145d2d1075d35c1b..0000000000000000000000000000000000000000
--- 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 95661c4fc1a98b88271e5439f8a1ff6de925c5fc..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..c7345136c8306e403dfc5f2fd09de7884499ccbc
--- /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 cbdd582920303b35774b11f7587ebab1b484b101..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..8b51209ff35129e17290a992f778369e92b4e548
--- /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 3f3a29de33a2c1ff975b0656cb6da1dd62652ecc..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..116637dd13050eee74a415d4a37301f353cf6943
--- /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 09241523687545fea354d0f304bcdba947780e45..280c17880c2f2cf63c1353f33ba57b17dcf5f57f 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 bba6cbab582f360fe9169d7d4418955dc812794c..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..dba662dc63462d2f3142e75a9d8f7a9bf062a063
--- /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 44be6eae15015bd8e7af969373072783401f3038..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..9b43f3d0c6595c7ec55413ca848d797d20cec3e0
--- /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 b06bf1127f80c70eda1f18afc300f4fcab49467e..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..20ee3e6da765e0bfb96035306619379335df3153
--- /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 0000000000000000000000000000000000000000..ebf4d81b68956ff9387d6a4e366d3270c4e693d3
--- /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 f3265d4b88f7aac271ec21679195adff8446855e..0000000000000000000000000000000000000000
--- 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 b8aa3c78b977248c625d7a1ab2cd9dcca2272656..0000000000000000000000000000000000000000
--- 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 9f274da88be5f2d11f627f8e8c9ec1de01a86ab1..0000000000000000000000000000000000000000
--- 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 08bfb8d40740e65d9ae184cec07e356714532adb..0000000000000000000000000000000000000000
--- 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 2c2948adaef5b48cece599309b1849eea0192fa9..0000000000000000000000000000000000000000
--- 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 71e5161d7f0d1d083159f2451a6ca8158b08408a..0000000000000000000000000000000000000000
--- 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 32b53be63deb9b0c9d752462f3fc330eb87cf359..139f8c6ae03cd80b0696e78a3d79c5132aeb1d19 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 f869de1e7bd6ad11898c7baba65b98320f68d4d8..0000000000000000000000000000000000000000
--- 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 0c492dd1838026052d8f9e8c57cf38433bd4b83e..0000000000000000000000000000000000000000
--- 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 aa55c16dace2ce22d8cf2e342a115f985543ca77..0000000000000000000000000000000000000000
--- 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 c05bd67bf5e28befd4187341c3d557480f9d5f78..0000000000000000000000000000000000000000
--- 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 8b3bd57db6240842619d927ccd96c92686b81b15..0000000000000000000000000000000000000000
--- 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 316f49c0aa8b6ff573692ec4c6b5408b1e374806..0000000000000000000000000000000000000000
--- 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 7fc08e57b59bf4921f09e09d3d82f60acb0927be..0000000000000000000000000000000000000000
--- 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 f1915d761408a47406c1c77085e2ccbc9e931513..0000000000000000000000000000000000000000
--- 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 bc2d5ac02525f2795811e458b6f1a6db5904ef15..0000000000000000000000000000000000000000
--- 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 30514ce78a6c10482ce52f74ce718494e994f7ad..0000000000000000000000000000000000000000
--- 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 f8f05bdbd468953ce750fe43ed7995cacf0e619c..0000000000000000000000000000000000000000
--- 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 18b2d69f5959b4cf9ee6acab934ceb7063f6e7f4..0000000000000000000000000000000000000000
--- 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 df24926cfb7af3932a04a0196b192853f4257bdf..0000000000000000000000000000000000000000
--- 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 78e0ea61c16562e69bb10d351f781c3f8fc00bd0..0000000000000000000000000000000000000000
--- 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 7fc08beda086c46a54edfe3c119118a0c188e167..0000000000000000000000000000000000000000
--- 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 238fb190ba02fe611d0c4c0c7d66af156ef9d81b..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..8c56fd7183c9bce5b5c88047075abcefbcebb6dc
--- /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 0000000000000000000000000000000000000000..ecbeda6d3ed07bd869a3666b3ed1b2f5a09908bc
--- /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 e9dfb67d1caf2fb17f0efe9e5d18394e200f8981..cd287f73995f4f36ea6eeb79930e33083604b49a 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 0000000000000000000000000000000000000000..9e3cec4dd271cac7f3e9b5eccdfb4d5091521aaa
--- /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 0000000000000000000000000000000000000000..13b065815d5d3091c4a7d2f49b61ab723aba06db
--- /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 0000000000000000000000000000000000000000..8e535eebeef7afb3ee94571b2abd4a5b44009521
--- /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 25f3cfdd629e82759e6234adf91e43cf785ac3b6..9fa3c8a488ffc382cd3ee259ff2ce9cd964e0c22 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 0000000000000000000000000000000000000000..f3b65aeb323683d32446c1370621ec0cce2f3edf
--- /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 0000000000000000000000000000000000000000..8d9f1827625509c5ebb126c8b3aecb3108c87ca5
--- /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 0000000000000000000000000000000000000000..d34d7228c1876fa8d14b64aad77187c0f0a83e4a
--- /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 10f008b86813dabe0ac58db40772b54a45d17365..2a60b138a8d16680425efe7a42fd845035d1190c 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 0000000000000000000000000000000000000000..9adde79bdf2e93038fb50fb05060b7e0d5a6919b
--- /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":"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"}
\ 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 0000000000000000000000000000000000000000..0b470953c34d1c87488e1e3b5dfb044d3b6e754f
--- /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 0000000000000000000000000000000000000000..1482f1e35229c6447d1171203c58fde6f368c12c
--- /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 f33646f1194b4ed63037c39c5414d111248320f8..cd361d43002f1314497921444f149142a57cc772 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 0000000000000000000000000000000000000000..a0c292941c0c48d069a708ba3388cbad2c1a191e
--- /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 0000000000000000000000000000000000000000..fb36ee1b3ccd7ea5798c602398000d0d318bbfd3
--- /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 0000000000000000000000000000000000000000..87ef29345b2852986187711824ff5ac89b7b1b96
--- /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 0000000000000000000000000000000000000000..1875411055768e8d8413db9902d22daf76329e40
--- /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 0000000000000000000000000000000000000000..c71cc4ebf85c72e4efca70fdf60a982cea8f3775
--- /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 0000000000000000000000000000000000000000..9713197bbfd0b4e3dea28a8e4817629a052c4941
--- /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 0000000000000000000000000000000000000000..4793c44e79f96e5b36e69719fc56e73d9485155a
--- /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 8d8234f13f0333a257e01ee7b090f43dae325504..2187bc9d19a1e4ac82759bee30ebfc3ce3e6189d 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 0000000000000000000000000000000000000000..1fde95b4c539bf549f89754b2de305fb9bd43e6a
--- /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 1e30cfc12e175829c49af53da2a62cd48d104eed..0000000000000000000000000000000000000000
--- 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 107ec5a791a351ad5349ca948175ed8408ec4080..0000000000000000000000000000000000000000
--- 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 398c9661484cc224d590a6054633f3ce444e6e2a..0000000000000000000000000000000000000000
--- 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 219fcabf73975e2a1610b5bdf0008272c44768fa..0000000000000000000000000000000000000000
--- 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 765fe77c52afaf809d8c358ffa120f4fff0754ec..0000000000000000000000000000000000000000
--- 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 e7d3e2da1286336d3405b4dec4b8e14bf97834f7..0000000000000000000000000000000000000000
--- 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 3c1ef5fbb196472e434dbb4950da1d62f12e2890..0000000000000000000000000000000000000000
--- 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 3a07d780176411a08b05bc4cf32853a01c855ce0..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..81253d38280bb25de1e36443d919f0e95b3e023c
--- /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 0000000000000000000000000000000000000000..16400be013822b1a4479bc7eecebb0a7887e693d
--- /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 09c8e339284144b6227f8580372169775a257537..fa5945e915f708846f660ec07a7ff9770c641085 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 0000000000000000000000000000000000000000..4627fb3d3d958febba22f2bd5595875427d7ab52
--- /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 0000000000000000000000000000000000000000..729ac4d93b7f2d9be36b44525f02ff6555f9383a
--- /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 0000000000000000000000000000000000000000..2757ca7e2cfabd6c49aa35f7b4191752c872fb80
--- /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 0000000000000000000000000000000000000000..e96ac5fda5c6e1061a04377c7e37b1e486bd8ad4
--- /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 0e241dbfdb0104d435e2d48e9b7b840c023ab53d..3b34e368f1dc3bc64bcab6b93a93d64d709a1ebb 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 0000000000000000000000000000000000000000..b4d4a3a0ddbb320af3d262740952a81f248fddf0
--- /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 0000000000000000000000000000000000000000..50a9bd0c73649e4a78edd0d18b4ee44ae9cdf3b7
--- /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 0000000000000000000000000000000000000000..13f6736dce669b37b73fe9b0d6bb9c220e127c77
--- /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 8760b44b10519d5ce387ad3bd97b611a659d00e1..3feb635c9f8b7aaaf1f2e8b293a978599a5efc36 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 0000000000000000000000000000000000000000..2c620faaa8614140d05d786aef2e1918b504edd8
--- /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 0000000000000000000000000000000000000000..7531aa6d558e82906e825c56ce0d895bd27525fc
--- /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 0000000000000000000000000000000000000000..fb6f87a8be20cc5cfe1cd519a507ecc91b8e0dd8
--- /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":"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"}
\ 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 c10880ae594b0473fd9e76371927a4f8456d9e7d..c36c892d4d48e310ee17496adb36752fc5858be2 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 0000000000000000000000000000000000000000..62fce38a8d7cb47fba5c09d94763fe0cdfed0f01
--- /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 0000000000000000000000000000000000000000..d944fae103a245cb84623fd733c91cc7e79f72f1
--- /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 0000000000000000000000000000000000000000..5466921cc28eec37d17452099c4f0ab790dda283
--- /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 659ef60ec82c2647ceea0fc62087bf6c66bd270a..a6b122669e8c69d8e902c992e01e438f8cbd7f47 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 0000000000000000000000000000000000000000..4d25410bf2e87d73f571bbb2642ed7e0c8fafc36
--- /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 0000000000000000000000000000000000000000..de6e234cfb36bb3a4b928c47ab0d0fdf0b4311e1
--- /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 0000000000000000000000000000000000000000..a9b9a482d1f33270457d671a2967c33fc21c61c0
--- /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 c18d55c56c87bcc65d5832ddc1196d6d7ad2c9b2..e0912efff5a1180d398fe3191b7a56f120fe2e27 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 0000000000000000000000000000000000000000..c3aafa97675ab3d42b37ee142a7306e42f23745c
--- /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":"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"}
\ 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 36880c83136ef2dced919044702c06754d492b97..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..e74a590783b4688fb6498b019c1a75cfd9ac23e7
--- /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 0000000000000000000000000000000000000000..26ab21cd82cc7b94681e7cc43b4c3a184540cdcd
--- /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 26fde48a5b33ccbc28f0614062e49f266940e510..9bc9681b645a1d8f35e890b832bbef6f4f22c061 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 0000000000000000000000000000000000000000..05c9e03222adb169cbb3bcd0a497ad73ffc75aa5
--- /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 0000000000000000000000000000000000000000..cccdf8f86d2295b3059c42943d896e81691c8419
--- /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 0000000000000000000000000000000000000000..6c04cabbd414f61c1555c4d02e5c298db1413046
--- /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 14d007a1611bdb56fad0b2f30af0727f0fb23e48..c613067ab04d427f66e563126eb24d0cc1b0c394 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 0000000000000000000000000000000000000000..12effe1a2d719804bdf701c5b11f11e6acbb1ae9
--- /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 0000000000000000000000000000000000000000..8de74eeb883e1ff4b7fc3c5a18ba2010705a5b9a
--- /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 0000000000000000000000000000000000000000..ad047c76d9c35bc6d73285d4d87cb86dfbe26e68
--- /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 0000000000000000000000000000000000000000..d549d1f117025f0c7dd5c45dab827dfd0f679f54
--- /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 0000000000000000000000000000000000000000..47742bee2a178d12a58536dc0401892c35643f61
--- /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 0bbe893d6c7c9523fa766706975d181c1f17f72e..0000000000000000000000000000000000000000
--- 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 26465c478b3f829904789cecf0b3587559f2a34d..0000000000000000000000000000000000000000
--- 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 13a12df243f8d8d049e975b3f2ed8f6177c59f88..72f5abeca75e418251836fc730bd5f1e23345b29 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 6a3e683817bdb10eae989836f0849e9e950f0959..0000000000000000000000000000000000000000
--- 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 4d4ce68790b66291b7ff040a6a1eaa5d082fc932..0000000000000000000000000000000000000000
--- 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 decbbc2e8cd66bf9bb8dd7b767ebea25c9fa6710..0000000000000000000000000000000000000000
--- 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: ['