hogan_assets 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hogan_assets (1.0.0)
4
+ hogan_assets (1.0.1)
5
5
  execjs (>= 1.2.9)
6
6
  sprockets (>= 2.0.3)
7
7
  tilt (>= 1.3.3)
data/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  **HoganAssets** compiles your [mustache](http://mustache.github.com/) templates with [hogan.js](http://twitter.github.com/hogan.js/) on **sprockets** and the Rails asset pipeline.
4
4
 
5
- **hogan.js** is a templating engine developed at [Twitter](http://twitter.com) that follows the **mustache** spec and compiles the templates to JavaScript. The first bit is *cool*, since `mustache` is *cool*. The second bit is **awesome and full of win** because we can now compile our **mustache** templates on the server using the asset pipeline/sprockets.
5
+ **hogan.js** is a templating engine developed at [Twitter](http://twitter.com) that follows the **mustache** spec and compiles the templates to JavaScript. The first bit is *cool*, since **mustache** is *cool*. The second bit is **awesome and full of win** because we can now compile our **mustache** templates on the server using the asset pipeline/sprockets.
6
6
 
7
- This gem contains **hogan.js v1.0.2**
7
+ This gem contains **hogan.js v1.0.4**
8
8
 
9
9
  ## Installation
10
10
 
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
6
6
  gem.email = ["leshill@gmail.com"]
7
7
  gem.description = %q{Use compiled hogan.js (mustache) JavaScript templates with sprockets and the Rails asset pipeline.}
8
8
  gem.summary = %q{Use compiled hogan.js (mustache) JavaScript templates with sprockets and the Rails asset pipeline.}
9
- gem.homepage = ""
9
+ gem.homepage = "https://github.com/leshill/hogan_assets"
10
10
 
11
11
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
12
  gem.files = `git ls-files`.split("\n")
@@ -11,7 +11,7 @@ module HoganAssets
11
11
  <<-TEMPLATE
12
12
  (function() {
13
13
  this.HoganTemplates || (this.HoganTemplates = {});
14
- this.HoganTemplates[#{template_name}] = new HoganTemplate(#{code});
14
+ this.HoganTemplates[#{template_name}] = new Hogan.Template(#{code});
15
15
  this.HoganTemplates[#{template_name}].r = #{compiled_template};
16
16
  return HoganTemplates[#{template_name}];
17
17
  }).call(this);
@@ -1,3 +1,3 @@
1
1
  module HoganAssets
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -15,8 +15,8 @@ module HoganAssets
15
15
  assert_equal <<END_EXPECTED, template.render(scope, {})
16
16
  (function() {
17
17
  this.HoganTemplates || (this.HoganTemplates = {});
18
- this.HoganTemplates["path/to/template"] = new HoganTemplate("This is {{mustache}}");
19
- this.HoganTemplates["path/to/template"].r = function(cx,p){var c = [cx];var b = "";var _ = this;b += "This is ";b += (_.v(_.f("mustache",c,p,0)));return b;;};
18
+ this.HoganTemplates["path/to/template"] = new Hogan.Template("This is {{mustache}}");
19
+ this.HoganTemplates["path/to/template"].r = function(c,p,i){i = i || "";var b = i + "";var _ = this;b += "This is ";b += (_.v(_.f("mustache",c,p,0)));return b;;};
20
20
  return HoganTemplates["path/to/template"];
21
21
  }).call(this);
22
22
  END_EXPECTED
@@ -13,21 +13,33 @@
13
13
  * limitations under the License.
14
14
  */
15
15
 
16
- var HoganTemplate = (function () {
17
16
 
18
- function constructor(text) {
19
- this.text = text;
17
+
18
+ var Hogan = {};
19
+
20
+ (function (Hogan) {
21
+ Hogan.Template = function constructor(renderFunc, text, compiler) {
22
+ if (renderFunc) {
23
+ this.r = renderFunc;
24
+ }
25
+ this.c = compiler;
26
+ this.text = text || '';
20
27
  }
21
28
 
22
- constructor.prototype = {
29
+ Hogan.Template.prototype = {
23
30
  // render: replaced by generated code.
24
- r: function (context, partials) { return ''; },
31
+ r: function (context, partials, indent) { return ''; },
25
32
 
26
33
  // variable escaping
27
34
  v: hoganEscape,
28
35
 
29
- render: function render(context, partials) {
30
- return this.r(context, partials);
36
+ render: function render(context, partials, indent) {
37
+ return this.ri([context], partials || {}, indent);
38
+ },
39
+
40
+ // render internal -- a hook for overrides that catches partials too
41
+ ri: function (context, partials, indent) {
42
+ return this.r(context, partials, indent);
31
43
  },
32
44
 
33
45
  // tries to find a partial in the curent scope and render it
@@ -38,7 +50,11 @@ var HoganTemplate = (function () {
38
50
  return '';
39
51
  }
40
52
 
41
- return partial.render(context, partials);
53
+ if (this.c && typeof partial == 'string') {
54
+ partial = this.c.compile(partial);
55
+ }
56
+
57
+ return partial.ri(context, partials, indent);
42
58
  },
43
59
 
44
60
  // render a section
@@ -47,8 +63,7 @@ var HoganTemplate = (function () {
47
63
  tail = context[context.length - 1];
48
64
 
49
65
  if (!isArray(tail)) {
50
- buf = section(context, partials);
51
- return buf;
66
+ return buf = section(context, partials);
52
67
  }
53
68
 
54
69
  for (var i = 0; i < tail.length; i++) {
@@ -56,19 +71,20 @@ var HoganTemplate = (function () {
56
71
  buf += section(context, partials);
57
72
  context.pop();
58
73
  }
74
+
59
75
  return buf;
60
76
  },
61
77
 
62
78
  // maybe start a section
63
- s: function(val, ctx, partials, inverted, start, end) {
79
+ s: function(val, ctx, partials, inverted, start, end, tags) {
64
80
  var pass;
65
81
 
66
82
  if (isArray(val) && val.length === 0) {
67
83
  return false;
68
84
  }
69
85
 
70
- if (!inverted && typeof val == 'function') {
71
- val = this.ls(val, ctx, partials, start, end);
86
+ if (typeof val == 'function') {
87
+ val = this.ls(val, ctx, partials, inverted, start, end, tags);
72
88
  }
73
89
 
74
90
  pass = (val === '') || !!val;
@@ -82,7 +98,6 @@ var HoganTemplate = (function () {
82
98
 
83
99
  // find values with dotted names
84
100
  d: function(key, ctx, partials, returnFound) {
85
-
86
101
  var names = key.split('.'),
87
102
  val = this.f(names[0], ctx, partials, returnFound),
88
103
  cx = null;
@@ -140,11 +155,12 @@ var HoganTemplate = (function () {
140
155
  },
141
156
 
142
157
  // higher order templates
143
- ho: function(val, cx, partials, text) {
158
+ ho: function(val, cx, partials, text, tags) {
159
+ var compiler = this.c;
144
160
  var t = val.call(cx, text, function(t) {
145
- return Hogan.compile(t).render(cx);
161
+ return compiler.compile(t, {delimiters: tags}).render(cx, partials);
146
162
  });
147
- var s = Hogan.compile(t.toString()).render(cx, partials);
163
+ var s = compiler.compile(t.toString(), {delimiters: tags}).render(cx, partials);
148
164
  this.b = s;
149
165
  return false;
150
166
  },
@@ -153,45 +169,74 @@ var HoganTemplate = (function () {
153
169
  b: '',
154
170
 
155
171
  // lambda replace section
156
- ls: function(val, ctx, partials, start, end) {
172
+ ls: function(val, ctx, partials, inverted, start, end, tags) {
157
173
  var cx = ctx[ctx.length - 1],
158
- t = val.call(cx);
174
+ t = null;
159
175
 
160
- if (val.length > 0) {
161
- return this.ho(val, cx, partials, this.text.substring(start, end));
176
+ if (!inverted && this.c && val.length > 0) {
177
+ return this.ho(val, cx, partials, this.text.substring(start, end), tags);
162
178
  }
163
179
 
180
+ t = val.call(cx);
181
+
164
182
  if (typeof t == 'function') {
165
- return this.ho(t, cx, partials, this.text.substring(start, end));
183
+ if (inverted) {
184
+ return true;
185
+ } else if (this.c) {
186
+ return this.ho(t, cx, partials, this.text.substring(start, end), tags);
187
+ }
166
188
  }
189
+
167
190
  return t;
168
191
  },
169
192
 
170
193
  // lambda replace variable
171
194
  lv: function(val, ctx, partials) {
172
195
  var cx = ctx[ctx.length - 1];
173
- return Hogan.compile(val.call(cx).toString()).render(cx, partials);
196
+ var result = val.call(cx);
197
+ if (typeof result == 'function') {
198
+ result = result.call(cx);
199
+ }
200
+ result = result.toString();
201
+
202
+ if (this.c && ~result.indexOf("{{")) {
203
+ return this.c.compile(result).render(cx, partials);
204
+ }
205
+
206
+ return result;
174
207
  }
208
+
175
209
  };
176
210
 
177
- var rAmp = /&/g, rLt = /</g, rGt = />/g, rApos =/\'/g,
178
- rQuot = /\"/g, hChars =/[&<>\"\']/;
211
+ var rAmp = /&/g,
212
+ rLt = /</g,
213
+ rGt = />/g,
214
+ rApos =/\'/g,
215
+ rQuot = /\"/g,
216
+ hChars =/[&<>\"\']/;
217
+
179
218
  function hoganEscape(str) {
180
- var s = String(str === null ? '' : str);
181
- return hChars.test(s) ? s.replace(rAmp,'&amp;')
182
- .replace(rLt,'&lt;').replace(rGt,'&gt;')
183
- .replace(rApos,'&#39;').replace(rQuot, '&quot;') : s;
219
+ str = String((str === null || str === undefined) ? '' : str);
220
+ return hChars.test(str) ?
221
+ str
222
+ .replace(rAmp,'&amp;')
223
+ .replace(rLt,'&lt;')
224
+ .replace(rGt,'&gt;')
225
+ .replace(rApos,'&#39;')
226
+ .replace(rQuot, '&quot;') :
227
+ str;
184
228
  }
185
229
 
186
230
  var isArray = Array.isArray || function(a) {
187
231
  return Object.prototype.toString.call(a) === '[object Array]';
188
232
  };
189
233
 
190
- return constructor;
191
- })();
234
+ })(typeof exports !== 'undefined' ? exports : Hogan);
235
+
236
+
192
237
 
193
- var Hogan = (function () {
194
238
 
239
+ (function (Hogan) {
195
240
  // Setup regex assignments
196
241
  // remove whitespace according to Mustache spec
197
242
  var rIsWhitespace = /\S/,
@@ -204,7 +249,7 @@ var Hogan = (function () {
204
249
  '<': 6, '=': 7, '_v': 8, '{': 9, '&': 10
205
250
  };
206
251
 
207
- function scan(text) {
252
+ Hogan.scan = function scan(text, delimiters) {
208
253
  var len = text.length,
209
254
  IN_TEXT = 0,
210
255
  IN_TAG_TYPE = 1,
@@ -232,7 +277,7 @@ var Hogan = (function () {
232
277
  for (var j = lineStart; j < tokens.length; j++) {
233
278
  isAllWhitespace =
234
279
  (tokens[j].tag && tagTypes[tokens[j].tag] < tagTypes['_v']) ||
235
- (!tokens[j].tag && tokens[j].match(rIsWhitespace) === null);
280
+ (!tokens[j].tag && tokens[j].match(rIsWhitespace) === null);
236
281
  if (!isAllWhitespace) {
237
282
  return false;
238
283
  }
@@ -243,9 +288,14 @@ var Hogan = (function () {
243
288
 
244
289
  function filterLine(haveSeenTag, noNewLine) {
245
290
  addBuf();
291
+
246
292
  if (haveSeenTag && lineIsWhitespace()) {
247
- for (var j = lineStart; j < tokens.length; j++) {
293
+ for (var j = lineStart, next; j < tokens.length; j++) {
248
294
  if (!tokens[j].tag) {
295
+ if ((next = tokens[j+1]) && next.tag == '>') {
296
+ // set indent to token value
297
+ next.indent = tokens[j].toString()
298
+ }
249
299
  tokens.splice(j, 1);
250
300
  }
251
301
  }
@@ -260,13 +310,22 @@ var Hogan = (function () {
260
310
  function changeDelimiters(text, index) {
261
311
  var close = '=' + ctag,
262
312
  closeIndex = text.indexOf(close, index),
263
- delimiters = trim(text.substring(text.indexOf('=', index) + 1,
264
- closeIndex)).split(' ');
313
+ delimiters = trim(
314
+ text.substring(text.indexOf('=', index) + 1, closeIndex)
315
+ ).split(' ');
316
+
265
317
  otag = delimiters[0];
266
318
  ctag = delimiters[1];
319
+
267
320
  return closeIndex + close.length - 1;
268
321
  }
269
322
 
323
+ if (delimiters) {
324
+ delimiters = delimiters.split(' ');
325
+ otag = delimiters[0];
326
+ ctag = delimiters[1];
327
+ }
328
+
270
329
  for (i = 0; i < len; i++) {
271
330
  if (state == IN_TEXT) {
272
331
  if (tagChange(otag, text, i)) {
@@ -284,7 +343,6 @@ var Hogan = (function () {
284
343
  i += otag.length - 1;
285
344
  tag = tagTypes[text.charAt(i + 1)];
286
345
  tagType = tag ? text.charAt(i + 1) : '_v';
287
- seenTag = i;
288
346
  if (tagType == '=') {
289
347
  i = changeDelimiters(text, i);
290
348
  state = IN_TEXT;
@@ -294,15 +352,20 @@ var Hogan = (function () {
294
352
  }
295
353
  state = IN_TAG;
296
354
  }
355
+ seenTag = i;
297
356
  } else {
298
357
  if (tagChange(ctag, text, i)) {
299
- i += ctag.length - 1;
300
- tokens.push({tag: tagType, n: trim(buf),
301
- i: (tagType == '/') ? seenTag - 1 : i + 1});
358
+ tokens.push({tag: tagType, n: trim(buf), otag: otag, ctag: ctag,
359
+ i: (tagType == '/') ? seenTag - ctag.length : i + otag.length});
302
360
  buf = '';
361
+ i += ctag.length - 1;
303
362
  state = IN_TEXT;
304
363
  if (tagType == '{') {
305
- i++;
364
+ if (ctag == '}}') {
365
+ i++;
366
+ } else {
367
+ cleanTripleStache(tokens[tokens.length - 1]);
368
+ }
306
369
  }
307
370
  } else {
308
371
  buf += text.charAt(i);
@@ -315,6 +378,12 @@ var Hogan = (function () {
315
378
  return tokens;
316
379
  }
317
380
 
381
+ function cleanTripleStache(token) {
382
+ if (token.n.substr(token.n.length - 1) === '}') {
383
+ token.n = token.n.substring(0, token.n.length - 1);
384
+ }
385
+ }
386
+
318
387
  function trim(s) {
319
388
  if (s.trim) {
320
389
  return s.trim();
@@ -344,8 +413,7 @@ var Hogan = (function () {
344
413
 
345
414
  while (tokens.length > 0) {
346
415
  token = tokens.shift();
347
- if (token.tag == '#' || token.tag == '^' ||
348
- isOpener(token, customTags)) {
416
+ if (token.tag == '#' || token.tag == '^' || isOpener(token, customTags)) {
349
417
  stack.push(token);
350
418
  token.nodes = buildTree(tokens, token.tag, stack, customTags);
351
419
  instructions.push(token);
@@ -388,16 +456,16 @@ var Hogan = (function () {
388
456
  }
389
457
  }
390
458
 
391
- function generate(tree, text, options) {
392
- var code = 'var c = [cx];var b = "";var _ = this;' +
393
- walk(tree) + 'return b;';
459
+ function writeCode(tree) {
460
+ return 'i = i || "";var b = i + "";var _ = this;' + walk(tree) + 'return b;';
461
+ }
462
+
463
+ Hogan.generate = function (code, text, options) {
394
464
  if (options.asString) {
395
- return 'function(cx,p){' + code + ';}';
465
+ return 'function(c,p,i){' + code + ';}';
396
466
  }
397
467
 
398
- var template = new HoganTemplate(text);
399
- template.r = new Function('cx', 'p', code);
400
- return template;
468
+ return new Hogan.Template(new Function('c', 'p', 'i', code), text, Hogan);
401
469
  }
402
470
 
403
471
  function esc(s) {
@@ -417,28 +485,28 @@ var Hogan = (function () {
417
485
  var tag = tree[i].tag;
418
486
  if (tag == '#') {
419
487
  code += section(tree[i].nodes, tree[i].n, chooseMethod(tree[i].n),
420
- tree[i].i, tree[i].end);
488
+ tree[i].i, tree[i].end, tree[i].otag + " " + tree[i].ctag);
421
489
  } else if (tag == '^') {
422
490
  code += invertedSection(tree[i].nodes, tree[i].n,
423
491
  chooseMethod(tree[i].n));
424
492
  } else if (tag == '<' || tag == '>') {
425
- code += partial(tree[i].n);
493
+ code += partial(tree[i]);
426
494
  } else if (tag == '{' || tag == '&') {
427
495
  code += tripleStache(tree[i].n, chooseMethod(tree[i].n));
428
496
  } else if (tag == '\n') {
429
- code += text('\n');
497
+ code += text('"\\n"' + (tree.length-1 == i ? '' : ' + i'));
430
498
  } else if (tag == '_v') {
431
499
  code += variable(tree[i].n, chooseMethod(tree[i].n));
432
500
  } else if (tag === undefined) {
433
- code += text(tree[i]);
501
+ code += text('"' + esc(tree[i]) + '"');
434
502
  }
435
503
  }
436
504
  return code;
437
505
  }
438
506
 
439
- function section(nodes, id, method, start, end) {
507
+ function section(nodes, id, method, start, end, tags) {
440
508
  return 'if(_.s(_.' + method + '("' + esc(id) + '",c,p,1),' +
441
- 'c,p,0,' + start + ',' + end + ')){' +
509
+ 'c,p,0,' + start + ',' + end + ', "' + tags + '")){' +
442
510
  'b += _.rs(c,p,' +
443
511
  'function(c,p){ var b = "";' +
444
512
  walk(nodes) +
@@ -447,13 +515,13 @@ var Hogan = (function () {
447
515
  }
448
516
 
449
517
  function invertedSection(nodes, id, method) {
450
- return 'if (!_.s(_.' + method + '("' + esc(id) + '",c,p,1),c,p,1,0,0)){' +
518
+ return 'if (!_.s(_.' + method + '("' + esc(id) + '",c,p,1),c,p,1,0,0,"")){' +
451
519
  walk(nodes) +
452
520
  '};';
453
521
  }
454
522
 
455
- function partial(id) {
456
- return 'b += _.rp("' + esc(id) + '",c[c.length - 1],p);';
523
+ function partial(tok) {
524
+ return 'b += _.rp("' + esc(tok.n) + '",c,p,"' + (tok.indent || '') + '");';
457
525
  }
458
526
 
459
527
  function tripleStache(id, method) {
@@ -465,50 +533,44 @@ var Hogan = (function () {
465
533
  }
466
534
 
467
535
  function text(id) {
468
- return 'b += "' + esc(id) + '";';
536
+ return 'b += ' + id + ';';
469
537
  }
470
538
 
471
- return ({
472
- scan: scan,
539
+ Hogan.parse = function(tokens, options) {
540
+ options = options || {};
541
+ return buildTree(tokens, '', [], options.sectionTags || []);
542
+ },
473
543
 
474
- parse: function(tokens, options) {
475
- options = options || {};
476
- return buildTree(tokens, '', [], options.sectionTags || []);
477
- },
544
+ Hogan.cache = {};
478
545
 
479
- cache: {},
480
-
481
- compile: function(text, options) {
482
- // options
483
- //
484
- // asString: false (default)
485
- //
486
- // sectionTags: [{o: '_foo', c: 'foo'}]
487
- // An array of object with o and c fields that indicate names for custom
488
- // section tags. The example above allows parsing of {{_foo}}{{/foo}}.
489
- //
490
- options = options || {};
491
-
492
- var t = this.cache[text];
493
- if (t) {
494
- return t;
495
- }
496
- t = generate(this.parse(scan(text), options), text, options);
497
- return this.cache[text] = t;
546
+ Hogan.compile = function(text, options) {
547
+ // options
548
+ //
549
+ // asString: false (default)
550
+ //
551
+ // sectionTags: [{o: '_foo', c: 'foo'}]
552
+ // An array of object with o and c fields that indicate names for custom
553
+ // section tags. The example above allows parsing of {{_foo}}{{/foo}}.
554
+ //
555
+ // delimiters: A string that overrides the default delimiters.
556
+ // Example: "<% %>"
557
+ //
558
+ options = options || {};
559
+
560
+ var key = text + '||' + !!options.asString;
561
+
562
+ var t = this.cache[key];
563
+
564
+ if (t) {
565
+ return t;
498
566
  }
499
- });
500
- })();
501
-
502
- // Export the hogan constructor for Node.js and CommonJS.
503
- if (typeof module !== 'undefined' && module.exports) {
504
- module.exports = Hogan;
505
- module.exports.Template = HoganTemplate;
506
- } else if (typeof exports !== 'undefined') {
507
- exports.Hogan = Hogan;
508
- exports.HoganTemplate = HoganTemplate;
509
- }
510
567
 
511
- // Expose Hogan as an AMD module.
568
+ t = this.generate(writeCode(this.parse(this.scan(text, options.delimiters), options)), text, options);
569
+ return this.cache[key] = t;
570
+ };
571
+ })(typeof exports !== 'undefined' ? exports : Hogan);
572
+
573
+
512
574
  if (typeof define === 'function' && define.amd) {
513
- define(function () { return Hogan; });
575
+ define(Hogan);
514
576
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hogan_assets
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
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: 2011-12-25 00:00:00.000000000Z
12
+ date: 2012-01-08 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: execjs
16
- requirement: &70131289224740 !ruby/object:Gem::Requirement
16
+ requirement: &70264420834000 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.2.9
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70131289224740
24
+ version_requirements: *70264420834000
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: tilt
27
- requirement: &70131289224240 !ruby/object:Gem::Requirement
27
+ requirement: &70264420833500 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.3.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70131289224240
35
+ version_requirements: *70264420833500
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: sprockets
38
- requirement: &70131289223780 !ruby/object:Gem::Requirement
38
+ requirement: &70264420833020 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 2.0.3
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70131289223780
46
+ version_requirements: *70264420833020
47
47
  description: Use compiled hogan.js (mustache) JavaScript templates with sprockets
48
48
  and the Rails asset pipeline.
49
49
  email:
@@ -68,7 +68,7 @@ files:
68
68
  - test/hogan_assets/tilt_test.rb
69
69
  - test/test_helper.rb
70
70
  - vendor/assets/javascripts/hogan.js
71
- homepage: ''
71
+ homepage: https://github.com/leshill/hogan_assets
72
72
  licenses: []
73
73
  post_install_message:
74
74
  rdoc_options: []
@@ -96,3 +96,4 @@ summary: Use compiled hogan.js (mustache) JavaScript templates with sprockets an
96
96
  test_files:
97
97
  - test/hogan_assets/tilt_test.rb
98
98
  - test/test_helper.rb
99
+ has_rdoc: