webforai 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/README.md +63 -1
  2. package/dist/adapters/index.js +58 -0
  3. package/dist/adapters/registry.js +149 -0
  4. package/dist/adapters/sites/declarative.js +178 -0
  5. package/dist/adapters/sites/hackernews.js +94 -0
  6. package/dist/adapters/sites/youtube.js +165 -0
  7. package/dist/adapters/types.js +0 -0
  8. package/dist/bin.js +3199 -399
  9. package/dist/cjs/adapters/index.js +86 -0
  10. package/dist/cjs/adapters/registry.js +178 -0
  11. package/dist/cjs/adapters/sites/declarative.js +202 -0
  12. package/dist/cjs/adapters/sites/hackernews.js +117 -0
  13. package/dist/cjs/adapters/sites/youtube.js +191 -0
  14. package/dist/cjs/adapters/types.js +16 -0
  15. package/dist/cjs/constants.js +2 -2
  16. package/dist/cjs/extractors/index.js +8 -0
  17. package/dist/cjs/extractors/lib/constants.js +186 -0
  18. package/dist/cjs/extractors/lib/sanitize.js +425 -0
  19. package/dist/cjs/extractors/lib/score.js +264 -0
  20. package/dist/cjs/extractors/lib/terminators.js +131 -0
  21. package/dist/cjs/extractors/lib/ui-chrome.js +119 -0
  22. package/dist/cjs/extractors/pipeExtractors.js +12 -9
  23. package/dist/cjs/extractors/presets/auto.js +44 -0
  24. package/dist/cjs/extractors/presets/minimal-filter.js +27 -48
  25. package/dist/cjs/extractors/presets/takumi.js +84 -122
  26. package/dist/cjs/html-to-markdown.js +44 -7
  27. package/dist/cjs/html-to-mdast.js +9 -1
  28. package/dist/cjs/index.js +33 -2
  29. package/dist/cjs/mdast-handlers/custom-a-handler.js +25 -9
  30. package/dist/cjs/mdast-handlers/custom-img-handler.js +23 -1
  31. package/dist/cjs/mdast-handlers/custom-table-handler.js +16 -0
  32. package/dist/cjs/mdast-handlers/definition-list-handler.js +99 -0
  33. package/dist/cjs/mdast-handlers/math-handler.js +12 -3
  34. package/dist/cjs/mdast-handlers/sup-sub-handler.js +39 -0
  35. package/dist/cjs/metadata/index.js +223 -0
  36. package/dist/cjs/normalize/index.js +168 -0
  37. package/dist/cjs/platform/client.js +147 -0
  38. package/dist/cjs/platform/error.js +36 -0
  39. package/dist/cjs/platform/fetch.js +37 -0
  40. package/dist/cjs/platform/index.js +40 -0
  41. package/dist/cjs/platform/types.js +34 -0
  42. package/dist/cjs/utils/hast-fast.js +284 -0
  43. package/dist/constants.js +2 -2
  44. package/dist/extractors/index.js +5 -0
  45. package/dist/extractors/lib/constants.js +150 -0
  46. package/dist/extractors/lib/sanitize.js +415 -0
  47. package/dist/extractors/lib/score.js +242 -0
  48. package/dist/extractors/lib/terminators.js +107 -0
  49. package/dist/extractors/lib/ui-chrome.js +96 -0
  50. package/dist/extractors/pipeExtractors.js +12 -9
  51. package/dist/extractors/presets/auto.js +20 -0
  52. package/dist/extractors/presets/minimal-filter.js +35 -47
  53. package/dist/extractors/presets/takumi.js +91 -122
  54. package/dist/html-to-markdown.js +42 -6
  55. package/dist/html-to-mdast.js +9 -1
  56. package/dist/index.js +34 -3
  57. package/dist/mdast-handlers/custom-a-handler.js +25 -9
  58. package/dist/mdast-handlers/custom-img-handler.js +23 -1
  59. package/dist/mdast-handlers/custom-table-handler.js +16 -0
  60. package/dist/mdast-handlers/definition-list-handler.js +76 -0
  61. package/dist/mdast-handlers/math-handler.js +12 -3
  62. package/dist/mdast-handlers/sup-sub-handler.js +16 -0
  63. package/dist/metadata/index.js +198 -0
  64. package/dist/normalize/index.js +149 -0
  65. package/dist/platform/client.js +125 -0
  66. package/dist/platform/error.js +13 -0
  67. package/dist/platform/fetch.js +14 -0
  68. package/dist/platform/index.js +19 -0
  69. package/dist/platform/types.js +9 -0
  70. package/dist/types/adapters/index.d.ts +24 -0
  71. package/dist/types/adapters/index.js.map +1 -0
  72. package/dist/types/adapters/registry.d.ts +35 -0
  73. package/dist/types/adapters/registry.js.map +1 -0
  74. package/dist/types/adapters/sites/declarative.d.ts +13 -0
  75. package/dist/types/adapters/sites/declarative.js.map +1 -0
  76. package/dist/types/adapters/sites/hackernews.d.ts +13 -0
  77. package/dist/types/adapters/sites/hackernews.js.map +1 -0
  78. package/dist/types/adapters/sites/youtube.d.ts +31 -0
  79. package/dist/types/adapters/sites/youtube.js.map +1 -0
  80. package/dist/types/adapters/types.d.ts +99 -0
  81. package/dist/types/adapters/types.js.map +1 -0
  82. package/dist/types/cli/bin.js.map +1 -1
  83. package/dist/types/cli/commands/skill/content.d.ts +9 -0
  84. package/dist/types/cli/commands/skill/content.js.map +1 -0
  85. package/dist/types/cli/commands/skill/index.d.ts +19 -0
  86. package/dist/types/cli/commands/skill/index.js.map +1 -0
  87. package/dist/types/cli/commands/webforai/interactive.d.ts +7 -0
  88. package/dist/types/cli/commands/webforai/interactive.js.map +1 -0
  89. package/dist/types/cli/commands/webforai/loadHtml.js.map +1 -1
  90. package/dist/types/cli/commands/webforai/options.d.ts +55 -0
  91. package/dist/types/cli/commands/webforai/options.js.map +1 -0
  92. package/dist/types/cli/commands/webforai/run.d.ts +10 -0
  93. package/dist/types/cli/commands/webforai/run.js.map +1 -0
  94. package/dist/types/cli/constants.d.ts +14 -4
  95. package/dist/types/cli/constants.js.map +1 -1
  96. package/dist/types/cli/helpers/selectExtractMode.js.map +1 -1
  97. package/dist/types/cli/helpers/selectLoader.js.map +1 -1
  98. package/dist/types/constants.d.ts +7 -1
  99. package/dist/types/constants.js.map +1 -1
  100. package/dist/types/extractors/index.d.ts +2 -0
  101. package/dist/types/extractors/index.js.map +1 -1
  102. package/dist/types/extractors/lib/constants.d.ts +81 -0
  103. package/dist/types/extractors/lib/constants.js.map +1 -0
  104. package/dist/types/extractors/lib/sanitize.d.ts +66 -0
  105. package/dist/types/extractors/lib/sanitize.js.map +1 -0
  106. package/dist/types/extractors/lib/score.d.ts +85 -0
  107. package/dist/types/extractors/lib/score.js.map +1 -0
  108. package/dist/types/extractors/lib/terminators.d.ts +26 -0
  109. package/dist/types/extractors/lib/terminators.js.map +1 -0
  110. package/dist/types/extractors/lib/ui-chrome.d.ts +18 -0
  111. package/dist/types/extractors/lib/ui-chrome.js.map +1 -0
  112. package/dist/types/extractors/pipeExtractors.d.ts +5 -0
  113. package/dist/types/extractors/pipeExtractors.js.map +1 -1
  114. package/dist/types/extractors/presets/auto.d.ts +30 -0
  115. package/dist/types/extractors/presets/auto.js.map +1 -0
  116. package/dist/types/extractors/presets/minimal-filter.d.ts +10 -2
  117. package/dist/types/extractors/presets/minimal-filter.js.map +1 -1
  118. package/dist/types/extractors/presets/takumi.d.ts +19 -3
  119. package/dist/types/extractors/presets/takumi.js.map +1 -1
  120. package/dist/types/extractors/types.d.ts +8 -0
  121. package/dist/types/html-to-markdown.d.ts +38 -0
  122. package/dist/types/html-to-markdown.js.map +1 -1
  123. package/dist/types/html-to-mdast.d.ts +11 -0
  124. package/dist/types/html-to-mdast.js.map +1 -1
  125. package/dist/types/index.d.ts +6 -3
  126. package/dist/types/index.js.map +1 -1
  127. package/dist/types/mdast-handlers/custom-a-handler.js.map +1 -1
  128. package/dist/types/mdast-handlers/custom-img-handler.js.map +1 -1
  129. package/dist/types/mdast-handlers/custom-table-handler.js.map +1 -1
  130. package/dist/types/mdast-handlers/definition-list-handler.d.ts +13 -0
  131. package/dist/types/mdast-handlers/definition-list-handler.js.map +1 -0
  132. package/dist/types/mdast-handlers/math-handler.js.map +1 -1
  133. package/dist/types/mdast-handlers/sup-sub-handler.d.ts +10 -0
  134. package/dist/types/mdast-handlers/sup-sub-handler.js.map +1 -0
  135. package/dist/types/metadata/index.d.ts +47 -0
  136. package/dist/types/metadata/index.js.map +1 -0
  137. package/dist/types/normalize/index.d.ts +53 -0
  138. package/dist/types/normalize/index.js.map +1 -0
  139. package/dist/types/platform/client.d.ts +54 -0
  140. package/dist/types/platform/client.js.map +1 -0
  141. package/dist/types/platform/error.d.ts +20 -0
  142. package/dist/types/platform/error.js.map +1 -0
  143. package/dist/types/platform/fetch.d.ts +34 -0
  144. package/dist/types/platform/fetch.js.map +1 -0
  145. package/dist/types/platform/index.d.ts +4 -0
  146. package/dist/types/platform/index.js.map +1 -0
  147. package/dist/types/platform/types.d.ts +135 -0
  148. package/dist/types/platform/types.js.map +1 -0
  149. package/dist/types/utils/hast-fast.d.ts +101 -0
  150. package/dist/types/utils/hast-fast.js.map +1 -0
  151. package/dist/utils/hast-fast.js +246 -0
  152. package/package.json +10 -3
  153. package/dist/types/cli/commands/webforai/index.d.ts +0 -6
  154. package/dist/types/cli/commands/webforai/index.js.map +0 -1
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var hast_fast_exports = {};
20
+ __export(hast_fast_exports, {
21
+ MetricsCollector: () => MetricsCollector,
22
+ asRoot: () => asRoot,
23
+ classList: () => classList,
24
+ cloneHast: () => cloneHast,
25
+ collectElements: () => collectElements,
26
+ findElement: () => findElement,
27
+ hasProperty: () => hasProperty,
28
+ isElement: () => isElement,
29
+ isParent: () => isParent,
30
+ isTruthyAttribute: () => isTruthyAttribute,
31
+ matchString: () => matchString,
32
+ numericProperty: () => numericProperty,
33
+ property: () => property,
34
+ pruneInPlace: () => pruneInPlace,
35
+ stringProperty: () => stringProperty,
36
+ walk: () => walk
37
+ });
38
+ module.exports = __toCommonJS(hast_fast_exports);
39
+ const EMPTY_METRICS = { text: 0, link: 0, commas: 0, paragraphs: 0, elements: 0 };
40
+ const COMMA_REGEX = /[,、,،]/g;
41
+ const PARAGRAPH_LIKE = /* @__PURE__ */ new Set(["p", "pre", "li", "blockquote", "figcaption", "dd", "dt"]);
42
+ const NON_PROSE_TAGS = /* @__PURE__ */ new Set(["script", "style", "noscript", "template", "svg", "math", "iframe", "object"]);
43
+ const isElement = (node) => typeof node === "object" && node !== null && node.type === "element";
44
+ const isParent = (node) => typeof node === "object" && node !== null && Array.isArray(node.children);
45
+ const classList = (element) => {
46
+ const className = element.properties?.className;
47
+ if (Array.isArray(className)) {
48
+ return className;
49
+ }
50
+ if (typeof className === "string") {
51
+ return className.split(/\s+/).filter(Boolean);
52
+ }
53
+ return [];
54
+ };
55
+ const matchString = (element) => {
56
+ const id = element.properties?.id;
57
+ const classes = classList(element);
58
+ if (!id && classes.length === 0) {
59
+ return element.tagName;
60
+ }
61
+ return `${element.tagName} ${typeof id === "string" ? id : ""} ${classes.join(" ")}`;
62
+ };
63
+ class MetricsCollector {
64
+ #cache = /* @__PURE__ */ new WeakMap();
65
+ metrics(node) {
66
+ if (node.type === "text") {
67
+ const value = node.value;
68
+ if (value.trim().length === 0) {
69
+ return EMPTY_METRICS;
70
+ }
71
+ return {
72
+ text: value.length,
73
+ link: 0,
74
+ commas: (value.match(COMMA_REGEX) ?? []).length,
75
+ paragraphs: 0,
76
+ elements: 0
77
+ };
78
+ }
79
+ if (!isParent(node)) {
80
+ return EMPTY_METRICS;
81
+ }
82
+ const cached = this.#cache.get(node);
83
+ if (cached) {
84
+ return cached;
85
+ }
86
+ if (isElement(node) && NON_PROSE_TAGS.has(node.tagName)) {
87
+ this.#cache.set(node, EMPTY_METRICS);
88
+ return EMPTY_METRICS;
89
+ }
90
+ let text = 0;
91
+ let link = 0;
92
+ let commas = 0;
93
+ let paragraphs = 0;
94
+ let elements = 0;
95
+ for (const child of node.children) {
96
+ const childMetrics = this.metrics(child);
97
+ text += childMetrics.text;
98
+ link += childMetrics.link;
99
+ commas += childMetrics.commas;
100
+ paragraphs += childMetrics.paragraphs;
101
+ elements += childMetrics.elements;
102
+ if (isElement(child)) {
103
+ elements += 1;
104
+ if (PARAGRAPH_LIKE.has(child.tagName)) {
105
+ paragraphs += 1;
106
+ }
107
+ }
108
+ }
109
+ if (isElement(node) && node.tagName === "a") {
110
+ link = text;
111
+ }
112
+ const metrics = { text, link, commas, paragraphs, elements };
113
+ this.#cache.set(node, metrics);
114
+ return metrics;
115
+ }
116
+ textLength(node) {
117
+ return this.metrics(node).text;
118
+ }
119
+ /** Fraction of a subtree's text that is link anchor text. `0` for empty subtrees. */
120
+ linkDensity(node) {
121
+ const { text, link } = this.metrics(node);
122
+ if (text === 0) {
123
+ return 0;
124
+ }
125
+ return Math.min(1, link / text);
126
+ }
127
+ }
128
+ const pruneInPlace = (tree, keep) => {
129
+ if (!isParent(tree)) {
130
+ return tree;
131
+ }
132
+ const stack = [tree];
133
+ while (stack.length > 0) {
134
+ const parent = stack.pop();
135
+ const children = parent.children;
136
+ let write = 0;
137
+ for (let read = 0; read < children.length; read++) {
138
+ const child = children[read];
139
+ if (!keep(child)) {
140
+ continue;
141
+ }
142
+ children[write++] = child;
143
+ if (isParent(child)) {
144
+ stack.push(child);
145
+ }
146
+ }
147
+ children.length = write;
148
+ }
149
+ return tree;
150
+ };
151
+ const walk = (tree, visit) => {
152
+ const stack = [{ node: tree, parent: void 0 }];
153
+ while (stack.length > 0) {
154
+ const { node, parent } = stack.pop();
155
+ if (visit(node, parent) === false) {
156
+ continue;
157
+ }
158
+ if (isParent(node)) {
159
+ for (let i = node.children.length - 1; i >= 0; i--) {
160
+ stack.push({ node: node.children[i], parent: node });
161
+ }
162
+ }
163
+ }
164
+ };
165
+ const collectElements = (tree, predicate) => {
166
+ const found = [];
167
+ walk(tree, (node) => {
168
+ if (isElement(node) && predicate(node)) {
169
+ found.push(node);
170
+ }
171
+ });
172
+ return found;
173
+ };
174
+ const findElement = (tree, predicate) => {
175
+ let found;
176
+ walk(tree, (node) => {
177
+ if (found) {
178
+ return false;
179
+ }
180
+ if (isElement(node) && predicate(node)) {
181
+ found = node;
182
+ return false;
183
+ }
184
+ });
185
+ return found;
186
+ };
187
+ const cloneHast = (tree) => {
188
+ try {
189
+ return structuredClone(tree);
190
+ } catch {
191
+ return manualClone(tree);
192
+ }
193
+ };
194
+ const manualClone = (node) => {
195
+ if (Array.isArray(node)) {
196
+ return node.map(manualClone);
197
+ }
198
+ if (typeof node !== "object" || node === null) {
199
+ return node;
200
+ }
201
+ const copy = {};
202
+ for (const [key, value] of Object.entries(node)) {
203
+ copy[key] = manualClone(value);
204
+ }
205
+ return copy;
206
+ };
207
+ const asRoot = (nodes) => {
208
+ if (Array.isArray(nodes)) {
209
+ return { type: "root", children: nodes };
210
+ }
211
+ return nodes;
212
+ };
213
+ const property = (element, key) => {
214
+ const properties = element.properties;
215
+ if (!properties) {
216
+ return void 0;
217
+ }
218
+ const direct = properties[key];
219
+ if (direct !== void 0) {
220
+ return direct;
221
+ }
222
+ if (!(key.includes("-") || key.includes(":"))) {
223
+ return void 0;
224
+ }
225
+ return properties[camelCaseAttribute(key)];
226
+ };
227
+ const camelCaseAttribute = (key) => key.replace(/[-:]([a-z])/g, (_, character) => character.toUpperCase());
228
+ const numericProperty = (element, key) => {
229
+ const raw = property(element, key);
230
+ if (typeof raw === "number") {
231
+ return Number.isFinite(raw) ? raw : void 0;
232
+ }
233
+ if (typeof raw === "string" && raw.length > 0) {
234
+ const parsed = Number.parseFloat(raw);
235
+ return Number.isFinite(parsed) ? parsed : void 0;
236
+ }
237
+ return void 0;
238
+ };
239
+ const stringProperty = (element, key) => {
240
+ const raw = property(element, key);
241
+ if (typeof raw === "string") {
242
+ return raw;
243
+ }
244
+ if (Array.isArray(raw)) {
245
+ return raw.join(" ");
246
+ }
247
+ if (raw === true) {
248
+ return "";
249
+ }
250
+ return void 0;
251
+ };
252
+ const hasProperty = (element, key) => property(element, key) !== void 0;
253
+ const isTruthyAttribute = (element, key) => {
254
+ const raw = property(element, key);
255
+ if (raw === void 0 || raw === null || raw === false) {
256
+ return false;
257
+ }
258
+ if (raw === true) {
259
+ return true;
260
+ }
261
+ if (typeof raw === "string") {
262
+ return raw.toLowerCase() !== "false";
263
+ }
264
+ return true;
265
+ };
266
+ // Annotate the CommonJS export names for ESM import in node:
267
+ 0 && (module.exports = {
268
+ MetricsCollector,
269
+ asRoot,
270
+ classList,
271
+ cloneHast,
272
+ collectElements,
273
+ findElement,
274
+ hasProperty,
275
+ isElement,
276
+ isParent,
277
+ isTruthyAttribute,
278
+ matchString,
279
+ numericProperty,
280
+ property,
281
+ pruneInPlace,
282
+ stringProperty,
283
+ walk
284
+ });
package/dist/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/constants.ts
2
- import { takumiExtractor } from "./extractors/presets/takumi.js";
3
- var DEFAULT_EXTRACTORS = [takumiExtractor];
2
+ import { autoExtractor } from "./extractors/presets/auto.js";
3
+ var DEFAULT_EXTRACTORS = [autoExtractor];
4
4
  export {
5
5
  DEFAULT_EXTRACTORS
6
6
  };
