1 | /*
|
2 | * Copyright 2022 Google LLC
|
3 | *
|
4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | * you may not use this file except in compliance with the License.
|
6 | * You may obtain a copy of the License at
|
7 | *
|
8 | * https://www.apache.org/licenses/LICENSE-2.0
|
9 | *
|
10 | * Unless required by applicable law or agreed to in writing, software
|
11 | * distributed under the License is distributed on an "AS IS" BASIS,
|
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13 | * See the License for the specific language governing permissions and
|
14 | * limitations under the License.
|
15 | */
|
16 |
|
17 | const getName = (node: Node) => {
|
18 | const name = node.nodeName;
|
19 | return node.nodeType === 1
|
20 | ? name.toLowerCase()
|
21 | : name.toUpperCase().replace(/^#/, '');
|
22 | };
|
23 |
|
24 | export const getSelector = (node: Node | null | undefined, maxLen?: number) => {
|
25 | let sel = '';
|
26 |
|
27 | try {
|
28 | while (node && node.nodeType !== 9) {
|
29 | const el: Element = node as Element;
|
30 | const part = el.id
|
31 | ? '#' + el.id
|
32 | : getName(el) +
|
33 | (el.className && el.className.length
|
34 | ? '.' + el.className.replace(/\s+/g, '.')
|
35 | : '');
|
36 | if (sel.length + part.length > (maxLen || 100) - 1) return sel || part;
|
37 | sel = sel ? part + '>' + sel : part;
|
38 | if (el.id) break;
|
39 | node = el.parentNode;
|
40 | }
|
41 | } catch (err) {
|
42 | // Do nothing...
|
43 | }
|
44 | return sel;
|
45 | };
|