parse5 6.0.1 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/common/doctype.d.ts +5 -0
  3. package/dist/cjs/common/doctype.js +120 -0
  4. package/dist/cjs/common/error-codes.d.ts +68 -0
  5. package/dist/cjs/common/error-codes.js +67 -0
  6. package/dist/cjs/common/foreign-content.d.ts +10 -0
  7. package/dist/cjs/common/foreign-content.js +239 -0
  8. package/dist/cjs/common/html.d.ts +288 -0
  9. package/dist/cjs/common/html.js +529 -0
  10. package/dist/cjs/common/token.d.ts +85 -0
  11. package/dist/cjs/common/token.js +25 -0
  12. package/dist/cjs/common/unicode.d.ts +49 -0
  13. package/dist/cjs/common/unicode.js +77 -0
  14. package/dist/cjs/index.d.ts +60 -0
  15. package/dist/cjs/index.js +55 -0
  16. package/dist/cjs/package.json +1 -0
  17. package/dist/cjs/parser/formatting-element-list.d.ts +32 -0
  18. package/dist/cjs/parser/formatting-element-list.js +110 -0
  19. package/dist/cjs/parser/index.d.ts +157 -0
  20. package/dist/cjs/parser/index.js +3049 -0
  21. package/dist/cjs/parser/open-element-stack.d.ts +53 -0
  22. package/dist/cjs/parser/open-element-stack.js +316 -0
  23. package/dist/cjs/serializer/index.d.ts +61 -0
  24. package/dist/cjs/serializer/index.js +173 -0
  25. package/dist/cjs/tokenizer/index.d.ts +250 -0
  26. package/dist/cjs/tokenizer/index.js +2921 -0
  27. package/dist/cjs/tokenizer/preprocessor.d.ts +37 -0
  28. package/dist/cjs/tokenizer/preprocessor.js +198 -0
  29. package/dist/cjs/tree-adapters/default.d.ts +92 -0
  30. package/dist/cjs/tree-adapters/default.js +185 -0
  31. package/dist/cjs/tree-adapters/interface.d.ts +250 -0
  32. package/dist/cjs/tree-adapters/interface.js +3 -0
  33. package/dist/common/doctype.d.ts +5 -0
  34. package/{lib → dist}/common/doctype.js +25 -72
  35. package/dist/common/error-codes.d.ts +68 -0
  36. package/dist/common/error-codes.js +64 -0
  37. package/dist/common/foreign-content.d.ts +10 -0
  38. package/dist/common/foreign-content.js +230 -0
  39. package/dist/common/html.d.ts +288 -0
  40. package/dist/common/html.js +523 -0
  41. package/dist/common/token.d.ts +85 -0
  42. package/dist/common/token.js +21 -0
  43. package/dist/common/unicode.d.ts +49 -0
  44. package/dist/common/unicode.js +69 -0
  45. package/dist/index.d.ts +60 -0
  46. package/dist/index.js +44 -0
  47. package/dist/parser/formatting-element-list.d.ts +32 -0
  48. package/dist/parser/formatting-element-list.js +106 -0
  49. package/dist/parser/index.d.ts +157 -0
  50. package/dist/parser/index.js +3054 -0
  51. package/dist/parser/open-element-stack.d.ts +53 -0
  52. package/dist/parser/open-element-stack.js +312 -0
  53. package/dist/serializer/index.d.ts +61 -0
  54. package/dist/serializer/index.js +168 -0
  55. package/dist/tokenizer/index.d.ts +250 -0
  56. package/dist/tokenizer/index.js +2917 -0
  57. package/dist/tokenizer/preprocessor.d.ts +37 -0
  58. package/dist/tokenizer/preprocessor.js +194 -0
  59. package/dist/tree-adapters/default.d.ts +92 -0
  60. package/dist/tree-adapters/default.js +182 -0
  61. package/dist/tree-adapters/interface.d.ts +250 -0
  62. package/dist/tree-adapters/interface.js +2 -0
  63. package/package.json +19 -5
  64. package/lib/common/error-codes.js +0 -65
  65. package/lib/common/foreign-content.js +0 -265
  66. package/lib/common/html.js +0 -272
  67. package/lib/common/unicode.js +0 -109
  68. package/lib/extensions/error-reporting/mixin-base.js +0 -43
  69. package/lib/extensions/error-reporting/parser-mixin.js +0 -52
  70. package/lib/extensions/error-reporting/preprocessor-mixin.js +0 -24
  71. package/lib/extensions/error-reporting/tokenizer-mixin.js +0 -17
  72. package/lib/extensions/location-info/open-element-stack-mixin.js +0 -35
  73. package/lib/extensions/location-info/parser-mixin.js +0 -223
  74. package/lib/extensions/location-info/tokenizer-mixin.js +0 -146
  75. package/lib/extensions/position-tracking/preprocessor-mixin.js +0 -64
  76. package/lib/index.js +0 -29
  77. package/lib/parser/formatting-element-list.js +0 -181
  78. package/lib/parser/index.js +0 -2956
  79. package/lib/parser/open-element-stack.js +0 -482
  80. package/lib/serializer/index.js +0 -176
  81. package/lib/tokenizer/index.js +0 -2196
  82. package/lib/tokenizer/named-entity-data.js +0 -5
  83. package/lib/tokenizer/preprocessor.js +0 -159
  84. package/lib/tree-adapters/default.js +0 -221
  85. package/lib/utils/merge-options.js +0 -13
  86. package/lib/utils/mixin.js +0 -39
