117 lines
2.6 KiB
JavaScript
117 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
;!function(undefined) {
|
|
var r = {
|
|
'\'': /\\\'/g,
|
|
'"': /\\\"/g,
|
|
};
|
|
|
|
var ObjectPath = {
|
|
parse: function(str){
|
|
if(typeof str !== 'string'){
|
|
throw new TypeError('ObjectPath.parse must be passed a string');
|
|
}
|
|
|
|
var i = 0;
|
|
var parts = [];
|
|
var d, b, q, c;
|
|
while (i < str.length){
|
|
d = str.indexOf('.', i);
|
|
b = str.indexOf('[', i);
|
|
|
|
// we've reached the end
|
|
if (d === -1 && b === -1){
|
|
parts.push(str.slice(i, str.length));
|
|
i = str.length;
|
|
}
|
|
|
|
// dots
|
|
else if (b === -1 || (d !== -1 && d < b)) {
|
|
parts.push(str.slice(i, d));
|
|
i = d + 1;
|
|
}
|
|
|
|
// brackets
|
|
else {
|
|
if (b > i){
|
|
parts.push(str.slice(i, b));
|
|
i = b;
|
|
}
|
|
q = str.slice(b+1, b+2);
|
|
if (q !== '"' && q !=='\'') {
|
|
c = str.indexOf(']', b);
|
|
if (c === -1) c = str.length;
|
|
parts.push(str.slice(i + 1, c));
|
|
i = (str.slice(c + 1, c + 2) === '.') ? c + 2 : c + 1;
|
|
} else {
|
|
c = str.indexOf(q+']', b);
|
|
if (c === -1) c = str.length;
|
|
while (str.slice(c - 1, c) === '\\' && b < str.length){
|
|
b++;
|
|
c = str.indexOf(q+']', b);
|
|
}
|
|
parts.push(str.slice(i + 2, c).replace(r[q], q));
|
|
i = (str.slice(c + 2, c + 3) === '.') ? c + 3 : c + 2;
|
|
}
|
|
}
|
|
}
|
|
return parts;
|
|
},
|
|
|
|
// root === true : auto calculate root; must be dot-notation friendly
|
|
// root String : the string to use as root
|
|
stringify: function(arr, quote){
|
|
|
|
if(!Array.isArray(arr))
|
|
arr = [arr.toString()];
|
|
|
|
quote = quote === '"' ? '"' : '\'';
|
|
|
|
return arr.map(function(n){ return '[' + quote + (n.toString()).replace(new RegExp(quote, 'g'), '\\' + quote) + quote + ']'; }).join('');
|
|
},
|
|
|
|
normalize: function(data, quote){
|
|
return ObjectPath.stringify(Array.isArray(data) ? data : ObjectPath.parse(data), quote);
|
|
},
|
|
|
|
// Angular
|
|
registerModule: function(angular) {
|
|
angular.module('ObjectPath', []).provider('ObjectPath', function(){
|
|
this.parse = ObjectPath.parse;
|
|
this.stringify = ObjectPath.stringify;
|
|
this.normalize = ObjectPath.normalize;
|
|
this.$get = function(){
|
|
return ObjectPath;
|
|
};
|
|
});
|
|
}
|
|
};
|
|
|
|
// AMD
|
|
if (typeof define === 'function' && define.amd) {
|
|
define(function() {
|
|
return {
|
|
|
|
// this is only namespaced for backwards compatibility when fixing issue #8
|
|
ObjectPath: ObjectPath,
|
|
|
|
// export these as top-level functions
|
|
parse: ObjectPath.parse,
|
|
stringify: ObjectPath.stringify,
|
|
normalize: ObjectPath.normalize
|
|
};
|
|
});
|
|
}
|
|
|
|
// CommonJS
|
|
else if (typeof exports === 'object') {
|
|
exports.ObjectPath = ObjectPath;
|
|
}
|
|
|
|
// Browser global
|
|
else {
|
|
window.ObjectPath = ObjectPath;
|
|
}
|
|
|
|
}();
|