Просмотр исходного кода

fixed issue with negated pseuo classes

Gildas 7 лет назад
Родитель
Сommit
52220e4a2d
1 измененных файлов с 10 добавлено и 24 удалено
  1. 10 24
      lib/single-file/css-rules-matcher.js

+ 10 - 24
lib/single-file/css-rules-matcher.js

@@ -129,9 +129,9 @@ this.RulesMatcher = this.RulesMatcher || (() => {
 
 	function getMatchedElementsSelector(doc, ruleData, matchedElementsCache) {
 		let selectorText;
-		const selectorContainsPseudo = containsPseudo(ruleData.selectorText);
-		if (selectorContainsPseudo) {
-			selectorText = getFilteredSelector(ruleData.selectorText);
+		const filteredSelectorText = getFilteredSelector(ruleData.selectorText);
+		if (filteredSelectorText != ruleData.selectorText) {
+			selectorText = filteredSelectorText;
 		} else {
 			selectorText = ruleData.selectorText;
 		}
@@ -141,7 +141,7 @@ this.RulesMatcher = this.RulesMatcher || (() => {
 			matchedElementsCache.set(selectorText, matchedElements);
 		}
 		if (matchedElements.length) {
-			if (selectorContainsPseudo) {
+			if (filteredSelectorText != ruleData.selectorText) {
 				ruleData.mediaInfo.pseudoSelectors.add(ruleData.cssRule.selectorText);
 				matchedElements.forEach(element => addPseudoRule(element, ruleData));
 			} else {
@@ -297,19 +297,21 @@ this.RulesMatcher = this.RulesMatcher || (() => {
 	}
 
 	function getFilteredSelector(selector) {
+		if (selector.includes(":not(:focus")) {
+			debugger
+		}
 		const selectors = cssWhat.parse(selector);
 		return cssWhat.stringify(selectors.map(selector => filterPseudoClasses(selector)));
 
-		function filterPseudoClasses(selector) {
+		function filterPseudoClasses(selector, negatedData) {
 			const tokens = selector.filter(token => {
 				if (token.data) {
 					if (Array.isArray(token.data)) {
-						token.data = token.data.map(selector => filterPseudoClasses(selector));
+						token.data = token.data.map(selector => filterPseudoClasses(selector, token.name == "not" && token.type == "pseudo"));
 					}
 				}
-				const test = ((token.type != "pseudo" || !PSEUDOS_CLASSES.includes(":" + token.name))
+				return negatedData || ((token.type != "pseudo" || !PSEUDOS_CLASSES.includes(":" + token.name))
 					&& (token.type != "pseudo-element"));
-				return test;
 			});
 			let insertedTokens = 0;
 			tokens.forEach((token, index) => {
@@ -327,22 +329,6 @@ this.RulesMatcher = this.RulesMatcher || (() => {
 		}
 	}
 
-	function containsPseudo(selectorText) {
-		let ignoredPseudo;
-		if (selectorText.includes("::")) {
-			ignoredPseudo = true;
-		} else {
-			let pseudoIndex = 0;
-			while (pseudoIndex < PSEUDOS_CLASSES.length && !ignoredPseudo) {
-				ignoredPseudo = selectorText.includes(PSEUDOS_CLASSES[pseudoIndex]);
-				if (!ignoredPseudo) {
-					pseudoIndex++;
-				}
-			}
-		}
-		return ignoredPseudo;
-	}
-
 	function log(...args) {
 		console.log("S-File <css-mat>", ...args); // eslint-disable-line no-console
 	}