cartodb/lib/assets/javascripts/builder/routes/populate-route.js

52 lines
1.6 KiB
JavaScript
Raw Normal View History

2020-06-15 10:58:47 +08:00
function matchArg (haystack, args) {
var argMatch = haystack.match(/:(.+)/);
if (argMatch === null) {
throw new Error('Malformed argument: ' + haystack);
}
var argName = argMatch[1];
var argValue = args[argName];
if (argValue === undefined) {
throw new Error('No value provided for argument: ' + argName);
}
return haystack.replace(':' + argName, argValue);
}
function findArg (haystack) {
var argMatch = haystack.match(/:(.+)/);
return argMatch === null ? null : argMatch[1];
}
module.exports = function (route, args) {
var optionalMatch = route.match(/\(.+\)+/);
var optionalArg = optionalMatch !== null ? optionalMatch[0] : null;
var cleanRoute = optionalArg !== null ? route.replace(optionalArg, '') : route;
// Return route without optional arguments if no args were provided
if (!args) return cleanRoute;
// Find out if there's an optional argument provided, and if so, turn it into a regular one
if (optionalArg !== null) {
// Replace ( and ) with nothing, need the g to apply throughout the string
optionalArg = optionalArg.replace(/\(|\)/g, '');
var optionalArgName = findArg(optionalArg);
if (args[optionalArgName]) {
// append the optional arg without parenthesis
cleanRoute += optionalArg.replace(/\(|\)/g, '');
}
}
return cleanRoute
// Split all url arguments
.split(/(:[^\/]+)/g)
// replace all arguments with the provided value
.map(function (fragment) {
return fragment.indexOf(':') === 0 ? matchArg(fragment, args) : fragment;
})
// join them again
.join('');
};