ax-grep 0.1.0 → 0.1.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.
@@ -77,8 +77,10 @@ function extractStaticSemanticTree(html, options = {}) {
77
77
  options: resolveStaticOptions(document.children, html, options),
78
78
  nextId: 1,
79
79
  ids: /* @__PURE__ */ new Map(),
80
+ referencedIds: /* @__PURE__ */ new Set(),
80
81
  collapsedControlledIds: /* @__PURE__ */ new Set(),
81
- labelsByFor: /* @__PURE__ */ new Map()
82
+ labelsByFor: /* @__PURE__ */ new Map(),
83
+ slotAssignments: void 0
82
84
  };
83
85
  indexDocument(document.children, context);
84
86
  const root = findElement(document.children, "body") ?? findElement(document.children, "html") ?? fragmentRoot(document.children);
@@ -132,6 +134,9 @@ function indexDocument(nodes, context) {
132
134
  if (!isElement(node)) continue;
133
135
  const id = attr(node, "id");
134
136
  if (id) context.ids.set(id, node);
137
+ for (const referencedId of referencedIds(node)) {
138
+ context.referencedIds.add(referencedId);
139
+ }
135
140
  if (attr(node, "aria-expanded") === "false") {
136
141
  for (const controlledId of (attr(node, "aria-controls") ?? "").split(/\s+/)) {
137
142
  if (controlledId) context.collapsedControlledIds.add(controlledId);
@@ -139,11 +144,30 @@ function indexDocument(nodes, context) {
139
144
  }
140
145
  if (node.name === "label") {
141
146
  const target = attr(node, "for");
142
- if (target) context.labelsByFor.set(target, normalizeText(descendantText(node), context.options.maxTextLength));
147
+ if (target) context.labelsByFor.set(target, node);
143
148
  }
144
149
  indexDocument(node.children, context);
145
150
  }
146
151
  }
152
+ function referencedIds(element) {
153
+ return [
154
+ attr(element, "aria-labelledby"),
155
+ attr(element, "aria-describedby"),
156
+ attr(element, "aria-details"),
157
+ attr(element, "aria-errormessage"),
158
+ attr(element, "aria-controls"),
159
+ attr(element, "aria-owns"),
160
+ attr(element, "aria-flowto"),
161
+ attr(element, "aria-activedescendant")
162
+ ].filter((value) => Boolean(value)).flatMap((value) => value.split(/\s+/).map((item) => item.trim()).filter(Boolean));
163
+ }
164
+ function descriptionReferenceIds(element) {
165
+ return new Set([
166
+ attr(element, "aria-describedby"),
167
+ attr(element, "aria-details"),
168
+ attr(element, "aria-errormessage")
169
+ ].filter((value) => Boolean(value)).flatMap((value) => value.split(/\s+/).map((item) => item.trim()).filter(Boolean)));
170
+ }
147
171
  function walkElement(element, context) {
148
172
  if (!element) return null;
149
173
  if (shouldSkipElement(element, context)) return null;
@@ -160,9 +184,15 @@ function walkElement(element, context) {
160
184
  const name = role ? computeName(element, role, context) : "";
161
185
  const tag = element.name;
162
186
  const children = shouldSkipChildrenForCollapsedElement(element, context) ? [] : collectChildren(element, context);
187
+ if (tag === "iframe" && children.length === 0 && attr(element, "src") && !attr(element, "srcdoc")) {
188
+ children.push(unavailableNode(context, "iframe", "iframe content unavailable in static HTML"));
189
+ }
163
190
  if (context.options.mode === "interactive" && !interactive) {
164
191
  return children.length > 0 ? containerNode(context, tag, children) : null;
165
192
  }
193
+ if (shouldPruneCustomElementWrapper(element, role, name, interactive, children, context)) {
194
+ return children.length === 1 ? children[0] ?? null : containerNode(context, "fragment", children);
195
+ }
166
196
  if (shouldPruneListItemWrapper(role, children, context)) {
167
197
  return children.length === 1 ? children[0] ?? null : containerNode(context, tag, children);
168
198
  }
@@ -181,6 +211,8 @@ function walkElement(element, context) {
181
211
  xpath: getXPath(element),
182
212
  children
183
213
  };
214
+ const description = computeDescription(element, context);
215
+ if (description) node.description = description;
184
216
  const text = directText(element, context.options.maxTextLength);
185
217
  if (text) node.text = text;
186
218
  const value = getValue(element);
@@ -193,21 +225,56 @@ function collectChildren(element, context) {
193
225
  const children = [];
194
226
  const repeatedSignatures = /* @__PURE__ */ new Map();
195
227
  let omitted = 0;
228
+ const shadowTemplate = element.children.find((child) => isElement(child) && isDeclarativeShadowTemplate(child));
229
+ if (shadowTemplate) {
230
+ const previousAssignments = context.slotAssignments;
231
+ context.slotAssignments = collectSlotAssignments(element);
232
+ for (const child of shadowTemplate.children) {
233
+ if (!isElement(child)) continue;
234
+ const semanticChild = walkElement(child, context);
235
+ omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);
236
+ }
237
+ context.slotAssignments = previousAssignments;
238
+ const linkFarmSummary2 = summarizeLikelyLinkFarmChildren(element, children, context);
239
+ if (linkFarmSummary2.omitted > 0) {
240
+ children.splice(0, children.length, ...linkFarmSummary2.children);
241
+ omitted += linkFarmSummary2.omitted;
242
+ }
243
+ if (omitted > 0) children.push(omittedNode(context, omitted));
244
+ return children;
245
+ }
246
+ if (element.name === "slot" && context.slotAssignments) {
247
+ const slotName = attr(element, "name") ?? "";
248
+ const assignedChildren = context.slotAssignments.get(slotName) ?? [];
249
+ const projectedChildren = assignedChildren.length > 0 ? assignedChildren : element.children.filter(isElement);
250
+ for (const child of projectedChildren) {
251
+ if (isElement(child)) {
252
+ const semanticChild = walkElement(child, context);
253
+ omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);
254
+ } else if (context.options.includeTextNodes && isText(child)) {
255
+ const text = normalizeText(child.data, context.options.maxTextLength);
256
+ if (text) {
257
+ children.push({
258
+ id: nextId(context),
259
+ tag: "#text",
260
+ role: "text",
261
+ name: text,
262
+ text,
263
+ interactive: false,
264
+ focusable: false,
265
+ children: []
266
+ });
267
+ }
268
+ }
269
+ }
270
+ if (omitted > 0) children.push(omittedNode(context, omitted));
271
+ return children;
272
+ }
196
273
  for (const child of element.children) {
197
274
  if (isElement(child)) {
198
275
  if (!context.options.includeSelectOptions && element.name === "select") continue;
199
276
  const semanticChild = walkElement(child, context);
200
- if (semanticChild) {
201
- if (shouldSummarizeRepeatedChild(element, semanticChild, repeatedSignatures, context)) {
202
- omitted += countSemanticNodes(semanticChild);
203
- continue;
204
- }
205
- if (shouldSummarizeMoreChildren(element, children, context)) {
206
- omitted += countSemanticNodes(semanticChild);
207
- } else {
208
- children.push(semanticChild);
209
- }
210
- }
277
+ omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);
211
278
  } else if (context.options.includeTextNodes && isText(child)) {
212
279
  const text = normalizeText(child.data, context.options.maxTextLength);
213
280
  if (text) {
@@ -237,12 +304,45 @@ function collectChildren(element, context) {
237
304
  if (omitted > 0) children.push(omittedNode(context, omitted));
238
305
  return children;
239
306
  }
307
+ function collectSlotAssignments(host) {
308
+ const assignments = /* @__PURE__ */ new Map();
309
+ for (const child of host.children) {
310
+ if (!isUsefulSlotAssignment(child)) continue;
311
+ const slotName = isElement(child) ? attr(child, "slot") ?? "" : "";
312
+ const assigned = assignments.get(slotName) ?? [];
313
+ assigned.push(child);
314
+ assignments.set(slotName, assigned);
315
+ }
316
+ return assignments;
317
+ }
318
+ function isUsefulSlotAssignment(node) {
319
+ if (isText(node)) return normalizeText(node.data, 120) !== "";
320
+ if (!isElement(node)) return false;
321
+ return !isDeclarativeShadowTemplate(node);
322
+ }
323
+ function appendSemanticChild(parent, child, children, repeatedSignatures, context) {
324
+ if (!child) return 0;
325
+ if (shouldSummarizeRepeatedChild(parent, child, repeatedSignatures, context)) {
326
+ return countSemanticNodes(child);
327
+ }
328
+ if (shouldSummarizeMoreChildren(parent, children, context)) {
329
+ return countSemanticNodes(child);
330
+ }
331
+ children.push(child);
332
+ return 0;
333
+ }
240
334
  function shouldSkipElement(element, context) {
241
335
  if (context.options.mode === "full") return false;
336
+ if (isDeclarativeShadowTemplate(element)) return false;
242
337
  if (nonSemanticTags.has(element.name)) return true;
243
338
  if (element.name === "noscript") return true;
244
339
  return false;
245
340
  }
341
+ function isDeclarativeShadowTemplate(element) {
342
+ if (element.name !== "template") return false;
343
+ const mode = attr(element, "shadowrootmode") ?? attr(element, "shadowroot");
344
+ return mode === "open" || mode === "closed";
345
+ }
246
346
  function shouldSummarizeMoreChildren(element, children, context) {
247
347
  if (!context.options.summarizeLargeSubtrees || context.options.mode === "full") return false;
248
348
  if (!isLargeSubtreeCandidate(element)) return false;
@@ -393,15 +493,38 @@ function shouldPrune(element, role, name, interactive, children, context) {
393
493
  if (interactive) return false;
394
494
  if (role && role !== "generic") return false;
395
495
  if (name) return false;
496
+ if (isReferencedIdTarget(element, context)) return false;
396
497
  if (children.length === 0) return true;
397
498
  if (attr(element, "id") || attr(element, "aria-label") || attr(element, "aria-labelledby")) return false;
398
499
  return children.length > 0;
399
500
  }
501
+ function isReferencedIdTarget(element, context) {
502
+ const id = attr(element, "id");
503
+ return Boolean(id && context.referencedIds.has(id));
504
+ }
400
505
  function shouldPruneListItemWrapper(role, children, context) {
401
506
  if (context.options.mode === "full") return false;
402
507
  if (role !== "listitem") return false;
403
508
  return children.some((child) => child.role === "link" || child.role === "button");
404
509
  }
510
+ function shouldPruneCustomElementWrapper(element, role, name, interactive, children, context) {
511
+ if (context.options.mode === "full") return false;
512
+ if (!isCustomElement(element)) return false;
513
+ if (interactive) return false;
514
+ if (role && role !== "generic") return false;
515
+ if (name) return false;
516
+ if (children.length === 0) return false;
517
+ if (hasUsefulHostSignal(element)) return false;
518
+ return true;
519
+ }
520
+ function isCustomElement(element) {
521
+ return element.name.includes("-");
522
+ }
523
+ function hasUsefulHostSignal(element) {
524
+ return Boolean(
525
+ attr(element, "id") || attr(element, "aria-label") || attr(element, "aria-labelledby") || attr(element, "aria-describedby") || attr(element, "aria-controls") || attr(element, "aria-expanded") || attr(element, "aria-selected") || attr(element, "aria-current") || attr(element, "tabindex")
526
+ );
527
+ }
405
528
  function getRole(element) {
406
529
  const explicit = firstToken(attr(element, "role"));
407
530
  if (explicit) return explicit;
@@ -416,6 +539,7 @@ function getRole(element) {
416
539
  if (tag === "dialog") return "dialog";
417
540
  if (tag === "figure") return "figure";
418
541
  if (tag === "form") return "form";
542
+ if (tag === "iframe") return "iframe";
419
543
  if (tag === "img") return "img";
420
544
  if (tag === "input") return inputRole(element);
421
545
  if (tag === "li") return "listitem";
@@ -447,7 +571,7 @@ function inputRole(element) {
447
571
  function computeName(element, role, context) {
448
572
  const labelledBy = attr(element, "aria-labelledby");
449
573
  if (labelledBy) {
450
- const value = labelledBy.split(/\s+/).map((id) => context.ids.get(id)).filter((item) => Boolean(item)).map((item) => descendantText(item)).join(" ");
574
+ const value = labelledBy.split(/\s+/).map((id) => context.ids.get(id)).filter((item) => Boolean(item)).map((item) => descendantText(item, context)).join(" ");
451
575
  const normalized = normalizeText(value, context.options.maxTextLength);
452
576
  if (normalized) return normalized;
453
577
  }
@@ -462,7 +586,7 @@ function computeName(element, role, context) {
462
586
  if (alt) return alt;
463
587
  }
464
588
  if (rolesNamedFromContents.has(role)) {
465
- const contents = normalizeText(descendantText(element), context.options.maxTextLength);
589
+ const contents = normalizeText(descendantText(element, context, { excludeIds: descriptionReferenceIds(element) }), context.options.maxTextLength);
466
590
  if (contents) return contents;
467
591
  }
468
592
  const title = normalizeText(attr(element, "title") ?? "", context.options.maxTextLength);
@@ -472,11 +596,14 @@ function computeName(element, role, context) {
472
596
  function labelName(element, context) {
473
597
  const id = attr(element, "id");
474
598
  if (id) {
475
- const value = context.labelsByFor.get(id);
476
- if (value) return value;
599
+ const label2 = context.labelsByFor.get(id);
600
+ if (label2) {
601
+ const value = normalizeText(descendantText(label2, context), context.options.maxTextLength);
602
+ if (value) return value;
603
+ }
477
604
  }
478
605
  const label = findClosestLabel(element);
479
- return label ? normalizeText(descendantText(label), context.options.maxTextLength) : "";
606
+ return label ? normalizeText(descendantText(label, context), context.options.maxTextLength) : "";
480
607
  }
481
608
  function findClosestLabel(element) {
482
609
  let parent = element.parent;
@@ -496,6 +623,19 @@ function elementValueName(element) {
496
623
  function getState(element) {
497
624
  const state = {};
498
625
  if (attr(element, "disabled") !== null || attr(element, "aria-disabled") === "true") state.disabled = true;
626
+ const busy = attr(element, "aria-busy");
627
+ if (busy === "true") state.busy = true;
628
+ if (busy === "false") state.busy = false;
629
+ const multiselectable = attr(element, "aria-multiselectable");
630
+ if (multiselectable === "true") state.multiselectable = true;
631
+ if (multiselectable === "false") state.multiselectable = false;
632
+ const sort = attr(element, "aria-sort");
633
+ if (sort) state.sort = normalizeText(sort, 40);
634
+ const grabbed = attr(element, "aria-grabbed");
635
+ if (grabbed === "true") state.grabbed = true;
636
+ if (grabbed === "false") state.grabbed = false;
637
+ const dropEffect = attr(element, "aria-dropeffect");
638
+ if (dropEffect) state.dropEffect = normalizeText(dropEffect, 80);
499
639
  if (attr(element, "required") !== null || attr(element, "aria-required") === "true") state.required = true;
500
640
  if (attr(element, "readonly") !== null || attr(element, "aria-readonly") === "true") state.readonly = true;
501
641
  const checked = attr(element, "aria-checked") ?? (attr(element, "checked") !== null ? "true" : null);
@@ -512,8 +652,32 @@ function getState(element) {
512
652
  if (pressed === "mixed") state.pressed = "mixed";
513
653
  const invalid = attr(element, "aria-invalid");
514
654
  if (invalid && invalid !== "false") state.invalid = invalid === "true" ? true : invalid;
655
+ const current = attr(element, "aria-current");
656
+ if (current && current !== "false") state.current = current === "true" ? true : current;
657
+ const haspopup = attr(element, "aria-haspopup");
658
+ if (haspopup && haspopup !== "false") state.haspopup = haspopup === "true" ? true : haspopup;
659
+ const controls = attr(element, "aria-controls");
660
+ if (controls) state.controls = normalizeText(controls, 120);
661
+ const live = attr(element, "aria-live");
662
+ if (live) state.live = normalizeText(live, 120);
663
+ if (attr(element, "aria-modal") === "true") state.modal = true;
664
+ const orientation = attr(element, "aria-orientation");
665
+ if (orientation) state.orientation = normalizeText(orientation, 40);
666
+ const valueMin = ariaNumber(attr(element, "aria-valuemin"));
667
+ if (typeof valueMin === "number") state.valueMin = valueMin;
668
+ const valueMax = ariaNumber(attr(element, "aria-valuemax"));
669
+ if (typeof valueMax === "number") state.valueMax = valueMax;
670
+ const valueNow = ariaNumber(attr(element, "aria-valuenow"));
671
+ if (typeof valueNow === "number") state.valueNow = valueNow;
672
+ const valueText = attr(element, "aria-valuetext");
673
+ if (valueText) state.valueText = normalizeText(valueText, 120);
515
674
  return state;
516
675
  }
676
+ function ariaNumber(value) {
677
+ if (value === null || value.trim() === "") return void 0;
678
+ const parsed = Number(value);
679
+ return Number.isFinite(parsed) ? parsed : void 0;
680
+ }
517
681
  function isInteractive(element, role, focusable) {
518
682
  if (role && interactiveRoles.has(role)) return true;
519
683
  if (focusable) return true;
@@ -595,6 +759,8 @@ function collectFlattenedBoilerplateItems(element, context) {
595
759
  xpath: getXPath(child),
596
760
  children: []
597
761
  };
762
+ const description = computeDescription(child, context);
763
+ if (description) node.description = description;
598
764
  const value = getValue(child);
599
765
  if (value) node.value = value;
600
766
  const state = getState(child);
@@ -616,28 +782,52 @@ function directText(element, maxLength) {
616
782
  maxLength
617
783
  );
618
784
  }
619
- function descendantText(element) {
785
+ function descendantText(element, context, options = {}) {
620
786
  const parts = [];
621
- collectDescendantText(element.children, parts);
787
+ const shadowTemplate = element.children.find((child) => isElement(child) && isDeclarativeShadowTemplate(child));
788
+ if (shadowTemplate && context) {
789
+ const previousAssignments = context.slotAssignments;
790
+ context.slotAssignments = collectSlotAssignments(element);
791
+ collectDescendantText(shadowTemplate.children, parts, context, options);
792
+ context.slotAssignments = previousAssignments;
793
+ return parts.join(" ");
794
+ }
795
+ collectDescendantText(element.children, parts, context, options);
622
796
  return parts.join(" ");
623
797
  }
624
- function collectDescendantText(nodes, parts) {
798
+ function collectDescendantText(nodes, parts, context, options = {}) {
625
799
  for (const node of nodes) {
626
800
  if (isText(node)) {
627
801
  parts.push(node.data);
628
802
  continue;
629
803
  }
630
804
  if (!isElement(node)) continue;
805
+ const nodeId = attr(node, "id");
806
+ if (nodeId && options.excludeIds?.has(nodeId)) continue;
807
+ if (node.name === "slot" && context?.slotAssignments) {
808
+ const slotName = attr(node, "name") ?? "";
809
+ const assigned = context.slotAssignments.get(slotName) ?? [];
810
+ collectDescendantText(assigned.length > 0 ? assigned : node.children, parts, context, options);
811
+ continue;
812
+ }
631
813
  if (nonSemanticTags.has(node.name) || node.name === "noscript") continue;
632
- collectDescendantText(node.children, parts);
814
+ collectDescendantText(node.children, parts, context, options);
633
815
  }
634
816
  }
635
817
  function normalizeText(value, maxLength) {
636
818
  const normalized = value.replace(/\s+/g, " ").trim();
637
819
  return normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1)}...` : normalized;
638
820
  }
821
+ function computeDescription(element, context) {
822
+ const describedBy = attr(element, "aria-describedby");
823
+ if (describedBy) {
824
+ const text = describedBy.split(/\s+/).map((id) => context.ids.get(id)).filter((item) => Boolean(item)).map((item) => descendantText(item, context)).filter(Boolean).join(" ");
825
+ if (text) return normalizeText(text, context.options.maxTextLength);
826
+ }
827
+ return normalizeText(attr(element, "title") ?? "", context.options.maxTextLength);
828
+ }
639
829
  function getValue(element) {
640
- return normalizeText(attr(element, "value") ?? "", 240);
830
+ return normalizeText(attr(element, "value") ?? attr(element, "aria-valuetext") ?? attr(element, "aria-valuenow") ?? "", 240);
641
831
  }
642
832
  function getSelector(element) {
643
833
  const id = attr(element, "id");
@@ -732,4 +922,4 @@ function fragmentRoot(children) {
732
922
  export {
733
923
  extractStaticSemanticTree
734
924
  };
735
- //# sourceMappingURL=chunk-Z7V6PIPH.js.map
925
+ //# sourceMappingURL=chunk-ZXTURCRT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/static.ts"],"sourcesContent":["import { DomUtils, parseDocument } from \"htmlparser2\";\nimport { Element as DomElement } from \"domhandler\";\nimport type { AnyNode, Element, Text } from \"domhandler\";\nimport type { SemanticNode, SemanticNodeState, SemanticTreeOptions } from \"./types\";\n\ntype DescendantTextOptions = {\n excludeIds?: Set<string>;\n};\n\ntype StaticContext = {\n options: Required<Pick<\n SemanticTreeOptions,\n \"excludeLikelyAds\" | \"excludeLikelyBoilerplate\" | \"includeAttributes\" | \"includeHidden\" | \"includeSelectOptions\" | \"includeTextNodes\" | \"maxChildrenPerNode\" | \"maxLinkFarmChildren\" | \"maxRepeatedSubtreeInstances\" | \"maxTextLength\" | \"mode\" | \"pruneCollapsedSubtrees\" | \"pruneLikelyClosedOverlays\" | \"summarizeLargeSubtrees\" | \"summarizeLikelyLinkFarms\" | \"summarizeRepeatedSubtrees\"\n >>;\n nextId: number;\n ids: Map<string, Element>;\n referencedIds: Set<string>;\n collapsedControlledIds: Set<string>;\n labelsByFor: Map<string, Element>;\n slotAssignments: Map<string, AnyNode[]> | undefined;\n};\n\nconst defaultOptions = {\n includeAttributes: true,\n excludeLikelyAds: false,\n includeHidden: false,\n includeSelectOptions: true,\n includeTextNodes: false,\n maxTextLength: 240,\n mode: \"compact\",\n excludeLikelyBoilerplate: false,\n maxChildrenPerNode: 80,\n maxLinkFarmChildren: 24,\n maxRepeatedSubtreeInstances: 3,\n pruneCollapsedSubtrees: true,\n pruneLikelyClosedOverlays: true,\n summarizeLargeSubtrees: true,\n summarizeLikelyLinkFarms: true,\n summarizeRepeatedSubtrees: true,\n} satisfies StaticContext[\"options\"];\n\nconst interactiveRoles = new Set([\n \"button\",\n \"checkbox\",\n \"combobox\",\n \"link\",\n \"listbox\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"radio\",\n \"searchbox\",\n \"slider\",\n \"spinbutton\",\n \"switch\",\n \"tab\",\n \"textbox\",\n \"treeitem\",\n]);\n\nconst landmarkTags: Record<string, string> = {\n article: \"article\",\n aside: \"complementary\",\n footer: \"contentinfo\",\n header: \"banner\",\n main: \"main\",\n nav: \"navigation\",\n section: \"region\",\n};\n\nconst rolesNamedFromContents = new Set([\n \"button\",\n \"cell\",\n \"checkbox\",\n \"columnheader\",\n \"heading\",\n \"link\",\n \"listitem\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"radio\",\n \"rowheader\",\n \"switch\",\n \"tab\",\n \"treeitem\",\n]);\n\nconst hiddenStylePattern = /(?:^|;)\\s*(display\\s*:\\s*none|visibility\\s*:\\s*hidden|content-visibility\\s*:\\s*hidden|opacity\\s*:\\s*0(?:\\.0+)?)(?:;|$)/i;\nconst nonSemanticTags = new Set([\"head\", \"link\", \"meta\", \"script\", \"style\", \"template\"]);\n\nexport type StaticSemanticTreeOptions = Pick<\n SemanticTreeOptions,\n \"excludeLikelyAds\" | \"excludeLikelyBoilerplate\" | \"includeAttributes\" | \"includeHidden\" | \"includeSelectOptions\" | \"includeTextNodes\" | \"maxChildrenPerNode\" | \"maxLinkFarmChildren\" | \"maxRepeatedSubtreeInstances\" | \"maxTextLength\" | \"mode\" | \"pruneCollapsedSubtrees\" | \"pruneLikelyClosedOverlays\" | \"summarizeLargeSubtrees\" | \"summarizeLikelyLinkFarms\" | \"summarizeRepeatedSubtrees\"\n>;\n\nexport function extractStaticSemanticTree(html: string, options: StaticSemanticTreeOptions = {}): SemanticNode {\n const document = parseDocument(html, {\n lowerCaseAttributeNames: true,\n lowerCaseTags: true,\n recognizeSelfClosing: true,\n });\n const context: StaticContext = {\n options: resolveStaticOptions(document.children, html, options),\n nextId: 1,\n ids: new Map(),\n referencedIds: new Set(),\n collapsedControlledIds: new Set(),\n labelsByFor: new Map(),\n slotAssignments: undefined,\n };\n indexDocument(document.children, context);\n const root = findElement(document.children, \"body\") ?? findElement(document.children, \"html\") ?? fragmentRoot(document.children);\n return walkElement(root, context) ?? unavailableNode(context, \"document\", \"HTML has no inspectable root\");\n}\n\nexport { extractStaticSemanticTree as extract };\n\nfunction resolveStaticOptions(nodes: AnyNode[], html: string, options: StaticSemanticTreeOptions): StaticContext[\"options\"] {\n const inferred = inferStaticSourceProfile(nodes, html);\n const resolved = { ...defaultOptions };\n\n if (inferred.wikiLike) {\n resolved.maxChildrenPerNode = 400;\n resolved.maxLinkFarmChildren = 80;\n }\n if (inferred.forumLike) {\n resolved.maxLinkFarmChildren = 19;\n }\n\n return { ...resolved, ...options };\n}\n\nfunction inferStaticSourceProfile(nodes: AnyNode[], html: string): { wikiLike: boolean; forumLike: boolean } {\n const root = findElement(nodes, \"html\") ?? fragmentRoot(nodes);\n const body = findElement(nodes, \"body\");\n const profileText = [\n attr(root, \"class\"),\n attr(root, \"id\"),\n body ? attr(body, \"class\") : \"\",\n body ? attr(body, \"id\") : \"\",\n firstMetaContent(root, \"generator\"),\n firstMetaContent(root, \"application-name\"),\n firstMetaContent(root, \"twitter:site\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n\n return {\n wikiLike: /\\b(mediawiki|mw-parser-output|wikipedia|wikimedia)\\b/.test(profileText)\n || /\\b(?:id|class)=[\"'][^\"']*\\bmw-parser-output\\b/i.test(html),\n forumLike: /\\b(5ch|2ch|dcinside|ruliweb|clien|bbs|board|forum|gallery|gall|thread|subback)\\b/.test(profileText)\n || /\\b(?:id|class)=[\"'][^\"']*\\b(?:gall_list|threadlist|thread-list|board-list|article-list|subback|bbs|forum)\\b/i.test(html)\n || /(?:갤러리|게시판|댓글|개념글|스레드|レス|話題度)/.test(html),\n };\n}\n\nfunction firstMetaContent(root: Element | undefined, name: string): string {\n /* v8 ignore next -- internal callers pass a fragment fallback when html is absent. */\n if (!root) return \"\";\n const stack = [...root.children];\n while (stack.length > 0) {\n const node = stack.shift();\n /* v8 ignore next -- guarded for noUncheckedIndexedAccess; loop condition prevents this. */\n if (!node) continue;\n if (!isElement(node)) continue;\n if (node.name === \"meta\" && (attr(node, \"name\") === name || attr(node, \"property\") === name)) {\n return attr(node, \"content\") ?? \"\";\n }\n stack.unshift(...node.children);\n }\n return \"\";\n}\n\nfunction indexDocument(nodes: AnyNode[], context: StaticContext): void {\n for (const node of nodes) {\n if (!isElement(node)) continue;\n const id = attr(node, \"id\");\n if (id) context.ids.set(id, node);\n for (const referencedId of referencedIds(node)) {\n context.referencedIds.add(referencedId);\n }\n if (attr(node, \"aria-expanded\") === \"false\") {\n for (const controlledId of (attr(node, \"aria-controls\") ?? \"\").split(/\\s+/)) {\n if (controlledId) context.collapsedControlledIds.add(controlledId);\n }\n }\n if (node.name === \"label\") {\n const target = attr(node, \"for\");\n if (target) context.labelsByFor.set(target, node);\n }\n indexDocument(node.children, context);\n }\n}\n\nfunction referencedIds(element: Element): string[] {\n return [\n attr(element, \"aria-labelledby\"),\n attr(element, \"aria-describedby\"),\n attr(element, \"aria-details\"),\n attr(element, \"aria-errormessage\"),\n attr(element, \"aria-controls\"),\n attr(element, \"aria-owns\"),\n attr(element, \"aria-flowto\"),\n attr(element, \"aria-activedescendant\"),\n ]\n .filter((value): value is string => Boolean(value))\n .flatMap((value) => value.split(/\\s+/).map((item) => item.trim()).filter(Boolean));\n}\n\nfunction descriptionReferenceIds(element: Element): Set<string> {\n return new Set([\n attr(element, \"aria-describedby\"),\n attr(element, \"aria-details\"),\n attr(element, \"aria-errormessage\"),\n ]\n .filter((value): value is string => Boolean(value))\n .flatMap((value) => value.split(/\\s+/).map((item) => item.trim()).filter(Boolean)));\n}\n\nfunction walkElement(element: Element | undefined, context: StaticContext): SemanticNode | null {\n /* v8 ignore next -- public extraction always supplies body/html or a fragment root. */\n if (!element) return null;\n if (shouldSkipElement(element, context)) return null;\n if (!context.options.includeHidden && isHidden(element)) return null;\n if (context.options.excludeLikelyAds && isLikelyAd(element)) return null;\n if (context.options.excludeLikelyBoilerplate && isLikelyBoilerplateTable(element)) return flattenBoilerplateTable(element, context);\n if (context.options.excludeLikelyBoilerplate && isLikelyBoilerplate(element)) return null;\n if (!context.options.includeHidden && isCollapsedControlledElement(element, context)) return null;\n if (!context.options.includeHidden && isLikelyClosedOverlay(element, context)) return null;\n\n const role = getRole(element);\n const state = getState(element);\n const focusable = isFocusable(element, role);\n const interactive = isInteractive(element, role, focusable);\n const name = role ? computeName(element, role, context) : \"\";\n const tag = element.name;\n const children = shouldSkipChildrenForCollapsedElement(element, context) ? [] : collectChildren(element, context);\n if (tag === \"iframe\" && children.length === 0 && attr(element, \"src\") && !attr(element, \"srcdoc\")) {\n children.push(unavailableNode(context, \"iframe\", \"iframe content unavailable in static HTML\"));\n }\n\n if (context.options.mode === \"interactive\" && !interactive) {\n return children.length > 0 ? containerNode(context, tag, children) : null;\n }\n if (shouldPruneCustomElementWrapper(element, role, name, interactive, children, context)) {\n return children.length === 1 ? children[0] ?? null : containerNode(context, \"fragment\", children);\n }\n if (shouldPruneListItemWrapper(role, children, context)) {\n return children.length === 1 ? children[0] ?? null : containerNode(context, tag, children);\n }\n if (shouldPrune(element, role, name, interactive, children, context)) {\n if (children.length === 0) return null;\n return children.length === 1 ? children[0] ?? null : containerNode(context, tag, children);\n }\n\n const node: SemanticNode = {\n id: nextId(context),\n tag,\n role,\n name,\n interactive,\n focusable,\n selector: getSelector(element),\n xpath: getXPath(element),\n children,\n };\n const description = computeDescription(element, context);\n if (description) node.description = description;\n const text = directText(element, context.options.maxTextLength);\n if (text) node.text = text;\n const value = getValue(element);\n if (value) node.value = value;\n if (Object.keys(state).length > 0) node.state = state;\n if (context.options.includeAttributes) node.attributes = { ...element.attribs };\n return node;\n}\n\nfunction collectChildren(element: Element, context: StaticContext): SemanticNode[] {\n const children: SemanticNode[] = [];\n const repeatedSignatures = new Map<string, number>();\n let omitted = 0;\n const shadowTemplate = element.children.find((child): child is Element => isElement(child) && isDeclarativeShadowTemplate(child));\n if (shadowTemplate) {\n const previousAssignments = context.slotAssignments;\n context.slotAssignments = collectSlotAssignments(element);\n for (const child of shadowTemplate.children) {\n if (!isElement(child)) continue;\n const semanticChild = walkElement(child, context);\n omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);\n }\n context.slotAssignments = previousAssignments;\n const linkFarmSummary = summarizeLikelyLinkFarmChildren(element, children, context);\n if (linkFarmSummary.omitted > 0) {\n children.splice(0, children.length, ...linkFarmSummary.children);\n omitted += linkFarmSummary.omitted;\n }\n if (omitted > 0) children.push(omittedNode(context, omitted));\n return children;\n }\n\n if (element.name === \"slot\" && context.slotAssignments) {\n const slotName = attr(element, \"name\") ?? \"\";\n const assignedChildren = context.slotAssignments.get(slotName) ?? [];\n const projectedChildren = assignedChildren.length > 0 ? assignedChildren : element.children.filter(isElement);\n for (const child of projectedChildren) {\n if (isElement(child)) {\n const semanticChild = walkElement(child, context);\n omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);\n } else if (context.options.includeTextNodes && isText(child)) {\n const text = normalizeText(child.data, context.options.maxTextLength);\n if (text) {\n children.push({\n id: nextId(context),\n tag: \"#text\",\n role: \"text\",\n name: text,\n text,\n interactive: false,\n focusable: false,\n children: [],\n });\n }\n }\n }\n if (omitted > 0) children.push(omittedNode(context, omitted));\n return children;\n }\n\n for (const child of element.children) {\n if (isElement(child)) {\n if (!context.options.includeSelectOptions && element.name === \"select\") continue;\n const semanticChild = walkElement(child, context);\n omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);\n } else if (context.options.includeTextNodes && isText(child)) {\n const text = normalizeText(child.data, context.options.maxTextLength);\n if (text) {\n const textNode: SemanticNode = {\n id: nextId(context),\n tag: \"#text\",\n role: \"text\",\n name: text,\n text,\n interactive: false,\n focusable: false,\n children: [],\n };\n if (shouldSummarizeMoreChildren(element, children, context)) {\n omitted += 1;\n } else {\n children.push(textNode);\n }\n }\n }\n }\n const linkFarmSummary = summarizeLikelyLinkFarmChildren(element, children, context);\n if (linkFarmSummary.omitted > 0) {\n children.splice(0, children.length, ...linkFarmSummary.children);\n omitted += linkFarmSummary.omitted;\n }\n if (omitted > 0) children.push(omittedNode(context, omitted));\n return children;\n}\n\nfunction collectSlotAssignments(host: Element): Map<string, AnyNode[]> {\n const assignments = new Map<string, AnyNode[]>();\n for (const child of host.children) {\n if (!isUsefulSlotAssignment(child)) continue;\n const slotName = isElement(child) ? attr(child, \"slot\") ?? \"\" : \"\";\n const assigned = assignments.get(slotName) ?? [];\n assigned.push(child);\n assignments.set(slotName, assigned);\n }\n return assignments;\n}\n\nfunction isUsefulSlotAssignment(node: AnyNode): boolean {\n if (isText(node)) return normalizeText(node.data, 120) !== \"\";\n if (!isElement(node)) return false;\n return !isDeclarativeShadowTemplate(node);\n}\n\nfunction appendSemanticChild(\n parent: Element,\n child: SemanticNode | null,\n children: SemanticNode[],\n repeatedSignatures: Map<string, number>,\n context: StaticContext,\n): number {\n if (!child) return 0;\n if (shouldSummarizeRepeatedChild(parent, child, repeatedSignatures, context)) {\n return countSemanticNodes(child);\n }\n if (shouldSummarizeMoreChildren(parent, children, context)) {\n return countSemanticNodes(child);\n }\n children.push(child);\n return 0;\n}\n\nfunction shouldSkipElement(element: Element, context: StaticContext): boolean {\n if (context.options.mode === \"full\") return false;\n if (isDeclarativeShadowTemplate(element)) return false;\n if (nonSemanticTags.has(element.name)) return true;\n if (element.name === \"noscript\") return true;\n return false;\n}\n\nfunction isDeclarativeShadowTemplate(element: Element): boolean {\n if (element.name !== \"template\") return false;\n const mode = attr(element, \"shadowrootmode\") ?? attr(element, \"shadowroot\");\n return mode === \"open\" || mode === \"closed\";\n}\n\nfunction shouldSummarizeMoreChildren(element: Element, children: SemanticNode[], context: StaticContext): boolean {\n if (!context.options.summarizeLargeSubtrees || context.options.mode === \"full\") return false;\n if (!isLargeSubtreeCandidate(element)) return false;\n return children.length >= context.options.maxChildrenPerNode;\n}\n\nfunction isLargeSubtreeCandidate(element: Element): boolean {\n return [\"nav\", \"ul\", \"ol\", \"div\", \"section\", \"footer\", \"header\", \"main\"].includes(element.name);\n}\n\nfunction summarizeLikelyLinkFarmChildren(\n element: Element,\n children: SemanticNode[],\n context: StaticContext,\n): { children: SemanticNode[]; omitted: number } {\n if (!context.options.summarizeLikelyLinkFarms || context.options.mode === \"full\") return { children, omitted: 0 };\n if (children.length <= context.options.maxLinkFarmChildren) return { children, omitted: 0 };\n if (!isLikelyLinkFarmContainer(element)) return { children, omitted: 0 };\n const stats = childLinkFarmStats(children);\n if (stats.linkishChildren < Math.max(8, Math.floor(children.length * 0.65))) return { children, omitted: 0 };\n if (stats.contentRichChildren > Math.max(2, Math.floor(children.length * 0.2))) return { children, omitted: 0 };\n\n const kept: SemanticNode[] = [];\n let omitted = 0;\n let keptLinkish = 0;\n for (const child of children) {\n /* v8 ignore next 4 -- covered by link-farm tests, but V8 maps this continue branch unreliably through TS output. */\n if (!isLinkishSummaryChild(child)) {\n kept.push(child);\n continue;\n }\n if (keptLinkish < context.options.maxLinkFarmChildren) {\n kept.push(child);\n keptLinkish += 1;\n } else {\n omitted += countSemanticNodes(child);\n }\n }\n return omitted > 0 ? { children: kept, omitted } : { children, omitted: 0 };\n}\n\nfunction isLikelyLinkFarmContainer(element: Element): boolean {\n if ([\"nav\", \"ul\", \"ol\", \"aside\", \"footer\", \"header\"].includes(element.name)) return true;\n if (![\"div\", \"section\"].includes(element.name)) return false;\n const value = [\n attr(element, \"id\"),\n attr(element, \"class\"),\n attr(element, \"role\"),\n attr(element, \"aria-label\"),\n attr(element, \"title\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n if (/\\b(article|body|content|contents|entry|main|post|story|text|view)\\b/.test(value)) return false;\n return /\\b(board|category|comment|footer|gallery|gnb|header|issue|list|menu|nav|popular|recent|recommend|related|reply|sidebar|tab)\\b/.test(value)\n || /갤러리|댓글|개념글|관련|목록|베스트|인기|최근|추천|카테고리/.test(value);\n}\n\nfunction childLinkFarmStats(children: SemanticNode[]): { linkishChildren: number; contentRichChildren: number } {\n let linkishChildren = 0;\n let contentRichChildren = 0;\n for (const child of children) {\n if (isLinkishSummaryChild(child)) linkishChildren += 1;\n if (isContentRichSummaryChild(child)) contentRichChildren += 1;\n }\n return { linkishChildren, contentRichChildren };\n}\n\nfunction isLinkishSummaryChild(node: SemanticNode): boolean {\n const stats = semanticRoleStats(node);\n return stats.links > 0\n && stats.formControls === 0\n && stats.tables === 0\n && stats.paragraphs <= 1\n && stats.contentContainers === 0;\n}\n\nfunction isContentRichSummaryChild(node: SemanticNode): boolean {\n const stats = semanticRoleStats(node);\n return stats.paragraphs > 1 || stats.tables > 0 || stats.contentContainers > 0 || stats.formControls > 0;\n}\n\nfunction semanticRoleStats(node: SemanticNode): {\n links: number;\n paragraphs: number;\n tables: number;\n formControls: number;\n contentContainers: number;\n} {\n const role = node.role ?? node.tag;\n const stats = {\n links: role === \"link\" ? 1 : 0,\n paragraphs: role === \"p\" || role === \"text\" ? 1 : 0,\n tables: role === \"table\" || role === \"row\" || role === \"cell\" ? 1 : 0,\n formControls: role === \"textbox\" || role === \"searchbox\" || role === \"combobox\" || role === \"listbox\" || role === \"checkbox\" || role === \"radio\" || role === \"slider\" || role === \"spinbutton\" || role === \"switch\" ? 1 : 0,\n contentContainers: role === \"article\" || role === \"main\" ? 1 : 0,\n };\n for (const child of node.children) {\n const childStats = semanticRoleStats(child);\n stats.links += childStats.links;\n stats.paragraphs += childStats.paragraphs;\n stats.tables += childStats.tables;\n stats.formControls += childStats.formControls;\n stats.contentContainers += childStats.contentContainers;\n }\n return stats;\n}\n\nfunction shouldSummarizeRepeatedChild(\n parent: Element,\n child: SemanticNode,\n signatures: Map<string, number>,\n context: StaticContext,\n): boolean {\n if (!context.options.summarizeRepeatedSubtrees || context.options.mode === \"full\") return false;\n if (!isRepeatedSubtreeCandidate(parent)) return false;\n const signature = semanticSignature(child);\n const count = signatures.get(signature) ?? 0;\n signatures.set(signature, count + 1);\n return count >= context.options.maxRepeatedSubtreeInstances;\n}\n\nfunction isRepeatedSubtreeCandidate(element: Element): boolean {\n return [\"body\", \"main\", \"nav\", \"ul\", \"ol\", \"div\", \"section\", \"footer\", \"header\", \"aside\"].includes(element.name);\n}\n\nfunction semanticSignature(node: SemanticNode): string {\n const childSignatures = node.children.map(semanticSignature).join(\",\");\n return `${node.tag}|${node.role ?? \"\"}|${node.name}|${node.text ?? \"\"}|${node.value ?? \"\"}|${node.interactive ? \"i\" : \"\"}[${childSignatures}]`;\n}\n\nfunction countSemanticNodes(node: SemanticNode): number {\n let count = 1;\n for (const child of node.children) count += countSemanticNodes(child);\n return count;\n}\n\nfunction shouldSkipChildrenForCollapsedElement(element: Element, context: StaticContext): boolean {\n if (!context.options.pruneCollapsedSubtrees || context.options.includeHidden) return false;\n if (attr(element, \"aria-expanded\") === \"false\") return true;\n if (element.name === \"details\" && attr(element, \"open\") === null) return true;\n if (element.name === \"dialog\" && attr(element, \"open\") === null) return true;\n if (attr(element, \"popover\") !== null && attr(element, \"open\") === null) return true;\n return false;\n}\n\nfunction isCollapsedControlledElement(element: Element, context: StaticContext): boolean {\n const id = attr(element, \"id\");\n return Boolean(id && context.options.pruneCollapsedSubtrees && context.collapsedControlledIds.has(id));\n}\n\nfunction isLikelyClosedOverlay(element: Element, context: StaticContext): boolean {\n if (!context.options.pruneLikelyClosedOverlays || context.options.mode === \"full\") return false;\n if (hasUsefulOpenSignal(element)) return false;\n if (!hasOverlaySignal(element)) return false;\n if (hasDirectFocusableIntent(element)) return false;\n return hasOffscreenOrClosedStyle(element) || hasClosedClassSignal(element) || hasInertSignal(element);\n}\n\nfunction hasUsefulOpenSignal(element: Element): boolean {\n return attr(element, \"open\") !== null\n || attr(element, \"aria-expanded\") === \"true\"\n || attr(element, \"aria-modal\") === \"true\"\n || attr(element, \"data-open\") === \"true\"\n || attr(element, \"data-state\") === \"open\";\n}\n\nfunction hasOverlaySignal(element: Element): boolean {\n const value = [element.name, attr(element, \"id\"), attr(element, \"class\"), attr(element, \"role\"), attr(element, \"aria-label\")]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return /\\b(drawer|modal|dialog|popover|overlay|hamburger|menu|sidebar|sheet|flyout|dropdown)\\b/.test(value);\n}\n\nfunction hasDirectFocusableIntent(element: Element): boolean {\n const tabindex = attr(element, \"tabindex\");\n return tabindex !== null && Number(tabindex) >= 0;\n}\n\nfunction hasInertSignal(element: Element): boolean {\n return attr(element, \"inert\") !== null || attr(element, \"aria-hidden\") === \"true\";\n}\n\nfunction hasClosedClassSignal(element: Element): boolean {\n const className = attr(element, \"class\") ?? \"\";\n return /\\b(closed|collapsed|hidden|inactive|is-closed|is-hidden)\\b/i.test(className);\n}\n\nfunction hasOffscreenOrClosedStyle(element: Element): boolean {\n const style = attr(element, \"style\") ?? \"\";\n if (!style) return false;\n const normalized = style.replace(/\\s+/g, \"\").toLowerCase();\n return /(?:^|;)(?:left|right|top|bottom):-\\d{2,}(?:px|rem|em|vw|vh|%)/.test(normalized)\n || /(?:^|;)transform:translate[xy]?\\(-[1-9]\\d*%/.test(normalized)\n || /(?:^|;)(?:max-height|height):0(?:px|rem|em|%)?/.test(normalized)\n || /(?:^|;)pointer-events:none/.test(normalized);\n}\n\nfunction shouldPrune(\n element: Element,\n role: string | null,\n name: string,\n interactive: boolean,\n children: SemanticNode[],\n context: StaticContext,\n): boolean {\n if (context.options.mode === \"full\") return false;\n if (role === \"none\" || role === \"presentation\") return true;\n if (interactive) return false;\n if (role && role !== \"generic\") return false;\n if (name) return false;\n if (isReferencedIdTarget(element, context)) return false;\n if (children.length === 0) return true;\n if (attr(element, \"id\") || attr(element, \"aria-label\") || attr(element, \"aria-labelledby\")) return false;\n return children.length > 0;\n}\n\nfunction isReferencedIdTarget(element: Element, context: StaticContext): boolean {\n const id = attr(element, \"id\");\n return Boolean(id && context.referencedIds.has(id));\n}\n\nfunction shouldPruneListItemWrapper(role: string | null, children: SemanticNode[], context: StaticContext): boolean {\n if (context.options.mode === \"full\") return false;\n if (role !== \"listitem\") return false;\n return children.some((child) => child.role === \"link\" || child.role === \"button\");\n}\n\nfunction shouldPruneCustomElementWrapper(\n element: Element,\n role: string | null,\n name: string,\n interactive: boolean,\n children: SemanticNode[],\n context: StaticContext,\n): boolean {\n if (context.options.mode === \"full\") return false;\n if (!isCustomElement(element)) return false;\n if (interactive) return false;\n if (role && role !== \"generic\") return false;\n if (name) return false;\n if (children.length === 0) return false;\n if (hasUsefulHostSignal(element)) return false;\n return true;\n}\n\nfunction isCustomElement(element: Element): boolean {\n return element.name.includes(\"-\");\n}\n\nfunction hasUsefulHostSignal(element: Element): boolean {\n return Boolean(\n attr(element, \"id\")\n || attr(element, \"aria-label\")\n || attr(element, \"aria-labelledby\")\n || attr(element, \"aria-describedby\")\n || attr(element, \"aria-controls\")\n || attr(element, \"aria-expanded\")\n || attr(element, \"aria-selected\")\n || attr(element, \"aria-current\")\n || attr(element, \"tabindex\")\n );\n}\n\nfunction getRole(element: Element): string | null {\n const explicit = firstToken(attr(element, \"role\"));\n if (explicit) return explicit;\n const tag = element.name;\n if (tag === \"section\" && !hasExplicitNameSource(element)) return null;\n if (tag === \"form\" && !hasExplicitNameSource(element)) return null;\n if (tag in landmarkTags) return landmarkTags[tag] ?? null;\n if (/^h[1-6]$/.test(tag)) return \"heading\";\n if (tag === \"a\" || tag === \"area\") return attr(element, \"href\") ? \"link\" : null;\n if (tag === \"button\") return \"button\";\n if (tag === \"details\" || tag === \"fieldset\") return \"group\";\n if (tag === \"dialog\") return \"dialog\";\n if (tag === \"figure\") return \"figure\";\n if (tag === \"form\") return \"form\";\n if (tag === \"iframe\") return \"iframe\";\n if (tag === \"img\") return \"img\";\n if (tag === \"input\") return inputRole(element);\n if (tag === \"li\") return \"listitem\";\n if (tag === \"ol\" || tag === \"ul\") return \"list\";\n if (tag === \"option\") return \"option\";\n if (tag === \"p\") return \"p\";\n if (tag === \"progress\") return \"progressbar\";\n if (tag === \"select\") return attr(element, \"multiple\") !== null ? \"listbox\" : \"combobox\";\n if (tag === \"summary\") return \"button\";\n if (tag === \"table\") return \"table\";\n if (tag === \"td\") return \"cell\";\n if (tag === \"textarea\") return \"textbox\";\n if (tag === \"th\") return attr(element, \"scope\") === \"row\" ? \"rowheader\" : \"columnheader\";\n if (tag === \"tr\") return \"row\";\n return null;\n}\n\nfunction inputRole(element: Element): string | null {\n const type = (attr(element, \"type\") ?? \"text\").toLowerCase();\n if (type === \"hidden\") return null;\n if (type === \"button\" || type === \"submit\" || type === \"reset\") return \"button\";\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"image\") return \"button\";\n if (type === \"radio\") return \"radio\";\n if (type === \"range\") return \"slider\";\n if (type === \"search\") return \"searchbox\";\n if (type === \"number\") return \"spinbutton\";\n return \"textbox\";\n}\n\nfunction computeName(element: Element, role: string, context: StaticContext): string {\n const labelledBy = attr(element, \"aria-labelledby\");\n if (labelledBy) {\n const value = labelledBy\n .split(/\\s+/)\n .map((id) => context.ids.get(id))\n .filter((item): item is Element => Boolean(item))\n .map((item) => descendantText(item, context))\n .join(\" \");\n const normalized = normalizeText(value, context.options.maxTextLength);\n if (normalized) return normalized;\n }\n\n const ariaLabel = normalizeText(attr(element, \"aria-label\") ?? \"\", context.options.maxTextLength);\n if (ariaLabel) return ariaLabel;\n\n const labelled = labelName(element, context);\n if (labelled) return labelled;\n\n const valueName = elementValueName(element);\n if (valueName) return normalizeText(valueName, context.options.maxTextLength);\n\n if (role === \"img\") {\n const alt = normalizeText(attr(element, \"alt\") ?? \"\", context.options.maxTextLength);\n if (alt) return alt;\n }\n\n if (rolesNamedFromContents.has(role)) {\n const contents = normalizeText(descendantText(element, context, { excludeIds: descriptionReferenceIds(element) }), context.options.maxTextLength);\n if (contents) return contents;\n }\n\n const title = normalizeText(attr(element, \"title\") ?? \"\", context.options.maxTextLength);\n if (title) return title;\n\n return \"\";\n}\n\nfunction labelName(element: Element, context: StaticContext): string {\n const id = attr(element, \"id\");\n if (id) {\n const label = context.labelsByFor.get(id);\n if (label) {\n const value = normalizeText(descendantText(label, context), context.options.maxTextLength);\n if (value) return value;\n }\n }\n const label = findClosestLabel(element);\n return label ? normalizeText(descendantText(label, context), context.options.maxTextLength) : \"\";\n}\n\nfunction findClosestLabel(element: Element): Element | null {\n let parent = element.parent;\n while (parent) {\n if (isElement(parent) && parent.name === \"label\") return parent;\n parent = parent.parent;\n }\n return null;\n}\n\nfunction elementValueName(element: Element): string {\n if (element.name === \"input\") {\n const type = (attr(element, \"type\") ?? \"text\").toLowerCase();\n if (type === \"button\" || type === \"submit\" || type === \"reset\") return attr(element, \"value\") ?? \"\";\n }\n return \"\";\n}\n\nfunction getState(element: Element): SemanticNodeState {\n const state: SemanticNodeState = {};\n if (attr(element, \"disabled\") !== null || attr(element, \"aria-disabled\") === \"true\") state.disabled = true;\n const busy = attr(element, \"aria-busy\");\n if (busy === \"true\") state.busy = true;\n if (busy === \"false\") state.busy = false;\n const multiselectable = attr(element, \"aria-multiselectable\");\n if (multiselectable === \"true\") state.multiselectable = true;\n if (multiselectable === \"false\") state.multiselectable = false;\n const sort = attr(element, \"aria-sort\");\n if (sort) state.sort = normalizeText(sort, 40);\n const grabbed = attr(element, \"aria-grabbed\");\n if (grabbed === \"true\") state.grabbed = true;\n if (grabbed === \"false\") state.grabbed = false;\n const dropEffect = attr(element, \"aria-dropeffect\");\n if (dropEffect) state.dropEffect = normalizeText(dropEffect, 80);\n if (attr(element, \"required\") !== null || attr(element, \"aria-required\") === \"true\") state.required = true;\n if (attr(element, \"readonly\") !== null || attr(element, \"aria-readonly\") === \"true\") state.readonly = true;\n const checked = attr(element, \"aria-checked\") ?? (attr(element, \"checked\") !== null ? \"true\" : null);\n if (checked === \"true\") state.checked = true;\n if (checked === \"false\") state.checked = false;\n if (checked === \"mixed\") state.checked = \"mixed\";\n if (attr(element, \"selected\") !== null || attr(element, \"aria-selected\") === \"true\") state.selected = true;\n const expanded = attr(element, \"aria-expanded\");\n if (expanded === \"true\") state.expanded = true;\n if (expanded === \"false\") state.expanded = false;\n const pressed = attr(element, \"aria-pressed\");\n if (pressed === \"true\") state.pressed = true;\n if (pressed === \"false\") state.pressed = false;\n if (pressed === \"mixed\") state.pressed = \"mixed\";\n const invalid = attr(element, \"aria-invalid\");\n if (invalid && invalid !== \"false\") state.invalid = invalid === \"true\" ? true : invalid;\n const current = attr(element, \"aria-current\");\n if (current && current !== \"false\") state.current = current === \"true\" ? true : current;\n const haspopup = attr(element, \"aria-haspopup\");\n if (haspopup && haspopup !== \"false\") state.haspopup = haspopup === \"true\" ? true : haspopup;\n const controls = attr(element, \"aria-controls\");\n if (controls) state.controls = normalizeText(controls, 120);\n const live = attr(element, \"aria-live\");\n if (live) state.live = normalizeText(live, 120);\n if (attr(element, \"aria-modal\") === \"true\") state.modal = true;\n const orientation = attr(element, \"aria-orientation\");\n if (orientation) state.orientation = normalizeText(orientation, 40);\n const valueMin = ariaNumber(attr(element, \"aria-valuemin\"));\n if (typeof valueMin === \"number\") state.valueMin = valueMin;\n const valueMax = ariaNumber(attr(element, \"aria-valuemax\"));\n if (typeof valueMax === \"number\") state.valueMax = valueMax;\n const valueNow = ariaNumber(attr(element, \"aria-valuenow\"));\n if (typeof valueNow === \"number\") state.valueNow = valueNow;\n const valueText = attr(element, \"aria-valuetext\");\n if (valueText) state.valueText = normalizeText(valueText, 120);\n return state;\n}\n\nfunction ariaNumber(value: string | null): number | undefined {\n if (value === null || value.trim() === \"\") return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction isInteractive(element: Element, role: string | null, focusable: boolean): boolean {\n if (role && interactiveRoles.has(role)) return true;\n if (focusable) return true;\n return [\"button\", \"input\", \"select\", \"textarea\"].includes(element.name);\n}\n\nfunction isFocusable(element: Element, role: string | null): boolean {\n if (attr(element, \"disabled\") !== null) return false;\n const tabindex = attr(element, \"tabindex\");\n if (tabindex !== null && Number(tabindex) >= 0) return true;\n if (role && interactiveRoles.has(role)) return true;\n return element.name === \"a\" && attr(element, \"href\") !== null;\n}\n\nfunction isHidden(element: Element): boolean {\n if (attr(element, \"hidden\") !== null) return true;\n if (attr(element, \"aria-hidden\") === \"true\") return true;\n const style = attr(element, \"style\");\n return style ? hiddenStylePattern.test(style) : false;\n}\n\nfunction isLikelyAd(element: Element): boolean {\n const value = [\n attr(element, \"id\"),\n attr(element, \"class\"),\n attr(element, \"aria-label\"),\n attr(element, \"title\"),\n attr(element, \"data-testid\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n return /\\b(ad|ads|advert|advertisement|banner|sponsor|sponsored|promotion|promoted|powerlink)\\b/.test(value)\n || /파워링크|광고|직접홍보|홍보/.test(value);\n}\n\nfunction isLikelyBoilerplate(element: Element): boolean {\n if (element.name === \"footer\") return true;\n if (element.name === \"main\" || element.name === \"article\") return false;\n const role = firstToken(attr(element, \"role\"));\n if (role === \"main\" || role === \"article\") return false;\n const value = [\n attr(element, \"id\"),\n attr(element, \"class\"),\n attr(element, \"aria-label\"),\n attr(element, \"title\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n if (!value) return false;\n if (/\\b(content|contents|entry|post-body|article-body|story-body|view-content)\\b/.test(value)) return false;\n return /\\b(footer|sidebar)\\b/.test(value) || /푸터/.test(value);\n}\n\nfunction isLikelyBoilerplateTable(element: Element): boolean {\n if (element.name !== \"table\") return false;\n const value = [\n attr(element, \"id\"),\n attr(element, \"class\"),\n attr(element, \"aria-label\"),\n attr(element, \"title\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n return /\\bgall[_-]?list\\b/.test(value) || /\\bbottom[_-]?list\\w*\\b/.test(value);\n}\n\nfunction flattenBoilerplateTable(element: Element, context: StaticContext): SemanticNode | null {\n const children = collectFlattenedBoilerplateItems(element, context);\n if (children.length === 0) return null;\n return containerNode(context, element.name, children);\n}\n\nfunction collectFlattenedBoilerplateItems(element: Element, context: StaticContext): SemanticNode[] {\n const children: SemanticNode[] = [];\n for (const child of element.children) {\n if (!isElement(child)) continue;\n if (shouldSkipElement(child, context)) continue;\n if (!context.options.includeHidden && isHidden(child)) continue;\n if (context.options.excludeLikelyAds && isLikelyAd(child)) continue;\n const role = getRole(child);\n const focusable = isFocusable(child, role);\n const interactive = isInteractive(child, role, focusable);\n const name = role ? computeName(child, role, context) : \"\";\n if (role && name && (interactive || role === \"heading\" || role === \"img\")) {\n const node: SemanticNode = {\n id: nextId(context),\n tag: child.name,\n role,\n name,\n interactive,\n focusable,\n selector: getSelector(child),\n xpath: getXPath(child),\n children: [],\n };\n const description = computeDescription(child, context);\n if (description) node.description = description;\n const value = getValue(child);\n if (value) node.value = value;\n const state = getState(child);\n if (Object.keys(state).length > 0) node.state = state;\n if (context.options.includeAttributes) node.attributes = { ...child.attribs };\n children.push(node);\n continue;\n }\n children.push(...collectFlattenedBoilerplateItems(child, context));\n }\n return children;\n}\n\nfunction hasExplicitNameSource(element: Element): boolean {\n return attr(element, \"aria-label\") !== null || attr(element, \"aria-labelledby\") !== null || attr(element, \"title\") !== null;\n}\n\nfunction directText(element: Element, maxLength: number): string {\n return normalizeText(\n element.children\n .filter(isText)\n .map((node) => node.data)\n .join(\" \"),\n maxLength,\n );\n}\n\nfunction descendantText(element: Element, context?: StaticContext, options: DescendantTextOptions = {}): string {\n const parts: string[] = [];\n const shadowTemplate = element.children.find((child): child is Element => isElement(child) && isDeclarativeShadowTemplate(child));\n if (shadowTemplate && context) {\n const previousAssignments = context.slotAssignments;\n context.slotAssignments = collectSlotAssignments(element);\n collectDescendantText(shadowTemplate.children, parts, context, options);\n context.slotAssignments = previousAssignments;\n return parts.join(\" \");\n }\n collectDescendantText(element.children, parts, context, options);\n return parts.join(\" \");\n}\n\nfunction collectDescendantText(nodes: AnyNode[], parts: string[], context?: StaticContext, options: DescendantTextOptions = {}): void {\n for (const node of nodes) {\n if (isText(node)) {\n parts.push(node.data);\n continue;\n }\n if (!isElement(node)) continue;\n const nodeId = attr(node, \"id\");\n if (nodeId && options.excludeIds?.has(nodeId)) continue;\n if (node.name === \"slot\" && context?.slotAssignments) {\n const slotName = attr(node, \"name\") ?? \"\";\n const assigned = context.slotAssignments.get(slotName) ?? [];\n collectDescendantText(assigned.length > 0 ? assigned : node.children, parts, context, options);\n continue;\n }\n if (nonSemanticTags.has(node.name) || node.name === \"noscript\") continue;\n collectDescendantText(node.children, parts, context, options);\n }\n}\n\nfunction normalizeText(value: string, maxLength: number): string {\n const normalized = value.replace(/\\s+/g, \" \").trim();\n return normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1)}...` : normalized;\n}\n\nfunction computeDescription(element: Element, context: StaticContext): string {\n const describedBy = attr(element, \"aria-describedby\");\n if (describedBy) {\n const text = describedBy\n .split(/\\s+/)\n .map((id) => context.ids.get(id))\n .filter((item): item is Element => Boolean(item))\n .map((item) => descendantText(item, context))\n .filter(Boolean)\n .join(\" \");\n if (text) return normalizeText(text, context.options.maxTextLength);\n }\n return normalizeText(attr(element, \"title\") ?? \"\", context.options.maxTextLength);\n}\n\nfunction getValue(element: Element): string {\n return normalizeText(attr(element, \"value\") ?? attr(element, \"aria-valuetext\") ?? attr(element, \"aria-valuenow\") ?? \"\", 240);\n}\n\nfunction getSelector(element: Element): string {\n const id = attr(element, \"id\");\n if (id) return `#${cssEscape(id)}`;\n const parent = element.parent;\n if (!parent || !(\"children\" in parent)) return element.name;\n const siblings = parent.children.filter((node): node is Element => isElement(node) && node.name === element.name);\n const index = siblings.indexOf(element);\n return index > 0 ? `${element.name}:nth-of-type(${index + 1})` : element.name;\n}\n\nfunction getXPath(element: Element): string {\n const parts: string[] = [];\n let current: Element | null = element;\n while (current) {\n const parent: AnyNode | null = current.parent;\n /* v8 ignore next 4 -- htmlparser2 assigns parents for nodes returned by the public extract API. */\n if (!parent || !(\"children\" in parent)) {\n parts.unshift(current.name);\n break;\n }\n const siblings = parent.children.filter((node): node is Element => isElement(node) && node.name === current?.name);\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${current.name}[${index}]`);\n current = isElement(parent) ? parent : null;\n }\n return `/${parts.join(\"/\")}`;\n}\n\nfunction containerNode(context: StaticContext, tag: string, children: SemanticNode[]): SemanticNode {\n return {\n id: nextId(context),\n tag,\n role: null,\n name: \"\",\n interactive: false,\n focusable: false,\n children,\n };\n}\n\n/* v8 ignore start -- defensive fallback for impossible parser roots. */\nfunction unavailableNode(context: StaticContext, tag: string, unavailableReason: string): SemanticNode {\n return {\n id: nextId(context),\n tag,\n role: null,\n name: \"\",\n interactive: false,\n focusable: false,\n children: [],\n unavailableReason,\n };\n}\n/* v8 ignore stop */\n\nfunction omittedNode(context: StaticContext, omitted: number): SemanticNode {\n return {\n id: nextId(context),\n tag: \"omitted\",\n role: \"note\",\n name: `${omitted} static nodes omitted`,\n interactive: false,\n focusable: false,\n children: [],\n };\n}\n\nfunction nextId(context: StaticContext): string {\n return `static-${context.nextId++}`;\n}\n\nfunction attr(element: Element, name: string): string | null {\n return Object.prototype.hasOwnProperty.call(element.attribs, name) ? element.attribs[name] ?? \"\" : null;\n}\n\nfunction firstToken(value: string | null): string | null {\n return value?.trim().split(/\\s+/)[0] || null;\n}\n\nfunction cssEscape(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, (char) => `\\\\${char}`);\n}\n\nfunction isElement(node: AnyNode): node is Element {\n return node.type === \"tag\" || node.type === \"script\" || node.type === \"style\";\n}\n\nfunction isText(node: AnyNode): node is Text {\n return node.type === \"text\";\n}\n\nfunction findElement(nodes: AnyNode[], name: string): Element | undefined {\n for (const node of nodes) {\n if (!isElement(node)) continue;\n if (node.name === name) return node;\n const child = findElement(node.children, name);\n if (child) return child;\n }\n return undefined;\n}\n\nfunction fragmentRoot(children: AnyNode[]): Element {\n return new DomElement(\"fragment\", {}, children);\n}\n"],"mappings":"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","names":["linkFarmSummary","label"]}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ type CliIO = {
3
+ fetch?: typeof fetch;
4
+ stdin?: NodeJS.ReadStream;
5
+ stdout?: Pick<NodeJS.WriteStream, "write">;
6
+ stderr?: Pick<NodeJS.WriteStream, "write">;
7
+ };
8
+ declare function runCli(argv: string[], io?: CliIO): Promise<number>;
9
+
10
+ export { runCli };