Gildas 7 лет назад
Родитель
Сommit
c79a0e3ae1

+ 2 - 28
cli/back-ends/jsdom.js

@@ -23,7 +23,6 @@
 
 /* global require, exports */
 
-const { URL } = require("url");
 const fs = require("fs");
 const crypto = require("crypto");
 
@@ -94,6 +93,7 @@ exports.getPageData = async options => {
 		}
 		options.win = win;
 		options.doc = doc;
+		options.removeHiddenElements = false;
 		const SingleFile = getSingleFileClass(win);
 		const singleFile = new SingleFile(options);
 		await singleFile.run();
@@ -135,34 +135,12 @@ function getSingleFileClass(win) {
 	};
 	const domUtil = {
 		getResourceContent,
-		parseDocContent,
-		parseXMLContent,
-		parseSVGContent,
 		isValidFontUrl,
-		digestText,
-		parseURL
+		digestText
 	};
 	return win.SingleFileCore.getClass(win.docUtil.getInstance(modules, domUtil), win.cssTree);
 }
 
-function parseDocContent(content) {
-	return (new JSDOM(content, {
-		contentType: "text/html"
-	})).window.document;
-}
-
-function parseXMLContent(content) {
-	return (new JSDOM(content, {
-		contentType: "text/xml"
-	})).window.document;
-}
-
-function parseSVGContent(content) {
-	return (new JSDOM(content, {
-		contentType: "image/svg+xml"
-	})).window.document;
-}
-
 async function digestText(algo, text) {
 	const hash = crypto.createHash(algo.replace("-", "").toLowerCase());
 	hash.update(text, "utf-8");
@@ -204,8 +182,4 @@ async function getResourceContent(resourceURL, options) {
 			return dataUri.encode(resourceContent.body, contentType || this.getContentType());
 		}
 	};
-}
-
-function parseURL(resourceURL, baseURI) {
-	return new URL(resourceURL, baseURI);
 }

+ 9 - 31
lib/single-file/single-file-browser.js

@@ -19,20 +19,18 @@
  */
 
 /* global
-	URL,
 	docUtil,
 	cssTree,
+	crypto,
 	docHelper,
-	crypto, 
 	fetch, 
 	setTimeout, 
 	superFetch, 
 	Blob, 
-	DOMParser, 
 	FileReader, 
 	FontFace
 	SingleFileCore, 
-	TextDecoder, 
+	TextDecoder,
 	TextEncoder */
 
 this.SingleFileBrowser = this.SingleFileBrowser || (() => {
@@ -54,12 +52,8 @@ this.SingleFileBrowser = this.SingleFileBrowser || (() => {
 	};
 	const domUtil = {
 		getResourceContent,
-		parseDocContent,
-		parseXMLContent,
-		parseSVGContent,
 		isValidFontUrl,
-		digestText,
-		parseURL
+		digestText
 	};
 	const SingleFile = SingleFileCore.getClass(docUtil.getInstance(modules, domUtil), cssTree);
 	let fetchResource;
@@ -67,7 +61,7 @@ this.SingleFileBrowser = this.SingleFileBrowser || (() => {
 		getClass: () => SingleFile
 	};
 
-	async function getResourceContent(resourceURL) {
+	async function getResourceContent(resourceURL) {		
 		if (!fetchResource) {
 			fetchResource = typeof superFetch == "undefined" ? fetch : superFetch.fetch;
 		}
@@ -100,6 +94,11 @@ this.SingleFileBrowser = this.SingleFileBrowser || (() => {
 		};
 	}
 
+	async function digestText(algo, text) {
+		const hash = await crypto.subtle.digest(algo, new TextEncoder("utf-8").encode(text));
+		return hex(hash);
+	}
+
 	// https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
 	function hex(buffer) {
 		const hexCodes = [];
@@ -114,23 +113,6 @@ this.SingleFileBrowser = this.SingleFileBrowser || (() => {
 		return hexCodes.join("");
 	}
 
-	function parseDocContent(content) {
-		return (new DOMParser()).parseFromString(content, "text/html");
-	}
-
-	function parseXMLContent(content) {
-		return (new DOMParser()).parseFromString(content, "text/xml");
-	}
-
-	function parseSVGContent(content) {
-		return (new DOMParser()).parseFromString(content, "image/svg+xml");
-	}
-
-	async function digestText(algo, text) {
-		const hash = await crypto.subtle.digest(algo, new TextEncoder("utf-8").encode(text));
-		return hex(hash);
-	}
-
 	async function isValidFontUrl(urlFunction) {
 		try {
 			const font = new FontFace("font-test", urlFunction);
@@ -141,8 +123,4 @@ this.SingleFileBrowser = this.SingleFileBrowser || (() => {
 		}
 	}
 
-	function parseURL(resourceURL, baseURI) {
-		return new URL(resourceURL, baseURI);
-	}
-
 })();

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

@@ -21,8 +21,6 @@
  *   Source.
  */
 
-/* global Blob, FileReader */
-
 this.SingleFileCore = this.SingleFileCore || (() => {
 
 	const SELECTED_CONTENT_ATTRIBUTE_NAME = "data-single-file-selected-content";
@@ -432,11 +430,11 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			}
 			let size;
 			if (this.options.displayStats) {
-				size = Util.getContentSize(this.doc.documentElement.outerHTML);
+				size = docUtil.getContentSize(this.doc.documentElement.outerHTML);
 			}
 			const content = docUtil.serialize(this.doc, this.options.compressHTML);
 			if (this.options.displayStats) {
-				const contentSize = Util.getContentSize(content);
+				const contentSize = docutil.getContentSize(content);
 				this.stats.set("processed", "HTML bytes", contentSize);
 				this.stats.add("discarded", "HTML bytes", size - contentSize);
 			}
@@ -446,10 +444,10 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			if (!this.options.backgroundSave) {
 				filename = filename.replace(/\//g, "_");
 			}
-			if (Util.getContentSize(filename) > 192) {
+			if (docUtil.getContentSize(filename) > 192) {
 				const extensionMatch = filename.match(/(\.[^.]{3,4})$/);
 				const extension = extensionMatch && extensionMatch[0] && extensionMatch[0].length > 1 ? extensionMatch[0] : "";
-				filename = await Util.truncateContent(filename, 192 - extension.length);
+				filename = await docUtil.truncateContent(filename, 192 - extension.length);
 				filename = filename + "…" + extension;
 			}
 			if (!filename) {
@@ -1047,11 +1045,11 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 		compressHTML() {
 			let size;
 			if (this.options.displayStats) {
-				size = Util.getContentSize(this.doc.documentElement.outerHTML);
+				size = docUtil.getContentSize(this.doc.documentElement.outerHTML);
 			}
 			docUtil.minifyHTML(this.doc, { PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME: docUtil.PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME });
 			if (this.options.displayStats) {
-				this.stats.add("discarded", "HTML bytes", size - Util.getContentSize(this.doc.documentElement.outerHTML));
+				this.stats.add("discarded", "HTML bytes", size - docUtil.getContentSize(this.doc.documentElement.outerHTML));
 			}
 		}
 	}
@@ -1699,20 +1697,6 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 				}
 			}
 		}
-
-		static getContentSize(content) {
-			return new Blob([content]).size;
-		}
-
-		static async truncateContent(content, maxSize) {
-			const blob = new Blob([content]);
-			const reader = new FileReader();
-			reader.readAsText(blob.slice(0, maxSize));
-			return await new Promise((resolve, reject) => {
-				reader.addEventListener("load", () => resolve(reader.result), false);
-				reader.addEventListener("error", reject, false);
-			});
-		}
 	}
 
 	function log(...args) {

+ 18 - 4
lib/single-file/util/doc-util.js

@@ -18,6 +18,8 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+/* global DOMParser, URL, Blob, FileReader */
+
 this.docUtil = this.docUtil || (() => {
 
 	const DEBUG = false;
@@ -51,13 +53,13 @@ this.docUtil = this.docUtil || (() => {
 			return {
 				getContent,
 				parseURL(resourceURL, baseURI) {
-					return domUtil.parseURL(resourceURL, baseURI);
+					return new URL(resourceURL, baseURI);
 				},
 				resolveURL(resourceURL, baseURI) {
 					return this.parseURL(resourceURL, baseURI).href;
 				},
 				parseDocContent(content, baseURI) {
-					const doc = domUtil.parseDocContent(content);
+					const doc = (new DOMParser()).parseFromString(content, "text/html");
 					if (!doc.head) {
 						doc.documentElement.insertBefore(doc.createElement("HEAD"), doc.body);
 					}
@@ -73,10 +75,10 @@ this.docUtil = this.docUtil || (() => {
 					return doc;
 				},
 				parseXMLContent(content) {
-					return domUtil.parseXMLContent(content);
+					return (new DOMParser()).parseFromString(content, "text/xml");
 				},
 				parseSVGContent(content) {
-					return domUtil.parseSVGContent(content);
+					return (new DOMParser()).parseFromString(content, "image/svg+xml");
 				},
 				async digest(algo, text) {
 					return domUtil.digestText(algo, text);
@@ -84,6 +86,18 @@ this.docUtil = this.docUtil || (() => {
 				async validFont(urlFunction) {
 					return domUtil.isValidFontUrl(urlFunction);
 				},
+				getContentSize(content) {
+					return new Blob([content]).size;
+				},
+				async truncateContent(content, maxSize) {
+					const blob = new Blob([content]);
+					const reader = new FileReader();
+					reader.readAsText(blob.slice(0, maxSize));
+					return await new Promise((resolve, reject) => {
+						reader.addEventListener("load", () => resolve(reader.result), false);
+						reader.addEventListener("error", reject, false);
+					});
+				},
 				minifyHTML(doc, options) {
 					return modules.htmlMinifier.process(doc, options);
 				},