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; } };