فهرست منبع

fixed selector parsing

Gildas 7 سال پیش
والد
کامیت
d9dfc2769d
1فایلهای تغییر یافته به همراه22 افزوده شده و 7 حذف شده
  1. 22 7
      lib/single-file/single-file-core.js

+ 22 - 7
lib/single-file/single-file-core.js

@@ -363,6 +363,7 @@ const SingleFileCore = (() => {
 			});
 
 			function processRules(rules, cssRules) {
+				const REGEXP = /::after|::before|::first-line|::first-letter|:focus|:focus-within|:hover|:link|:visited|:active/gi;
 				if (rules) {
 					Array.from(rules).forEach(rule => {
 						if (rule.media) {
@@ -370,7 +371,21 @@ const SingleFileCore = (() => {
 							processRules(rule.cssRules, cssRules);
 							cssRules.push("}");
 						} else if (rule.selectorText) {
-							const selector = rule.selectorText.replace(/::after|::before|::first-line|::first-letter|:focus|:hover/gi, "").trim();
+							let selector = rule.selectorText;
+							if (selector.match(REGEXP)) {
+								let simpleSelectors = selector.split(",");
+								simpleSelectors = simpleSelectors.map(selector => {
+									while (selector.match(REGEXP)) {
+										selector = selector.replace(REGEXP, "").trim();
+									}
+									selector = selector.replace(/:[^(]+\(\)/gi, "");
+									if (selector == "") {
+										selector = "*";
+									}
+									return selector;
+								});
+								selector = simpleSelectors.join(",");
+							}
 							if (selector) {
 								try {
 									if (doc.querySelector(selector)) {
@@ -522,24 +537,24 @@ const SingleFileCore = (() => {
 						if (frameElement.tagName == "OBJECT") {
 							frameElement.setAttribute("data", "about:blank");
 						} else {
-						frameElement.setAttribute("src", "about:blank");
+							frameElement.setAttribute("src", "about:blank");
 						}
 						if (frameData.processor) {
 							const pageData = await frameData.processor.getPageData();
 							if (frameElement.tagName == "OBJECT") {
 								frameElement.setAttribute("data", "data:text/html," + pageData.content);
 							} else {
-							frameElement.setAttribute("srcdoc", pageData.content);
-							frameElement.sandbox = true;
+								frameElement.setAttribute("srcdoc", pageData.content);
+								frameElement.sandbox = true;
+							}
 						}
 					}
-					}
 				} else {
 					if (frameElement.tagName == "OBJECT") {
 						frameElement.setAttribute("data", "about:blank");
 					} else {
-					frameElement.setAttribute("src", "about:blank");
-				}
+						frameElement.setAttribute("src", "about:blank");
+					}
 				}
 			}));
 		}