webforai 4.2.0 → 4.3.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.
- package/dist/adapters/sites/youtube.js +4 -2
- package/dist/bin.js +662 -474
- package/dist/cjs/adapters/sites/youtube.js +5 -2
- package/dist/cjs/detect-client-shell.js +2 -0
- package/dist/cjs/extractors/lib/terminators.js +2 -0
- package/dist/cjs/index.js +3 -0
- package/dist/cjs/mdast-handlers/custom-code-handler.js +31 -2
- package/dist/cjs/normalize/index.js +97 -4
- package/dist/cjs/utils/detect-code-lang.js +4 -5
- package/dist/cjs/utils/parse-html.js +73 -5
- package/dist/detect-client-shell.js +1 -0
- package/dist/extractors/lib/terminators.js +2 -0
- package/dist/index.js +2 -0
- package/dist/mdast-handlers/custom-code-handler.js +31 -2
- package/dist/normalize/index.js +94 -3
- package/dist/types/adapters/sites/youtube.d.ts +2 -0
- package/dist/types/adapters/sites/youtube.js.map +1 -1
- package/dist/types/detect-client-shell.d.ts +2 -0
- package/dist/types/detect-client-shell.js.map +1 -1
- package/dist/types/extractors/lib/terminators.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/mdast-handlers/custom-code-handler.d.ts +5 -0
- package/dist/types/mdast-handlers/custom-code-handler.js.map +1 -1
- package/dist/types/normalize/index.d.ts +21 -0
- package/dist/types/normalize/index.js.map +1 -1
- package/dist/types/utils/detect-code-lang.d.ts +7 -1
- package/dist/types/utils/detect-code-lang.js.map +1 -1
- package/dist/types/utils/parse-html.d.ts +12 -6
- package/dist/types/utils/parse-html.js.map +1 -1
- package/dist/utils/detect-code-lang.js +4 -5
- package/dist/utils/parse-html.js +73 -5
- package/package.json +1 -1
|
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var youtube_exports = {};
|
|
20
20
|
__export(youtube_exports, {
|
|
21
|
+
PLAYER_RESPONSE_VARIABLE: () => PLAYER_RESPONSE_VARIABLE,
|
|
21
22
|
extractAssignedJson: () => extractAssignedJson,
|
|
22
23
|
isYoutubeElement: () => isYoutubeElement,
|
|
23
24
|
youtubeAdapter: () => youtubeAdapter,
|
|
@@ -69,12 +70,13 @@ const extractAssignedJson = (source, name) => {
|
|
|
69
70
|
const scriptText = (root) => (0, import_hast_fast.collectElements)(root, (element2) => element2.tagName === "script").map(
|
|
70
71
|
(script) => script.children.map((child) => child.type === "text" ? child.value : "").join("")
|
|
71
72
|
);
|
|
73
|
+
const PLAYER_RESPONSE_VARIABLE = "ytInitialPlayerResponse";
|
|
72
74
|
const findPlayerResponse = (root) => {
|
|
73
75
|
for (const source of scriptText(root)) {
|
|
74
|
-
if (!source.includes(
|
|
76
|
+
if (!source.includes(PLAYER_RESPONSE_VARIABLE)) {
|
|
75
77
|
continue;
|
|
76
78
|
}
|
|
77
|
-
const parsed = extractAssignedJson(source,
|
|
79
|
+
const parsed = extractAssignedJson(source, PLAYER_RESPONSE_VARIABLE);
|
|
78
80
|
if (parsed && typeof parsed === "object") {
|
|
79
81
|
return parsed;
|
|
80
82
|
}
|
|
@@ -184,6 +186,7 @@ const youtubeAdapter = {
|
|
|
184
186
|
const isYoutubeElement = import_hast_fast.isElement;
|
|
185
187
|
// Annotate the CommonJS export names for ESM import in node:
|
|
186
188
|
0 && (module.exports = {
|
|
189
|
+
PLAYER_RESPONSE_VARIABLE,
|
|
187
190
|
extractAssignedJson,
|
|
188
191
|
isYoutubeElement,
|
|
189
192
|
youtubeAdapter,
|
|
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var detect_client_shell_exports = {};
|
|
20
20
|
__export(detect_client_shell_exports, {
|
|
21
|
+
CHALLENGE_PATTERN: () => CHALLENGE_PATTERN,
|
|
21
22
|
SHELL_EMPTY_THRESHOLD: () => SHELL_EMPTY_THRESHOLD,
|
|
22
23
|
SHELL_SUSPICION_THRESHOLD: () => SHELL_SUSPICION_THRESHOLD,
|
|
23
24
|
detectClientShell: () => detectClientShell
|
|
@@ -72,6 +73,7 @@ const detectClientShell = (html) => {
|
|
|
72
73
|
};
|
|
73
74
|
// Annotate the CommonJS export names for ESM import in node:
|
|
74
75
|
0 && (module.exports = {
|
|
76
|
+
CHALLENGE_PATTERN,
|
|
75
77
|
SHELL_EMPTY_THRESHOLD,
|
|
76
78
|
SHELL_SUSPICION_THRESHOLD,
|
|
77
79
|
detectClientShell
|
|
@@ -26,6 +26,8 @@ var import_hast_fast = require("../../utils/hast-fast");
|
|
|
26
26
|
const TERMINATOR_PATTERNS = [
|
|
27
27
|
/^was this (page|article|document) helpful/i,
|
|
28
28
|
/^thanks for the feedback/i,
|
|
29
|
+
// Site-generator credit closing the page ("Powered by Docsify.js", "Powered by GitBook").
|
|
30
|
+
/^powered by\b/i,
|
|
29
31
|
/^(this page was )?last (modified|updated) (on|at|:)?\s/i,
|
|
30
32
|
/^learn how to contribute/i,
|
|
31
33
|
/^help (us )?improve\b/i,
|
package/dist/cjs/index.js
CHANGED
|
@@ -49,6 +49,7 @@ __export(src_exports, {
|
|
|
49
49
|
readabilityExtractor: () => import_extractors.readabilityExtractor,
|
|
50
50
|
resolveAdapter: () => import_adapters.resolveAdapter,
|
|
51
51
|
runAdapters: () => import_adapters.runAdapters,
|
|
52
|
+
stripScriptBodies: () => import_parse_html.stripScriptBodies,
|
|
52
53
|
takumiExtractor: () => import_extractors.takumiExtractor,
|
|
53
54
|
toFrontmatter: () => import_metadata.toFrontmatter,
|
|
54
55
|
youtubeCaptionTracks: () => import_adapters.youtubeCaptionTracks
|
|
@@ -64,6 +65,7 @@ var import_detect_client_shell = require("./detect-client-shell");
|
|
|
64
65
|
var import_extract_meta_refresh = require("./extract-meta-refresh");
|
|
65
66
|
var import_metadata = require("./metadata");
|
|
66
67
|
var import_normalize = require("./normalize");
|
|
68
|
+
var import_parse_html = require("./utils/parse-html");
|
|
67
69
|
// Annotate the CommonJS export names for ESM import in node:
|
|
68
70
|
0 && (module.exports = {
|
|
69
71
|
BUILTIN_ADAPTERS,
|
|
@@ -97,6 +99,7 @@ var import_normalize = require("./normalize");
|
|
|
97
99
|
readabilityExtractor,
|
|
98
100
|
resolveAdapter,
|
|
99
101
|
runAdapters,
|
|
102
|
+
stripScriptBodies,
|
|
100
103
|
takumiExtractor,
|
|
101
104
|
toFrontmatter,
|
|
102
105
|
youtubeCaptionTracks
|
|
@@ -29,17 +29,46 @@ var import_hast_fast = require("../utils/hast-fast");
|
|
|
29
29
|
var import_pre_text = require("../utils/pre-text");
|
|
30
30
|
var import_twoslash = require("./twoslash");
|
|
31
31
|
const LANGUAGE_MATCH_REGEX = [/^language-(\S+)$/, /^highlight-source-(\S+)$/, /^CodeBlock--language-(\S+)$/];
|
|
32
|
+
const LANGUAGE_TOKEN = /^[\w+#.-]+$/;
|
|
33
|
+
const NO_LANGUAGE = /* @__PURE__ */ new Set(["plain", "plaintext", "text", "none", "nohighlight"]);
|
|
32
34
|
const LANGUAGE_ATTRIBUTES = ["dataLanguage", "dataLang"];
|
|
33
35
|
const attributeLanguage = (element) => {
|
|
34
36
|
for (const name of LANGUAGE_ATTRIBUTES) {
|
|
35
37
|
const value = element.properties?.[name];
|
|
36
|
-
if (typeof value === "string" &&
|
|
38
|
+
if (typeof value === "string" && LANGUAGE_TOKEN.test(value.trim()) && value.trim() !== "plaintext") {
|
|
37
39
|
return value.trim();
|
|
38
40
|
}
|
|
39
41
|
}
|
|
40
42
|
return void 0;
|
|
41
43
|
};
|
|
42
|
-
const
|
|
44
|
+
const SANDPACK_LANGUAGES = /* @__PURE__ */ new Set([
|
|
45
|
+
"javascript",
|
|
46
|
+
"typescript",
|
|
47
|
+
"jsx",
|
|
48
|
+
"tsx",
|
|
49
|
+
"html",
|
|
50
|
+
"css",
|
|
51
|
+
"less",
|
|
52
|
+
"scss",
|
|
53
|
+
"sass",
|
|
54
|
+
"json",
|
|
55
|
+
"markdown",
|
|
56
|
+
"python",
|
|
57
|
+
"vue",
|
|
58
|
+
"svelte"
|
|
59
|
+
]);
|
|
60
|
+
const conventionLanguage = (element) => {
|
|
61
|
+
const classes = (0, import_hast_fast.classList)(element);
|
|
62
|
+
const brushAt = classes.findIndex((name) => name.startsWith("brush:"));
|
|
63
|
+
if (brushAt >= 0) {
|
|
64
|
+
const brush = classes[brushAt] === "brush:" ? classes[brushAt + 1] : classes[brushAt].slice("brush:".length);
|
|
65
|
+
const lang = brush?.toLowerCase();
|
|
66
|
+
return lang && LANGUAGE_TOKEN.test(lang) && !NO_LANGUAGE.has(lang) ? lang : void 0;
|
|
67
|
+
}
|
|
68
|
+
const sandpack = classes.find((name) => name.startsWith("sp-") && SANDPACK_LANGUAGES.has(name.slice(3)));
|
|
69
|
+
return sandpack?.slice(3);
|
|
70
|
+
};
|
|
71
|
+
const codeLanguage = (...elements) => elements.flatMap(import_hast_fast.classList).map((className) => LANGUAGE_MATCH_REGEX.map((regex) => className.match(regex)).find(Boolean)?.[1]).find(Boolean) ?? elements.map(attributeLanguage).find(Boolean) ?? elements.map(conventionLanguage).find(Boolean);
|
|
43
72
|
const codeMeta = (pre) => {
|
|
44
73
|
const title = pre.properties?.dataTitle;
|
|
45
74
|
if (typeof title !== "string") {
|
|
@@ -20,11 +20,13 @@ var normalize_exports = {};
|
|
|
20
20
|
__export(normalize_exports, {
|
|
21
21
|
bestFromSrcset: () => bestFromSrcset,
|
|
22
22
|
dedupeRenderedMath: () => dedupeRenderedMath,
|
|
23
|
+
foldCodeLabels: () => foldCodeLabels,
|
|
23
24
|
normalizeHast: () => normalizeHast,
|
|
24
25
|
promoteAriaHeadings: () => promoteAriaHeadings,
|
|
25
26
|
removeIconFonts: () => removeIconFonts,
|
|
26
27
|
resolveImageSources: () => resolveImageSources,
|
|
27
|
-
separateAdjacentInlines: () => separateAdjacentInlines
|
|
28
|
+
separateAdjacentInlines: () => separateAdjacentInlines,
|
|
29
|
+
unwrapHeadingAnchors: () => unwrapHeadingAnchors
|
|
28
30
|
});
|
|
29
31
|
module.exports = __toCommonJS(normalize_exports);
|
|
30
32
|
var import_hast_fast = require("../utils/hast-fast");
|
|
@@ -164,6 +166,82 @@ const removeIconFonts = (tree) => {
|
|
|
164
166
|
(0, import_hast_fast.pruneInPlace)(tree, (node) => !isIcon(node));
|
|
165
167
|
}
|
|
166
168
|
};
|
|
169
|
+
const textOfNode = (node) => node.type === "text" ? node.value : "children" in node ? node.children.map(textOfNode).join("") : "";
|
|
170
|
+
const unwrapHeadingAnchors = (tree) => {
|
|
171
|
+
(0, import_hast_fast.walk)(tree, (node) => {
|
|
172
|
+
if (!((0, import_hast_fast.isElement)(node) && /^h[1-6]$/.test(node.tagName))) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const title = textOfNode(node).trim();
|
|
176
|
+
if (title === "") {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const anchorAt = node.children.findIndex(
|
|
180
|
+
(child) => (0, import_hast_fast.isElement)(child) && child.tagName === "a" && (0, import_hast_fast.stringProperty)(child, "href")?.startsWith("#") && textOfNode(child).trim() === title
|
|
181
|
+
);
|
|
182
|
+
const anchor = node.children[anchorAt];
|
|
183
|
+
if ((0, import_hast_fast.isElement)(anchor)) {
|
|
184
|
+
node.children.splice(anchorAt, 1, ...anchor.children);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
const LABEL_LANGUAGES = /* @__PURE__ */ new Set([
|
|
189
|
+
"js",
|
|
190
|
+
"javascript",
|
|
191
|
+
"ts",
|
|
192
|
+
"typescript",
|
|
193
|
+
"jsx",
|
|
194
|
+
"tsx",
|
|
195
|
+
"html",
|
|
196
|
+
"css",
|
|
197
|
+
"scss",
|
|
198
|
+
"json",
|
|
199
|
+
"bash",
|
|
200
|
+
"sh",
|
|
201
|
+
"shell",
|
|
202
|
+
"console",
|
|
203
|
+
"python",
|
|
204
|
+
"py",
|
|
205
|
+
"sql",
|
|
206
|
+
"xml",
|
|
207
|
+
"yaml",
|
|
208
|
+
"toml",
|
|
209
|
+
"http",
|
|
210
|
+
"rust",
|
|
211
|
+
"go",
|
|
212
|
+
"java",
|
|
213
|
+
"kotlin",
|
|
214
|
+
"swift",
|
|
215
|
+
"c",
|
|
216
|
+
"cpp",
|
|
217
|
+
"md",
|
|
218
|
+
"markdown",
|
|
219
|
+
"diff"
|
|
220
|
+
]);
|
|
221
|
+
const LABEL_NO_LANGUAGE = /* @__PURE__ */ new Set(["plain", "plaintext", "text"]);
|
|
222
|
+
const foldCodeLabels = (tree) => {
|
|
223
|
+
(0, import_hast_fast.walk)(tree, (node) => {
|
|
224
|
+
if (!(0, import_hast_fast.isElement)(node) || node.tagName === "pre") {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const elements = node.children.filter(import_hast_fast.isElement);
|
|
228
|
+
if (elements.length !== 2 || node.children.some((child) => child.type === "text" && child.value.trim() !== "")) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const [label, pre] = elements;
|
|
232
|
+
if (pre.tagName !== "pre" || /^(h[1-6]|pre)$/.test(label.tagName) || (0, import_hast_fast.findElement)(label, (el) => el.tagName === "pre")) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const name = textOfNode(label).trim().toLowerCase();
|
|
236
|
+
if (!(LABEL_LANGUAGES.has(name) || LABEL_NO_LANGUAGE.has(name))) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (LABEL_LANGUAGES.has(name) && pre.properties.dataLanguage === void 0) {
|
|
240
|
+
pre.properties.dataLanguage = name;
|
|
241
|
+
}
|
|
242
|
+
node.children = node.children.filter((child) => child !== label);
|
|
243
|
+
});
|
|
244
|
+
};
|
|
167
245
|
const SPACED_INLINE = /* @__PURE__ */ new Set(["span", "time", "label"]);
|
|
168
246
|
const SCRIPTS = [
|
|
169
247
|
["latin", /\p{Script=Latin}/u],
|
|
@@ -180,7 +258,6 @@ const needsSpace = (left, right) => {
|
|
|
180
258
|
return a !== void 0 && b !== void 0 && a !== b;
|
|
181
259
|
};
|
|
182
260
|
const NO_SPACING = /* @__PURE__ */ new Set(["pre", "code", "kbd", "samp", "ruby", "math", "svg"]);
|
|
183
|
-
const textOfNode = (node) => node.type === "text" ? node.value : "children" in node ? node.children.map(textOfNode).join("") : "";
|
|
184
261
|
const separateAdjacentInlines = (tree) => {
|
|
185
262
|
const visit = (node) => {
|
|
186
263
|
if (!("children" in node) || (0, import_hast_fast.isElement)(node) && NO_SPACING.has(node.tagName)) {
|
|
@@ -201,7 +278,15 @@ const separateAdjacentInlines = (tree) => {
|
|
|
201
278
|
visit(tree);
|
|
202
279
|
};
|
|
203
280
|
const normalizeHast = (tree, options = {}) => {
|
|
204
|
-
const {
|
|
281
|
+
const {
|
|
282
|
+
images = true,
|
|
283
|
+
math = true,
|
|
284
|
+
ariaHeadings = true,
|
|
285
|
+
iconFonts = true,
|
|
286
|
+
headingAnchors = true,
|
|
287
|
+
codeLabels = true,
|
|
288
|
+
inlineSpacing = true
|
|
289
|
+
} = options;
|
|
205
290
|
if (images) {
|
|
206
291
|
resolveImageSources(tree);
|
|
207
292
|
}
|
|
@@ -214,6 +299,12 @@ const normalizeHast = (tree, options = {}) => {
|
|
|
214
299
|
if (iconFonts) {
|
|
215
300
|
removeIconFonts(tree);
|
|
216
301
|
}
|
|
302
|
+
if (headingAnchors) {
|
|
303
|
+
unwrapHeadingAnchors(tree);
|
|
304
|
+
}
|
|
305
|
+
if (codeLabels) {
|
|
306
|
+
foldCodeLabels(tree);
|
|
307
|
+
}
|
|
217
308
|
if (inlineSpacing) {
|
|
218
309
|
separateAdjacentInlines(tree);
|
|
219
310
|
}
|
|
@@ -223,9 +314,11 @@ const normalizeHast = (tree, options = {}) => {
|
|
|
223
314
|
0 && (module.exports = {
|
|
224
315
|
bestFromSrcset,
|
|
225
316
|
dedupeRenderedMath,
|
|
317
|
+
foldCodeLabels,
|
|
226
318
|
normalizeHast,
|
|
227
319
|
promoteAriaHeadings,
|
|
228
320
|
removeIconFonts,
|
|
229
321
|
resolveImageSources,
|
|
230
|
-
separateAdjacentInlines
|
|
322
|
+
separateAdjacentInlines,
|
|
323
|
+
unwrapHeadingAnchors
|
|
231
324
|
});
|
|
@@ -62,11 +62,10 @@ const languages = [
|
|
|
62
62
|
["json", [/\b(true|false|null|\{})\b|\"[^"]+\":/g, 10]],
|
|
63
63
|
["yaml", [/^(\s+)?[a-z][a-z0-9]*:/gim, 10]]
|
|
64
64
|
];
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
};
|
|
65
|
+
const MIN_CONFIDENT_SCORE = 400;
|
|
66
|
+
const detectLanguage = (code) => languages.map(
|
|
67
|
+
([lang, ...features]) => [lang, features.reduce((acc, [match, score]) => acc + [...code.matchAll(match)].length * score, 0)]
|
|
68
|
+
).filter(([_, score]) => score >= MIN_CONFIDENT_SCORE).sort((a, b) => b[1] - a[1])[0]?.[0];
|
|
70
69
|
// Annotate the CommonJS export names for ESM import in node:
|
|
71
70
|
0 && (module.exports = {
|
|
72
71
|
detectLanguage
|
|
@@ -26,6 +26,8 @@ __export(parse_html_exports, {
|
|
|
26
26
|
module.exports = __toCommonJS(parse_html_exports);
|
|
27
27
|
var import_hast_util_from_parse5 = require("hast-util-from-parse5");
|
|
28
28
|
var import_parse5 = require("parse5");
|
|
29
|
+
var import_youtube = require("../adapters/sites/youtube");
|
|
30
|
+
var import_detect_client_shell = require("../detect-client-shell");
|
|
29
31
|
const MAX_ELEMENT_DEPTH = 256;
|
|
30
32
|
const isParent = (node) => "childNodes" in node;
|
|
31
33
|
const LINE_ELEMENTS = /* @__PURE__ */ new Set([
|
|
@@ -92,12 +94,78 @@ const flattenDeep = (root, maxDepth) => {
|
|
|
92
94
|
}
|
|
93
95
|
}
|
|
94
96
|
};
|
|
95
|
-
const
|
|
97
|
+
const SCRIPT_OR_STYLE_START = /<!--|<(script|style)(?=[\s/>])/gi;
|
|
98
|
+
const CLOSING_TAG = {
|
|
99
|
+
script: /<\/script[\s/>]/gi,
|
|
100
|
+
style: /<\/style[\s/>]/gi
|
|
101
|
+
};
|
|
102
|
+
const startTagEnd = (html, from) => {
|
|
103
|
+
let index = from;
|
|
104
|
+
while (index < html.length) {
|
|
105
|
+
const char = html[index];
|
|
106
|
+
if (char === ">") {
|
|
107
|
+
return index + 1;
|
|
108
|
+
}
|
|
109
|
+
if (char === "=") {
|
|
110
|
+
let value = index + 1;
|
|
111
|
+
while (value < html.length && /\s/.test(html[value] ?? "")) {
|
|
112
|
+
value++;
|
|
113
|
+
}
|
|
114
|
+
const quote = html[value];
|
|
115
|
+
if (quote === '"' || quote === "'") {
|
|
116
|
+
const close = html.indexOf(quote, value + 1);
|
|
117
|
+
if (close < 0) {
|
|
118
|
+
return -1;
|
|
119
|
+
}
|
|
120
|
+
index = close + 1;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
index = value;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
index++;
|
|
127
|
+
}
|
|
128
|
+
return -1;
|
|
129
|
+
};
|
|
130
|
+
const isReadScript = (attributes, element) => /application\/ld\+json/i.test(attributes) || element.includes(import_youtube.PLAYER_RESPONSE_VARIABLE) || import_detect_client_shell.CHALLENGE_PATTERN.test(element);
|
|
96
131
|
const LARGE_DOCUMENT_CHARS = 2e6;
|
|
97
|
-
const stripScriptBodies = (html) =>
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
);
|
|
132
|
+
const stripScriptBodies = (html) => {
|
|
133
|
+
const out = [];
|
|
134
|
+
let copied = 0;
|
|
135
|
+
const start = new RegExp(SCRIPT_OR_STYLE_START);
|
|
136
|
+
for (let match = start.exec(html); match; match = start.exec(html)) {
|
|
137
|
+
if (match[1] === void 0) {
|
|
138
|
+
const commentEnd = html.indexOf("-->", match.index + 4);
|
|
139
|
+
if (commentEnd < 0) {
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
start.lastIndex = commentEnd + 3;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const tag = match[1].toLowerCase();
|
|
146
|
+
const bodyStart = startTagEnd(html, match.index + match[0].length);
|
|
147
|
+
if (bodyStart < 0) {
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
const closing = CLOSING_TAG[tag];
|
|
151
|
+
closing.lastIndex = bodyStart;
|
|
152
|
+
const close = closing.exec(html);
|
|
153
|
+
if (!close) {
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
const tagEnd = html.indexOf(">", close.index);
|
|
157
|
+
const elementEnd = tagEnd < 0 ? html.length : tagEnd + 1;
|
|
158
|
+
const element = html.slice(match.index, elementEnd);
|
|
159
|
+
const openingTag = html.slice(match.index, bodyStart);
|
|
160
|
+
if (!(tag === "script" && isReadScript(openingTag, element))) {
|
|
161
|
+
out.push(html.slice(copied, bodyStart), html.slice(close.index, elementEnd));
|
|
162
|
+
copied = elementEnd;
|
|
163
|
+
}
|
|
164
|
+
start.lastIndex = elementEnd;
|
|
165
|
+
}
|
|
166
|
+
out.push(html.slice(copied));
|
|
167
|
+
return out.join("");
|
|
168
|
+
};
|
|
101
169
|
const parseHtml = (html, options = {}) => {
|
|
102
170
|
const source = html.length > LARGE_DOCUMENT_CHARS ? stripScriptBodies(html) : html;
|
|
103
171
|
const document = options.fragment ? (0, import_parse5.parseFragment)(source, { scriptingEnabled: false }) : (0, import_parse5.parse)(source, { scriptingEnabled: false });
|
|
@@ -3,6 +3,8 @@ import { isElement, isParent, pruneInPlace } from "../../utils/hast-fast.js";
|
|
|
3
3
|
var TERMINATOR_PATTERNS = [
|
|
4
4
|
/^was this (page|article|document) helpful/i,
|
|
5
5
|
/^thanks for the feedback/i,
|
|
6
|
+
// Site-generator credit closing the page ("Powered by Docsify.js", "Powered by GitBook").
|
|
7
|
+
/^powered by\b/i,
|
|
6
8
|
/^(this page was )?last (modified|updated) (on|at|:)?\s/i,
|
|
7
9
|
/^learn how to contribute/i,
|
|
8
10
|
/^help (us )?improve\b/i,
|
package/dist/index.js
CHANGED
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
} from "./extract-meta-refresh.js";
|
|
43
43
|
import { extractMetadata, toFrontmatter } from "./metadata/index.js";
|
|
44
44
|
import { normalizeHast } from "./normalize/index.js";
|
|
45
|
+
import { stripScriptBodies } from "./utils/parse-html.js";
|
|
45
46
|
export {
|
|
46
47
|
BUILTIN_ADAPTERS,
|
|
47
48
|
EXTRACTOR_PRESETS,
|
|
@@ -74,6 +75,7 @@ export {
|
|
|
74
75
|
readabilityExtractor,
|
|
75
76
|
resolveAdapter,
|
|
76
77
|
runAdapters,
|
|
78
|
+
stripScriptBodies,
|
|
77
79
|
takumiExtractor,
|
|
78
80
|
toFrontmatter,
|
|
79
81
|
youtubeCaptionTracks
|
|
@@ -5,17 +5,46 @@ import { classList, isElement } from "../utils/hast-fast.js";
|
|
|
5
5
|
import { preText } from "../utils/pre-text.js";
|
|
6
6
|
import { cleanTwoslash } from "./twoslash.js";
|
|
7
7
|
var LANGUAGE_MATCH_REGEX = [/^language-(\S+)$/, /^highlight-source-(\S+)$/, /^CodeBlock--language-(\S+)$/];
|
|
8
|
+
var LANGUAGE_TOKEN = /^[\w+#.-]+$/;
|
|
9
|
+
var NO_LANGUAGE = /* @__PURE__ */ new Set(["plain", "plaintext", "text", "none", "nohighlight"]);
|
|
8
10
|
var LANGUAGE_ATTRIBUTES = ["dataLanguage", "dataLang"];
|
|
9
11
|
var attributeLanguage = (element) => {
|
|
10
12
|
for (const name of LANGUAGE_ATTRIBUTES) {
|
|
11
13
|
const value = element.properties?.[name];
|
|
12
|
-
if (typeof value === "string" &&
|
|
14
|
+
if (typeof value === "string" && LANGUAGE_TOKEN.test(value.trim()) && value.trim() !== "plaintext") {
|
|
13
15
|
return value.trim();
|
|
14
16
|
}
|
|
15
17
|
}
|
|
16
18
|
return void 0;
|
|
17
19
|
};
|
|
18
|
-
var
|
|
20
|
+
var SANDPACK_LANGUAGES = /* @__PURE__ */ new Set([
|
|
21
|
+
"javascript",
|
|
22
|
+
"typescript",
|
|
23
|
+
"jsx",
|
|
24
|
+
"tsx",
|
|
25
|
+
"html",
|
|
26
|
+
"css",
|
|
27
|
+
"less",
|
|
28
|
+
"scss",
|
|
29
|
+
"sass",
|
|
30
|
+
"json",
|
|
31
|
+
"markdown",
|
|
32
|
+
"python",
|
|
33
|
+
"vue",
|
|
34
|
+
"svelte"
|
|
35
|
+
]);
|
|
36
|
+
var conventionLanguage = (element) => {
|
|
37
|
+
const classes = classList(element);
|
|
38
|
+
const brushAt = classes.findIndex((name) => name.startsWith("brush:"));
|
|
39
|
+
if (brushAt >= 0) {
|
|
40
|
+
const brush = classes[brushAt] === "brush:" ? classes[brushAt + 1] : classes[brushAt].slice("brush:".length);
|
|
41
|
+
const lang = brush?.toLowerCase();
|
|
42
|
+
return lang && LANGUAGE_TOKEN.test(lang) && !NO_LANGUAGE.has(lang) ? lang : void 0;
|
|
43
|
+
}
|
|
44
|
+
const sandpack = classes.find((name) => name.startsWith("sp-") && SANDPACK_LANGUAGES.has(name.slice(3)));
|
|
45
|
+
return sandpack?.slice(3);
|
|
46
|
+
};
|
|
47
|
+
var codeLanguage = (...elements) => elements.flatMap(classList).map((className) => LANGUAGE_MATCH_REGEX.map((regex) => className.match(regex)).find(Boolean)?.[1]).find(Boolean) ?? elements.map(attributeLanguage).find(Boolean) ?? elements.map(conventionLanguage).find(Boolean);
|
|
19
48
|
var codeMeta = (pre) => {
|
|
20
49
|
const title = pre.properties?.dataTitle;
|
|
21
50
|
if (typeof title !== "string") {
|
package/dist/normalize/index.js
CHANGED
|
@@ -145,6 +145,82 @@ var removeIconFonts = (tree) => {
|
|
|
145
145
|
pruneInPlace(tree, (node) => !isIcon(node));
|
|
146
146
|
}
|
|
147
147
|
};
|
|
148
|
+
var textOfNode = (node) => node.type === "text" ? node.value : "children" in node ? node.children.map(textOfNode).join("") : "";
|
|
149
|
+
var unwrapHeadingAnchors = (tree) => {
|
|
150
|
+
walk(tree, (node) => {
|
|
151
|
+
if (!(isElement(node) && /^h[1-6]$/.test(node.tagName))) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const title = textOfNode(node).trim();
|
|
155
|
+
if (title === "") {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const anchorAt = node.children.findIndex(
|
|
159
|
+
(child) => isElement(child) && child.tagName === "a" && stringProperty(child, "href")?.startsWith("#") && textOfNode(child).trim() === title
|
|
160
|
+
);
|
|
161
|
+
const anchor = node.children[anchorAt];
|
|
162
|
+
if (isElement(anchor)) {
|
|
163
|
+
node.children.splice(anchorAt, 1, ...anchor.children);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
var LABEL_LANGUAGES = /* @__PURE__ */ new Set([
|
|
168
|
+
"js",
|
|
169
|
+
"javascript",
|
|
170
|
+
"ts",
|
|
171
|
+
"typescript",
|
|
172
|
+
"jsx",
|
|
173
|
+
"tsx",
|
|
174
|
+
"html",
|
|
175
|
+
"css",
|
|
176
|
+
"scss",
|
|
177
|
+
"json",
|
|
178
|
+
"bash",
|
|
179
|
+
"sh",
|
|
180
|
+
"shell",
|
|
181
|
+
"console",
|
|
182
|
+
"python",
|
|
183
|
+
"py",
|
|
184
|
+
"sql",
|
|
185
|
+
"xml",
|
|
186
|
+
"yaml",
|
|
187
|
+
"toml",
|
|
188
|
+
"http",
|
|
189
|
+
"rust",
|
|
190
|
+
"go",
|
|
191
|
+
"java",
|
|
192
|
+
"kotlin",
|
|
193
|
+
"swift",
|
|
194
|
+
"c",
|
|
195
|
+
"cpp",
|
|
196
|
+
"md",
|
|
197
|
+
"markdown",
|
|
198
|
+
"diff"
|
|
199
|
+
]);
|
|
200
|
+
var LABEL_NO_LANGUAGE = /* @__PURE__ */ new Set(["plain", "plaintext", "text"]);
|
|
201
|
+
var foldCodeLabels = (tree) => {
|
|
202
|
+
walk(tree, (node) => {
|
|
203
|
+
if (!isElement(node) || node.tagName === "pre") {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const elements = node.children.filter(isElement);
|
|
207
|
+
if (elements.length !== 2 || node.children.some((child) => child.type === "text" && child.value.trim() !== "")) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const [label, pre] = elements;
|
|
211
|
+
if (pre.tagName !== "pre" || /^(h[1-6]|pre)$/.test(label.tagName) || findElement(label, (el) => el.tagName === "pre")) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const name = textOfNode(label).trim().toLowerCase();
|
|
215
|
+
if (!(LABEL_LANGUAGES.has(name) || LABEL_NO_LANGUAGE.has(name))) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (LABEL_LANGUAGES.has(name) && pre.properties.dataLanguage === void 0) {
|
|
219
|
+
pre.properties.dataLanguage = name;
|
|
220
|
+
}
|
|
221
|
+
node.children = node.children.filter((child) => child !== label);
|
|
222
|
+
});
|
|
223
|
+
};
|
|
148
224
|
var SPACED_INLINE = /* @__PURE__ */ new Set(["span", "time", "label"]);
|
|
149
225
|
var SCRIPTS = [
|
|
150
226
|
["latin", /\p{Script=Latin}/u],
|
|
@@ -161,7 +237,6 @@ var needsSpace = (left, right) => {
|
|
|
161
237
|
return a !== void 0 && b !== void 0 && a !== b;
|
|
162
238
|
};
|
|
163
239
|
var NO_SPACING = /* @__PURE__ */ new Set(["pre", "code", "kbd", "samp", "ruby", "math", "svg"]);
|
|
164
|
-
var textOfNode = (node) => node.type === "text" ? node.value : "children" in node ? node.children.map(textOfNode).join("") : "";
|
|
165
240
|
var separateAdjacentInlines = (tree) => {
|
|
166
241
|
const visit = (node) => {
|
|
167
242
|
if (!("children" in node) || isElement(node) && NO_SPACING.has(node.tagName)) {
|
|
@@ -182,7 +257,15 @@ var separateAdjacentInlines = (tree) => {
|
|
|
182
257
|
visit(tree);
|
|
183
258
|
};
|
|
184
259
|
var normalizeHast = (tree, options = {}) => {
|
|
185
|
-
const {
|
|
260
|
+
const {
|
|
261
|
+
images = true,
|
|
262
|
+
math = true,
|
|
263
|
+
ariaHeadings = true,
|
|
264
|
+
iconFonts = true,
|
|
265
|
+
headingAnchors = true,
|
|
266
|
+
codeLabels = true,
|
|
267
|
+
inlineSpacing = true
|
|
268
|
+
} = options;
|
|
186
269
|
if (images) {
|
|
187
270
|
resolveImageSources(tree);
|
|
188
271
|
}
|
|
@@ -195,6 +278,12 @@ var normalizeHast = (tree, options = {}) => {
|
|
|
195
278
|
if (iconFonts) {
|
|
196
279
|
removeIconFonts(tree);
|
|
197
280
|
}
|
|
281
|
+
if (headingAnchors) {
|
|
282
|
+
unwrapHeadingAnchors(tree);
|
|
283
|
+
}
|
|
284
|
+
if (codeLabels) {
|
|
285
|
+
foldCodeLabels(tree);
|
|
286
|
+
}
|
|
198
287
|
if (inlineSpacing) {
|
|
199
288
|
separateAdjacentInlines(tree);
|
|
200
289
|
}
|
|
@@ -203,9 +292,11 @@ var normalizeHast = (tree, options = {}) => {
|
|
|
203
292
|
export {
|
|
204
293
|
bestFromSrcset,
|
|
205
294
|
dedupeRenderedMath,
|
|
295
|
+
foldCodeLabels,
|
|
206
296
|
normalizeHast,
|
|
207
297
|
promoteAriaHeadings,
|
|
208
298
|
removeIconFonts,
|
|
209
299
|
resolveImageSources,
|
|
210
|
-
separateAdjacentInlines
|
|
300
|
+
separateAdjacentInlines,
|
|
301
|
+
unwrapHeadingAnchors
|
|
211
302
|
};
|
|
@@ -20,6 +20,8 @@ export interface CaptionTrack {
|
|
|
20
20
|
isAutomatic: boolean;
|
|
21
21
|
}
|
|
22
22
|
export declare const extractAssignedJson: (source: string, name: string) => unknown;
|
|
23
|
+
/** The script variable holding a watch page's title, description and caption tracks. */
|
|
24
|
+
export declare const PLAYER_RESPONSE_VARIABLE = "ytInitialPlayerResponse";
|
|
23
25
|
/**
|
|
24
26
|
* Lists the caption tracks advertised by a YouTube watch page.
|
|
25
27
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../../../src/adapters/sites/youtube.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAoBnE;;;;;GAKG;AACH;;;;;GAKG;AACH,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,KAAa,EAAU,EAAE;IAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAC/B,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YAC9B,QAAQ,GAAG,CAAC,QAAQ,CAAC;QACtB,CAAC;aAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;gBACvB,KAAK,IAAI,CAAC,CAAC;YACZ,CAAC;iBAAM,IAAI,SAAS,KAAK,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;gBAC/C,OAAO,KAAK,GAAG,CAAC,CAAC;YAClB,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,CAAC,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,IAAY,EAAW,EAAE;IAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IAChD,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAU,EAAY,EAAE,CAC3C,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC/E,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CACnF,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,IAAU,EAAuC,EAAE;IAC9E,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../../../src/adapters/sites/youtube.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAoBnE;;;;;GAKG;AACH;;;;;GAKG;AACH,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,KAAa,EAAU,EAAE;IAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAC/B,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YAC9B,QAAQ,GAAG,CAAC,QAAQ,CAAC;QACtB,CAAC;aAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;gBACvB,KAAK,IAAI,CAAC,CAAC;YACZ,CAAC;iBAAM,IAAI,SAAS,KAAK,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;gBAC/C,OAAO,KAAK,GAAG,CAAC,CAAC;YAClB,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,CAAC,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,IAAY,EAAW,EAAE;IAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IAChD,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAU,EAAY,EAAE,CAC3C,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC/E,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CACnF,CAAC;AAEH,wFAAwF;AACxF,MAAM,CAAC,MAAM,wBAAwB,GAAG,yBAAyB,CAAC;AAElE,MAAM,kBAAkB,GAAG,CAAC,IAAU,EAAuC,EAAE;IAC9E,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAChD,SAAS;QACV,CAAC;QACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;QACrE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,MAAiC,CAAC;QAC1C,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAU,EAAkB,EAAE;IAClE,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAI,MAAM,EAAE,QAAgD,EAAE,+BAEhE,CAAC;IACb,MAAM,MAAM,GAAG,QAAQ,EAAE,aAAa,CAAC;IAEvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACX,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,KAA8B,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,MAAM,YAAY,GAAG,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,IAAI,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACX,CAAC;QACD,MAAM,IAAI,GAAI,KAAK,CAAC,IAA4C,EAAE,UAAU,CAAC;QAC7E,OAAO;YACN;gBACC,GAAG;gBACH,YAAY;gBACZ,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gBACjD,WAAW,EAAE,KAAK,CAAC,IAAI,KAAK,KAAK;aACjC;SACD,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,KAAa,EAAkB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAE1E,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,QAA0B,EAAW,EAAE,CAAC,CAAC;IAC1E,IAAI,EAAE,SAAS;IACf,OAAO;IACP,UAAU,EAAE,EAAE;IACd,QAAQ;CACR,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,KAAa,EAAW,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE/F,MAAM,SAAS,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE1E,4EAA4E;AAC5E,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAa,EAAE,CAC3D,WAAW;KACT,KAAK,CAAC,QAAQ,CAAC;KACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;KAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;KACnC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACd,OAAO,CACN,GAAG,EACH,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC1G,CACD,CAAC;AAEJ,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,GAAG,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,OAAqB,EAAuB,EAAE;IACnE,MAAM,KAAK,GAAc,EAAE,CAAC;IAE5B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAgB;IAC1C,EAAE,EAAE,SAAS;IAEb,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACJ,OAAO,uDAAuD,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC5F,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,6FAA6F;IAC7F,iEAAiE;IACjE,kBAAkB,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CACrC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEjF,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,EAAE,YAAwC,CAAC;QAEjE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5D,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;QACrD,IAAI,WAAW,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjF,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAiB,CAAC;IAClD,CAAC;CACD,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC"}
|
|
@@ -21,4 +21,6 @@ export interface ClientShellVerdict {
|
|
|
21
21
|
export declare const SHELL_SUSPICION_THRESHOLD = 300;
|
|
22
22
|
/** Below this length the document is a shell even without a framework marker. */
|
|
23
23
|
export declare const SHELL_EMPTY_THRESHOLD = 50;
|
|
24
|
+
/** Fingerprints of bot-challenge interstitials (Cloudflare, Imperva, PerimeterX, DataDome). */
|
|
25
|
+
export declare const CHALLENGE_PATTERN: RegExp;
|
|
24
26
|
export declare const detectClientShell: (html: string) => ClientShellVerdict;
|