42 lines
1.6 KiB
JavaScript
42 lines
1.6 KiB
JavaScript
function applyPaths(paths, name) {
|
|
// most specific (most number of slashes in path) match wins
|
|
var pathMatch = '', wildcard, maxWildcardPrefixLen = 0;
|
|
|
|
// check to see if we have a paths entry
|
|
for (var p in paths) {
|
|
if (paths.hasOwnProperty && !paths.hasOwnProperty(p))
|
|
continue;
|
|
|
|
// exact path match
|
|
if (p.indexOf('*') === -1) {
|
|
if (name == p)
|
|
return paths[p];
|
|
|
|
// support trailing / in paths rules
|
|
else if (name.substr(0, p.length - 1) == p.substr(0, p.length - 1) && (name.length < p.length || name[p.length - 1] == p[p.length - 1]) && (paths[p][paths[p].length - 1] == '/' || paths[p] == '')) {
|
|
return paths[p].substr(0, paths[p].length - 1) + (name.length > p.length ? (paths[p] && '/' || '') + name.substr(p.length) : '');
|
|
}
|
|
}
|
|
// wildcard path match
|
|
else {
|
|
var pathParts = p.split('*');
|
|
if (pathParts.length > 2)
|
|
throw new TypeError('Only one wildcard in a path is permitted');
|
|
|
|
var wildcardPrefixLen = pathParts[0].length;
|
|
if (wildcardPrefixLen >= maxWildcardPrefixLen &&
|
|
name.substr(0, pathParts[0].length) == pathParts[0] &&
|
|
name.substr(name.length - pathParts[1].length) == pathParts[1]) {
|
|
maxWildcardPrefixLen = wildcardPrefixLen;
|
|
pathMatch = p;
|
|
wildcard = name.substr(pathParts[0].length, name.length - pathParts[1].length - pathParts[0].length);
|
|
}
|
|
}
|
|
}
|
|
|
|
var outPath = paths[pathMatch];
|
|
if (typeof wildcard == 'string')
|
|
outPath = outPath.replace('*', wildcard);
|
|
|
|
return outPath;
|
|
} |