steal('jquery').then(function ($){ var regs = { undHash: /_|-/, colons: /::/, words: /([A-Z]+)([A-Z][a-z])/g, lowUp: /([a-z\d])([A-Z])/g, dash: /([a-z\d])([A-Z])/g, replacer: /\{([^\}]+)\}/g, dot: /\./} , getNext = function (current, nextPart, add){ return current[nextPart] !== undefined? current[nextPart]: (add && (current[nextPart] = { } )); } , isContainer = function (current){ var type = typeof current; return current && (type == 'function' || type == 'object'); } , getObject, str = $.String = $.extend($.String || { } , { getObject: getObject = function (name, roots, add){ var parts = name? name.split(regs.dot): [] , length = _AN_Read_length('length', parts), current, ret, i, r = 0, type; roots = $.isArray(roots)? roots: [roots || window] ; if (length == 0) { return roots[0]; } while (current = roots[r++ ]){ for (i = 0; i < length - 1 && isContainer(current); i++ ){ current = getNext(current, parts[i], add); } if (isContainer(current)) { ret = getNext(current, parts[i], add); if (ret !== undefined) { if (add === false ) { delete current[parts[i]]; } return ret; } } } } , capitalize: function (s, cache){ return s.charAt(0).toUpperCase() + s.substr(1); } , classize: function (s, join){ var parts = s.split(regs.undHash), i = 0; for (; i < _AN_Read_length('length', parts); i++ ){ parts[i] = str.capitalize(parts[i]); } return parts.join(join || ''); } , underscore: function (s){ return _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', s, regs.colons, '/'), regs.words, '$1_$2'), regs.lowUp, '$1_$2'), regs.dash, '_').toLowerCase(); } , sub: function (s, data, remove){ var obs = [] , remove = typeof remove == 'boolean'? !remove: remove; obs.push(_AN_Call_replace('replace', s, regs.replacer, function (whole, inside){ var ob = getObject(inside, data, remove); if (isContainer(ob)) { obs.push(ob); return ""; } else { return "" + ob; } } )); return _AN_Read_length("length", obs) <= 1? obs[0]: obs; } , _regs: regs} ); } );