12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var css_what_1 = require("css-what");
- var procedure_1 = require("./procedure");
- var attributes = {
- exists: 10,
- equals: 8,
- not: 7,
- start: 6,
- end: 6,
- any: 5,
- hyphen: 4,
- element: 4,
- };
- /**
- * 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 proc = procedure_1.procedure[token.type];
- if (token.type === css_what_1.SelectorType.Attribute) {
- proc = attributes[token.action];
- if (proc === attributes.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)) {
- // "matches" and "not"
- proc = 0;
- for (var i = 0; i < token.data.length; i++) {
- // TODO better handling of complex selectors
- if (token.data[i].length !== 1)
- continue;
- var cur = getProcedure(token.data[i][0]);
- // Avoid executing :has or :contains
- if (cur === 0) {
- proc = 0;
- break;
- }
- if (cur > proc)
- proc = cur;
- }
- if (token.data.length > 1 && proc > 0)
- proc -= 1;
- }
- else {
- proc = 1;
- }
- }
- return proc;
- }
|