|
|
@@ -90,6 +90,9 @@ const SingleFileCore = (() => {
|
|
|
}
|
|
|
this.processor.removeDiscardedResources();
|
|
|
this.processor.resetCharsetMeta();
|
|
|
+ if (this.options.compressHTML) {
|
|
|
+ this.processor.compressHTML();
|
|
|
+ }
|
|
|
if (this.options.insertFaviconLink) {
|
|
|
this.processor.insertFaviconLink();
|
|
|
}
|
|
|
@@ -347,6 +350,32 @@ const SingleFileCore = (() => {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ compressHTML() {
|
|
|
+ const textNodesWalker = this.doc.createTreeWalker(this.doc.documentElement, 4, null, false);
|
|
|
+ let node = textNodesWalker.nextNode();
|
|
|
+ while (node) {
|
|
|
+ let element = node.parentElement;
|
|
|
+ while (element && element.tagName != "PRE") {
|
|
|
+ element = element.parentElement;
|
|
|
+ }
|
|
|
+ if (!element) {
|
|
|
+ node.textContent = node.textContent.replace(/ +/g, " ");
|
|
|
+ node.textContent = node.textContent.replace(/\n+/g, " ");
|
|
|
+ }
|
|
|
+ node = textNodesWalker.nextNode();
|
|
|
+ }
|
|
|
+ const commentNodesWalker = this.doc.createTreeWalker(this.doc.documentElement, 128, null, false);
|
|
|
+ node = commentNodesWalker.nextNode();
|
|
|
+ let removedNodes = [];
|
|
|
+ while (node) {
|
|
|
+ if (node.nodeType == 8) {
|
|
|
+ removedNodes.push(node);
|
|
|
+ }
|
|
|
+ node = commentNodesWalker.nextNode();
|
|
|
+ }
|
|
|
+ removedNodes.forEach(node => node.remove());
|
|
|
+ }
|
|
|
+
|
|
|
insertSingleFileCommentNode() {
|
|
|
const commentNode = this.doc.createComment("\n Archive processed by SingleFile \n url: " + this.baseURI + " \n saved date: " + new Date() + " \n");
|
|
|
this.doc.documentElement.insertBefore(commentNode, this.doc.documentElement.firstChild);
|
|
|
@@ -422,6 +451,7 @@ const SingleFileCore = (() => {
|
|
|
jsEnabled: this.options.jsEnabled,
|
|
|
removeScripts: this.options.removeScripts,
|
|
|
saveRawPage: this.options.saveRawPage,
|
|
|
+ compressHTML: this.options.compressHTML,
|
|
|
framesData: this.options.framesData
|
|
|
};
|
|
|
if (frameData.content) {
|