cmstyle 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/lib/app/assets/images/cm_app.ico +0 -0
  2. data/lib/app/assets/images/cm_app.png +0 -0
  3. data/lib/app/assets/images/cm_app_30x30.png +0 -0
  4. data/lib/app/assets/stylesheets/application.css +9 -78
  5. data/lib/app/views/layouts/_footer.slim +12 -5
  6. data/lib/app/views/layouts/application.slim +27 -18
  7. data/lib/assets/images/glyphicons-halflings-white.png +0 -0
  8. data/lib/assets/images/glyphicons-halflings.png +0 -0
  9. data/lib/assets/javascripts/bootstrap.js +165 -31
  10. data/lib/assets/javascripts/prettify.js +0 -0
  11. data/lib/assets/stylesheets/bootstrap-responsive.css +5 -1
  12. data/lib/assets/stylesheets/bootstrap.css +335 -189
  13. data/lib/assets/stylesheets/prettify.css +0 -0
  14. data/lib/cmstyle.rb +4 -1
  15. data/lib/cmstyle/navigation_helpers.rb +165 -0
  16. data/lib/cmstyle/version.rb +1 -1
  17. metadata +6 -83
  18. data/lib/app/assets/images/novartis-micro.png +0 -0
  19. data/lib/app/assets/images/novartis-small.png +0 -0
  20. data/lib/app/views/cmstyle/_footer.slim +0 -5
  21. data/lib/app/views/cmstyle/_header.slim +0 -40
  22. data/lib/app/views/cmstyle/_modals.slim +0 -62
  23. data/lib/assets/images/8020select.png +0 -0
  24. data/lib/assets/images/adoptahydrant.png +0 -0
  25. data/lib/assets/images/apple-touch-icon-114-precomposed.png +0 -0
  26. data/lib/assets/images/apple-touch-icon-144-precomposed.png +0 -0
  27. data/lib/assets/images/apple-touch-icon-57-precomposed.png +0 -0
  28. data/lib/assets/images/apple-touch-icon-72-precomposed.png +0 -0
  29. data/lib/assets/images/bootstrap-example-carousel.png +0 -0
  30. data/lib/assets/images/bootstrap-example-fluid.jpg +0 -0
  31. data/lib/assets/images/bootstrap-example-hero.jpg +0 -0
  32. data/lib/assets/images/bootstrap-example-marketing-narrow.png +0 -0
  33. data/lib/assets/images/bootstrap-example-signin.png +0 -0
  34. data/lib/assets/images/bootstrap-example-starter.jpg +0 -0
  35. data/lib/assets/images/bootstrap-example-sticky-footer.png +0 -0
  36. data/lib/assets/images/bootstrap-mdo-sfmoma-01.jpg +0 -0
  37. data/lib/assets/images/bootstrap-mdo-sfmoma-02.jpg +0 -0
  38. data/lib/assets/images/bootstrap-mdo-sfmoma-03.jpg +0 -0
  39. data/lib/assets/images/breakingnews.png +0 -0
  40. data/lib/assets/images/browser-icon-chrome.png +0 -0
  41. data/lib/assets/images/browser-icon-firefox.png +0 -0
  42. data/lib/assets/images/browser-icon-safari.png +0 -0
  43. data/lib/assets/images/bs-docs-bootstrap-features.png +0 -0
  44. data/lib/assets/images/bs-docs-masthead-pattern.png +0 -0
  45. data/lib/assets/images/bs-docs-responsive-illustrations.png +0 -0
  46. data/lib/assets/images/bs-docs-twitter-github.png +0 -0
  47. data/lib/assets/images/fleetio.png +0 -0
  48. data/lib/assets/images/gathercontent.png +0 -0
  49. data/lib/assets/images/grid-baseline-20px.png +0 -0
  50. data/lib/assets/images/jshint.png +0 -0
  51. data/lib/assets/images/kippt.png +0 -0
  52. data/lib/assets/images/less-logo-large.png +0 -0
  53. data/lib/assets/images/logo.png +0 -0
  54. data/lib/assets/images/noise.png +0 -0
  55. data/lib/assets/images/responsive-illustrations.png +0 -0
  56. data/lib/assets/images/slide-01.jpg +0 -0
  57. data/lib/assets/images/slide-02.jpg +0 -0
  58. data/lib/assets/images/slide-03.jpg +0 -0
  59. data/lib/assets/images/small-hogan-icon.png +0 -0
  60. data/lib/assets/images/soundready.png +0 -0
  61. data/lib/assets/images/stripes.png +0 -0
  62. data/lib/assets/javascripts/application.js +0 -154
  63. data/lib/assets/javascripts/bootstrap-affix.js +0 -19
  64. data/lib/assets/javascripts/bootstrap-alert.js +0 -56
  65. data/lib/assets/javascripts/bootstrap-button.js +0 -96
  66. data/lib/assets/javascripts/bootstrap-carousel.js +0 -63
  67. data/lib/assets/javascripts/bootstrap-collapse.js +0 -88
  68. data/lib/assets/javascripts/bootstrap-dropdown.js +0 -145
  69. data/lib/assets/javascripts/bootstrap-modal.js +0 -114
  70. data/lib/assets/javascripts/bootstrap-phantom.js +0 -21
  71. data/lib/assets/javascripts/bootstrap-popover.js +0 -107
  72. data/lib/assets/javascripts/bootstrap-scrollspy.js +0 -31
  73. data/lib/assets/javascripts/bootstrap-tab.js +0 -80
  74. data/lib/assets/javascripts/bootstrap-tooltip.js +0 -153
  75. data/lib/assets/javascripts/bootstrap-transition.js +0 -13
  76. data/lib/assets/javascripts/bootstrap-typeahead.js +0 -199
  77. data/lib/assets/javascripts/compiler.js +0 -348
  78. data/lib/assets/javascripts/hogan-1.0.5.amd.js +0 -576
  79. data/lib/assets/javascripts/hogan-1.0.5.common.js +0 -576
  80. data/lib/assets/javascripts/hogan-1.0.5.js +0 -572
  81. data/lib/assets/javascripts/hogan-1.0.5.mustache.js +0 -619
  82. data/lib/assets/javascripts/hogan.js +0 -545
  83. data/lib/assets/javascripts/index.js +0 -848
  84. data/lib/assets/javascripts/jquery.js +0 -2
  85. data/lib/assets/javascripts/mustache.js +0 -90
  86. data/lib/assets/javascripts/phantom.js +0 -63
  87. data/lib/assets/javascripts/qunit.js +0 -1510
  88. data/lib/assets/javascripts/release.js +0 -74
  89. data/lib/assets/javascripts/server.js +0 -14
  90. data/lib/assets/javascripts/spec.js +0 -77
  91. data/lib/assets/javascripts/template-1.0.5.js +0 -233
  92. data/lib/assets/javascripts/template.js +0 -233
  93. data/lib/assets/javascripts/web_templates.js +0 -32
  94. data/lib/assets/stylesheets/css-tests.css +0 -139
  95. data/lib/assets/stylesheets/docs.css +0 -1015
  96. data/lib/assets/stylesheets/layout.css +0 -206
  97. data/lib/assets/stylesheets/qunit.css +0 -232
  98. data/lib/assets/stylesheets/skeleton.css +0 -236
