UNPKG

angular-state-router

Version:

An AngularJS state-based router designed for flexibility and ease of use.

116 lines (93 loc) 2.38 kB
'use strict'; 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;