templebars 0.0.4 → 0.0.5

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/README.md CHANGED
@@ -1,33 +1,33 @@
1
1
  # templebars
2
2
 
3
- This gem provides Handlebars 1.0.beta.6 to the Rails assert pipeline via `handlebars`. You can include it in other JS files:
3
+ `templebars` allows you to precomile Handlebars templates and make them available globally in a `Templates` object. (This can be set via `Templebars::Rails::GLOBAL`) Create files with a "handlebars", "hbs", or "hb" extension inside of a `templates/` directory in any `assets/javascripts/` directory:
4
4
 
5
- ```js
6
- //= require handlebars
5
+ ```
6
+ app/assets/javascripts/templates/todo_item.js.handlebars
7
7
  ```
8
8
 
9
- You can also include it via a regular ol' `javascript_include_tag` call:
9
+ You can then access it like any other JavaScript asset:
10
10
 
11
11
  ```ruby
12
- javascript_include_tag( "handlebars" )
12
+ javascript_include_tag( "templates/todo_item" )
13
13
  ```
14
14
 
15
- ## Precompiled templates
15
+ The above template would be stored as `Templates.todo_item`.
16
16
 
17
- `templebars` also allows you to precomile Handlebars templates and make them available globally in a `Templates` object. (This can be set via `Templebars::Rails::GLOBAL`) Create files with a "handlebars", "hbs", or "hb" extension inside of a `templates/` directory in any `assets/javascripts/` directory:
17
+ ## Handlebars
18
18
 
19
- ```
20
- app/assets/javascripts/templates/todo_item.js.handlebars
19
+ This gem also provides Handlebars 1.0.beta.6 to the Rails assert pipeline via `handlebars`. You can include it in other JS files:
20
+
21
+ ```js
22
+ //= require handlebars
21
23
  ```
22
24
 
23
- You can then access it like any other JavaScript asset:
25
+ You can also include it via a regular ol' `javascript_include_tag` call:
24
26
 
25
27
  ```ruby
26
- javascript_include_tag( "templates/todo_item" )
28
+ javascript_include_tag( "handlebars" )
27
29
  ```
28
30
 
29
- The above template would be stored as `Templates.todo_item`.
30
-
31
31
  ## Installation
32
32
 
33
33
  Add this to your Gemfile, preferably in the `:assets` gem group:
@@ -27,7 +27,7 @@ module Templebars
27
27
  protected
28
28
 
29
29
  def precompile( template )
30
- runtime.call( "Handlebars.precompile", template )
30
+ runtime.call( "Handlebars.precompile", template, { data: {} } )
31
31
  end
32
32
 
33
33
  def runtime
@@ -1,6 +1,6 @@
1
1
  module Templebars
2
2
  module Rails
3
- VERSION = "0.0.4"
4
- HANDLEBARSJS_VERSION = "1.0.beta.6"
3
+ VERSION = "0.0.5"
4
+ HANDLEBARSJS_VERSION = "1.0.beta.5"
5
5
  end
6
6
  end
@@ -1,7 +1,9 @@
1
1
  // lib/handlebars/base.js
2
+
3
+ /*jshint eqnull:true*/
2
4
  var Handlebars = {};
3
5
 
4
- Handlebars.VERSION = "1.0.beta.6";
6
+ Handlebars.VERSION = "1.0.beta.5";
5
7
 
6
8
  Handlebars.helpers = {};
7
9
  Handlebars.partials = {};
