handlebars-source 1.0.0.rc3 → 1.0.0.rc4

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.

Potentially problematic release.


This version of handlebars-source might be problematic. Click here for more details.

Files changed (3) hide show
  1. data/dist/handlebars.js +104 -65
  2. data/dist/handlebars.runtime.js +49 -20
  3. metadata +2 -2
@@ -29,24 +29,38 @@ var Handlebars = {};
29
29
  ;
30
30
  // lib/handlebars/base.js
31
31
 
32
- Handlebars.VERSION = "1.0.0-rc.3";
33
- Handlebars.COMPILER_REVISION = 2;
32
+ Handlebars.VERSION = "1.0.0-rc.4";
33
+ Handlebars.COMPILER_REVISION = 3;
34
34
 
35
35
  Handlebars.REVISION_CHANGES = {
36
36
  1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
37
- 2: '>= 1.0.0-rc.3'
37
+ 2: '== 1.0.0-rc.3',
38
+ 3: '>= 1.0.0-rc.4'
38
39
  };
39
40
 
40
41
  Handlebars.helpers = {};
41
42
  Handlebars.partials = {};
42
43
 
44
+ var toString = Object.prototype.toString,
45
+ functionType = '[object Function]',
46
+ objectType = '[object Object]';
47
+
43
48
  Handlebars.registerHelper = function(name, fn, inverse) {
44
- if(inverse) { fn.not = inverse; }
45
- this.helpers[name] = fn;
49
+ if (toString.call(name) === objectType) {
50
+ if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); }
51
+ Handlebars.Utils.extend(this.helpers, name);
52
+ } else {
53
+ if (inverse) { fn.not = inverse; }
54
+ this.helpers[name] = fn;
55
+ }
46
56
  };
47
57
 
48
58
  Handlebars.registerPartial = function(name, str) {
49
- this.partials[name] = str;
59
+ if (toString.call(name) === objectType) {
60
+ Handlebars.Utils.extend(this.partials, name);
61
+ } else {
62
+ this.partials[name] = str;
63
+ }
50
64
  };
51
65
 
