angular-state-router
Version:
An AngularJS state-based router designed for flexibility and ease of use.
104 lines (77 loc) • 2.31 kB
JavaScript
;
// Parse Object literal name-value pairs
var reParseObjectLiteral = /([,{]\s*(("|')(.*?)\3|\w*)|(:\s*([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*)(?:[eE][+-]?\d+)?|true|false|null|("|')(.*?)\7|\[[^\]]*\])))/g;
// Match Strings
var reString = /^("|')(.*?)\1$/;
// TODO Add escaped string quotes \' and \" to string matcher
// Match Number (int/float/exponential)
var reNumber = /^[+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*)(?:[eE][+-]?\d+)?$/;
/**
* Parse string value into Boolean/Number/Array/String/null.
*
* Strings are surrounded by a pair of matching quotes
*
* @param {String} value A String value to parse
* @return {Mixed} A Boolean/Number/Array/String/null
*/
var _resolveValue = function(value) {
// Boolean: true
if(value === 'true') {
return true;
// Boolean: false
} else if(value === 'false') {
return false;
// Null
} else if(value === 'null') {
return null;
// String
} else if(value.match(reString)) {
return value.substr(1, value.length-2);
// Number
} else if(value.match(reNumber)) {
return +value;
// NaN
} else if(value === 'NaN') {
return NaN;
// TODO add matching with Arrays and parse
}
// Unable to resolve
return value;
};
// Find values in an object literal
var _listify = function(str) {
// Trim
str = str.replace(/^\s*/, '').replace(/\s*$/, '');
if(str.match(/^\s*{.*}\s*$/) === null) {
throw new Error('Parameters expects an Object');
}
var sanitizeName = function(name) {
return name.replace(/^[\{,]?\s*["']?/, '').replace(/["']?\s*$/, '');
};
var sanitizeValue = function(value) {
var str = value.replace(/^(:)?\s*/, '').replace(/\s*$/, '');
return _resolveValue(str);
};
return str.match(reParseObjectLiteral).map(function(item, i, list) {
return i%2 === 0 ? sanitizeName(item) : sanitizeValue(item);
});
};
/**
* Create a params Object from string
*
* @param {String} str A stringified version of Object literal
*/
var Parameters = function(str) {
str = str || '';
// Instance
var _self = {};
_listify(str).forEach(function(item, i, list) {
if(i%2 === 0) {
_self[item] = list[i+1];
}
});
return _self;
};
module.exports = Parameters;
module.exports.resolveValue = _resolveValue;
module.exports.listify = _listify;