| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | 
/** * When source maps are enabled, `style-loader` uses a link element with a data-uri to * embed the css on the page. This breaks all relative urls because now they are relative to a * bundle instead of the current page. * * One solution is to only use full urls, but that may be impossible. * * Instead, this function "fixes" the relative urls to be absolute according to the current page location. * * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command. * */module.exports = function (css) {  // get current location  var location = typeof window !== "undefined" && window.location;  if (!location) {    throw new Error("fixUrls requires window.location");  }	// blank or null?	if (!css || typeof css !== "string") {	  return css;  }  var baseUrl = location.protocol + "//" + location.host;  var currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/");	// convert each url(...)	/*	This regular expression is just a way to recursively match brackets within	a string.	 /url\s*\(  = Match on the word "url" with any whitespace after it and then a parens	   (  = Start a capturing group	     (?:  = Start a non-capturing group	         [^)(]  = Match anything that isn't a parentheses	         |  = OR	         \(  = Match a start parentheses	             (?:  = Start another non-capturing groups	                 [^)(]+  = Match anything that isn't a parentheses	                 |  = OR	                 \(  = Match a start parentheses	                     [^)(]*  = Match anything that isn't a parentheses	                 \)  = Match a end parentheses	             )  = End Group              *\) = Match anything and then a close parens          )  = Close non-capturing group          *  = Match anything       )  = Close capturing group	 \)  = Match a close parens	 /gi  = Get all matches, not the first.  Be case insensitive.	 */	var fixedCss = css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function(fullMatch, origUrl) {		// strip quotes (if they exist)		var unquotedOrigUrl = origUrl			.trim()			.replace(/^"(.*)"$/, function(o, $1){ return $1; })			.replace(/^'(.*)'$/, function(o, $1){ return $1; });		// already a full url? no change		if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(unquotedOrigUrl)) {		  return fullMatch;		}		// convert the url to a full url		var newUrl;		if (unquotedOrigUrl.indexOf("//") === 0) {		  	//TODO: should we add protocol?			newUrl = unquotedOrigUrl;		} else if (unquotedOrigUrl.indexOf("/") === 0) {			// path should be relative to the base url			newUrl = baseUrl + unquotedOrigUrl; // already starts with '/'		} else {			// path should be relative to current directory			newUrl = currentDir + unquotedOrigUrl.replace(/^\.\//, ""); // Strip leading './'		}		// send back the fixed url(...)		return "url(" + JSON.stringify(newUrl) + ")";	});	// send back the fixed css	return fixedCss;};
 |