@@ -1,348 +0,0 @@
1
- /*
2
- * Copyright 2011 Twitter, Inc.
3
- * Licensed under the Apache License, Version 2.0 (the "License");
4
- * you may not use this file except in compliance with the License.
5
- * You may obtain a copy of the License at
6
- *
7
- * http://www.apache.org/licenses/LICENSE-2.0
8
- *
9
- * Unless required by applicable law or agreed to in writing, software
10
- * distributed under the License is distributed on an "AS IS" BASIS,
11
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- * See the License for the specific language governing permissions and
13
- * limitations under the License.
14
- */
15
-
16
- (function (Hogan) {
17
- // Setup regex assignments
18
- // remove whitespace according to Mustache spec
19
- var rIsWhitespace = /\S/,
20
- rQuot = /\"/g,
21
- rNewline = /\n/g,
22
- rCr = /\r/g,
23
- rSlash = /\\/g,
24
- tagTypes = {
25
- '#': 1, '^': 2, '/': 3, '!': 4, '>': 5,
26
- '<': 6, '=': 7, '_v': 8, '{': 9, '&': 10
27
- };
28
-
29
- Hogan.scan = function scan(text, delimiters) {
30
- var len = text.length,
31
- IN_TEXT = 0,
32
- IN_TAG_TYPE = 1,
33
- IN_TAG = 2,
34
- state = IN_TEXT,
35
- tagType = null,
36
- tag = null,
37
- buf = '',
38
- tokens = [],
39
- seenTag = false,
40
- i = 0,
41
- lineStart = 0,
42
- otag = '{{',
43
- ctag = '}}';
44
-
45
- function addBuf() {
46
- if (buf.length > 0) {
47
- tokens.push(new String(buf));
48
- buf = '';
49
- }
50
- }
51
-
52
- function lineIsWhitespace() {
53
- var isAllWhitespace = true;
54
- for (var j = lineStart; j < tokens.length; j++) {
55
- isAllWhitespace =
56
- (tokens[j].tag && tagTypes[tokens[j].tag] < tagTypes['_v']) ||
57
- (!tokens[j].tag && tokens[j].match(rIsWhitespace) === null);
58
- if (!isAllWhitespace) {
59
- return false;
60
- }
61
- }
62
-
63
- return isAllWhitespace;
64
- }
65
-
66
- function filterLine(haveSeenTag, noNewLine) {
67
- addBuf();
68
-
69
- if (haveSeenTag && lineIsWhitespace()) {
70
- for (var j = lineStart, next; j < tokens.length; j++) {
71
- if (!tokens[j].tag) {
72
- if ((next = tokens[j+1]) && next.tag == '>') {
73
- // set indent to token value
74
- next.indent = tokens[j].toString()
75
- }
76
- tokens.splice(j, 1);
77
- }
78
- }
79
- } else if (!noNewLine) {
80
- tokens.push({tag:'\n'});
81
- }
82
-
83
- seenTag = false;
84
- lineStart = tokens.length;
85
- }
86
-
87
- function changeDelimiters(text, index) {
88
- var close = '=' + ctag,
89
- closeIndex = text.indexOf(close, index),
90
- delimiters = trim(
91
- text.substring(text.indexOf('=', index) + 1, closeIndex)
92
- ).split(' ');
93
-
94
- otag = delimiters[0];
95
- ctag = delimiters[1];
96
-
97
- return closeIndex + close.length - 1;
98
- }
99
-
100
- if (delimiters) {
101
- delimiters = delimiters.split(' ');
102
- otag = delimiters[0];
103
- ctag = delimiters[1];
104
- }
105
-
106
- for (i = 0; i < len; i++) {
107
- if (state == IN_TEXT) {
108
- if (tagChange(otag, text, i)) {
109
- --i;
110
- addBuf();
111
- state = IN_TAG_TYPE;
112
- } else {
113
- if (text.charAt(i) == '\n') {
114
- filterLine(seenTag);
115
- } else {
116
- buf += text.charAt(i);
117
- }
118
- }
119
- } else if (state == IN_TAG_TYPE) {
120
- i += otag.length - 1;
121
- tag = tagTypes[text.charAt(i + 1)];
122
- tagType = tag ? text.charAt(i + 1) : '_v';
123
- if (tagType == '=') {
124
- i = changeDelimiters(text, i);
125
- state = IN_TEXT;
126
- } else {
127
- if (tag) {
128
- i++;
129
- }
130
- state = IN_TAG;
131
- }
132
- seenTag = i;
133
- } else {
134
- if (tagChange(ctag, text, i)) {
135
- tokens.push({tag: tagType, n: trim(buf), otag: otag, ctag: ctag,
136
- i: (tagType == '/') ? seenTag - ctag.length : i + otag.length});
137
- buf = '';
138
- i += ctag.length - 1;
139
- state = IN_TEXT;
140
- if (tagType == '{') {
141
- if (ctag == '}}') {
142
- i++;
143
- } else {
144
- cleanTripleStache(tokens[tokens.length - 1]);
145
- }
146
- }
147
- } else {
148
- buf += text.charAt(i);
149
- }
150
- }
151
- }
152
-
153
- filterLine(seenTag, true);
154
-
155
- return tokens;
156
- }
157
-
158
- function cleanTripleStache(token) {
159
- if (token.n.substr(token.n.length - 1) === '}') {
160
- token.n = token.n.substring(0, token.n.length - 1);
161
- }
162
- }
163
-
164
- function trim(s) {
165
- if (s.trim) {
166
- return s.trim();
167
- }
168
-
169
- return s.replace(/^\s*|\s*$/g, '');
170
- }
171
-
172
- function tagChange(tag, text, index) {
173
- if (text.charAt(index) != tag.charAt(0)) {
174
- return false;
175
- }
176
-
177
- for (var i = 1, l = tag.length; i < l; i++) {
178
- if (text.charAt(index + i) != tag.charAt(i)) {
179
- return false;
180
- }
181
- }
182
-
183
- return true;
184
- }
185
-
186
- function buildTree(tokens, kind, stack, customTags) {
187
- var instructions = [],
188
- opener = null,
189
- token = null;
190
-
191
- while (tokens.length > 0) {
192
- token = tokens.shift();
193
- if (token.tag == '#' || token.tag == '^' || isOpener(token, customTags)) {
194
- stack.push(token);
195
- token.nodes = buildTree(tokens, token.tag, stack, customTags);
196
- instructions.push(token);
197
- } else if (token.tag == '/') {
198
- if (stack.length === 0) {
199
- throw new Error('Closing tag without opener: /' + token.n);
200
- }
201
- opener = stack.pop();
202
- if (token.n != opener.n && !isCloser(token.n, opener.n, customTags)) {
203
- throw new Error('Nesting error: ' + opener.n + ' vs. ' + token.n);
204
- }
205
- opener.end = token.i;
206
- return instructions;
207
- } else {
208
- instructions.push(token);
209
- }
210
- }
211
-
212
- if (stack.length > 0) {
213
- throw new Error('missing closing tag: ' + stack.pop().n);
214
- }
215
-
216
- return instructions;
217
- }
218
-
219
- function isOpener(token, tags) {
220
- for (var i = 0, l = tags.length; i < l; i++) {
221
- if (tags[i].o == token.n) {
222
- token.tag = '#';
223
- return true;
224
- }
225
- }
226
- }
227
-
228
- function isCloser(close, open, tags) {
229
- for (var i = 0, l = tags.length; i < l; i++) {
230
- if (tags[i].c == close && tags[i].o == open) {
231
- return true;
232
- }
233
- }
234
- }
235
-
236
- function writeCode(tree) {
237
- return 'i = i || "";var b = i + "";var _ = this;' + walk(tree) + 'return b;';
238
- }
239
-
240
- Hogan.generate = function (code, text, options) {
241
- if (options.asString) {
242
- return 'function(c,p,i){' + code + ';}';
243
- }
244
-
245
- return new Hogan.Template(new Function('c', 'p', 'i', code), text, Hogan);
246
- }
247
-
248
- function esc(s) {
249
- return s.replace(rSlash, '\\\\')
250
- .replace(rQuot, '\\\"')
251
- .replace(rNewline, '\\n')
252
- .replace(rCr, '\\r');
253
- }
254
-
255
- function chooseMethod(s) {
256
- return (~s.indexOf('.')) ? 'd' : 'f';
257
- }
258
-
259
- function walk(tree) {
260
- var code = '';
261
- for (var i = 0, l = tree.length; i < l; i++) {
262
- var tag = tree[i].tag;
263
- if (tag == '#') {
264
- code += section(tree[i].nodes, tree[i].n, chooseMethod(tree[i].n),
265
- tree[i].i, tree[i].end, tree[i].otag + " " + tree[i].ctag);
266
- } else if (tag == '^') {
267
- code += invertedSection(tree[i].nodes, tree[i].n,
268
- chooseMethod(tree[i].n));
269
- } else if (tag == '<' || tag == '>') {
270
- code += partial(tree[i]);
271
- } else if (tag == '{' || tag == '&') {
272
- code += tripleStache(tree[i].n, chooseMethod(tree[i].n));
273
- } else if (tag == '\n') {
274
- code += text('"\\n"' + (tree.length-1 == i ? '' : ' + i'));
275
- } else if (tag == '_v') {
276
- code += variable(tree[i].n, chooseMethod(tree[i].n));
277
- } else if (tag === undefined) {
278
- code += text('"' + esc(tree[i]) + '"');
279
- }
280
- }
281
- return code;
282
- }
283
-
284
- function section(nodes, id, method, start, end, tags) {
285
- return 'if(_.s(_.' + method + '("' + esc(id) + '",c,p,1),' +
286
- 'c,p,0,' + start + ',' + end + ', "' + tags + '")){' +
287
- 'b += _.rs(c,p,' +
288
- 'function(c,p){ var b = "";' +
289
- walk(nodes) +
290
- 'return b;});c.pop();}' +
291
- 'else{b += _.b; _.b = ""};';
292
- }
293
-
294
- function invertedSection(nodes, id, method) {
295
- return 'if (!_.s(_.' + method + '("' + esc(id) + '",c,p,1),c,p,1,0,0,"")){' +
296
- walk(nodes) +
297
- '};';
298
- }
299
-
300
- function partial(tok) {
301
- return 'b += _.rp("' + esc(tok.n) + '",c,p,"' + (tok.indent || '') + '");';
302
- }
303
-
304
- function tripleStache(id, method) {
305
- return 'b += (_.' + method + '("' + esc(id) + '",c,p,0));';
306
- }
307
-
308
- function variable(id, method) {
309
- return 'b += (_.v(_.' + method + '("' + esc(id) + '",c,p,0)));';
310
- }
311
-
312
- function text(id) {
313
- return 'b += ' + id + ';';
314
- }
315
-
316
- Hogan.parse = function(tokens, options) {
317
- options = options || {};
318
- return buildTree(tokens, '', [], options.sectionTags || []);
319
- },
320
-
321
- Hogan.cache = {};
322
-
323
- Hogan.compile = function(text, options) {
324
- // options
325
- //
326
- // asString: false (default)
327
- //
328
- // sectionTags: [{o: '_foo', c: 'foo'}]
329
- // An array of object with o and c fields that indicate names for custom
330
- // section tags. The example above allows parsing of {{_foo}}{{/foo}}.
331
- //
332
- // delimiters: A string that overrides the default delimiters.
333
- // Example: "<% %>"
334
- //
335
- options = options || {};
336
-
337
- var key = text + '||' + !!options.asString;
338
-
339
- var t = this.cache[key];
340
-
341
- if (t) {
342
- return t;
343
- }
344
-
345
- t = this.generate(writeCode(this.parse(this.scan(text, options.delimiters), options)), text, options);
346
- return this.cache[key] = t;
347
- };
348
- })(typeof exports !== 'undefined' ? exports : Hogan);
@@ -1,576 +0,0 @@
1
- /*
2
- * Copyright 2011 Twitter, Inc.
3
- * Licensed under the Apache License, Version 2.0 (the "License");
4
- * you may not use this file except in compliance with the License.
5
- * You may obtain a copy of the License at
6
- *
7
- * http://www.apache.org/licenses/LICENSE-2.0
8
- *
9
- * Unless required by applicable law or agreed to in writing, software
10
- * distributed under the License is distributed on an "AS IS" BASIS,
11
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- * See the License for the specific language governing permissions and
13
- * limitations under the License.
14
- */
15
-
16
-
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 || '';
27
- }
28
-
29
- Hogan.Template.prototype = {
30
- // render: replaced by generated code.
31
- r: function (context, partials, indent) { return ''; },
32
-
33
- // variable escaping
34
- v: hoganEscape,
35
-
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);
43
- },
44
-
45
- // tries to find a partial in the curent scope and render it
46
- rp: function(name, context, partials, indent) {
47
- var partial = partials[name];
48
-
49
- if (!partial) {
50
- return '';
51
- }
52
-
53
- if (this.c && typeof partial == 'string') {
54
- partial = this.c.compile(partial);
55
- }
56
-
57
- return partial.ri(context, partials, indent);
58
- },
59
-
60
- // render a section
61
- rs: function(context, partials, section) {
62
- var buf = '',
63
- tail = context[context.length - 1];
64
-
65
- if (!isArray(tail)) {
66
- return buf = section(context, partials);
67
- }
68
-
69
- for (var i = 0; i < tail.length; i++) {
70
- context.push(tail[i]);
71
- buf += section(context, partials);
72
- context.pop();
73
- }
74
-
75
- return buf;
76
- },
77
-
78
- // maybe start a section
79
- s: function(val, ctx, partials, inverted, start, end, tags) {
80
- var pass;
81
-
82
- if (isArray(val) && val.length === 0) {
83
- return false;
84
- }
85
-
86
- if (typeof val == 'function') {
87
- val = this.ls(val, ctx, partials, inverted, start, end, tags);
88
- }
89
-
90
- pass = (val === '') || !!val;
91
-
92
- if (!inverted && pass && ctx) {
93
- ctx.push((typeof val == 'object') ? val : ctx[ctx.length - 1]);
94
- }
95
-
96
- return pass;
97
- },
98
-
99
- // find values with dotted names
100
- d: function(key, ctx, partials, returnFound) {
101
- var names = key.split('.'),
102
- val = this.f(names[0], ctx, partials, returnFound),
103
- cx = null;
104
-
105
- if (key === '.' && isArray(ctx[ctx.length - 2])) {
106
- return ctx[ctx.length - 1];
107
- }
108
-
109
- for (var i = 1; i < names.length; i++) {
110
- if (val && typeof val == 'object' && names[i] in val) {
111
- cx = val;
112
- val = val[names[i]];
113
- } else {
114
- val = '';
115
- }
116
- }
117
-
118
- if (returnFound && !val) {
119
- return false;
120
- }
121
-
122
- if (!returnFound && typeof val == 'function') {
123
- ctx.push(cx);
124
- val = this.lv(val, ctx, partials);
125
- ctx.pop();
126
- }
127
-
128
- return val;
129
- },
130
-
131
- // find values with normal names
132
- f: function(key, ctx, partials, returnFound) {
133
- var val = false,
134
- v = null,
135
- found = false;
136
-
137
- for (var i = ctx.length - 1; i >= 0; i--) {
138
- v = ctx[i];
139
- if (v && typeof v == 'object' && key in v) {
140
- val = v[key];
141
- found = true;
142
- break;
143
- }
144
- }
145
-
146
- if (!found) {
147
- return (returnFound) ? false : "";
148
- }
149
-
150
- if (!returnFound && typeof val == 'function') {
151
- val = this.lv(val, ctx, partials);
152
- }
153
-
154
- return val;
155
- },
156
-
157
- // higher order templates
158
- ho: function(val, cx, partials, text, tags) {
159
- var compiler = this.c;
160
- var t = val.call(cx, text, function(t) {
161
- return compiler.compile(t, {delimiters: tags}).render(cx, partials);
162
- });
163
- var s = compiler.compile(t.toString(), {delimiters: tags}).render(cx, partials);
164
- this.b = s;
165
- return false;
166
- },
167
-
168
- // higher order template result buffer
169
- b: '',
170
-
171
- // lambda replace section
172
- ls: function(val, ctx, partials, inverted, start, end, tags) {
173
- var cx = ctx[ctx.length - 1],
174
- t = null;
175
-
176
- if (!inverted && this.c && val.length > 0) {
177
- return this.ho(val, cx, partials, this.text.substring(start, end), tags);
178
- }
179
-
180
- t = val.call(cx);
181
-
182
- if (typeof t == 'function') {
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
- }
188
- }
189
-
190
- return t;
191
- },
192
-
193
- // lambda replace variable
194
- lv: function(val, ctx, partials) {
195
- var cx = ctx[ctx.length - 1];
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;
207
- }
208
-
209
- };
210
-
211
- var rAmp = /&/g,
212
- rLt = /</g,
213
- rGt = />/g,
214
- rApos =/\'/g,
215
- rQuot = /\"/g,
216
- hChars =/[&<>\"\']/;
217
-
218
- function hoganEscape(str) {
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;
228
- }
229
-
230
- var isArray = Array.isArray || function(a) {
231
- return Object.prototype.toString.call(a) === '[object Array]';
232
- };
233
-
234
- })(typeof exports !== 'undefined' ? exports : Hogan);
235
-
236
-
237
-
238
-
239
- (function (Hogan) {
240
- // Setup regex assignments
241
- // remove whitespace according to Mustache spec
242
- var rIsWhitespace = /\S/,
243
- rQuot = /\"/g,
244
- rNewline = /\n/g,
245
- rCr = /\r/g,
246
- rSlash = /\\/g,
247
- tagTypes = {
248
- '#': 1, '^': 2, '/': 3, '!': 4, '>': 5,
249
- '<': 6, '=': 7, '_v': 8, '{': 9, '&': 10
250
- };
251
-
252
- Hogan.scan = function scan(text, delimiters) {
253
- var len = text.length,
254
- IN_TEXT = 0,
255
- IN_TAG_TYPE = 1,
256
- IN_TAG = 2,
257
- state = IN_TEXT,
258
- tagType = null,
259
- tag = null,
260
- buf = '',
261
- tokens = [],
262
- seenTag = false,
263
- i = 0,
264
- lineStart = 0,
265
- otag = '{{',
266
- ctag = '}}';
267
-
268
- function addBuf() {
269
- if (buf.length > 0) {
270
- tokens.push(new String(buf));
271
- buf = '';
272
- }
273
- }
274
-
275
- function lineIsWhitespace() {
276
- var isAllWhitespace = true;
277
- for (var j = lineStart; j < tokens.length; j++) {
278
- isAllWhitespace =
279
- (tokens[j].tag && tagTypes[tokens[j].tag] < tagTypes['_v']) ||
280
- (!tokens[j].tag && tokens[j].match(rIsWhitespace) === null);
281
- if (!isAllWhitespace) {
282
- return false;
283
- }
284
- }
285
-
286
- return isAllWhitespace;
287
- }
288
-
289
- function filterLine(haveSeenTag, noNewLine) {
290
- addBuf();
291
-
292
- if (haveSeenTag && lineIsWhitespace()) {
293
- for (var j = lineStart, next; j < tokens.length; j++) {
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
- }
299
- tokens.splice(j, 1);
300
- }
301
- }
302
- } else if (!noNewLine) {
303
- tokens.push({tag:'\n'});
304
- }
305
-
306
- seenTag = false;
307
- lineStart = tokens.length;
308
- }
309
-
310
- function changeDelimiters(text, index) {
311
- var close = '=' + ctag,
312
- closeIndex = text.indexOf(close, index),
313
- delimiters = trim(
314
- text.substring(text.indexOf('=', index) + 1, closeIndex)
315
- ).split(' ');
316
-
317
- otag = delimiters[0];
318
- ctag = delimiters[1];
319
-
320
- return closeIndex + close.length - 1;
321
- }
322
-
323
- if (delimiters) {
324
- delimiters = delimiters.split(' ');
325
- otag = delimiters[0];
326
- ctag = delimiters[1];
327
- }
328
-
329
- for (i = 0; i < len; i++) {
330
- if (state == IN_TEXT) {
331
- if (tagChange(otag, text, i)) {
332
- --i;
333
- addBuf();
334
- state = IN_TAG_TYPE;
335
- } else {
336
- if (text.charAt(i) == '\n') {
337
- filterLine(seenTag);
338
- } else {
339
- buf += text.charAt(i);
340
- }
341
- }
342
- } else if (state == IN_TAG_TYPE) {
343
- i += otag.length - 1;
344
- tag = tagTypes[text.charAt(i + 1)];
345
- tagType = tag ? text.charAt(i + 1) : '_v';
346
- if (tagType == '=') {
347
- i = changeDelimiters(text, i);
348
- state = IN_TEXT;
349
- } else {
350
- if (tag) {
351
- i++;
352
- }
353
- state = IN_TAG;
354
- }
355
- seenTag = i;
356
- } else {
357
- if (tagChange(ctag, text, i)) {
358
- tokens.push({tag: tagType, n: trim(buf), otag: otag, ctag: ctag,
359
- i: (tagType == '/') ? seenTag - ctag.length : i + otag.length});
360
- buf = '';
361
- i += ctag.length - 1;
362
- state = IN_TEXT;
363
- if (tagType == '{') {
364
- if (ctag == '}}') {
365
- i++;
366
- } else {
367
- cleanTripleStache(tokens[tokens.length - 1]);
368
- }
369
- }
370
- } else {
371
- buf += text.charAt(i);
372
- }
373
- }
374
- }
375
-
376
- filterLine(seenTag, true);
377
-
378
- return tokens;
379
- }
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
-
387
- function trim(s) {
388
- if (s.trim) {
389
- return s.trim();
390
- }
391
-
392
- return s.replace(/^\s*|\s*$/g, '');
393
- }
394
-
395
- function tagChange(tag, text, index) {
396
- if (text.charAt(index) != tag.charAt(0)) {
397
- return false;
398
- }
399
-
400
- for (var i = 1, l = tag.length; i < l; i++) {
401
- if (text.charAt(index + i) != tag.charAt(i)) {
402
- return false;
403
- }
404
- }
405
-
406
- return true;
407
- }
408
-
409
- function buildTree(tokens, kind, stack, customTags) {
410
- var instructions = [],
411
- opener = null,
412
- token = null;
413
-
414
- while (tokens.length > 0) {
415
- token = tokens.shift();
416
- if (token.tag == '#' || token.tag == '^' || isOpener(token, customTags)) {
417
- stack.push(token);
418
- token.nodes = buildTree(tokens, token.tag, stack, customTags);
419
- instructions.push(token);
420
- } else if (token.tag == '/') {
421
- if (stack.length === 0) {
422
- throw new Error('Closing tag without opener: /' + token.n);
423
- }
424
- opener = stack.pop();
425
- if (token.n != opener.n && !isCloser(token.n, opener.n, customTags)) {
426
- throw new Error('Nesting error: ' + opener.n + ' vs. ' + token.n);
427
- }
428
- opener.end = token.i;
429
- return instructions;
430
- } else {
431
- instructions.push(token);
432
- }
433
- }
434
-
435
- if (stack.length > 0) {
436
- throw new Error('missing closing tag: ' + stack.pop().n);
437
- }
438
-
439
- return instructions;
440
- }
441
-
442
- function isOpener(token, tags) {
443
- for (var i = 0, l = tags.length; i < l; i++) {
444
- if (tags[i].o == token.n) {
445
- token.tag = '#';
446
- return true;
447
- }
448
- }
449
- }
450
-
451
- function isCloser(close, open, tags) {
452
- for (var i = 0, l = tags.length; i < l; i++) {
453
- if (tags[i].c == close && tags[i].o == open) {
454
- return true;
455
- }
456
- }
457
- }
458
-
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) {
464
- if (options.asString) {
465
- return 'function(c,p,i){' + code + ';}';
466
- }
467
-
468
- return new Hogan.Template(new Function('c', 'p', 'i', code), text, Hogan);
469
- }
470
-
471
- function esc(s) {
472
- return s.replace(rSlash, '\\\\')
473
- .replace(rQuot, '\\\"')
474
- .replace(rNewline, '\\n')
475
- .replace(rCr, '\\r');
476
- }
477
-
478
- function chooseMethod(s) {
479
- return (~s.indexOf('.')) ? 'd' : 'f';
480
- }
481
-
482
- function walk(tree) {
483
- var code = '';
484
- for (var i = 0, l = tree.length; i < l; i++) {
485
- var tag = tree[i].tag;
486
- if (tag == '#') {
487
- code += section(tree[i].nodes, tree[i].n, chooseMethod(tree[i].n),
488
- tree[i].i, tree[i].end, tree[i].otag + " " + tree[i].ctag);
489
- } else if (tag == '^') {
490
- code += invertedSection(tree[i].nodes, tree[i].n,
491
- chooseMethod(tree[i].n));
492
- } else if (tag == '<' || tag == '>') {
493
- code += partial(tree[i]);
494
- } else if (tag == '{' || tag == '&') {
495
- code += tripleStache(tree[i].n, chooseMethod(tree[i].n));
496
- } else if (tag == '\n') {
497
- code += text('"\\n"' + (tree.length-1 == i ? '' : ' + i'));
498
- } else if (tag == '_v') {
499
- code += variable(tree[i].n, chooseMethod(tree[i].n));
500
- } else if (tag === undefined) {
501
- code += text('"' + esc(tree[i]) + '"');
502
- }
503
- }
504
- return code;
505
- }
506
-
507
- function section(nodes, id, method, start, end, tags) {
508
- return 'if(_.s(_.' + method + '("' + esc(id) + '",c,p,1),' +
509
- 'c,p,0,' + start + ',' + end + ', "' + tags + '")){' +
510
- 'b += _.rs(c,p,' +
511
- 'function(c,p){ var b = "";' +
512
- walk(nodes) +
513
- 'return b;});c.pop();}' +
514
- 'else{b += _.b; _.b = ""};';
515
- }
516
-
517
- function invertedSection(nodes, id, method) {
518
- return 'if (!_.s(_.' + method + '("' + esc(id) + '",c,p,1),c,p,1,0,0,"")){' +
519
- walk(nodes) +
520
- '};';
521
- }
522
-
523
- function partial(tok) {
524
- return 'b += _.rp("' + esc(tok.n) + '",c,p,"' + (tok.indent || '') + '");';
525
- }
526
-
527
- function tripleStache(id, method) {
528
- return 'b += (_.' + method + '("' + esc(id) + '",c,p,0));';
529
- }
530
-
531
- function variable(id, method) {
532
- return 'b += (_.v(_.' + method + '("' + esc(id) + '",c,p,0)));';
533
- }
534
-
535
- function text(id) {
536
- return 'b += ' + id + ';';
537
- }
538
-
539
- Hogan.parse = function(tokens, options) {
540
- options = options || {};
541
- return buildTree(tokens, '', [], options.sectionTags || []);
542
- },
543
-
544
- Hogan.cache = {};
545
-
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;
566
- }
567
-
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
-
574
- if (typeof define === 'function' && define.amd) {
575
- define(Hogan);
576
- }