clean-css
Version:
A well-tested CSS minifier
59 lines (47 loc) • 1.58 kB
JavaScript
var path = require('path');
var url = require('url');
var UrlScanner = require('../utils/url-scanner');
function UrlRewriter(options, context) {
this.options = options;
this.context = context;
}
UrlRewriter.prototype.process = function (data) {
var self = this;
return new UrlScanner(data, this.context).reduce(function (url, tempData) {
url = url.replace(/^url\(\s*['"]?|['"]?\s*\)$/g, '');
tempData.push('url(' + rebase(url, self.options) + ')');
});
};
function rebase(resource, options) {
// TODO: this is getting insane now - pending refactor in #436
var importUrl = resource.substring(resource.length - 4) == '.css';
var dataUri = resource.indexOf('data:') === 0;
var specialUrl = resource[0] == '/' ||
resource[0] == '#' ||
(!options.imports && importUrl) ||
dataUri ||
/^https?:\/\//.exec(resource) !== null ||
/__\w+__/.exec(resource) !== null;
var rebased;
if (false === options.urls) {
if (options.imports && importUrl)
specialUrl = false;
else
specialUrl = true;
}
if (specialUrl)
return dataUri ? '\'' + resource + '\'' : resource;
if (/https?:\/\//.test(options.toBase))
return url.resolve(options.toBase, resource);
if (options.absolute) {
rebased = path
.resolve(path.join(options.fromBase, resource))
.replace(options.toBase, '');
} else {
rebased = path.relative(options.toBase, path.join(options.fromBase, resource));
}
return process.platform == 'win32' ?
rebased.replace(/\\/g, '/') :
rebased;
}
module.exports = UrlRewriter;