"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.attributeRules = void 0; var boolbase_1 = require("boolbase"); /** * All reserved characters in a regex, used for escaping. * * Taken from XRegExp, (c) 2007-2020 Steven Levithan under the MIT license * https://github.com/slevithan/xregexp/blob/95eeebeb8fac8754d54eafe2b4743661ac1cf028/src/xregexp.js#L794 */ var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g; function escapeRegex(value) { return value.replace(reChars, "\\$&"); } /** * Attribute selectors */ exports.attributeRules = { equals: function (next, data, _a) { var adapter = _a.adapter; var name = data.name; var value = data.value; if (data.ignoreCase) { value = value.toLowerCase(); return function (elem) { var attr = adapter.getAttributeValue(elem, name); return (attr != null && attr.length === value.length && attr.toLowerCase() === value && next(elem)); }; } return function (elem) { return adapter.getAttributeValue(elem, name) === value && next(elem); }; }, hyphen: function (next, data, _a) { var adapter = _a.adapter; var name = data.name; var value = data.value; var len = value.length; if (data.ignoreCase) { value = value.toLowerCase(); return function hyphenIC(elem) { var attr = adapter.getAttributeValue(elem, name); return (attr != null && (attr.length === len || attr.charAt(len) === "-") && attr.substr(0, len).toLowerCase() === value && next(elem)); }; } return function hyphen(elem) { var attr = adapter.getAttributeValue(elem, name); return (attr != null && (attr.length === len || attr.charAt(len) === "-") && attr.substr(0, len) === value && next(elem)); }; }, element: function (next, _a, _b) { var name = _a.name, value = _a.value, ignoreCase = _a.ignoreCase; var adapter = _b.adapter; if (/\s/.test(value)) { return boolbase_1.falseFunc; } var regex = new RegExp("(?:^|\\s)" + escapeRegex(value) + "(?:$|\\s)", ignoreCase ? "i" : ""); return function element(elem) { var attr = adapter.getAttributeValue(elem, name); return (attr != null && attr.length >= value.length && regex.test(attr) && next(elem)); }; }, exists: function (next, _a, _b) { var name = _a.name; var adapter = _b.adapter; return function (elem) { return adapter.hasAttrib(elem, name) && next(elem); }; }, start: function (next, data, _a) { var adapter = _a.adapter; var name = data.name; var value = data.value; var len = value.length; if (len === 0) { return boolbase_1.falseFunc; } if (data.ignoreCase) { value = value.toLowerCase(); return function (elem) { var attr = adapter.getAttributeValue(elem, name); return (attr != null && attr.length >= len && attr.substr(0, len).toLowerCase() === value && next(elem)); }; } return function (elem) { var _a; return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.startsWith(value)) && next(elem); }; }, end: function (next, data, _a) { var adapter = _a.adapter; var name = data.name; var value = data.value; var len = -value.length; if (len === 0) { return boolbase_1.falseFunc; } if (data.ignoreCase) { value = value.toLowerCase(); return function (elem) { var _a; return ((_a = adapter .getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(len).toLowerCase()) === value && next(elem); }; } return function (elem) { var _a; return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.endsWith(value)) && next(elem); }; }, any: function (next, data, _a) { var adapter = _a.adapter; var name = data.name, value = data.value; if (value === "") { return boolbase_1.falseFunc; } if (data.ignoreCase) { var regex_1 = new RegExp(escapeRegex(value), "i"); return function anyIC(elem) { var attr = adapter.getAttributeValue(elem, name); return (attr != null && attr.length >= value.length && regex_1.test(attr) && next(elem)); }; } return function (elem) { var _a; return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.includes(value)) && next(elem); }; }, not: function (next, data, _a) { var adapter = _a.adapter; var name = data.name; var value = data.value; if (value === "") { return function (elem) { return !!adapter.getAttributeValue(elem, name) && next(elem); }; } else if (data.ignoreCase) { value = value.toLowerCase(); return function (elem) { var attr = adapter.getAttributeValue(elem, name); return ((attr == null || attr.length !== value.length || attr.toLowerCase() !== value) && next(elem)); }; } return function (elem) { return adapter.getAttributeValue(elem, name) !== value && next(elem); }; }, };