Gildas 7 سال پیش
والد
کامیت
84dcf2e8bc
2فایلهای تغییر یافته به همراه45 افزوده شده و 29 حذف شده
  1. 6 4
      lib/single-file/css-minifier.js
  2. 39 25
      lib/single-file/single-file-core.js

+ 6 - 4
lib/single-file/css-minifier.js

@@ -40,9 +40,8 @@ this.cssMinifier = this.cssMinifier || (() => {
 					} else {
 						mediaInfo = mediaAllInfo;
 					}
-					processRules(doc, styleElement.sheet.cssRules, mediaInfo);
+					processRules(doc, styleElement.sheet.cssRules, mediaInfo, stats);
 					styleElement.textContent = serializeRules(styleElement.sheet.cssRules);
-					stats.discarded -= styleElement.sheet.cssRules.length;
 				}
 			});
 			doc.querySelectorAll("[style]").forEach(element => {
@@ -52,10 +51,12 @@ this.cssMinifier = this.cssMinifier || (() => {
 		}
 	};
 
-	function processRules(doc, cssRules, mediaInfo) {
+	function processRules(doc, cssRules, mediaInfo, stats) {
+		stats.processed += cssRules.length;
+		stats.discarded += cssRules.length;
 		Array.from(cssRules).forEach(cssRule => {
 			if (cssRule.type == CSSRule.MEDIA_RULE) {
-				processRules(doc, cssRule.cssRules, mediaInfo.medias.get(cssRule.media));
+				processRules(doc, cssRule.cssRules, mediaInfo.medias.get(cssRule.media), stats);
 			} else if (cssRule.type == CSSRule.STYLE_RULE) {
 				const ruleInfo = mediaInfo.rules.get(cssRule);
 				if (ruleInfo) {
@@ -81,6 +82,7 @@ this.cssMinifier = this.cssMinifier || (() => {
 				}
 			}
 		});
+		stats.discarded -= cssRules.length;
 	}
 
 	function processStyle(doc, cssStyle, mediaInfo) {

+ 39 - 25
lib/single-file/single-file-core.js

@@ -303,8 +303,8 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			const content = DOM.serialize(this.doc, this.options.compressHTML);
 			if (this.options.displayStats) {
 				const contentSize = DOM.getContentSize(content);
-				this.stats.set("processed", "htmlBytes", contentSize);
-				this.stats.add("discarded", "htmlBytes", size - contentSize);
+				this.stats.set("processed", "HTML bytes", contentSize);
+				this.stats.add("discarded", "HTML bytes", size - contentSize);
 			}
 			return {
 				stats: this.stats.data,
@@ -343,6 +343,7 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 		removeDiscardedResources() {
 			const objectElements = this.doc.querySelectorAll("applet, meta[http-equiv=refresh], object:not([type=\"image/svg+xml\"]):not([type=\"image/svg-xml\"]):not([type=\"text/html\"]), embed:not([src*=\".svg\"])");
 			this.stats.set("discarded", "objects", objectElements.length);
+			this.stats.set("processed", "objects", objectElements.length);
 			objectElements.forEach(element => element.remove());
 			const replacedAttributeValue = this.doc.querySelectorAll("link[rel~=preconnect], link[rel~=prerender], link[rel~=dns-prefetch], link[rel~=preload], link[rel~=prefetch]");
 			replacedAttributeValue.forEach(element => {
@@ -368,14 +369,16 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 					}
 				});
 			}
+			const audioSourceElements = this.doc.querySelectorAll("audio[src], audio > source[src]");
+			this.stats.set("processed", "audio sources", audioSourceElements.length);
 			if (this.options.removeAudioSrc) {
-				const audioSourceElements = this.doc.querySelectorAll("audio[src], audio > source[src]");
-				this.stats.set("discarded", "audioSource", audioSourceElements.length);
+				this.stats.set("discarded", "audio sources", audioSourceElements.length);
 				audioSourceElements.forEach(element => element.removeAttribute("src"));
 			}
+			const videoSourceElements = this.doc.querySelectorAll("video[src], video > source[src]");
+			this.stats.set("processed", "video sources", videoSourceElements.length);
 			if (this.options.removeVideoSrc) {
-				const videoSourceElements = this.doc.querySelectorAll("video[src], video > source[src]");
-				this.stats.set("discarded", "videoSource", videoSourceElements.length);
+				this.stats.set("discarded", "video sources", videoSourceElements.length);
 				videoSourceElements.forEach(element => element.removeAttribute("src"));
 			}
 		}
@@ -394,18 +397,21 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 		removeScripts() {
 			const scriptElements = this.doc.querySelectorAll("script:not([type=\"application/ld+json\"])");
 			this.stats.set("discarded", "scripts", scriptElements.length);
+			this.stats.set("processed", "scripts", scriptElements.length);
 			scriptElements.forEach(element => element.remove());
 		}
 
 		removeFrames() {
 			const frameElements = this.doc.querySelectorAll("iframe, frame, object[type=\"text/html\"][data]");
 			this.stats.set("discarded", "frames", frameElements.length);
+			this.stats.set("processed", "frames", frameElements.length);
 			this.doc.querySelectorAll("iframe, frame, object[type=\"text/html\"][data]").forEach(element => element.remove());
 		}
 
 		removeImports() {
 			const importElements = this.doc.querySelectorAll("link[rel=import]");
-			this.stats.set("discarded", "imports", importElements.length);
+			this.stats.set("discarded", "HTML imports", importElements.length);
+			this.stats.set("processed", "HTML imports", importElements.length);
 			importElements.forEach(element => element.remove());
 		}
 
@@ -444,8 +450,8 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 
 		removeUnusedStyles() {
 			const stats = DOM.minifyCSS(this.doc);
-			this.stats.set("processed", "cssRules", stats.processed);
-			this.stats.set("discarded", "cssRules", stats.discarded);
+			this.stats.set("processed", "CSS rules", stats.processed);
+			this.stats.set("discarded", "CSS rules", stats.discarded);
 		}
 
 		removeAlternativeFonts() {
@@ -508,7 +514,8 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 
 		removeHiddenElements() {
 			const hiddenElements = this.doc.querySelectorAll("[" + DOM.removedContentAttributeName(this.options.sessionId) + "]");
-			this.stats.set("discarded", "hiddenElements", hiddenElements.length);
+			this.stats.set("discarded", "hidden elements", hiddenElements.length);
+			this.stats.set("processed", "hidden elements", hiddenElements.length);
 			hiddenElements.forEach(element => element.remove());
 		}
 
@@ -519,7 +526,7 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			}
 			DOM.minifyHTML(this.doc, { preservedSpaceAttributeName: DOM.preservedSpaceAttributeName(this.options.sessionId) });
 			if (this.options.displayStats) {
-				this.stats.add("discarded", "htmlBytes", size - DOM.getContentSize(this.doc.documentElement.outerHTML));
+				this.stats.add("discarded", "HTML bytes", size - DOM.getContentSize(this.doc.documentElement.outerHTML));
 			}
 		}
 
@@ -530,7 +537,7 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			}
 			DOM.postMinifyHTML(this.doc);
 			if (this.options.displayStats) {
-				this.stats.add("discarded", "htmlBytes", size - DOM.getContentSize(this.doc.documentElement.outerHTML));
+				this.stats.add("discarded", "HTML bytes", size - DOM.getContentSize(this.doc.documentElement.outerHTML));
 			}
 		}
 
@@ -619,7 +626,7 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 		async inlineStylesheets(initialization) {
 			await Promise.all(Array.from(this.doc.querySelectorAll("style")).map(async (styleElement, indexStyle) => {
 				if (!initialization) {
-					this.stats.add("processed", "styleSheets", 1);
+					this.stats.add("processed", "stylesheets", 1);
 				}
 				let stylesheetContent = styleElement.textContent;
 				if (initialization) {
@@ -715,13 +722,13 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 					linkElement.setAttribute("href", EMPTY_DATA_URI);
 					const processor = this.relImportProcessors.get(linkElement);
 					if (processor) {
-						this.stats.add("processed", "imports", 1);
+						this.stats.add("processed", "HTML imports", 1);
 						this.relImportProcessors.delete(linkElement);
 						const pageData = await processor.getPageData();
 						linkElement.setAttribute("href", "data:text/html," + pageData.content);
 						this.stats.addAll(pageData);
 					} else {
-						this.stats.add("discarded", "imports", 1);
+						this.stats.add("discarded", "HTML imports", 1);
 					}
 				}
 			}));
@@ -1040,25 +1047,32 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 	// -----
 	const STATS_DEFAULT_VALUES = {
 		discarded: {
-			htmlBytes: 0,
-			hiddenElements: 0,
-			imports: 0,
+			"HTML bytes": 0,
+			"hidden elements": 0,
+			"HTML imports": 0,
 			scripts: 0,
 			objects: 0,
-			audioSource: 0,
-			videoSource: 0,
+			"audio sources": 0,
+			"video sources": 0,
 			frames: 0,
-			cssRules: 0,
+			"CSS rules": 0,
+			canvas: 0,
+			stylesheets: 0,
+			resources: 0,
 			medias: 0
 		},
 		processed: {
-			htmlBytes: 0,
-			imports: 0,
+			"HTML bytes": 0,
+			"hidden elements": 0,
+			"HTML imports": 0,
 			scripts: 0,
+			objects: 0,
+			"audio sources": 0,
+			"video sources": 0,
 			frames: 0,
-			cssRules: 0,
+			"CSS rules": 0,
 			canvas: 0,
-			styleSheets: 0,
+			stylesheets: 0,
 			resources: 0,
 			medias: 0
 		}