summaryrefslogtreecommitdiff
path: root/node_modules/css-select/lib/sort.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
commitc06f7ee0a40255214c477e13d9b956a7e07c2900 (patch)
treef5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/css-select/lib/sort.js
parent3fd9400d4dccc25aa29b5702216732e0b7542073 (diff)
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/css-select/lib/sort.js')
-rw-r--r--node_modules/css-select/lib/sort.js84
1 files changed, 84 insertions, 0 deletions
diff --git a/node_modules/css-select/lib/sort.js b/node_modules/css-select/lib/sort.js
new file mode 100644
index 00000000..d597e825
--- /dev/null
+++ b/node_modules/css-select/lib/sort.js
@@ -0,0 +1,84 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isTraversal = void 0;
+var css_what_1 = require("css-what");
+var procedure = new Map([
+ [css_what_1.SelectorType.Universal, 50],
+ [css_what_1.SelectorType.Tag, 30],
+ [css_what_1.SelectorType.Attribute, 1],
+ [css_what_1.SelectorType.Pseudo, 0],
+]);
+function isTraversal(token) {
+ return !procedure.has(token.type);
+}
+exports.isTraversal = isTraversal;
+var attributes = new Map([
+ [css_what_1.AttributeAction.Exists, 10],
+ [css_what_1.AttributeAction.Equals, 8],
+ [css_what_1.AttributeAction.Not, 7],
+ [css_what_1.AttributeAction.Start, 6],
+ [css_what_1.AttributeAction.End, 6],
+ [css_what_1.AttributeAction.Any, 5],
+]);
+/**
+ * Sort the parts of the passed selector,
+ * as there is potential for optimization
+ * (some types of selectors are faster than others)
+ *
+ * @param arr Selector to sort
+ */
+function sortByProcedure(arr) {
+ var procs = arr.map(getProcedure);
+ for (var i = 1; i < arr.length; i++) {
+ var procNew = procs[i];
+ if (procNew < 0)
+ continue;
+ for (var j = i - 1; j >= 0 && procNew < procs[j]; j--) {
+ var token = arr[j + 1];
+ arr[j + 1] = arr[j];
+ arr[j] = token;
+ procs[j + 1] = procs[j];
+ procs[j] = procNew;
+ }
+ }
+}
+exports.default = sortByProcedure;
+function getProcedure(token) {
+ var _a, _b;
+ var proc = (_a = procedure.get(token.type)) !== null && _a !== void 0 ? _a : -1;
+ if (token.type === css_what_1.SelectorType.Attribute) {
+ proc = (_b = attributes.get(token.action)) !== null && _b !== void 0 ? _b : 4;
+ if (token.action === css_what_1.AttributeAction.Equals && token.name === "id") {
+ // Prefer ID selectors (eg. #ID)
+ proc = 9;
+ }
+ if (token.ignoreCase) {
+ /*
+ * IgnoreCase adds some overhead, prefer "normal" token
+ * this is a binary operation, to ensure it's still an int
+ */
+ proc >>= 1;
+ }
+ }
+ else if (token.type === css_what_1.SelectorType.Pseudo) {
+ if (!token.data) {
+ proc = 3;
+ }
+ else if (token.name === "has" || token.name === "contains") {
+ proc = 0; // Expensive in any case
+ }
+ else if (Array.isArray(token.data)) {
+ // Eg. :matches, :not
+ proc = Math.min.apply(Math, token.data.map(function (d) { return Math.min.apply(Math, d.map(getProcedure)); }));
+ // If we have traversals, try to avoid executing this selector
+ if (proc < 0) {
+ proc = 0;
+ }
+ }
+ else {
+ proc = 2;
+ }
+ }
+ return proc;
+}
+//# sourceMappingURL=sort.js.map \ No newline at end of file