101 lines
2.6 KiB
JavaScript
101 lines
2.6 KiB
JavaScript
|
/*jshint -W054 */
|
||
|
(function (exports) {
|
||
|
'use strict';
|
||
|
var _p
|
||
|
;
|
||
|
|
||
|
function deepCopy(orig, recase) {
|
||
|
var toReturn
|
||
|
;
|
||
|
|
||
|
recase = recase || function (key) { return key; };
|
||
|
|
||
|
if (Array.isArray(orig)) {
|
||
|
toReturn = [];
|
||
|
orig.forEach(function (val, i) {
|
||
|
toReturn[i] = deepCopy(val, recase);
|
||
|
});
|
||
|
return toReturn;
|
||
|
} else if (orig instanceof Date) {
|
||
|
return new Date(orig);
|
||
|
} else if (null !== orig && "object" === (typeof orig)) {
|
||
|
toReturn = {};
|
||
|
Object.keys(orig).forEach( function (key) {
|
||
|
var rkey = recase(key)
|
||
|
;
|
||
|
|
||
|
toReturn[rkey] = deepCopy(orig[key], recase);
|
||
|
});
|
||
|
return toReturn;
|
||
|
} else {
|
||
|
return orig;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function Recase(opts) {
|
||
|
opts = opts || opts;
|
||
|
var me = this
|
||
|
;
|
||
|
|
||
|
if (!(me instanceof Recase)) {
|
||
|
return new Recase(opts);
|
||
|
}
|
||
|
|
||
|
//me._from = opts.from
|
||
|
me._exceptions = opts.exceptions || { 'xml_http_request': 'XMLHttpRequest' };
|
||
|
Object.keys(me._exceptions).forEach(function (k) {
|
||
|
var v = me._exceptions[k]
|
||
|
;
|
||
|
|
||
|
me._exceptions[v] = k;
|
||
|
});
|
||
|
|
||
|
me._snakifyBound = me.snakify.bind(this);
|
||
|
me._camelizeBound = me.camelize.bind(this);
|
||
|
}
|
||
|
Recase.create = Recase.Recase = Recase;
|
||
|
|
||
|
_p = Recase.prototype;
|
||
|
|
||
|
// _abc -> _abc
|
||
|
// abcXyz -> abc_xyz
|
||
|
// $AbcXyz -> $abc_xyz // TODO
|
||
|
_p.snakify = function(key) {
|
||
|
// from camel to snake
|
||
|
//var first_ = '_' === key[0] ? '_' : '';
|
||
|
|
||
|
return this._exceptions[key]
|
||
|
||
|
||
|
//(first_ + key.trim().replace(/(^|[a-z\d])([A-Z])/g, '$1_$2')/*.replace(/[-\s]+/g, '_')*/.toLowerCase())
|
||
|
//(key.replace(/^_/,'**kirby**').replace(/([A-Z])/g, '_$1').replace('**kirby**', '_').toLowerCase())
|
||
|
(key/*.replace(/^([A-Z])/g, '$$$1')*/.replace(/([A-Z])/g, '_$1').toLowerCase())
|
||
|
;
|
||
|
};
|
||
|
|
||
|
_p.camelize = function (key) {
|
||
|
// from camel to snake
|
||
|
return this._exceptions[key]
|
||
|
||
|
||
|
//key.trim().replace(/[-_\s]+(.)?/g, function(match, c){ return c ? c.toUpperCase() : "_"; })
|
||
|
//key.replace(/^_/,'**kirby**').replace(/_([^_])/g, function(match, c) {
|
||
|
key.replace(/^(_+)/,'*$1*').replace(/_([a-z])/g, function(match, c) {
|
||
|
if (c === c.toUpperCase()) {
|
||
|
return c;
|
||
|
}
|
||
|
return c.toUpperCase();
|
||
|
}).replace(/^\*(_+)\*/,'$1')
|
||
|
;
|
||
|
};
|
||
|
|
||
|
_p.snakeCopy = function (orig) {
|
||
|
return deepCopy(orig, this._snakifyBound);
|
||
|
};
|
||
|
|
||
|
_p.camelCopy = function (orig) {
|
||
|
return deepCopy(orig, this._camelizeBound);
|
||
|
};
|
||
|
|
||
|
exports.Recase = Recase;
|
||
|
if ('undefined' !== typeof module) { module.exports = Recase; }
|
||
|
}('undefined' !== typeof exports && exports || 'undefined' !== typeof window && window || global));
|