var UrlRewriter = require('./url-rewriter');
-module.exports = function UrlRebase(options, context) {
- var process = function(data) {
- var rebaseOpts = {
- absolute: !!options.root,
- relative: !options.root && !!options.target,
- fromBase: options.relativeTo
- };
+function UrlRebase(outerContext) {
+ this.outerContext = outerContext;
+}
- if (!rebaseOpts.absolute && !rebaseOpts.relative)
- return data;
+UrlRebase.prototype.process = function (data) {
+ var options = this.outerContext.options;
- if (rebaseOpts.absolute && !!options.target)
- context.warnings.push('Both \'root\' and output file given so rebasing URLs as absolute paths');
+ var rebaseOpts = {
+ absolute: !!options.root,
+ relative: !options.root && !!options.target,
+ fromBase: options.relativeTo
+ };
- if (rebaseOpts.absolute)
- rebaseOpts.toBase = path.resolve(options.root);
+ if (!rebaseOpts.absolute && !rebaseOpts.relative)
+ return data;
- if (rebaseOpts.relative) {
- var target = fs.existsSync(options.target) && fs.statSync(options.target).isDirectory() ?
- options.target :
- path.dirname(options.target);
+ if (rebaseOpts.absolute && !!options.target)
+ this.outerContext.warnings.push('Both \'root\' and output file given so rebasing URLs as absolute paths');
- rebaseOpts.toBase = path.resolve(target);
- }
+ if (rebaseOpts.absolute)
+ rebaseOpts.toBase = path.resolve(options.root);
- if (!rebaseOpts.fromBase || !rebaseOpts.toBase)
- return data;
+ if (rebaseOpts.relative) {
+ var target = fs.existsSync(options.target) && fs.statSync(options.target).isDirectory() ?
+ options.target :
+ path.dirname(options.target);
- return UrlRewriter.process(data, rebaseOpts);
- };
+ rebaseOpts.toBase = path.resolve(target);
+ }
- return { process: process };
+ if (!rebaseOpts.fromBase || !rebaseOpts.toBase)
+ return data;
+
+ return new UrlRewriter(rebaseOpts).process(data);
};
+
+module.exports = UrlRebase;
var path = require('path');
var url = require('url');
-module.exports = {
- process: function(data, options) {
- var tempData = [];
- var nextStart = 0;
- var nextEnd = 0;
- var cursor = 0;
-
- for (; nextEnd < data.length;) {
- nextStart = data.indexOf('url(', nextEnd);
- if (nextStart == -1)
- break;
-
- nextEnd = data.indexOf(')', nextStart + 4);
- if (nextEnd == -1)
- break;
-
- tempData.push(data.substring(cursor, nextStart));
- var url = data.substring(nextStart + 4, nextEnd);
- if (!/\/\*|\*\//.test(url))
- url = url.replace(/['"]/g, '');
-
- tempData.push('url(' + this._rebased(url, options) + ')');
- cursor = nextEnd + 1;
- }
-
- return tempData.length > 0 ?
- tempData.join('') + data.substring(cursor, data.length) :
- data;
- },
-
- _rebased: function(resource, options) {
- var specialUrl = resource[0] == '/' ||
- resource[0] == '#' ||
- resource.substring(resource.length - 4) == '.css' ||
- resource.indexOf('data:') === 0 ||
- /^https?:\/\//.exec(resource) !== null ||
- /__\w+__/.exec(resource) !== null;
- var rebased;
-
- if (specialUrl)
- return 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;
+function UrlRewriter(options) {
+ this.options = options;
+}
+
+UrlRewriter.prototype.process = function (data) {
+ var tempData = [];
+ var nextStart = 0;
+ var nextEnd = 0;
+ var cursor = 0;
+
+ for (; nextEnd < data.length;) {
+ nextStart = data.indexOf('url(', nextEnd);
+ if (nextStart == -1)
+ break;
+
+ nextEnd = data.indexOf(')', nextStart + 4);
+ if (nextEnd == -1)
+ break;
+
+ tempData.push(data.substring(cursor, nextStart));
+ var url = data.substring(nextStart + 4, nextEnd);
+ if (!/\/\*|\*\//.test(url))
+ url = url.replace(/['"]/g, '');
+
+ tempData.push('url(' + rebase(url, this.options) + ')');
+ cursor = nextEnd + 1;
}
+
+ return tempData.length > 0 ?
+ tempData.join('') + data.substring(cursor, data.length) :
+ data;
};
+
+function rebase(resource, options) {
+ var specialUrl = resource[0] == '/' ||
+ resource[0] == '#' ||
+ resource.substring(resource.length - 4) == '.css' ||
+ resource.indexOf('data:') === 0 ||
+ /^https?:\/\//.exec(resource) !== null ||
+ /__\w+__/.exec(resource) !== null;
+ var rebased;
+
+ if (specialUrl)
+ return 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;
res.on('end', function() {
var importedData = chunks.join('');
if (context.rebase)
- importedData = UrlRewriter.process(importedData, { toBase: importedUrl });
+ importedData = new UrlRewriter({ toBase: importedUrl }).process(importedData);
importedData = context.sourceTracker.store(importedUrl, importedData);
importedData = rebaseMap(importedData, importedUrl);
var importRelativeTo = path.dirname(fullPath);
var importedData = fs.readFileSync(fullPath, 'utf8');
if (context.rebase) {
- importedData = UrlRewriter.process(importedData, {
+ var rewriter = new UrlRewriter({
relative: true,
fromBase: importRelativeTo,
toBase: context.baseRelativeTo
});
+ importedData = rewriter.process(importedData);
}
importedData = context.sourceTracker.store(path.resolve(context.relativeTo, fullPath), importedData);