Fix bug where template expressions were interpreted as paths.

This commit is contained in:
Alexandre Gigliotti
2015-09-25 13:35:27 -07:00
parent 99eed58f96
commit ff5e4401f7
4 changed files with 27 additions and 2 deletions

View File

@@ -1,5 +1,6 @@
var datauri = require('datauri'); var datauri = require('datauri');
var isLocalPath = require('is-local-path'); var isLocalPath = require('is-local-path');
var isTemplateExpression = require('./is-template-expression');
var path = require('path'); var path = require('path');
var postcss = require('postcss'); var postcss = require('postcss');
var postcssUrl = require('postcss-url'); var postcssUrl = require('postcss-url');
@@ -33,7 +34,7 @@ var inline = function (css, filename) {
var result = postcss() var result = postcss()
.use(postcssUrl({ .use(postcssUrl({
url: function (urlPath) { url: function (urlPath) {
if (isLocalPath(urlPath)) { if (isLocalPath(urlPath) && !isTemplateExpression(urlPath)) {
urlPath = clean(urlPath); urlPath = clean(urlPath);
urlPath = path.resolve(basePath, urlPath); urlPath = path.resolve(basePath, urlPath);
files.push(urlPath); files.push(urlPath);

View File

@@ -1,6 +1,7 @@
var cheerio = require('cheerio'); var cheerio = require('cheerio');
var datauri = require('datauri'); var datauri = require('datauri');
var isLocalPath = require('is-local-path'); var isLocalPath = require('is-local-path');
var isTemplateExpression = require('./is-template-expression');
var path = require('path'); var path = require('path');
var inline = function (html, filename) { var inline = function (html, filename) {
@@ -8,7 +9,8 @@ var inline = function (html, filename) {
var basedir = path.dirname(filename); var basedir = path.dirname(filename);
var $ = cheerio.load(html, {decodeEntities: false}); var $ = cheerio.load(html, {decodeEntities: false});
var images = $('img').filter(function (index, element) { var images = $('img').filter(function (index, element) {
return isLocalPath($(element).attr('src')); var path = $(element).attr('src');
return isLocalPath(path) && !isTemplateExpression(path);
}); });
images.each(function (index, element) { images.each(function (index, element) {
var src = $(element).attr('src'); var src = $(element).attr('src');

View File

@@ -0,0 +1,14 @@
/**
* Tests whether a path is a mustache template expression.
*
* Note: would be best if this was file extension specific
* (i.e. *.hbs => test for `{{ }}` )
*
* @param {String} path
* @return {Boolean}
*/
var isTemplateExpression = function (path) {
return /^{{.*}}$/.test(path);
};
module.exports = isTemplateExpression;

View File

@@ -152,6 +152,14 @@ describe('inlineHtml', function () {
var html = `<img src="http://test.com/file.txt?query=string#hash"/>`; var html = `<img src="http://test.com/file.txt?query=string#hash"/>`;
return expect(inline(html)).to.eventually.equal(html); return expect(inline(html)).to.eventually.equal(html);
}); });
it('ignore css url template expression paths', function () {
var html = `<style> div { background-image: url({{path}}); }</style>`;
return expect(inline(html)).to.eventually.equal(html);
});
it('ignore img src template expression paths', function () {
var html = `<img src="{{path}}"/>`;
return expect(inline(html)).to.eventually.equal(html);
});
it('ignore query strings and hashes on local paths', function () { it('ignore query strings and hashes on local paths', function () {
var filename = path.resolve(__dirname, 'fixtures/file.txt'); var filename = path.resolve(__dirname, 'fixtures/file.txt');
var url = `${filename}?query=string#hash`; var url = `${filename}?query=string#hash`;