angular-state-router
Version:
An AngularJS state-based router designed for flexibility and ease of use.
116 lines (93 loc) • 2.38 kB
JavaScript
;
var Url = require('./url');
/**
* Constructor
*/
function UrlDictionary() {
this._patterns = [];
this._refs = [];
this._params = [];
}
/**
* Associate a URL pattern with a reference
*
* @param {String} pattern A URL pattern
* @param {Object} ref A data Object
*/
UrlDictionary.prototype.add = function(pattern, ref) {
pattern = pattern || '';
var _self = this;
var i = this._patterns.length;
var pathChain;
var params = {};
if(pattern.indexOf('?') === -1) {
pathChain = Url(pattern).path().split('/');
} else {
pathChain = Url(pattern).path().split('/');
}
// Start
var searchExpr = '^';
// Items
(pathChain.forEach(function(chunk, i) {
if(i!==0) {
searchExpr += '\\/';
}
if(chunk[0] === ':') {
searchExpr += '[^\\/?]*';
params[chunk.substring(1)] = new RegExp(searchExpr);
} else {
searchExpr += chunk;
}
}));
// End
searchExpr += '[\\/]?$';
this._patterns[i] = new RegExp(searchExpr);
this._refs[i] = ref;
this._params[i] = params;
};
/**
* Find a reference according to a URL pattern and retrieve params defined in URL
*
* @param {String} url A URL to test for
* @param {Object} defaults A data Object of default parameter values
* @return {Object} A reference to a stored object
*/
UrlDictionary.prototype.lookup = function(url, defaults) {
url = url || '';
var p = Url(url).path();
var q = Url(url).queryparams();
var _self = this;
// Check dictionary
var _findPattern = function(check) {
check = check || '';
for(var i=_self._patterns.length-1; i>=0; i--) {
if(check.match(_self._patterns[i]) !== null) {
return i;
}
}
return -1;
};
var i = _findPattern(p);
// Matching pattern found
if(i !== -1) {
// Retrieve params in pattern match
var params = {};
for(var n in this._params[i]) {
var paramParser = this._params[i][n];
var urlMatch = (url.match(paramParser) || []).pop() || '';
var varMatch = urlMatch.split('/').pop();
params[n] = varMatch;
}
// Retrieve params in querystring match
params = angular.extend(q, params);
return {
url: url,
ref: this._refs[i],
params: params
};
// Not in dictionary
} else {
return null;
}
};
module.exports = UrlDictionary;