|
|
"use strict"; |
|
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
|
exports.isTraversal = isTraversal; |
|
|
exports.sortRules = sortRules; |
|
|
exports.getQuality = getQuality; |
|
|
exports.includesScopePseudo = includesScopePseudo; |
|
|
var css_what_1 = require("css-what"); |
|
|
function isTraversal(token) { |
|
|
return token.type === "_flexibleDescendant" || (0, css_what_1.isTraversal)(token); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function sortRules(arr) { |
|
|
var ratings = arr.map(getQuality); |
|
|
for (var i = 1; i < arr.length; i++) { |
|
|
var procNew = ratings[i]; |
|
|
if (procNew < 0) |
|
|
continue; |
|
|
|
|
|
for (var j = i; j > 0 && procNew < ratings[j - 1]; j--) { |
|
|
var token = arr[j]; |
|
|
arr[j] = arr[j - 1]; |
|
|
arr[j - 1] = token; |
|
|
ratings[j] = ratings[j - 1]; |
|
|
ratings[j - 1] = procNew; |
|
|
} |
|
|
} |
|
|
} |
|
|
function getAttributeQuality(token) { |
|
|
switch (token.action) { |
|
|
case css_what_1.AttributeAction.Exists: { |
|
|
return 10; |
|
|
} |
|
|
case css_what_1.AttributeAction.Equals: { |
|
|
|
|
|
return token.name === "id" ? 9 : 8; |
|
|
} |
|
|
case css_what_1.AttributeAction.Not: { |
|
|
return 7; |
|
|
} |
|
|
case css_what_1.AttributeAction.Start: { |
|
|
return 6; |
|
|
} |
|
|
case css_what_1.AttributeAction.End: { |
|
|
return 6; |
|
|
} |
|
|
case css_what_1.AttributeAction.Any: { |
|
|
return 5; |
|
|
} |
|
|
case css_what_1.AttributeAction.Hyphen: { |
|
|
return 4; |
|
|
} |
|
|
case css_what_1.AttributeAction.Element: { |
|
|
return 3; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function getQuality(token) { |
|
|
|
|
|
switch (token.type) { |
|
|
case css_what_1.SelectorType.Universal: { |
|
|
return 50; |
|
|
} |
|
|
case css_what_1.SelectorType.Tag: { |
|
|
return 30; |
|
|
} |
|
|
case css_what_1.SelectorType.Attribute: { |
|
|
return Math.floor(getAttributeQuality(token) / |
|
|
|
|
|
(token.ignoreCase ? 2 : 1)); |
|
|
} |
|
|
case css_what_1.SelectorType.Pseudo: { |
|
|
return !token.data |
|
|
? 3 |
|
|
: token.name === "has" || |
|
|
token.name === "contains" || |
|
|
token.name === "icontains" |
|
|
? |
|
|
0 |
|
|
: Array.isArray(token.data) |
|
|
? |
|
|
Math.max( |
|
|
|
|
|
0, Math.min.apply(Math, token.data.map(function (d) { |
|
|
return Math.min.apply(Math, d.map(getQuality)); |
|
|
}))) |
|
|
: 2; |
|
|
} |
|
|
default: { |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
} |
|
|
function includesScopePseudo(t) { |
|
|
return (t.type === css_what_1.SelectorType.Pseudo && |
|
|
(t.name === "scope" || |
|
|
(Array.isArray(t.data) && |
|
|
t.data.some(function (data) { return data.some(includesScopePseudo); })))); |
|
|
} |
|
|
|