mostly-dom
Version:
A virtual-dom for TypeScript
82 lines • 3.22 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var matchesSelector_1 = require("./matchesSelector");
// tslint:disable-next-line:cyclomatic-complexity
function hasCssSelector(cssSelector, vNode) {
cssSelector = cssSelector.trim();
if (cssSelector === '*')
return true;
if (cssSelector.indexOf(',') > -1) {
var cssSelectors = cssSelector.split(',').map(function (str) { return str.trim(); });
for (var i = 0; i < cssSelectors.length; ++i)
if (hasCssSelector(cssSelectors[i], vNode))
return true;
return false;
}
else if (cssSelector.indexOf('>') > -1) {
var _a = splitByLastIndex(cssSelector, '>'), parentSelector = _a[0], childSelector = _a[1];
if (!vNode.parent)
return false;
return hasCssSelector(parentSelector, vNode.parent) &&
hasCssSelector(childSelector, vNode);
}
else if (cssSelector.indexOf(' + ') > -1) {
var _b = splitByLastIndex(cssSelector, '+'), siblingSelector = _b[0], selector = _b[1];
var parent_1 = vNode.parent;
if (!parent_1 || !hasCssSelector(selector, vNode))
return false;
var children = parent_1.children;
if (!children)
return false;
var index = children.indexOf(vNode);
if (index === 0 || !hasCssSelector(siblingSelector, children[index - 1]))
return false;
return true;
}
else if (cssSelector.indexOf(' ~ ') > -1) {
var _c = splitByLastIndex(cssSelector, '~'), siblingSelector = _c[0], selector = _c[1];
var parent_2 = vNode.parent;
if (!parent_2 || !hasCssSelector(selector, vNode))
return false;
var children = parent_2.children;
if (!children)
return false;
var index = children.indexOf(vNode);
if (index === 0)
return false;
for (var i = 0; i < index; ++i)
if (hasCssSelector(siblingSelector, children[i]))
return true;
return false;
}
else if (cssSelector.indexOf(' ') > -1) {
var cssSelectors_1 = cssSelector.split(' ').filter(Boolean).map(function (str) { return str.trim(); });
var i_1 = cssSelectors_1.length - 1;
if (!hasCssSelector(cssSelectors_1[i_1], vNode))
return false;
while (--i_1 >= 0) {
var parentMatches = traverseParentVNodes(function (parent) { return hasCssSelector(cssSelectors_1[i_1], parent); }, vNode);
if (!parentMatches)
return false;
}
return true;
}
return matchesSelector_1.matchesSelector(cssSelector, vNode);
}
exports.hasCssSelector = hasCssSelector;
function splitByLastIndex(cssSelector, token) {
var index = cssSelector.lastIndexOf(token);
return [
cssSelector.substring(0, index).trim(),
cssSelector.substring(index + 1).trim(),
];
}
function traverseParentVNodes(predicate, vNode) {
var parent = vNode.parent;
if (!parent)
return false;
if (predicate(parent))
return true;
return traverseParentVNodes(predicate, parent);
}
//# sourceMappingURL=hasCssSelector.js.map