52
66
  Handlebars.registerHelper('helperMissing', function(arg) {
@@ -57,8 +71,6 @@ Handlebars.registerHelper('helperMissing', function(arg) {
57
71
  }
58
72
  });
59
73
 
60
- var toString = Object.prototype.toString, functionType = "[object Function]";
61
-
62
74
  Handlebars.registerHelper('blockHelperMissing', function(context, options) {
63
75
  var inverse = options.inverse || function() {}, fn = options.fn;
64
76
 
@@ -156,7 +168,7 @@ Handlebars.registerHelper('unless', function(context, options) {
156
168
  });
157
169
 
158
170
  Handlebars.registerHelper('with', function(context, options) {
159
- return options.fn(context);
171
+ if (!Handlebars.Utils.isEmpty(context)) return options.fn(context);
160
172
  });
161
173
 
162
174
  Handlebars.registerHelper('log', function(context, options) {
@@ -552,87 +564,89 @@ pushState:function begin(condition) {
552
564
  lexer.options = {};
553
565
  lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
554
566
 
555
- var YYSTATE=YY_START
567
+ var YYSTATE=YY_START;
556
568
  switch($avoiding_name_collisions) {
557
- case 0:
569
+ case 0: yy_.yytext = "\\"; return 14;
570
+ break;
571
+ case 1:
558
572
  if(yy_.yytext.slice(-1) !== "\\") this.begin("mu");
559
573
  if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin("emu");
560
574
  if(yy_.yytext) return 14;
561
575
 
562
576
  break;
563
- case 1: return 14;
577
+ case 2: return 14;
564
578
  break;
565
- case 2:
579
+ case 3:
566
580
  if(yy_.yytext.slice(-1) !== "\\") this.popState();
567
581
  if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1);
568
582
  return 14;
569
583
 
570
584
  break;
571
- case 3: yy_.yytext = yy_.yytext.substr(0, yy_.yyleng-4); this.popState(); return 15;
572
- break;
573
- case 4: this.begin("par"); return 24;
585
+ case 4: yy_.yytext = yy_.yytext.substr(0, yy_.yyleng-4); this.popState(); return 15;
574
586
  break;
575
- case 5: return 16;
587
+ case 5: this.begin("par"); return 24;
576
588
  break;
577
- case 6: return 20;
589
+ case 6: return 16;
578
590
  break;
579
- case 7: return 19;
591
+ case 7: return 20;
580
592
  break;
581
593
  case 8: return 19;
582
594
  break;
583
- case 9: return 23;
595
+ case 9: return 19;
584
596
  break;
585
597
  case 10: return 23;
586
598
  break;
587
- case 11: this.popState(); this.begin('com');
599
+ case 11: return 23;
588
600
  break;
589
- case 12: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15;
601
+ case 12: this.popState(); this.begin('com');
590
602
  break;
591
- case 13: return 22;
603
+ case 13: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15;
592
604
  break;
593
- case 14: return 36;
605
+ case 14: return 22;
594
606
  break;
595
- case 15: return 35;
607
+ case 15: return 36;
596
608
  break;
597
609
  case 16: return 35;
598
610
  break;
599
- case 17: return 39;
611
+ case 17: return 35;
600
612
  break;
601
- case 18: /*ignore whitespace*/
613
+ case 18: return 39;
602
614
  break;
603
- case 19: this.popState(); return 18;
615
+ case 19: /*ignore whitespace*/
604
616
  break;
605
617
  case 20: this.popState(); return 18;
606
618
  break;
607
- case 21: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 30;
619
+ case 21: this.popState(); return 18;
608
620
  break;
609
- case 22: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\'/g,"'"); return 30;
621
+ case 22: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 30;
610
622
  break;
611
- case 23: yy_.yytext = yy_.yytext.substr(1); return 28;
623
+ case 23: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\'/g,"'"); return 30;
612
624
  break;
613
- case 24: return 32;
625
+ case 24: yy_.yytext = yy_.yytext.substr(1); return 28;
614
626
  break;
615
627
  case 25: return 32;
616
628
  break;
617
- case 26: return 31;
629
+ case 26: return 32;
630
+ break;
631
+ case 27: return 31;
618
632
  break;
619
- case 27: return 35;
633
+ case 28: return 35;
620
634
  break;
621
- case 28: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 35;
635
+ case 29: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 35;
622
636
  break;
623
- case 29: return 'INVALID';
637
+ case 30: return 'INVALID';
624
638
  break;
625
- case 30: /*ignore whitespace*/
639
+ case 31: /*ignore whitespace*/
626
640
  break;
627
- case 31: this.popState(); return 37;
641
+ case 32: this.popState(); return 37;
628
642
  break;
629
- case 32: return 5;
643
+ case 33: return 5;
630
644
  break;
631
645
  }
632
646
  };
633
- lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[} ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@[a-zA-Z]+)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:-?[0-9]+(?=[}\s]))/,/^(?:[a-zA-Z0-9_$-]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:\s+)/,/^(?:[a-zA-Z0-9_$-/]+)/,/^(?:$)/];
634
- lexer.conditions = {"mu":{"rules":[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,32],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"com":{"rules":[3],"inclusive":false},"par":{"rules":[30,31],"inclusive":false},"INITIAL":{"rules":[0,1,32],"inclusive":true}};
635
- return lexer;})()
647
+ lexer.rules = [/^(?:\\\\(?=(\{\{)))/,/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[}/ ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@[a-zA-Z]+)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:-?[0-9]+(?=[}\s]))/,/^(?:[a-zA-Z0-9_$:\-]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:\s+)/,/^(?:[a-zA-Z0-9_$\-\/]+)/,/^(?:$)/];
648
+ lexer.conditions = {"mu":{"rules":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,33],"inclusive":false},"emu":{"rules":[3],"inclusive":false},"com":{"rules":[4],"inclusive":false},"par":{"rules":[31,32],"inclusive":false},"INITIAL":{"rules":[0,1,2,33],"inclusive":true}};
649
+ return lexer;})();
636
650
  parser.lexer = lexer;
637
651
  function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser;
638
652
  return new Parser;
@@ -815,6 +829,14 @@ var escapeChar = function(chr) {
815
829
  };
816
830
 
