blob: e30a609f4b23fbcf12a02ec77a67f31a3f18700a [file] [log] [blame]
Tim van der Lippe706ec962021-06-04 13:24:42 +01001"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.attributeRules = void 0;
4var boolbase_1 = require("boolbase");
5/**
6 * All reserved characters in a regex, used for escaping.
7 *
8 * Taken from XRegExp, (c) 2007-2020 Steven Levithan under the MIT license
9 * https://github.com/slevithan/xregexp/blob/95eeebeb8fac8754d54eafe2b4743661ac1cf028/src/xregexp.js#L794
10 */
11var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g;
12function escapeRegex(value) {
13 return value.replace(reChars, "\\$&");
14}
15/**
16 * Attribute selectors
17 */
18exports.attributeRules = {
19 equals: function (next, data, _a) {
20 var adapter = _a.adapter;
21 var name = data.name;
22 var value = data.value;
23 if (data.ignoreCase) {
24 value = value.toLowerCase();
25 return function (elem) {
26 var _a;
27 return ((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.toLowerCase()) ===
28 value && next(elem);
29 };
30 }
31 return function (elem) {
32 return adapter.getAttributeValue(elem, name) === value && next(elem);
33 };
34 },
35 hyphen: function (next, data, _a) {
36 var adapter = _a.adapter;
37 var name = data.name;
38 var value = data.value;
39 var len = value.length;
40 if (data.ignoreCase) {
41 value = value.toLowerCase();
42 return function hyphenIC(elem) {
43 var attr = adapter.getAttributeValue(elem, name);
44 return (attr != null &&
45 (attr.length === len || attr.charAt(len) === "-") &&
46 attr.substr(0, len).toLowerCase() === value &&
47 next(elem));
48 };
49 }
50 return function hyphen(elem) {
51 var attr = adapter.getAttributeValue(elem, name);
52 return (attr != null &&
53 attr.substr(0, len) === value &&
54 (attr.length === len || attr.charAt(len) === "-") &&
55 next(elem));
56 };
57 },
58 element: function (next, _a, _b) {
59 var name = _a.name, value = _a.value, ignoreCase = _a.ignoreCase;
60 var adapter = _b.adapter;
61 if (/\s/.test(value)) {
62 return boolbase_1.falseFunc;
63 }
64 var regex = new RegExp("(?:^|\\s)" + escapeRegex(value) + "(?:$|\\s)", ignoreCase ? "i" : "");
65 return function element(elem) {
66 var attr = adapter.getAttributeValue(elem, name);
67 return attr != null && regex.test(attr) && next(elem);
68 };
69 },
70 exists: function (next, _a, _b) {
71 var name = _a.name;
72 var adapter = _b.adapter;
73 return function (elem) { return adapter.hasAttrib(elem, name) && next(elem); };
74 },
75 start: function (next, data, _a) {
76 var adapter = _a.adapter;
77 var name = data.name;
78 var value = data.value;
79 var len = value.length;
80 if (len === 0) {
81 return boolbase_1.falseFunc;
82 }
83 if (data.ignoreCase) {
84 value = value.toLowerCase();
85 return function (elem) {
86 var _a;
87 return ((_a = adapter
88 .getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(0, len).toLowerCase()) === value && next(elem);
89 };
90 }
91 return function (elem) {
92 var _a;
93 return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.startsWith(value)) &&
94 next(elem);
95 };
96 },
97 end: function (next, data, _a) {
98 var adapter = _a.adapter;
99 var name = data.name;
100 var value = data.value;
101 var len = -value.length;
102 if (len === 0) {
103 return boolbase_1.falseFunc;
104 }
105 if (data.ignoreCase) {
106 value = value.toLowerCase();
107 return function (elem) {
108 var _a;
109 return ((_a = adapter
110 .getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(len).toLowerCase()) === value && next(elem);
111 };
112 }
113 return function (elem) {
114 var _a;
115 return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.endsWith(value)) &&
116 next(elem);
117 };
118 },
119 any: function (next, data, _a) {
120 var adapter = _a.adapter;
121 var name = data.name, value = data.value;
122 if (value === "") {
123 return boolbase_1.falseFunc;
124 }
125 if (data.ignoreCase) {
126 var regex_1 = new RegExp(escapeRegex(value), "i");
127 return function anyIC(elem) {
128 var attr = adapter.getAttributeValue(elem, name);
129 return attr != null && regex_1.test(attr) && next(elem);
130 };
131 }
132 return function (elem) {
133 var _a;
134 return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.includes(value)) &&
135 next(elem);
136 };
137 },
138 not: function (next, data, _a) {
139 var adapter = _a.adapter;
140 var name = data.name;
141 var value = data.value;
142 if (value === "") {
143 return function (elem) {
144 return !!adapter.getAttributeValue(elem, name) && next(elem);
145 };
146 }
147 else if (data.ignoreCase) {
148 value = value.toLowerCase();
149 return function (elem) {
150 var attr = adapter.getAttributeValue(elem, name);
151 return (attr != null &&
152 attr.toLocaleLowerCase() !== value &&
153 next(elem));
154 };
155 }
156 return function (elem) {
157 return adapter.getAttributeValue(elem, name) !== value && next(elem);
158 };
159 },
160};