mirror of
https://github.com/less/less.js.git
synced 2026-04-09 03:00:20 -04:00
124 lines
3.9 KiB
JavaScript
124 lines
3.9 KiB
JavaScript
var abstractFileManager = function() {
|
|
};
|
|
|
|
abstractFileManager.prototype.getPath = function (filename) {
|
|
var j = filename.lastIndexOf('?');
|
|
if (j > 0) {
|
|
filename = filename.slice(0, j);
|
|
}
|
|
j = filename.lastIndexOf('/');
|
|
if (j < 0) {
|
|
j = filename.lastIndexOf('\\');
|
|
}
|
|
if (j < 0) {
|
|
return "";
|
|
}
|
|
return filename.slice(0, j + 1);
|
|
};
|
|
|
|
abstractFileManager.prototype.tryAppendExtension = function(path, ext) {
|
|
return /(\.[a-z]*$)|([\?;].*)$/.test(path) ? path : path + ext;
|
|
};
|
|
|
|
abstractFileManager.prototype.tryAppendLessExtension = function(path) {
|
|
return this.tryAppendExtension(path, '.less');
|
|
};
|
|
|
|
abstractFileManager.prototype.supportsSync = function() {
|
|
return false;
|
|
};
|
|
|
|
abstractFileManager.prototype.alwaysMakePathsAbsolute = function() {
|
|
return false;
|
|
};
|
|
|
|
abstractFileManager.prototype.isPathAbsolute = function(filename) {
|
|
return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename);
|
|
};
|
|
|
|
abstractFileManager.prototype.join = function(basePath, laterPath) {
|
|
if (!basePath) {
|
|
return laterPath;
|
|
}
|
|
return basePath + laterPath;
|
|
};
|
|
abstractFileManager.prototype.pathDiff = function pathDiff(url, baseUrl) {
|
|
// diff between two paths to create a relative path
|
|
|
|
var urlParts = this.extractUrlParts(url),
|
|
baseUrlParts = this.extractUrlParts(baseUrl),
|
|
i, max, urlDirectories, baseUrlDirectories, diff = "";
|
|
if (urlParts.hostPart !== baseUrlParts.hostPart) {
|
|
return "";
|
|
}
|
|
max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);
|
|
for (i = 0; i < max; i++) {
|
|
if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }
|
|
}
|
|
baseUrlDirectories = baseUrlParts.directories.slice(i);
|
|
urlDirectories = urlParts.directories.slice(i);
|
|
for (i = 0; i < baseUrlDirectories.length - 1; i++) {
|
|
diff += "../";
|
|
}
|
|
for (i = 0; i < urlDirectories.length - 1; i++) {
|
|
diff += urlDirectories[i] + "/";
|
|
}
|
|
return diff;
|
|
};
|
|
// helper function, not part of API
|
|
abstractFileManager.prototype.extractUrlParts = function extractUrlParts(url, baseUrl) {
|
|
// urlParts[1] = protocol&hostname || /
|
|
// urlParts[2] = / if path relative to host base
|
|
// urlParts[3] = directories
|
|
// urlParts[4] = filename
|
|
// urlParts[5] = parameters
|
|
|
|
var urlPartsRegex = /^((?:[a-z-]+:)?\/+?(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\?#]*[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/i,
|
|
urlParts = url.match(urlPartsRegex),
|
|
returner = {}, directories = [], i, baseUrlParts;
|
|
|
|
if (!urlParts) {
|
|
throw new Error("Could not parse sheet href - '" + url + "'");
|
|
}
|
|
|
|
// Stylesheets in IE don't always return the full path
|
|
if (baseUrl && (!urlParts[1] || urlParts[2])) {
|
|
baseUrlParts = baseUrl.match(urlPartsRegex);
|
|
if (!baseUrlParts) {
|
|
throw new Error("Could not parse page url - '" + baseUrl + "'");
|
|
}
|
|
urlParts[1] = urlParts[1] || baseUrlParts[1] || "";
|
|
if (!urlParts[2]) {
|
|
urlParts[3] = baseUrlParts[3] + urlParts[3];
|
|
}
|
|
}
|
|
|
|
if (urlParts[3]) {
|
|
directories = urlParts[3].replace(/\\/g, "/").split("/");
|
|
|
|
// extract out . before .. so .. doesn't absorb a non-directory
|
|
for (i = 0; i < directories.length; i++) {
|
|
if (directories[i] === ".") {
|
|
directories.splice(i, 1);
|
|
i -= 1;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < directories.length; i++) {
|
|
if (directories[i] === ".." && i > 0) {
|
|
directories.splice(i - 1, 2);
|
|
i -= 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
returner.hostPart = urlParts[1];
|
|
returner.directories = directories;
|
|
returner.path = (urlParts[1] || "") + directories.join("/");
|
|
returner.fileUrl = returner.path + (urlParts[4] || "");
|
|
returner.url = returner.fileUrl + (urlParts[5] || "");
|
|
return returner;
|
|
};
|
|
|
|
module.exports = abstractFileManager;
|