Update LessLoader to be capable of loading CSS as well as less files and properly rewrite the URLs
This commit is contained in:
@@ -18,12 +18,15 @@ define([
|
|||||||
localStorage = {};
|
localStorage = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
var fixURL = function (url) {
|
var fixURL = function (url, parent) {
|
||||||
// data: blob: etc
|
// data: blob: etc
|
||||||
if (!/^(\/|http)/.test(url)) { return url; }
|
if (/^[a-zA-Z0-9]*:/.test(url)) { return url; }
|
||||||
var ua = url.split('#');
|
var ua = url.split('#');
|
||||||
var mark = (ua[0].indexOf('?') !== -1) ? '&' : '?';
|
var mark = (ua[0].indexOf('?') !== -1) ? '&' : '?';
|
||||||
ua[0] = ua[0] + mark + key;
|
ua[0] = ua[0] + mark + key;
|
||||||
|
if (ua[0].indexOf(':') === -1 && ua[0].indexOf('/') && parent) {
|
||||||
|
ua[0] = parent.replace(/\/[^\/]*$/, '/') + ua[0];
|
||||||
|
}
|
||||||
var out = ua.join('#');
|
var out = ua.join('#');
|
||||||
console.log(url + " --> " + out);
|
console.log(url + " --> " + out);
|
||||||
return out;
|
return out;
|
||||||
@@ -54,13 +57,13 @@ define([
|
|||||||
localStorage['LESS_CACHE'] = key;
|
localStorage['LESS_CACHE'] = key;
|
||||||
};
|
};
|
||||||
|
|
||||||
var fixAllURLs = function (source) {
|
var fixAllURLs = function (source, parent) {
|
||||||
var urlRegEx = /@import\s*("([^"]*)"|'([^']*)')|url\s*\(\s*(\s*"([^"]*)"|'([^']*)'|[^\)]*\s*)\s*\)/ig;
|
var urlRegEx = /@import\s*("([^"]*)"|'([^']*)')|url\s*\(\s*(\s*"([^"]*)"|'([^']*)'|[^\)]*\s*)\s*\)/ig;
|
||||||
var result, url;
|
var result, url;
|
||||||
|
|
||||||
while (!!(result = urlRegEx.exec(source))) {
|
while (!!(result = urlRegEx.exec(source))) {
|
||||||
url = result[3] || result[2] || result[5] || result[6] || result[4];
|
url = result[3] || result[2] || result[5] || result[6] || result[4];
|
||||||
var newUrl = fixURL(url);
|
var newUrl = fixURL(url, parent);
|
||||||
var quoteLen = result[5] || result[6] ? 1 : 0;
|
var quoteLen = result[5] || result[6] ? 1 : 0;
|
||||||
source = source.substr(0, urlRegEx.lastIndex - url.length - quoteLen - 1)
|
source = source.substr(0, urlRegEx.lastIndex - url.length - quoteLen - 1)
|
||||||
+ newUrl + source.substr(urlRegEx.lastIndex - quoteLen - 1);
|
+ newUrl + source.substr(urlRegEx.lastIndex - quoteLen - 1);
|
||||||
@@ -70,6 +73,24 @@ define([
|
|||||||
return source;
|
return source;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var loadCSS = function (url, cb) {
|
||||||
|
var xhr = new window.XMLHttpRequest();
|
||||||
|
xhr.open("GET", fixURL(url), true);
|
||||||
|
xhr.responseType = 'text';
|
||||||
|
xhr.onload = function () {
|
||||||
|
if (/^4/.test('' + this.status)) { return cb("error loading " + url); }
|
||||||
|
cb(undefined, xhr.response);
|
||||||
|
};
|
||||||
|
xhr.send(null);
|
||||||
|
};
|
||||||
|
|
||||||
|
var loadLess = function (url, cb) {
|
||||||
|
Less.render('@import (multiple) "' + url + '";', {}, function(err, css) {
|
||||||
|
if (err) { return void cb(err); }
|
||||||
|
cb(undefined, css.css);
|
||||||
|
}, window.less);
|
||||||
|
};
|
||||||
|
|
||||||
module.exports.load = function (url /*:string*/, cb /*:()=>void*/) {
|
module.exports.load = function (url /*:string*/, cb /*:()=>void*/) {
|
||||||
checkCache();
|
checkCache();
|
||||||
if (localStorage['LESS_CACHE|' + key + '|' + url]) {
|
if (localStorage['LESS_CACHE|' + key + '|' + url]) {
|
||||||
@@ -77,18 +98,12 @@ define([
|
|||||||
cb();
|
cb();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Less.render('@import (multiple) "' + url + '";', {}, function(err, css) {
|
((/\.less([\?\#].*)?$/.test(url)) ? loadLess : loadCSS)(url, function (err, css) {
|
||||||
if (err) {
|
var output = fixAllURLs(css, url);
|
||||||
console.log(err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var output = fixAllURLs(css.css);
|
|
||||||
window.lc = window.lc || {};
|
|
||||||
window.lc['LESS_CACHE|' + key + '|' + url] = output;
|
|
||||||
localStorage['LESS_CACHE|' + key + '|' + url] = output;
|
localStorage['LESS_CACHE|' + key + '|' + url] = output;
|
||||||
inject(output, url);
|
inject(output, url);
|
||||||
cb();
|
cb();
|
||||||
}, window.less);
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
return module.exports;
|
return module.exports;
|
||||||
|
|||||||
Reference in New Issue
Block a user