@@ -96,7 +98,6 @@ Handlebars.registerHelper('log', function(context) {
96
98
  // lib/handlebars/compiler/parser.js
97
99
  /* Jison generated parser */
98
100
  var handlebars = (function(){
99
-
100
101
  var parser = {trace: function trace() { },
101
102
  yy: {},
102
103
  symbols_: {"error":2,"root":3,"program":4,"EOF":5,"statements":6,"simpleInverse":7,"statement":8,"openInverse":9,"closeBlock":10,"openBlock":11,"mustache":12,"partial":13,"CONTENT":14,"COMMENT":15,"OPEN_BLOCK":16,"inMustache":17,"CLOSE":18,"OPEN_INVERSE":19,"OPEN_ENDBLOCK":20,"path":21,"OPEN":22,"OPEN_UNESCAPED":23,"OPEN_PARTIAL":24,"params":25,"hash":26,"param":27,"STRING":28,"INTEGER":29,"BOOLEAN":30,"hashSegments":31,"hashSegment":32,"ID":33,"EQUALS":34,"pathSegments":35,"SEP":36,"$accept":0,"$end":1},
@@ -106,85 +107,85 @@ performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
106
107
 
107
108
  var $0 = $$.length - 1;
108
109
  switch (yystate) {
109
- case 1: return $$[$0-1]
110
+ case 1: return $$[$0-1];
110
111
  break;
111
- case 2: this.$ = new yy.ProgramNode($$[$0-2], $$[$0])
112
+ case 2: this.$ = new yy.ProgramNode($$[$0-2], $$[$0]);
112
113
  break;
113
- case 3: this.$ = new yy.ProgramNode($$[$0])
114
+ case 3: this.$ = new yy.ProgramNode($$[$0]);
114
115
  break;
115
- case 4: this.$ = new yy.ProgramNode([])
116
+ case 4: this.$ = new yy.ProgramNode([]);
116
117
  break;
117
- case 5: this.$ = [$$[$0]]
118
+ case 5: this.$ = [$$[$0]];
118
119
  break;
119
- case 6: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]
120
+ case 6: $$[$0-1].push($$[$0]); this.$ = $$[$0-1];
120
121
  break;
121
- case 7: this.$ = new yy.InverseNode($$[$0-2], $$[$0-1], $$[$0])
122
+ case 7: this.$ = new yy.InverseNode($$[$0-2], $$[$0-1], $$[$0]);
122
123
  break;
123
- case 8: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1], $$[$0])
124
+ case 8: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1], $$[$0]);
124
125
  break;
125
- case 9: this.$ = $$[$0]
126
+ case 9: this.$ = $$[$0];
126
127
  break;
127
- case 10: this.$ = $$[$0]
128
+ case 10: this.$ = $$[$0];
128
129
  break;
129
- case 11: this.$ = new yy.ContentNode($$[$0])
130
+ case 11: this.$ = new yy.ContentNode($$[$0]);
130
131
  break;
131
- case 12: this.$ = new yy.CommentNode($$[$0])
132
+ case 12: this.$ = new yy.CommentNode($$[$0]);
132
133
  break;
133
- case 13: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1])
134
+ case 13: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]);
134
135
  break;
135
- case 14: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1])
136
+ case 14: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]);
136
137
  break;
137
- case 15: this.$ = $$[$0-1]
138
+ case 15: this.$ = $$[$0-1];
138
139
  break;
139
- case 16: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1])
140
+ case 16: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]);
140
141
  break;
141
- case 17: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], true)
142
+ case 17: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], true);
142
143
  break;
143
- case 18: this.$ = new yy.PartialNode($$[$0-1])
144
+ case 18: this.$ = new yy.PartialNode($$[$0-1]);
144
145
  break;
145
- case 19: this.$ = new yy.PartialNode($$[$0-2], $$[$0-1])
146
+ case 19: this.$ = new yy.PartialNode($$[$0-2], $$[$0-1]);
146
147
  break;
147
148
  case 20:
148
149
  break;
149
- case 21: this.$ = [[$$[$0-2]].concat($$[$0-1]), $$[$0]]
150
+ case 21: this.$ = [[$$[$0-2]].concat($$[$0-1]), $$[$0]];
150
151
  break;
151
- case 22: this.$ = [[$$[$0-1]].concat($$[$0]), null]
152
+ case 22: this.$ = [[$$[$0-1]].concat($$[$0]), null];
152
153
  break;
153
- case 23: this.$ = [[$$[$0-1]], $$[$0]]
154
+ case 23: this.$ = [[$$[$0-1]], $$[$0]];
154
155
  break;
155
- case 24: this.$ = [[$$[$0]], null]
156
+ case 24: this.$ = [[$$[$0]], null];
156
157
  break;
157
158
  case 25: $$[$0-1].push($$[$0]); this.$ = $$[$0-1];
158
159
  break;
159
- case 26: this.$ = [$$[$0]]
160
+ case 26: this.$ = [$$[$0]];
160
161
  break;
161
- case 27: this.$ = $$[$0]
162
+ case 27: this.$ = $$[$0];
162
163
  break;
163
- case 28: this.$ = new yy.StringNode($$[$0])
164
+ case 28: this.$ = new yy.StringNode($$[$0]);
164
165
  break;
