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.
Files changed (33) hide show
  1. package/dist/adapters/sites/youtube.js +4 -2
  2. package/dist/bin.js +662 -474
  3. package/dist/cjs/adapters/sites/youtube.js +5 -2
  4. package/dist/cjs/detect-client-shell.js +2 -0
  5. package/dist/cjs/extractors/lib/terminators.js +2 -0
  6. package/dist/cjs/index.js +3 -0
  7. package/dist/cjs/mdast-handlers/custom-code-handler.js +31 -2
  8. package/dist/cjs/normalize/index.js +97 -4
  9. package/dist/cjs/utils/detect-code-lang.js +4 -5
  10. package/dist/cjs/utils/parse-html.js +73 -5
  11. package/dist/detect-client-shell.js +1 -0
  12. package/dist/extractors/lib/terminators.js +2 -0
  13. package/dist/index.js +2 -0
  14. package/dist/mdast-handlers/custom-code-handler.js +31 -2
  15. package/dist/normalize/index.js +94 -3
  16. package/dist/types/adapters/sites/youtube.d.ts +2 -0
  17. package/dist/types/adapters/sites/youtube.js.map +1 -1
  18. package/dist/types/detect-client-shell.d.ts +2 -0
  19. package/dist/types/detect-client-shell.js.map +1 -1
  20. package/dist/types/extractors/lib/terminators.js.map +1 -1
  21. package/dist/types/index.d.ts +1 -0
  22. package/dist/types/index.js.map +1 -1
  23. package/dist/types/mdast-handlers/custom-code-handler.d.ts +5 -0
  24. package/dist/types/mdast-handlers/custom-code-handler.js.map +1 -1
  25. package/dist/types/normalize/index.d.ts +21 -0
  26. package/dist/types/normalize/index.js.map +1 -1
  27. package/dist/types/utils/detect-code-lang.d.ts +7 -1
  28. package/dist/types/utils/detect-code-lang.js.map +1 -1
  29. package/dist/types/utils/parse-html.d.ts +12 -6
  30. package/dist/types/utils/parse-html.js.map +1 -1
  31. package/dist/utils/detect-code-lang.js +4 -5
  32. package/dist/utils/parse-html.js +73 -5
  33. 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("ytInitialPlayerResponse")) {
76
+ if (!source.includes(PLAYER_RESPONSE_VARIABLE)) {
75
77
  continue;
76
78
  }
77
- const parsed = extractAssignedJson(source, "ytInitialPlayerResponse");
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" && /^[\w+#.-]+$/.test(value.trim()) && value.trim() !== "plaintext") {
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 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);
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 { images = true, math = true, ariaHeadings = true, iconFonts = true, inlineSpacing = true } = options;
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 detectLanguage = (code) => {
66
- return languages.map(
67
- ([lang, ...features]) => [lang, features.reduce((acc, [match, score]) => acc + [...code.matchAll(match)].length * score, 0)]
68
- ).filter(([_, score]) => score > 20).sort((a, b) => b[1] - a[1])[0]?.[0] || "plain";
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 SCRIPT_OR_STYLE = /<(script|style)\b([^>]*)>[\s\S]*?<\/\1\s*>/gi;
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) => html.replace(
98
- SCRIPT_OR_STYLE,
99
- (match, tag, attributes) => /application\/ld\+json/i.test(attributes) ? match : `<${tag}${attributes}></${tag}>`
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 });
@@ -47,6 +47,7 @@ var detectClientShell = (html) => {
47
47
  return { isShell: false, visibleTextLength };
48
48
  };
49
49
  export {
50
+ CHALLENGE_PATTERN,
50
51
  SHELL_EMPTY_THRESHOLD,
51
52
  SHELL_SUSPICION_THRESHOLD,
52
53
  detectClientShell
@@ -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" && /^[\w+#.-]+$/.test(value.trim()) && value.trim() !== "plaintext") {
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 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);
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") {
@@ -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 { images = true, math = true, ariaHeadings = true, iconFonts = true, inlineSpacing = true } = options;
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":"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"}
1
+ {"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../../../src/adapters/sites/youtube.ts"],"names":[],"mappings":"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"}
@@ -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;