|
|
@@ -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
|
|
|
}
|