@playdrop/playdrop-cli 0.12.42 → 0.13.1
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.
- package/config/client-meta.json +2 -2
- package/dist/apps/index.d.ts +2 -0
- package/dist/apps/index.js +2 -1
- package/dist/apps/loadCheck.d.ts +4 -1
- package/dist/apps/loadCheck.js +40 -10
- package/dist/apps/staticHtml.d.ts +28 -0
- package/dist/apps/staticHtml.js +343 -0
- package/dist/apps/validate.js +2 -1
- package/dist/commands/captureListing.d.ts +1 -1
- package/dist/commands/captureListing.js +4 -3
- package/dist/commands/devServer.js +19 -0
- package/dist/commands/feedback.d.ts +2 -0
- package/dist/commands/feedback.js +44 -2
- package/dist/commands/upload.d.ts +24 -0
- package/dist/commands/upload.js +122 -4
- package/dist/commands/worker/instrument-evidence.js +1 -1
- package/dist/commands/worker/runtime.d.ts +15 -0
- package/dist/commands/worker/runtime.js +121 -11
- package/dist/commands/worker.d.ts +28 -2
- package/dist/commands/worker.js +843 -170
- package/dist/index.js +7 -0
- package/dist/listingPreflight.js +15 -4
- package/dist/recorderRelease.d.ts +18 -0
- package/dist/recorderRelease.js +90 -0
- package/node_modules/@playdrop/api-client/dist/client.d.ts +5 -2
- package/node_modules/@playdrop/api-client/dist/client.d.ts.map +1 -1
- package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.d.ts +3 -2
- package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.d.ts.map +1 -1
- package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.js +13 -2
- package/node_modules/@playdrop/api-client/dist/domains/apps.d.ts +2 -1
- package/node_modules/@playdrop/api-client/dist/domains/apps.d.ts.map +1 -1
- package/node_modules/@playdrop/api-client/dist/domains/me.d.ts +2 -1
- package/node_modules/@playdrop/api-client/dist/domains/me.d.ts.map +1 -1
- package/node_modules/@playdrop/api-client/dist/domains/me.js +11 -0
- package/node_modules/@playdrop/api-client/dist/index.d.ts +6 -3
- package/node_modules/@playdrop/api-client/dist/index.d.ts.map +1 -1
- package/node_modules/@playdrop/api-client/dist/index.js +14 -2
- package/node_modules/@playdrop/config/client-meta.json +2 -2
- package/node_modules/@playdrop/config/dist/src/constants.d.ts +1 -0
- package/node_modules/@playdrop/config/dist/src/constants.d.ts.map +1 -1
- package/node_modules/@playdrop/config/dist/src/constants.js +1 -0
- package/node_modules/@playdrop/config/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@playdrop/types/dist/api.d.ts +195 -4
- package/node_modules/@playdrop/types/dist/api.d.ts.map +1 -1
- package/node_modules/@playdrop/types/dist/api.js +25 -2
- package/node_modules/entities/decode-codepoint.d.ts +19 -0
- package/node_modules/entities/decode-codepoint.d.ts.map +1 -0
- package/node_modules/entities/decode-codepoint.js +77 -0
- package/node_modules/entities/decode-codepoint.js.map +1 -0
- package/node_modules/entities/decode.d.ts +209 -0
- package/node_modules/entities/decode.d.ts.map +1 -0
- package/node_modules/entities/decode.js +511 -0
- package/node_modules/entities/decode.js.map +1 -0
- package/node_modules/entities/encode.d.ts +22 -0
- package/node_modules/entities/encode.d.ts.map +1 -0
- package/node_modules/entities/encode.js +73 -0
- package/node_modules/entities/encode.js.map +1 -0
- package/node_modules/entities/escape.d.ts +43 -0
- package/node_modules/entities/escape.d.ts.map +1 -0
- package/node_modules/entities/escape.js +121 -0
- package/node_modules/entities/escape.js.map +1 -0
- package/node_modules/entities/generated/decode-data-html.d.ts +2 -0
- package/node_modules/entities/generated/decode-data-html.d.ts.map +1 -0
- package/node_modules/entities/generated/decode-data-html.js +10 -0
- package/node_modules/entities/generated/decode-data-html.js.map +1 -0
- package/node_modules/entities/generated/decode-data-xml.d.ts +2 -0
- package/node_modules/entities/generated/decode-data-xml.d.ts.map +1 -0
- package/node_modules/entities/generated/decode-data-xml.js +10 -0
- package/node_modules/entities/generated/decode-data-xml.js.map +1 -0
- package/node_modules/entities/generated/encode-html.d.ts +8 -0
- package/node_modules/entities/generated/encode-html.d.ts.map +1 -0
- package/node_modules/entities/generated/encode-html.js +13 -0
- package/node_modules/entities/generated/encode-html.js.map +1 -0
- package/node_modules/entities/index.d.ts +96 -0
- package/node_modules/entities/index.d.ts.map +1 -0
- package/node_modules/entities/index.js +131 -0
- package/node_modules/entities/index.js.map +1 -0
- package/node_modules/entities/package.json +3 -0
- package/node_modules/parse5/common/doctype.d.ts +4 -0
- package/node_modules/parse5/common/doctype.js +118 -0
- package/node_modules/parse5/common/error-codes.d.ts +67 -0
- package/node_modules/parse5/common/error-codes.js +66 -0
- package/node_modules/parse5/common/foreign-content.d.ts +9 -0
- package/node_modules/parse5/common/foreign-content.js +237 -0
- package/node_modules/parse5/common/html.d.ts +289 -0
- package/node_modules/parse5/common/html.js +528 -0
- package/node_modules/parse5/common/token.d.ts +84 -0
- package/node_modules/parse5/common/token.js +24 -0
- package/node_modules/parse5/common/unicode.d.ts +42 -0
- package/node_modules/parse5/common/unicode.js +70 -0
- package/node_modules/parse5/index.d.ts +71 -0
- package/node_modules/parse5/index.js +54 -0
- package/node_modules/parse5/package.json +1 -0
- package/node_modules/parse5/parser/formatting-element-list.d.ts +36 -0
- package/node_modules/parse5/parser/formatting-element-list.js +114 -0
- package/node_modules/parse5/parser/index.d.ts +221 -0
- package/node_modules/parse5/parser/index.js +3240 -0
- package/node_modules/parse5/parser/open-element-stack.d.ts +53 -0
- package/node_modules/parse5/parser/open-element-stack.js +328 -0
- package/node_modules/parse5/serializer/index.d.ts +60 -0
- package/node_modules/parse5/serializer/index.js +172 -0
- package/node_modules/parse5/tokenizer/index.d.ts +247 -0
- package/node_modules/parse5/tokenizer/index.js +2714 -0
- package/node_modules/parse5/tokenizer/preprocessor.d.ts +36 -0
- package/node_modules/parse5/tokenizer/preprocessor.js +200 -0
- package/node_modules/parse5/tree-adapters/default.d.ts +84 -0
- package/node_modules/parse5/tree-adapters/default.js +176 -0
- package/node_modules/parse5/tree-adapters/interface.d.ts +255 -0
- package/node_modules/parse5/tree-adapters/interface.js +2 -0
- package/package.json +8 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SEQUENCES = exports.CODE_POINTS = exports.REPLACEMENT_CHARACTER = void 0;
|
|
4
|
+
exports.isSurrogate = isSurrogate;
|
|
5
|
+
exports.isSurrogatePair = isSurrogatePair;
|
|
6
|
+
exports.getSurrogatePairCodePoint = getSurrogatePairCodePoint;
|
|
7
|
+
exports.isControlCodePoint = isControlCodePoint;
|
|
8
|
+
exports.isUndefinedCodePoint = isUndefinedCodePoint;
|
|
9
|
+
const UNDEFINED_CODE_POINTS = new Set([
|
|
10
|
+
65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143, 327678, 327679, 393214,
|
|
11
|
+
393215, 458750, 458751, 524286, 524287, 589822, 589823, 655358, 655359, 720894,
|
|
12
|
+
720895, 786430, 786431, 851966, 851967, 917502, 917503, 983038, 983039, 1048574,
|
|
13
|
+
1048575, 1114110, 1114111,
|
|
14
|
+
]);
|
|
15
|
+
exports.REPLACEMENT_CHARACTER = '\uFFFD';
|
|
16
|
+
var CODE_POINTS;
|
|
17
|
+
(function (CODE_POINTS) {
|
|
18
|
+
CODE_POINTS[CODE_POINTS["EOF"] = -1] = "EOF";
|
|
19
|
+
CODE_POINTS[CODE_POINTS["NULL"] = 0] = "NULL";
|
|
20
|
+
CODE_POINTS[CODE_POINTS["TABULATION"] = 9] = "TABULATION";
|
|
21
|
+
CODE_POINTS[CODE_POINTS["CARRIAGE_RETURN"] = 13] = "CARRIAGE_RETURN";
|
|
22
|
+
CODE_POINTS[CODE_POINTS["LINE_FEED"] = 10] = "LINE_FEED";
|
|
23
|
+
CODE_POINTS[CODE_POINTS["FORM_FEED"] = 12] = "FORM_FEED";
|
|
24
|
+
CODE_POINTS[CODE_POINTS["SPACE"] = 32] = "SPACE";
|
|
25
|
+
CODE_POINTS[CODE_POINTS["EXCLAMATION_MARK"] = 33] = "EXCLAMATION_MARK";
|
|
26
|
+
CODE_POINTS[CODE_POINTS["QUOTATION_MARK"] = 34] = "QUOTATION_MARK";
|
|
27
|
+
CODE_POINTS[CODE_POINTS["AMPERSAND"] = 38] = "AMPERSAND";
|
|
28
|
+
CODE_POINTS[CODE_POINTS["APOSTROPHE"] = 39] = "APOSTROPHE";
|
|
29
|
+
CODE_POINTS[CODE_POINTS["HYPHEN_MINUS"] = 45] = "HYPHEN_MINUS";
|
|
30
|
+
CODE_POINTS[CODE_POINTS["SOLIDUS"] = 47] = "SOLIDUS";
|
|
31
|
+
CODE_POINTS[CODE_POINTS["DIGIT_0"] = 48] = "DIGIT_0";
|
|
32
|
+
CODE_POINTS[CODE_POINTS["DIGIT_9"] = 57] = "DIGIT_9";
|
|
33
|
+
CODE_POINTS[CODE_POINTS["SEMICOLON"] = 59] = "SEMICOLON";
|
|
34
|
+
CODE_POINTS[CODE_POINTS["LESS_THAN_SIGN"] = 60] = "LESS_THAN_SIGN";
|
|
35
|
+
CODE_POINTS[CODE_POINTS["EQUALS_SIGN"] = 61] = "EQUALS_SIGN";
|
|
36
|
+
CODE_POINTS[CODE_POINTS["GREATER_THAN_SIGN"] = 62] = "GREATER_THAN_SIGN";
|
|
37
|
+
CODE_POINTS[CODE_POINTS["QUESTION_MARK"] = 63] = "QUESTION_MARK";
|
|
38
|
+
CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_A"] = 65] = "LATIN_CAPITAL_A";
|
|
39
|
+
CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_Z"] = 90] = "LATIN_CAPITAL_Z";
|
|
40
|
+
CODE_POINTS[CODE_POINTS["RIGHT_SQUARE_BRACKET"] = 93] = "RIGHT_SQUARE_BRACKET";
|
|
41
|
+
CODE_POINTS[CODE_POINTS["GRAVE_ACCENT"] = 96] = "GRAVE_ACCENT";
|
|
42
|
+
CODE_POINTS[CODE_POINTS["LATIN_SMALL_A"] = 97] = "LATIN_SMALL_A";
|
|
43
|
+
CODE_POINTS[CODE_POINTS["LATIN_SMALL_Z"] = 122] = "LATIN_SMALL_Z";
|
|
44
|
+
})(CODE_POINTS || (exports.CODE_POINTS = CODE_POINTS = {}));
|
|
45
|
+
exports.SEQUENCES = {
|
|
46
|
+
DASH_DASH: '--',
|
|
47
|
+
CDATA_START: '[CDATA[',
|
|
48
|
+
DOCTYPE: 'doctype',
|
|
49
|
+
SCRIPT: 'script',
|
|
50
|
+
PUBLIC: 'public',
|
|
51
|
+
SYSTEM: 'system',
|
|
52
|
+
};
|
|
53
|
+
//Surrogates
|
|
54
|
+
function isSurrogate(cp) {
|
|
55
|
+
return cp >= 55296 && cp <= 57343;
|
|
56
|
+
}
|
|
57
|
+
function isSurrogatePair(cp) {
|
|
58
|
+
return cp >= 56320 && cp <= 57343;
|
|
59
|
+
}
|
|
60
|
+
function getSurrogatePairCodePoint(cp1, cp2) {
|
|
61
|
+
return (cp1 - 55296) * 1024 + 9216 + cp2;
|
|
62
|
+
}
|
|
63
|
+
//NOTE: excluding NULL and ASCII whitespace
|
|
64
|
+
function isControlCodePoint(cp) {
|
|
65
|
+
return ((cp !== 0x20 && cp !== 0x0a && cp !== 0x0d && cp !== 0x09 && cp !== 0x0c && cp >= 0x01 && cp <= 0x1f) ||
|
|
66
|
+
(cp >= 0x7f && cp <= 0x9f));
|
|
67
|
+
}
|
|
68
|
+
function isUndefinedCodePoint(cp) {
|
|
69
|
+
return (cp >= 64976 && cp <= 65007) || UNDEFINED_CODE_POINTS.has(cp);
|
|
70
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
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
|
+
import type * as DefaultTreeAdapter from './tree-adapters/default.js';
|
|
6
|
+
export declare namespace DefaultTreeAdapterTypes {
|
|
7
|
+
type Document = DefaultTreeAdapter.Document;
|
|
8
|
+
type DocumentFragment = DefaultTreeAdapter.DocumentFragment;
|
|
9
|
+
type Element = DefaultTreeAdapter.Element;
|
|
10
|
+
type CommentNode = DefaultTreeAdapter.CommentNode;
|
|
11
|
+
type TextNode = DefaultTreeAdapter.TextNode;
|
|
12
|
+
type Template = DefaultTreeAdapter.Template;
|
|
13
|
+
type DocumentType = DefaultTreeAdapter.DocumentType;
|
|
14
|
+
type ParentNode = DefaultTreeAdapter.ParentNode;
|
|
15
|
+
type ChildNode = DefaultTreeAdapter.ChildNode;
|
|
16
|
+
type Node = DefaultTreeAdapter.Node;
|
|
17
|
+
type DefaultTreeAdapterMap = DefaultTreeAdapter.DefaultTreeAdapterMap;
|
|
18
|
+
}
|
|
19
|
+
export type { TreeAdapter, TreeAdapterTypeMap } from './tree-adapters/interface.js';
|
|
20
|
+
export { type ParserOptions, /** @internal */ Parser } from './parser/index.js';
|
|
21
|
+
export { serialize, serializeOuter, type SerializerOptions } from './serializer/index.js';
|
|
22
|
+
export { ERR as ErrorCodes, type ParserError, type ParserErrorHandler } from './common/error-codes.js';
|
|
23
|
+
/** @internal */
|
|
24
|
+
export * as foreignContent from './common/foreign-content.js';
|
|
25
|
+
export * as html from './common/html.js';
|
|
26
|
+
export * as Token from './common/token.js';
|
|
27
|
+
/** @internal */
|
|
28
|
+
export { Tokenizer, type TokenizerOptions, TokenizerMode, type TokenHandler } from './tokenizer/index.js';
|
|
29
|
+
/**
|
|
30
|
+
* Parses an HTML string.
|
|
31
|
+
*
|
|
32
|
+
* @param html Input HTML string.
|
|
33
|
+
* @param options Parsing options.
|
|
34
|
+
* @returns Document
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
*
|
|
38
|
+
* ```js
|
|
39
|
+
* const parse5 = require('parse5');
|
|
40
|
+
*
|
|
41
|
+
* const document = parse5.parse('<!DOCTYPE html><html><head></head><body>Hi there!</body></html>');
|
|
42
|
+
*
|
|
43
|
+
* console.log(document.childNodes[1].tagName); //> 'html'
|
|
44
|
+
*```
|
|
45
|
+
*/
|
|
46
|
+
export declare function parse<T extends TreeAdapterTypeMap = DefaultTreeAdapterMap>(html: string, options?: ParserOptions<T>): T['document'];
|
|
47
|
+
/**
|
|
48
|
+
* Parses an HTML fragment.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
*
|
|
52
|
+
* ```js
|
|
53
|
+
* const parse5 = require('parse5');
|
|
54
|
+
*
|
|
55
|
+
* const documentFragment = parse5.parseFragment('<table></table>');
|
|
56
|
+
*
|
|
57
|
+
* console.log(documentFragment.childNodes[0].tagName); //> 'table'
|
|
58
|
+
*
|
|
59
|
+
* // Parses the html fragment in the context of the parsed <table> element.
|
|
60
|
+
* const trFragment = parse5.parseFragment(documentFragment.childNodes[0], '<tr><td>Shake it, baby</td></tr>');
|
|
61
|
+
*
|
|
62
|
+
* console.log(trFragment.childNodes[0].childNodes[0].tagName); //> 'td'
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @param fragmentContext Parsing context element. If specified, given fragment will be parsed as if it was set to the context element's `innerHTML` property.
|
|
66
|
+
* @param html Input HTML fragment string.
|
|
67
|
+
* @param options Parsing options.
|
|
68
|
+
* @returns DocumentFragment
|
|
69
|
+
*/
|
|
70
|
+
export declare function parseFragment<T extends TreeAdapterTypeMap = DefaultTreeAdapterMap>(fragmentContext: T['parentNode'] | null, html: string, options: ParserOptions<T>): T['documentFragment'];
|
|
71
|
+
export declare function parseFragment<T extends TreeAdapterTypeMap = DefaultTreeAdapterMap>(html: string, options?: ParserOptions<T>): T['documentFragment'];
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TokenizerMode = exports.Tokenizer = exports.Token = exports.html = exports.foreignContent = exports.ErrorCodes = exports.serializeOuter = exports.serialize = exports.Parser = exports.defaultTreeAdapter = void 0;
|
|
4
|
+
exports.parse = parse;
|
|
5
|
+
exports.parseFragment = parseFragment;
|
|
6
|
+
const index_js_1 = require("./parser/index.js");
|
|
7
|
+
var default_js_1 = require("./tree-adapters/default.js");
|
|
8
|
+
Object.defineProperty(exports, "defaultTreeAdapter", { enumerable: true, get: function () { return default_js_1.defaultTreeAdapter; } });
|
|
9
|
+
var index_js_2 = require("./parser/index.js");
|
|
10
|
+
Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return index_js_2.Parser; } });
|
|
11
|
+
var index_js_3 = require("./serializer/index.js");
|
|
12
|
+
Object.defineProperty(exports, "serialize", { enumerable: true, get: function () { return index_js_3.serialize; } });
|
|
13
|
+
Object.defineProperty(exports, "serializeOuter", { enumerable: true, get: function () { return index_js_3.serializeOuter; } });
|
|
14
|
+
var error_codes_js_1 = require("./common/error-codes.js");
|
|
15
|
+
Object.defineProperty(exports, "ErrorCodes", { enumerable: true, get: function () { return error_codes_js_1.ERR; } });
|
|
16
|
+
/** @internal */
|
|
17
|
+
exports.foreignContent = require("./common/foreign-content.js");
|
|
18
|
+
exports.html = require("./common/html.js");
|
|
19
|
+
exports.Token = require("./common/token.js");
|
|
20
|
+
/** @internal */
|
|
21
|
+
var index_js_4 = require("./tokenizer/index.js");
|
|
22
|
+
Object.defineProperty(exports, "Tokenizer", { enumerable: true, get: function () { return index_js_4.Tokenizer; } });
|
|
23
|
+
Object.defineProperty(exports, "TokenizerMode", { enumerable: true, get: function () { return index_js_4.TokenizerMode; } });
|
|
24
|
+
// Shorthands
|
|
25
|
+
/**
|
|
26
|
+
* Parses an HTML string.
|
|
27
|
+
*
|
|
28
|
+
* @param html Input HTML string.
|
|
29
|
+
* @param options Parsing options.
|
|
30
|
+
* @returns Document
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
*
|
|
34
|
+
* ```js
|
|
35
|
+
* const parse5 = require('parse5');
|
|
36
|
+
*
|
|
37
|
+
* const document = parse5.parse('<!DOCTYPE html><html><head></head><body>Hi there!</body></html>');
|
|
38
|
+
*
|
|
39
|
+
* console.log(document.childNodes[1].tagName); //> 'html'
|
|
40
|
+
*```
|
|
41
|
+
*/
|
|
42
|
+
function parse(html, options) {
|
|
43
|
+
return index_js_1.Parser.parse(html, options);
|
|
44
|
+
}
|
|
45
|
+
function parseFragment(fragmentContext, html, options) {
|
|
46
|
+
if (typeof fragmentContext === 'string') {
|
|
47
|
+
options = html;
|
|
48
|
+
html = fragmentContext;
|
|
49
|
+
fragmentContext = null;
|
|
50
|
+
}
|
|
51
|
+
const parser = index_js_1.Parser.getFragmentParser(fragmentContext, options);
|
|
52
|
+
parser.tokenizer.write(html, true);
|
|
53
|
+
return parser.getFragment();
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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 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 {};
|
|
@@ -0,0 +1,114 @@
|
|
|
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 = 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 !== -1) {
|
|
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 === -1) {
|
|
99
|
+
this.entries.length = 0;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.entries.splice(0, markerIdx + 1);
|
|
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;
|
|
@@ -0,0 +1,221 @@
|
|
|
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
|
+
/** @internal */
|
|
67
|
+
fragmentContext: T['element'] | null;
|
|
68
|
+
/** @internal */
|
|
69
|
+
scriptHandler: null | ((pendingScript: T['element']) => void);
|
|
70
|
+
treeAdapter: TreeAdapter<T>;
|
|
71
|
+
/** @internal */
|
|
72
|
+
onParseError: ParserErrorHandler | null;
|
|
73
|
+
protected currentToken: Token | null;
|
|
74
|
+
options: Required<ParserOptions<T>>;
|
|
75
|
+
document: T['document'];
|
|
76
|
+
constructor(options?: ParserOptions<T>, document?: T['document'],
|
|
77
|
+
/** @internal */
|
|
78
|
+
fragmentContext?: T['element'] | null,
|
|
79
|
+
/** @internal */
|
|
80
|
+
scriptHandler?: null | ((pendingScript: T['element']) => void));
|
|
81
|
+
static parse<T extends TreeAdapterTypeMap>(html: string, options?: ParserOptions<T>): T['document'];
|
|
82
|
+
static getFragmentParser<T extends TreeAdapterTypeMap>(fragmentContext?: T['parentNode'] | null, options?: ParserOptions<T>): Parser<T>;
|
|
83
|
+
getFragment(): T['documentFragment'];
|
|
84
|
+
tokenizer: Tokenizer;
|
|
85
|
+
stopped: boolean;
|
|
86
|
+
/** @internal */
|
|
87
|
+
insertionMode: InsertionMode;
|
|
88
|
+
/** @internal */
|
|
89
|
+
originalInsertionMode: InsertionMode;
|
|
90
|
+
/** @internal */
|
|
91
|
+
fragmentContextID: $;
|
|
92
|
+
/** @internal */
|
|
93
|
+
headElement: null | T['element'];
|
|
94
|
+
/** @internal */
|
|
95
|
+
formElement: null | T['element'];
|
|
96
|
+
/** @internal */
|
|
97
|
+
openElements: OpenElementStack<T>;
|
|
98
|
+
/** @internal */
|
|
99
|
+
activeFormattingElements: FormattingElementList<T>;
|
|
100
|
+
/** Indicates that the current node is not an element in the HTML namespace */
|
|
101
|
+
protected currentNotInHTML: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* The template insertion mode stack is maintained from the left.
|
|
104
|
+
* Ie. the topmost element will always have index 0.
|
|
105
|
+
*
|
|
106
|
+
* @internal
|
|
107
|
+
*/
|
|
108
|
+
tmplInsertionModeStack: InsertionMode[];
|
|
109
|
+
/** @internal */
|
|
110
|
+
pendingCharacterTokens: CharacterToken[];
|
|
111
|
+
/** @internal */
|
|
112
|
+
hasNonWhitespacePendingCharacterToken: boolean;
|
|
113
|
+
/** @internal */
|
|
114
|
+
framesetOk: boolean;
|
|
115
|
+
/** @internal */
|
|
116
|
+
skipNextNewLine: boolean;
|
|
117
|
+
/** @internal */
|
|
118
|
+
fosterParentingEnabled: boolean;
|
|
119
|
+
/** @internal */
|
|
120
|
+
_err(token: Token, code: ERR, beforeToken?: boolean): void;
|
|
121
|
+
/** @internal */
|
|
122
|
+
onItemPush(node: T['parentNode'], tid: number, isTop: boolean): void;
|
|
123
|
+
/** @internal */
|
|
124
|
+
onItemPop(node: T['parentNode'], isTop: boolean): void;
|
|
125
|
+
protected _setContextModes(current: T['parentNode'] | undefined, tid: number | undefined): void;
|
|
126
|
+
/** @protected */
|
|
127
|
+
_switchToTextParsing(currentToken: TagToken, nextTokenizerState: (typeof TokenizerMode)[keyof typeof TokenizerMode]): void;
|
|
128
|
+
switchToPlaintextParsing(): void;
|
|
129
|
+
/** @protected */
|
|
130
|
+
_getAdjustedCurrentElement(): T['element'];
|
|
131
|
+
/** @protected */
|
|
132
|
+
_findFormInFragmentContext(): void;
|
|
133
|
+
protected _initTokenizerForFragmentParsing(): void;
|
|
134
|
+
/** @protected */
|
|
135
|
+
_setDocumentType(token: DoctypeToken): void;
|
|
136
|
+
/** @protected */
|
|
137
|
+
_attachElementToTree(element: T['element'], location: LocationWithAttributes | null): void;
|
|
138
|
+
/**
|
|
139
|
+
* For self-closing tags. Add an element to the tree, but skip adding it
|
|
140
|
+
* to the stack.
|
|
141
|
+
*/
|
|
142
|
+
/** @protected */
|
|
143
|
+
_appendElement(token: TagToken, namespaceURI: NS): void;
|
|
144
|
+
/** @protected */
|
|
145
|
+
_insertElement(token: TagToken, namespaceURI: NS): void;
|
|
146
|
+
/** @protected */
|
|
147
|
+
_insertFakeElement(tagName: string, tagID: $): void;
|
|
148
|
+
/** @protected */
|
|
149
|
+
_insertTemplate(token: TagToken): void;
|
|
150
|
+
/** @protected */
|
|
151
|
+
_insertFakeRootElement(): void;
|
|
152
|
+
/** @protected */
|
|
153
|
+
_appendCommentNode(token: CommentToken, parent: T['parentNode']): void;
|
|
154
|
+
/** @protected */
|
|
155
|
+
_insertCharacters(token: CharacterToken): void;
|
|
156
|
+
/** @protected */
|
|
157
|
+
_adoptNodes(donor: T['parentNode'], recipient: T['parentNode']): void;
|
|
158
|
+
/** @protected */
|
|
159
|
+
_setEndLocation(element: T['element'], closingToken: Token): void;
|
|
160
|
+
protected shouldProcessStartTagTokenInForeignContent(token: TagToken): boolean;
|
|
161
|
+
/** @protected */
|
|
162
|
+
_processToken(token: Token): void;
|
|
163
|
+
/** @protected */
|
|
164
|
+
_isIntegrationPoint(tid: $, element: T['element'], foreignNS?: NS): boolean;
|
|
165
|
+
/** @protected */
|
|
166
|
+
_reconstructActiveFormattingElements(): void;
|
|
167
|
+
/** @protected */
|
|
168
|
+
_closeTableCell(): void;
|
|
169
|
+
/** @protected */
|
|
170
|
+
_closePElement(): void;
|
|
171
|
+
/** @protected */
|
|
172
|
+
_resetInsertionMode(): void;
|
|
173
|
+
/** @protected */
|
|
174
|
+
_resetInsertionModeForSelect(selectIdx: number): void;
|
|
175
|
+
/** @protected */
|
|
176
|
+
_isElementCausesFosterParenting(tn: $): boolean;
|
|
177
|
+
/** @protected */
|
|
178
|
+
_shouldFosterParentOnInsertion(): boolean;
|
|
179
|
+
/** @protected */
|
|
180
|
+
_findFosterParentingLocation(): {
|
|
181
|
+
parent: T['parentNode'];
|
|
182
|
+
beforeElement: T['element'] | null;
|
|
183
|
+
};
|
|
184
|
+
/** @protected */
|
|
185
|
+
_fosterParentElement(element: T['element']): void;
|
|
186
|
+
/** @protected */
|
|
187
|
+
_isSpecialElement(element: T['element'], id: $): boolean;
|
|
188
|
+
/** @internal */
|
|
189
|
+
onCharacter(token: CharacterToken): void;
|
|
190
|
+
/** @internal */
|
|
191
|
+
onNullCharacter(token: CharacterToken): void;
|
|
192
|
+
/** @internal */
|
|
193
|
+
onComment(token: CommentToken): void;
|
|
194
|
+
/** @internal */
|
|
195
|
+
onDoctype(token: DoctypeToken): void;
|
|
196
|
+
/** @internal */
|
|
197
|
+
onStartTag(token: TagToken): void;
|
|
198
|
+
/**
|
|
199
|
+
* Processes a given start tag.
|
|
200
|
+
*
|
|
201
|
+
* `onStartTag` checks if a self-closing tag was recognized. When a token
|
|
202
|
+
* is moved inbetween multiple insertion modes, this check for self-closing
|
|
203
|
+
* could lead to false positives. To avoid this, `_processStartTag` is used
|
|
204
|
+
* for nested calls.
|
|
205
|
+
*
|
|
206
|
+
* @param token The token to process.
|
|
207
|
+
* @protected
|
|
208
|
+
*/
|
|
209
|
+
_processStartTag(token: TagToken): void;
|
|
210
|
+
/** @protected */
|
|
211
|
+
_startTagOutsideForeignContent(token: TagToken): void;
|
|
212
|
+
/** @internal */
|
|
213
|
+
onEndTag(token: TagToken): void;
|
|
214
|
+
/** @protected */
|
|
215
|
+
_endTagOutsideForeignContent(token: TagToken): void;
|
|
216
|
+
/** @internal */
|
|
217
|
+
onEof(token: EOFToken): void;
|
|
218
|
+
/** @internal */
|
|
219
|
+
onWhitespaceCharacter(token: CharacterToken): void;
|
|
220
|
+
}
|
|
221
|
+
export {};
|