Explorar o código

spllt the code in sub-functions

Gildas %!s(int64=7) %!d(string=hai) anos
pai
achega
9f3198f784
Modificáronse 1 ficheiros con 48 adicións e 44 borrados
  1. 48 44
      lib/single-file/single-file-core.js

+ 48 - 44
lib/single-file/single-file-core.js

@@ -344,55 +344,12 @@ const SingleFileCore = (() => {
 			doc.querySelectorAll("style").forEach(style => {
 				const cssRules = [];
 				if (style.sheet) {
-					processRules(style.sheet.cssRules, cssRules);
+					DomProcessorHelper.processRules(this.doc, style.sheet.cssRules, cssRules);
 					const stylesheetContent = cssRules.join("");
 					style.textContent = this.options.compressCSS ? this.dom.uglifycss(stylesheetContent) : stylesheetContent;
 				}
 			});
-
-			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) {
-							cssRules.push("@media " + Array.prototype.join.call(rule.media, ",") + " {");
-							processRules(rule.cssRules, cssRules);
-							cssRules.push("}");
-						} else if (rule.selectorText) {
-							let selector = rule.selectorText;
-							if (selector.match(REGEXP)) {
-								let selectors = selector.split(/\s*,\s*/g);
-								selector = selectors.map(selector => {
-									const simpleSelectors = selector.split(/\s*[ >~+]\s*/g);
-									const separators = selector.match(/\s*[ >~+]\s*/g);
-									return simpleSelectors.map((selector, selectorIndex) => {
-										while (selector.match(REGEXP)) {
-											selector = selector.replace(REGEXP, "").trim();
-										}
-										selector = selector.replace(/:?:[^(]+\(\)/g, "");
-										if (selector == "") {
-											selector = "*";
 										}
-										return selector + (separators && separators[selectorIndex] ? separators[selectorIndex] : "");
-									}).join("");
-								}).join(",");
-							}
-							if (selector) {
-								try {
-									if (doc.querySelector(selector)) {
-										cssRules.push(rule.cssText);
-									}
-								} catch (e) {
-									cssRules.push(rule.cssText);
-								}
-							}
-						} else {
-							cssRules.push(rule.cssText);
-						}
-					});
-				}
-			}
-		}
 
 		removeHiddenElements() {
 			this.doc.querySelectorAll("[" + REMOVED_CONTENT_ATTRIBUTE_NAME + "]").forEach(element => element.remove());
@@ -728,6 +685,31 @@ const SingleFileCore = (() => {
 				resourceElement.setAttribute(attributeName, srcsetValues.join(","));
 			}));
 		}
+
+		static processRules(doc, rules, cssRules) {
+			if (rules) {
+				Array.from(rules).forEach(rule => {
+					if (rule.media) {
+						cssRules.push("@media " + Array.prototype.join.call(rule.media, ",") + " {");
+						DomProcessorHelper.processRules(doc, rule.cssRules, cssRules);
+						cssRules.push("}");
+					} else if (rule.selectorText) {
+						const selector = DomUtil.getFilteredSelector(rule.selectorText);
+						if (selector) {
+							try {
+								if (doc.querySelector(selector)) {
+									cssRules.push(rule.cssText);
+								}
+							} catch (e) {
+								cssRules.push(rule.cssText);
+							}
+						}
+					} else {
+						cssRules.push(rule.cssText);
+					}
+				});
+			}
+		}
 	}
 
 	// -------
@@ -747,6 +729,7 @@ const SingleFileCore = (() => {
 	const REGEXP_IMPORT_SIMPLE_QUOTES_FN = /@import\s*'([^']*)'\s*([^;]*)/i;
 	const REGEXP_IMPORT_DOUBLE_QUOTES_FN = /@import\s*"([^"]*)"\s*([^;]*)/i;
 	const REGEXP_IMPORT_NO_QUOTES_FN = /@import\s*([^;]*)\s*([^;]*)/i;
+	const REGEXP_PSEUDO_CLASSES = /::after|::before|::first-line|::first-letter|:focus|:focus-within|:hover|:link|:visited|:active/gi;
 
 	class DomUtil {
 		static normalizeURL(url) {
@@ -814,6 +797,27 @@ const SingleFileCore = (() => {
 				return !element;
 			});
 		}
+
+		static getFilteredSelector(selector) {
+			if (selector.match(REGEXP_PSEUDO_CLASSES)) {
+				let selectors = selector.split(/\s*,\s*/g);
+				selector = selectors.map(selector => {
+					const simpleSelectors = selector.split(/\s*[ >~+]\s*/g);
+					const separators = selector.match(/\s*[ >~+]\s*/g);
+					return simpleSelectors.map((selector, selectorIndex) => {
+						while (selector.match(REGEXP_PSEUDO_CLASSES)) {
+							selector = selector.replace(REGEXP_PSEUDO_CLASSES, "").trim();
+						}
+						selector = selector.replace(/:?:[^(]+\(\)/g, "");
+						if (selector == "") {
+							selector = "*";
+						}
+						return selector + (separators && separators[selectorIndex] ? separators[selectorIndex] : "");
+					}).join("");
+				}).join(",");
+			}
+			return selector;
+		}
 	}
 
 	return SingleFileCore;