@stacksjs/ts-css 0.1.1 → 0.1.3
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.
- package/CHANGELOG.md +28 -0
- package/dist/chunk-1kmkypmr.js +3 -0
- package/dist/chunk-2wsah70r.js +2 -0
- package/dist/chunk-9ep6bwwb.js +2 -0
- package/dist/chunk-edwg811g.js +2 -0
- package/dist/chunk-thy3p95k.js +3 -0
- package/dist/index.js +57 -12868
- package/dist/optimize/index.js +1 -3389
- package/dist/parse/index.js +1 -2368
- package/dist/select/index.js +1 -1288
- package/dist/what/index.js +1 -513
- package/package.json +1 -1
package/dist/select/index.js
CHANGED
|
@@ -1,1289 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
|
|
3
|
-
var __returnValue = (v) => v;
|
|
4
|
-
function __exportSetter(name, newValue) {
|
|
5
|
-
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
-
}
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, {
|
|
10
|
-
get: all[name],
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
var __require = import.meta.require;
|
|
17
|
-
|
|
18
|
-
// src/what/index.ts
|
|
19
|
-
var exports_what = {};
|
|
20
|
-
__export(exports_what, {
|
|
21
|
-
stringify: () => stringify,
|
|
22
|
-
parse: () => parse,
|
|
23
|
-
isTraversal: () => isTraversal,
|
|
24
|
-
IgnoreCaseMode: () => IgnoreCaseMode
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
// src/what/parse.ts
|
|
28
|
-
var RE_NAME_STICKY = /(?:\\(?:[\dA-Fa-f]{1,6} ?|[^])|[\w\-\u00B0-\uFFFF])+/y;
|
|
29
|
-
var RE_ESCAPE = /\\([\dA-Fa-f]{1,6} ?|[^])/g;
|
|
30
|
-
function unescape(name) {
|
|
31
|
-
return name.replace(RE_ESCAPE, (_m, escape) => {
|
|
32
|
-
if (escape.length > 1 && /^[\dA-Fa-f]/.test(escape)) {
|
|
33
|
-
const code = Number.parseInt(escape, 16);
|
|
34
|
-
if (code >= 55296 && code <= 57343)
|
|
35
|
-
return "\uFFFD";
|
|
36
|
-
return String.fromCodePoint(code);
|
|
37
|
-
}
|
|
38
|
-
return escape;
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
function unescapeIfNeeded(name) {
|
|
42
|
-
return name.indexOf("\\") < 0 ? name : unescape(name);
|
|
43
|
-
}
|
|
44
|
-
var ATTRIBUTES_QUIRKS = new Set([
|
|
45
|
-
"accept",
|
|
46
|
-
"accept-charset",
|
|
47
|
-
"align",
|
|
48
|
-
"alink",
|
|
49
|
-
"axis",
|
|
50
|
-
"bgcolor",
|
|
51
|
-
"charset",
|
|
52
|
-
"checked",
|
|
53
|
-
"clear",
|
|
54
|
-
"codetype",
|
|
55
|
-
"color",
|
|
56
|
-
"compact",
|
|
57
|
-
"declare",
|
|
58
|
-
"defer",
|
|
59
|
-
"dir",
|
|
60
|
-
"direction",
|
|
61
|
-
"disabled",
|
|
62
|
-
"enctype",
|
|
63
|
-
"face",
|
|
64
|
-
"frame",
|
|
65
|
-
"hreflang",
|
|
66
|
-
"http-equiv",
|
|
67
|
-
"lang",
|
|
68
|
-
"language",
|
|
69
|
-
"link",
|
|
70
|
-
"media",
|
|
71
|
-
"method",
|
|
72
|
-
"multiple",
|
|
73
|
-
"nohref",
|
|
74
|
-
"noresize",
|
|
75
|
-
"noshade",
|
|
76
|
-
"nowrap",
|
|
77
|
-
"readonly",
|
|
78
|
-
"rel",
|
|
79
|
-
"rev",
|
|
80
|
-
"rules",
|
|
81
|
-
"scope",
|
|
82
|
-
"scrolling",
|
|
83
|
-
"selected",
|
|
84
|
-
"shape",
|
|
85
|
-
"target",
|
|
86
|
-
"text",
|
|
87
|
-
"type",
|
|
88
|
-
"valign",
|
|
89
|
-
"valuetype",
|
|
90
|
-
"vlink"
|
|
91
|
-
]);
|
|
92
|
-
function actionFromChar(ch) {
|
|
93
|
-
switch (ch) {
|
|
94
|
-
case 126:
|
|
95
|
-
return "element";
|
|
96
|
-
case 94:
|
|
97
|
-
return "start";
|
|
98
|
-
case 36:
|
|
99
|
-
return "end";
|
|
100
|
-
case 42:
|
|
101
|
-
return "any";
|
|
102
|
-
case 33:
|
|
103
|
-
return "not";
|
|
104
|
-
case 124:
|
|
105
|
-
return "hyphen";
|
|
106
|
-
default:
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
function isWsCode(c) {
|
|
111
|
-
return c === 32 || c === 9 || c === 10 || c === 13 || c === 12;
|
|
112
|
-
}
|
|
113
|
-
function parse(selector, options = {}) {
|
|
114
|
-
const subselects = [];
|
|
115
|
-
const endIndex = parseSelectorImpl(subselects, selector, options, 0);
|
|
116
|
-
if (endIndex < selector.length)
|
|
117
|
-
throw new Error(`Unmatched selector: ${selector.slice(endIndex)}`);
|
|
118
|
-
return subselects;
|
|
119
|
-
}
|
|
120
|
-
function readName(selector, from) {
|
|
121
|
-
RE_NAME_STICKY.lastIndex = from;
|
|
122
|
-
const m = RE_NAME_STICKY.exec(selector);
|
|
123
|
-
if (!m)
|
|
124
|
-
throw new Error(`Expected name, found ${selector.slice(from)}`);
|
|
125
|
-
return { value: unescapeIfNeeded(m[0]), end: from + m[0].length };
|
|
126
|
-
}
|
|
127
|
-
function stripWS(selector, from) {
|
|
128
|
-
while (from < selector.length && isWsCode(selector.charCodeAt(from)))
|
|
129
|
-
from++;
|
|
130
|
-
return from;
|
|
131
|
-
}
|
|
132
|
-
function parseSelectorImpl(subselects, selector, options, startIndex) {
|
|
133
|
-
let tokens = [];
|
|
134
|
-
let i = stripWS(selector, startIndex);
|
|
135
|
-
const len = selector.length;
|
|
136
|
-
const xmlMode = options.xmlMode === true;
|
|
137
|
-
const lowerCaseAttrs = options.lowerCaseAttributeNames !== false && !xmlMode;
|
|
138
|
-
const lowerCaseTagsFlag = options.lowerCaseTags !== false;
|
|
139
|
-
while (i < len) {
|
|
140
|
-
const code = selector.charCodeAt(i);
|
|
141
|
-
if (isWsCode(code)) {
|
|
142
|
-
let trimmed = i + 1;
|
|
143
|
-
while (trimmed < len && isWsCode(selector.charCodeAt(trimmed)))
|
|
144
|
-
trimmed++;
|
|
145
|
-
if (tokens.length === 0)
|
|
146
|
-
return trimmed;
|
|
147
|
-
i = trimmed;
|
|
148
|
-
addTraversal(tokens, "descendant");
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
if (code === 62 || code === 60 || code === 126 || code === 43 || code === 124) {
|
|
152
|
-
let j = i + 1;
|
|
153
|
-
while (j < len && isWsCode(selector.charCodeAt(j)))
|
|
154
|
-
j++;
|
|
155
|
-
i = j;
|
|
156
|
-
switch (code) {
|
|
157
|
-
case 62:
|
|
158
|
-
addTraversal(tokens, "child");
|
|
159
|
-
break;
|
|
160
|
-
case 60:
|
|
161
|
-
addTraversal(tokens, "parent");
|
|
162
|
-
break;
|
|
163
|
-
case 126:
|
|
164
|
-
addTraversal(tokens, "sibling");
|
|
165
|
-
break;
|
|
166
|
-
case 43:
|
|
167
|
-
addTraversal(tokens, "adjacent");
|
|
168
|
-
break;
|
|
169
|
-
case 124:
|
|
170
|
-
if (i < len && selector.charCodeAt(i) === 124) {
|
|
171
|
-
i++;
|
|
172
|
-
i = stripWS(selector, i);
|
|
173
|
-
addTraversal(tokens, "column-combinator");
|
|
174
|
-
} else {
|
|
175
|
-
tokens.push({ type: "tag", name: "", namespace: "" });
|
|
176
|
-
}
|
|
177
|
-
break;
|
|
178
|
-
}
|
|
179
|
-
continue;
|
|
180
|
-
}
|
|
181
|
-
if (code === 44) {
|
|
182
|
-
if (tokens.length === 0)
|
|
183
|
-
throw new Error("Empty sub-selector");
|
|
184
|
-
subselects.push(tokens);
|
|
185
|
-
tokens = [];
|
|
186
|
-
i = stripWS(selector, i + 1);
|
|
187
|
-
continue;
|
|
188
|
-
}
|
|
189
|
-
if (code === 47 && selector.charCodeAt(i + 1) === 42) {
|
|
190
|
-
const end = selector.indexOf("*/", i + 2);
|
|
191
|
-
if (end < 0)
|
|
192
|
-
throw new Error("Unmatched comment");
|
|
193
|
-
i = stripWS(selector, end + 2);
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
if (code === 42) {
|
|
197
|
-
i++;
|
|
198
|
-
tokens.push({ type: "universal", namespace: null });
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
if (code === 35) {
|
|
202
|
-
const r = readName(selector, i + 1);
|
|
203
|
-
i = r.end;
|
|
204
|
-
tokens.push({
|
|
205
|
-
type: "attribute",
|
|
206
|
-
name: "id",
|
|
207
|
-
action: "equals",
|
|
208
|
-
value: r.value,
|
|
209
|
-
namespace: null,
|
|
210
|
-
ignoreCase: false
|
|
211
|
-
});
|
|
212
|
-
continue;
|
|
213
|
-
}
|
|
214
|
-
if (code === 46) {
|
|
215
|
-
const r = readName(selector, i + 1);
|
|
216
|
-
i = r.end;
|
|
217
|
-
tokens.push({
|
|
218
|
-
type: "attribute",
|
|
219
|
-
name: "class",
|
|
220
|
-
action: "element",
|
|
221
|
-
value: r.value,
|
|
222
|
-
namespace: null,
|
|
223
|
-
ignoreCase: false
|
|
224
|
-
});
|
|
225
|
-
continue;
|
|
226
|
-
}
|
|
227
|
-
if (code === 91) {
|
|
228
|
-
i = parseAttribute(selector, i, tokens, options, xmlMode, lowerCaseAttrs);
|
|
229
|
-
continue;
|
|
230
|
-
}
|
|
231
|
-
if (code === 58) {
|
|
232
|
-
i = parsePseudo(selector, i, tokens, options);
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
if (code === 124) {
|
|
236
|
-
i++;
|
|
237
|
-
const r = readName(selector, i);
|
|
238
|
-
i = r.end;
|
|
239
|
-
tokens.push({ type: "tag", name: lowerCaseTagsFlag ? r.value.toLowerCase() : r.value, namespace: "" });
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
{
|
|
243
|
-
const r1 = readName(selector, i);
|
|
244
|
-
i = r1.end;
|
|
245
|
-
if (i < len && selector.charCodeAt(i) === 124 && selector.charCodeAt(i + 1) !== 61) {
|
|
246
|
-
i++;
|
|
247
|
-
const r2 = readName(selector, i);
|
|
248
|
-
i = r2.end;
|
|
249
|
-
tokens.push({ type: "tag", name: lowerCaseTagsFlag ? r2.value.toLowerCase() : r2.value, namespace: r1.value });
|
|
250
|
-
} else {
|
|
251
|
-
tokens.push({ type: "tag", name: lowerCaseTagsFlag ? r1.value.toLowerCase() : r1.value, namespace: null });
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
if (tokens.length > 0)
|
|
256
|
-
subselects.push(tokens);
|
|
257
|
-
return i;
|
|
258
|
-
}
|
|
259
|
-
function parseAttribute(selector, idx, tokens, options, xmlMode, lowerCaseAttrs) {
|
|
260
|
-
let i = idx + 1;
|
|
261
|
-
const len = selector.length;
|
|
262
|
-
let attribute;
|
|
263
|
-
if (selector.charCodeAt(i) === 124)
|
|
264
|
-
throw new Error("Empty namespace not supported");
|
|
265
|
-
if (selector.charCodeAt(i) === 42 && selector.charCodeAt(i + 1) === 124) {
|
|
266
|
-
i += 2;
|
|
267
|
-
const r = readName(selector, i);
|
|
268
|
-
i = r.end;
|
|
269
|
-
attribute = r.value;
|
|
270
|
-
} else {
|
|
271
|
-
const r = readName(selector, i);
|
|
272
|
-
i = r.end;
|
|
273
|
-
attribute = r.value;
|
|
274
|
-
if (selector.charCodeAt(i) === 124 && selector.charCodeAt(i + 1) !== 61) {
|
|
275
|
-
i++;
|
|
276
|
-
const r2 = readName(selector, i);
|
|
277
|
-
i = r2.end;
|
|
278
|
-
attribute = r2.value;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
i = stripWS(selector, i);
|
|
282
|
-
let action = "exists";
|
|
283
|
-
let value = "";
|
|
284
|
-
let ignoreCase = null;
|
|
285
|
-
const opCode = selector.charCodeAt(i);
|
|
286
|
-
if (opCode === 61) {
|
|
287
|
-
action = "equals";
|
|
288
|
-
i++;
|
|
289
|
-
} else if (opCode === 33 && selector.charCodeAt(i + 1) === 61) {
|
|
290
|
-
action = "not";
|
|
291
|
-
i += 2;
|
|
292
|
-
} else {
|
|
293
|
-
const a = actionFromChar(opCode);
|
|
294
|
-
if (a !== null && selector.charCodeAt(i + 1) === 61) {
|
|
295
|
-
action = a;
|
|
296
|
-
i += 2;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
if (action !== "exists") {
|
|
300
|
-
i = stripWS(selector, i);
|
|
301
|
-
const q = selector.charCodeAt(i);
|
|
302
|
-
if (q === 34 || q === 39) {
|
|
303
|
-
const end = findEndOfString(selector, i + 1, q);
|
|
304
|
-
value = unescapeIfNeeded(selector.slice(i + 1, end));
|
|
305
|
-
i = end + 1;
|
|
306
|
-
} else {
|
|
307
|
-
const r = readName(selector, i);
|
|
308
|
-
value = r.value;
|
|
309
|
-
i = r.end;
|
|
310
|
-
}
|
|
311
|
-
i = stripWS(selector, i);
|
|
312
|
-
const flag = selector.charCodeAt(i);
|
|
313
|
-
if (flag === 105 || flag === 73) {
|
|
314
|
-
ignoreCase = true;
|
|
315
|
-
i++;
|
|
316
|
-
} else if (flag === 115 || flag === 83) {
|
|
317
|
-
ignoreCase = false;
|
|
318
|
-
i++;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
if (selector.charCodeAt(i) !== 93)
|
|
322
|
-
throw new Error("Expected ]");
|
|
323
|
-
i++;
|
|
324
|
-
if (ignoreCase === null && !xmlMode && ATTRIBUTES_QUIRKS.has(attribute.toLowerCase()))
|
|
325
|
-
ignoreCase = "quirks";
|
|
326
|
-
tokens.push({
|
|
327
|
-
type: "attribute",
|
|
328
|
-
name: lowerCaseAttrs ? attribute.toLowerCase() : attribute,
|
|
329
|
-
action,
|
|
330
|
-
value,
|
|
331
|
-
namespace: null,
|
|
332
|
-
ignoreCase
|
|
333
|
-
});
|
|
334
|
-
return i;
|
|
335
|
-
}
|
|
336
|
-
function parsePseudo(selector, idx, tokens, options) {
|
|
337
|
-
if (selector.charCodeAt(idx + 1) === 58) {
|
|
338
|
-
let i2 = idx + 2;
|
|
339
|
-
const r2 = readName(selector, i2);
|
|
340
|
-
i2 = r2.end;
|
|
341
|
-
const name2 = r2.value.toLowerCase();
|
|
342
|
-
let data = null;
|
|
343
|
-
if (selector.charCodeAt(i2) === 40) {
|
|
344
|
-
const end = findClose(selector, i2);
|
|
345
|
-
data = selector.slice(i2 + 1, end).trim();
|
|
346
|
-
i2 = end + 1;
|
|
347
|
-
}
|
|
348
|
-
tokens.push({ type: "pseudo-element", name: name2, data });
|
|
349
|
-
return i2;
|
|
350
|
-
}
|
|
351
|
-
let i = idx + 1;
|
|
352
|
-
const r = readName(selector, i);
|
|
353
|
-
i = r.end;
|
|
354
|
-
const name = r.value.toLowerCase();
|
|
355
|
-
if (selector.charCodeAt(i) === 40) {
|
|
356
|
-
const end = findClose(selector, i);
|
|
357
|
-
const inner = selector.slice(i + 1, end);
|
|
358
|
-
i = end + 1;
|
|
359
|
-
if (name === "is" || name === "not" || name === "where" || name === "has" || name === "matches" || name === "-moz-any" || name === "-webkit-any") {
|
|
360
|
-
const sub = [];
|
|
361
|
-
parseSelectorImpl(sub, inner.trim(), options, 0);
|
|
362
|
-
tokens.push({ type: "pseudo", name, data: sub });
|
|
363
|
-
} else {
|
|
364
|
-
tokens.push({ type: "pseudo", name, data: inner.trim() });
|
|
365
|
-
}
|
|
366
|
-
} else {
|
|
367
|
-
tokens.push({ type: "pseudo", name, data: null });
|
|
368
|
-
}
|
|
369
|
-
return i;
|
|
370
|
-
}
|
|
371
|
-
function addTraversal(tokens, type) {
|
|
372
|
-
if (tokens.length > 0 && tokens[tokens.length - 1].type === "descendant" && type !== "descendant")
|
|
373
|
-
tokens.pop();
|
|
374
|
-
if (tokens.length > 0 && tokens[tokens.length - 1].type === type)
|
|
375
|
-
return;
|
|
376
|
-
tokens.push({ type });
|
|
377
|
-
}
|
|
378
|
-
function findEndOfString(selector, start, qCode) {
|
|
379
|
-
let i = start;
|
|
380
|
-
const len = selector.length;
|
|
381
|
-
while (i < len) {
|
|
382
|
-
const c = selector.charCodeAt(i);
|
|
383
|
-
if (c === 92) {
|
|
384
|
-
i += 2;
|
|
385
|
-
continue;
|
|
386
|
-
}
|
|
387
|
-
if (c === qCode)
|
|
388
|
-
return i;
|
|
389
|
-
i++;
|
|
390
|
-
}
|
|
391
|
-
throw new Error("Unterminated string");
|
|
392
|
-
}
|
|
393
|
-
function findClose(selector, openParen) {
|
|
394
|
-
let depth = 1;
|
|
395
|
-
let i = openParen + 1;
|
|
396
|
-
const len = selector.length;
|
|
397
|
-
while (i < len) {
|
|
398
|
-
const c = selector.charCodeAt(i);
|
|
399
|
-
if (c === 92) {
|
|
400
|
-
i += 2;
|
|
401
|
-
continue;
|
|
402
|
-
}
|
|
403
|
-
if (c === 34 || c === 39) {
|
|
404
|
-
i = findEndOfString(selector, i + 1, c) + 1;
|
|
405
|
-
continue;
|
|
406
|
-
}
|
|
407
|
-
if (c === 40)
|
|
408
|
-
depth++;
|
|
409
|
-
else if (c === 41) {
|
|
410
|
-
depth--;
|
|
411
|
-
if (depth === 0)
|
|
412
|
-
return i;
|
|
413
|
-
}
|
|
414
|
-
i++;
|
|
415
|
-
}
|
|
416
|
-
throw new Error("Unterminated parenthesis");
|
|
417
|
-
}
|
|
418
|
-
// src/what/stringify.ts
|
|
419
|
-
var COMBINATORS = {
|
|
420
|
-
child: " > ",
|
|
421
|
-
parent: " < ",
|
|
422
|
-
sibling: " ~ ",
|
|
423
|
-
adjacent: " + ",
|
|
424
|
-
descendant: " ",
|
|
425
|
-
"column-combinator": " || "
|
|
426
|
-
};
|
|
427
|
-
function stringify(selector) {
|
|
428
|
-
return selector.map(stringifySegments).join(", ");
|
|
429
|
-
}
|
|
430
|
-
function stringifySegments(tokens) {
|
|
431
|
-
return tokens.map((t, i) => stringifyOne(t, tokens[i - 1])).join("");
|
|
432
|
-
}
|
|
433
|
-
function stringifyOne(token, _prev) {
|
|
434
|
-
switch (token.type) {
|
|
435
|
-
case "tag":
|
|
436
|
-
return `${nsPrefix(token.namespace)}${escapeIdent(token.name)}`;
|
|
437
|
-
case "universal":
|
|
438
|
-
return `${nsPrefix(token.namespace)}*`;
|
|
439
|
-
case "attribute": {
|
|
440
|
-
if (token.name === "id" && token.action === "equals" && !token.ignoreCase && !token.namespace)
|
|
441
|
-
return `#${escapeIdent(token.value)}`;
|
|
442
|
-
if (token.name === "class" && token.action === "element" && !token.ignoreCase && !token.namespace)
|
|
443
|
-
return `.${escapeIdent(token.value)}`;
|
|
444
|
-
let out = `[${nsPrefix(token.namespace)}${escapeIdent(token.name)}`;
|
|
445
|
-
if (token.action !== "exists") {
|
|
446
|
-
const op = ACTION_OP[token.action] ?? "=";
|
|
447
|
-
out += op;
|
|
448
|
-
out += `"${token.value.replace(/"/g, "\\\"")}"`;
|
|
449
|
-
if (token.ignoreCase === true)
|
|
450
|
-
out += " i";
|
|
451
|
-
else if (token.ignoreCase === false)
|
|
452
|
-
out += " s";
|
|
453
|
-
}
|
|
454
|
-
out += "]";
|
|
455
|
-
return out;
|
|
456
|
-
}
|
|
457
|
-
case "pseudo":
|
|
458
|
-
if (token.data === null)
|
|
459
|
-
return `:${token.name}`;
|
|
460
|
-
if (typeof token.data === "string")
|
|
461
|
-
return `:${token.name}(${token.data})`;
|
|
462
|
-
return `:${token.name}(${stringify(token.data)})`;
|
|
463
|
-
case "pseudo-element":
|
|
464
|
-
return token.data === null ? `::${token.name}` : `::${token.name}(${token.data})`;
|
|
465
|
-
case "descendant":
|
|
466
|
-
case "child":
|
|
467
|
-
case "parent":
|
|
468
|
-
case "sibling":
|
|
469
|
-
case "adjacent":
|
|
470
|
-
case "column-combinator":
|
|
471
|
-
return COMBINATORS[token.type] ?? " ";
|
|
472
|
-
}
|
|
473
|
-
return "";
|
|
474
|
-
}
|
|
475
|
-
var ACTION_OP = {
|
|
476
|
-
equals: "=",
|
|
477
|
-
element: "~=",
|
|
478
|
-
start: "^=",
|
|
479
|
-
end: "$=",
|
|
480
|
-
any: "*=",
|
|
481
|
-
not: "!=",
|
|
482
|
-
hyphen: "|="
|
|
483
|
-
};
|
|
484
|
-
function nsPrefix(ns) {
|
|
485
|
-
if (ns === null)
|
|
486
|
-
return "";
|
|
487
|
-
if (ns === "")
|
|
488
|
-
return "|";
|
|
489
|
-
return `${escapeIdent(ns)}|`;
|
|
490
|
-
}
|
|
491
|
-
var RE_INVALID_ID_CHAR = /[^\w\u00B0-\uFFFF-]/g;
|
|
492
|
-
function escapeIdent(name) {
|
|
493
|
-
if (name === "")
|
|
494
|
-
return "";
|
|
495
|
-
return name.replace(RE_INVALID_ID_CHAR, (m) => `\\${m}`);
|
|
496
|
-
}
|
|
497
|
-
// src/what/traversal.ts
|
|
498
|
-
var TRAVERSAL_TYPES = new Set(["adjacent", "child", "descendant", "parent", "sibling", "column-combinator"]);
|
|
499
|
-
function isTraversal(token) {
|
|
500
|
-
return TRAVERSAL_TYPES.has(token.type);
|
|
501
|
-
}
|
|
502
|
-
// src/what/types.ts
|
|
503
|
-
var IgnoreCaseMode = {
|
|
504
|
-
Unknown: null,
|
|
505
|
-
QuirksMode: "quirks",
|
|
506
|
-
IgnoreCase: true,
|
|
507
|
-
CaseSensitive: false
|
|
508
|
-
};
|
|
509
|
-
// src/select/index.ts
|
|
510
|
-
var exports_select = {};
|
|
511
|
-
__export(exports_select, {
|
|
512
|
-
selectOne: () => selectOne,
|
|
513
|
-
selectAll: () => selectAll,
|
|
514
|
-
parseAndCompile: () => parseAndCompile,
|
|
515
|
-
is: () => is,
|
|
516
|
-
compile: () => compile,
|
|
517
|
-
clearSelectorCache: () => clearSelectorCache
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
// src/select/helpers/querying.ts
|
|
521
|
-
function findAll(query, nodes, adapter, xmlMode) {
|
|
522
|
-
const result = [];
|
|
523
|
-
const nodeStack = [nodes];
|
|
524
|
-
const indexStack = [0];
|
|
525
|
-
for (;; ) {
|
|
526
|
-
if (indexStack[0] >= nodeStack[0].length) {
|
|
527
|
-
if (nodeStack.length === 1)
|
|
528
|
-
return result;
|
|
529
|
-
nodeStack.shift();
|
|
530
|
-
indexStack.shift();
|
|
531
|
-
continue;
|
|
532
|
-
}
|
|
533
|
-
const element = nodeStack[0][indexStack[0]++];
|
|
534
|
-
if (!adapter.isTag(element))
|
|
535
|
-
continue;
|
|
536
|
-
if (query(element))
|
|
537
|
-
result.push(element);
|
|
538
|
-
if (xmlMode || adapter.getName(element) !== "template") {
|
|
539
|
-
const children = adapter.getChildren(element);
|
|
540
|
-
if (children.length > 0) {
|
|
541
|
-
nodeStack.unshift(children);
|
|
542
|
-
indexStack.unshift(0);
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
function findOne(query, nodes, adapter, xmlMode) {
|
|
548
|
-
const nodeStack = [nodes];
|
|
549
|
-
const indexStack = [0];
|
|
550
|
-
for (;; ) {
|
|
551
|
-
if (indexStack[0] >= nodeStack[0].length) {
|
|
552
|
-
if (nodeStack.length === 1)
|
|
553
|
-
return null;
|
|
554
|
-
nodeStack.shift();
|
|
555
|
-
indexStack.shift();
|
|
556
|
-
continue;
|
|
557
|
-
}
|
|
558
|
-
const element = nodeStack[0][indexStack[0]++];
|
|
559
|
-
if (!adapter.isTag(element))
|
|
560
|
-
continue;
|
|
561
|
-
if (query(element))
|
|
562
|
-
return element;
|
|
563
|
-
if (xmlMode || adapter.getName(element) !== "template") {
|
|
564
|
-
const children = adapter.getChildren(element);
|
|
565
|
-
if (children.length > 0) {
|
|
566
|
-
nodeStack.unshift(children);
|
|
567
|
-
indexStack.unshift(0);
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
function prepareContext(elements, adapter) {
|
|
573
|
-
if (Array.isArray(elements))
|
|
574
|
-
return adapter.removeSubsets(elements);
|
|
575
|
-
return adapter.getChildren(elements);
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
// src/select/helpers/always-true.ts
|
|
579
|
-
var ALWAYS_TRUE = (_) => {
|
|
580
|
-
return true;
|
|
581
|
-
};
|
|
582
|
-
|
|
583
|
-
// src/select/attributes.ts
|
|
584
|
-
function isWsCode2(c) {
|
|
585
|
-
return c === 32 || c === 9 || c === 10 || c === 12 || c === 13;
|
|
586
|
-
}
|
|
587
|
-
function containsWsToken(haystack, needle) {
|
|
588
|
-
const nlen = needle.length;
|
|
589
|
-
const hlen = haystack.length;
|
|
590
|
-
if (nlen === 0 || nlen > hlen)
|
|
591
|
-
return false;
|
|
592
|
-
let idx = haystack.indexOf(needle);
|
|
593
|
-
while (idx >= 0) {
|
|
594
|
-
const before = idx === 0 || isWsCode2(haystack.charCodeAt(idx - 1));
|
|
595
|
-
const afterIdx = idx + nlen;
|
|
596
|
-
const after = afterIdx === hlen || isWsCode2(haystack.charCodeAt(afterIdx));
|
|
597
|
-
if (before && after)
|
|
598
|
-
return true;
|
|
599
|
-
idx = haystack.indexOf(needle, idx + 1);
|
|
600
|
-
}
|
|
601
|
-
return false;
|
|
602
|
-
}
|
|
603
|
-
function caseInsensitive(value, attr, options) {
|
|
604
|
-
if (attr.ignoreCase === true)
|
|
605
|
-
return true;
|
|
606
|
-
if (attr.ignoreCase === false)
|
|
607
|
-
return false;
|
|
608
|
-
if (attr.ignoreCase === "quirks")
|
|
609
|
-
return !options.xmlMode;
|
|
610
|
-
return false;
|
|
611
|
-
}
|
|
612
|
-
function compileAttribute(selector, options, next) {
|
|
613
|
-
const adapter = options.adapter;
|
|
614
|
-
const action = selector.action;
|
|
615
|
-
const name = selector.name;
|
|
616
|
-
let value = selector.value;
|
|
617
|
-
const ci = caseInsensitive(value, selector, options);
|
|
618
|
-
if (ci)
|
|
619
|
-
value = value.toLowerCase();
|
|
620
|
-
return wrap(action, name, value, ci, adapter, next);
|
|
621
|
-
}
|
|
622
|
-
function wrap(action, name, value, ci, adapter, next) {
|
|
623
|
-
const isLeaf = next === ALWAYS_TRUE;
|
|
624
|
-
switch (action) {
|
|
625
|
-
case "exists":
|
|
626
|
-
if (isLeaf)
|
|
627
|
-
return (e) => adapter.hasAttrib(e, name);
|
|
628
|
-
return (e) => adapter.hasAttrib(e, name) && next(e);
|
|
629
|
-
case "equals":
|
|
630
|
-
if (!ci) {
|
|
631
|
-
if (isLeaf)
|
|
632
|
-
return (e) => adapter.getAttributeValue(e, name) === value;
|
|
633
|
-
return (e) => adapter.getAttributeValue(e, name) === value && next(e);
|
|
634
|
-
}
|
|
635
|
-
if (isLeaf) {
|
|
636
|
-
return (e) => {
|
|
637
|
-
const v = adapter.getAttributeValue(e, name);
|
|
638
|
-
if (v == null)
|
|
639
|
-
return false;
|
|
640
|
-
return v.toLowerCase() === value;
|
|
641
|
-
};
|
|
642
|
-
}
|
|
643
|
-
return (e) => {
|
|
644
|
-
const v = adapter.getAttributeValue(e, name);
|
|
645
|
-
if (v == null)
|
|
646
|
-
return false;
|
|
647
|
-
return v.toLowerCase() === value && next(e);
|
|
648
|
-
};
|
|
649
|
-
case "not":
|
|
650
|
-
return (e) => {
|
|
651
|
-
const v = adapter.getAttributeValue(e, name);
|
|
652
|
-
if (v == null)
|
|
653
|
-
return next(e);
|
|
654
|
-
return (ci ? v.toLowerCase() : v) !== value && next(e);
|
|
655
|
-
};
|
|
656
|
-
case "start":
|
|
657
|
-
if (value === "")
|
|
658
|
-
return () => false;
|
|
659
|
-
if (isLeaf) {
|
|
660
|
-
return (e) => {
|
|
661
|
-
const v = adapter.getAttributeValue(e, name);
|
|
662
|
-
if (v == null)
|
|
663
|
-
return false;
|
|
664
|
-
return (ci ? v.toLowerCase() : v).startsWith(value);
|
|
665
|
-
};
|
|
666
|
-
}
|
|
667
|
-
return (e) => {
|
|
668
|
-
const v = adapter.getAttributeValue(e, name);
|
|
669
|
-
if (v == null)
|
|
670
|
-
return false;
|
|
671
|
-
return (ci ? v.toLowerCase() : v).startsWith(value) && next(e);
|
|
672
|
-
};
|
|
673
|
-
case "end":
|
|
674
|
-
if (value === "")
|
|
675
|
-
return () => false;
|
|
676
|
-
if (isLeaf) {
|
|
677
|
-
return (e) => {
|
|
678
|
-
const v = adapter.getAttributeValue(e, name);
|
|
679
|
-
if (v == null)
|
|
680
|
-
return false;
|
|
681
|
-
return (ci ? v.toLowerCase() : v).endsWith(value);
|
|
682
|
-
};
|
|
683
|
-
}
|
|
684
|
-
return (e) => {
|
|
685
|
-
const v = adapter.getAttributeValue(e, name);
|
|
686
|
-
if (v == null)
|
|
687
|
-
return false;
|
|
688
|
-
return (ci ? v.toLowerCase() : v).endsWith(value) && next(e);
|
|
689
|
-
};
|
|
690
|
-
case "any": {
|
|
691
|
-
if (value === "")
|
|
692
|
-
return () => false;
|
|
693
|
-
if (ci) {
|
|
694
|
-
if (isLeaf) {
|
|
695
|
-
return (e) => {
|
|
696
|
-
const v = adapter.getAttributeValue(e, name);
|
|
697
|
-
if (v == null)
|
|
698
|
-
return false;
|
|
699
|
-
return v.toLowerCase().indexOf(value) >= 0;
|
|
700
|
-
};
|
|
701
|
-
}
|
|
702
|
-
return (e) => {
|
|
703
|
-
const v = adapter.getAttributeValue(e, name);
|
|
704
|
-
if (v == null)
|
|
705
|
-
return false;
|
|
706
|
-
return v.toLowerCase().indexOf(value) >= 0 && next(e);
|
|
707
|
-
};
|
|
708
|
-
}
|
|
709
|
-
if (isLeaf) {
|
|
710
|
-
return (e) => {
|
|
711
|
-
const v = adapter.getAttributeValue(e, name);
|
|
712
|
-
if (v == null)
|
|
713
|
-
return false;
|
|
714
|
-
return v.indexOf(value) >= 0;
|
|
715
|
-
};
|
|
716
|
-
}
|
|
717
|
-
return (e) => {
|
|
718
|
-
const v = adapter.getAttributeValue(e, name);
|
|
719
|
-
if (v == null)
|
|
720
|
-
return false;
|
|
721
|
-
return v.indexOf(value) >= 0 && next(e);
|
|
722
|
-
};
|
|
723
|
-
}
|
|
724
|
-
case "element": {
|
|
725
|
-
if (value === "" || /\s/.test(value))
|
|
726
|
-
return () => false;
|
|
727
|
-
if (ci) {
|
|
728
|
-
if (isLeaf) {
|
|
729
|
-
return (e) => {
|
|
730
|
-
const v = adapter.getAttributeValue(e, name);
|
|
731
|
-
if (v == null)
|
|
732
|
-
return false;
|
|
733
|
-
return containsWsToken(v.toLowerCase(), value);
|
|
734
|
-
};
|
|
735
|
-
}
|
|
736
|
-
return (e) => {
|
|
737
|
-
const v = adapter.getAttributeValue(e, name);
|
|
738
|
-
if (v == null)
|
|
739
|
-
return false;
|
|
740
|
-
return containsWsToken(v.toLowerCase(), value) && next(e);
|
|
741
|
-
};
|
|
742
|
-
}
|
|
743
|
-
if (isLeaf) {
|
|
744
|
-
return (e) => {
|
|
745
|
-
const v = adapter.getAttributeValue(e, name);
|
|
746
|
-
if (v == null)
|
|
747
|
-
return false;
|
|
748
|
-
return containsWsToken(v, value);
|
|
749
|
-
};
|
|
750
|
-
}
|
|
751
|
-
return (e) => {
|
|
752
|
-
const v = adapter.getAttributeValue(e, name);
|
|
753
|
-
if (v == null)
|
|
754
|
-
return false;
|
|
755
|
-
return containsWsToken(v, value) && next(e);
|
|
756
|
-
};
|
|
757
|
-
}
|
|
758
|
-
case "hyphen":
|
|
759
|
-
if (isLeaf) {
|
|
760
|
-
return (e) => {
|
|
761
|
-
const v = adapter.getAttributeValue(e, name);
|
|
762
|
-
if (v == null)
|
|
763
|
-
return false;
|
|
764
|
-
const lower = ci ? v.toLowerCase() : v;
|
|
765
|
-
if (lower === value)
|
|
766
|
-
return true;
|
|
767
|
-
if (lower.startsWith(value) && lower.charAt(value.length) === "-")
|
|
768
|
-
return true;
|
|
769
|
-
return false;
|
|
770
|
-
};
|
|
771
|
-
}
|
|
772
|
-
return (e) => {
|
|
773
|
-
const v = adapter.getAttributeValue(e, name);
|
|
774
|
-
if (v == null)
|
|
775
|
-
return false;
|
|
776
|
-
const lower = ci ? v.toLowerCase() : v;
|
|
777
|
-
if (lower === value)
|
|
778
|
-
return next(e);
|
|
779
|
-
if (lower.startsWith(value) && lower.charAt(value.length) === "-")
|
|
780
|
-
return next(e);
|
|
781
|
-
return false;
|
|
782
|
-
};
|
|
783
|
-
}
|
|
784
|
-
return (_) => {
|
|
785
|
-
return false;
|
|
786
|
-
};
|
|
787
|
-
}
|
|
788
|
-
|
|
789
|
-
// src/select/pseudo-selectors/index.ts
|
|
790
|
-
var STATEFUL_PSEUDOS = new Set([
|
|
791
|
-
"link",
|
|
792
|
-
"any-link",
|
|
793
|
-
"visited",
|
|
794
|
-
"hover",
|
|
795
|
-
"active",
|
|
796
|
-
"focus",
|
|
797
|
-
"focus-visible",
|
|
798
|
-
"focus-within",
|
|
799
|
-
"target",
|
|
800
|
-
"target-within",
|
|
801
|
-
"enabled",
|
|
802
|
-
"disabled",
|
|
803
|
-
"checked",
|
|
804
|
-
"required",
|
|
805
|
-
"optional",
|
|
806
|
-
"valid",
|
|
807
|
-
"invalid",
|
|
808
|
-
"selected",
|
|
809
|
-
"placeholder-shown",
|
|
810
|
-
"read-only",
|
|
811
|
-
"read-write",
|
|
812
|
-
"in-range",
|
|
813
|
-
"out-of-range",
|
|
814
|
-
"default",
|
|
815
|
-
"indeterminate"
|
|
816
|
-
]);
|
|
817
|
-
var SELECTOR_LIST_PSEUDOS = new Set([
|
|
818
|
-
"is",
|
|
819
|
-
"where",
|
|
820
|
-
"matches",
|
|
821
|
-
"-moz-any",
|
|
822
|
-
"-webkit-any"
|
|
823
|
-
]);
|
|
824
|
-
var NTH_PSEUDOS = new Set([
|
|
825
|
-
"nth-child",
|
|
826
|
-
"nth-last-child",
|
|
827
|
-
"nth-of-type",
|
|
828
|
-
"nth-last-of-type"
|
|
829
|
-
]);
|
|
830
|
-
function compilePseudo(token, options, next) {
|
|
831
|
-
const adapter = options.adapter;
|
|
832
|
-
const name = token.name;
|
|
833
|
-
const data = token.data;
|
|
834
|
-
if (token.type === "pseudo" && SELECTOR_LIST_PSEUDOS.has(name)) {
|
|
835
|
-
if (!Array.isArray(data))
|
|
836
|
-
return next;
|
|
837
|
-
const tests = data.map((seg) => parseAndCompile(seg, options));
|
|
838
|
-
if (tests.length === 1) {
|
|
839
|
-
const t0 = tests[0];
|
|
840
|
-
return (e) => t0(e) && next(e);
|
|
841
|
-
}
|
|
842
|
-
return (e) => {
|
|
843
|
-
for (const t of tests) {
|
|
844
|
-
if (t(e))
|
|
845
|
-
return next(e);
|
|
846
|
-
}
|
|
847
|
-
return false;
|
|
848
|
-
};
|
|
849
|
-
}
|
|
850
|
-
if (token.type === "pseudo" && name === "not") {
|
|
851
|
-
if (!Array.isArray(data))
|
|
852
|
-
return next;
|
|
853
|
-
const tests = data.map((seg) => parseAndCompile(seg, options));
|
|
854
|
-
if (tests.length === 1) {
|
|
855
|
-
const t0 = tests[0];
|
|
856
|
-
return (e) => !t0(e) && next(e);
|
|
857
|
-
}
|
|
858
|
-
return (e) => {
|
|
859
|
-
for (const t of tests) {
|
|
860
|
-
if (t(e))
|
|
861
|
-
return false;
|
|
862
|
-
}
|
|
863
|
-
return next(e);
|
|
864
|
-
};
|
|
865
|
-
}
|
|
866
|
-
if (token.type === "pseudo" && name === "has") {
|
|
867
|
-
if (!Array.isArray(data))
|
|
868
|
-
return next;
|
|
869
|
-
const tests = data.map((seg) => parseAndCompile(seg, options));
|
|
870
|
-
const subjectTest = tests.length === 1 ? tests[0] : (node) => {
|
|
871
|
-
for (const t of tests) {
|
|
872
|
-
if (t(node))
|
|
873
|
-
return true;
|
|
874
|
-
}
|
|
875
|
-
return false;
|
|
876
|
-
};
|
|
877
|
-
return (e) => {
|
|
878
|
-
const stack = adapter.getChildren(e).slice();
|
|
879
|
-
while (stack.length > 0) {
|
|
880
|
-
const cur = stack.pop();
|
|
881
|
-
if (!adapter.isTag(cur))
|
|
882
|
-
continue;
|
|
883
|
-
if (subjectTest(cur))
|
|
884
|
-
return next(e);
|
|
885
|
-
const kids = adapter.getChildren(cur);
|
|
886
|
-
for (let i = 0;i < kids.length; i++)
|
|
887
|
-
stack.push(kids[i]);
|
|
888
|
-
}
|
|
889
|
-
return false;
|
|
890
|
-
};
|
|
891
|
-
}
|
|
892
|
-
if (token.type === "pseudo" && NTH_PSEUDOS.has(name)) {
|
|
893
|
-
const fn = compileNth(typeof data === "string" ? data : "", name, options);
|
|
894
|
-
return (e) => fn(e) && next(e);
|
|
895
|
-
}
|
|
896
|
-
if (token.type === "pseudo" && name === "first-child") {
|
|
897
|
-
return (e) => {
|
|
898
|
-
const sibs = adapter.getSiblings(e);
|
|
899
|
-
for (const s of sibs) {
|
|
900
|
-
if (!adapter.isTag(s))
|
|
901
|
-
continue;
|
|
902
|
-
return s === e && next(e);
|
|
903
|
-
}
|
|
904
|
-
return false;
|
|
905
|
-
};
|
|
906
|
-
}
|
|
907
|
-
if (token.type === "pseudo" && name === "last-child") {
|
|
908
|
-
return (e) => {
|
|
909
|
-
const sibs = adapter.getSiblings(e);
|
|
910
|
-
for (let i = sibs.length - 1;i >= 0; i--) {
|
|
911
|
-
const s = sibs[i];
|
|
912
|
-
if (!adapter.isTag(s))
|
|
913
|
-
continue;
|
|
914
|
-
return s === e && next(e);
|
|
915
|
-
}
|
|
916
|
-
return false;
|
|
917
|
-
};
|
|
918
|
-
}
|
|
919
|
-
if (token.type === "pseudo" && name === "first-of-type") {
|
|
920
|
-
return (e) => {
|
|
921
|
-
const tag = adapter.getName(e);
|
|
922
|
-
const sibs = adapter.getSiblings(e);
|
|
923
|
-
for (const s of sibs) {
|
|
924
|
-
if (!adapter.isTag(s) || adapter.getName(s) !== tag)
|
|
925
|
-
continue;
|
|
926
|
-
return s === e && next(e);
|
|
927
|
-
}
|
|
928
|
-
return false;
|
|
929
|
-
};
|
|
930
|
-
}
|
|
931
|
-
if (token.type === "pseudo" && name === "last-of-type") {
|
|
932
|
-
return (e) => {
|
|
933
|
-
const tag = adapter.getName(e);
|
|
934
|
-
const sibs = adapter.getSiblings(e);
|
|
935
|
-
for (let i = sibs.length - 1;i >= 0; i--) {
|
|
936
|
-
const s = sibs[i];
|
|
937
|
-
if (!adapter.isTag(s) || adapter.getName(s) !== tag)
|
|
938
|
-
continue;
|
|
939
|
-
return s === e && next(e);
|
|
940
|
-
}
|
|
941
|
-
return false;
|
|
942
|
-
};
|
|
943
|
-
}
|
|
944
|
-
if (token.type === "pseudo" && name === "only-child") {
|
|
945
|
-
return (e) => {
|
|
946
|
-
const sibs = adapter.getSiblings(e);
|
|
947
|
-
let count = 0;
|
|
948
|
-
let found = false;
|
|
949
|
-
for (const s of sibs) {
|
|
950
|
-
if (!adapter.isTag(s))
|
|
951
|
-
continue;
|
|
952
|
-
count++;
|
|
953
|
-
if (count > 1)
|
|
954
|
-
return false;
|
|
955
|
-
if (s === e)
|
|
956
|
-
found = true;
|
|
957
|
-
}
|
|
958
|
-
return count === 1 && found && next(e);
|
|
959
|
-
};
|
|
960
|
-
}
|
|
961
|
-
if (token.type === "pseudo" && name === "only-of-type") {
|
|
962
|
-
return (e) => {
|
|
963
|
-
const tag = adapter.getName(e);
|
|
964
|
-
const sibs = adapter.getSiblings(e);
|
|
965
|
-
let count = 0;
|
|
966
|
-
let found = false;
|
|
967
|
-
for (const s of sibs) {
|
|
968
|
-
if (!adapter.isTag(s) || adapter.getName(s) !== tag)
|
|
969
|
-
continue;
|
|
970
|
-
count++;
|
|
971
|
-
if (count > 1)
|
|
972
|
-
return false;
|
|
973
|
-
if (s === e)
|
|
974
|
-
found = true;
|
|
975
|
-
}
|
|
976
|
-
return count === 1 && found && next(e);
|
|
977
|
-
};
|
|
978
|
-
}
|
|
979
|
-
if (token.type === "pseudo" && name === "empty") {
|
|
980
|
-
return (e) => adapter.getChildren(e).length === 0 && next(e);
|
|
981
|
-
}
|
|
982
|
-
if (token.type === "pseudo" && name === "root") {
|
|
983
|
-
return (e) => {
|
|
984
|
-
const p = adapter.getParent(e);
|
|
985
|
-
return (p == null || !adapter.isTag(p)) && next(e);
|
|
986
|
-
};
|
|
987
|
-
}
|
|
988
|
-
if (token.type === "pseudo" && name === "scope") {
|
|
989
|
-
if (options.context && Array.isArray(options.context)) {
|
|
990
|
-
const ctx = new Set(options.context);
|
|
991
|
-
return (e) => ctx.has(e) && next(e);
|
|
992
|
-
}
|
|
993
|
-
if (options.context) {
|
|
994
|
-
const ctx = options.context;
|
|
995
|
-
return (e) => e === ctx && next(e);
|
|
996
|
-
}
|
|
997
|
-
return (e) => {
|
|
998
|
-
const p = adapter.getParent(e);
|
|
999
|
-
return (p == null || !adapter.isTag(p)) && next(e);
|
|
1000
|
-
};
|
|
1001
|
-
}
|
|
1002
|
-
if (token.type === "pseudo" && STATEFUL_PSEUDOS.has(name)) {
|
|
1003
|
-
if (options.pseudos && options.pseudos[name]) {
|
|
1004
|
-
const ext = options.pseudos[name];
|
|
1005
|
-
if (typeof ext === "function")
|
|
1006
|
-
return (e) => ext(e, undefined) && next(e);
|
|
1007
|
-
}
|
|
1008
|
-
return (_) => {
|
|
1009
|
-
return false;
|
|
1010
|
-
};
|
|
1011
|
-
}
|
|
1012
|
-
if (token.type === "pseudo-element") {
|
|
1013
|
-
return next;
|
|
1014
|
-
}
|
|
1015
|
-
if (options.pseudos && options.pseudos[name]) {
|
|
1016
|
-
const ext = options.pseudos[name];
|
|
1017
|
-
if (typeof ext === "function") {
|
|
1018
|
-
return (e) => ext(e, typeof data === "string" ? data : undefined) && next(e);
|
|
1019
|
-
}
|
|
1020
|
-
if (typeof ext === "string") {
|
|
1021
|
-
const aliasGroups = parse(ext);
|
|
1022
|
-
const re = compileGeneric(aliasGroups, options);
|
|
1023
|
-
return (e) => re(e) && next(e);
|
|
1024
|
-
}
|
|
1025
|
-
}
|
|
1026
|
-
return (_) => {
|
|
1027
|
-
return false;
|
|
1028
|
-
};
|
|
1029
|
-
}
|
|
1030
|
-
function parseAnPlusB(s) {
|
|
1031
|
-
const trimmed = s.trim();
|
|
1032
|
-
if (trimmed === "odd")
|
|
1033
|
-
return { a: 2, b: 1 };
|
|
1034
|
-
if (trimmed === "even")
|
|
1035
|
-
return { a: 2, b: 0 };
|
|
1036
|
-
const m = /^([+-]?\d*)n([+-]\d+)?$/.exec(trimmed.replace(/\s+/g, ""));
|
|
1037
|
-
if (m) {
|
|
1038
|
-
const a = m[1] === "" || m[1] === "+" ? 1 : m[1] === "-" ? -1 : Number(m[1]);
|
|
1039
|
-
const b = m[2] ? Number(m[2]) : 0;
|
|
1040
|
-
return { a, b };
|
|
1041
|
-
}
|
|
1042
|
-
const num = Number(trimmed);
|
|
1043
|
-
if (!Number.isNaN(num))
|
|
1044
|
-
return { a: 0, b: num };
|
|
1045
|
-
return null;
|
|
1046
|
-
}
|
|
1047
|
-
function compileNth(arg, kind, options) {
|
|
1048
|
-
const ab = parseAnPlusB(arg);
|
|
1049
|
-
if (!ab)
|
|
1050
|
-
return () => false;
|
|
1051
|
-
const { a, b } = ab;
|
|
1052
|
-
const adapter = options.adapter;
|
|
1053
|
-
const ofType = kind === "nth-of-type" || kind === "nth-last-of-type";
|
|
1054
|
-
const reverse = kind === "nth-last-child" || kind === "nth-last-of-type";
|
|
1055
|
-
return (e) => {
|
|
1056
|
-
const sibs = adapter.getSiblings(e);
|
|
1057
|
-
const tag = ofType ? adapter.getName(e) : "";
|
|
1058
|
-
let raw = 0;
|
|
1059
|
-
let total = 0;
|
|
1060
|
-
for (const s of sibs) {
|
|
1061
|
-
if (!adapter.isTag(s))
|
|
1062
|
-
continue;
|
|
1063
|
-
if (ofType && adapter.getName(s) !== tag)
|
|
1064
|
-
continue;
|
|
1065
|
-
total++;
|
|
1066
|
-
if (s === e)
|
|
1067
|
-
raw = total;
|
|
1068
|
-
}
|
|
1069
|
-
if (raw === 0)
|
|
1070
|
-
return false;
|
|
1071
|
-
const idx = reverse ? total - raw + 1 : raw;
|
|
1072
|
-
if (a === 0)
|
|
1073
|
-
return idx === b;
|
|
1074
|
-
return (idx - b) / a >= 0 && (idx - b) % a === 0;
|
|
1075
|
-
};
|
|
1076
|
-
}
|
|
1077
|
-
|
|
1078
|
-
// src/select/general.ts
|
|
1079
|
-
function compileToken(token, options, next) {
|
|
1080
|
-
const adapter = options.adapter;
|
|
1081
|
-
const isLeaf = next === ALWAYS_TRUE;
|
|
1082
|
-
switch (token.type) {
|
|
1083
|
-
case "tag": {
|
|
1084
|
-
const name = options.lowerCaseTags !== false && !options.xmlMode ? token.name.toLowerCase() : token.name;
|
|
1085
|
-
if (isLeaf)
|
|
1086
|
-
return (e) => adapter.getName(e) === name;
|
|
1087
|
-
return (e) => adapter.getName(e) === name && next(e);
|
|
1088
|
-
}
|
|
1089
|
-
case "universal":
|
|
1090
|
-
return next;
|
|
1091
|
-
case "attribute":
|
|
1092
|
-
return compileAttribute(token, options, next);
|
|
1093
|
-
case "pseudo":
|
|
1094
|
-
case "pseudo-element":
|
|
1095
|
-
return compilePseudo(token, options, next);
|
|
1096
|
-
case "descendant":
|
|
1097
|
-
case "child":
|
|
1098
|
-
case "parent":
|
|
1099
|
-
case "sibling":
|
|
1100
|
-
case "adjacent":
|
|
1101
|
-
case "column-combinator":
|
|
1102
|
-
return next;
|
|
1103
|
-
}
|
|
1104
|
-
return (_) => {
|
|
1105
|
-
return false;
|
|
1106
|
-
};
|
|
1107
|
-
}
|
|
1108
|
-
|
|
1109
|
-
// src/select/pseudo-selectors/selectors.ts
|
|
1110
|
-
var PROCEDURE = {
|
|
1111
|
-
universal: 50,
|
|
1112
|
-
tag: 30,
|
|
1113
|
-
attribute: 1,
|
|
1114
|
-
pseudo: 0,
|
|
1115
|
-
"pseudo-element": 0
|
|
1116
|
-
};
|
|
1117
|
-
var ATTRIBUTE_PROCEDURE = {
|
|
1118
|
-
exists: 10,
|
|
1119
|
-
equals: 8,
|
|
1120
|
-
not: 7,
|
|
1121
|
-
start: 6,
|
|
1122
|
-
end: 6,
|
|
1123
|
-
hyphen: 5,
|
|
1124
|
-
any: 4,
|
|
1125
|
-
element: 3
|
|
1126
|
-
};
|
|
1127
|
-
function tokenProcedure(t) {
|
|
1128
|
-
const base = PROCEDURE[t.type] ?? 0;
|
|
1129
|
-
if (t.type === "attribute")
|
|
1130
|
-
return base + (ATTRIBUTE_PROCEDURE[t.action] ?? 0);
|
|
1131
|
-
return base;
|
|
1132
|
-
}
|
|
1133
|
-
function compileGeneric(segments, options) {
|
|
1134
|
-
if (segments.length === 1)
|
|
1135
|
-
return parseAndCompile(segments[0], options);
|
|
1136
|
-
const compiled = segments.map((seg) => parseAndCompile(seg, options));
|
|
1137
|
-
return (e) => compiled.some((c) => c(e));
|
|
1138
|
-
}
|
|
1139
|
-
function parseAndCompile(tokens, options) {
|
|
1140
|
-
const adapter = options.adapter;
|
|
1141
|
-
const compounds = [[]];
|
|
1142
|
-
const combs = [];
|
|
1143
|
-
for (const t of tokens) {
|
|
1144
|
-
if (t.type === "descendant" || t.type === "child" || t.type === "sibling" || t.type === "adjacent" || t.type === "parent" || t.type === "column-combinator") {
|
|
1145
|
-
combs.push(t);
|
|
1146
|
-
compounds.push([]);
|
|
1147
|
-
} else {
|
|
1148
|
-
compounds[compounds.length - 1].push(t);
|
|
1149
|
-
}
|
|
1150
|
-
}
|
|
1151
|
-
let func = ALWAYS_TRUE;
|
|
1152
|
-
for (let ci = 0;ci < compounds.length; ci++) {
|
|
1153
|
-
const compound = compounds[ci].slice().sort((a, b) => tokenProcedure(a) - tokenProcedure(b));
|
|
1154
|
-
for (const t of compound)
|
|
1155
|
-
func = compileToken(t, options, func);
|
|
1156
|
-
if (ci < combs.length)
|
|
1157
|
-
func = wrapCombinator(combs[ci], func, adapter);
|
|
1158
|
-
}
|
|
1159
|
-
return func;
|
|
1160
|
-
}
|
|
1161
|
-
function wrapCombinator(comb, after, adapter) {
|
|
1162
|
-
switch (comb.type) {
|
|
1163
|
-
case "descendant":
|
|
1164
|
-
case "column-combinator":
|
|
1165
|
-
return (elem) => {
|
|
1166
|
-
let p = adapter.getParent(elem);
|
|
1167
|
-
while (p) {
|
|
1168
|
-
if (adapter.isTag(p) && after(p))
|
|
1169
|
-
return true;
|
|
1170
|
-
p = adapter.getParent(p);
|
|
1171
|
-
}
|
|
1172
|
-
return false;
|
|
1173
|
-
};
|
|
1174
|
-
case "child":
|
|
1175
|
-
return (elem) => {
|
|
1176
|
-
const p = adapter.getParent(elem);
|
|
1177
|
-
return p != null && adapter.isTag(p) && after(p);
|
|
1178
|
-
};
|
|
1179
|
-
case "sibling":
|
|
1180
|
-
return (elem) => {
|
|
1181
|
-
const sibs = adapter.getSiblings(elem);
|
|
1182
|
-
for (const s of sibs) {
|
|
1183
|
-
if (s === elem)
|
|
1184
|
-
return false;
|
|
1185
|
-
if (adapter.isTag(s) && after(s))
|
|
1186
|
-
return true;
|
|
1187
|
-
}
|
|
1188
|
-
return false;
|
|
1189
|
-
};
|
|
1190
|
-
case "adjacent":
|
|
1191
|
-
return (elem) => {
|
|
1192
|
-
const sibs = adapter.getSiblings(elem);
|
|
1193
|
-
let prev = null;
|
|
1194
|
-
for (const s of sibs) {
|
|
1195
|
-
if (s === elem)
|
|
1196
|
-
return prev != null && adapter.isTag(prev) && after(prev);
|
|
1197
|
-
prev = s;
|
|
1198
|
-
}
|
|
1199
|
-
return false;
|
|
1200
|
-
};
|
|
1201
|
-
case "parent":
|
|
1202
|
-
return (elem) => adapter.existsOne(after, adapter.getChildren(elem));
|
|
1203
|
-
}
|
|
1204
|
-
return (_) => {
|
|
1205
|
-
return false;
|
|
1206
|
-
};
|
|
1207
|
-
}
|
|
1208
|
-
|
|
1209
|
-
// src/select/index.ts
|
|
1210
|
-
function getAdapter(options) {
|
|
1211
|
-
if (!options || !options.adapter)
|
|
1212
|
-
throw new Error("css-select: adapter is required");
|
|
1213
|
-
return options.adapter;
|
|
1214
|
-
}
|
|
1215
|
-
var adapterCaches = new WeakMap;
|
|
1216
|
-
function flagSig(options) {
|
|
1217
|
-
return (options.xmlMode ? 1 : 0) << 0 | (options.lowerCaseAttributeNames === false ? 1 : 0) << 1 | (options.lowerCaseTags === false ? 1 : 0) << 2;
|
|
1218
|
-
}
|
|
1219
|
-
function getCache(adapter, sig) {
|
|
1220
|
-
let bucket = adapterCaches.get(adapter);
|
|
1221
|
-
if (!bucket) {
|
|
1222
|
-
bucket = [];
|
|
1223
|
-
adapterCaches.set(adapter, bucket);
|
|
1224
|
-
}
|
|
1225
|
-
let m = bucket[sig];
|
|
1226
|
-
if (!m) {
|
|
1227
|
-
m = new Map;
|
|
1228
|
-
bucket[sig] = m;
|
|
1229
|
-
}
|
|
1230
|
-
return m;
|
|
1231
|
-
}
|
|
1232
|
-
function compileSelectorString(selector, options) {
|
|
1233
|
-
const ast = parse(selector, {
|
|
1234
|
-
xmlMode: options.xmlMode,
|
|
1235
|
-
lowerCaseAttributeNames: options.lowerCaseAttributeNames,
|
|
1236
|
-
lowerCaseTags: options.lowerCaseTags
|
|
1237
|
-
});
|
|
1238
|
-
return compileGeneric(ast, options);
|
|
1239
|
-
}
|
|
1240
|
-
function compile(selector, options) {
|
|
1241
|
-
if (typeof selector !== "string")
|
|
1242
|
-
return compileGeneric(selector, options);
|
|
1243
|
-
if (options.cacheResults === false || !options.adapter)
|
|
1244
|
-
return compileSelectorString(selector, options);
|
|
1245
|
-
const cache = getCache(options.adapter, flagSig(options));
|
|
1246
|
-
let compiled = cache.get(selector);
|
|
1247
|
-
if (compiled !== undefined)
|
|
1248
|
-
return compiled;
|
|
1249
|
-
compiled = compileSelectorString(selector, options);
|
|
1250
|
-
cache.set(selector, compiled);
|
|
1251
|
-
return compiled;
|
|
1252
|
-
}
|
|
1253
|
-
function clearSelectorCache(adapter, selector) {
|
|
1254
|
-
if (selector === undefined) {
|
|
1255
|
-
adapterCaches.delete(adapter);
|
|
1256
|
-
return;
|
|
1257
|
-
}
|
|
1258
|
-
const bucket = adapterCaches.get(adapter);
|
|
1259
|
-
if (!bucket)
|
|
1260
|
-
return;
|
|
1261
|
-
for (const m of bucket) {
|
|
1262
|
-
if (m)
|
|
1263
|
-
m.delete(selector);
|
|
1264
|
-
}
|
|
1265
|
-
}
|
|
1266
|
-
function selectAll(selector, root, options) {
|
|
1267
|
-
const adapter = getAdapter(options);
|
|
1268
|
-
const test = typeof selector === "function" ? selector : compile(selector, options);
|
|
1269
|
-
const ctx = prepareContext(root, adapter);
|
|
1270
|
-
return findAll(test, ctx, adapter, options.xmlMode === true);
|
|
1271
|
-
}
|
|
1272
|
-
function selectOne(selector, root, options) {
|
|
1273
|
-
const adapter = getAdapter(options);
|
|
1274
|
-
const test = typeof selector === "function" ? selector : compile(selector, options);
|
|
1275
|
-
const ctx = prepareContext(root, adapter);
|
|
1276
|
-
return findOne(test, ctx, adapter, options.xmlMode === true);
|
|
1277
|
-
}
|
|
1278
|
-
function is(node, selector, options) {
|
|
1279
|
-
const test = typeof selector === "function" ? selector : compile(selector, options);
|
|
1280
|
-
return test(node);
|
|
1281
|
-
}
|
|
1282
|
-
export {
|
|
1283
|
-
selectOne,
|
|
1284
|
-
selectAll,
|
|
1285
|
-
parseAndCompile,
|
|
1286
|
-
is,
|
|
1287
|
-
compile,
|
|
1288
|
-
clearSelectorCache
|
|
1289
|
-
};
|
|
2
|
+
import{a,b,c,d,e,f}from"../chunk-edwg811g.js";import"../chunk-2wsah70r.js";import"../chunk-1kmkypmr.js";export{e as selectOne,d as selectAll,a as parseAndCompile,f as is,b as compile,c as clearSelectorCache};
|