hogan_assets 1.0.0 → 1.0.1

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.
@@ -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: