ultimate-base 0.2.3.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile.lock +1 -1
- data/LICENSE +18 -4
- data/README.md +24 -0
- data/app/assets/javascripts/ultimate/backbone/extra/jquery-ext.js.coffee +8 -6
- data/app/assets/javascripts/ultimate/backbone/extra/jquery-plugin-adapter.js.coffee +11 -17
- data/app/assets/javascripts/ultimate/backbone/view.js.coffee +40 -4
- data/app/assets/javascripts/ultimate/backbone/views/slider.js.coffee +1 -1
- data/app/assets/javascripts/ultimate/backbone/views/typed-fields.js.coffee +4 -3
- data/app/assets/javascripts/ultimate/base.js.coffee +25 -30
- data/app/assets/javascripts/ultimate/helpers.js.coffee +34 -34
- data/app/assets/javascripts/ultimate/improves/i18n-lite.js.coffee +14 -0
- data/app/assets/javascripts/ultimate/underscore/underscore.js +143 -98
- data/app/assets/javascripts/ultimate/underscore/underscore.string.js +347 -237
- data/app/assets/stylesheets/ultimate/mixins/{_routines.css.scss → _routines.scss} +0 -0
- data/app/assets/stylesheets/ultimate/mixins/{_vendors.css.scss → _vendors.scss} +0 -0
- data/app/assets/stylesheets/ultimate/mixins/css3.scss +1 -1
- data/app/assets/stylesheets/ultimate/mixins/{decor.css.scss → decor.scss} +0 -0
- data/app/assets/stylesheets/ultimate/mixins/{fonts.css.scss → fonts.scss} +0 -0
- data/app/assets/stylesheets/ultimate/mixins/{microstructures.css.scss → microstructures.scss} +0 -0
- data/app/assets/stylesheets/ultimate/structures/{slider.css.scss → slider.scss} +1 -1
- data/lib/ultimate-base/version.rb +1 -1
- metadata +9 -8
@@ -0,0 +1,14 @@
|
|
1
|
+
# TODO list
|
2
|
+
# * load all locales
|
3
|
+
|
4
|
+
@I18n ||=
|
5
|
+
locale: "en"
|
6
|
+
translations: {}
|
7
|
+
|
8
|
+
t: (path) ->
|
9
|
+
path = path.split('.') if _.isString(path)
|
10
|
+
scope = @translations
|
11
|
+
for step in path
|
12
|
+
scope = scope[step]
|
13
|
+
return path.join('.') unless scope
|
14
|
+
scope
|
@@ -1,6 +1,6 @@
|
|
1
1
|
// Underscore.js 1.3.3
|
2
2
|
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
|
3
|
-
// Underscore
|
3
|
+
// Underscore may be freely distributed under the MIT license.
|
4
4
|
// Portions of Underscore are inspired or borrowed from Prototype,
|
5
5
|
// Oliver Steele's Functional, and John Resig's Micro-Templating.
|
6
6
|
// For all details and documentation:
|
@@ -24,7 +24,8 @@
|
|
24
24
|
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
|
25
25
|
|
26
26
|
// Create quick reference variables for speed access to core prototypes.
|
27
|
-
var
|
27
|
+
var push = ArrayProto.push,
|
28
|
+
slice = ArrayProto.slice,
|
28
29
|
unshift = ArrayProto.unshift,
|
29
30
|
toString = ObjProto.toString,
|
30
31
|
hasOwnProperty = ObjProto.hasOwnProperty;
|
@@ -76,7 +77,7 @@
|
|
76
77
|
obj.forEach(iterator, context);
|
77
78
|
} else if (obj.length === +obj.length) {
|
78
79
|
for (var i = 0, l = obj.length; i < l; i++) {
|
79
|
-
if (
|
80
|
+
if (iterator.call(context, obj[i], i, obj) === breaker) return;
|
80
81
|
}
|
81
82
|
} else {
|
82
83
|
for (var key in obj) {
|
@@ -96,7 +97,6 @@
|
|
96
97
|
each(obj, function(value, index, list) {
|
97
98
|
results[results.length] = iterator.call(context, value, index, list);
|
98
99
|
});
|
99
|
-
if (obj.length === +obj.length) results.length = obj.length;
|
100
100
|
return results;
|
101
101
|
};
|
102
102
|
|
@@ -213,7 +213,7 @@
|
|
213
213
|
_.invoke = function(obj, method) {
|
214
214
|
var args = slice.call(arguments, 2);
|
215
215
|
return _.map(obj, function(value) {
|
216
|
-
return (_.isFunction(method) ? method
|
216
|
+
return (_.isFunction(method) ? method : value[method]).apply(value, args);
|
217
217
|
});
|
218
218
|
};
|
219
219
|
|
@@ -223,8 +223,12 @@
|
|
223
223
|
};
|
224
224
|
|
225
225
|
// Return the maximum element or (element-based computation).
|
226
|
+
// Can't optimize arrays of integers longer than 65,535 elements.
|
227
|
+
// See: https://bugs.webkit.org/show_bug.cgi?id=80797
|
226
228
|
_.max = function(obj, iterator, context) {
|
227
|
-
if (!iterator && _.isArray(obj) && obj[0] === +obj[0]
|
229
|
+
if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
|
230
|
+
return Math.max.apply(Math, obj);
|
231
|
+
}
|
228
232
|
if (!iterator && _.isEmpty(obj)) return -Infinity;
|
229
233
|
var result = {computed : -Infinity};
|
230
234
|
each(obj, function(value, index, list) {
|
@@ -236,7 +240,9 @@
|
|
236
240
|
|
237
241
|
// Return the minimum element (or element-based computation).
|
238
242
|
_.min = function(obj, iterator, context) {
|
239
|
-
if (!iterator && _.isArray(obj) && obj[0] === +obj[0]
|
243
|
+
if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
|
244
|
+
return Math.min.apply(Math, obj);
|
245
|
+
}
|
240
246
|
if (!iterator && _.isEmpty(obj)) return Infinity;
|
241
247
|
var result = {computed : Infinity};
|
242
248
|
each(obj, function(value, index, list) {
|
@@ -248,10 +254,12 @@
|
|
248
254
|
|
249
255
|
// Shuffle an array.
|
250
256
|
_.shuffle = function(obj) {
|
251
|
-
var
|
252
|
-
|
253
|
-
|
254
|
-
|
257
|
+
var rand;
|
258
|
+
var index = 0;
|
259
|
+
var shuffled = [];
|
260
|
+
each(obj, function(value) {
|
261
|
+
rand = Math.floor(Math.random() * ++index);
|
262
|
+
shuffled[index - 1] = shuffled[rand];
|
255
263
|
shuffled[rand] = value;
|
256
264
|
});
|
257
265
|
return shuffled;
|
@@ -259,7 +267,7 @@
|
|
259
267
|
|
260
268
|
// Sort the object's values by a criterion produced by an iterator.
|
261
269
|
_.sortBy = function(obj, val, context) {
|
262
|
-
var iterator =
|
270
|
+
var iterator = lookupIterator(obj, val);
|
263
271
|
return _.pluck(_.map(obj, function(value, index, list) {
|
264
272
|
return {
|
265
273
|
value : value,
|
@@ -273,26 +281,49 @@
|
|
273
281
|
}), 'value');
|
274
282
|
};
|
275
283
|
|
276
|
-
//
|
277
|
-
|
278
|
-
|
284
|
+
// An internal function to generate lookup iterators.
|
285
|
+
var lookupIterator = function(obj, val) {
|
286
|
+
return _.isFunction(val) ? val : function(obj) { return obj[val]; };
|
287
|
+
};
|
288
|
+
|
289
|
+
// An internal function used for aggregate "group by" operations.
|
290
|
+
var group = function(obj, val, behavior) {
|
279
291
|
var result = {};
|
280
|
-
var iterator =
|
292
|
+
var iterator = lookupIterator(obj, val);
|
281
293
|
each(obj, function(value, index) {
|
282
294
|
var key = iterator(value, index);
|
283
|
-
(result
|
295
|
+
behavior(result, key, value);
|
284
296
|
});
|
285
297
|
return result;
|
286
298
|
};
|
287
299
|
|
288
|
-
//
|
289
|
-
//
|
300
|
+
// Groups the object's values by a criterion. Pass either a string attribute
|
301
|
+
// to group by, or a function that returns the criterion.
|
302
|
+
_.groupBy = function(obj, val) {
|
303
|
+
return group(obj, val, function(result, key, value) {
|
304
|
+
(result[key] || (result[key] = [])).push(value);
|
305
|
+
});
|
306
|
+
};
|
307
|
+
|
308
|
+
// Counts instances of an object that group by a certain criterion. Pass
|
309
|
+
// either a string attribute to count by, or a function that returns the
|
310
|
+
// criterion.
|
311
|
+
_.countBy = function(obj, val) {
|
312
|
+
return group(obj, val, function(result, key, value) {
|
313
|
+
result[key] || (result[key] = 0);
|
314
|
+
result[key]++;
|
315
|
+
});
|
316
|
+
};
|
317
|
+
|
318
|
+
// Use a comparator function to figure out the smallest index at which
|
319
|
+
// an object should be inserted so as to maintain order. Uses binary search.
|
290
320
|
_.sortedIndex = function(array, obj, iterator) {
|
291
321
|
iterator || (iterator = _.identity);
|
322
|
+
var value = iterator(obj);
|
292
323
|
var low = 0, high = array.length;
|
293
324
|
while (low < high) {
|
294
325
|
var mid = (low + high) >> 1;
|
295
|
-
iterator(array[mid]) <
|
326
|
+
iterator(array[mid]) < value ? low = mid + 1 : high = mid;
|
296
327
|
}
|
297
328
|
return low;
|
298
329
|
};
|
@@ -321,7 +352,7 @@
|
|
321
352
|
return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
|
322
353
|
};
|
323
354
|
|
324
|
-
// Returns everything but the last entry of the array.
|
355
|
+
// Returns everything but the last entry of the array. Especially useful on
|
325
356
|
// the arguments object. Passing **n** will return all the values in
|
326
357
|
// the array, excluding the last N. The **guard** check allows it to work with
|
327
358
|
// `_.map`.
|
@@ -352,13 +383,21 @@
|
|
352
383
|
return _.filter(array, function(value){ return !!value; });
|
353
384
|
};
|
354
385
|
|
386
|
+
// Internal implementation of a recursive `flatten` function.
|
387
|
+
var flatten = function(input, shallow, output) {
|
388
|
+
each(input, function(value) {
|
389
|
+
if (_.isArray(value)) {
|
390
|
+
shallow ? push.apply(output, value) : flatten(value, shallow, output);
|
391
|
+
} else {
|
392
|
+
output.push(value);
|
393
|
+
}
|
394
|
+
});
|
395
|
+
return output;
|
396
|
+
};
|
397
|
+
|
355
398
|
// Return a completely flattened version of an array.
|
356
399
|
_.flatten = function(array, shallow) {
|
357
|
-
return
|
358
|
-
if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
|
359
|
-
memo[memo.length] = value;
|
360
|
-
return memo;
|
361
|
-
}, []);
|
400
|
+
return flatten(array, shallow, []);
|
362
401
|
};
|
363
402
|
|
364
403
|
// Return a version of the array that does not contain the specified value(s).
|
@@ -372,10 +411,8 @@
|
|
372
411
|
_.uniq = _.unique = function(array, isSorted, iterator) {
|
373
412
|
var initial = iterator ? _.map(array, iterator) : array;
|
374
413
|
var results = [];
|
375
|
-
|
376
|
-
|
377
|
-
_.reduce(initial, function (memo, value, index) {
|
378
|
-
if (isSorted ? _.last(memo) !== value || !memo.length : !_.include(memo, value)) {
|
414
|
+
_.reduce(initial, function(memo, value, index) {
|
415
|
+
if (isSorted ? (_.last(memo) !== value || !memo.length) : !_.include(memo, value)) {
|
379
416
|
memo.push(value);
|
380
417
|
results.push(array[index]);
|
381
418
|
}
|
@@ -387,12 +424,12 @@
|
|
387
424
|
// Produce an array that contains the union: each distinct element from all of
|
388
425
|
// the passed-in arrays.
|
389
426
|
_.union = function() {
|
390
|
-
return _.uniq(
|
427
|
+
return _.uniq(flatten(arguments, true, []));
|
391
428
|
};
|
392
429
|
|
393
430
|
// Produce an array that contains every item shared between all the
|
394
|
-
// passed-in arrays.
|
395
|
-
_.intersection =
|
431
|
+
// passed-in arrays.
|
432
|
+
_.intersection = function(array) {
|
396
433
|
var rest = slice.call(arguments, 1);
|
397
434
|
return _.filter(_.uniq(array), function(item) {
|
398
435
|
return _.every(rest, function(other) {
|
@@ -404,7 +441,7 @@
|
|
404
441
|
// Take the difference between one array and a number of other arrays.
|
405
442
|
// Only the elements present in just the first array will remain.
|
406
443
|
_.difference = function(array) {
|
407
|
-
var rest =
|
444
|
+
var rest = flatten(slice.call(arguments, 1), true, []);
|
408
445
|
return _.filter(array, function(value){ return !_.include(rest, value); });
|
409
446
|
};
|
410
447
|
|
@@ -414,10 +451,22 @@
|
|
414
451
|
var args = slice.call(arguments);
|
415
452
|
var length = _.max(_.pluck(args, 'length'));
|
416
453
|
var results = new Array(length);
|
417
|
-
for (var i = 0; i < length; i++)
|
454
|
+
for (var i = 0; i < length; i++) {
|
455
|
+
results[i] = _.pluck(args, "" + i);
|
456
|
+
}
|
418
457
|
return results;
|
419
458
|
};
|
420
459
|
|
460
|
+
// Zip together two arrays -- an array of keys and an array of values -- into
|
461
|
+
// a single object.
|
462
|
+
_.zipObject = function(keys, values) {
|
463
|
+
var result = {};
|
464
|
+
for (var i = 0, l = keys.length; i < l; i++) {
|
465
|
+
result[keys[i]] = values[i];
|
466
|
+
}
|
467
|
+
return result;
|
468
|
+
};
|
469
|
+
|
421
470
|
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
|
422
471
|
// we need this function. Return the position of the first occurrence of an
|
423
472
|
// item in an array, or -1 if the item is not included in the array.
|
@@ -432,7 +481,7 @@
|
|
432
481
|
return array[i] === item ? i : -1;
|
433
482
|
}
|
434
483
|
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
|
435
|
-
for (i = 0, l = array.length; i < l; i++) if (
|
484
|
+
for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
|
436
485
|
return -1;
|
437
486
|
};
|
438
487
|
|
@@ -441,7 +490,7 @@
|
|
441
490
|
if (array == null) return -1;
|
442
491
|
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
|
443
492
|
var i = array.length;
|
444
|
-
while (i--) if (
|
493
|
+
while (i--) if (array[i] === item) return i;
|
445
494
|
return -1;
|
446
495
|
};
|
447
496
|
|
@@ -540,10 +589,10 @@
|
|
540
589
|
if (throttling) {
|
541
590
|
more = true;
|
542
591
|
} else {
|
592
|
+
throttling = true;
|
543
593
|
result = func.apply(context, args);
|
544
594
|
}
|
545
595
|
whenDone();
|
546
|
-
throttling = true;
|
547
596
|
return result;
|
548
597
|
};
|
549
598
|
};
|
@@ -560,9 +609,10 @@
|
|
560
609
|
timeout = null;
|
561
610
|
if (!immediate) func.apply(context, args);
|
562
611
|
};
|
563
|
-
|
612
|
+
var callNow = immediate && !timeout;
|
564
613
|
clearTimeout(timeout);
|
565
614
|
timeout = setTimeout(later, wait);
|
615
|
+
if (callNow) func.apply(context, args);
|
566
616
|
};
|
567
617
|
};
|
568
618
|
|
@@ -604,7 +654,9 @@
|
|
604
654
|
_.after = function(times, func) {
|
605
655
|
if (times <= 0) return func();
|
606
656
|
return function() {
|
607
|
-
if (--times < 1) {
|
657
|
+
if (--times < 1) {
|
658
|
+
return func.apply(this, arguments);
|
659
|
+
}
|
608
660
|
};
|
609
661
|
};
|
610
662
|
|
@@ -648,7 +700,7 @@
|
|
648
700
|
// Return a copy of the object only containing the whitelisted properties.
|
649
701
|
_.pick = function(obj) {
|
650
702
|
var result = {};
|
651
|
-
each(
|
703
|
+
each(flatten(slice.call(arguments, 1), true, []), function(key) {
|
652
704
|
if (key in obj) result[key] = obj[key];
|
653
705
|
});
|
654
706
|
return result;
|
@@ -678,8 +730,8 @@
|
|
678
730
|
return obj;
|
679
731
|
};
|
680
732
|
|
681
|
-
// Internal recursive comparison function
|
682
|
-
|
733
|
+
// Internal recursive comparison function for `isEqual`.
|
734
|
+
var eq = function(a, b, stack) {
|
683
735
|
// Identical objects are equal. `0 === -0`, but they aren't identical.
|
684
736
|
// See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
|
685
737
|
if (a === b) return a !== 0 || 1 / a == 1 / b;
|
@@ -764,7 +816,7 @@
|
|
764
816
|
// Remove the first object from the stack of traversed objects.
|
765
817
|
stack.pop();
|
766
818
|
return result;
|
767
|
-
}
|
819
|
+
};
|
768
820
|
|
769
821
|
// Perform a deep comparison to check if two objects are equal.
|
770
822
|
_.isEqual = function(a, b) {
|
@@ -796,31 +848,21 @@
|
|
796
848
|
return obj === Object(obj);
|
797
849
|
};
|
798
850
|
|
799
|
-
//
|
800
|
-
|
801
|
-
|
802
|
-
|
851
|
+
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
|
852
|
+
each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
|
853
|
+
_['is' + name] = function(obj) {
|
854
|
+
return toString.call(obj) == '[object ' + name + ']';
|
855
|
+
};
|
856
|
+
});
|
857
|
+
|
858
|
+
// Define a fallback version of the method in browsers (ahem, IE), where
|
859
|
+
// there isn't any inspectable "Arguments" type.
|
803
860
|
if (!_.isArguments(arguments)) {
|
804
861
|
_.isArguments = function(obj) {
|
805
862
|
return !!(obj && _.has(obj, 'callee'));
|
806
863
|
};
|
807
864
|
}
|
808
865
|
|
809
|
-
// Is a given value a function?
|
810
|
-
_.isFunction = function(obj) {
|
811
|
-
return toString.call(obj) == '[object Function]';
|
812
|
-
};
|
813
|
-
|
814
|
-
// Is a given value a string?
|
815
|
-
_.isString = function(obj) {
|
816
|
-
return toString.call(obj) == '[object String]';
|
817
|
-
};
|
818
|
-
|
819
|
-
// Is a given value a number?
|
820
|
-
_.isNumber = function(obj) {
|
821
|
-
return toString.call(obj) == '[object Number]';
|
822
|
-
};
|
823
|
-
|
824
866
|
// Is a given object a finite number?
|
825
867
|
_.isFinite = function(obj) {
|
826
868
|
return _.isNumber(obj) && isFinite(obj);
|
@@ -837,16 +879,6 @@
|
|
837
879
|
return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
|
838
880
|
};
|
839
881
|
|
840
|
-
// Is a given value a date?
|
841
|
-
_.isDate = function(obj) {
|
842
|
-
return toString.call(obj) == '[object Date]';
|
843
|
-
};
|
844
|
-
|
845
|
-
// Is the given value a regular expression?
|
846
|
-
_.isRegExp = function(obj) {
|
847
|
-
return toString.call(obj) == '[object RegExp]';
|
848
|
-
};
|
849
|
-
|
850
882
|
// Is a given value equal to null?
|
851
883
|
_.isNull = function(obj) {
|
852
884
|
return obj === null;
|
@@ -857,7 +889,8 @@
|
|
857
889
|
return obj === void 0;
|
858
890
|
};
|
859
891
|
|
860
|
-
//
|
892
|
+
// Shortcut function for checking if an object has a given property directly
|
893
|
+
// on itself (in other words, not on a prototype).
|
861
894
|
_.has = function(obj, key) {
|
862
895
|
return hasOwnProperty.call(obj, key);
|
863
896
|
};
|
@@ -878,13 +911,28 @@
|
|
878
911
|
};
|
879
912
|
|
880
913
|
// Run a function **n** times.
|
881
|
-
_.times = function
|
914
|
+
_.times = function(n, iterator, context) {
|
882
915
|
for (var i = 0; i < n; i++) iterator.call(context, i);
|
883
916
|
};
|
884
917
|
|
918
|
+
// List of HTML entities for escaping.
|
919
|
+
var htmlEscapes = {
|
920
|
+
'&': '&',
|
921
|
+
'<': '<',
|
922
|
+
'>': '>',
|
923
|
+
'"': '"',
|
924
|
+
"'": ''',
|
925
|
+
'/': '/'
|
926
|
+
};
|
927
|
+
|
928
|
+
// Regex containing the keys listed immediately above.
|
929
|
+
var htmlEscaper = /[&<>"'\/]/g;
|
930
|
+
|
885
931
|
// Escape a string for HTML interpolation.
|
886
932
|
_.escape = function(string) {
|
887
|
-
return (''+string).replace(
|
933
|
+
return ('' + string).replace(htmlEscaper, function(match) {
|
934
|
+
return htmlEscapes[match];
|
935
|
+
});
|
888
936
|
};
|
889
937
|
|
890
938
|
// If the value of the named property is a function then invoke it;
|
@@ -927,16 +975,16 @@
|
|
927
975
|
// Certain characters need to be escaped so that they can be put into a
|
928
976
|
// string literal.
|
929
977
|
var escapes = {
|
930
|
-
'\\':
|
931
|
-
"'":
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
978
|
+
'\\': '\\',
|
979
|
+
"'": "'",
|
980
|
+
r: '\r',
|
981
|
+
n: '\n',
|
982
|
+
t: '\t',
|
983
|
+
u2028: '\u2028',
|
984
|
+
u2029: '\u2029'
|
937
985
|
};
|
938
986
|
|
939
|
-
for (var
|
987
|
+
for (var key in escapes) escapes[escapes[key]] = key;
|
940
988
|
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
|
941
989
|
var unescaper = /\\(\\|'|r|n|t|u2028|u2029)/g;
|
942
990
|
|
@@ -962,20 +1010,20 @@
|
|
962
1010
|
return '\\' + escapes[match];
|
963
1011
|
})
|
964
1012
|
.replace(settings.escape || noMatch, function(match, code) {
|
965
|
-
return "'+\
|
1013
|
+
return "'+\n((__t=(" + unescape(code) + "))==null?'':_.escape(__t))+\n'";
|
966
1014
|
})
|
967
1015
|
.replace(settings.interpolate || noMatch, function(match, code) {
|
968
|
-
return "'+\n(" + unescape(code) + ")+\n'";
|
1016
|
+
return "'+\n((__t=(" + unescape(code) + "))==null?'':__t)+\n'";
|
969
1017
|
})
|
970
1018
|
.replace(settings.evaluate || noMatch, function(match, code) {
|
971
|
-
return "';\n" + unescape(code) + "\
|
1019
|
+
return "';\n" + unescape(code) + "\n__p+='";
|
972
1020
|
}) + "';\n";
|
973
1021
|
|
974
1022
|
// If a variable is not specified, place data values in local scope.
|
975
1023
|
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
|
976
1024
|
|
977
|
-
source = "var __p=''
|
978
|
-
"
|
1025
|
+
source = "var __t,__p='',__j=Array.prototype.join," +
|
1026
|
+
"print=function(){__p+=__j.call(arguments,'')};\n" +
|
979
1027
|
source + "return __p;\n";
|
980
1028
|
|
981
1029
|
var render = new Function(settings.variable || 'obj', '_', source);
|
@@ -984,10 +1032,8 @@
|
|
984
1032
|
return render.call(this, data, _);
|
985
1033
|
};
|
986
1034
|
|
987
|
-
// Provide the compiled function source as a convenience for
|
988
|
-
|
989
|
-
template.source = 'function(' + (settings.variable || 'obj') + '){\n' +
|
990
|
-
source + '}';
|
1035
|
+
// Provide the compiled function source as a convenience for precompilation.
|
1036
|
+
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
|
991
1037
|
|
992
1038
|
return template;
|
993
1039
|
};
|
@@ -1029,11 +1075,10 @@
|
|
1029
1075
|
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
|
1030
1076
|
var method = ArrayProto[name];
|
1031
1077
|
wrapper.prototype[name] = function() {
|
1032
|
-
var
|
1033
|
-
method.apply(
|
1034
|
-
|
1035
|
-
|
1036
|
-
return result(wrapped, this._chain);
|
1078
|
+
var obj = this._wrapped;
|
1079
|
+
method.apply(obj, arguments);
|
1080
|
+
if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
|
1081
|
+
return result(obj, this._chain);
|
1037
1082
|
};
|
1038
1083
|
});
|
1039
1084
|
|