mustache-js-rails 0.0.7 → 0.0.9
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 mustache-js-rails might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/mustache-js-rails/version.rb +1 -1
- data/vendor/assets/javascripts/mustache.js +103 -95
- metadata +10 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79c7fb99b94ab2a8b73dda4fa42fdc59cbf16d34
|
4
|
+
data.tar.gz: 9c2d101179b78ecc1cd6af33d20f9838dccf1c26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2916426cb9edf9420f261434a08b198a40728d7703cc84604864fe40f8e9196d61250f37aead98ec2f7346a24d2213d915d1a513edcfc717209eda25ccffdbb
|
7
|
+
data.tar.gz: 755554a542c19da1c49c7f40ff12ed8b9021c12606c6f48ac8a25b15bd07fb0ac85c396f4974b32c3f2fbd7e459b30ca169139139e60d546473fc8085e2d088a
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@ and [mustache jQuery integration](https://github.com/jonnyreeves/jquery-Mustache
|
|
5
5
|
|
6
6
|
Integrated versions are:
|
7
7
|
|
8
|
-
* mustache.js - <b id="mustache-js-version">0.8.
|
8
|
+
* mustache.js - <b id="mustache-js-version">0.8.2</b>
|
9
9
|
* jQuery mustache - <b id="jquery-mustache-js-version">0.2.8</b>
|
10
10
|
|
11
11
|
### Installation
|
@@ -5,32 +5,16 @@
|
|
5
5
|
|
6
6
|
/*global define: false*/
|
7
7
|
|
8
|
-
(function (
|
8
|
+
(function (global, factory) {
|
9
9
|
if (typeof exports === "object" && exports) {
|
10
10
|
factory(exports); // CommonJS
|
11
|
+
} else if (typeof define === "function" && define.amd) {
|
12
|
+
define(['exports'], factory); // AMD
|
11
13
|
} else {
|
12
|
-
|
13
|
-
factory(mustache);
|
14
|
-
if (typeof define === "function" && define.amd) {
|
15
|
-
define(mustache); // AMD
|
16
|
-
} else {
|
17
|
-
root.Mustache = mustache; // <script>
|
18
|
-
}
|
14
|
+
factory(global.Mustache = {}); // <script>
|
19
15
|
}
|
20
16
|
}(this, function (mustache) {
|
21
17
|
|
22
|
-
// Workaround for https://issues.apache.org/jira/browse/COUCHDB-577
|
23
|
-
// See https://github.com/janl/mustache.js/issues/189
|
24
|
-
var RegExp_test = RegExp.prototype.test;
|
25
|
-
function testRegExp(re, string) {
|
26
|
-
return RegExp_test.call(re, string);
|
27
|
-
}
|
28
|
-
|
29
|
-
var nonSpaceRe = /\S/;
|
30
|
-
function isWhitespace(string) {
|
31
|
-
return !testRegExp(nonSpaceRe, string);
|
32
|
-
}
|
33
|
-
|
34
18
|
var Object_toString = Object.prototype.toString;
|
35
19
|
var isArray = Array.isArray || function (object) {
|
36
20
|
return Object_toString.call(object) === '[object Array]';
|
@@ -44,6 +28,18 @@
|
|
44
28
|
return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
|
45
29
|
}
|
46
30
|
|
31
|
+
// Workaround for https://issues.apache.org/jira/browse/COUCHDB-577
|
32
|
+
// See https://github.com/janl/mustache.js/issues/189
|
33
|
+
var RegExp_test = RegExp.prototype.test;
|
34
|
+
function testRegExp(re, string) {
|
35
|
+
return RegExp_test.call(re, string);
|
36
|
+
}
|
37
|
+
|
38
|
+
var nonSpaceRe = /\S/;
|
39
|
+
function isWhitespace(string) {
|
40
|
+
return !testRegExp(nonSpaceRe, string);
|
41
|
+
}
|
42
|
+
|
47
43
|
var entityMap = {
|
48
44
|
"&": "&",
|
49
45
|
"<": "<",
|
@@ -59,17 +55,6 @@
|
|
59
55
|
});
|
60
56
|
}
|
61
57
|
|
62
|
-
function escapeTags(tags) {
|
63
|
-
if (!isArray(tags) || tags.length !== 2) {
|
64
|
-
throw new Error('Invalid tags: ' + tags);
|
65
|
-
}
|
66
|
-
|
67
|
-
return [
|
68
|
-
new RegExp(escapeRegExp(tags[0]) + "\\s*"),
|
69
|
-
new RegExp("\\s*" + escapeRegExp(tags[1]))
|
70
|
-
];
|
71
|
-
}
|
72
|
-
|
73
58
|
var whiteRe = /\s*/;
|
74
59
|
var spaceRe = /\s+/;
|
75
60
|
var equalsRe = /\s*=/;
|
@@ -99,15 +84,8 @@
|
|
99
84
|
* which the closing tag for that section begins.
|
100
85
|
*/
|
101
86
|
function parseTemplate(template, tags) {
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
if (typeof tags === 'string') {
|
106
|
-
tags = tags.split(spaceRe);
|
107
|
-
}
|
108
|
-
|
109
|
-
var tagRes = escapeTags(tags);
|
110
|
-
var scanner = new Scanner(template);
|
87
|
+
if (!template)
|
88
|
+
return [];
|
111
89
|
|
112
90
|
var sections = []; // Stack to hold section tokens
|
113
91
|
var tokens = []; // Buffer to hold the tokens
|
@@ -119,9 +97,8 @@
|
|
119
97
|
// if there was a {{#tag}} on it and otherwise only space.
|
120
98
|
function stripSpace() {
|
121
99
|
if (hasTag && !nonSpace) {
|
122
|
-
while (spaces.length)
|
100
|
+
while (spaces.length)
|
123
101
|
delete tokens[spaces.pop()];
|
124
|
-
}
|
125
102
|
} else {
|
126
103
|
spaces = [];
|
127
104
|
}
|
@@ -130,14 +107,32 @@
|
|
130
107
|
nonSpace = false;
|
131
108
|
}
|
132
109
|
|
110
|
+
var openingTagRe, closingTagRe, closingCurlyRe;
|
111
|
+
function compileTags(tags) {
|
112
|
+
if (typeof tags === 'string')
|
113
|
+
tags = tags.split(spaceRe, 2);
|
114
|
+
|
115
|
+
if (!isArray(tags) || tags.length !== 2)
|
116
|
+
throw new Error('Invalid tags: ' + tags);
|
117
|
+
|
118
|
+
openingTagRe = new RegExp(escapeRegExp(tags[0]) + '\\s*');
|
119
|
+
closingTagRe = new RegExp('\\s*' + escapeRegExp(tags[1]));
|
120
|
+
closingCurlyRe = new RegExp('\\s*' + escapeRegExp('}' + tags[1]));
|
121
|
+
}
|
122
|
+
|
123
|
+
compileTags(tags || mustache.tags);
|
124
|
+
|
125
|
+
var scanner = new Scanner(template);
|
126
|
+
|
133
127
|
var start, type, value, chr, token, openSection;
|
134
128
|
while (!scanner.eos()) {
|
135
129
|
start = scanner.pos;
|
136
130
|
|
137
131
|
// Match any text between tags.
|
138
|
-
value = scanner.scanUntil(
|
132
|
+
value = scanner.scanUntil(openingTagRe);
|
133
|
+
|
139
134
|
if (value) {
|
140
|
-
for (var i = 0,
|
135
|
+
for (var i = 0, valueLength = value.length; i < valueLength; ++i) {
|
141
136
|
chr = value.charAt(i);
|
142
137
|
|
143
138
|
if (isWhitespace(chr)) {
|
@@ -146,18 +141,19 @@
|
|
146
141
|
nonSpace = true;
|
147
142
|
}
|
148
143
|
|
149
|
-
tokens.push(['text', chr, start, start + 1]);
|
144
|
+
tokens.push([ 'text', chr, start, start + 1 ]);
|
150
145
|
start += 1;
|
151
146
|
|
152
147
|
// Check for whitespace on the current line.
|
153
|
-
if (chr === '\n')
|
148
|
+
if (chr === '\n')
|
154
149
|
stripSpace();
|
155
|
-
}
|
156
150
|
}
|
157
151
|
}
|
158
152
|
|
159
153
|
// Match the opening tag.
|
160
|
-
if (!scanner.scan(
|
154
|
+
if (!scanner.scan(openingTagRe))
|
155
|
+
break;
|
156
|
+
|
161
157
|
hasTag = true;
|
162
158
|
|
163
159
|
// Get the tag type.
|
@@ -168,20 +164,19 @@
|
|
168
164
|
if (type === '=') {
|
169
165
|
value = scanner.scanUntil(equalsRe);
|
170
166
|
scanner.scan(equalsRe);
|
171
|
-
scanner.scanUntil(
|
167
|
+
scanner.scanUntil(closingTagRe);
|
172
168
|
} else if (type === '{') {
|
173
|
-
value = scanner.scanUntil(
|
169
|
+
value = scanner.scanUntil(closingCurlyRe);
|
174
170
|
scanner.scan(curlyRe);
|
175
|
-
scanner.scanUntil(
|
171
|
+
scanner.scanUntil(closingTagRe);
|
176
172
|
type = '&';
|
177
173
|
} else {
|
178
|
-
value = scanner.scanUntil(
|
174
|
+
value = scanner.scanUntil(closingTagRe);
|
179
175
|
}
|
180
176
|
|
181
177
|
// Match the closing tag.
|
182
|
-
if (!scanner.scan(
|
178
|
+
if (!scanner.scan(closingTagRe))
|
183
179
|
throw new Error('Unclosed tag at ' + scanner.pos);
|
184
|
-
}
|
185
180
|
|
186
181
|
token = [ type, value, start, scanner.pos ];
|
187
182
|
tokens.push(token);
|
@@ -192,25 +187,24 @@
|
|
192
187
|
// Check section nesting.
|
193
188
|
openSection = sections.pop();
|
194
189
|
|
195
|
-
if (!openSection)
|
190
|
+
if (!openSection)
|
196
191
|
throw new Error('Unopened section "' + value + '" at ' + start);
|
197
|
-
|
198
|
-
if (openSection[1] !== value)
|
192
|
+
|
193
|
+
if (openSection[1] !== value)
|
199
194
|
throw new Error('Unclosed section "' + openSection[1] + '" at ' + start);
|
200
|
-
}
|
201
195
|
} else if (type === 'name' || type === '{' || type === '&') {
|
202
196
|
nonSpace = true;
|
203
197
|
} else if (type === '=') {
|
204
198
|
// Set the tags for the next time around.
|
205
|
-
|
199
|
+
compileTags(value);
|
206
200
|
}
|
207
201
|
}
|
208
202
|
|
209
203
|
// Make sure there are no open sections when we're done.
|
210
204
|
openSection = sections.pop();
|
211
|
-
|
205
|
+
|
206
|
+
if (openSection)
|
212
207
|
throw new Error('Unclosed section "' + openSection[1] + '" at ' + scanner.pos);
|
213
|
-
}
|
214
208
|
|
215
209
|
return nestTokens(squashTokens(tokens));
|
216
210
|
}
|
@@ -223,7 +217,7 @@
|
|
223
217
|
var squashedTokens = [];
|
224
218
|
|
225
219
|
var token, lastToken;
|
226
|
-
for (var i = 0,
|
220
|
+
for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {
|
227
221
|
token = tokens[i];
|
228
222
|
|
229
223
|
if (token) {
|
@@ -252,7 +246,7 @@
|
|
252
246
|
var sections = [];
|
253
247
|
|
254
248
|
var token, section;
|
255
|
-
for (var i = 0,
|
249
|
+
for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {
|
256
250
|
token = tokens[i];
|
257
251
|
|
258
252
|
switch (token[0]) {
|
@@ -299,14 +293,15 @@
|
|
299
293
|
Scanner.prototype.scan = function (re) {
|
300
294
|
var match = this.tail.match(re);
|
301
295
|
|
302
|
-
if (match
|
303
|
-
|
304
|
-
this.tail = this.tail.substring(string.length);
|
305
|
-
this.pos += string.length;
|
306
|
-
return string;
|
307
|
-
}
|
296
|
+
if (!match || match.index !== 0)
|
297
|
+
return '';
|
308
298
|
|
309
|
-
|
299
|
+
var string = match[0];
|
300
|
+
|
301
|
+
this.tail = this.tail.substring(string.length);
|
302
|
+
this.pos += string.length;
|
303
|
+
|
304
|
+
return string;
|
310
305
|
};
|
311
306
|
|
312
307
|
/**
|
@@ -357,35 +352,37 @@
|
|
357
352
|
* up the context hierarchy if the value is absent in this context's view.
|
358
353
|
*/
|
359
354
|
Context.prototype.lookup = function (name) {
|
355
|
+
var cache = this.cache;
|
356
|
+
|
360
357
|
var value;
|
361
|
-
if (name in
|
362
|
-
value =
|
358
|
+
if (name in cache) {
|
359
|
+
value = cache[name];
|
363
360
|
} else {
|
364
|
-
var context = this;
|
361
|
+
var context = this, names, index;
|
365
362
|
|
366
363
|
while (context) {
|
367
364
|
if (name.indexOf('.') > 0) {
|
368
365
|
value = context.view;
|
366
|
+
names = name.split('.');
|
367
|
+
index = 0;
|
369
368
|
|
370
|
-
|
371
|
-
|
372
|
-
value = value[names[i++]];
|
373
|
-
}
|
369
|
+
while (value != null && index < names.length)
|
370
|
+
value = value[names[index++]];
|
374
371
|
} else {
|
375
372
|
value = context.view[name];
|
376
373
|
}
|
377
374
|
|
378
|
-
if (value != null)
|
375
|
+
if (value != null)
|
376
|
+
break;
|
379
377
|
|
380
378
|
context = context.parent;
|
381
379
|
}
|
382
380
|
|
383
|
-
|
381
|
+
cache[name] = value;
|
384
382
|
}
|
385
383
|
|
386
|
-
if (isFunction(value))
|
384
|
+
if (isFunction(value))
|
387
385
|
value = value.call(this.view);
|
388
|
-
}
|
389
386
|
|
390
387
|
return value;
|
391
388
|
};
|
@@ -414,9 +411,8 @@
|
|
414
411
|
var cache = this.cache;
|
415
412
|
var tokens = cache[template];
|
416
413
|
|
417
|
-
if (tokens == null)
|
414
|
+
if (tokens == null)
|
418
415
|
tokens = cache[template] = parseTemplate(template, tags);
|
419
|
-
}
|
420
416
|
|
421
417
|
return tokens;
|
422
418
|
};
|
@@ -456,29 +452,31 @@
|
|
456
452
|
}
|
457
453
|
|
458
454
|
var token, value;
|
459
|
-
for (var i = 0,
|
455
|
+
for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {
|
460
456
|
token = tokens[i];
|
461
457
|
|
462
458
|
switch (token[0]) {
|
463
459
|
case '#':
|
464
460
|
value = context.lookup(token[1]);
|
465
|
-
|
461
|
+
|
462
|
+
if (!value)
|
463
|
+
continue;
|
466
464
|
|
467
465
|
if (isArray(value)) {
|
468
|
-
for (var j = 0,
|
466
|
+
for (var j = 0, valueLength = value.length; j < valueLength; ++j) {
|
469
467
|
buffer += this.renderTokens(token[4], context.push(value[j]), partials, originalTemplate);
|
470
468
|
}
|
471
469
|
} else if (typeof value === 'object' || typeof value === 'string') {
|
472
470
|
buffer += this.renderTokens(token[4], context.push(value), partials, originalTemplate);
|
473
471
|
} else if (isFunction(value)) {
|
474
|
-
if (typeof originalTemplate !== 'string')
|
472
|
+
if (typeof originalTemplate !== 'string')
|
475
473
|
throw new Error('Cannot use higher-order sections without the original template');
|
476
|
-
}
|
477
474
|
|
478
475
|
// Extract the portion of the original template that the section contains.
|
479
476
|
value = value.call(context.view, originalTemplate.slice(token[3], token[5]), subRender);
|
480
477
|
|
481
|
-
if (value != null)
|
478
|
+
if (value != null)
|
479
|
+
buffer += value;
|
482
480
|
} else {
|
483
481
|
buffer += this.renderTokens(token[4], context, partials, originalTemplate);
|
484
482
|
}
|
@@ -489,23 +487,33 @@
|
|
489
487
|
|
490
488
|
// Use JavaScript's definition of falsy. Include empty arrays.
|
491
489
|
// See https://github.com/janl/mustache.js/issues/186
|
492
|
-
if (!value || (isArray(value) && value.length === 0))
|
490
|
+
if (!value || (isArray(value) && value.length === 0))
|
493
491
|
buffer += this.renderTokens(token[4], context, partials, originalTemplate);
|
494
|
-
}
|
495
492
|
|
496
493
|
break;
|
497
494
|
case '>':
|
498
|
-
if (!partials)
|
495
|
+
if (!partials)
|
496
|
+
continue;
|
497
|
+
|
499
498
|
value = isFunction(partials) ? partials(token[1]) : partials[token[1]];
|
500
|
-
|
499
|
+
|
500
|
+
if (value != null)
|
501
|
+
buffer += this.renderTokens(this.parse(value), context, partials, value);
|
502
|
+
|
501
503
|
break;
|
502
504
|
case '&':
|
503
505
|
value = context.lookup(token[1]);
|
504
|
-
|
506
|
+
|
507
|
+
if (value != null)
|
508
|
+
buffer += value;
|
509
|
+
|
505
510
|
break;
|
506
511
|
case 'name':
|
507
512
|
value = context.lookup(token[1]);
|
508
|
-
|
513
|
+
|
514
|
+
if (value != null)
|
515
|
+
buffer += mustache.escape(value);
|
516
|
+
|
509
517
|
break;
|
510
518
|
case 'text':
|
511
519
|
buffer += token[1];
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mustache-js-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Krzysztof Knapik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -17,6 +17,9 @@ dependencies:
|
|
17
17
|
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.1'
|
20
|
+
- - <=
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '5.0'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -24,8 +27,11 @@ dependencies:
|
|
24
27
|
- - '>='
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '3.1'
|
27
|
-
|
28
|
-
|
30
|
+
- - <=
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '5.0'
|
33
|
+
description: "\n mustache.js (https://github.com/janl/mustache.js)\n and jQuery.mustache.js
|
34
|
+
(https://github.com/jonnyreeves/jquery-Mustache)\n for Rails 3.1+ asset pipeline\n
|
29
35
|
\ "
|
30
36
|
email:
|
31
37
|
- knapo@knapo.net
|