forked from coolaj86/walnut.js
		
	
		
			
				
	
	
		
			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));
 |