|
|
@@ -124,11 +124,11 @@ this.htmlmini = this.htmlmini || (() => {
|
|
|
const modules = [collapseBooleanAttributes, mergeTextNodes, collapseWhitespace, removeComments, removeEmptyAttributes, removeRedundantAttributes];
|
|
|
|
|
|
return {
|
|
|
- process: doc => {
|
|
|
+ process: (doc, options) => {
|
|
|
const nodesWalker = doc.createTreeWalker(doc.documentElement, NodeFilter.SHOW_ALL, null, false);
|
|
|
let node = nodesWalker.nextNode();
|
|
|
while (node) {
|
|
|
- const deletedNode = modules.find(module => module(node));
|
|
|
+ const deletedNode = modules.find(module => module(node, options));
|
|
|
const previousNode = node;
|
|
|
node = nodesWalker.nextNode();
|
|
|
if (deletedNode) {
|
|
|
@@ -160,14 +160,17 @@ this.htmlmini = this.htmlmini || (() => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- function collapseWhitespace(node) {
|
|
|
+ function collapseWhitespace(node, options) {
|
|
|
if (node.nodeType == Node.TEXT_NODE) {
|
|
|
let element = node.parentElement;
|
|
|
+ const spacePreserved = element.getAttribute(options.preservedSpaceAttributeName) === "";
|
|
|
let textContent = node.textContent;
|
|
|
- while (noWhitespaceCollapse(element)) {
|
|
|
+ let noWhitespace = !spacePreserved && noWhitespaceCollapse(element);
|
|
|
+ while (noWhitespace) {
|
|
|
element = element.parentElement;
|
|
|
+ noWhitespace = element && noWhitespaceCollapse(element);
|
|
|
}
|
|
|
- if ((!element || noWhitespaceCollapse(element)) && textContent.match(/\s+/) && textContent.length > 1) {
|
|
|
+ if ((!element || noWhitespace) && textContent.match(/\s+/) && textContent.length > 1) {
|
|
|
let lastTextContent;
|
|
|
while (lastTextContent != textContent) {
|
|
|
lastTextContent = textContent;
|