Spaces:
Running
Running
; | |
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, "\\$&"); | |
} | |
/** | |
* Attributes that are case-insensitive in HTML. | |
* | |
* @private | |
* @see https://html.spec.whatwg.org/multipage/semantics-other.html#case-sensitivity-of-selectors | |
*/ | |
var caseInsensitiveAttributes = new Set([ | |
"accept", | |
"accept-charset", | |
"align", | |
"alink", | |
"axis", | |
"bgcolor", | |
"charset", | |
"checked", | |
"clear", | |
"codetype", | |
"color", | |
"compact", | |
"declare", | |
"defer", | |
"dir", | |
"direction", | |
"disabled", | |
"enctype", | |
"face", | |
"frame", | |
"hreflang", | |
"http-equiv", | |
"lang", | |
"language", | |
"link", | |
"media", | |
"method", | |
"multiple", | |
"nohref", | |
"noresize", | |
"noshade", | |
"nowrap", | |
"readonly", | |
"rel", | |
"rev", | |
"rules", | |
"scope", | |
"scrolling", | |
"selected", | |
"shape", | |
"target", | |
"text", | |
"type", | |
"valign", | |
"valuetype", | |
"vlink", | |
]); | |
function shouldIgnoreCase(selector, options) { | |
return typeof selector.ignoreCase === "boolean" | |
? selector.ignoreCase | |
: selector.ignoreCase === "quirks" | |
? !!options.quirksMode | |
: !options.xmlMode && caseInsensitiveAttributes.has(selector.name); | |
} | |
/** | |
* Attribute selectors | |
*/ | |
exports.attributeRules = { | |
equals: function (next, data, options) { | |
var adapter = options.adapter; | |
var name = data.name; | |
var value = data.value; | |
if (shouldIgnoreCase(data, options)) { | |
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, options) { | |
var adapter = options.adapter; | |
var name = data.name; | |
var value = data.value; | |
var len = value.length; | |
if (shouldIgnoreCase(data, options)) { | |
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, data, options) { | |
var adapter = options.adapter; | |
var name = data.name, value = data.value; | |
if (/\s/.test(value)) { | |
return boolbase_1.falseFunc; | |
} | |
var regex = new RegExp("(?:^|\\s)".concat(escapeRegex(value), "(?:$|\\s)"), shouldIgnoreCase(data, options) ? "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, options) { | |
var adapter = options.adapter; | |
var name = data.name; | |
var value = data.value; | |
var len = value.length; | |
if (len === 0) { | |
return boolbase_1.falseFunc; | |
} | |
if (shouldIgnoreCase(data, options)) { | |
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, options) { | |
var adapter = options.adapter; | |
var name = data.name; | |
var value = data.value; | |
var len = -value.length; | |
if (len === 0) { | |
return boolbase_1.falseFunc; | |
} | |
if (shouldIgnoreCase(data, options)) { | |
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, options) { | |
var adapter = options.adapter; | |
var name = data.name, value = data.value; | |
if (value === "") { | |
return boolbase_1.falseFunc; | |
} | |
if (shouldIgnoreCase(data, options)) { | |
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, options) { | |
var adapter = options.adapter; | |
var name = data.name; | |
var value = data.value; | |
if (value === "") { | |
return function (elem) { | |
return !!adapter.getAttributeValue(elem, name) && next(elem); | |
}; | |
} | |
else if (shouldIgnoreCase(data, options)) { | |
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); | |
}; | |
}, | |
}; | |