You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
var path = require('path'); var url = require('url');
var DOUBLE_QUOTE = '"'; var SINGLE_QUOTE = '\''; var URL_PREFIX = 'url('; var URL_SUFFIX = ')';
var QUOTE_PREFIX_PATTERN = /^["']/; var QUOTE_SUFFIX_PATTERN = /["']$/; var ROUND_BRACKETS_PATTERN = /[\(\)]/; var URL_PREFIX_PATTERN = /^url\(/i; var URL_SUFFIX_PATTERN = /\)$/; var WHITESPACE_PATTERN = /\s/;
var isWindows = process.platform == 'win32';
function rebase(uri, rebaseConfig) { if (!rebaseConfig) { return uri; }
if (isAbsolute(uri) && !isRemote(rebaseConfig.toBase)) { return uri; }
if (isRemote(uri) || isSVGMarker(uri) || isInternal(uri)) { return uri; }
if (isData(uri)) { return '\'' + uri + '\''; }
if (isRemote(rebaseConfig.toBase)) { return url.resolve(rebaseConfig.toBase, uri); }
return rebaseConfig.absolute ? normalize(absolute(uri, rebaseConfig)) : normalize(relative(uri, rebaseConfig)); }
function isAbsolute(uri) { return path.isAbsolute(uri); }
function isSVGMarker(uri) { return uri[0] == '#'; }
function isInternal(uri) { return /^\w+:\w+/.test(uri); }
function isRemote(uri) { return /^[^:]+?:\/\//.test(uri) || uri.indexOf('//') === 0; }
function isData(uri) { return uri.indexOf('data:') === 0; }
function absolute(uri, rebaseConfig) { return path .resolve(path.join(rebaseConfig.fromBase || '', uri)) .replace(rebaseConfig.toBase, ''); }
function relative(uri, rebaseConfig) { return path.relative(rebaseConfig.toBase, path.join(rebaseConfig.fromBase || '', uri)); }
function normalize(uri) { return isWindows ? uri.replace(/\\/g, '/') : uri; }
function quoteFor(unquotedUrl) { if (unquotedUrl.indexOf(SINGLE_QUOTE) > -1) { return DOUBLE_QUOTE; } else if (unquotedUrl.indexOf(DOUBLE_QUOTE) > -1) { return SINGLE_QUOTE; } else if (hasWhitespace(unquotedUrl) || hasRoundBrackets(unquotedUrl)) { return SINGLE_QUOTE; } else { return ''; } }
function hasWhitespace(url) { return WHITESPACE_PATTERN.test(url); }
function hasRoundBrackets(url) { return ROUND_BRACKETS_PATTERN.test(url); }
function rewriteUrl(originalUrl, rebaseConfig, pathOnly) { var strippedUrl = originalUrl .replace(URL_PREFIX_PATTERN, '') .replace(URL_SUFFIX_PATTERN, '') .trim();
var unquotedUrl = strippedUrl .replace(QUOTE_PREFIX_PATTERN, '') .replace(QUOTE_SUFFIX_PATTERN, '') .trim();
var quote = strippedUrl[0] == SINGLE_QUOTE || strippedUrl[0] == DOUBLE_QUOTE ? strippedUrl[0] : quoteFor(unquotedUrl);
return pathOnly ? rebase(unquotedUrl, rebaseConfig) : URL_PREFIX + quote + rebase(unquotedUrl, rebaseConfig) + quote + URL_SUFFIX; }
module.exports = rewriteUrl;
|