mirror of
https://github.com/danog/inline-critical.git
synced 2025-01-22 22:02:44 +01:00
CLI
This commit is contained in:
parent
e0ab0c97d1
commit
606cdb4b86
135
cli.js
Normal file
135
cli.js
Normal file
@ -0,0 +1,135 @@
|
||||
#!/usr/bin/env node
|
||||
'use strict';
|
||||
var os = require('os');
|
||||
var fs = require('fs');
|
||||
var meow = require('meow');
|
||||
var indentString = require('indent-string');
|
||||
var stdin = require('get-stdin');
|
||||
var css = require('css');
|
||||
var _ = require('lodash');
|
||||
var inlineCritical = require('./');
|
||||
var ok;
|
||||
|
||||
var help = [
|
||||
'Usage: inline-critical <input> [<option>]',
|
||||
'',
|
||||
'Options:',
|
||||
' -c, --css Path to CSS file',
|
||||
' -h, --html Path to HTML file',
|
||||
' -i, --ignore Skip matching stylesheets',
|
||||
' -m, --minify Minify the styles before inlining',
|
||||
' -e, --extract Remove the inlined styles from any stylesheets referenced in the HTML',
|
||||
' -b, --base Is used when extracting styles to find the files references by `href` attributes'
|
||||
];
|
||||
|
||||
var cli = meow({
|
||||
help: help
|
||||
}, {
|
||||
alias: {
|
||||
c: 'css',
|
||||
h: 'html',
|
||||
i: 'ignore',
|
||||
m: 'minify',
|
||||
b: 'base',
|
||||
e: 'extract'
|
||||
}
|
||||
});
|
||||
|
||||
// cleanup cli flags
|
||||
cli.flags = _.reduce(cli.flags, function (res, val, key) {
|
||||
if (key.length <= 1) {
|
||||
return res;
|
||||
}
|
||||
|
||||
switch (key) {
|
||||
case 'css':
|
||||
case 'html':
|
||||
try {
|
||||
res[key] = read(val)
|
||||
} catch (err) {
|
||||
}
|
||||
break;
|
||||
case 'base':
|
||||
res.basePath = val;
|
||||
break;
|
||||
case 'ignore':
|
||||
if (_.isString(val) || _.isRegExp(val)) {
|
||||
val = [val];
|
||||
}
|
||||
res.ignore = _.map(val || [], function (ignore) {
|
||||
// check regex
|
||||
var match = ignore.match(/^\/(.*)\/([igmy]+)?$/);
|
||||
|
||||
if (match) {
|
||||
return new RegExp(_.escapeRegExp(match[1]), match[2]);
|
||||
}
|
||||
return ignore;
|
||||
});
|
||||
break;
|
||||
default:
|
||||
res[key] = val;
|
||||
break;
|
||||
}
|
||||
|
||||
return res;
|
||||
}, {});
|
||||
|
||||
function error(err) {
|
||||
process.stderr.write(indentString(err.message || err, ' Error: '));
|
||||
process.stderr.write(os.EOL);
|
||||
process.stderr.write(indentString(help.join(os.EOL), ' '));
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
function read(file) {
|
||||
try {
|
||||
return fs.readFileSync(file, 'utf8');
|
||||
} catch (err) {
|
||||
error(err);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function run(data) {
|
||||
var opts = _.defaults(cli.flags, {basePath: process.cwd()});
|
||||
ok = true;
|
||||
|
||||
if (data) {
|
||||
// detect html
|
||||
try {
|
||||
css.parse(data);
|
||||
opts.css = data;
|
||||
} catch (err) {
|
||||
opts.html = data;
|
||||
}
|
||||
}
|
||||
|
||||
_.forEach(cli.input, function (file) {
|
||||
var tmp = read(file);
|
||||
try {
|
||||
css.parse(tmp);
|
||||
opts.css = tmp;
|
||||
} catch (err) {
|
||||
opts.html = tmp;
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
var out = inlineCritical(opts.html, opts.css, opts);
|
||||
console.log(out.toString());
|
||||
process.exit();
|
||||
} catch (err) {
|
||||
error(err);
|
||||
}
|
||||
}
|
||||
|
||||
// get stdin
|
||||
stdin(run);
|
||||
setTimeout(function () {
|
||||
if (ok) {
|
||||
return;
|
||||
}
|
||||
run();
|
||||
}, 100);
|
||||
|
||||
|
8
index.js
8
index.js
@ -47,6 +47,14 @@ function read(file) {
|
||||
|
||||
module.exports = function (html, styles, options) {
|
||||
|
||||
if (!html) {
|
||||
throw new Error('HTML missing!')
|
||||
}
|
||||
|
||||
if (!styles) {
|
||||
throw new Error('Styles missing!')
|
||||
}
|
||||
|
||||
var $ = cheerio.load(String(html), {
|
||||
decodeEntities: false
|
||||
});
|
||||
|
@ -23,8 +23,12 @@
|
||||
"cave": "2.0.0",
|
||||
"cheerio": "0.19.0",
|
||||
"clean-css": "3.2.10",
|
||||
"css": "^2.2.1",
|
||||
"dom-serializer": "0.1.0",
|
||||
"get-stdin": "^4.0.1",
|
||||
"indent-string": "^1.2.1",
|
||||
"lodash": "^3.7.0",
|
||||
"meow": "^3.3.0",
|
||||
"normalize-newline": "^1.0.2",
|
||||
"reaver": "1.2.0",
|
||||
"slash": "1.0.0",
|
||||
|
Loading…
x
Reference in New Issue
Block a user