@ubio/webvision 1.2.6 → 2.1.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 (47) hide show
  1. package/build/page.mjs +760 -355
  2. package/out/page/counter.d.ts +6 -0
  3. package/out/page/counter.js +13 -0
  4. package/out/page/counter.js.map +1 -0
  5. package/out/page/dom.d.ts +21 -0
  6. package/out/page/dom.js +172 -0
  7. package/out/page/dom.js.map +1 -0
  8. package/out/page/frame.d.ts +22 -0
  9. package/out/page/frame.js +69 -0
  10. package/out/page/frame.js.map +1 -0
  11. package/out/page/index.d.ts +9 -3
  12. package/out/page/index.js +9 -3
  13. package/out/page/index.js.map +1 -1
  14. package/out/page/overlay.d.ts +3 -0
  15. package/out/page/overlay.js +75 -0
  16. package/out/page/overlay.js.map +1 -0
  17. package/out/page/parser.d.ts +59 -0
  18. package/out/page/parser.js +249 -0
  19. package/out/page/parser.js.map +1 -0
  20. package/out/page/probe.d.ts +5 -0
  21. package/out/page/probe.js +36 -0
  22. package/out/page/probe.js.map +1 -0
  23. package/out/page/render.d.ts +12 -8
  24. package/out/page/render.js +73 -38
  25. package/out/page/render.js.map +1 -1
  26. package/out/page/snapshot.d.ts +9 -68
  27. package/out/page/snapshot.js +23 -183
  28. package/out/page/snapshot.js.map +1 -1
  29. package/out/page/traverse.d.ts +5 -0
  30. package/out/page/traverse.js +7 -0
  31. package/out/page/traverse.js.map +1 -0
  32. package/out/page/tree.d.ts +22 -0
  33. package/out/page/tree.js +59 -0
  34. package/out/page/tree.js.map +1 -0
  35. package/out/page/util.d.ts +3 -0
  36. package/out/page/util.js +9 -0
  37. package/out/page/util.js.map +1 -0
  38. package/package.json +6 -3
  39. package/out/page/highlight.d.ts +0 -5
  40. package/out/page/highlight.js +0 -72
  41. package/out/page/highlight.js.map +0 -1
  42. package/out/page/html.d.ts +0 -4
  43. package/out/page/html.js +0 -42
  44. package/out/page/html.js.map +0 -1
  45. package/out/page/utils.d.ts +0 -19
  46. package/out/page/utils.js +0 -68
  47. package/out/page/utils.js.map +0 -1
