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));
							 |