UNPKG

mostly-dom

Version:
82 lines 3.22 kB
"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