parse5 6.0.0 → 7.1.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 (85) 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/parser/formatting-element-list.d.ts +37 -0
  17. package/dist/cjs/parser/formatting-element-list.js +115 -0
  18. package/dist/cjs/parser/index.d.ts +157 -0
  19. package/dist/cjs/parser/index.js +3053 -0
  20. package/dist/cjs/parser/open-element-stack.d.ts +53 -0
  21. package/dist/cjs/parser/open-element-stack.js +316 -0
  22. package/dist/cjs/serializer/index.d.ts +61 -0
  23. package/dist/cjs/serializer/index.js +173 -0
  24. package/dist/cjs/tokenizer/index.d.ts +248 -0
  25. package/dist/cjs/tokenizer/index.js +2907 -0
  26. package/dist/cjs/tokenizer/preprocessor.d.ts +37 -0
  27. package/dist/cjs/tokenizer/preprocessor.js +198 -0
  28. package/dist/cjs/tree-adapters/default.d.ts +85 -0
  29. package/dist/cjs/tree-adapters/default.js +177 -0
  30. package/dist/cjs/tree-adapters/interface.d.ts +250 -0
  31. package/dist/cjs/tree-adapters/interface.js +3 -0
  32. package/dist/common/doctype.d.ts +5 -0
  33. package/{lib → dist}/common/doctype.js +25 -72
  34. package/dist/common/error-codes.d.ts +68 -0
  35. package/dist/common/error-codes.js +64 -0
  36. package/dist/common/foreign-content.d.ts +10 -0
  37. package/dist/common/foreign-content.js +230 -0
  38. package/dist/common/html.d.ts +288 -0
  39. package/dist/common/html.js +523 -0
  40. package/dist/common/token.d.ts +85 -0
  41. package/dist/common/token.js +21 -0
  42. package/dist/common/unicode.d.ts +49 -0
  43. package/dist/common/unicode.js +69 -0
  44. package/dist/index.d.ts +60 -0
  45. package/dist/index.js +44 -0
  46. package/dist/parser/formatting-element-list.d.ts +37 -0
  47. package/dist/parser/formatting-element-list.js +111 -0
  48. package/dist/parser/index.d.ts +157 -0
  49. package/dist/parser/index.js +3058 -0
  50. package/dist/parser/open-element-stack.d.ts +53 -0
  51. package/dist/parser/open-element-stack.js +312 -0
  52. package/dist/serializer/index.d.ts +61 -0
  53. package/dist/serializer/index.js +168 -0
  54. package/dist/tokenizer/index.d.ts +248 -0
  55. package/dist/tokenizer/index.js +2903 -0
  56. package/dist/tokenizer/preprocessor.d.ts +37 -0
  57. package/dist/tokenizer/preprocessor.js +194 -0
  58. package/dist/tree-adapters/default.d.ts +85 -0
  59. package/dist/tree-adapters/default.js +174 -0
  60. package/dist/tree-adapters/interface.d.ts +250 -0
  61. package/dist/tree-adapters/interface.js +2 -0
  62. package/package.json +19 -5
  63. package/lib/common/error-codes.js +0 -65
  64. package/lib/common/foreign-content.js +0 -265
  65. package/lib/common/html.js +0 -272
  66. package/lib/common/unicode.js +0 -109
  67. package/lib/extensions/error-reporting/mixin-base.js +0 -43
  68. package/lib/extensions/error-reporting/parser-mixin.js +0 -52
  69. package/lib/extensions/error-reporting/preprocessor-mixin.js +0 -24
  70. package/lib/extensions/error-reporting/tokenizer-mixin.js +0 -17
  71. package/lib/extensions/location-info/open-element-stack-mixin.js +0 -35
  72. package/lib/extensions/location-info/parser-mixin.js +0 -223
  73. package/lib/extensions/location-info/tokenizer-mixin.js +0 -146
  74. package/lib/extensions/position-tracking/preprocessor-mixin.js +0 -64
  75. package/lib/index.js +0 -29
  76. package/lib/parser/formatting-element-list.js +0 -181
  77. package/lib/parser/index.js +0 -2956
  78. package/lib/parser/open-element-stack.js +0 -482
  79. package/lib/serializer/index.js +0 -176
  80. package/lib/tokenizer/index.js +0 -2196
  81. package/lib/tokenizer/named-entity-data.js +0 -5
  82. package/lib/tokenizer/preprocessor.js +0 -159
  83. package/lib/tree-adapters/default.js +0 -221
  84. package/lib/utils/merge-options.js +0 -13
  85. package/lib/utils/mixin.js +0 -39
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isUndefinedCodePoint = exports.isControlCodePoint = exports.getSurrogatePairCodePoint = exports.isSurrogatePair = exports.isSurrogate = exports.SEQUENCES = exports.CODE_POINTS = exports.REPLACEMENT_CHARACTER = void 0;
4
+ const UNDEFINED_CODE_POINTS = new Set([
5
+ 65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143, 327678, 327679, 393214,
6
+ 393215, 458750, 458751, 524286, 524287, 589822, 589823, 655358, 655359, 720894,
7
+ 720895, 786430, 786431, 851966, 851967, 917502, 917503, 983038, 983039, 1048574,
8
+ 1048575, 1114110, 1114111,
9
+ ]);
10
+ exports.REPLACEMENT_CHARACTER = '\uFFFD';
11
+ var CODE_POINTS;
12
+ (function (CODE_POINTS) {
13
+ CODE_POINTS[CODE_POINTS["EOF"] = -1] = "EOF";
14
+ CODE_POINTS[CODE_POINTS["NULL"] = 0] = "NULL";
15
+ CODE_POINTS[CODE_POINTS["TABULATION"] = 9] = "TABULATION";
16
+ CODE_POINTS[CODE_POINTS["CARRIAGE_RETURN"] = 13] = "CARRIAGE_RETURN";
17
+ CODE_POINTS[CODE_POINTS["LINE_FEED"] = 10] = "LINE_FEED";
18
+ CODE_POINTS[CODE_POINTS["FORM_FEED"] = 12] = "FORM_FEED";
19
+ CODE_POINTS[CODE_POINTS["SPACE"] = 32] = "SPACE";
20
+ CODE_POINTS[CODE_POINTS["EXCLAMATION_MARK"] = 33] = "EXCLAMATION_MARK";
21
+ CODE_POINTS[CODE_POINTS["QUOTATION_MARK"] = 34] = "QUOTATION_MARK";
22
+ CODE_POINTS[CODE_POINTS["NUMBER_SIGN"] = 35] = "NUMBER_SIGN";
23
+ CODE_POINTS[CODE_POINTS["AMPERSAND"] = 38] = "AMPERSAND";
24
+ CODE_POINTS[CODE_POINTS["APOSTROPHE"] = 39] = "APOSTROPHE";
25
+ CODE_POINTS[CODE_POINTS["HYPHEN_MINUS"] = 45] = "HYPHEN_MINUS";
26
+ CODE_POINTS[CODE_POINTS["SOLIDUS"] = 47] = "SOLIDUS";
27
+ CODE_POINTS[CODE_POINTS["DIGIT_0"] = 48] = "DIGIT_0";
28
+ CODE_POINTS[CODE_POINTS["DIGIT_9"] = 57] = "DIGIT_9";
29
+ CODE_POINTS[CODE_POINTS["SEMICOLON"] = 59] = "SEMICOLON";
30
+ CODE_POINTS[CODE_POINTS["LESS_THAN_SIGN"] = 60] = "LESS_THAN_SIGN";
31
+ CODE_POINTS[CODE_POINTS["EQUALS_SIGN"] = 61] = "EQUALS_SIGN";
32
+ CODE_POINTS[CODE_POINTS["GREATER_THAN_SIGN"] = 62] = "GREATER_THAN_SIGN";
33
+ CODE_POINTS[CODE_POINTS["QUESTION_MARK"] = 63] = "QUESTION_MARK";
34
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_A"] = 65] = "LATIN_CAPITAL_A";
35
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_F"] = 70] = "LATIN_CAPITAL_F";
36
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_X"] = 88] = "LATIN_CAPITAL_X";
37
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_Z"] = 90] = "LATIN_CAPITAL_Z";
38
+ CODE_POINTS[CODE_POINTS["RIGHT_SQUARE_BRACKET"] = 93] = "RIGHT_SQUARE_BRACKET";
39
+ CODE_POINTS[CODE_POINTS["GRAVE_ACCENT"] = 96] = "GRAVE_ACCENT";
40
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_A"] = 97] = "LATIN_SMALL_A";
41
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_F"] = 102] = "LATIN_SMALL_F";
42
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_X"] = 120] = "LATIN_SMALL_X";
43
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_Z"] = 122] = "LATIN_SMALL_Z";
44
+ CODE_POINTS[CODE_POINTS["REPLACEMENT_CHARACTER"] = 65533] = "REPLACEMENT_CHARACTER";
45
+ })(CODE_POINTS = exports.CODE_POINTS || (exports.CODE_POINTS = {}));
46
+ exports.SEQUENCES = {
47
+ DASH_DASH: '--',
48
+ CDATA_START: '[CDATA[',
49
+ DOCTYPE: 'doctype',
50
+ SCRIPT: 'script',
51
+ PUBLIC: 'public',
52
+ SYSTEM: 'system',
53
+ };
54
+ //Surrogates
55
+ function isSurrogate(cp) {
56
+ return cp >= 55296 && cp <= 57343;
57
+ }
58
+ exports.isSurrogate = isSurrogate;
59
+ function isSurrogatePair(cp) {
60
+ return cp >= 56320 && cp <= 57343;
61
+ }
62
+ exports.isSurrogatePair = isSurrogatePair;
63
+ function getSurrogatePairCodePoint(cp1, cp2) {
64
+ return (cp1 - 55296) * 1024 + 9216 + cp2;
65
+ }
66
+ exports.getSurrogatePairCodePoint = getSurrogatePairCodePoint;
67
+ //NOTE: excluding NULL and ASCII whitespace
68
+ function isControlCodePoint(cp) {
69
+ return ((cp !== 0x20 && cp !== 0x0a && cp !== 0x0d && cp !== 0x09 && cp !== 0x0c && cp >= 0x01 && cp <= 0x1f) ||
70
+ (cp >= 0x7f && cp <= 0x9f));
71
+ }
72
+ exports.isControlCodePoint = isControlCodePoint;
73
+ function isUndefinedCodePoint(cp) {
74
+ return (cp >= 64976 && cp <= 65007) || UNDEFINED_CODE_POINTS.has(cp);
75
+ }
76
+ exports.isUndefinedCodePoint = isUndefinedCodePoint;
77
+ //# 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 = parse5.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
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseFragment = exports.parse = exports.TokenizerMode = exports.Tokenizer = exports.Token = exports.html = exports.foreignContent = exports.serializeOuter = exports.serialize = exports.Parser = exports.defaultTreeAdapter = void 0;
4
+ const index_js_1 = require("./parser/index.js");
5
+ var default_js_1 = require("./tree-adapters/default.js");
6
+ Object.defineProperty(exports, "defaultTreeAdapter", { enumerable: true, get: function () { return default_js_1.defaultTreeAdapter; } });
7
+ var index_js_2 = require("./parser/index.js");
8
+ Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return index_js_2.Parser; } });
9
+ var index_js_3 = require("./serializer/index.js");
10
+ Object.defineProperty(exports, "serialize", { enumerable: true, get: function () { return index_js_3.serialize; } });
11
+ Object.defineProperty(exports, "serializeOuter", { enumerable: true, get: function () { return index_js_3.serializeOuter; } });
12
+ /** @internal */
13
+ exports.foreignContent = require("./common/foreign-content.js");
14
+ /** @internal */
15
+ exports.html = require("./common/html.js");
16
+ /** @internal */
17
+ exports.Token = require("./common/token.js");
18
+ /** @internal */
19
+ var index_js_4 = require("./tokenizer/index.js");
20
+ Object.defineProperty(exports, "Tokenizer", { enumerable: true, get: function () { return index_js_4.Tokenizer; } });
21
+ Object.defineProperty(exports, "TokenizerMode", { enumerable: true, get: function () { return index_js_4.TokenizerMode; } });
22
+ // Shorthands
23
+ /**
24
+ * Parses an HTML string.
25
+ *
26
+ * @param html Input HTML string.
27
+ * @param options Parsing options.
28
+ * @returns Document
29
+ *
30
+ * @example
31
+ *
32
+ * ```js
33
+ * const parse5 = require('parse5');
34
+ *
35
+ * const document = parse5.parse('<!DOCTYPE html><html><head></head><body>Hi there!</body></html>');
36
+ *
37
+ * console.log(document.childNodes[1].tagName); //> 'html'
38
+ *```
39
+ */
40
+ function parse(html, options) {
41
+ return index_js_1.Parser.parse(html, options);
42
+ }
43
+ exports.parse = parse;
44
+ function parseFragment(fragmentContext, html, options) {
45
+ if (typeof fragmentContext === 'string') {
46
+ options = html;
47
+ html = fragmentContext;
48
+ fragmentContext = null;
49
+ }
50
+ const parser = index_js_1.Parser.getFragmentParser(fragmentContext, options);
51
+ parser.tokenizer.write(html, true);
52
+ return parser.getFragment();
53
+ }
54
+ exports.parseFragment = parseFragment;
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,37 @@
1
+ import type { TagToken } from '../common/token.js';
2
+ import type { TreeAdapter, TreeAdapterTypeMap } from '../tree-adapters/interface.js';
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
+ /**
28
+ * Clears the list of formatting elements up to the last marker.
29
+ *
30
+ * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
31
+ */
32
+ clearToLastMarker(): void;
33
+ getElementEntryInScopeWithTagName(tagName: string): ElementEntry<T> | null;
34
+ getElementEntry(element: T['element']): ElementEntry<T> | undefined;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=formatting-element-list.d.ts.map
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FormattingElementList = exports.EntryType = void 0;
4
+ //Const
5
+ const NOAH_ARK_CAPACITY = 3;
6
+ var EntryType;
7
+ (function (EntryType) {
8
+ EntryType[EntryType["Marker"] = 0] = "Marker";
9
+ EntryType[EntryType["Element"] = 1] = "Element";
10
+ })(EntryType = exports.EntryType || (exports.EntryType = {}));
11
+ const MARKER = { type: EntryType.Marker };
12
+ //List of formatting elements
13
+ class FormattingElementList {
14
+ constructor(treeAdapter) {
15
+ this.treeAdapter = treeAdapter;
16
+ this.entries = [];
17
+ this.bookmark = null;
18
+ }
19
+ //Noah Ark's condition
20
+ //OPTIMIZATION: at first we try to find possible candidates for exclusion using
21
+ //lightweight heuristics without thorough attributes check.
22
+ _getNoahArkConditionCandidates(newElement, neAttrs) {
23
+ const candidates = [];
24
+ const neAttrsLength = neAttrs.length;
25
+ const neTagName = this.treeAdapter.getTagName(newElement);
26
+ const neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement);
27
+ for (let i = 0; i < this.entries.length; i++) {
28
+ const entry = this.entries[i];
29
+ if (entry.type === EntryType.Marker) {
30
+ break;
31
+ }
32
+ const { element } = entry;
33
+ if (this.treeAdapter.getTagName(element) === neTagName &&
34
+ this.treeAdapter.getNamespaceURI(element) === neNamespaceURI) {
35
+ const elementAttrs = this.treeAdapter.getAttrList(element);
36
+ if (elementAttrs.length === neAttrsLength) {
37
+ candidates.push({ idx: i, attrs: elementAttrs });
38
+ }
39
+ }
40
+ }
41
+ return candidates;
42
+ }
43
+ _ensureNoahArkCondition(newElement) {
44
+ if (this.entries.length < NOAH_ARK_CAPACITY)
45
+ return;
46
+ const neAttrs = this.treeAdapter.getAttrList(newElement);
47
+ const candidates = this._getNoahArkConditionCandidates(newElement, neAttrs);
48
+ if (candidates.length < NOAH_ARK_CAPACITY)
49
+ return;
50
+ //NOTE: build attrs map for the new element, so we can perform fast lookups
51
+ const neAttrsMap = new Map(neAttrs.map((neAttr) => [neAttr.name, neAttr.value]));
52
+ let validCandidates = 0;
53
+ //NOTE: remove bottommost candidates, until Noah's Ark condition will not be met
54
+ for (let i = 0; i < candidates.length; i++) {
55
+ const candidate = candidates[i];
56
+ // We know that `candidate.attrs.length === neAttrs.length`
57
+ if (candidate.attrs.every((cAttr) => neAttrsMap.get(cAttr.name) === cAttr.value)) {
58
+ validCandidates += 1;
59
+ if (validCandidates >= NOAH_ARK_CAPACITY) {
60
+ this.entries.splice(candidate.idx, 1);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ //Mutations
66
+ insertMarker() {
67
+ this.entries.unshift(MARKER);
68
+ }
69
+ pushElement(element, token) {
70
+ this._ensureNoahArkCondition(element);
71
+ this.entries.unshift({
72
+ type: EntryType.Element,
73
+ element,
74
+ token,
75
+ });
76
+ }
77
+ insertElementAfterBookmark(element, token) {
78
+ const bookmarkIdx = this.entries.indexOf(this.bookmark);
79
+ this.entries.splice(bookmarkIdx, 0, {
80
+ type: EntryType.Element,
81
+ element,
82
+ token,
83
+ });
84
+ }
85
+ removeEntry(entry) {
86
+ const entryIndex = this.entries.indexOf(entry);
87
+ if (entryIndex >= 0) {
88
+ this.entries.splice(entryIndex, 1);
89
+ }
90
+ }
91
+ /**
92
+ * Clears the list of formatting elements up to the last marker.
93
+ *
94
+ * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
95
+ */
96
+ clearToLastMarker() {
97
+ const markerIdx = this.entries.indexOf(MARKER);
98
+ if (markerIdx >= 0) {
99
+ this.entries.splice(0, markerIdx + 1);
100
+ }
101
+ else {
102
+ this.entries.length = 0;
103
+ }
104
+ }
105
+ //Search
106
+ getElementEntryInScopeWithTagName(tagName) {
107
+ const entry = this.entries.find((entry) => entry.type === EntryType.Marker || this.treeAdapter.getTagName(entry.element) === tagName);
108
+ return entry && entry.type === EntryType.Element ? entry : null;
109
+ }
110
+ getElementEntry(element) {
111
+ return this.entries.find((entry) => entry.type === EntryType.Element && entry.element === element);
112
+ }
113
+ }
114
+ exports.FormattingElementList = FormattingElementList;
115
+ //# 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