@@ -0,0 +1,69 @@
1
+ const UNDEFINED_CODE_POINTS = new Set([
2
+ 65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143, 327678, 327679, 393214,
3
+ 393215, 458750, 458751, 524286, 524287, 589822, 589823, 655358, 655359, 720894,
4
+ 720895, 786430, 786431, 851966, 851967, 917502, 917503, 983038, 983039, 1048574,
5
+ 1048575, 1114110, 1114111,
6
+ ]);
7
+ export const REPLACEMENT_CHARACTER = '\uFFFD';
8
+ export var CODE_POINTS;
9
+ (function (CODE_POINTS) {
10
+ CODE_POINTS[CODE_POINTS["EOF"] = -1] = "EOF";
11
+ CODE_POINTS[CODE_POINTS["NULL"] = 0] = "NULL";
12
+ CODE_POINTS[CODE_POINTS["TABULATION"] = 9] = "TABULATION";
13
+ CODE_POINTS[CODE_POINTS["CARRIAGE_RETURN"] = 13] = "CARRIAGE_RETURN";
14
+ CODE_POINTS[CODE_POINTS["LINE_FEED"] = 10] = "LINE_FEED";
15
+ CODE_POINTS[CODE_POINTS["FORM_FEED"] = 12] = "FORM_FEED";
16
+ CODE_POINTS[CODE_POINTS["SPACE"] = 32] = "SPACE";
17
+ CODE_POINTS[CODE_POINTS["EXCLAMATION_MARK"] = 33] = "EXCLAMATION_MARK";
18
+ CODE_POINTS[CODE_POINTS["QUOTATION_MARK"] = 34] = "QUOTATION_MARK";
19
+ CODE_POINTS[CODE_POINTS["NUMBER_SIGN"] = 35] = "NUMBER_SIGN";
20
+ CODE_POINTS[CODE_POINTS["AMPERSAND"] = 38] = "AMPERSAND";
21
+ CODE_POINTS[CODE_POINTS["APOSTROPHE"] = 39] = "APOSTROPHE";
22
+ CODE_POINTS[CODE_POINTS["HYPHEN_MINUS"] = 45] = "HYPHEN_MINUS";
23
+ CODE_POINTS[CODE_POINTS["SOLIDUS"] = 47] = "SOLIDUS";
24
+ CODE_POINTS[CODE_POINTS["DIGIT_0"] = 48] = "DIGIT_0";
25
+ CODE_POINTS[CODE_POINTS["DIGIT_9"] = 57] = "DIGIT_9";
26
+ CODE_POINTS[CODE_POINTS["SEMICOLON"] = 59] = "SEMICOLON";
27
+ CODE_POINTS[CODE_POINTS["LESS_THAN_SIGN"] = 60] = "LESS_THAN_SIGN";
28
+ CODE_POINTS[CODE_POINTS["EQUALS_SIGN"] = 61] = "EQUALS_SIGN";
29
+ CODE_POINTS[CODE_POINTS["GREATER_THAN_SIGN"] = 62] = "GREATER_THAN_SIGN";
30
+ CODE_POINTS[CODE_POINTS["QUESTION_MARK"] = 63] = "QUESTION_MARK";
31
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_A"] = 65] = "LATIN_CAPITAL_A";
32
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_F"] = 70] = "LATIN_CAPITAL_F";
33
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_X"] = 88] = "LATIN_CAPITAL_X";
34
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_Z"] = 90] = "LATIN_CAPITAL_Z";
35
+ CODE_POINTS[CODE_POINTS["RIGHT_SQUARE_BRACKET"] = 93] = "RIGHT_SQUARE_BRACKET";
36
+ CODE_POINTS[CODE_POINTS["GRAVE_ACCENT"] = 96] = "GRAVE_ACCENT";
37
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_A"] = 97] = "LATIN_SMALL_A";
38
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_F"] = 102] = "LATIN_SMALL_F";
39
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_X"] = 120] = "LATIN_SMALL_X";
40
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_Z"] = 122] = "LATIN_SMALL_Z";
41
+ CODE_POINTS[CODE_POINTS["REPLACEMENT_CHARACTER"] = 65533] = "REPLACEMENT_CHARACTER";
42
+ })(CODE_POINTS || (CODE_POINTS = {}));
43
+ export const SEQUENCES = {
44
+ DASH_DASH: '--',
45
+ CDATA_START: '[CDATA[',
46
+ DOCTYPE: 'doctype',
47
+ SCRIPT: 'script',
48
+ PUBLIC: 'public',
49
+ SYSTEM: 'system',
50
+ };
51
+ //Surrogates
52
+ export function isSurrogate(cp) {
53
+ return cp >= 55296 && cp <= 57343;
54
+ }
55
+ export function isSurrogatePair(cp) {
56
+ return cp >= 56320 && cp <= 57343;
57
+ }
58
+ export function getSurrogatePairCodePoint(cp1, cp2) {
59
+ return (cp1 - 55296) * 1024 + 9216 + cp2;
60
+ }
61
+ //NOTE: excluding NULL and ASCII whitespace
62
+ export function isControlCodePoint(cp) {
63
+ return ((cp !== 0x20 && cp !== 0x0a && cp !== 0x0d && cp !== 0x09 && cp !== 0x0c && cp >= 0x01 && cp <= 0x1f) ||
64
+ (cp >= 0x7f && cp <= 0x9f));
65
+ }
66
+ export function isUndefinedCodePoint(cp) {
67
+ return (cp >= 64976 && cp <= 65007) || UNDEFINED_CODE_POINTS.has(cp);
68
+ }
69
+ //# sourceMappingURL=unicode.js.map
@@ -0,0 +1,60 @@
1
+ import { type ParserOptions } from './parser/index.js';
2
+ import type { DefaultTreeAdapterMap } from './tree-adapters/default.js';
3
+ import type { TreeAdapterTypeMap } from './tree-adapters/interface.js';
4
+ export { type DefaultTreeAdapterMap, defaultTreeAdapter } from './tree-adapters/default.js';
5
+ export type { TreeAdapter, TreeAdapterTypeMap } from './tree-adapters/interface.js';
6
+ export { type ParserOptions, /** @internal */ Parser } from './parser/index.js';
7
+ export { serialize, serializeOuter, type SerializerOptions } from './serializer/index.js';
8
+ export type { ParserError } from './common/error-codes.js';
9
+ /** @internal */
10
+ export * as foreignContent from './common/foreign-content.js';
11
+ /** @internal */
12
+ export * as html from './common/html.js';
13
+ /** @internal */
14
+ export * as Token from './common/token.js';
15
+ /** @internal */
16
+ export { Tokenizer, type TokenizerOptions, TokenizerMode, type TokenHandler } from './tokenizer/index.js';
17
+ /**
18
+ * Parses an HTML string.
19
+ *
20
+ * @param html Input HTML string.
21
+ * @param options Parsing options.
22
+ * @returns Document
23
+ *
24
+ * @example
25
+ *
26
+ * ```js
27
+ * const parse5 = require('parse5');
28
+ *
29
+ * const document = parse5.parse('<!DOCTYPE html><html><head></head><body>Hi there!</body></html>');
30
+ *
31
+ * console.log(document.childNodes[1].tagName); //> 'html'
32
+ *```
33
+ */
34
+ export declare function parse<T extends TreeAdapterTypeMap = DefaultTreeAdapterMap>(html: string, options?: ParserOptions<T>): T['document'];
35
+ /**
36
+ * Parses an HTML fragment.
37
+ *
38
+ * @example
39
+ *
40
+ * ```js
41
+ * const parse5 = require('parse5');
42
+ *
43
+ * const documentFragment = parse5.parseFragment('<table></table>');
44
+ *
45
+ * console.log(documentFragment.childNodes[0].tagName); //> 'table'
46
+ *
47
+ * // Parses the html fragment in the context of the parsed <table> element.
48
+ * const trFragment = parser.parseFragment(documentFragment.childNodes[0], '<tr><td>Shake it, baby</td></tr>');
49
+ *
50
+ * console.log(trFragment.childNodes[0].childNodes[0].tagName); //> 'td'
51
+ * ```
52
+ *
53
+ * @param fragmentContext Parsing context element. If specified, given fragment will be parsed as if it was set to the context element's `innerHTML` property.
54
+ * @param html Input HTML fragment string.
55
+ * @param options Parsing options.
56
+ * @returns DocumentFragment
57
+ */
58
+ export declare function parseFragment<T extends TreeAdapterTypeMap = DefaultTreeAdapterMap>(fragmentContext: T['parentNode'] | null, html: string, options: ParserOptions<T>): T['documentFragment'];
59
+ export declare function parseFragment<T extends TreeAdapterTypeMap = DefaultTreeAdapterMap>(html: string, options?: ParserOptions<T>): T['documentFragment'];
60
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,44 @@
1
+ import { Parser } from './parser/index.js';
2
+ export { defaultTreeAdapter } from './tree-adapters/default.js';
3
+ export { /** @internal */ Parser } from './parser/index.js';
4
+ export { serialize, serializeOuter } from './serializer/index.js';
5
+ /** @internal */
6
+ export * as foreignContent from './common/foreign-content.js';
7
+ /** @internal */
8
+ export * as html from './common/html.js';
9
+ /** @internal */
10
+ export * as Token from './common/token.js';
11
+ /** @internal */
12
+ export { Tokenizer, TokenizerMode } from './tokenizer/index.js';
13
+ // Shorthands
14
+ /**
15
+ * Parses an HTML string.
16
+ *
17
+ * @param html Input HTML string.
18
+ * @param options Parsing options.
19
+ * @returns Document
20
+ *
21
+ * @example
22
+ *
23
+ * ```js
24
+ * const parse5 = require('parse5');
25
+ *
26
+ * const document = parse5.parse('<!DOCTYPE html><html><head></head><body>Hi there!</body></html>');
27
+ *
28
+ * console.log(document.childNodes[1].tagName); //> 'html'
29
+ *```
30
+ */
31
+ export function parse(html, options) {
32
+ return Parser.parse(html, options);
33
+ }
34
+ export function parseFragment(fragmentContext, html, options) {
35
+ if (typeof fragmentContext === 'string') {
36
+ options = html;
37
+ html = fragmentContext;
38
+ fragmentContext = null;
39
+ }
40
+ const parser = Parser.getFragmentParser(fragmentContext, options);
41
+ parser.tokenizer.write(html, true);
42
+ return parser.getFragment();
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,32 @@
1
+ import type { TagToken } from '../common/token.js';
2
+ import type { TreeAdapter, TreeAdapterTypeMap } from '../tree-adapters/interface';
3
+ export declare enum EntryType {
4
+ Marker = 0,
5
+ Element = 1
6
+ }
7
+ interface MarkerEntry {
8
+ type: EntryType.Marker;
9
+ }
10
+ export interface ElementEntry<T extends TreeAdapterTypeMap> {
11
+ type: EntryType.Element;
12
+ element: T['element'];
13
+ token: TagToken;
14
+ }
15
+ export declare type Entry<T extends TreeAdapterTypeMap> = MarkerEntry | ElementEntry<T>;
16
+ export declare class FormattingElementList<T extends TreeAdapterTypeMap> {
17
+ private treeAdapter;
18
+ entries: Entry<T>[];
19
+ bookmark: Entry<T> | null;
20
+ constructor(treeAdapter: TreeAdapter<T>);
21
+ private _getNoahArkConditionCandidates;
22
+ private _ensureNoahArkCondition;
23
+ insertMarker(): void;
24
+ pushElement(element: T['element'], token: TagToken): void;
25
+ insertElementAfterBookmark(element: T['element'], token: TagToken): void;
26
+ removeEntry(entry: Entry<T>): void;
27
+ clearToLastMarker(): void;
28
+ getElementEntryInScopeWithTagName(tagName: string): ElementEntry<T> | null;
29
+ getElementEntry(element: T['element']): ElementEntry<T> | undefined;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=formatting-element-list.d.ts.map
@@ -0,0 +1,106 @@
1
+ //Const
2
+ const NOAH_ARK_CAPACITY = 3;
3
+ export var EntryType;
4
+ (function (EntryType) {
5
+ EntryType[EntryType["Marker"] = 0] = "Marker";
6
+ EntryType[EntryType["Element"] = 1] = "Element";
7
+ })(EntryType || (EntryType = {}));
8
+ const MARKER = { type: EntryType.Marker };
9
+ //List of formatting elements
10
+ export class FormattingElementList {
11
+ constructor(treeAdapter) {
12
+ this.treeAdapter = treeAdapter;
13
+ this.entries = [];
14
+ this.bookmark = null;
15
+ }
16
+ //Noah Ark's condition
17
+ //OPTIMIZATION: at first we try to find possible candidates for exclusion using
18
+ //lightweight heuristics without thorough attributes check.
19
+ _getNoahArkConditionCandidates(newElement, neAttrs) {
20
+ const candidates = [];
21
+ const neAttrsLength = neAttrs.length;
22
+ const neTagName = this.treeAdapter.getTagName(newElement);
23
+ const neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement);
24
+ for (let i = 0; i < this.entries.length; i++) {
25
+ const entry = this.entries[i];
26
+ if (entry.type === EntryType.Marker) {
27
+ break;
28
+ }
29
+ const { element } = entry;
30
+ if (this.treeAdapter.getTagName(element) === neTagName &&
31
+ this.treeAdapter.getNamespaceURI(element) === neNamespaceURI) {
32
+ const elementAttrs = this.treeAdapter.getAttrList(element);
33
+ if (elementAttrs.length === neAttrsLength) {
34
+ candidates.push({ idx: i, attrs: elementAttrs });
35
+ }
36
+ }
37
+ }
38
+ return candidates;
39
+ }
40
+ _ensureNoahArkCondition(newElement) {
41
+ if (this.entries.length < NOAH_ARK_CAPACITY)
42
+ return;
43
+ const neAttrs = this.treeAdapter.getAttrList(newElement);
44
+ const candidates = this._getNoahArkConditionCandidates(newElement, neAttrs);
45
+ if (candidates.length < NOAH_ARK_CAPACITY)
46
+ return;
47
+ //NOTE: build attrs map for the new element, so we can perform fast lookups
48
+ const neAttrsMap = new Map(neAttrs.map((neAttr) => [neAttr.name, neAttr.value]));
49
+ let validCandidates = 0;
50
+ //NOTE: remove bottommost candidates, until Noah's Ark condition will not be met
51
+ for (let i = 0; i < candidates.length; i++) {
52
+ const candidate = candidates[i];
53
+ // We know that `candidate.attrs.length === neAttrs.length`
54
+ if (candidate.attrs.every((cAttr) => neAttrsMap.get(cAttr.name) === cAttr.value)) {
55
+ validCandidates += 1;
56
+ if (validCandidates >= NOAH_ARK_CAPACITY) {
57
+ this.entries.splice(candidate.idx, 1);
58
+ }
59
+ }
60
+ }
61
+ }
62
+ //Mutations
63
+ insertMarker() {
64
+ this.entries.unshift(MARKER);
65
+ }
66
+ pushElement(element, token) {
67
+ this._ensureNoahArkCondition(element);
68
+ this.entries.unshift({
69
+ type: EntryType.Element,
70
+ element,
71
+ token,
72
+ });
73
+ }
74
+ insertElementAfterBookmark(element, token) {
75
+ const bookmarkIdx = this.entries.indexOf(this.bookmark);
76
+ this.entries.splice(bookmarkIdx, 0, {
77
+ type: EntryType.Element,
78
+ element,
79
+ token,
80
+ });
81
+ }
82
+ removeEntry(entry) {
83
+ const entryIndex = this.entries.indexOf(entry);
84
+ if (entryIndex >= 0) {
85
+ this.entries.splice(entryIndex, 1);
86
+ }
87
+ }
88
+ clearToLastMarker() {
89
+ const markerIdx = this.entries.indexOf(MARKER);
90
+ if (markerIdx >= 0) {
91
+ this.entries.splice(0, markerIdx + 1);
92
+ }
93
+ else {
94
+ this.entries.length = 0;
95
+ }
96
+ }
97
+ //Search
98
+ getElementEntryInScopeWithTagName(tagName) {
99
+ const entry = this.entries.find((entry) => entry.type === EntryType.Marker || this.treeAdapter.getTagName(entry.element) === tagName);
100
+ return entry && entry.type === EntryType.Element ? entry : null;
101
+ }
102
+ getElementEntry(element) {
103
+ return this.entries.find((entry) => entry.type === EntryType.Element && entry.element === element);
104
+ }
105
+ }
106
+ //# sourceMappingURL=formatting-element-list.js.map
@@ -0,0 +1,157 @@
1
+ import { Tokenizer, TokenizerMode, type TokenHandler } from '../tokenizer/index.js';
2
+ import { OpenElementStack, type StackHandler } from './open-element-stack.js';
3
+ import { FormattingElementList } from './formatting-element-list.js';
4
+ import { ERR, type ParserErrorHandler } from '../common/error-codes.js';
5
+ import { TAG_ID as $, NS } from '../common/html.js';
6
+ import type { TreeAdapter, TreeAdapterTypeMap } from '../tree-adapters/interface.js';
7
+ import { type Token, type CommentToken, type CharacterToken, type TagToken, type DoctypeToken, type EOFToken, type LocationWithAttributes } from '../common/token.js';
8
+ declare enum InsertionMode {
9
+ INITIAL = 0,
10
+ BEFORE_HTML = 1,
11
+ BEFORE_HEAD = 2,
12
+ IN_HEAD = 3,
13
+ IN_HEAD_NO_SCRIPT = 4,
14
+ AFTER_HEAD = 5,
15
+ IN_BODY = 6,
16
+ TEXT = 7,
17
+ IN_TABLE = 8,
18
+ IN_TABLE_TEXT = 9,
19
+ IN_CAPTION = 10,
20
+ IN_COLUMN_GROUP = 11,
21
+ IN_TABLE_BODY = 12,
22
+ IN_ROW = 13,
23
+ IN_CELL = 14,
24
+ IN_SELECT = 15,
25
+ IN_SELECT_IN_TABLE = 16,
26
+ IN_TEMPLATE = 17,
27
+ AFTER_BODY = 18,
28
+ IN_FRAMESET = 19,
29
+ AFTER_FRAMESET = 20,
30
+ AFTER_AFTER_BODY = 21,
31
+ AFTER_AFTER_FRAMESET = 22
32
+ }
33
+ export interface ParserOptions<T extends TreeAdapterTypeMap> {
34
+ /**
35
+ * The [scripting flag](https://html.spec.whatwg.org/multipage/parsing.html#scripting-flag). If set
36
+ * to `true`, `noscript` element content will be parsed as text.
37
+ *
38
+ * @default `true`
39
+ */
40
+ scriptingEnabled?: boolean;
41
+ /**
42
+ * Enables source code location information. When enabled, each node (except the root node)
43
+ * will have a `sourceCodeLocation` property. If the node is not an empty element, `sourceCodeLocation` will
44
+ * be a {@link ElementLocation} object, otherwise it will be {@link Location}.
45
+ * If the element was implicitly created by the parser (as part of
46
+ * [tree correction](https://html.spec.whatwg.org/multipage/syntax.html#an-introduction-to-error-handling-and-strange-cases-in-the-parser)),
47
+ * its `sourceCodeLocation` property will be `undefined`.
48
+ *
49
+ * @default `false`
50
+ */
51
+ sourceCodeLocationInfo?: boolean;
52
+ /**
53
+ * Specifies the resulting tree format.
54
+ *
55
+ * @default `treeAdapters.default`
56
+ */
57
+ treeAdapter?: TreeAdapter<T>;
58
+ /**
59
+ * Callback for parse errors.
60
+ *
61
+ * @default `null`
62
+ */
63
+ onParseError?: ParserErrorHandler | null;
64
+ }
65
+ export declare class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, StackHandler<T> {
66
+ fragmentContext: T['element'] | null;
67
+ scriptHandler: null | ((pendingScript: T['element']) => void);
68
+ treeAdapter: TreeAdapter<T>;
69
+ onParseError: ParserErrorHandler | null;
70
+ private currentToken;
71
+ options: Required<ParserOptions<T>>;
72
+ document: T['document'];
73
+ constructor(options?: ParserOptions<T>, document?: T['document'], fragmentContext?: T['element'] | null, scriptHandler?: null | ((pendingScript: T['element']) => void));
74
+ static parse<T extends TreeAdapterTypeMap>(html: string, options?: ParserOptions<T>): T['document'];
75
+ static getFragmentParser<T extends TreeAdapterTypeMap>(fragmentContext?: T['parentNode'] | null, options?: ParserOptions<T>): Parser<T>;
76
+ getFragment(): T['documentFragment'];
77
+ tokenizer: Tokenizer;
78
+ stopped: boolean;
79
+ insertionMode: InsertionMode;
80
+ originalInsertionMode: InsertionMode;
81
+ fragmentContextID: $;
82
+ headElement: null | T['element'];
83
+ formElement: null | T['element'];
84
+ openElements: OpenElementStack<T>;
85
+ activeFormattingElements: FormattingElementList<T>;
86
+ /** Indicates that the current node is not an element in the HTML namespace */
87
+ private currentNotInHTML;
88
+ /**
89
+ * The template insertion mode stack is maintained from the left.
90
+ * Ie. the topmost element will always have index 0.
91
+ */
92
+ tmplInsertionModeStack: InsertionMode[];
93
+ pendingCharacterTokens: CharacterToken[];
94
+ hasNonWhitespacePendingCharacterToken: boolean;
95
+ framesetOk: boolean;
96
+ skipNextNewLine: boolean;
97
+ fosterParentingEnabled: boolean;
98
+ _err(token: Token, code: ERR, beforeToken?: boolean): void;
99
+ onItemPush(node: T['parentNode'], tid: number, isTop: boolean): void;
100
+ onItemPop(node: T['parentNode'], isTop: boolean): void;
101
+ private _setContextModes;
102
+ _switchToTextParsing(currentToken: TagToken, nextTokenizerState: typeof TokenizerMode[keyof typeof TokenizerMode]): void;
103
+ switchToPlaintextParsing(): void;
104
+ _getAdjustedCurrentElement(): T['element'];
105
+ _findFormInFragmentContext(): void;
106
+ private _initTokenizerForFragmentParsing;
107
+ _setDocumentType(token: DoctypeToken): void;
108
+ _attachElementToTree(element: T['element'], location: LocationWithAttributes | null): void;
109
+ _appendElement(token: TagToken, namespaceURI: NS): void;
110
+ _insertElement(token: TagToken, namespaceURI: NS): void;
111
+ _insertFakeElement(tagName: string, tagID: $): void;
112
+ _insertTemplate(token: TagToken): void;
113
+ _insertFakeRootElement(): void;
114
+ _appendCommentNode(token: CommentToken, parent: T['parentNode']): void;
115
+ _insertCharacters(token: CharacterToken): void;
116
+ _adoptNodes(donor: T['parentNode'], recipient: T['parentNode']): void;
117
+ _setEndLocation(element: T['element'], closingToken: Token): void;
118
+ private shouldProcessStartTagTokenInForeignContent;
119
+ _processToken(token: Token): void;
120
+ _isIntegrationPoint(tid: $, element: T['element'], foreignNS?: NS): boolean;
121
+ _reconstructActiveFormattingElements(): void;
122
+ _closeTableCell(): void;
123
+ _closePElement(): void;
124
+ _resetInsertionMode(): void;
125
+ _resetInsertionModeForSelect(selectIdx: number): void;
126
+ _isElementCausesFosterParenting(tn: $): boolean;
127
+ _shouldFosterParentOnInsertion(): boolean;
128
+ _findFosterParentingLocation(): {
129
+ parent: T['parentNode'];
130
+ beforeElement: T['element'] | null;
131
+ };
132
+ _fosterParentElement(element: T['element']): void;
133
+ _isSpecialElement(element: T['element'], id: $): boolean;
134
+ onCharacter(token: CharacterToken): void;
135
+ onNullCharacter(token: CharacterToken): void;
136
+ onComment(token: CommentToken): void;
137
+ onDoctype(token: DoctypeToken): void;
138
+ onStartTag(token: TagToken): void;
139
+ /**
140
+ * Processes a given start tag.
141
+ *
142
+ * `onStartTag` checks if a self-closing tag was recognized. When a token
143
+ * is moved inbetween multiple insertion modes, this check for self-closing
144
+ * could lead to false positives. To avoid this, `_processStartTag` is used
145
+ * for nested calls.
146
+ *
147
+ * @param token The token to process.
148
+ */
149
+ _processStartTag(token: TagToken): void;
150
+ _startTagOutsideForeignContent(token: TagToken): void;
151
+ onEndTag(token: TagToken): void;
152
+ _endTagOutsideForeignContent(token: TagToken): void;
153
+ onEof(token: EOFToken): void;
154
+ onWhitespaceCharacter(token: CharacterToken): void;
155
+ }
156
+ export {};
157
+ //# sourceMappingURL=index.d.ts.map