@@ -3,7 +3,12 @@ import {
3
3
  pipeExtractors
4
4
  } from "./pipeExtractors.js";
5
5
  import { takumiExtractor } from "./presets/takumi.js";
6
+ import { minimalFilter } from "./presets/minimal-filter.js";
7
+ import { autoExtractor, createAutoExtractor } from "./presets/auto.js";
6
8
  export {
9
+ autoExtractor,
10
+ createAutoExtractor,
11
+ minimalFilter,
7
12
  pipeExtractors,
8
13
  takumiExtractor
9
14
  };
@@ -0,0 +1,150 @@
1
+ // src/extractors/lib/constants.ts
2
+ var REGEXPS = {
3
+ /**
4
+ * Containers that almost never hold the article body.
5
+ *
6
+ * Note the words that are deliberately *absent*. `header` and `footer` match the heading
7
+ * anchors and article furniture that documentation generators emit (`<a class="header">`,
8
+ * `class="post-header"`), so matching them here deletes the page's headings. The landmark
9
+ * versions of those elements are handled structurally instead.
10
+ */
11
+ unlikelyCandidates: /-ad-|ai2html|banner|breadcrumb|combx|comment(?!ary)|community|cover-wrap|disqus|gdpr|legends|menu|related|remark|replies|rss|shoutbox|sidebar|site-index|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote|speechify-ignore|avatar|subscribe|newsletter|paywall|consent|cookie|toolbar|masthead|promo|share|sharing|widget|tooltip|dropdown|modal|overlay|backdrop|carousel|announcement|notification|toast|skip-link|screen-reader|visually-hidden|sr-only/i,
12
+ /** Rescues containers whose class merely happens to contain an unlikely substring. */
13
+ okMaybeItsaCandidate: /and|article|body|column|content|main|shadow|code|post|entry|story|markdown|prose|doc/i,
14
+ /** Very high-confidence boilerplate, not rescued by the clause above. */
15
+ stronglyUnlikely: /^(nav|navbar|breadcrumbs?|cookie-?(banner|consent|notice)|consent-?(banner|manager)|skip-?link|site-?header|site-?footer|global-?(header|footer)|social-?(share|links?)|share-?(bar|buttons?)|related-?(posts?|articles?)|newsletter-?(signup|form)|comment-?(form|list)|toc-?sidebar)$/i,
16
+ /** Class/id fragments that mark real article content. */
17
+ positive: /article|body|content|entry|hentry|h-entry|main|page|pagination|post|text|blog|story|markdown|prose|documentation|doc-?content|readme/i,
18
+ /** Class/id fragments that mark furniture. */
19
+ negative: /-ad-|hidden|^hid$| hid$|^hid |banner|combx|comment|com-|contact|foot|footer|footnote|gdpr|masthead|media|meta|outbrain|promo|related|scroll|share|shoutbox|sidebar|skyscraper|sponsor|shopping|tags|widget|toolbar|nav|menu|cookie|consent|subscribe|newsletter|popup|modal|overlay|breadcrumb|pagination|social/i,
20
+ /** Placeholder imagery that should never reach the output. */
21
+ hidden: /fallback-image/i,
22
+ byline: /byline|author|dateline|writtenby|p-author|c-author|post-meta|entry-meta/i,
23
+ /** Wiki/CMS chrome that generic scoring alone tends to keep. */
24
+ specialUnlikelyCandidates: /frb-|uls-menu|language-link|mw-editsection|noprint|navbox|metadata|catlinks|printfooter/i
25
+ };
26
+ var NON_CONTENT_TAGS = /* @__PURE__ */ new Set([
27
+ "script",
28
+ "style",
29
+ "link",
30
+ "meta",
31
+ "noscript",
32
+ "template",
33
+ "base",
34
+ "param",
35
+ "source",
36
+ "track",
37
+ "title"
38
+ ]);
39
+ var CHROME_TAGS = /* @__PURE__ */ new Set(["nav", "aside", "dialog", "menu"]);
40
+ var CONTEXTUAL_LANDMARK_TAGS = /* @__PURE__ */ new Set(["header", "footer"]);
41
+ var HIDDEN_CLASS_NAMES = /* @__PURE__ */ new Set([
42
+ "hidden",
43
+ "invisible",
44
+ "is-hidden",
45
+ "d-none",
46
+ "display-none",
47
+ "hide",
48
+ "is-invisible"
49
+ ]);
50
+ var RESPONSIVE_DISPLAY_OVERRIDE = /^(sm|md|lg|xl|2xl|print):(block|flex|grid|inline|inline-block|inline-flex|table|contents|list-item)$/;
51
+ var UNLIKELY_ROLES = /* @__PURE__ */ new Set([
52
+ "menu",
53
+ "menubar",
54
+ "menuitem",
55
+ "complementary",
56
+ "navigation",
57
+ "alert",
58
+ "alertdialog",
59
+ "dialog",
60
+ "banner",
61
+ "contentinfo",
62
+ "search",
63
+ "searchbox",
64
+ "toolbar",
65
+ "tablist",
66
+ "tooltip"
67
+ // `presentation` is deliberately absent. It marks an element as decorative *structure* — a
68
+ // layout table, a wrapper — while the content inside it is usually real. Treating it as
69
+ // chrome deletes article text.
70
+ ]);
71
+ var CONTENT_ROLES = /* @__PURE__ */ new Set(["main", "article", "document"]);
72
+ var SCOREABLE_TAGS = /* @__PURE__ */ new Set(["p", "td", "pre", "blockquote", "dd", "li", "figure", "section", "div"]);
73
+ var CANDIDATE_TAGS = /* @__PURE__ */ new Set([
74
+ "div",
75
+ "section",
76
+ "article",
77
+ "main",
78
+ "td",
79
+ "pre",
80
+ "blockquote",
81
+ "form",
82
+ "ul",
83
+ "ol",
84
+ "dl"
85
+ ]);
86
+ var EMBEDDED_CONTENT_TAGS = /* @__PURE__ */ new Set([
87
+ "img",
88
+ "picture",
89
+ "video",
90
+ "audio",
91
+ "iframe",
92
+ "embed",
93
+ "object",
94
+ "svg",
95
+ // Formulae hold no text of their own, so an empty-wrapper rule would otherwise delete them.
96
+ "math",
97
+ "mjx-container",
98
+ "canvas"
99
+ ]);
100
+ var DROP_WHEN_EMPTY_TAGS = /* @__PURE__ */ new Set([
101
+ "p",
102
+ "h1",
103
+ "h2",
104
+ "h3",
105
+ "h4",
106
+ "h5",
107
+ "h6",
108
+ "li",
109
+ "td",
110
+ "th",
111
+ "blockquote",
112
+ "figcaption",
113
+ "dd",
114
+ "dt",
115
+ "a",
116
+ "span",
117
+ "div",
118
+ "section",
119
+ "article"
120
+ ]);
121
+ var MIN_CONTENT_LENGTH = {
122
+ ja: 140,
123
+ zh: 140,
124
+ ko: 160,
125
+ th: 160,
126
+ default: 400
127
+ };
128
+ var minContentLength = (lang) => {
129
+ if (!lang) {
130
+ return MIN_CONTENT_LENGTH.default;
131
+ }
132
+ const primary = lang.toLowerCase().split("-")[0];
133
+ return MIN_CONTENT_LENGTH[primary] ?? MIN_CONTENT_LENGTH.default;
134
+ };
135
+ export {
136
+ CANDIDATE_TAGS,
137
+ CHROME_TAGS,
138
+ CONTENT_ROLES,
139
+ CONTEXTUAL_LANDMARK_TAGS,
140
+ DROP_WHEN_EMPTY_TAGS,
141
+ EMBEDDED_CONTENT_TAGS,
142
+ HIDDEN_CLASS_NAMES,
143
+ MIN_CONTENT_LENGTH,
144
+ NON_CONTENT_TAGS,
145
+ REGEXPS,
146
+ RESPONSIVE_DISPLAY_OVERRIDE,
147
+ SCOREABLE_TAGS,
148
+ UNLIKELY_ROLES,
149
+ minContentLength
150
+ };