Skip to content

Commit

Permalink
feat(compressor): add html-minifier
Browse files Browse the repository at this point in the history
  • Loading branch information
srod committed Aug 22, 2018
1 parent b59f328 commit 7ef310b
Show file tree
Hide file tree
Showing 9 changed files with 352 additions and 34 deletions.
99 changes: 99 additions & 0 deletions __tests__/node-minify-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,15 @@ var fileCSSArrayWithWildcards2 = [
__dirname + '/**/*.css'
];
var fileCSSOut = __dirname + '/../examples/public/dist/sample.css';
var oneFileHTML = __dirname + '/../examples/public/index.html';
var fileHTMLOut = __dirname + '/../examples/public/dist/index.min.html';
var filesHTMLArray = [__dirname + '/../examples/public/index.html', __dirname + '/../examples/public/index.html'];
var filesHTMLArrayWithWildcards = [
__dirname + '/../examples/public/index.html',
__dirname + '/../examples/public/index.html',
__dirname + '/../examples/public/**/*.html'
];
var filesHTMLArrayWithWildcards2 = ['index.html', 'index.html', '**/*.html'];

var tests = {
concat: [
Expand Down Expand Up @@ -403,6 +412,87 @@ var tests = {
}
}
}
],
commonhtml: [
{
it: 'should compress html with {compressor} and a single file',
minify: {
compressor: '{compressor}',
input: oneFileHTML,
output: fileHTMLOut
}
},
{
it: 'should compress html with {compressor} and a single file with a custom public folder',
minify: {
compressor: '{compressor}',
input: 'index.html',
output: fileHTMLOut,
publicFolder: __dirname + '/../examples/public/'
}
},
{
it: 'should compress html with {compressor} and a single file with empty options',
minify: {
compressor: '{compressor}',
input: oneFileHTML,
output: fileHTMLOut,
options: {}
}
},
{
it: 'should compress html with {compressor} and an array of file',
minify: {
compressor: '{compressor}',
input: filesHTMLArray,
output: fileHTMLOut
}
},
{
it: 'should compress html with {compressor} and an array of file with a custom public folder',
minify: {
compressor: '{compressor}',
input: ['index.html', 'index.html'],
output: fileHTMLOut,
publicFolder: __dirname + '/../examples/public/'
}
},
{
it: 'should compress javascript with {compressor} and wildcards path',
minify: {
compressor: '{compressor}',
input: __dirname + '/../examples/public/**/*.html',
output: fileHTMLOut
}
},
{
it: 'should compress html with {compressor} and wildcards path with a custom public folder',
minify: {
compressor: '{compressor}',
input: '**/*.html',
output: fileHTMLOut,
publicFolder: __dirname + '/../examples/public/'
}
},
{
it: 'should compress html with {compressor} and an array of strings and wildcards path',
minify: {
compressor: '{compressor}',
input: filesHTMLArrayWithWildcards,
output: fileHTMLOut
}
},
{
it:
'should compress html with {compressor} and an array of strings and wildcards path' +
' with a custom public folder',
minify: {
compressor: '{compressor}',
input: filesHTMLArrayWithWildcards2,
output: fileHTMLOut,
publicFolder: __dirname + '/../examples/public/'
}
}
]
};

Expand Down Expand Up @@ -887,6 +977,15 @@ describe('node-minify', function() {
});
});

describe('html-minifier', function() {
tests.commonhtml.forEach(function(o) {
runOneTest(o, 'html-minifier');
});
tests.commonhtml.forEach(function(o) {
runOneTest(o, 'html-minifier', true);
});
});

describe('YUI', function() {
tests.commonjs.forEach(function(o) {
runOneTest(o, 'yui-js');
Expand Down
1 change: 1 addition & 0 deletions bin/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ program.on('--help', function() {
console.log(' - babel-minify');
console.log(' - butternut');
console.log(' - gcc');
console.log(' - html-minifier');
console.log(' - uglifyjs');
console.log(' - uglify-es');
console.log(' - yui');
Expand Down
53 changes: 53 additions & 0 deletions examples/public/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link href="/favicons/favicon.ico" rel="shortcut icon">
<link rel="apple-touch-icon" sizes="57x57" href="/favicons/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/favicons/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/favicons/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/favicons/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/favicons/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/favicons/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/favicons/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/favicons/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/favicons/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/favicons/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="/favicons/ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">
<title></title>
<link rel="stylesheet" href="/styles.css">
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js').then(function () {
console.log("Service Worker Registered");
});
}
</script>
<link rel="manifest" href="/manifest.json">
</head>

<body>
<section class="container">
<div class="content">
</div>
</section>

<script src="https://unpkg.com/tippy.js@2.5.4/dist/tippy.all.min.js"></script>
<script async src="/scripts.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-65399-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
</script>
</body>

</html>
14 changes: 14 additions & 0 deletions examples/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,20 @@ compressor.minify({
});
console.log('sync 3');

compressor
.minify({
compressor: 'html-minifier',
input: 'public/index.html',
output: 'public/dist/index.min.html',
options: {
minifyJS: false
}
})
.then(function(min) {
console.log('html min');
console.log(min);
});

compressor
.minify({
compressor: 'butternut',
Expand Down
2 changes: 2 additions & 0 deletions lib/compress.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ var cleanCSS = require('./compressors/clean-css');
var csso = require('./compressors/csso');
var gcc;
var gccJava = require('./compressors/gcc-java');
var HTMLMinifier = require('./compressors/html-minifier');
var noCompress = require('./compressors/no-compress');
var sqwish = require('./compressors/sqwish');
var uglifyjs = require('./compressors/uglifyjs');
Expand Down Expand Up @@ -56,6 +57,7 @@ var compressorsMap = {
'gcc-legacy': function(settings, data, callback) {
return gccJava(settings, data, callback, true);
},
'html-minifier': HTMLMinifier,
uglifyjs: uglifyjs,
'uglify-es': uglifyES,
sqwish: sqwish,
Expand Down
61 changes: 61 additions & 0 deletions lib/compressors/html-minifier.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*!
* node-minify
* Copyright(c) 2011-2018 Rodolphe Stoclin
* MIT Licensed
*/

'use strict';

/**
* Module dependencies.
*/

var extend = require('xtend');
var HTMLMinifier = require('html-minifier').minify;
var utils = require('../utils');

/**
* Module variables.
*/

var defaultOptions = {
collapseBooleanAttributes: true,
collapseInlineTagWhitespace: true,
collapseWhitespace: true,
minifyCSS: true,
minifyJS: true,
removeAttributeQuotes: true,
removeCDATASectionsFromCDATA: true,
removeComments: true,
removeCommentsFromCDATA: true,
removeEmptyAttributes: true,
removeOptionalTags: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
useShortDoctype: true
};

/**
* Expose `compressHTMLMinifier()`.
*/

module.exports = compressHTMLMinifier;

/**
* Run html-minifier.
*
* @param {Object} settings
* @param {String} content
* @param {Function} callback
*/

function compressHTMLMinifier(settings, content, callback) {
var options = extend(defaultOptions, settings.options);
var contentMinified = HTMLMinifier(content, options);
utils.writeFile(settings.output, contentMinified);
if (callback) {
return callback(null, contentMinified);
}
return contentMinified;
}
Loading

0 comments on commit 7ef310b

Please sign in to comment.