@@ -0,0 +1,249 @@
1
+ import { Counter } from './counter.js';
2
+ import { fixZIndex, getViewportSize, hasVisibleArea, isInteractive, isRandomIdentifier, isRectInViewport, makeOverlaysOpaque, normalizeText, truncateAttrValue } from './dom.js';
3
+ import { isHidden } from './dom.js';
4
+ import { probeViewport } from './probe.js';
5
+ import { isObjectEmpty } from './util.js';
6
+ export const VX_NODE_SYMBOL = Symbol('vx:node');
7
+ export const VX_IGNORE_SYMBOL = Symbol('vx:ignore');
8
+ export const VX_IGNORE_TAGS = ['svg', 'script', 'noscript', 'style', 'link', 'meta'];
9
+ export const VX_LABEL_ATTRS = ['title', 'alt', 'placeholder', 'aria-label'];
10
+ export const VX_VALUE_ATTRS = ['value', 'checked', 'selected', 'disabled', 'readonly'];
11
+ export const VX_SRC_ATTRS = ['src', 'href'];
12
+ export const VX_TAG_PREFERENCE = [
13
+ 'a', 'iframe', 'input', 'button', 'select', 'textarea', 'img', 'label',
14
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
15
+ 'ul', 'ol', 'li', 'dl', 'dt', 'dd',
16
+ 'section', 'article', 'main', 'header', 'footer', 'nav', 'aside',
17
+ 'form', 'input', 'textarea', 'select', 'option', 'fieldset', 'legend',
18
+ 'p', 'pre', 'code', 'blockquote', 'figure', 'figcaption',
19
+ 'table', 'thead', 'tbody', 'tr', 'td', 'th',
20
+ 'strong', 'em', 'sub', 'sup',
21
+ ];
22
+ const VX_KEEP_SELECTOR = 'a, button, input, textarea, select, label, iframe';
23
+ export class VxTreeParser {
24
+ constructor(options = {}) {
25
+ this.options = options;
26
+ this.probeElements = [];
27
+ this.domRefMap = new Map();
28
+ const { startRef = 0 } = options;
29
+ this.viewport = getViewportSize();
30
+ this.counter = new Counter(startRef);
31
+ if (options.probeViewport) {
32
+ this.probeElements = probeViewport(8);
33
+ }
34
+ const vxRoot = this.parseDocument();
35
+ this.refRange = [startRef, this.counter.current()];
36
+ this.vxNodes = this.pruneRecursive(vxRoot);
37
+ }
38
+ parseDocument() {
39
+ return this.parseNode(document.documentElement, null);
40
+ }
41
+ getNodes() {
42
+ return this.vxNodes;
43
+ }
44
+ getRefRange() {
45
+ return this.refRange;
46
+ }
47
+ getDomMap() {
48
+ return this.domRefMap;
49
+ }
50
+ parseNode(node, parent) {
51
+ if (node[VX_IGNORE_SYMBOL]) {
52
+ return null;
53
+ }
54
+ if (node instanceof Text) {
55
+ // Single instances of Text nodes can only occur in "text"
56
+ // (e.g. when regular text is interspersed with links and other elements)
57
+ const textContent = normalizeText(node.textContent ?? '');
58
+ if (textContent) {
59
+ return this.makeNode(node, {
60
+ textContent,
61
+ hasVisibleArea: parent?.hasVisibleArea,
62
+ isOutsideViewport: parent?.isOutsideViewport,
63
+ isProbeHit: parent?.isProbeHit,
64
+ });
65
+ }
66
+ return null;
67
+ }
68
+ if (node instanceof Element) {
69
+ if (this.options.opaqueOverlays) {
70
+ makeOverlaysOpaque(node);
71
+ }
72
+ fixZIndex(node);
73
+ return this.parseElement(node);
74
+ }
75
+ return null;
76
+ }
77
+ parseElement(el) {
78
+ if (VX_IGNORE_TAGS.includes(el.tagName.toLowerCase())) {
79
+ return null;
80
+ }
81
+ if (isHidden(el)) {
82
+ return null;
83
+ }
84
+ const rect = el.getBoundingClientRect();
85
+ const id = el.getAttribute('id') ?? '';
86
+ const vxNode = this.makeNode(el, {
87
+ tagName: el.tagName.toLowerCase(),
88
+ id: isRandomIdentifier(id) ? undefined : id,
89
+ classList: Array.from(el.classList)
90
+ .filter(cls => !isRandomIdentifier(cls))
91
+ .slice(0, 4),
92
+ labelAttrs: this.collectLabelAttrs(el),
93
+ valueAttrs: this.collectValueAttrs(el),
94
+ srcAttrs: this.collectSrcAttrs(el),
95
+ hasVisibleArea: hasVisibleArea(el),
96
+ isInteractive: isInteractive(el),
97
+ isOutsideViewport: !isRectInViewport(rect, this.viewport),
98
+ isProbeHit: this.isProbeHit(el),
99
+ isKept: el.matches(VX_KEEP_SELECTOR),
100
+ });
101
+ const children = [...el.childNodes]
102
+ .map(child => this.parseNode(child, vxNode))
103
+ .filter(_ => _ != null);
104
+ // Special case: if the only child is a text node, return a single node with the text content
105
+ if (children.length === 1 && !children[0]?.tagName) {
106
+ vxNode.textContent = normalizeText(children[0].textContent ?? '');
107
+ }
108
+ else {
109
+ vxNode.children = children;
110
+ }
111
+ return vxNode;
112
+ }
113
+ makeNode(node, spec) {
114
+ const ref = this.counter.next();
115
+ const vxNode = {
116
+ ...spec,
117
+ ref,
118
+ };
119
+ this.domRefMap.set(ref, node);
120
+ node[VX_NODE_SYMBOL] = vxNode;
121
+ return vxNode;
122
+ }
123
+ pruneRecursive(vxNode) {
124
+ if (!vxNode) {
125
+ return [];
126
+ }
127
+ const children = vxNode.children ?? [];
128
+ // Recursively prune children
129
+ const newChildren = children.flatMap(child => this.pruneRecursive(child));
130
+ // If the node itself is omitted, replace it with children
131
+ if (this.shouldOmit(vxNode)) {
132
+ return newChildren;
133
+ }
134
+ vxNode.children = newChildren;
135
+ // Collapse single-child elements
136
+ if (newChildren.length === 1) {
137
+ const child = newChildren[0];
138
+ return this.collapseSingleChild(vxNode, child);
139
+ }
140
+ return [vxNode];
141
+ }
142
+ collapseSingleChild(parent, child) {
143
+ const preferParent = this.collapsePreferParent(parent, child);
144
+ const merged = preferParent ?
145
+ this.collapseMerge(parent, child) :
146
+ this.collapseMerge(child, parent);
147
+ return this.pruneRecursive({
148
+ ...merged,
149
+ children: child.children,
150
+ textContent: child.textContent,
151
+ });
152
+ }
153
+ collapsePreferParent(parent, child) {
154
+ const parentRank = VX_TAG_PREFERENCE.indexOf(parent.tagName ?? '');
155
+ const childRank = VX_TAG_PREFERENCE.indexOf(child.tagName ?? '');
156
+ if (parentRank === -1 && childRank === -1) {
157
+ const parentAttrCount = Object.keys({
158
+ ...parent.labelAttrs,
159
+ ...parent.valueAttrs,
160
+ ...parent.srcAttrs,
161
+ }).length;
162
+ const childAttrCount = Object.keys({
163
+ ...child.labelAttrs,
164
+ ...child.valueAttrs,
165
+ ...child.srcAttrs,
166
+ }).length;
167
+ return parentAttrCount > childAttrCount;
168
+ }
169
+ return parentRank !== -1 && (childRank === -1 || parentRank < childRank);
170
+ }
171
+ collapseMerge(a, b) {
172
+ return {
173
+ ...b,
174
+ ...a,
175
+ labelAttrs: { ...b.labelAttrs, ...a.labelAttrs },
176
+ valueAttrs: { ...b.valueAttrs, ...a.valueAttrs },
177
+ srcAttrs: { ...b.srcAttrs, ...a.srcAttrs },
178
+ };
179
+ }
180
+ shouldOmit(vxNode) {
181
+ const tagName = vxNode.tagName ?? '';
182
+ if (!vxNode.hasVisibleArea) {
183
+ return true;
184
+ }
185
+ if (this.options.viewportOnly && vxNode.isOutsideViewport) {
186
+ return true;
187
+ }
188
+ if (this.options.probeViewport && !vxNode.isProbeHit) {
189
+ return true;
190
+ }
191
+ if (this.options.skipImages && vxNode.tagName === 'img') {
192
+ return true;
193
+ }
194
+ const hasText = !!vxNode.textContent;
195
+ const hasChildren = (vxNode.children ?? []).length > 0;
196
+ const hasAttrs = [vxNode.labelAttrs, vxNode.valueAttrs, vxNode.srcAttrs]
197
+ .some(attrs => !isObjectEmpty(attrs ?? {}));
198
+ if (this.options.unnestDivs) {
199
+ const isDivOrSpan = ['div', 'span'].includes(tagName);
200
+ if (isDivOrSpan && hasChildren && !hasAttrs) {
201
+ return true;
202
+ }
203
+ }
204
+ if (vxNode.isKept) {
205
+ return false;
206
+ }
207
+ return !hasText && !hasAttrs && !hasChildren;
208
+ }
209
+ isProbeHit(el) {
210
+ // TODO this is a bit brute-forcish, consider improving
211
+ for (const probeEl of this.probeElements) {
212
+ if (el.contains(probeEl) || probeEl.contains(el)) {
213
+ return true;
214
+ }
215
+ }
216
+ return false;
217
+ }
218
+ collectLabelAttrs(el) {
219
+ const attrs = {};
220
+ for (const attr of VX_LABEL_ATTRS) {
221
+ const value = truncateAttrValue(el.getAttribute(attr) ?? '');
222
+ if (value) {
223
+ attrs[attr] = value;
224
+ }
225
+ }
226
+ return attrs;
227
+ }
228
+ collectValueAttrs(el) {
229
+ const attrs = {};
230
+ for (const attr of VX_VALUE_ATTRS) {
231
+ const value = el[attr] ?? '';
232
+ if (value) {
233
+ attrs[attr] = String(value);
234
+ }
235
+ }
236
+ return attrs;
237
+ }
238
+ collectSrcAttrs(el) {
239
+ const attrs = {};
240
+ for (const attr of VX_SRC_ATTRS) {
241
+ const value = truncateAttrValue(el[attr] ?? '');
242
+ if (value) {
243
+ attrs[attr] = value;
244
+ }
245
+ }
246
+ return attrs;
247
+ }
248
+ }
249
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/page/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Scans the viewport by picking elements in regular intervals.
3
+ */
4
+ export declare function probeViewport(gridSize?: number): Element[];
5
+ export declare function checkOccluded(element: Element, gridSize?: number): boolean;
@@ -0,0 +1,36 @@
1
+ import { getViewportSize } from './dom.js';
2
+ /**
3
+ * Scans the viewport by picking elements in regular intervals.
4
+ */
5
+ export function probeViewport(gridSize = 32) {
6
+ const { width, height } = getViewportSize();
7
+ const elements = [];
8
+ for (let y = (gridSize / 2); y < height; y += gridSize) {
9
+ for (let x = (gridSize / 2); x < width; x += gridSize) {
10
+ const element = document.elementFromPoint(x, y);
11
+ if (element && !elements.includes(element)) {
12
+ elements.push(element);
13
+ }
14
+ }
15
+ }
16
+ return elements;
17
+ }
18
+ export function checkOccluded(element, gridSize = 8) {
19
+ let total = 0;
20
+ let hits = 0;
21
+ const { top, left, width, height } = element.getBoundingClientRect();
22
+ for (let x = left + (gridSize / 2); x < left + width; x += gridSize) {
23
+ for (let y = top + (gridSize / 2); y < top + height; y += gridSize) {
24
+ total++;
25
+ const el = document.elementFromPoint(x, y);
26
+ if (!el) {
27
+ continue;
28
+ }
29
+ if (element.contains(el) || el.contains(element)) {
30
+ hits++;
31
+ }
32
+ }
33
+ }
34
+ return (hits / total) < 0.5;
35
+ }
36
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/page/probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAQ,GAAG,EAAE;IACvC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QACrD,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,QAAQ,GAAG,CAAC;IACxD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IACrE,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QAClE,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;YACjE,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,EAAE,CAAC;gBACN,SAAS;YACb,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/C,IAAI,EAAE,CAAC;YACX,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;AAChC,CAAC"}
@@ -1,9 +1,13 @@
1
- import { SnapshotItem } from './snapshot.js';
2
- export interface SnapshotRenderOptions {
3
- depth: number;
4
- includeRef: boolean;
5
- includeClassList: boolean;
6
- maxHeight?: number;
1
+ import { VxNode } from './parser.js';
2
+ export interface VxRenderOptions {
3
+ renderStyle?: 'html' | 'line';
4
+ renderTagNames?: boolean;
5
+ renderIds?: boolean;
6
+ renderClassNames?: boolean;
7
+ renderRefs?: boolean | 'all';
8
+ renderLabelAttrs?: boolean;
9
+ renderValueAttrs?: boolean;
10
+ renderSrcAttrs?: boolean;
11
+ whitelistRefs?: number[];
7
12
  }
8
- export declare function renderSnapshot(snapshot: SnapshotItem, options?: Partial<SnapshotRenderOptions>): string;
9
- export declare function renderLine(snapshot: SnapshotItem, options: SnapshotRenderOptions): string;
13
+ export declare function renderVxNode(scope: VxNode, options?: VxRenderOptions): string;
@@ -1,51 +1,86 @@
1
- export function renderSnapshot(snapshot, options = {}) {
2
- const opts = {
3
- depth: 0,
4
- includeRef: false,
5
- includeClassList: false,
6
- ...options,
7
- };
8
- if (opts.maxHeight && snapshot.rect.y > opts.maxHeight) {
9
- return '';
10
- }
11
- const buffer = [
12
- renderLine(snapshot, opts),
13
- ];
14
- for (const child of snapshot.children ?? []) {
15
- const childSnapshot = renderSnapshot(child, {
16
- ...opts,
17
- depth: opts.depth + 1,
18
- });
19
- if (childSnapshot) {
20
- buffer.push(childSnapshot);
1
+ import { truncateAttrValue } from './dom.js';
2
+ import { traverseVxNode } from './traverse.js';
3
+ import { isContainerNode } from './util.js';
4
+ export function renderVxNode(scope, options = {}) {
5
+ const buffer = [];
6
+ const whitelistRefs = options.whitelistRefs ?? [];
7
+ for (const { vxNode, depth } of traverseVxNode(scope)) {
8
+ if (whitelistRefs.length > 0) {
9
+ if (!whitelistRefs.includes(vxNode.ref)) {
10
+ continue;
11
+ }
21
12
  }
13
+ const indent = ' '.repeat(depth);
14
+ buffer.push(renderIndentedLine(indent, vxNode, options));
22
15
  }
23
16
  return buffer.join('\n');
24
17
  }
25
- export function renderLine(snapshot, options) {
26
- const indent = ' '.repeat(options.depth);
27
- const components = [indent];
28
- if (snapshot.nodeType === 'text') {
29
- return [indent, snapshot.textContent].filter(Boolean).join(' ');
18
+ function renderIndentedLine(indent, vxNode, options = {}) {
19
+ if (!vxNode.tagName) {
20
+ return [indent, vxNode.textContent].filter(Boolean).join('');
30
21
  }
31
- components.push(snapshot.tagName ?? '');
32
- if (options.includeRef) {
33
- components.push(`[ref=${snapshot.ref}]`);
22
+ const tagLine = renderTagLine(vxNode, options);
23
+ const htmlStyle = options.renderStyle === 'html';
24
+ return [
25
+ indent,
26
+ tagLine,
27
+ htmlStyle ? '' : ' ',
28
+ vxNode.textContent ?? '',
29
+ ].join('');
30
+ }
31
+ function renderTagLine(vxNode, options) {
32
+ const htmlStyle = options.renderStyle === 'html';
33
+ const components = [];
34
+ if (options.renderTagNames && vxNode.tagName) {
35
+ components.push(vxNode.tagName);
36
+ }
37
+ if (options.renderIds && vxNode.id) {
38
+ if (htmlStyle) {
39
+ components.push(`id="${vxNode.id}"`);
40
+ }
41
+ else {
42
+ components.push(`#${vxNode.id}`);
43
+ }
44
+ }
45
+ if (options.renderClassNames && vxNode.classList?.length) {
46
+ if (htmlStyle) {
47
+ components.push(`class="${vxNode.classList.join(' ')}"`);
48
+ }
49
+ else {
50
+ components.push('.' + vxNode.classList.join('.'));
51
+ }
52
+ }
53
+ if (options.renderRefs) {
54
+ const isRenderRef = [
55
+ options.renderRefs === 'all',
56
+ options.renderRefs === true && !isContainerNode(vxNode),
57
+ ].some(Boolean);
58
+ if (isRenderRef) {
59
+ components.push(`[@${vxNode.ref}]`);
60
+ }
34
61
  }
35
- if (options.includeClassList) {
36
- for (const className of snapshot.classList ?? []) {
37
- components.push(`.${className}`);
62
+ const attrs = [];
63
+ if (options.renderLabelAttrs) {
64
+ for (const [attr, value] of Object.entries(vxNode.labelAttrs ?? {})) {
65
+ attrs.push(`${attr}="${truncateAttrValue(value)}"`);
38
66
  }
39
67
  }
40
- if (snapshot.src) {
41
- components.push(`(${snapshot.src})`);
68
+ if (options.renderValueAttrs) {
69
+ for (const [attr, value] of Object.entries(vxNode.valueAttrs ?? {})) {
70
+ attrs.push(`${attr}="${truncateAttrValue(value)}"`);
71
+ }
72
+ }
73
+ if (options.renderSrcAttrs) {
74
+ for (const [attr, value] of Object.entries(vxNode.srcAttrs ?? {})) {
75
+ attrs.push(`${attr}="${truncateAttrValue(value)}"`);
76
+ }
42
77
  }
43
- if (snapshot.href) {
44
- components.push(`(${snapshot.href})`);
78
+ if (htmlStyle) {
79
+ components.push(...attrs);
45
80
  }
46
- if (snapshot.textContent) {
47
- components.push(' ' + snapshot.textContent);
81
+ else {
82
+ components.push(...attrs.map(attr => `[${attr}]`));
48
83
  }
49
- return components.filter(Boolean).join('');
84
+ return htmlStyle ? `<${components.join(' ')}>` : components.join('');
50
85
  }
51
86
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/page/render.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,cAAc,CAAC,QAAsB,EAAE,UAA0C,EAAE;IAC/F,MAAM,IAAI,GAA0B;QAChC,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,KAAK;QACjB,gBAAgB,EAAE,KAAK;QACvB,GAAG,OAAO;KACb,CAAC;IACF,IAAI,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACrD,OAAO,EAAE,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG;QACX,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;KAC7B,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,EAAE;YACxC,GAAG,IAAI;YACP,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;SACxB,CAAC,CAAC;QACH,IAAI,aAAa,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAsB,EAAE,OAA8B;IAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpE,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,UAAU,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YAC/C,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChB,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/page/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAc5C,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,UAA2B,EAAE;IACrE,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAClD,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,SAAS;YACb,CAAC;QACL,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc,EAAE,MAAc,EAAE,UAA2B,EAAE;IACrF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC;IACjD,OAAO;QACH,MAAM;QACN,OAAO;QACP,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;QACpB,MAAM,CAAC,WAAW,IAAI,EAAE;KAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,OAAwB;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC;IACjD,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,IAAI,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC3C,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACjC,IAAI,SAAS,EAAE,CAAC;YACZ,UAAU,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACJ,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,gBAAgB,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QACvD,IAAI,SAAS,EAAE,CAAC;YACZ,UAAU,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACJ,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG;YAChB,OAAO,CAAC,UAAU,KAAK,KAAK;YAC5B,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;SAC1D,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChB,IAAI,WAAW,EAAE,CAAC;YACd,UAAU,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;QACxC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACZ,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACJ,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzE,CAAC"}
@@ -1,69 +1,10 @@
1
- export declare const DEFAULT_SKIP_TAGS: string[];
2
- export declare const DEFAULT_SEMANTIC_TAGS: string[];
3
- export type SnapshotNode = Element | Text;
4
- export interface SnapshotOptions {
5
- startId: number;
6
- skipHidden: boolean;
7
- skipImages: boolean;
8
- skipIframes: boolean;
9
- skipEmptyText: boolean;
10
- skipTags: string[];
11
- tagPreference: string[];
12
- collapseInline: boolean;
13
- }
14
- export interface SnapshotItem {
15
- ref: number;
16
- nodeType: 'element' | 'text';
17
- leaf: boolean;
18
- rect: {
19
- x: number;
20
- y: number;
21
- width: number;
22
- height: number;
23
- };
24
- tagName?: string;
25
- classList?: string[];
26
- textContent?: string;
27
- href?: string;
28
- src?: string;
29
- children?: SnapshotItem[];
30
- }
31
- export declare function createSnapshot(root: SnapshotNode, options?: Partial<SnapshotOptions>): {
32
- refMap: Map<number, SnapshotNode>;
33
- snapshot: SnapshotItem;
34
- maxId: number;
1
+ import { VxTreeOptions } from './parser.js';
2
+ import { VxTreeView } from './tree.js';
3
+ export declare const VX_DOM_SYMBOL: unique symbol;
4
+ export declare const VX_TREE_SYMBOL: unique symbol;
5
+ export declare function captureSnapshot(options?: VxTreeOptions): {
6
+ nodes: import("./parser.js").VxNode[];
7
+ refRange: [number, number];
35
8
  };
36
- export declare class SnapshotTree {
37
- node: Element | Text;
38
- parent: SnapshotTree | null;
39
- counter: Counter;
40
- options: SnapshotOptions;
41
- ref: number;
42
- classList: string[];
43
- children: SnapshotTree[];
44
- textContent?: string;
45
- constructor(node: Element | Text, parent: SnapshotTree | null, counter: Counter, options: SnapshotOptions);
46
- get element(): Element | null;
47
- get depth(): number;
48
- get leaf(): boolean;
49
- get tagName(): string | undefined;
50
- get href(): string | undefined;
51
- get src(): any;
52
- get clientRect(): DOMRect;
53
- private parseTree;
54
- /**
55
- * Collapses an element with only one visible child into one.
56
- *
57
- * Wrapper element is preferred if it's a link or a button,
58
- * in other cases child element is preferred.
59
- */
60
- private collapseWrapper;
61
- private getAcceptedChildren;
62
- fillMap(map: Map<number, SnapshotNode>): void;
63
- toJson(): SnapshotItem;
64
- }
65
- export declare class Counter {
66
- value: number;
67
- constructor(value?: number);
68
- next(): number;
69
- }
9
+ export declare function getSnapshot(): VxTreeView;
10
+ export declare function resolveDomNode(ref: number): Node | null;