165
- case 29: this.$ = new yy.IntegerNode($$[$0])
166
+ case 29: this.$ = new yy.IntegerNode($$[$0]);
166
167
  break;
167
- case 30: this.$ = new yy.BooleanNode($$[$0])
168
+ case 30: this.$ = new yy.BooleanNode($$[$0]);
168
169
  break;
169
- case 31: this.$ = new yy.HashNode($$[$0])
170
+ case 31: this.$ = new yy.HashNode($$[$0]);
170
171
  break;
171
- case 32: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]
172
+ case 32: $$[$0-1].push($$[$0]); this.$ = $$[$0-1];
172
173
  break;
173
- case 33: this.$ = [$$[$0]]
174
+ case 33: this.$ = [$$[$0]];
174
175
  break;
175
- case 34: this.$ = [$$[$0-2], $$[$0]]
176
+ case 34: this.$ = [$$[$0-2], $$[$0]];
176
177
  break;
177
- case 35: this.$ = [$$[$0-2], new yy.StringNode($$[$0])]
178
+ case 35: this.$ = [$$[$0-2], new yy.StringNode($$[$0])];
178
179
  break;
179
- case 36: this.$ = [$$[$0-2], new yy.IntegerNode($$[$0])]
180
+ case 36: this.$ = [$$[$0-2], new yy.IntegerNode($$[$0])];
180
181
  break;
181
- case 37: this.$ = [$$[$0-2], new yy.BooleanNode($$[$0])]
182
+ case 37: this.$ = [$$[$0-2], new yy.BooleanNode($$[$0])];
182
183
  break;
183
- case 38: this.$ = new yy.IdNode($$[$0])
184
+ case 38: this.$ = new yy.IdNode($$[$0]);
184
185
  break;
185
186
  case 39: $$[$0-2].push($$[$0]); this.$ = $$[$0-2];
186
187
  break;
187
- case 40: this.$ = [$$[$0]]
188
+ case 40: this.$ = [$$[$0]];
188
189
  break;
189
190
  }
190
191
  },
@@ -194,105 +195,191 @@ parseError: function parseError(str, hash) {
194
195
  throw new Error(str);
195
196
  },
