瀏覽代碼

use text as key in the "medias" Map

Gildas 7 年之前
父節點
當前提交
4bfc7db125
共有 2 個文件被更改,包括 15 次插入12 次删除
  1. 8 6
      lib/single-file/css-rules-matcher.js
  2. 7 6
      lib/single-file/css-rules-minifier.js

+ 8 - 6
lib/single-file/css-rules-matcher.js

@@ -42,15 +42,15 @@ this.RulesMatcher = this.RulesMatcher || (() => {
 			this.doc = doc;
 			this.mediaAllInfo = createMediaInfo(MEDIA_ALL);
 			const matchedElementsCache = new Map();
-			doc.querySelectorAll("style").forEach((styleElement, styleIndex) => {
+			doc.querySelectorAll("style").forEach((styleElement, sheetIndex) => {
 				if (styleElement.sheet) {
 					let cssRules = styleElement.sheet.cssRules;
 					if (styleElement.media && styleElement.media != MEDIA_ALL) {
 						const mediaInfo = createMediaInfo(styleElement.media);
-						this.mediaAllInfo.medias.set(styleIndex + "-" + styleElement.media, mediaInfo);
-						getMatchedElementsRules(doc, cssRules, mediaInfo, styleIndex, matchedElementsCache);
+						this.mediaAllInfo.medias.set("style-" + sheetIndex + "-" + styleElement.media.mediaText, mediaInfo);
+						getMatchedElementsRules(doc, cssRules, mediaInfo, sheetIndex, matchedElementsCache);
 					} else {
-						getMatchedElementsRules(doc, cssRules, this.mediaAllInfo, styleIndex, matchedElementsCache);
+						getMatchedElementsRules(doc, cssRules, this.mediaAllInfo, sheetIndex, matchedElementsCache);
 					}
 				}
 			});
@@ -71,7 +71,7 @@ this.RulesMatcher = this.RulesMatcher || (() => {
 			}
 		}
 
-		getAllMatchedRules() {
+		getMediaAllInfo() {
 			return this.mediaAllInfo;
 		}
 
@@ -87,6 +87,7 @@ this.RulesMatcher = this.RulesMatcher || (() => {
 	};
 
 	function getMatchedElementsRules(doc, cssRules, mediaInfo, sheetIndex, matchedElementsCache) {
+		let mediaIndex = 0;
 		let startTime;
 		if (DEBUG && cssRules.length > 1) {
 			startTime = Date.now();
@@ -97,7 +98,8 @@ this.RulesMatcher = this.RulesMatcher || (() => {
 			if (cssRuleType == CSSRule.MEDIA_RULE) {
 				const cssRuleMedia = cssRule.media;
 				const ruleMediaInfo = createMediaInfo(cssRuleMedia);
-				mediaInfo.medias.set(cssRuleMedia, ruleMediaInfo);
+				mediaInfo.medias.set("rule-" + sheetIndex + "-" + mediaIndex + "-" + cssRuleMedia.mediaText, ruleMediaInfo);
+				mediaIndex++;
 				getMatchedElementsRules(doc, cssRule.cssRules, ruleMediaInfo, sheetIndex, matchedElementsCache);
 			} else if (cssRuleType == CSSRule.STYLE_RULE) {
 				const selectorText = cssRule.selectorText;

+ 7 - 6
lib/single-file/css-rules-minifier.js

@@ -29,18 +29,18 @@ this.cssMinifier = this.cssMinifier || (() => {
 			const rulesMatcher = RulesMatcher.create(doc);
 			const mediaAllInfo = rulesMatcher.getAllMatchedRules();
 			const stats = { processed: 0, discarded: 0 };
-			doc.querySelectorAll("style").forEach((styleElement, styleIndex) => {
+			doc.querySelectorAll("style").forEach((styleElement, sheetIndex) => {
 				if (styleElement.sheet) {
 					const cssRules = styleElement.sheet.cssRules;
 					let mediaInfo;
 					if (styleElement.media && styleElement.media != "all") {
-						mediaInfo = mediaAllInfo.medias.get(styleIndex + "-" + styleElement.media);
+						mediaInfo = mediaAllInfo.medias.get("style-" + sheetIndex + "-" + styleElement.media.mediaText);
 					} else {
 						mediaInfo = mediaAllInfo;
 					}
 					stats.processed += cssRules.length;
 					stats.discarded += cssRules.length;
-					styleElement.textContent = processRules(doc, cssRules, mediaInfo);
+					styleElement.textContent = processRules(doc, cssRules, sheetIndex, mediaInfo);
 					stats.discarded -= cssRules.length;
 				}
 			});
@@ -64,8 +64,8 @@ this.cssMinifier = this.cssMinifier || (() => {
 		}
 	};
 
-	function processRules(doc, cssRules, mediaInfo) {
-		let sheetContent = "";
+	function processRules(doc, cssRules, sheetIndex, mediaInfo) {
+		let sheetContent = "", mediaRuleIndex = 0;
 		let startTime;
 		if (DEBUG && cssRules.length > 1) {
 			startTime = Date.now();
@@ -74,7 +74,8 @@ this.cssMinifier = this.cssMinifier || (() => {
 		Array.from(cssRules).forEach(cssRule => {
 			if (cssRule.type == CSSRule.MEDIA_RULE) {
 				sheetContent += "@media " + Array.from(cssRule.media).join(",") + "{";
-				sheetContent += processRules(doc, cssRule.cssRules, mediaInfo.medias.get(cssRule.media));
+				sheetContent += processRules(doc, cssRule.cssRules, sheetIndex, mediaInfo.medias.get("rule-" + sheetIndex + "-" + mediaRuleIndex + "-" + cssRule.media.mediaText));
+				mediaRuleIndex++;
 				sheetContent += "}";
 			} else if (cssRule.type == CSSRule.STYLE_RULE) {
 				const ruleInfo = mediaInfo.rules.get(cssRule);