module.exports = sortByProcedure; /* sort the parts of the passed selector, as there is potential for optimization (some types of selectors are faster than others) */ var ATTRIBUTE = 1; var procedure = { __proto__: null, universal: 5, //should be last so that it can be ignored tag: 3, //very quick test attribute: ATTRIBUTE, pseudo: 0, //can be pretty expensive (especially :has) //everything else shouldn't be moved descendant: -1, child: -1, parent: -1, sibling: -1, adjacent: -1 }; var attributes = { __proto__: null, exists: 8, equals: 7, not: 6, start: 5, end: 4, any: 3, hyphen: 2, element: 1 }; function sortByProcedure(arr){ for(var i = 1; i < arr.length; i++){ var procNew = procedure[arr[i].type]; if(procNew < 0) continue; for(var j = i - 1; j >= 0; j--){ if( procNew > procedure[arr[j].type] || !( procNew === ATTRIBUTE && procedure[arr[j].type] === ATTRIBUTE && attributes[arr[i].action] <= attributes[arr[j].action] ) ) break; var tmp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = tmp; } } return arr; }