html-minifier 3.5.11 → 3.5.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -12
- package/package.json +2 -3
- package/src/htmlminifier.js +125 -127
- package/src/htmlparser.js +6 -1
package/README.md
CHANGED
|
@@ -22,19 +22,19 @@ How does HTMLMinifier compare to other solutions — [HTML Minifier from Will Pe
|
|
|
22
22
|
|
|
23
23
|
| Site | Original size *(KB)* | HTMLMinifier | minimize | Will Peavy | htmlcompressor.com |
|
|
24
24
|
| ---------------------------------------------------------------------------- |:--------------------:| ------------:| --------:| ----------:| ------------------:|
|
|
25
|
-
| [Google](https://www.google.com/) |
|
|
26
|
-
| [
|
|
27
|
-
| [
|
|
28
|
-
| [New York Times](https://www.nytimes.com/) |
|
|
29
|
-
| [Stack Overflow](https://stackoverflow.com/) |
|
|
30
|
-
| [BBC](https://www.bbc.co.uk/) | 271 | **220** | 264 | 267 | 252 |
|
|
25
|
+
| [Google](https://www.google.com/) | 45 | **42** | 45 | 47 | 45 |
|
|
26
|
+
| [Twitter](https://twitter.com/) | 122 | **89** | 115 | 134 | 115 |
|
|
27
|
+
| [HTMLMinifier](https://github.com/kangax/html-minifier) | 142 | **110** | 119 | 123 | 118 |
|
|
28
|
+
| [New York Times](https://www.nytimes.com/) | 221 | **152** | 172 | 168 | 156 |
|
|
29
|
+
| [Stack Overflow](https://stackoverflow.com/) | 247 | **193** | 202 | 210 | 200 |
|
|
31
30
|
| [Bootstrap CSS](https://getbootstrap.com/docs/3.3/css/) | 272 | **260** | 269 | 229 | 269 |
|
|
32
|
-
| [
|
|
33
|
-
| [
|
|
34
|
-
| [
|
|
31
|
+
| [BBC](https://www.bbc.co.uk/) | 283 | **228** | 275 | 278 | 262 |
|
|
32
|
+
| [Amazon](https://www.amazon.co.uk/) | 370 | **315** | 356 | 367 | n/a |
|
|
33
|
+
| [Wikipedia](https://en.wikipedia.org/wiki/President_of_the_United_States) | 474 | **442** | 458 | 473 | 457 |
|
|
34
|
+
| [NBC](https://www.nbc.com/) | 666 | **627** | 663 | 665 | n/a |
|
|
35
35
|
| [Eloquent Javascript](https://eloquentjavascript.net/1st_edition/print.html) | 870 | **815** | 840 | 864 | n/a |
|
|
36
|
-
| [ES6 table](https://kangax.github.io/compat-table/es6/) |
|
|
37
|
-
| [ES6 draft](https://tc39.github.io/ecma262/) |
|
|
36
|
+
| [ES6 table](https://kangax.github.io/compat-table/es6/) | 4916 | **4189** | 4652 | n/a | n/a |
|
|
37
|
+
| [ES6 draft](https://tc39.github.io/ecma262/) | 6099 | **5435** | 5597 | n/a | n/a |
|
|
38
38
|
|
|
39
39
|
## Options Quick Reference
|
|
40
40
|
|
|
@@ -58,7 +58,7 @@ Most of the options are disabled by default.
|
|
|
58
58
|
| `includeAutoGeneratedTags` | Insert tags generated by HTML parser | `true` |
|
|
59
59
|
| `keepClosingSlash` | Keep the trailing slash on singleton elements | `false` |
|
|
60
60
|
| `maxLineLength` | Specify a maximum line length. Compressed output will be split by newlines at valid HTML split-points |
|
|
61
|
-
| `minifyCSS` | Minify CSS in style elements and style attributes (uses [clean-css](https://github.com/jakubpawlowicz/clean-css)) | `false` (could be `true`, `Object`, `Function(text)`) |
|
|
61
|
+
| `minifyCSS` | Minify CSS in style elements and style attributes (uses [clean-css](https://github.com/jakubpawlowicz/clean-css)) | `false` (could be `true`, `Object`, `Function(text, type)`) |
|
|
62
62
|
| `minifyJS` | Minify JavaScript in script elements and event attributes (uses [UglifyJS](https://github.com/mishoo/UglifyJS2)) | `false` (could be `true`, `Object`, `Function(text, inline)`) |
|
|
63
63
|
| `minifyURLs` | Minify URLs in various attributes (uses [relateurl](https://github.com/stevenvachon/relateurl)) | `false` (could be `String`, `Object`, `Function(text)`) |
|
|
64
64
|
| `preserveLineBreaks` | Always collapse to 1 line break (never remove it entirely) when whitespace between tags include a line break. Must be used in conjunction with `collapseWhitespace=true` | `false` |
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "html-minifier",
|
|
3
3
|
"description": "Highly configurable, well-tested, JavaScript-based HTML minifier.",
|
|
4
|
-
"version": "3.5.
|
|
4
|
+
"version": "3.5.15",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
7
7
|
"compress",
|
|
@@ -58,14 +58,13 @@
|
|
|
58
58
|
"clean-css": "4.1.x",
|
|
59
59
|
"commander": "2.15.x",
|
|
60
60
|
"he": "1.1.x",
|
|
61
|
-
"ncname": "1.0.x",
|
|
62
61
|
"param-case": "2.1.x",
|
|
63
62
|
"relateurl": "0.2.x",
|
|
64
63
|
"uglify-js": "3.3.x"
|
|
65
64
|
},
|
|
66
65
|
"devDependencies": {
|
|
67
66
|
"grunt": "1.0.x",
|
|
68
|
-
"grunt-browserify": "5.
|
|
67
|
+
"grunt-browserify": "5.3.x",
|
|
69
68
|
"grunt-contrib-uglify": "3.3.x",
|
|
70
69
|
"gruntify-eslint": "4.0.x",
|
|
71
70
|
"phantomjs-prebuilt": "2.1.x",
|
package/src/htmlminifier.js
CHANGED
|
@@ -67,9 +67,9 @@ function collapseWhitespace(str, options, trimLeft, trimRight, collapseAll) {
|
|
|
67
67
|
|
|
68
68
|
var createMapFromString = utils.createMapFromString;
|
|
69
69
|
// non-empty tags that will maintain whitespace around them
|
|
70
|
-
var inlineTags = createMapFromString('a,abbr,acronym,b,bdi,bdo,big,button,cite,code,del,dfn,em,font,i,ins,kbd,label,mark,math,nobr,object,q,rt,
|
|
70
|
+
var inlineTags = createMapFromString('a,abbr,acronym,b,bdi,bdo,big,button,cite,code,del,dfn,em,font,i,ins,kbd,label,mark,math,nobr,object,q,rp,rt,rtc,ruby,s,samp,select,small,span,strike,strong,sub,sup,svg,textarea,time,tt,u,var');
|
|
71
71
|
// non-empty tags that will maintain whitespace within them
|
|
72
|
-
var inlineTextTags = createMapFromString('a,abbr,acronym,b,big,del,em,font,i,ins,kbd,mark,nobr,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var');
|
|
72
|
+
var inlineTextTags = createMapFromString('a,abbr,acronym,b,big,del,em,font,i,ins,kbd,mark,nobr,rp,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var');
|
|
73
73
|
// self-closing tags that will maintain whitespace around them
|
|
74
74
|
var selfClosingInlineTags = createMapFromString('comment,img,input,wbr');
|
|
75
75
|
|
|
@@ -285,7 +285,7 @@ function cleanAttributeValue(tag, attrName, attrValue, options, attrs) {
|
|
|
285
285
|
if (/;$/.test(attrValue) && !/&#?[0-9a-zA-Z]+;$/.test(attrValue)) {
|
|
286
286
|
attrValue = attrValue.replace(/\s*;$/, ';');
|
|
287
287
|
}
|
|
288
|
-
attrValue =
|
|
288
|
+
attrValue = options.minifyCSS(attrValue, 'inline');
|
|
289
289
|
}
|
|
290
290
|
return attrValue;
|
|
291
291
|
}
|
|
@@ -322,7 +322,7 @@ function cleanAttributeValue(tag, attrName, attrValue, options, attrs) {
|
|
|
322
322
|
}
|
|
323
323
|
else if (isMediaQuery(tag, attrs, attrName)) {
|
|
324
324
|
attrValue = trimWhitespace(attrValue);
|
|
325
|
-
return
|
|
325
|
+
return options.minifyCSS(attrValue, 'media');
|
|
326
326
|
}
|
|
327
327
|
return attrValue;
|
|
328
328
|
}
|
|
@@ -395,7 +395,7 @@ var topLevelTags = createMapFromString('html,head,body');
|
|
|
395
395
|
var compactTags = createMapFromString('html,body');
|
|
396
396
|
var looseTags = createMapFromString('head,colgroup,caption');
|
|
397
397
|
var trailingTags = createMapFromString('dt,thead');
|
|
398
|
-
var htmlTags = createMapFromString('a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,element,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,isindex,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,multicol,nav,nobr,noembed,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp');
|
|
398
|
+
var htmlTags = createMapFromString('a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,element,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,isindex,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,multicol,nav,nobr,noembed,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp');
|
|
399
399
|
|
|
400
400
|
function canRemoveParentTag(optionalStartTag, tag) {
|
|
401
401
|
switch (optionalStartTag) {
|
|
@@ -613,100 +613,107 @@ function identity(value) {
|
|
|
613
613
|
return value;
|
|
614
614
|
}
|
|
615
615
|
|
|
616
|
-
function processOptions(
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
if (typeof options.log !== 'function') {
|
|
624
|
-
options.log = identity;
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
if (!options.canCollapseWhitespace) {
|
|
628
|
-
options.canCollapseWhitespace = canCollapseWhitespace;
|
|
629
|
-
}
|
|
630
|
-
if (!options.canTrimWhitespace) {
|
|
631
|
-
options.canTrimWhitespace = canTrimWhitespace;
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
if (!('ignoreCustomComments' in options)) {
|
|
635
|
-
options.ignoreCustomComments = [/^!/];
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
if (!('ignoreCustomFragments' in options)) {
|
|
639
|
-
options.ignoreCustomFragments = [
|
|
616
|
+
function processOptions(values) {
|
|
617
|
+
var options = {
|
|
618
|
+
canCollapseWhitespace: canCollapseWhitespace,
|
|
619
|
+
canTrimWhitespace: canTrimWhitespace,
|
|
620
|
+
html5: true,
|
|
621
|
+
ignoreCustomComments: [/^!/],
|
|
622
|
+
ignoreCustomFragments: [
|
|
640
623
|
/<%[\s\S]*?%>/,
|
|
641
624
|
/<\?[\s\S]*?\?>/
|
|
642
|
-
]
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
625
|
+
],
|
|
626
|
+
includeAutoGeneratedTags: true,
|
|
627
|
+
log: identity,
|
|
628
|
+
minifyCSS: identity,
|
|
629
|
+
minifyJS: identity,
|
|
630
|
+
minifyURLs: identity
|
|
631
|
+
};
|
|
632
|
+
Object.keys(values).forEach(function(key) {
|
|
633
|
+
var value = values[key];
|
|
634
|
+
if (key === 'log') {
|
|
635
|
+
if (typeof value === 'function') {
|
|
636
|
+
options.log = value;
|
|
637
|
+
}
|
|
655
638
|
}
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
return
|
|
639
|
+
else if (key === 'minifyCSS' && typeof value !== 'function') {
|
|
640
|
+
if (!value) {
|
|
641
|
+
return;
|
|
659
642
|
}
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
return text;
|
|
643
|
+
if (typeof value !== 'object') {
|
|
644
|
+
value = {};
|
|
663
645
|
}
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
646
|
+
options.minifyCSS = function(text, type) {
|
|
647
|
+
text = text.replace(/(url\s*\(\s*)("|'|)(.*?)\2(\s*\))/ig, function(match, prefix, quote, url, suffix) {
|
|
648
|
+
return prefix + quote + options.minifyURLs(url) + quote + suffix;
|
|
649
|
+
});
|
|
650
|
+
try {
|
|
651
|
+
if (type === 'inline') {
|
|
652
|
+
text = wrapInlineCSS(text);
|
|
653
|
+
}
|
|
654
|
+
else if (type === 'media') {
|
|
655
|
+
text = wrapMediaQuery(text);
|
|
656
|
+
}
|
|
657
|
+
text = new CleanCSS(value).minify(text).styles;
|
|
658
|
+
if (type === 'inline') {
|
|
659
|
+
text = unwrapInlineCSS(text);
|
|
660
|
+
}
|
|
661
|
+
else if (type === 'media') {
|
|
662
|
+
text = unwrapMediaQuery(text);
|
|
663
|
+
}
|
|
664
|
+
return text;
|
|
665
|
+
}
|
|
666
|
+
catch (err) {
|
|
667
|
+
options.log(err);
|
|
668
|
+
return text;
|
|
669
|
+
}
|
|
670
|
+
};
|
|
674
671
|
}
|
|
675
|
-
(
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
var code = start ? text.slice(start[0].length).replace(/\n\s*-->\s*$/, '') : text;
|
|
679
|
-
minifyJS.parse.bare_returns = inline;
|
|
680
|
-
var result = UglifyJS.minify(code, minifyJS);
|
|
681
|
-
if (result.error) {
|
|
682
|
-
options.log(result.error);
|
|
683
|
-
return text;
|
|
672
|
+
else if (key === 'minifyJS' && typeof value !== 'function') {
|
|
673
|
+
if (!value) {
|
|
674
|
+
return;
|
|
684
675
|
}
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
676
|
+
if (typeof value !== 'object') {
|
|
677
|
+
value = {};
|
|
678
|
+
}
|
|
679
|
+
(value.parse || (value.parse = {})).bare_returns = false;
|
|
680
|
+
options.minifyJS = function(text, inline) {
|
|
681
|
+
var start = text.match(/^\s*<!--.*/);
|
|
682
|
+
var code = start ? text.slice(start[0].length).replace(/\n\s*-->\s*$/, '') : text;
|
|
683
|
+
value.parse.bare_returns = inline;
|
|
684
|
+
var result = UglifyJS.minify(code, value);
|
|
685
|
+
if (result.error) {
|
|
686
|
+
options.log(result.error);
|
|
687
|
+
return text;
|
|
688
|
+
}
|
|
689
|
+
return result.code.replace(/;$/, '');
|
|
690
|
+
};
|
|
696
691
|
}
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
return
|
|
700
|
-
});
|
|
701
|
-
try {
|
|
702
|
-
return new CleanCSS(minifyCSS).minify(text).styles;
|
|
692
|
+
else if (key === 'minifyURLs' && typeof value !== 'function') {
|
|
693
|
+
if (!value) {
|
|
694
|
+
return;
|
|
703
695
|
}
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
return text;
|
|
696
|
+
if (typeof value === 'string') {
|
|
697
|
+
value = { site: value };
|
|
707
698
|
}
|
|
708
|
-
|
|
709
|
-
|
|
699
|
+
else if (typeof value !== 'object') {
|
|
700
|
+
value = {};
|
|
701
|
+
}
|
|
702
|
+
options.minifyURLs = function(text) {
|
|
703
|
+
try {
|
|
704
|
+
return RelateUrl.relate(text, value);
|
|
705
|
+
}
|
|
706
|
+
catch (err) {
|
|
707
|
+
options.log(err);
|
|
708
|
+
return text;
|
|
709
|
+
}
|
|
710
|
+
};
|
|
711
|
+
}
|
|
712
|
+
else {
|
|
713
|
+
options[key] = value;
|
|
714
|
+
}
|
|
715
|
+
});
|
|
716
|
+
return options;
|
|
710
717
|
}
|
|
711
718
|
|
|
712
719
|
function uniqueId(value) {
|
|
@@ -771,7 +778,7 @@ function createSortFns(value, options, uidIgnore, uidAttr) {
|
|
|
771
778
|
}
|
|
772
779
|
|
|
773
780
|
var log = options.log;
|
|
774
|
-
options.log =
|
|
781
|
+
options.log = identity;
|
|
775
782
|
options.sortAttributes = false;
|
|
776
783
|
options.sortClassName = false;
|
|
777
784
|
scan(minify(value, options));
|
|
@@ -804,9 +811,6 @@ function createSortFns(value, options, uidIgnore, uidAttr) {
|
|
|
804
811
|
}
|
|
805
812
|
|
|
806
813
|
function minify(value, options, partialMarkup) {
|
|
807
|
-
options = options || {};
|
|
808
|
-
var optionsStack = [];
|
|
809
|
-
processOptions(options);
|
|
810
814
|
if (options.collapseWhitespace) {
|
|
811
815
|
value = collapseWhitespace(value, options, true, true);
|
|
812
816
|
}
|
|
@@ -821,7 +825,6 @@ function minify(value, options, partialMarkup) {
|
|
|
821
825
|
stackNoCollapseWhitespace = [],
|
|
822
826
|
optionalStartTag = '',
|
|
823
827
|
optionalEndTag = '',
|
|
824
|
-
t = Date.now(),
|
|
825
828
|
ignoredMarkupChunks = [],
|
|
826
829
|
ignoredCustomMarkupChunks = [],
|
|
827
830
|
uidIgnore,
|
|
@@ -837,22 +840,25 @@ function minify(value, options, partialMarkup) {
|
|
|
837
840
|
uidIgnore = uniqueId(value);
|
|
838
841
|
var pattern = new RegExp('^' + uidIgnore + '([0-9]+)$');
|
|
839
842
|
if (options.ignoreCustomComments) {
|
|
840
|
-
options.ignoreCustomComments.
|
|
843
|
+
options.ignoreCustomComments = options.ignoreCustomComments.slice();
|
|
841
844
|
}
|
|
842
845
|
else {
|
|
843
|
-
options.ignoreCustomComments = [
|
|
846
|
+
options.ignoreCustomComments = [];
|
|
844
847
|
}
|
|
848
|
+
options.ignoreCustomComments.push(pattern);
|
|
845
849
|
}
|
|
846
850
|
var token = '<!--' + uidIgnore + ignoredMarkupChunks.length + '-->';
|
|
847
851
|
ignoredMarkupChunks.push(group1);
|
|
848
852
|
return token;
|
|
849
853
|
});
|
|
850
854
|
|
|
851
|
-
function escapeFragments(
|
|
852
|
-
return
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
855
|
+
function escapeFragments(fn) {
|
|
856
|
+
return function(text, type) {
|
|
857
|
+
return fn(text.replace(uidPattern, function(match, prefix, index) {
|
|
858
|
+
var chunks = ignoredCustomMarkupChunks[+index];
|
|
859
|
+
return chunks[1] + uidAttr + index + chunks[2];
|
|
860
|
+
}), type);
|
|
861
|
+
};
|
|
856
862
|
}
|
|
857
863
|
|
|
858
864
|
var customFragments = options.ignoreCustomFragments.map(function(re) {
|
|
@@ -865,17 +871,11 @@ function minify(value, options, partialMarkup) {
|
|
|
865
871
|
if (!uidAttr) {
|
|
866
872
|
uidAttr = uniqueId(value);
|
|
867
873
|
uidPattern = new RegExp('(\\s*)' + uidAttr + '([0-9]+)(\\s*)', 'g');
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
options.minifyCSS = function(text) {
|
|
871
|
-
return minifyCSS(escapeFragments(text));
|
|
872
|
-
};
|
|
874
|
+
if (options.minifyCSS) {
|
|
875
|
+
options.minifyCSS = escapeFragments(options.minifyCSS);
|
|
873
876
|
}
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
options.minifyJS = function(text, inline) {
|
|
877
|
-
return minifyJS(escapeFragments(text), inline);
|
|
878
|
-
};
|
|
877
|
+
if (options.minifyJS) {
|
|
878
|
+
options.minifyJS = escapeFragments(options.minifyJS);
|
|
879
879
|
}
|
|
880
880
|
}
|
|
881
881
|
var token = uidAttr + ignoredCustomMarkupChunks.length;
|
|
@@ -949,14 +949,9 @@ function minify(value, options, partialMarkup) {
|
|
|
949
949
|
var lowerTag = tag.toLowerCase();
|
|
950
950
|
|
|
951
951
|
if (lowerTag === 'svg') {
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
nextOptions[key] = options[key];
|
|
956
|
-
}
|
|
957
|
-
nextOptions.keepClosingSlash = true;
|
|
958
|
-
nextOptions.caseSensitive = true;
|
|
959
|
-
options = nextOptions;
|
|
952
|
+
options = Object.create(options);
|
|
953
|
+
options.keepClosingSlash = true;
|
|
954
|
+
options.caseSensitive = true;
|
|
960
955
|
}
|
|
961
956
|
|
|
962
957
|
tag = options.caseSensitive ? tag : lowerTag;
|
|
@@ -1042,7 +1037,7 @@ function minify(value, options, partialMarkup) {
|
|
|
1042
1037
|
end: function(tag, attrs, autoGenerated) {
|
|
1043
1038
|
var lowerTag = tag.toLowerCase();
|
|
1044
1039
|
if (lowerTag === 'svg') {
|
|
1045
|
-
options =
|
|
1040
|
+
options = Object.getPrototypeOf(options);
|
|
1046
1041
|
}
|
|
1047
1042
|
tag = options.caseSensitive ? tag : lowerTag;
|
|
1048
1043
|
|
|
@@ -1153,11 +1148,6 @@ function minify(value, options, partialMarkup) {
|
|
|
1153
1148
|
trimTrailingWhitespace(buffer.length - 1, nextTag);
|
|
1154
1149
|
}
|
|
1155
1150
|
}
|
|
1156
|
-
else if (uidPattern) {
|
|
1157
|
-
text = text.replace(uidPattern, function(match, prefix, index) {
|
|
1158
|
-
return ignoredCustomMarkupChunks[+index][0];
|
|
1159
|
-
});
|
|
1160
|
-
}
|
|
1161
1151
|
if (!stackNoCollapseWhitespace.length && nextTag !== 'html' && !(prevTag && nextTag)) {
|
|
1162
1152
|
text = collapseWhitespace(text, options, false, false, true);
|
|
1163
1153
|
}
|
|
@@ -1191,6 +1181,11 @@ function minify(value, options, partialMarkup) {
|
|
|
1191
1181
|
// https://mathiasbynens.be/notes/ambiguous-ampersands
|
|
1192
1182
|
text = text.replace(/&(#?[0-9a-zA-Z]+;)/g, '&$1').replace(/</g, '<');
|
|
1193
1183
|
}
|
|
1184
|
+
if (uidPattern && options.collapseWhitespace && stackNoTrimWhitespace.length) {
|
|
1185
|
+
text = text.replace(uidPattern, function(match, prefix, index) {
|
|
1186
|
+
return ignoredCustomMarkupChunks[+index][0];
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1194
1189
|
currentChars += text;
|
|
1195
1190
|
if (text) {
|
|
1196
1191
|
hasChars = true;
|
|
@@ -1269,7 +1264,6 @@ function minify(value, options, partialMarkup) {
|
|
|
1269
1264
|
});
|
|
1270
1265
|
}
|
|
1271
1266
|
|
|
1272
|
-
options.log('minified in: ' + (Date.now() - t) + 'ms');
|
|
1273
1267
|
return str;
|
|
1274
1268
|
}
|
|
1275
1269
|
|
|
@@ -1301,5 +1295,9 @@ function joinResultSegments(results, options) {
|
|
|
1301
1295
|
}
|
|
1302
1296
|
|
|
1303
1297
|
exports.minify = function(value, options) {
|
|
1304
|
-
|
|
1298
|
+
var start = Date.now();
|
|
1299
|
+
options = processOptions(options || {});
|
|
1300
|
+
var result = minify(value, options);
|
|
1301
|
+
options.log('minified in: ' + (Date.now() - start) + 'ms');
|
|
1302
|
+
return result;
|
|
1305
1303
|
};
|
package/src/htmlparser.js
CHANGED
|
@@ -49,7 +49,12 @@ var singleAttrIdentifier = /([^\s"'<>/=]+)/,
|
|
|
49
49
|
],
|
|
50
50
|
// https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-QName
|
|
51
51
|
qnameCapture = (function() {
|
|
52
|
-
|
|
52
|
+
// based on https://www.npmjs.com/package/ncname
|
|
53
|
+
var combiningChar = '\\u0300-\\u0345\\u0360\\u0361\\u0483-\\u0486\\u0591-\\u05A1\\u05A3-\\u05B9\\u05BB-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u064B-\\u0652\\u0670\\u06D6-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0901-\\u0903\\u093C\\u093E-\\u094D\\u0951-\\u0954\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A02\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A70\\u0A71\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B43\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B82\\u0B83\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C01-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C82\\u0C83\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D43\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86-\\u0F8B\\u0F90-\\u0F95\\u0F97\\u0F99-\\u0FAD\\u0FB1-\\u0FB7\\u0FB9\\u20D0-\\u20DC\\u20E1\\u302A-\\u302F\\u3099\\u309A';
|
|
54
|
+
var digit = '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE7-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29';
|
|
55
|
+
var extender = '\\xB7\\u02D0\\u02D1\\u0387\\u0640\\u0E46\\u0EC6\\u3005\\u3031-\\u3035\\u309D\\u309E\\u30FC-\\u30FE';
|
|
56
|
+
var letter = 'A-Za-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u0131\\u0134-\\u013E\\u0141-\\u0148\\u014A-\\u017E\\u0180-\\u01C3\\u01CD-\\u01F0\\u01F4\\u01F5\\u01FA-\\u0217\\u0250-\\u02A8\\u02BB-\\u02C1\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03CE\\u03D0-\\u03D6\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2-\\u03F3\\u0401-\\u040C\\u040E-\\u044F\\u0451-\\u045C\\u045E-\\u0481\\u0490-\\u04C4\\u04C7\\u04C8\\u04CB\\u04CC\\u04D0-\\u04EB\\u04EE-\\u04F5\\u04F8\\u04F9\\u0531-\\u0556\\u0559\\u0561-\\u0586\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u063A\\u0641-\\u064A\\u0671-\\u06B7\\u06BA-\\u06BE\\u06C0-\\u06CE\\u06D0-\\u06D3\\u06D5\\u06E5\\u06E6\\u0905-\\u0939\\u093D\\u0958-\\u0961\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8B\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AE0\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B36-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB5\\u0BB7-\\u0BB9\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D60\\u0D61\\u0E01-\\u0E2E\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD\\u0EAE\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0F40-\\u0F47\\u0F49-\\u0F69\\u10A0-\\u10C5\\u10D0-\\u10F6\\u1100\\u1102\\u1103\\u1105-\\u1107\\u1109\\u110B\\u110C\\u110E-\\u1112\\u113C\\u113E\\u1140\\u114C\\u114E\\u1150\\u1154\\u1155\\u1159\\u115F-\\u1161\\u1163\\u1165\\u1167\\u1169\\u116D\\u116E\\u1172\\u1173\\u1175\\u119E\\u11A8\\u11AB\\u11AE\\u11AF\\u11B7\\u11B8\\u11BA\\u11BC-\\u11C2\\u11EB\\u11F0\\u11F9\\u1E00-\\u1E9B\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2126\\u212A\\u212B\\u212E\\u2180-\\u2182\\u3007\\u3021-\\u3029\\u3041-\\u3094\\u30A1-\\u30FA\\u3105-\\u312C\\u4E00-\\u9FA5\\uAC00-\\uD7A3';
|
|
57
|
+
var ncname = '[' + letter + '_][' + letter + digit + '\\.\\-_' + combiningChar + extender + ']*';
|
|
53
58
|
return '((?:' + ncname + '\\:)?' + ncname + ')';
|
|
54
59
|
})(),
|
|
55
60
|
startTagOpen = new RegExp('^<' + qnameCapture),
|