diff --git a/.npmignore b/.npmignore new file mode 100644 index 000000000..f5717584f --- /dev/null +++ b/.npmignore @@ -0,0 +1,4 @@ +test/ +underscore-min.js +Rakefile +docs/ \ No newline at end of file diff --git a/docs/docco.css b/docs/docco.css index 5aa0a8d73..20f2753d4 100644 --- a/docs/docco.css +++ b/docs/docco.css @@ -115,7 +115,7 @@ table td { } pre, tt, code { font-size: 12px; line-height: 18px; - font-family: Monaco, Consolas, "Lucida Console", monospace; + font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace; margin: 0; padding: 0; } diff --git a/docs/underscore.html b/docs/underscore.html index cbce926c5..4fd55a0ba 100644 --- a/docs/underscore.html +++ b/docs/underscore.html @@ -1,11 +1,11 @@ - underscore.js

underscore.js

Underscore.js 1.1.4
+      underscore.js           
};};hasher=hasher||_.identity;returnfunction(){varkey=hasher.apply(this,arguments); - returnkeyinmemo?memo[key]:(memo[key]=func.apply(this,arguments)); + returnhasOwnProperty.call(memo,key)?memo[key]:(memo[key]=func.apply(this,arguments));};};}returnargs[0];}; - };+"');}return __p.join('');";varfunc=newFunction('obj',tmpl);returndata?func(data):func; - };

underscore.js

Underscore.js 1.1.5
 (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
 Underscore is freely distributable under the MIT license.
 Portions of Underscore are inspired or borrowed from Prototype,
 Oliver Steele's Functional, and John Resig's Micro-Templating.
 For all details and documentation:
 http://documentcloud.github.com/underscore
-
(function() {

Baseline setup

Establish the root object, window in the browser, or global on the server.

  var root = this;

Save the previous value of the _ variable.

  var previousUnderscore = root._;

Establish the object that gets returned to break out of a loop iteration.

  var breaker = {};

Save bytes in the minified (but not gzipped) version:

  var ArrayProto = Array.prototype, ObjProto = Object.prototype;

Create quick reference variables for speed access to core prototypes.

  var slice            = ArrayProto.slice,
+
(function() {

Baseline setup

Establish the root object, window in the browser, or global on the server.

  var root = this;

Save the previous value of the _ variable.

  var previousUnderscore = root._;

Establish the object that gets returned to break out of a loop iteration.

  var breaker = {};

Save bytes in the minified (but not gzipped) version:

  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;

Create quick reference variables for speed access to core prototypes.

  var slice            = ArrayProto.slice,
       unshift          = ArrayProto.unshift,
       toString         = ObjProto.toString,
       hasOwnProperty   = ObjProto.hasOwnProperty;

All ECMAScript 5 native function implementations that we hope to use @@ -20,17 +20,17 @@ are declared here.

nativeIndexOf = ArrayProto.indexOf, nativeLastIndexOf = ArrayProto.lastIndexOf, nativeIsArray = Array.isArray, - nativeKeys = Object.keys;

Create a safe reference to the Underscore object for use below.

  var _ = function(obj) { return new wrapper(obj); };

Export the Underscore object for CommonJS, with backwards-compatibility + nativeKeys = Object.keys, + nativeBind = FuncProto.bind;

Create a safe reference to the Underscore object for use below.

  var _ = function(obj) { return new wrapper(obj); };

Export the Underscore object for CommonJS, with backwards-compatibility for the old require() API. If we're not in CommonJS, add _ to the global object.

  if (typeof module !== 'undefined' && module.exports) {
     module.exports = _;
     _._ = _;
   } else {
     root._ = _;
-  }

Current version.

  _.VERSION = '1.1.4';

Collection Functions

The cornerstone, an each implementation, aka forEach. + }

Current version.

  _.VERSION = '1.1.5';

Collection Functions

The cornerstone, an each implementation, aka forEach. Handles objects implementing forEach, arrays, and raw objects. Delegates to ECMAScript 5's native forEach if available.

  var each = _.each = _.forEach = function(obj, iterator, context) {
-    var value;
     if (obj == null) return;
     if (nativeForEach && obj.forEach === nativeForEach) {
       obj.forEach(iterator, context);
@@ -191,12 +191,12 @@ be inserted so as to maintain order. Uses binary search.

Array Functions

Get the first element of an array. Passing n will return the first N values in the array. Aliased as head. The guard check allows it to work with _.map.

  _.first = _.head = function(array, n, guard) {
-    return n && !guard ? slice.call(array, 0, n) : array[0];
+    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
   };

Returns everything but the first entry of the array. Aliased as tail. Especially useful on the arguments object. Passing an index will return the rest of the values in the array from that index onward. The guard check allows it to work with _.map.

  _.rest = _.tail = function(array, index, guard) {
-    return slice.call(array, _.isUndefined(index) || guard ? 1 : index);
+    return slice.call(array, (index == null) || guard ? 1 : index);
   };

Get the last element of an array.

  _.last = function(array) {
     return array[array.length - 1];
   };

Trim out all falsy values from an array.

  _.compact = function(array) {
@@ -239,12 +239,13 @@ Delegates to ECMAScript 5's native indexOf if avai
 If the array is large and already in sort order, pass true
 for isSorted to use binary search.

  _.indexOf = function(array, item, isSorted) {
     if (array == null) return -1;
+    var i, l;
     if (isSorted) {
-      var i = _.sortedIndex(array, item);
+      i = _.sortedIndex(array, item);
       return array[i] === item ? i : -1;
     }
     if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
-    for (var i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
+    for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
     return -1;
   };

Delegates to ECMAScript 5's native lastIndexOf if available.

  _.lastIndexOf = function(array, item) {
     if (array == null) return -1;
@@ -255,24 +256,29 @@ for isSorted to use binary search.

Generate an integer Array containing an arithmetic progression. A port of the native Python range() function. See the Python documentation.

  _.range = function(start, stop, step) {
-    var args  = slice.call(arguments),
-        solo  = args.length <= 1,
-        start = solo ? 0 : args[0],
-        stop  = solo ? args[0] : args[1],
-        step  = args[2] || 1,
-        len   = Math.max(Math.ceil((stop - start) / step), 0),
-        idx   = 0,
-        range = new Array(len);
-    while (idx < len) {
+    if (arguments.length <= 1) {
+      stop = start || 0;
+      start = 0;
+    }
+    step = arguments[2] || 1;
+
+    var len = Math.max(Math.ceil((stop - start) / step), 0);
+    var idx = 0;
+    var range = new Array(len);
+
+    while(idx < len) {
       range[idx++] = start;
       start += step;
     }
+
     return range;
   };

Function (ahem) Functions

Create a function bound to a given object (assigning this, and arguments, -optionally). Binding with arguments is also known as curry.

  _.bind = function(func, obj) {
+optionally). Binding with arguments is also known as curry.
+Delegates to ECMAScript 5's native Function.bind if available.

  _.bind = function(func, obj) {
+    if (nativeBind && func.bind === nativeBind) return func.bind.apply(func, slice.call(arguments, 1));
     var args = slice.call(arguments, 2);
     return function() {
-      return func.apply(obj || {}, args.concat(slice.call(arguments)));
+      return func.apply(obj, args.concat(slice.call(arguments)));
     };
   };

Bind all of an object's methods to that object. Useful for ensuring that all callbacks defined on an object belong to it.

  _.bindAll = function(obj) {
@@ -285,7 +291,7 @@ all callbacks defined on an object belong to it.

Delays a function for the given number of milliseconds, and then calls it with the arguments supplied.

  _.delay = function(func, wait) {
@@ -312,14 +318,22 @@ during a given window of time.

  _.debounce = function(func, wait) {
     return limit(func, wait, true);
-  };

Returns the first function passed as an argument to the second, + };

Returns a function that will be executed at most one time, no matter how +often you call it. Useful for lazy initialization.

  _.once = function(func) {
+    var ran = false, memo;
+    return function() {
+      if (ran) return memo;
+      ran = true;
+      return memo = func.apply(this, arguments);
+    };
+  };

Returns the first function passed as an argument to the second, allowing you to adjust arguments, run code before and after, and conditionally execute the original function.

  _.wrap = function(func, wrapper) {
     return function() {
       var args = [func].concat(slice.call(arguments));
       return wrapper.apply(this, args);
     };
-  };

Returns a function that is the composition of a list of functions, each + };

Returns a function that is the composition of a list of functions, each consuming the return value of the function that follows.

  _.compose = function() {
     var funcs = slice.call(arguments);
     return function() {
@@ -329,90 +343,95 @@ consuming the return value of the function that follows.

Object Functions

Retrieve the names of an object's properties. + };

Object Functions

Retrieve the names of an object's properties. Delegates to ECMAScript 5's native Object.keys

  _.keys = nativeKeys || function(obj) {
-    if (_.isArray(obj)) return _.range(0, obj.length);
+    if (obj !== Object(obj)) throw new TypeError('Invalid object');
     var keys = [];
     for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key;
     return keys;
-  };

Retrieve the values of an object's properties.

  _.values = function(obj) {
+  };

Retrieve the values of an object's properties.

  _.values = function(obj) {
     return _.map(obj, _.identity);
-  };

Return a sorted list of the function names available on the object. + };

Return a sorted list of the function names available on the object. Aliased as methods

  _.functions = _.methods = function(obj) {
     return _.filter(_.keys(obj), function(key){ return _.isFunction(obj[key]); }).sort();
-  };

Extend a given object with all the properties in passed-in object(s).

  _.extend = function(obj) {
+  };

Extend a given object with all the properties in passed-in object(s).

  _.extend = function(obj) {
     each(slice.call(arguments, 1), function(source) {
       for (var prop in source) obj[prop] = source[prop];
     });
     return obj;
-  };

Create a (shallow-cloned) duplicate of an object.

  _.clone = function(obj) {
+  };

Fill in a given object with default properties.

  _.defaults = function(obj) {
+    each(slice.call(arguments, 1), function(source) {
+      for (var prop in source) if (obj[prop] == null) obj[prop] = source[prop];
+    });
+    return obj;
+  };

Create a (shallow-cloned) duplicate of an object.

  _.clone = function(obj) {
     return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
-  };

Invokes interceptor with the obj, and then returns obj. + };

Invokes interceptor with the obj, and then returns obj. The primary purpose of this method is to "tap into" a method chain, in order to perform operations on intermediate results within the chain.

  _.tap = function(obj, interceptor) {
     interceptor(obj);
     return obj;
-  };

Perform a deep comparison to check if two objects are equal.

  _.isEqual = function(a, b) {

Check object identity.

    if (a === b) return true;

Different types?

    var atype = typeof(a), btype = typeof(b);
-    if (atype != btype) return false;

Basic equality test (watch out for coercions).

    if (a == b) return true;

One is falsy and the other truthy.

    if ((!a && b) || (a && !b)) return false;

Unwrap any wrapped objects.

    if (a._chain) a = a._wrapped;
-    if (b._chain) b = b._wrapped;

One of them implements an isEqual()?

    if (a.isEqual) return a.isEqual(b);

Check dates' integer values.

    if (_.isDate(a) && _.isDate(b)) return a.getTime() === b.getTime();

Both are NaN?

    if (_.isNaN(a) && _.isNaN(b)) return false;

Compare regular expressions.

    if (_.isRegExp(a) && _.isRegExp(b))
+  };

Perform a deep comparison to check if two objects are equal.

  _.isEqual = function(a, b) {

Check object identity.

    if (a === b) return true;

Different types?

    var atype = typeof(a), btype = typeof(b);
+    if (atype != btype) return false;

Basic equality test (watch out for coercions).

    if (a == b) return true;

One is falsy and the other truthy.

    if ((!a && b) || (a && !b)) return false;

Unwrap any wrapped objects.

    if (a._chain) a = a._wrapped;
+    if (b._chain) b = b._wrapped;

One of them implements an isEqual()?

    if (a.isEqual) return a.isEqual(b);

Check dates' integer values.

    if (_.isDate(a) && _.isDate(b)) return a.getTime() === b.getTime();

Both are NaN?

    if (_.isNaN(a) && _.isNaN(b)) return false;

Compare regular expressions.

    if (_.isRegExp(a) && _.isRegExp(b))
       return a.source     === b.source &&
              a.global     === b.global &&
              a.ignoreCase === b.ignoreCase &&
-             a.multiline  === b.multiline;

If a is not an object by this point, we can't handle it.

    if (atype !== 'object') return false;

Check for different array lengths before comparing contents.

    if (a.length && (a.length !== b.length)) return false;

Nothing else worked, deep compare the contents.

    var aKeys = _.keys(a), bKeys = _.keys(b);

Different object sizes?

    if (aKeys.length != bKeys.length) return false;

Recursive comparison of contents.

    for (var key in a) if (!(key in b) || !_.isEqual(a[key], b[key])) return false;
+             a.multiline  === b.multiline;

If a is not an object by this point, we can't handle it.

    if (atype !== 'object') return false;

Check for different array lengths before comparing contents.

    if (a.length && (a.length !== b.length)) return false;

Nothing else worked, deep compare the contents.

    var aKeys = _.keys(a), bKeys = _.keys(b);

Different object sizes?

    if (aKeys.length != bKeys.length) return false;

Recursive comparison of contents.

    for (var key in a) if (!(key in b) || !_.isEqual(a[key], b[key])) return false;
     return true;
-  };

Is a given array or object empty?

  _.isEmpty = function(obj) {
+  };

Is a given array or object empty?

  _.isEmpty = function(obj) {
     if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
     for (var key in obj) if (hasOwnProperty.call(obj, key)) return false;
     return true;
-  };

Is a given value a DOM element?

  _.isElement = function(obj) {
+  };

Is a given value a DOM element?

  _.isElement = function(obj) {
     return !!(obj && obj.nodeType == 1);
-  };

Is a given value an array? + };

Is a given value an array? Delegates to ECMA5's native Array.isArray

  _.isArray = nativeIsArray || function(obj) {
     return toString.call(obj) === '[object Array]';
-  };

Is a given variable an arguments object?

  _.isArguments = function(obj) {
+  };

Is a given variable an arguments object?

  _.isArguments = function(obj) {
     return !!(obj && hasOwnProperty.call(obj, 'callee'));
-  };

Is a given value a function?

  _.isFunction = function(obj) {
+  };

Is a given value a function?

  _.isFunction = function(obj) {
     return !!(obj && obj.constructor && obj.call && obj.apply);
-  };

Is a given value a string?

  _.isString = function(obj) {
+  };

Is a given value a string?

  _.isString = function(obj) {
     return !!(obj === '' || (obj && obj.charCodeAt && obj.substr));
-  };

Is a given value a number?

  _.isNumber = function(obj) {
+  };

Is a given value a number?

  _.isNumber = function(obj) {
     return !!(obj === 0 || (obj && obj.toExponential && obj.toFixed));
-  };

Is the given value NaN? NaN happens to be the only value in JavaScript + };

Is the given value NaN? NaN happens to be the only value in JavaScript that does not equal itself.

  _.isNaN = function(obj) {
     return obj !== obj;
-  };

Is a given value a boolean?

  _.isBoolean = function(obj) {
+  };

Is a given value a boolean?

  _.isBoolean = function(obj) {
     return obj === true || obj === false;
-  };

Is a given value a date?

  _.isDate = function(obj) {
+  };

Is a given value a date?

  _.isDate = function(obj) {
     return !!(obj && obj.getTimezoneOffset && obj.setUTCFullYear);
-  };

Is the given value a regular expression?

  _.isRegExp = function(obj) {
+  };

Is the given value a regular expression?

  _.isRegExp = function(obj) {
     return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
-  };

Is a given value equal to null?

  _.isNull = function(obj) {
+  };

Is a given value equal to null?

  _.isNull = function(obj) {
     return obj === null;
-  };

Is a given variable undefined?

  _.isUndefined = function(obj) {
+  };

Is a given variable undefined?

  _.isUndefined = function(obj) {
     return obj === void 0;
-  };

Utility Functions

Run Underscore.js in noConflict mode, returning the _ variable to its + };

Utility Functions

Run Underscore.js in noConflict mode, returning the _ variable to its previous owner. Returns a reference to the Underscore object.

  _.noConflict = function() {
     root._ = previousUnderscore;
     return this;
-  };

Keep the identity function around for default iterators.

  _.identity = function(value) {
+  };

Keep the identity function around for default iterators.

  _.identity = function(value) {
     return value;
-  };

Run a function n times.

  _.times = function (n, iterator, context) {
+  };

Run a function n times.

  _.times = function (n, iterator, context) {
     for (var i = 0; i < n; i++) iterator.call(context, i);
-  };

Add your own custom functions to the Underscore object, ensuring that + };

Add your own custom functions to the Underscore object, ensuring that they're correctly added to the OOP wrapper as well.

  _.mixin = function(obj) {
     each(_.functions(obj), function(name){
       addToWrapper(name, _[name] = obj[name]);
     });
-  };

Generate a unique integer id (unique within the entire client session). + };

Generate a unique integer id (unique within the entire client session). Useful for temporary DOM ids.

  var idCounter = 0;
   _.uniqueId = function(prefix) {
     var id = idCounter++;
     return prefix ? prefix + id : id;
-  };

By default, Underscore uses ERB-style template delimiters, change the + };

By default, Underscore uses ERB-style template delimiters, change the following template settings to use alternative delimiters.

  _.templateSettings = {
     evaluate    : /<%([\s\S]+?)%>/g,
     interpolate : /<%=([\s\S]+?)%>/g
-  };

JavaScript micro-templating, similar to John Resig's implementation. + };

JavaScript micro-templating, similar to John Resig's implementation. Underscore templating handles arbitrary delimiters, preserves whitespace, and correctly escapes quotes within interpolated code.

  _.template = function(str, data) {
     var c  = _.templateSettings;
@@ -433,31 +452,31 @@ and correctly escapes quotes within interpolated code.

The OOP Wrapper

If Underscore is called as a function, it returns a wrapped object that + };

The OOP Wrapper

If Underscore is called as a function, it returns a wrapped object that can be used OO-style. This wrapper holds altered versions of all the -underscore functions. Wrapped objects may be chained.

  var wrapper = function(obj) { this._wrapped = obj; };

Expose wrapper.prototype as _.prototype

  _.prototype = wrapper.prototype;

Helper function to continue chaining intermediate results.

  var result = function(obj, chain) {
+underscore functions. Wrapped objects may be chained.

  var wrapper = function(obj) { this._wrapped = obj; };

Expose wrapper.prototype as _.prototype

  _.prototype = wrapper.prototype;

Helper function to continue chaining intermediate results.

  var result = function(obj, chain) {
     return chain ? _(obj).chain() : obj;
-  };

A method to easily add functions to the OOP wrapper.

  var addToWrapper = function(name, func) {
+  };

A method to easily add functions to the OOP wrapper.

  var addToWrapper = function(name, func) {
     wrapper.prototype[name] = function() {
       var args = slice.call(arguments);
       unshift.call(args, this._wrapped);
       return result(func.apply(_, args), this._chain);
     };
-  };

Add all of the Underscore functions to the wrapper object.

  _.mixin(_);

Add all mutator Array functions to the wrapper.

  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+  };

Add all of the Underscore functions to the wrapper object.

  _.mixin(_);

Add all mutator Array functions to the wrapper.

  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
     var method = ArrayProto[name];
     wrapper.prototype[name] = function() {
       method.apply(this._wrapped, arguments);
       return result(this._wrapped, this._chain);
     };
-  });

Add all accessor Array functions to the wrapper.

  each(['concat', 'join', 'slice'], function(name) {
+  });

Add all accessor Array functions to the wrapper.

  each(['concat', 'join', 'slice'], function(name) {
     var method = ArrayProto[name];
     wrapper.prototype[name] = function() {
       return result(method.apply(this._wrapped, arguments), this._chain);
     };
-  });

Start chaining a wrapped Underscore object.

  wrapper.prototype.chain = function() {
+  });

Start chaining a wrapped Underscore object.

  wrapper.prototype.chain = function() {
     this._chain = true;
     return this;
-  };

Extracts the result from a wrapped and chained object.

  wrapper.prototype.value = function() {
+  };

Extracts the result from a wrapped and chained object.

  wrapper.prototype.value = function() {
     return this._wrapped;
   };
 
diff --git a/index.html b/index.html
index 1d87bdd13..55d90d816 100644
--- a/index.html
+++ b/index.html
@@ -118,11 +118,11 @@
 
     
-        
-        
+        
+        
-        
+        
Development Version (1.1.4)27kb, Uncompressed with CommentsDevelopment Version (1.1.5)28kb, Uncompressed with Comments
Production Version (1.1.4)Production Version (1.1.5) 3kb, Minified and Gzipped
@@ -1223,7 +1223,20 @@ _([1, 2, 3]).value(); Python's itertools.

-

Change Log

+

Change Log

+ +

+ 1.1.5Mar 20, 2011
+ Added an _.defaults function, for use merging together JS objects + representing default options. + Added an _.once function, for manufacturing functions that should + only ever execute a single time. + _.bind now delegates to the native ECMAScript 5 version, + where available. + _.keys now throws an error when used on non-Object values, as in + ECMAScript 5. + Fixed a bug with _.keys when used over sparse arrays. +

1.1.4Jan 9, 2011
diff --git a/package.json b/package.json index d5c924d0b..f82099236 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name" : "underscore", - "description" : "Functional programming aid for JavaScript. Works well with jQuery.", - "url" : "http://documentcloud.github.com/underscore/", + "description" : "JavaScript's functional programming helper library.", + "homepage" : "http://documentcloud.github.com/underscore/", "keywords" : ["util", "functional", "server", "client", "browser"], "author" : "Jeremy Ashkenas ", "contributors" : [], "dependencies" : [], - "lib" : ".", + "repository" : {"type": "git", "url": "git://github.com/documentcloud/underscore.git"}, "main" : "underscore.js", - "version" : "1.1.4" + "version" : "1.1.5" } diff --git a/underscore-min.js b/underscore-min.js index 9ac21fa26..3de58cdff 100644 --- a/underscore-min.js +++ b/underscore-min.js @@ -1,25 +1,26 @@ -// Underscore.js 1.1.4 +// Underscore.js 1.1.5 // (c) 2011 Jeremy Ashkenas, DocumentCloud Inc. // Underscore is freely distributable under the MIT license. // Portions of Underscore are inspired or borrowed from Prototype, // Oliver Steele's Functional, and John Resig's Micro-Templating. // For all details and documentation: // http://documentcloud.github.com/underscore -(function(){var q=this,C=q._,m={},j=Array.prototype,n=Object.prototype,i=j.slice,D=j.unshift,E=n.toString,o=n.hasOwnProperty,s=j.forEach,t=j.map,u=j.reduce,v=j.reduceRight,w=j.filter,x=j.every,y=j.some,p=j.indexOf,z=j.lastIndexOf;n=Array.isArray;var F=Object.keys,c=function(a){return new l(a)};if(typeof module!=="undefined"&&module.exports){module.exports=c;c._=c}else q._=c;c.VERSION="1.1.4";var k=c.each=c.forEach=function(a,b,d){if(a!=null)if(s&&a.forEach===s)a.forEach(b,d);else if(c.isNumber(a.length))for(var e= -0,f=a.length;e=e.computed&&(e={value:f,computed:g})}); -return e.value};c.min=function(a,b,d){if(!b&&c.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};k(a,function(f,g,h){g=b?b.call(d,f,g,h):f;gh?1:0}),"value")};c.sortedIndex=function(a,b,d){d=d||c.identity;for(var e=0,f=a.length;e>1;d(a[g])=0})})};c.zip=function(){for(var a=i.call(arguments), -b=c.max(c.pluck(a,"length")),d=Array(b),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}};c.keys=F||function(a){if(c.isArray(a))return c.range(0,a.length);var b=[],d;for(d in a)if(o.call(a,d))b[b.length]=d;return b};c.values=function(a){return c.map(a,c.identity)};c.functions=c.methods=function(a){return c.filter(c.keys(a),function(b){return c.isFunction(a[b])}).sort()};c.extend=function(a){k(i.call(arguments,1),function(b){for(var d in b)a[d]= -b[d]});return a};c.clone=function(a){return c.isArray(a)?a.slice():c.extend({},a)};c.tap=function(a,b){b(a);return a};c.isEqual=function(a,b){if(a===b)return true;var d=typeof a;if(d!=typeof b)return false;if(a==b)return true;if(!a&&b||a&&!b)return false;if(a._chain)a=a._wrapped;if(b._chain)b=b._wrapped;if(a.isEqual)return a.isEqual(b);if(c.isDate(a)&&c.isDate(b))return a.getTime()===b.getTime();if(c.isNaN(a)&&c.isNaN(b))return false;if(c.isRegExp(a)&&c.isRegExp(b))return a.source===b.source&&a.global=== -b.global&&a.ignoreCase===b.ignoreCase&&a.multiline===b.multiline;if(d!=="object")return false;if(a.length&&a.length!==b.length)return false;d=c.keys(a);var e=c.keys(b);if(d.length!=e.length)return false;for(var f in a)if(!(f in b)||!c.isEqual(a[f],b[f]))return false;return true};c.isEmpty=function(a){if(c.isArray(a)||c.isString(a))return a.length===0;for(var b in a)if(o.call(a,b))return false;return true};c.isElement=function(a){return!!(a&&a.nodeType==1)};c.isArray=n||function(a){return E.call(a)=== -"[object Array]"};c.isArguments=function(a){return!!(a&&o.call(a,"callee"))};c.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};c.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};c.isNumber=function(a){return!!(a===0||a&&a.toExponential&&a.toFixed)};c.isNaN=function(a){return a!==a};c.isBoolean=function(a){return a===true||a===false};c.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};c.isRegExp=function(a){return!!(a&&a.test&&a.exec&&(a.ignoreCase|| -a.ignoreCase===false))};c.isNull=function(a){return a===null};c.isUndefined=function(a){return a===void 0};c.noConflict=function(){q._=C;return this};c.identity=function(a){return a};c.times=function(a,b,d){for(var e=0;e/g,interpolate:/<%=([\s\S]+?)%>/g};c.template=function(a,b){var d=c.templateSettings;d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+ -a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.interpolate,function(e,f){return"',"+f.replace(/\\'/g,"'")+",'"}).replace(d.evaluate||null,function(e,f){return"');"+f.replace(/\\'/g,"'").replace(/[\r\n\t]/g," ")+"__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');";d=new Function("obj",d);return b?d(b):d};var l=function(a){this._wrapped=a};c.prototype=l.prototype;var r=function(a,b){return b?c(a).chain():a},H=function(a,b){l.prototype[a]=function(){var d= -i.call(arguments);D.call(d,this._wrapped);return r(b.apply(c,d),this._chain)}};c.mixin(c);k(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var b=j[a];l.prototype[a]=function(){b.apply(this._wrapped,arguments);return r(this._wrapped,this._chain)}});k(["concat","join","slice"],function(a){var b=j[a];l.prototype[a]=function(){return r(b.apply(this._wrapped,arguments),this._chain)}});l.prototype.chain=function(){this._chain=true;return this};l.prototype.value=function(){return this._wrapped}})(); +(function(){var q=this,D=q._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,E=k.unshift,F=o.toString,m=o.hasOwnProperty,s=k.forEach,t=k.map,u=k.reduce,v=k.reduceRight,w=k.filter,x=k.every,y=k.some,p=k.indexOf,z=k.lastIndexOf;o=Array.isArray;var G=Object.keys,A=Function.prototype.bind,c=function(a){return new l(a)};if(typeof module!=="undefined"&&module.exports){module.exports=c;c._=c}else q._=c;c.VERSION="1.1.5";var j=c.each=c.forEach=function(a,b,d){if(a!=null)if(s&&a.forEach===s)a.forEach(b, +d);else if(c.isNumber(a.length))for(var e=0,f=a.length;e=e.computed&&(e={value:f,computed:g})});return e.value};c.min=function(a,b,d){if(!b&&c.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};j(a,function(f,g,h){g=b?b.call(d,f,g,h):f;gh?1:0}),"value")};c.sortedIndex= +function(a,b,d){d=d||c.identity;for(var e=0,f=a.length;e>1;d(a[g])=0})})};c.zip=function(){for(var a=i.call(arguments),b=c.max(c.pluck(a,"length")),d=Array(b),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}};c.keys=G||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],d;for(d in a)if(m.call(a, +d))b[b.length]=d;return b};c.values=function(a){return c.map(a,c.identity)};c.functions=c.methods=function(a){return c.filter(c.keys(a),function(b){return c.isFunction(a[b])}).sort()};c.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};c.defaults=function(a){j(i.call(arguments,1),function(b){for(var d in b)if(a[d]==null)a[d]=b[d]});return a};c.clone=function(a){return c.isArray(a)?a.slice():c.extend({},a)};c.tap=function(a,b){b(a);return a};c.isEqual=function(a, +b){if(a===b)return true;var d=typeof a;if(d!=typeof b)return false;if(a==b)return true;if(!a&&b||a&&!b)return false;if(a._chain)a=a._wrapped;if(b._chain)b=b._wrapped;if(a.isEqual)return a.isEqual(b);if(c.isDate(a)&&c.isDate(b))return a.getTime()===b.getTime();if(c.isNaN(a)&&c.isNaN(b))return false;if(c.isRegExp(a)&&c.isRegExp(b))return a.source===b.source&&a.global===b.global&&a.ignoreCase===b.ignoreCase&&a.multiline===b.multiline;if(d!=="object")return false;if(a.length&&a.length!==b.length)return false; +d=c.keys(a);var e=c.keys(b);if(d.length!=e.length)return false;for(var f in a)if(!(f in b)||!c.isEqual(a[f],b[f]))return false;return true};c.isEmpty=function(a){if(c.isArray(a)||c.isString(a))return a.length===0;for(var b in a)if(m.call(a,b))return false;return true};c.isElement=function(a){return!!(a&&a.nodeType==1)};c.isArray=o||function(a){return F.call(a)==="[object Array]"};c.isArguments=function(a){return!!(a&&m.call(a,"callee"))};c.isFunction=function(a){return!!(a&&a.constructor&&a.call&& +a.apply)};c.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};c.isNumber=function(a){return!!(a===0||a&&a.toExponential&&a.toFixed)};c.isNaN=function(a){return a!==a};c.isBoolean=function(a){return a===true||a===false};c.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};c.isRegExp=function(a){return!!(a&&a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};c.isNull=function(a){return a===null};c.isUndefined=function(a){return a===void 0};c.noConflict=function(){q._= +D;return this};c.identity=function(a){return a};c.times=function(a,b,d){for(var e=0;e/g,interpolate:/<%=([\s\S]+?)%>/g};c.template=function(a,b){var d=c.templateSettings;d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.interpolate, +function(e,f){return"',"+f.replace(/\\'/g,"'")+",'"}).replace(d.evaluate||null,function(e,f){return"');"+f.replace(/\\'/g,"'").replace(/[\r\n\t]/g," ")+"__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');";d=new Function("obj",d);return b?d(b):d};var l=function(a){this._wrapped=a};c.prototype=l.prototype;var r=function(a,b){return b?c(a).chain():a},I=function(a,b){l.prototype[a]=function(){var d=i.call(arguments);E.call(d,this._wrapped);return r(b.apply(c, +d),this._chain)}};c.mixin(c);j(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var b=k[a];l.prototype[a]=function(){b.apply(this._wrapped,arguments);return r(this._wrapped,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];l.prototype[a]=function(){return r(b.apply(this._wrapped,arguments),this._chain)}});l.prototype.chain=function(){this._chain=true;return this};l.prototype.value=function(){return this._wrapped}})(); diff --git a/underscore.js b/underscore.js index e214dbd51..c627740a0 100644 --- a/underscore.js +++ b/underscore.js @@ -1,4 +1,4 @@ -// Underscore.js 1.1.4 +// Underscore.js 1.1.5 // (c) 2011 Jeremy Ashkenas, DocumentCloud Inc. // Underscore is freely distributable under the MIT license. // Portions of Underscore are inspired or borrowed from Prototype, @@ -59,7 +59,7 @@ } // Current version. - _.VERSION = '1.1.4'; + _.VERSION = '1.1.5'; // Collection Functions // --------------------