Spaces:
Running
Running
var path = require('path'); | |
var url = require('url'); | |
var isDataUriResource = require('../utils/is-data-uri-resource'); | |
var DOUBLE_QUOTE = '"'; | |
var SINGLE_QUOTE = '\''; | |
var URL_PREFIX = 'url('; | |
var URL_SUFFIX = ')'; | |
var PROTOCOL_LESS_PREFIX_PATTERN = /^[^\w\d]*\/\//; | |
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) || isDataUriResource(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) || PROTOCOL_LESS_PREFIX_PATTERN.test(uri); | |
} | |
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; | |
} if (unquotedUrl.indexOf(DOUBLE_QUOTE) > -1) { | |
return SINGLE_QUOTE; | |
} if (hasWhitespace(unquotedUrl) || hasRoundBrackets(unquotedUrl)) { | |
return SINGLE_QUOTE; | |
} | |
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; | |