817
831
  Handlebars.Utils = {
832
+ extend: function(obj, value) {
833
+ for(var key in value) {
834
+ if(value.hasOwnProperty(key)) {
835
+ obj[key] = value[key];
836
+ }
837
+ }
838
+ },
839
+
818
840
  escapeExpression: function(string) {
819
841
  // don't escape SafeStrings, since they're already safe
820
842
  if (string instanceof Handlebars.SafeString) {
@@ -823,6 +845,11 @@ Handlebars.Utils = {
823
845
  return "";
824
846
  }
825
847
 
848
+ // Force a string conversion as this will be done by the append regardless and
849
+ // the regex test will do this transparently behind the scenes, causing issues if
850
+ // an object's to string has escaped characters in it.
851
+ string = string.toString();
852
+
826
853
  if(!possible.test(string)) { return string; }
827
854
  return string.replace(badChars, escapeChar);
828
855
  },
@@ -1023,6 +1050,10 @@ Compiler.prototype = {
1023
1050
  val = pair[1];
1024
1051
 
1025
1052
  if (this.options.stringParams) {
1053
+ if(val.depth) {
1054
+ this.addDepth(val.depth);
1055
+ }
1056
+ this.opcode('getContext', val.depth || 0);
1026
1057
  this.opcode('pushStringParam', val.stringModeValue, val.type);
1027
1058
  } else {
1028
1059
  this.accept(val);
@@ -1106,7 +1137,7 @@ Compiler.prototype = {
1106
1137
 
1107
1138
  if (this.options.knownHelpers[name]) {
1108
1139
  this.opcode('invokeKnownHelper', params.length, name);
1109
- } else if (this.knownHelpersOnly) {
1140
+ } else if (this.options.knownHelpersOnly) {
1110
1141
  throw new Error("You specified knownHelpersOnly, but used the unknown helper " + name);
1111
1142
  } else {
1112
1143
  this.opcode('invokeHelper', params.length, name);
@@ -1607,16 +1638,18 @@ JavaScriptCompiler.prototype = {
1607
1638
 
1608
1639
  if (this.options.stringParams) {
1609
1640
  this.register('hashTypes', '{}');
1641
+ this.register('hashContexts', '{}');
1610
1642
  }
1611
1643
  },
1612
1644
  pushHash: function() {
1613
- this.hash = {values: [], types: []};
1645
+ this.hash = {values: [], types: [], contexts: []};
1614
1646
  },
1615
1647
  popHash: function() {
1616
1648
  var hash = this.hash;
1617
1649
  this.hash = undefined;
1618
1650
 
1619
1651
  if (this.options.stringParams) {
1652
+ this.register('hashContexts', '{' + hash.contexts.join(',') + '}');
1620
1653
  this.register('hashTypes', '{' + hash.types.join(',') + '}');
1621
1654
  }
1622
1655
  this.push('{\n ' + hash.values.join(',\n ') + '\n }');
@@ -1759,14 +1792,18 @@ JavaScriptCompiler.prototype = {
1759
1792
  // and pushes the hash back onto the stack.
1760
1793
  assignToHash: function(key) {
1761
1794
  var value = this.popStack(),
1795
+ context,
1762
1796
  type;
1763
1797
 
1764
1798
  if (this.options.stringParams) {
1765
1799
  type = this.popStack();
1766
- this.popStack();
1800
+ context = this.popStack();
1767
1801
  }
1768
1802
 
1769
1803
  var hash = this.hash;
1804
+ if (context) {
1805
+ hash.contexts.push("'" + key + "': " + context);
1806
+ }
1770
1807
  if (type) {
1771
1808
  hash.types.push("'" + key + "': " + type);
1772
1809
  }
@@ -1827,12 +1864,7 @@ JavaScriptCompiler.prototype = {
1827
1864
  else { programParams.push("depth" + (depth - 1)); }
1828
1865
  }
1829
1866
 
1830
- if(depths.length === 0) {
1831
- return "self.program(" + programParams.join(", ") + ")";
1832
- } else {
1833
- programParams.shift();
1834
- return "self.programWithDepth(" + programParams.join(", ") + ")";
1835
- }
1867
+ return (depths.length === 0 ? "self.program(" : "self.programWithDepth(") + programParams.join(", ") + ")";
1836
1868
  },
1837
1869
 
1838
1870
  register: function(name, val) {
@@ -1964,7 +1996,9 @@ JavaScriptCompiler.prototype = {
1964
1996
  .replace(/\\/g, '\\\\')
1965
1997
  .replace(/"/g, '\\"')
1966
1998
  .replace(/\n/g, '\\n')
1967
- .replace(/\r/g, '\\r') + '"';
1999
+ .replace(/\r/g, '\\r')
2000
+ .replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4
2001
+ .replace(/\u2029/g, '\\u2029') + '"';
1968
2002
  },
1969
2003
 
1970
2004
  setupHelper: function(paramSize, name, missingParams) {
@@ -2020,6 +2054,7 @@ JavaScriptCompiler.prototype = {
2020
2054
  if (this.options.stringParams) {
2021
2055
  options.push("contexts:[" + contexts.join(",") + "]");
2022
2056
  options.push("types:[" + types.join(",") + "]");
2057
+ options.push("hashContexts:hashContexts");
2023
2058
  options.push("hashTypes:hashTypes");
2024
2059
  }
2025
2060
 
@@ -2070,7 +2105,7 @@ JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
2070
2105
  };
2071
2106
 
2072
2107
  Handlebars.precompile = function(input, options) {
2073
- if (!input || (typeof input !== 'string' && input.constructor !== Handlebars.AST.ProgramNode)) {
2108
+ if (input == null || (typeof input !== 'string' && input.constructor !== Handlebars.AST.ProgramNode)) {
2074
2109
  throw new Handlebars.Exception("You must pass a string or Handlebars AST to Handlebars.precompile. You passed " + input);
2075
2110
  }
2076
2111
 
@@ -2084,7 +2119,7 @@ Handlebars.precompile = function(input, options) {
2084
2119
  };
2085
2120
 
2086
2121
  Handlebars.compile = function(input, options) {
2087
- if (!input || (typeof input !== 'string' && input.constructor !== Handlebars.AST.ProgramNode)) {
2122
+ if (input == null || (typeof input !== 'string' && input.constructor !== Handlebars.AST.ProgramNode)) {
2088
2123
  throw new Handlebars.Exception("You must pass a string or Handlebars AST to Handlebars.compile. You passed " + input);
2089
2124
  }
2090
2125
 
@@ -2122,13 +2157,11 @@ Handlebars.VM = {
2122
2157
  program: function(i, fn, data) {
2123
2158
  var programWrapper = this.programs[i];
2124
2159
  if(data) {
2125
- return Handlebars.VM.program(fn, data);
2126
- } else if(programWrapper) {
2127
- return programWrapper;
2128
- } else {
2129
- programWrapper = this.programs[i] = Handlebars.VM.program(fn);
2130
- return programWrapper;
2160
+ programWrapper = Handlebars.VM.program(i, fn, data);
2161
+ } else if (!programWrapper) {
2162
+ programWrapper = this.programs[i] = Handlebars.VM.program(i, fn);
2131
2163
  }
2164
+ return programWrapper;
2132
2165
  },
2133
2166
  programWithDepth: Handlebars.VM.programWithDepth,
2134
2167
  noop: Handlebars.VM.noop,
@@ -2160,21 +2193,27 @@ Handlebars.VM = {
2160
2193
  };
2161
2194
  },
2162
2195
 
2163
- programWithDepth: function(fn, data, $depth) {
2164
- var args = Array.prototype.slice.call(arguments, 2);
2196
+ programWithDepth: function(i, fn, data /*, $depth */) {
2197
+ var args = Array.prototype.slice.call(arguments, 3);
2165
2198
 
2166
- return function(context, options) {
2199
+ var program = function(context, options) {
2167
2200
  options = options || {};
2168
2201
 
2169
2202
  return fn.apply(this, [context, options.data || data].concat(args));
2170
2203
  };
2204
+ program.program = i;
2205
+ program.depth = args.length;
2206
+ return program;
2171
2207
  },
2172
- program: function(fn, data) {
2173
- return function(context, options) {
2208
+ program: function(i, fn, data) {
2209
+ var program = function(context, options) {
2174
2210
  options = options || {};
2175
2211
 
2176
2212
  return fn(context, options.data || data);
2177
2213
  };
2214
+ program.program = i;
2215
+ program.depth = 0;
2216
+ return program;
2178
2217
  },
2179
2218
  noop: function() { return ""; },
2180
2219
  invokePartial: function(partial, name, context, helpers, partials, data) {
@@ -29,24 +29,38 @@ var Handlebars = {};
29
29
  ;
30
30
  // lib/handlebars/base.js
31
31
 
32
- Handlebars.VERSION = "1.0.0-rc.3";
33
- Handlebars.COMPILER_REVISION = 2;
32
+ Handlebars.VERSION = "1.0.0-rc.4";
33
+ Handlebars.COMPILER_REVISION = 3;
34
34
 
35
35
  Handlebars.REVISION_CHANGES = {
36
36
  1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
37
- 2: '>= 1.0.0-rc.3'
37
+ 2: '== 1.0.0-rc.3',
38
+ 3: '>= 1.0.0-rc.4'
38
39
  };
39
40
 
40
41
  Handlebars.helpers = {};
41
42
  Handlebars.partials = {};
42
43
 
44
+ var toString = Object.prototype.toString,
45
+ functionType = '[object Function]',
46
+ objectType = '[object Object]';
47
+
43
48
  Handlebars.registerHelper = function(name, fn, inverse) {
44
- if(inverse) { fn.not = inverse; }
45
- this.helpers[name] = fn;
49
+ if (toString.call(name) === objectType) {
50
+ if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); }
51
+ Handlebars.Utils.extend(this.helpers, name);
52
+ } else {
53
+ if (inverse) { fn.not = inverse; }
54
+ this.helpers[name] = fn;
55
+ }
46
56
  };
47
57
 
48
58
  Handlebars.registerPartial = function(name, str) {
49
- this.partials[name] = str;
59
+ if (toString.call(name) === objectType) {
60
+ Handlebars.Utils.extend(this.partials, name);
61
+ } else {
62
+ this.partials[name] = str;
63
+ }
50
64
  };
51
65
 
52
66
  Handlebars.registerHelper('helperMissing', function(arg) {
@@ -57,8 +71,6 @@ Handlebars.registerHelper('helperMissing', function(arg) {
57
71
  }
58
72
  });
59
73
 
60
- var toString = Object.prototype.toString, functionType = "[object Function]";
61
-
62
74
  Handlebars.registerHelper('blockHelperMissing', function(context, options) {
63
75
  var inverse = options.inverse || function() {}, fn = options.fn;
64
76
 
@@ -156,7 +168,7 @@ Handlebars.registerHelper('unless', function(context, options) {
156
168
  });
157
169
 
158
170
  Handlebars.registerHelper('with', function(context, options) {
159
- return options.fn(context);
171
+ if (!Handlebars.Utils.isEmpty(context)) return options.fn(context);
160
172
  });
161
173
 
162
174
  Handlebars.registerHelper('log', function(context, options) {
@@ -203,6 +215,14 @@ var escapeChar = function(chr) {
203
215
  };
204
216
 
205
217
  Handlebars.Utils = {
218
+ extend: function(obj, value) {
219
+ for(var key in value) {
220
+ if(value.hasOwnProperty(key)) {
221
+ obj[key] = value[key];
222
+ }
223
+ }
224
+ },
225
+
206
226
  escapeExpression: function(string) {
207
227
  // don't escape SafeStrings, since they're already safe
208
228
  if (string instanceof Handlebars.SafeString) {
@@ -211,6 +231,11 @@ Handlebars.Utils = {
211
231
  return "";
212
232
  }
213
233
 
234
+ // Force a string conversion as this will be done by the append regardless and
235
+ // the regex test will do this transparently behind the scenes, causing issues if
236
+ // an object's to string has escaped characters in it.
237
+ string = string.toString();
238
+
214
239
  if(!possible.test(string)) { return string; }
215
240
  return string.replace(badChars, escapeChar);
216
241
  },
@@ -238,13 +263,11 @@ Handlebars.VM = {
238
263
  program: function(i, fn, data) {
239
264
  var programWrapper = this.programs[i];
240
265
  if(data) {
241
- return Handlebars.VM.program(fn, data);
242
- } else if(programWrapper) {
243
- return programWrapper;
244
- } else {
245
- programWrapper = this.programs[i] = Handlebars.VM.program(fn);
246
- return programWrapper;
266
+ programWrapper = Handlebars.VM.program(i, fn, data);
267
+ } else if (!programWrapper) {
268
+ programWrapper = this.programs[i] = Handlebars.VM.program(i, fn);
247
269
  }
270
+ return programWrapper;
248
271
  },
249
272
  programWithDepth: Handlebars.VM.programWithDepth,
250
273
  noop: Handlebars.VM.noop,
@@ -276,21 +299,27 @@ Handlebars.VM = {
276
299
  };
277
300
  },
278
301
 
279
- programWithDepth: function(fn, data, $depth) {
280
- var args = Array.prototype.slice.call(arguments, 2);
302
+ programWithDepth: function(i, fn, data /*, $depth */) {
303
+ var args = Array.prototype.slice.call(arguments, 3);
281
304
 
282
- return function(context, options) {
305
+ var program = function(context, options) {
283
306
  options = options || {};
284
307
 
285
308
  return fn.apply(this, [context, options.data || data].concat(args));
286
309
  };
310
+ program.program = i;
311
+ program.depth = args.length;
312
+ return program;
287
313
  },
288
- program: function(fn, data) {
289
- return function(context, options) {
314
+ program: function(i, fn, data) {
315
+ var program = function(context, options) {
290
316
  options = options || {};
291
317
 
292
318
  return fn(context, options.data || data);
293
319
  };
320
+ program.program = i;
321
+ program.depth = 0;
322
+ return program;
294
323
  },
295
324
  noop: function() { return ""; },
296
325
  invokePartial: function(partial, name, context, helpers, partials, data) {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: handlebars-source
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc3
4
+ version: 1.0.0.rc4
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-21 00:00:00.000000000 Z
12
+ date: 2013-05-15 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Handlebars.js source code wrapper for (pre)compilation gems.
15
15
  email: