handlebars_assets 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.7.1 (2012-12-4)
2
+
3
+ * Use edge version of `handlebars.js` ([this commit](https://github.com/wycats/handlebars.js/commit/bd0490145438e8f9df05abd2f4c25687bac81326)) to fix regression with context functions
4
+
1
5
  ## 0.7.0 (2012-11-16)
2
6
 
3
7
  * Support `.hamlbars` extension and Haml
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- handlebars_assets (0.7.0)
4
+ handlebars_assets (0.7.1)
5
5
  execjs (>= 1.2.9)
6
6
  sprockets (>= 2.0.3)
7
7
  tilt
@@ -13,10 +13,10 @@ GEM
13
13
  multi_json (~> 1.0)
14
14
  haml (3.1.7)
15
15
  hike (1.2.1)
16
- multi_json (1.3.6)
16
+ multi_json (1.4.0)
17
17
  rack (1.4.1)
18
18
  rake (0.9.2.2)
19
- sprockets (2.4.5)
19
+ sprockets (2.8.1)
20
20
  hike (~> 1.2)
21
21
  multi_json (~> 1.0)
22
22
  rack (~> 1.0)
data/README.md CHANGED
@@ -8,7 +8,9 @@ Using `sprockets` with Sinatra or another framework? **handlebars_assets** works
8
8
 
9
9
  ## handlebars.js
10
10
 
11
- `handlebars_assets` is packaged with `v1.0.rc.1` of `handlebars.js`.
11
+ **Please read**
12
+
13
+ Because of a serious regression introduced in RC1, `handlebars_assets` is packaged with an edge build of `handlebars.js` (this [commit](https://github.com/wycats/handlebars.js/commit/bd0490145438e8f9df05abd2f4c25687bac81326). See the section on using another version if that does not work for you.
12
14
 
13
15
  ## Installation with Rails 3.1+
14
16
 
@@ -48,10 +50,22 @@ If you need to compile your JavaScript templates in the browser as well, you sho
48
50
 
49
51
  ## Precompiling
50
52
 
51
- `handlebars_assets` also works when you are precompiling your assets. If you are deploying to Heroku, be sure to read the [Rails guide](http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets) and in your `config/application.rb` set:
53
+ `handlebars_assets` also works when you are precompiling your assets.
54
+
55
+ ### Heroku
56
+
57
+ If you are deploying to Heroku, be sure to read the [Rails guide](http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets) and in your `config/application.rb` set:
52
58
 
53
59
  config.assets.initialize_on_precompile = false
54
60
 
61
+ This avoids running your initializers when compiling assets (see the [guide](http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets) for why you would want that).
62
+
63
+ However, that does mean that you cannot set your configuration in an initializer. This [issue](https://github.com/leshill/handlebars_assets/issues/34) has a workaround, or you can set:
64
+
65
+ config.assets.initialize_on_precompile = true
66
+
67
+ This will run all your initializers before precompiling assets.
68
+
55
69
  ## Templates directory
56
70
 
57
71
  You should locate your templates with your other assets, for example `app/assets/javascripts/templates`. In your JavaScript manifest file, use `require_tree` to pull in the templates
@@ -98,13 +112,11 @@ For example, if you have a file `widget.hamlbars` that looks like this:
98
112
  %h1 {{title}}
99
113
  %p {{body}}
100
114
 
101
- Haml will first convert it to:
115
+ The Haml will be pre-processed so that the Handlebars template is basically this:
102
116
 
103
117
  <h1> {{title}} </h1>
104
118
  <p> {{body}} </p>
105
119
 
106
- And the Handlebars will turn it into a JavaScript template.
107
-
108
120
  ## Partials
109
121
 
110
122
  If you begin the name of the template with an underscore, it will be recognized as a partial. You can invoke partials inside a template using the Handlebars partial syntax:
@@ -1,3 +1,3 @@
1
1
  module HandlebarsAssets
2
- VERSION = "0.7.0"
2
+ VERSION = "0.7.1"
3
3
  end
@@ -64,20 +64,33 @@ Handlebars.createFrame = Object.create || function(object) {
64
64
 
65
65
  Handlebars.registerHelper('each', function(context, options) {
66
66
  var fn = options.fn, inverse = options.inverse;
67
- var ret = "", data;
67
+ var i = 0, ret = "", data;
68
68
 
69
69
  if (options.data) {
70
70
  data = Handlebars.createFrame(options.data);
71
71
  }
72
72
 
73
- if(context && context.length > 0) {
74
- for(var i=0, j=context.length; i<j; i++) {
75
- if (data) { data.index = i; }
76
- ret = ret + fn(context[i], { data: data });
73
+ if(context && typeof context === 'object') {
74
+ if(context instanceof Array){
75
+ for(var j = context.length; i<j; i++) {
76
+ if (data) { data.index = i; }
77
+ ret = ret + fn(context[i], { data: data });
78
+ }
79
+ } else {
80
+ for(var key in context) {
81
+ if(context.hasOwnProperty(key)) {
82
+ if(data) { data.key = key; }
83
+ ret = ret + fn(context[key], {data: data});
84
+ i++;
85
+ }
86
+ }
77
87
  }
78
- } else {
88
+ }
89
+
90
+ if(i === 0){
79
91
  ret = inverse(this);
80
92
  }
93
+
81
94
  return ret;
82
95
  });
83
96
 
@@ -506,62 +519,66 @@ case 2:
506
519
  return 14;
507
520
 
508
521
  break;
509
- case 3: return 24;
522
+ case 3: yy_.yytext = yy_.yytext.substr(0, yy_.yyleng-4); this.popState(); return 15;
510
523
  break;
511
- case 4: return 16;
524
+ case 4: return 24;
512
525
  break;
513
- case 5: return 20;
526
+ case 5: return 16;
514
527
  break;
515
- case 6: return 19;
528
+ case 6: return 20;
516
529
  break;
517
530
  case 7: return 19;
518
531
  break;
519
- case 8: return 23;
532
+ case 8: return 19;
520
533
  break;
521
534
  case 9: return 23;
522
535
  break;
523
- case 10: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15;
536
+ case 10: return 23;
537
+ break;
538
+ case 11: this.popState(); this.begin('com');
539
+ break;
540
+ case 12: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15;
524
541
  break;
525
- case 11: return 22;
542
+ case 13: return 22;
526
543
  break;
527
- case 12: return 35;
544
+ case 14: return 35;
528
545
  break;
529
- case 13: return 34;
546
+ case 15: return 34;
530
547
  break;
531
- case 14: return 34;
548
+ case 16: return 34;
532
549
  break;
533
- case 15: return 37;
550
+ case 17: return 37;
534
551
  break;
535
- case 16: /*ignore whitespace*/
552
+ case 18: /*ignore whitespace*/
536
553
  break;
537
- case 17: this.popState(); return 18;
554
+ case 19: this.popState(); return 18;
538
555
  break;
539
- case 18: this.popState(); return 18;
556
+ case 20: this.popState(); return 18;
540
557
  break;
541
- case 19: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 29;
558
+ case 21: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 29;
542
559
  break;
543
- case 20: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 29;
560
+ case 22: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\'/g,"'"); return 29;
544
561
  break;
545
- case 21: yy_.yytext = yy_.yytext.substr(1); return 27;
562
+ case 23: yy_.yytext = yy_.yytext.substr(1); return 27;
546
563
  break;
547
- case 22: return 31;
564
+ case 24: return 31;
548
565
  break;
549
- case 23: return 31;
566
+ case 25: return 31;
550
567
  break;
551
- case 24: return 30;
568
+ case 26: return 30;
552
569
  break;
553
- case 25: return 34;
570
+ case 27: return 34;
554
571
  break;
555
- case 26: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 34;
572
+ case 28: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 34;
556
573
  break;
557
- case 27: return 'INVALID';
574
+ case 29: return 'INVALID';
558
575
  break;
559
- case 28: return 5;
576
+ case 30: return 5;
560
577
  break;
561
578
  }
562
579
  };
563
- lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[} ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@[a-zA-Z]+)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:[0-9]+(?=[}\s]))/,/^(?:[a-zA-Z0-9_$-]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/];
564
- 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,27,28],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"INITIAL":{"rules":[0,1,28],"inclusive":true}};
580
+ 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\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/];
581
+ 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,30],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"com":{"rules":[3],"inclusive":false},"INITIAL":{"rules":[0,1,30],"inclusive":true}};
565
582
  return lexer;})()
566
583
  parser.lexer = lexer;
567
584
  function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser;
@@ -728,14 +745,16 @@ Handlebars.log = function(level, str) { Handlebars.logger.log(level, str); };
728
745
 
729
746
  })();;
730
747
  // lib/handlebars/utils.js
748
+
749
+ var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
750
+
731
751
  Handlebars.Exception = function(message) {
732
752
  var tmp = Error.prototype.constructor.apply(this, arguments);
733
753
 
734
- for (var p in tmp) {
735
- if (tmp.hasOwnProperty(p)) { this[p] = tmp[p]; }
754
+ // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
755
+ for (var idx = 0; idx < errorProps.length; idx++) {
756
+ this[errorProps[idx]] = tmp[errorProps[idx]];
736
757
  }
737
-
738
- this.message = tmp.message;
739
758
  };
740
759
  Handlebars.Exception.prototype = new Error();
741
760
 
@@ -1434,7 +1453,7 @@ Handlebars.JavaScriptCompiler = function() {};
1434
1453
  this.context.aliases.functionType = '"function"';
1435
1454
 
1436
1455
  this.replaceStack(function(current) {
1437
- return "typeof " + current + " === functionType ? " + current + "() : " + current;
1456
+ return "typeof " + current + " === functionType ? " + current + ".apply(depth0) : " + current;
1438
1457
  });
1439
1458
  },
1440
1459
 
@@ -1579,7 +1598,7 @@ Handlebars.JavaScriptCompiler = function() {};
1579
1598
  var nextStack = this.nextStack();
1580
1599
 
1581
1600
  this.source.push('if (foundHelper) { ' + nextStack + ' = foundHelper.call(' + helper.callParams + '); }');
1582
- this.source.push('else { ' + nextStack + ' = ' + nonHelper + '; ' + nextStack + ' = typeof ' + nextStack + ' === functionType ? ' + nextStack + '() : ' + nextStack + '; }');
1601
+ this.source.push('else { ' + nextStack + ' = ' + nonHelper + '; ' + nextStack + ' = typeof ' + nextStack + ' === functionType ? ' + nextStack + '.apply(depth0) : ' + nextStack + '; }');
1583
1602
  },
1584
1603
 
1585
1604
  // [invokePartial]
@@ -64,20 +64,33 @@ Handlebars.createFrame = Object.create || function(object) {
64
64
 
65
65
  Handlebars.registerHelper('each', function(context, options) {
66
66
  var fn = options.fn, inverse = options.inverse;
67
- var ret = "", data;
67
+ var i = 0, ret = "", data;
68
68
 
69
69
  if (options.data) {
70
70
  data = Handlebars.createFrame(options.data);
71
71
  }
72
72
 
73
- if(context && context.length > 0) {
74
- for(var i=0, j=context.length; i<j; i++) {
75
- if (data) { data.index = i; }
76
- ret = ret + fn(context[i], { data: data });
73
+ if(context && typeof context === 'object') {
74
+ if(context instanceof Array){
75
+ for(var j = context.length; i<j; i++) {
76
+ if (data) { data.index = i; }
77
+ ret = ret + fn(context[i], { data: data });
78
+ }
79
+ } else {
80
+ for(var key in context) {
81
+ if(context.hasOwnProperty(key)) {
82
+ if(data) { data.key = key; }
83
+ ret = ret + fn(context[key], {data: data});
84
+ i++;
85
+ }
86
+ }
77
87
  }
78
- } else {
88
+ }
89
+
90
+ if(i === 0){
79
91
  ret = inverse(this);
80
92
  }
93
+
81
94
  return ret;
82
95
  });
83
96
 
@@ -111,14 +124,16 @@ Handlebars.registerHelper('log', function(context) {
111
124
  }(this.Handlebars));
112
125
  ;
113
126
  // lib/handlebars/utils.js
127
+
128
+ var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
129
+
114
130
  Handlebars.Exception = function(message) {
115
131
  var tmp = Error.prototype.constructor.apply(this, arguments);
116
132
 
117
- for (var p in tmp) {
118
- if (tmp.hasOwnProperty(p)) { this[p] = tmp[p]; }
133
+ // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
134
+ for (var idx = 0; idx < errorProps.length; idx++) {
135
+ this[errorProps[idx]] = tmp[errorProps[idx]];
119
136
  }
120
-
121
- this.message = tmp.message;
122
137
  };
123
138
  Handlebars.Exception.prototype = new Error();
124
139
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: handlebars_assets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  prerelease:
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: 2012-11-16 00:00:00.000000000 Z
12
+ date: 2012-12-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: execjs