196
197
  parse: function parse(input) {
197
- var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
198
+ var self = this,
199
+ stack = [0],
200
+ vstack = [null], // semantic value stack
201
+ lstack = [], // location stack
202
+ table = this.table,
203
+ yytext = '',
204
+ yylineno = 0,
205
+ yyleng = 0,
206
+ recovering = 0,
207
+ TERROR = 2,
208
+ EOF = 1;
209
+
210
+ //this.reductionCount = this.shiftCount = 0;
211
+
198
212
  this.lexer.setInput(input);
199
213
  this.lexer.yy = this.yy;
200
214
  this.yy.lexer = this.lexer;
201
- if (typeof this.lexer.yylloc == "undefined")
215
+ if (typeof this.lexer.yylloc == 'undefined')
202
216
  this.lexer.yylloc = {};
203
217
  var yyloc = this.lexer.yylloc;
204
218
  lstack.push(yyloc);
205
- if (typeof this.yy.parseError === "function")
219
+
220
+ if (typeof this.yy.parseError === 'function')
206
221
  this.parseError = this.yy.parseError;
207
- function popStack(n) {
208
- stack.length = stack.length - 2 * n;
222
+
223
+ function popStack (n) {
224
+ stack.length = stack.length - 2*n;
209
225
  vstack.length = vstack.length - n;
210
226
  lstack.length = lstack.length - n;
211
227
  }
228
+
212
229
  function lex() {
213
230
  var token;
214
- token = self.lexer.lex() || 1;
215
- if (typeof token !== "number") {
231
+ token = self.lexer.lex() || 1; // $end = 1
232
+ // if token isn't its numeric value, convert
233
+ if (typeof token !== 'number') {
216
234
  token = self.symbols_[token] || token;
217
235
  }
218
236
  return token;
219
237
  }
220
- var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
238
+
239
+ var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected;
221
240
  while (true) {
222
- state = stack[stack.length - 1];
241
+ // retreive state number from top of stack
242
+ state = stack[stack.length-1];
243
+
244
+ // use default actions if available
223
245
  if (this.defaultActions[state]) {
224
246
  action = this.defaultActions[state];
225
247
  } else {
226
248
  if (symbol == null)
227
249
  symbol = lex();
250
+ // read action for current state and first input
228
251
  action = table[state] && table[state][symbol];
229
252
  }
230
- if (typeof action === "undefined" || !action.length || !action[0]) {
253
+
254
+ // handle parse error
255
+ _handle_error:
256
+ if (typeof action === 'undefined' || !action.length || !action[0]) {
257
+
231
258
  if (!recovering) {
259
+ // Report error
232
260
  expected = [];
233
- for (p in table[state])
234
- if (this.terminals_[p] && p > 2) {
235
- expected.push("'" + this.terminals_[p] + "'");
236
- }
237
- var errStr = "";
261
+ for (p in table[state]) if (this.terminals_[p] && p > 2) {
262
+ expected.push("'"+this.terminals_[p]+"'");
263
+ }
264
+ var errStr = '';
238
265
  if (this.lexer.showPosition) {
239
- errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + this.terminals_[symbol] + "'";
266
+ errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'";
240
267
  } else {
241
- errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'");
268
+ errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " +
269
+ (symbol == 1 /*EOF*/ ? "end of input" :
270
+ ("'"+(this.terminals_[symbol] || symbol)+"'"));
242
271
  }
243
- this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
272
+ this.parseError(errStr,
273
+ {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
244
274
  }
245
- }
246
- if (action[0] instanceof Array && action.length > 1) {
247
- throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
248
- }
249
- switch (action[0]) {
250
- case 1:
251
- stack.push(symbol);
252
- vstack.push(this.lexer.yytext);
253
- lstack.push(this.lexer.yylloc);
254
- stack.push(action[1]);
255
- symbol = null;
256
- if (!preErrorSymbol) {
275
+
276
+ // just recovered from another error
277
+ if (recovering == 3) {
278
+ if (symbol == EOF) {
279
+ throw new Error(errStr || 'Parsing halted.');
280
+ }
281
+
282
+ // discard current lookahead and grab another
257
283
  yyleng = this.lexer.yyleng;
258
284
  yytext = this.lexer.yytext;
259
285
  yylineno = this.lexer.yylineno;
260
286
  yyloc = this.lexer.yylloc;
261
- if (recovering > 0)
262
- recovering--;
263
- } else {
264
- symbol = preErrorSymbol;
265
- preErrorSymbol = null;
266
- }
267
- break;
268
- case 2:
269
- len = this.productions_[action[1]][1];
270
- yyval.$ = vstack[vstack.length - len];
271
- yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};
272
- r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
273
- if (typeof r !== "undefined") {
274
- return r;
287
+ symbol = lex();
275
288
  }
276
- if (len) {
277
- stack = stack.slice(0, -1 * len * 2);
278
- vstack = vstack.slice(0, -1 * len);
279
- lstack = lstack.slice(0, -1 * len);
289
+
290
+ // try to recover from error
291
+ while (1) {
292
+ // check for error recovery rule in this state
293
+ if ((TERROR.toString()) in table[state]) {
294
+ break;
295
+ }
296
+ if (state == 0) {
297
+ throw new Error(errStr || 'Parsing halted.');
298
+ }
299
+ popStack(1);
300
+ state = stack[stack.length-1];
280
301
  }
281
- stack.push(this.productions_[action[1]][0]);
282
- vstack.push(yyval.$);
283
- lstack.push(yyval._$);
284
- newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
285
- stack.push(newState);
286
- break;
287
- case 3:
288
- return true;
302
+
303
+ preErrorSymbol = symbol; // save the lookahead token
304
+ symbol = TERROR; // insert generic error symbol as new lookahead
305
+ state = stack[stack.length-1];
306
+ action = table[state] && table[state][TERROR];
307
+ recovering = 3; // allow 3 real symbols to be shifted before reporting a new error
289
308
  }
309
+
310
+ // this shouldn't happen, unless resolve defaults are off
311
+ if (action[0] instanceof Array && action.length > 1) {
312
+ throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);
313
+ }
314
+
315
+ switch (action[0]) {
316
+
317
+ case 1: // shift
318
+ //this.shiftCount++;
319
+
320
+ stack.push(symbol);
321
+ vstack.push(this.lexer.yytext);
322
+ lstack.push(this.lexer.yylloc);
323
+ stack.push(action[1]); // push state
324
+ symbol = null;
325
+ if (!preErrorSymbol) { // normal execution/no error
326
+ yyleng = this.lexer.yyleng;
327
+ yytext = this.lexer.yytext;
328
+ yylineno = this.lexer.yylineno;
329
+ yyloc = this.lexer.yylloc;
330
+ if (recovering > 0)
331
+ recovering--;
332
+ } else { // error just occurred, resume old lookahead f/ before error
333
+ symbol = preErrorSymbol;
334
+ preErrorSymbol = null;
335
+ }
336
+ break;
337
+
338
+ case 2: // reduce
339
+ //this.reductionCount++;
340
+
341
+ len = this.productions_[action[1]][1];
342
+
343
+ // perform semantic action
344
+ yyval.$ = vstack[vstack.length-len]; // default to $$ = $1
345
+ // default location, uses first token for firsts, last for lasts
346
+ yyval._$ = {
347
+ first_line: lstack[lstack.length-(len||1)].first_line,
348
+ last_line: lstack[lstack.length-1].last_line,
349
+ first_column: lstack[lstack.length-(len||1)].first_column,
350
+ last_column: lstack[lstack.length-1].last_column
351
+ };
352
+ r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
353
+
354
+ if (typeof r !== 'undefined') {
355
+ return r;
356
+ }
357
+
358
+ // pop off stack
359
+ if (len) {
360
+ stack = stack.slice(0,-1*len*2);
361
+ vstack = vstack.slice(0, -1*len);
362
+ lstack = lstack.slice(0, -1*len);
363
+ }
364
+
365
+ stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce)
366
+ vstack.push(yyval.$);
367
+ lstack.push(yyval._$);
368
+ // goto new state = table[STATE][NONTERMINAL]
369
+ newState = table[stack[stack.length-2]][stack[stack.length-1]];
370
+ stack.push(newState);
371
+ break;
372
+
373
+ case 3: // accept
374
+ return true;
375
+ }
376
+
290
377
  }
378
+
291
379
  return true;
292
- }
293
- };/* Jison generated lexer */
380
+ }};
381
+ /* Jison generated lexer */
294
382
  var lexer = (function(){
295
-
296
383
  var lexer = ({EOF:1,
297
384
  parseError:function parseError(str, hash) {
298
385
  if (this.yy.parseError) {
@@ -353,6 +440,8 @@ next:function () {
353
440
 
354
441
  var token,
355
442
  match,
443
+ tempMatch,
444
+ index,
356
445
  col,
357
446
  lines;
358
447
  if (!this._more) {
@@ -361,26 +450,30 @@ next:function () {
361
450
  }
362
451
  var rules = this._currentRules();
363
452
  for (var i=0;i < rules.length; i++) {
364
- match = this._input.match(this.rules[rules[i]]);
365
- if (match) {
366
- lines = match[0].match(/\n.*/g);
367
- if (lines) this.yylineno += lines.length;
368
- this.yylloc = {first_line: this.yylloc.last_line,
369
- last_line: this.yylineno+1,
370
- first_column: this.yylloc.last_column,
371
- last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}
372
- this.yytext += match[0];
373
- this.match += match[0];
374
- this.matches = match;
375
- this.yyleng = this.yytext.length;
376
- this._more = false;
377
- this._input = this._input.slice(match[0].length);
378
- this.matched += match[0];
379
- token = this.performAction.call(this, this.yy, this, rules[i],this.conditionStack[this.conditionStack.length-1]);
380
- if (token) return token;
381
- else return;
453
+ tempMatch = this._input.match(this.rules[rules[i]]);
454
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
455
+ match = tempMatch;
456
+ index = i;
457
+ if (!this.options.flex) break;
382
458
  }
383
459
  }
460
+ if (match) {
461
+ lines = match[0].match(/\n.*/g);
462
+ if (lines) this.yylineno += lines.length;
463
+ this.yylloc = {first_line: this.yylloc.last_line,
464
+ last_line: this.yylineno+1,
465
+ first_column: this.yylloc.last_column,
466
+ last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}
467
+ this.yytext += match[0];
468
+ this.match += match[0];
469
+ this.yyleng = this.yytext.length;
470
+ this._more = false;
471
+ this._input = this._input.slice(match[0].length);
472
+ this.matched += match[0];
473
+ token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);
474
+ if (token) return token;
475
+ else return;
476
+ }
384
477
  if (this._input === "") {
385
478
  return this.EOF;
386
479
  } else {
@@ -411,6 +504,7 @@ topState:function () {
411
504
  pushState:function begin(condition) {
412
505
  this.begin(condition);
413
506
  }});
507
+ lexer.options = {};
414
508
  lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
415
509
 
416
510
  var YYSTATE=YY_START
@@ -476,7 +570,8 @@ break;
476
570
  }
477
571
  };
478
572
  lexer.rules = [/^[^\x00]*?(?=(\{\{))/,/^[^\x00]+/,/^[^\x00]{2,}?(?=(\{\{))/,/^\{\{>/,/^\{\{#/,/^\{\{\//,/^\{\{\^/,/^\{\{\s*else\b/,/^\{\{\{/,/^\{\{&/,/^\{\{![\s\S]*?\}\}/,/^\{\{/,/^=/,/^\.(?=[} ])/,/^\.\./,/^[\/.]/,/^\s+/,/^\}\}\}/,/^\}\}/,/^"(\\["]|[^"])*"/,/^true(?=[}\s])/,/^false(?=[}\s])/,/^[0-9]+(?=[}\s])/,/^[a-zA-Z0-9_$-]+(?=[=}\s\/.])/,/^\[[^\]]*\]/,/^./,/^$/];
479
- lexer.conditions = {"mu":{"rules":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"INITIAL":{"rules":[0,1,26],"inclusive":true}};return lexer;})()
573
+ lexer.conditions = {"mu":{"rules":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"INITIAL":{"rules":[0,1,26],"inclusive":true}};
574
+ return lexer;})()
480
575
  parser.lexer = lexer;
481
576
  return parser;
482
577
  })();
@@ -629,7 +724,7 @@ Handlebars.Exception = function(message) {
629
724
 
630
725
  this.message = tmp.message;
631
726
  };
632
- Handlebars.Exception.prototype = new Error;
727
+ Handlebars.Exception.prototype = new Error();
633
728
 
634
729
  // Build out our basic SafeString type
635
730
  Handlebars.SafeString = function(string) {
@@ -684,6 +779,8 @@ Handlebars.SafeString.prototype.toString = function() {
684
779
  };
685
780
  })();;
686
781
  // lib/handlebars/compiler/compiler.js
782
+
783
+ /*jshint eqnull:true*/
687
784
  Handlebars.Compiler = function() {};
688
785
  Handlebars.JavaScriptCompiler = function() {};
689
786
 
@@ -822,7 +919,7 @@ Handlebars.JavaScriptCompiler = function() {};
822
919
 
823
920
  compileProgram: function(program) {
824
921
  var result = new this.compiler().compile(program, this.options);
825
- var guid = this.guid++;
922
+ var guid = this.guid++, depth;
826
923
 
827
924
  this.usePartial = this.usePartial || result.usePartial;
828
925
 
@@ -999,13 +1096,13 @@ Handlebars.JavaScriptCompiler = function() {};
999
1096
  // PUBLIC API: You can override these methods in a subclass to provide
1000
1097
  // alternative compiled forms for name lookup and buffering semantics
1001
1098
  nameLookup: function(parent, name, type) {
1002
- if (/^[0-9]+$/.test(name)) {
1099
+ if (/^[0-9]+$/.test(name)) {
1003
1100
  return parent + "[" + name + "]";
1004
1101
  } else if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {
1005
- return parent + "." + name;
1006
- }
1007
- else {
1008
- return parent + "['" + name + "']";
1102
+ return parent + "." + name;
1103
+ }
1104
+ else {
1105
+ return parent + "['" + name + "']";
1009
1106
  }
1010
1107
  },
1011
1108
 
@@ -1130,7 +1227,7 @@ Handlebars.JavaScriptCompiler = function() {};
1130
1227
 
1131
1228
  // Generate minimizer alias mappings
1132
1229
  if (!this.isChild) {
1133
- var aliases = []
1230
+ var aliases = [];
1134
1231
  for (var alias in this.context.aliases) {
1135
1232
  this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias];
1136
1233
  }
@@ -1223,7 +1320,7 @@ Handlebars.JavaScriptCompiler = function() {};
1223
1320
  lookup: function(name) {
1224
1321
  var topStack = this.topStack();
1225
1322
  this.source.push(topStack + " = (" + topStack + " === null || " + topStack + " === undefined || " + topStack + " === false ? " +
1226
- topStack + " : " + this.nameLookup(topStack, name, 'context') + ");");
1323
+ topStack + " : " + this.nameLookup(topStack, name, 'context') + ");");
1227
1324
  },
1228
1325
 
1229
1326
  pushStringParam: function(string) {
@@ -1318,7 +1415,7 @@ Handlebars.JavaScriptCompiler = function() {};
1318
1415
  this.source.push(nextStack + " = " + id + ".call(" + paramString + ");");
1319
1416
  } else {
1320
1417
  this.context.aliases.functionType = '"function"';
1321
- var condition = program ? "foundHelper && " : ""
1418
+ var condition = program ? "foundHelper && " : "";
1322
1419
  this.source.push("if(" + condition + "typeof " + id + " === functionType) { " + nextStack + " = " + id + ".call(" + paramString + "); }");
1323
1420
  }
1324
1421
  fn.call(this, nextStack, helperMissingString, id);
@@ -1326,7 +1423,7 @@ Handlebars.JavaScriptCompiler = function() {};
1326
1423
  },
1327
1424
 
1328
1425
  invokePartial: function(context) {
1329
- params = [this.nameLookup('partials', context, 'partial'), "'" + context + "'", this.popStack(), "helpers", "partials"];
1426
+ var params = [this.nameLookup('partials', context, 'partial'), "'" + context + "'", this.popStack(), "helpers", "partials"];
1330
1427
 
1331
1428
  if (this.options.data) {
1332
1429
  params.push("data");
@@ -1365,7 +1462,8 @@ Handlebars.JavaScriptCompiler = function() {};
1365
1462
  if(guid == null) { return "self.noop"; }
1366
1463
 
1367
1464
  var child = this.environment.children[guid],
1368
- depths = child.depths.list;
1465
+ depths = child.depths.list, depth;
1466
+
1369
1467
  var programParams = [child.index, child.name, "data"];
1370
1468
 
1371
1469
  for(var i=0, l = depths.length; i<l; i++) {
@@ -1447,12 +1545,12 @@ Handlebars.JavaScriptCompiler = function() {};
1447
1545
  compilerWords[reservedWords[i]] = true;
1448
1546
  }
1449
1547
 
1450
- JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
1451
- if(!JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(name)) {
1452
- return true;
1453
- }
1454
- return false;
1455
- }
1548
+ JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
1549
+ if(!JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(name)) {
1550
+ return true;
1551
+ }
1552
+ return false;
1553
+ };
1456
1554
 
1457
1555
  })(Handlebars.Compiler, Handlebars.JavaScriptCompiler);
1458
1556
 
@@ -1531,7 +1629,7 @@ Handlebars.VM = {
1531
1629
  },
1532
1630
  noop: function() { return ""; },
1533
1631
  invokePartial: function(partial, name, context, helpers, partials, data) {
1534
- options = { helpers: helpers, partials: partials, data: data };
1632
+ var options = { helpers: helpers, partials: partials, data: data };
1535
1633
 
1536
1634
  if(partial === undefined) {
1537
1635
  throw new Handlebars.Exception("The partial " + name + " could not be found");
@@ -1547,4 +1645,4 @@ Handlebars.VM = {
1547
1645
  };
1548
1646
 
1549
1647
  Handlebars.template = Handlebars.VM.template;
1550
- ;
1648
+ ;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: templebars
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-13 00:00:00.000000000 Z
12
+ date: 2012-02-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
16
- requirement: &70364819080120 !ruby/object:Gem::Requirement
16
+ requirement: &70340437390040 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -24,10 +24,10 @@ dependencies:
24
24
  version: '5.0'
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *70364819080120
27
+ version_requirements: *70340437390040
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: execjs
30
- requirement: &70364819079440 !ruby/object:Gem::Requirement
30
+ requirement: &70340437388320 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ! '>='
@@ -35,7 +35,7 @@ dependencies:
35
35
  version: '0'
36
36
  type: :runtime
37
37
  prerelease: false
38
- version_requirements: *70364819079440
38
+ version_requirements: *70340437388320
39
39
  description: This gem provides Handlebars magic for your Rails 3 application.
40
40
  email:
41
41
  - tyson@stovepipestudios.com
@@ -81,4 +81,3 @@ signing_key:
81
81
  specification_version: 3
82
82
  summary: Use precompiled Handlebars templates with Rails 3
83
83
  test_files: []
84
- has_rdoc: