diff --git a/lib/index.js b/lib/index.js index 59b12dd..3245be5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -2,28 +2,42 @@ var _ = require('lodash'); var co = require('co'); var cheerio = require('cheerio'); var fs = require('mz/fs'); -var inlineCss = require('./inline-css'); +var inlineStyle = require('./inline-style'); var inlineImg = require('./inline-img'); var inlineLinkLess = require('./inline-link-less'); var inline = co.wrap(function * (filename, options) { options = _.defaults(options || {}, { - less: {} + less: {}, + verbose: false }); var html = yield fs.readFile(filename, 'utf8'); + var files = [filename]; // Inline links - html = yield inlineLinkLess(html, filename, options.less); + var lessResult = yield inlineLinkLess(html, filename, options.less); + html = lessResult.html; + files.push(lessResult.files); + // TODO inline links: css // TODO inline scripts // browserify js? => scriptify // Inline paths -> datauris - html = inlineCss(html, filename); - html = inlineImg(html, filename); + var styleResult = inlineStyle(html, filename); // Inline styles + html = styleResult.html; + files.push(styleResult.files); - return html; + var imgResult = inlineImg(html, filename); // Inline images + html = imgResult.html; + files.push(imgResult.files); + + var result = { + html: html, + files: _.unique(_.flatten(files, true)) + }; + return (options.verbose ? result : result.html); }); module.exports = inline; diff --git a/lib/inline-css-url.js b/lib/inline-css-url.js index c83b06c..42a236f 100644 --- a/lib/inline-css-url.js +++ b/lib/inline-css-url.js @@ -4,18 +4,23 @@ var path = require('path'); var rework = require('rework'); var url = require('rework-plugin-url'); -var inline = function (css, filePath) { - var basePath = path.dirname(filePath); +var inline = function (css, filename) { + var files = []; + var basePath = path.dirname(filename); css = rework(css) .use(url(function (url) { if (isLocalPath(url)) { url = path.resolve(basePath, url); + files.push(url); url = datauri(url); } return url; })) .toString(); - return css; + return { + css: css, + files: files + }; }; module.exports = inline; diff --git a/lib/inline-img.js b/lib/inline-img.js index c7efc97..6fdb55e 100644 --- a/lib/inline-img.js +++ b/lib/inline-img.js @@ -3,19 +3,24 @@ var datauri = require('datauri'); var isLocalPath = require('is-local-path'); var path = require('path'); -var inline = function (html, filePath) { - var basedir = path.dirname(filePath); +var inline = function (html, filename) { + var files = []; + var basedir = path.dirname(filename); var $ = cheerio.load(html, {decodeEntities: false}); var images = $('img').filter(function (index, element) { return isLocalPath($(element).attr('src')); }); images.each(function (index, element) { var src = $(element).attr('src'); - var filePath = path.resolve(basedir, src); - src = datauri(filePath); + var filename = path.resolve(basedir, src); + files.push(filename); + src = datauri(filename); $(element).attr('src', src); }); - return $.html(); + return { + html: $.html(), + files: files + }; }; module.exports = inline; diff --git a/lib/inline-link-less.js b/lib/inline-link-less.js index 9711d9c..453b23a 100644 --- a/lib/inline-link-less.js +++ b/lib/inline-link-less.js @@ -7,13 +7,12 @@ var less = require('less'); var path = require('path'); var url = require('url'); -var render = co.wrap(function * (filepath, options) { +var render = co.wrap(function * (filename, options) { options = _.assign(options || {}, { - filename: filepath + filename: filename }); - var contents = yield fs.readFile(filepath, 'utf8'); - var output = yield less.render(contents, options); - return output.css; + var contents = yield fs.readFile(filename, 'utf8'); + return yield less.render(contents, options); }); /** * @params html @@ -21,8 +20,9 @@ var render = co.wrap(function * (filepath, options) { * @params options * LESS compiler options */ -var inline = co.wrap(function * (html, filepath, options) { - var basedir = path.dirname(filepath); +var inline = co.wrap(function * (html, filename, options) { + var files = []; + var basedir = path.dirname(filename); options = _.defaults(options || {}, { relativeUrls: true }); @@ -36,23 +36,29 @@ var inline = co.wrap(function * (html, filepath, options) { }); // render stylesheets - var contents = []; + var outputs = []; links.each(function (index, element) { var href = $(element).attr('href'); - var filepath = path.resolve(basedir, href); - contents.push(render(filepath, options)); + var filename = path.resolve(basedir, href); + files.push(filename); + outputs.push(render(filename, options)); }); - contents = yield contents; - - // TODO for each content: convert css url path -> datauri - // can use inline-css-url + outputs = yield outputs; // replace links links.each(function (index, element) { - var style = $('