Explorar o código

fixed filename too long issue (see #142)

Gildas %!s(int64=7) %!d(string=hai) anos
pai
achega
d95f1d0999

+ 1 - 6
cli/back-ends/jsdom.js

@@ -21,7 +21,7 @@
  *   Source.
  */
 
-/* global require, exports, Buffer */
+/* global require, exports */
 
 const { URL } = require("url");
 const fs = require("fs");
@@ -138,7 +138,6 @@ function getSingleFileClass(win) {
 		parseDocContent,
 		parseSVGContent,
 		isValidFontUrl,
-		getContentSize,
 		digestText,
 		parseURL
 	};
@@ -163,10 +162,6 @@ async function digestText(algo, text) {
 	return hash.digest("hex");
 }
 
-function getContentSize(content) {
-	return Buffer.byteLength(content, "utf-8");
-}
-
 function isValidFontUrl(/* urlFunction */) {
 	// TODO?
 	return true;

+ 0 - 5
lib/single-file/single-file-browser.js

@@ -57,7 +57,6 @@ this.SingleFileBrowser = this.SingleFileBrowser || (() => {
 		parseDocContent,
 		parseSVGContent,
 		isValidFontUrl,
-		getContentSize,
 		digestText,
 		parseURL
 	};
@@ -127,10 +126,6 @@ this.SingleFileBrowser = this.SingleFileBrowser || (() => {
 		return hex(hash);
 	}
 
-	function getContentSize(content) {
-		return new Blob([content]).size;
-	}
-
 	async function isValidFontUrl(urlFunction) {
 		try {
 			const font = new FontFace("font-test", urlFunction);

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

@@ -21,6 +21,8 @@
  *   Source.
  */
 
+/* global Blob, FileReader */
+
 this.SingleFileCore = this.SingleFileCore || (() => {
 
 	const SELECTED_CONTENT_ATTRIBUTE_NAME = "data-single-file-selected-content";
@@ -404,11 +406,11 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			}
 			let size;
 			if (this.options.displayStats) {
-				size = docUtil.getContentSize(this.doc.documentElement.outerHTML);
+				size = Util.getContentSize(this.doc.documentElement.outerHTML);
 			}
 			const content = docUtil.serialize(this.doc, this.options.compressHTML);
 			if (this.options.displayStats) {
-				const contentSize = docUtil.getContentSize(content);
+				const contentSize = Util.getContentSize(content);
 				this.stats.set("processed", "HTML bytes", contentSize);
 				this.stats.add("discarded", "HTML bytes", size - contentSize);
 			}
@@ -418,10 +420,11 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			if (!this.options.backgroundSave) {
 				filename = filename.replace(/\//g, "_");
 			}
-			if (filename.length > 192) {
+			if (Util.getContentSize(filename) > 192) {
 				const extensionMatch = filename.match(/(\.[^.]{3,4})$/);
 				const extension = extensionMatch && extensionMatch[0] && extensionMatch[0].length > 1 ? extensionMatch[0] : "";
-				filename = filename.substring(0, 192 - extension.length) + "…" + extension;
+				filename = await Util.truncateContent(filename, 192 - extension.length);
+				filename = filename + "…" + extension;
 			}
 			if (!filename) {
 				filename = "Unnamed page";
@@ -1018,11 +1021,11 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 		compressHTML() {
 			let size;
 			if (this.options.displayStats) {
-				size = docUtil.getContentSize(this.doc.documentElement.outerHTML);
+				size = Util.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 - docUtil.getContentSize(this.doc.documentElement.outerHTML));
+				this.stats.add("discarded", "HTML bytes", size - Util.getContentSize(this.doc.documentElement.outerHTML));
 			}
 		}
 	}
@@ -1666,6 +1669,19 @@ 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) {

+ 0 - 3
lib/single-file/util/doc-util.js

@@ -78,9 +78,6 @@ this.docUtil = this.docUtil || (() => {
 				async digest(algo, text) {
 					return domUtil.digestText(algo, text);
 				},
-				getContentSize(content) {
-					return domUtil.getContentSize(content);
-				},
 				async validFont(urlFunction) {
 					return domUtil.isValidFontUrl(urlFunction);
 				},