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