ember-rails-lite 0.8.0 → 0.9.2
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.
- data/README.md +2 -2
- data/lib/ember/handlebars/template.rb +51 -9
- data/lib/ember/handlebars/version.rb +1 -3
- data/lib/ember/rails/engine.rb +9 -6
- data/lib/ember/rails/version.rb +1 -1
- data/lib/ember/version.rb +1 -3
- data/lib/ember_rails.rb +6 -0
- data/lib/generators/ember/bootstrap_generator.rb +1 -1
- data/lib/generators/ember/route_generator.rb +16 -0
- data/lib/generators/ember/view_generator.rb +1 -0
- data/lib/generators/templates/app.js +1 -2
- data/lib/generators/templates/route.js +3 -0
- data/lib/generators/templates/router.js +1 -15
- data/lib/generators/templates/store.js +1 -3
- data/lib/generators/templates/view.js +0 -1
- data/vendor/ember/development/ember-data.js +5485 -1828
- data/vendor/ember/development/ember.js +12500 -9614
- data/vendor/ember/development/handlebars-runtime.js +68 -26
- data/vendor/ember/development/handlebars.js +438 -341
- data/vendor/ember/production/ember-data.js +5465 -1813
- data/vendor/ember/production/ember.js +20052 -17240
- data/vendor/ember/production/handlebars-runtime.js +270 -1
- data/vendor/ember/production/handlebars.js +1991 -1
- metadata +5 -9
- data/lib/ember/filters/haml.rb +0 -11
- data/lib/ember/filters/slim.rb +0 -5
- data/lib/ember/handlebars/assets/ember-precompiler.js +0 -28
- data/lib/ember/handlebars/source.rb +0 -54
- data/vendor/ember/spade/ember-data.js +0 -1
- data/vendor/ember/spade/ember.js +0 -1
@@ -3,9 +3,9 @@
|
|
3
3
|
/*jshint eqnull:true*/
|
4
4
|
this.Handlebars = {};
|
5
5
|
|
6
|
-
(function() {
|
6
|
+
(function(Handlebars) {
|
7
7
|
|
8
|
-
Handlebars.VERSION = "1.0.rc.
|
8
|
+
Handlebars.VERSION = "1.0.rc.2";
|
9
9
|
|
10
10
|
Handlebars.helpers = {};
|
11
11
|
Handlebars.partials = {};
|
@@ -44,29 +44,71 @@ Handlebars.registerHelper('blockHelperMissing', function(context, options) {
|
|
44
44
|
return inverse(this);
|
45
45
|
} else if(type === "[object Array]") {
|
46
46
|
if(context.length > 0) {
|
47
|
-
|
48
|
-
ret = ret + fn(context[i]);
|
49
|
-
}
|
47
|
+
return Handlebars.helpers.each(context, options);
|
50
48
|
} else {
|
51
|
-
|
49
|
+
return inverse(this);
|
52
50
|
}
|
53
|
-
return ret;
|
54
51
|
} else {
|
55
52
|
return fn(context);
|
56
53
|
}
|
57
54
|
});
|
58
55
|
|
56
|
+
Handlebars.K = function() {};
|
57
|
+
|
58
|
+
Handlebars.createFrame = Object.create || function(object) {
|
59
|
+
Handlebars.K.prototype = object;
|
60
|
+
var obj = new Handlebars.K();
|
61
|
+
Handlebars.K.prototype = null;
|
62
|
+
return obj;
|
63
|
+
};
|
64
|
+
|
65
|
+
Handlebars.logger = {
|
66
|
+
DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3,
|
67
|
+
|
68
|
+
methodMap: {0: 'debug', 1: 'info', 2: 'warn', 3: 'error'},
|
69
|
+
|
70
|
+
// can be overridden in the host environment
|
71
|
+
log: function(level, obj) {
|
72
|
+
if (Handlebars.logger.level <= level) {
|
73
|
+
var method = Handlebars.logger.methodMap[level];
|
74
|
+
if (typeof console !== 'undefined' && console[method]) {
|
75
|
+
console[method].call(console, obj);
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
};
|
80
|
+
|
81
|
+
Handlebars.log = function(level, obj) { Handlebars.logger.log(level, obj); };
|
82
|
+
|
59
83
|
Handlebars.registerHelper('each', function(context, options) {
|
60
84
|
var fn = options.fn, inverse = options.inverse;
|
61
|
-
var ret = "";
|
85
|
+
var i = 0, ret = "", data;
|
62
86
|
|
63
|
-
if(
|
64
|
-
|
65
|
-
|
87
|
+
if (options.data) {
|
88
|
+
data = Handlebars.createFrame(options.data);
|
89
|
+
}
|
90
|
+
|
91
|
+
if(context && typeof context === 'object') {
|
92
|
+
if(context instanceof Array){
|
93
|
+
for(var j = context.length; i<j; i++) {
|
94
|
+
if (data) { data.index = i; }
|
95
|
+
ret = ret + fn(context[i], { data: data });
|
96
|
+
}
|
97
|
+
} else {
|
98
|
+
for(var key in context) {
|
99
|
+
if(context.hasOwnProperty(key)) {
|
100
|
+
if(data) { data.key = key; }
|
101
|
+
ret = ret + fn(context[key], {data: data});
|
102
|
+
i++;
|
103
|
+
}
|
104
|
+
}
|
66
105
|
}
|
67
|
-
}
|
106
|
+
}
|
107
|
+
|
108
|
+
if(i === 0){
|
68
109
|
ret = inverse(this);
|
69
110
|
}
|
111
|
+
|
70
112
|
return ret;
|
71
113
|
});
|
72
114
|
|
@@ -93,21 +135,24 @@ Handlebars.registerHelper('with', function(context, options) {
|
|
93
135
|
return options.fn(context);
|
94
136
|
});
|
95
137
|
|
96
|
-
Handlebars.registerHelper('log', function(context) {
|
97
|
-
|
138
|
+
Handlebars.registerHelper('log', function(context, options) {
|
139
|
+
var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;
|
140
|
+
Handlebars.log(level, context);
|
98
141
|
});
|
99
142
|
|
100
|
-
}());
|
143
|
+
}(this.Handlebars));
|
101
144
|
;
|
102
145
|
// lib/handlebars/utils.js
|
146
|
+
|
147
|
+
var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
|
148
|
+
|
103
149
|
Handlebars.Exception = function(message) {
|
104
150
|
var tmp = Error.prototype.constructor.apply(this, arguments);
|
105
151
|
|
106
|
-
|
107
|
-
|
152
|
+
// Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
|
153
|
+
for (var idx = 0; idx < errorProps.length; idx++) {
|
154
|
+
this[errorProps[idx]] = tmp[errorProps[idx]];
|
108
155
|
}
|
109
|
-
|
110
|
-
this.message = tmp.message;
|
111
156
|
};
|
112
157
|
Handlebars.Exception.prototype = new Error();
|
113
158
|
|
@@ -121,6 +166,7 @@ Handlebars.SafeString.prototype.toString = function() {
|
|
121
166
|
|
122
167
|
(function() {
|
123
168
|
var escape = {
|
169
|
+
"&": "&",
|
124
170
|
"<": "<",
|
125
171
|
">": ">",
|
126
172
|
'"': """,
|
@@ -128,7 +174,7 @@ Handlebars.SafeString.prototype.toString = function() {
|
|
128
174
|
"`": "`"
|
129
175
|
};
|
130
176
|
|
131
|
-
var badChars =
|
177
|
+
var badChars = /[&<>"'`]/g;
|
132
178
|
var possible = /[&<>"'`]/;
|
133
179
|
|
134
180
|
var escapeChar = function(chr) {
|
@@ -149,11 +195,7 @@ Handlebars.SafeString.prototype.toString = function() {
|
|
149
195
|
},
|
150
196
|
|
151
197
|
isEmpty: function(value) {
|
152
|
-
if (
|
153
|
-
return true;
|
154
|
-
} else if (value === null) {
|
155
|
-
return true;
|
156
|
-
} else if (value === false) {
|
198
|
+
if (!value && value !== 0) {
|
157
199
|
return true;
|
158
200
|
} else if(Object.prototype.toString.call(value) === "[object Array]" && value.length === 0) {
|
159
201
|
return true;
|
@@ -219,7 +261,7 @@ Handlebars.VM = {
|
|
219
261
|
} else if (!Handlebars.compile) {
|
220
262
|
throw new Handlebars.Exception("The partial " + name + " could not be compiled when running in runtime-only mode");
|
221
263
|
} else {
|
222
|
-
partials[name] = Handlebars.compile(partial);
|
264
|
+
partials[name] = Handlebars.compile(partial, {data: data !== undefined});
|
223
265
|
return partials[name](context, options);
|
224
266
|
}
|
225
267
|
}
|
@@ -3,9 +3,9 @@
|
|
3
3
|
/*jshint eqnull:true*/
|
4
4
|
this.Handlebars = {};
|
5
5
|
|
6
|
-
(function() {
|
6
|
+
(function(Handlebars) {
|
7
7
|
|
8
|
-
Handlebars.VERSION = "1.0.rc.
|
8
|
+
Handlebars.VERSION = "1.0.rc.2";
|
9
9
|
|
10
10
|
Handlebars.helpers = {};
|
11
11
|
Handlebars.partials = {};
|
@@ -44,29 +44,71 @@ Handlebars.registerHelper('blockHelperMissing', function(context, options) {
|
|
44
44
|
return inverse(this);
|
45
45
|
} else if(type === "[object Array]") {
|
46
46
|
if(context.length > 0) {
|
47
|
-
|
48
|
-
ret = ret + fn(context[i]);
|
49
|
-
}
|
47
|
+
return Handlebars.helpers.each(context, options);
|
50
48
|
} else {
|
51
|
-
|
49
|
+
return inverse(this);
|
52
50
|
}
|
53
|
-
return ret;
|
54
51
|
} else {
|
55
52
|
return fn(context);
|
56
53
|
}
|
57
54
|
});
|
58
55
|
|
56
|
+
Handlebars.K = function() {};
|
57
|
+
|
58
|
+
Handlebars.createFrame = Object.create || function(object) {
|
59
|
+
Handlebars.K.prototype = object;
|
60
|
+
var obj = new Handlebars.K();
|
61
|
+
Handlebars.K.prototype = null;
|
62
|
+
return obj;
|
63
|
+
};
|
64
|
+
|
65
|
+
Handlebars.logger = {
|
66
|
+
DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3,
|
67
|
+
|
68
|
+
methodMap: {0: 'debug', 1: 'info', 2: 'warn', 3: 'error'},
|
69
|
+
|
70
|
+
// can be overridden in the host environment
|
71
|
+
log: function(level, obj) {
|
72
|
+
if (Handlebars.logger.level <= level) {
|
73
|
+
var method = Handlebars.logger.methodMap[level];
|
74
|
+
if (typeof console !== 'undefined' && console[method]) {
|
75
|
+
console[method].call(console, obj);
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
};
|
80
|
+
|
81
|
+
Handlebars.log = function(level, obj) { Handlebars.logger.log(level, obj); };
|
82
|
+
|
59
83
|
Handlebars.registerHelper('each', function(context, options) {
|
60
84
|
var fn = options.fn, inverse = options.inverse;
|
61
|
-
var ret = "";
|
85
|
+
var i = 0, ret = "", data;
|
62
86
|
|
63
|
-
if(
|
64
|
-
|
65
|
-
|
87
|
+
if (options.data) {
|
88
|
+
data = Handlebars.createFrame(options.data);
|
89
|
+
}
|
90
|
+
|
91
|
+
if(context && typeof context === 'object') {
|
92
|
+
if(context instanceof Array){
|
93
|
+
for(var j = context.length; i<j; i++) {
|
94
|
+
if (data) { data.index = i; }
|
95
|
+
ret = ret + fn(context[i], { data: data });
|
96
|
+
}
|
97
|
+
} else {
|
98
|
+
for(var key in context) {
|
99
|
+
if(context.hasOwnProperty(key)) {
|
100
|
+
if(data) { data.key = key; }
|
101
|
+
ret = ret + fn(context[key], {data: data});
|
102
|
+
i++;
|
103
|
+
}
|
104
|
+
}
|
66
105
|
}
|
67
|
-
}
|
106
|
+
}
|
107
|
+
|
108
|
+
if(i === 0){
|
68
109
|
ret = inverse(this);
|
69
110
|
}
|
111
|
+
|
70
112
|
return ret;
|
71
113
|
});
|
72
114
|
|
@@ -93,302 +135,236 @@ Handlebars.registerHelper('with', function(context, options) {
|
|
93
135
|
return options.fn(context);
|
94
136
|
});
|
95
137
|
|
96
|
-
Handlebars.registerHelper('log', function(context) {
|
97
|
-
|
138
|
+
Handlebars.registerHelper('log', function(context, options) {
|
139
|
+
var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;
|
140
|
+
Handlebars.log(level, context);
|
98
141
|
});
|
99
142
|
|
100
|
-
}());
|
143
|
+
}(this.Handlebars));
|
101
144
|
;
|
102
145
|
// lib/handlebars/compiler/parser.js
|
103
146
|
/* Jison generated parser */
|
104
147
|
var handlebars = (function(){
|
105
|
-
|
106
148
|
var parser = {trace: function trace() { },
|
107
149
|
yy: {},
|
108
|
-
symbols_: {"error":2,"root":3,"program":4,"EOF":5,"
|
109
|
-
terminals_: {2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"OPEN_PARTIAL",28:"STRING",
|
110
|
-
productions_: [0,[3,2],[4,3],[4,1],[4,0],[
|
150
|
+
symbols_: {"error":2,"root":3,"program":4,"EOF":5,"simpleInverse":6,"statements":7,"statement":8,"openInverse":9,"closeBlock":10,"openBlock":11,"mustache":12,"partial":13,"CONTENT":14,"COMMENT":15,"OPEN_BLOCK":16,"inMustache":17,"CLOSE":18,"OPEN_INVERSE":19,"OPEN_ENDBLOCK":20,"path":21,"OPEN":22,"OPEN_UNESCAPED":23,"OPEN_PARTIAL":24,"partialName":25,"params":26,"hash":27,"DATA":28,"param":29,"STRING":30,"INTEGER":31,"BOOLEAN":32,"hashSegments":33,"hashSegment":34,"ID":35,"EQUALS":36,"PARTIAL_NAME":37,"pathSegments":38,"SEP":39,"$accept":0,"$end":1},
|
151
|
+
terminals_: {2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"OPEN_PARTIAL",28:"DATA",30:"STRING",31:"INTEGER",32:"BOOLEAN",35:"ID",36:"EQUALS",37:"PARTIAL_NAME",39:"SEP"},
|
152
|
+
productions_: [0,[3,2],[4,2],[4,3],[4,2],[4,1],[4,1],[4,0],[7,1],[7,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,3],[13,4],[6,2],[17,3],[17,2],[17,2],[17,1],[17,1],[26,2],[26,1],[29,1],[29,1],[29,1],[29,1],[29,1],[27,1],[33,2],[33,1],[34,3],[34,3],[34,3],[34,3],[34,3],[25,1],[21,1],[38,3],[38,1]],
|
111
153
|
performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
|
112
154
|
|
113
155
|
var $0 = $$.length - 1;
|
114
156
|
switch (yystate) {
|
115
157
|
case 1: return $$[$0-1];
|
116
158
|
break;
|
117
|
-
case 2: this.$ = new yy.ProgramNode(
|
159
|
+
case 2: this.$ = new yy.ProgramNode([], $$[$0]);
|
118
160
|
break;
|
119
|
-
case 3: this.$ = new yy.ProgramNode($$[$0]);
|
161
|
+
case 3: this.$ = new yy.ProgramNode($$[$0-2], $$[$0]);
|
120
162
|
break;
|
121
|
-
case 4: this.$ = new yy.ProgramNode([]);
|
163
|
+
case 4: this.$ = new yy.ProgramNode($$[$0-1], []);
|
122
164
|
break;
|
123
|
-
case 5: this.$ =
|
165
|
+
case 5: this.$ = new yy.ProgramNode($$[$0]);
|
124
166
|
break;
|
125
|
-
case 6:
|
167
|
+
case 6: this.$ = new yy.ProgramNode([], []);
|
126
168
|
break;
|
127
|
-
case 7: this.$ = new yy.
|
169
|
+
case 7: this.$ = new yy.ProgramNode([]);
|
128
170
|
break;
|
129
|
-
case 8: this.$ =
|
171
|
+
case 8: this.$ = [$$[$0]];
|
130
172
|
break;
|
131
|
-
case 9: this.$ = $$[$0];
|
173
|
+
case 9: $$[$0-1].push($$[$0]); this.$ = $$[$0-1];
|
132
174
|
break;
|
133
|
-
case 10: this.$ = $$[$0];
|
175
|
+
case 10: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1].inverse, $$[$0-1], $$[$0]);
|
134
176
|
break;
|
135
|
-
case 11: this.$ = new yy.
|
177
|
+
case 11: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1], $$[$0-1].inverse, $$[$0]);
|
136
178
|
break;
|
137
|
-
case 12: this.$ =
|
179
|
+
case 12: this.$ = $$[$0];
|
138
180
|
break;
|
139
|
-
case 13: this.$ =
|
181
|
+
case 13: this.$ = $$[$0];
|
140
182
|
break;
|
141
|
-
case 14: this.$ = new yy.
|
183
|
+
case 14: this.$ = new yy.ContentNode($$[$0]);
|
142
184
|
break;
|
143
|
-
case 15: this.$ = $$[$0
|
185
|
+
case 15: this.$ = new yy.CommentNode($$[$0]);
|
144
186
|
break;
|
145
187
|
case 16: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]);
|
146
188
|
break;
|
147
|
-
case 17: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]
|
189
|
+
case 17: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]);
|
190
|
+
break;
|
191
|
+
case 18: this.$ = $$[$0-1];
|
192
|
+
break;
|
193
|
+
case 19: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]);
|
194
|
+
break;
|
195
|
+
case 20: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], true);
|
196
|
+
break;
|
197
|
+
case 21: this.$ = new yy.PartialNode($$[$0-1]);
|
148
198
|
break;
|
149
|
-
case
|
199
|
+
case 22: this.$ = new yy.PartialNode($$[$0-2], $$[$0-1]);
|
150
200
|
break;
|
151
|
-
case
|
201
|
+
case 23:
|
152
202
|
break;
|
153
|
-
case
|
203
|
+
case 24: this.$ = [[$$[$0-2]].concat($$[$0-1]), $$[$0]];
|
154
204
|
break;
|
155
|
-
case
|
205
|
+
case 25: this.$ = [[$$[$0-1]].concat($$[$0]), null];
|
156
206
|
break;
|
157
|
-
case
|
207
|
+
case 26: this.$ = [[$$[$0-1]], $$[$0]];
|
158
208
|
break;
|
159
|
-
case
|
209
|
+
case 27: this.$ = [[$$[$0]], null];
|
160
210
|
break;
|
161
|
-
case
|
211
|
+
case 28: this.$ = [[new yy.DataNode($$[$0])], null];
|
162
212
|
break;
|
163
|
-
case
|
213
|
+
case 29: $$[$0-1].push($$[$0]); this.$ = $$[$0-1];
|
164
214
|
break;
|
165
|
-
case
|
215
|
+
case 30: this.$ = [$$[$0]];
|
166
216
|
break;
|
167
|
-
case
|
217
|
+
case 31: this.$ = $$[$0];
|
168
218
|
break;
|
169
|
-
case
|
219
|
+
case 32: this.$ = new yy.StringNode($$[$0]);
|
170
220
|
break;
|
171
|
-
case
|
221
|
+
case 33: this.$ = new yy.IntegerNode($$[$0]);
|
172
222
|
break;
|
173
|
-
case
|
223
|
+
case 34: this.$ = new yy.BooleanNode($$[$0]);
|
174
224
|
break;
|
175
|
-
case
|
225
|
+
case 35: this.$ = new yy.DataNode($$[$0]);
|
176
226
|
break;
|
177
|
-
case
|
227
|
+
case 36: this.$ = new yy.HashNode($$[$0]);
|
178
228
|
break;
|
179
|
-
case
|
229
|
+
case 37: $$[$0-1].push($$[$0]); this.$ = $$[$0-1];
|
180
230
|
break;
|
181
|
-
case
|
231
|
+
case 38: this.$ = [$$[$0]];
|
182
232
|
break;
|
183
|
-
case
|
233
|
+
case 39: this.$ = [$$[$0-2], $$[$0]];
|
184
234
|
break;
|
185
|
-
case
|
235
|
+
case 40: this.$ = [$$[$0-2], new yy.StringNode($$[$0])];
|
186
236
|
break;
|
187
|
-
case
|
237
|
+
case 41: this.$ = [$$[$0-2], new yy.IntegerNode($$[$0])];
|
188
238
|
break;
|
189
|
-
case
|
239
|
+
case 42: this.$ = [$$[$0-2], new yy.BooleanNode($$[$0])];
|
190
240
|
break;
|
191
|
-
case
|
241
|
+
case 43: this.$ = [$$[$0-2], new yy.DataNode($$[$0])];
|
192
242
|
break;
|
193
|
-
case
|
243
|
+
case 44: this.$ = new yy.PartialNameNode($$[$0]);
|
244
|
+
break;
|
245
|
+
case 45: this.$ = new yy.IdNode($$[$0]);
|
246
|
+
break;
|
247
|
+
case 46: $$[$0-2].push($$[$0]); this.$ = $$[$0-2];
|
248
|
+
break;
|
249
|
+
case 47: this.$ = [$$[$0]];
|
194
250
|
break;
|
195
251
|
}
|
196
252
|
},
|
197
|
-
table: [{3:1,4:2,5:[2,
|
198
|
-
defaultActions: {
|
253
|
+
table: [{3:1,4:2,5:[2,7],6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],22:[1,14],23:[1,15],24:[1,16]},{1:[3]},{5:[1,17]},{5:[2,6],7:18,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,6],22:[1,14],23:[1,15],24:[1,16]},{5:[2,5],6:20,8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,5],22:[1,14],23:[1,15],24:[1,16]},{17:23,18:[1,22],21:24,28:[1,25],35:[1,27],38:26},{5:[2,8],14:[2,8],15:[2,8],16:[2,8],19:[2,8],20:[2,8],22:[2,8],23:[2,8],24:[2,8]},{4:28,6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,7],22:[1,14],23:[1,15],24:[1,16]},{4:29,6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,7],22:[1,14],23:[1,15],24:[1,16]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],24:[2,12]},{5:[2,13],14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],24:[2,13]},{5:[2,14],14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],24:[2,14]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],24:[2,15]},{17:30,21:24,28:[1,25],35:[1,27],38:26},{17:31,21:24,28:[1,25],35:[1,27],38:26},{17:32,21:24,28:[1,25],35:[1,27],38:26},{25:33,37:[1,34]},{1:[2,1]},{5:[2,2],8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,2],22:[1,14],23:[1,15],24:[1,16]},{17:23,21:24,28:[1,25],35:[1,27],38:26},{5:[2,4],7:35,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,4],22:[1,14],23:[1,15],24:[1,16]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],24:[2,9]},{5:[2,23],14:[2,23],15:[2,23],16:[2,23],19:[2,23],20:[2,23],22:[2,23],23:[2,23],24:[2,23]},{18:[1,36]},{18:[2,27],21:41,26:37,27:38,28:[1,45],29:39,30:[1,42],31:[1,43],32:[1,44],33:40,34:46,35:[1,47],38:26},{18:[2,28]},{18:[2,45],28:[2,45],30:[2,45],31:[2,45],32:[2,45],35:[2,45],39:[1,48]},{18:[2,47],28:[2,47],30:[2,47],31:[2,47],32:[2,47],35:[2,47],39:[2,47]},{10:49,20:[1,50]},{10:51,20:[1,50]},{18:[1,52]},{18:[1,53]},{18:[1,54]},{18:[1,55],21:56,35:[1,27],38:26},{18:[2,44],35:[2,44]},{5:[2,3],8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,3],22:[1,14],23:[1,15],24:[1,16]},{14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],24:[2,17]},{18:[2,25],21:41,27:57,28:[1,45],29:58,30:[1,42],31:[1,43],32:[1,44],33:40,34:46,35:[1,47],38:26},{18:[2,26]},{18:[2,30],28:[2,30],30:[2,30],31:[2,30],32:[2,30],35:[2,30]},{18:[2,36],34:59,35:[1,60]},{18:[2,31],28:[2,31],30:[2,31],31:[2,31],32:[2,31],35:[2,31]},{18:[2,32],28:[2,32],30:[2,32],31:[2,32],32:[2,32],35:[2,32]},{18:[2,33],28:[2,33],30:[2,33],31:[2,33],32:[2,33],35:[2,33]},{18:[2,34],28:[2,34],30:[2,34],31:[2,34],32:[2,34],35:[2,34]},{18:[2,35],28:[2,35],30:[2,35],31:[2,35],32:[2,35],35:[2,35]},{18:[2,38],35:[2,38]},{18:[2,47],28:[2,47],30:[2,47],31:[2,47],32:[2,47],35:[2,47],36:[1,61],39:[2,47]},{35:[1,62]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],24:[2,10]},{21:63,35:[1,27],38:26},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],24:[2,11]},{14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],24:[2,16]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],24:[2,19]},{5:[2,20],14:[2,20],15:[2,20],16:[2,20],19:[2,20],20:[2,20],22:[2,20],23:[2,20],24:[2,20]},{5:[2,21],14:[2,21],15:[2,21],16:[2,21],19:[2,21],20:[2,21],22:[2,21],23:[2,21],24:[2,21]},{18:[1,64]},{18:[2,24]},{18:[2,29],28:[2,29],30:[2,29],31:[2,29],32:[2,29],35:[2,29]},{18:[2,37],35:[2,37]},{36:[1,61]},{21:65,28:[1,69],30:[1,66],31:[1,67],32:[1,68],35:[1,27],38:26},{18:[2,46],28:[2,46],30:[2,46],31:[2,46],32:[2,46],35:[2,46],39:[2,46]},{18:[1,70]},{5:[2,22],14:[2,22],15:[2,22],16:[2,22],19:[2,22],20:[2,22],22:[2,22],23:[2,22],24:[2,22]},{18:[2,39],35:[2,39]},{18:[2,40],35:[2,40]},{18:[2,41],35:[2,41]},{18:[2,42],35:[2,42]},{18:[2,43],35:[2,43]},{5:[2,18],14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],24:[2,18]}],
|
254
|
+
defaultActions: {17:[2,1],25:[2,28],38:[2,26],57:[2,24]},
|
199
255
|
parseError: function parseError(str, hash) {
|
200
256
|
throw new Error(str);
|
201
257
|
},
|
202
258
|
parse: function parse(input) {
|
203
|
-
var self = this,
|
204
|
-
stack = [0],
|
205
|
-
vstack = [null], // semantic value stack
|
206
|
-
lstack = [], // location stack
|
207
|
-
table = this.table,
|
208
|
-
yytext = '',
|
209
|
-
yylineno = 0,
|
210
|
-
yyleng = 0,
|
211
|
-
recovering = 0,
|
212
|
-
TERROR = 2,
|
213
|
-
EOF = 1;
|
214
|
-
|
215
|
-
//this.reductionCount = this.shiftCount = 0;
|
216
|
-
|
259
|
+
var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
217
260
|
this.lexer.setInput(input);
|
218
261
|
this.lexer.yy = this.yy;
|
219
262
|
this.yy.lexer = this.lexer;
|
220
|
-
|
263
|
+
this.yy.parser = this;
|
264
|
+
if (typeof this.lexer.yylloc == "undefined")
|
221
265
|
this.lexer.yylloc = {};
|
222
266
|
var yyloc = this.lexer.yylloc;
|
223
267
|
lstack.push(yyloc);
|
224
|
-
|
225
|
-
if (typeof this.yy.parseError ===
|
268
|
+
var ranges = this.lexer.options && this.lexer.options.ranges;
|
269
|
+
if (typeof this.yy.parseError === "function")
|
226
270
|
this.parseError = this.yy.parseError;
|
227
|
-
|
228
|
-
|
229
|
-
stack.length = stack.length - 2*n;
|
271
|
+
function popStack(n) {
|
272
|
+
stack.length = stack.length - 2 * n;
|
230
273
|
vstack.length = vstack.length - n;
|
231
274
|
lstack.length = lstack.length - n;
|
232
275
|
}
|
233
|
-
|
234
276
|
function lex() {
|
235
277
|
var token;
|
236
|
-
token = self.lexer.lex() || 1;
|
237
|
-
|
238
|
-
if (typeof token !== 'number') {
|
278
|
+
token = self.lexer.lex() || 1;
|
279
|
+
if (typeof token !== "number") {
|
239
280
|
token = self.symbols_[token] || token;
|
240
281
|
}
|
241
282
|
return token;
|
242
283
|
}
|
243
|
-
|
244
|
-
var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected;
|
284
|
+
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
245
285
|
while (true) {
|
246
|
-
|
247
|
-
state = stack[stack.length-1];
|
248
|
-
|
249
|
-
// use default actions if available
|
286
|
+
state = stack[stack.length - 1];
|
250
287
|
if (this.defaultActions[state]) {
|
251
288
|
action = this.defaultActions[state];
|
252
289
|
} else {
|
253
|
-
if (symbol ==
|
290
|
+
if (symbol === null || typeof symbol == "undefined") {
|
254
291
|
symbol = lex();
|
255
|
-
|
292
|
+
}
|
256
293
|
action = table[state] && table[state][symbol];
|
257
294
|
}
|
258
|
-
|
259
|
-
|
260
|
-
_handle_error:
|
261
|
-
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
262
|
-
|
295
|
+
if (typeof action === "undefined" || !action.length || !action[0]) {
|
296
|
+
var errStr = "";
|
263
297
|
if (!recovering) {
|
264
|
-
// Report error
|
265
298
|
expected = [];
|
266
|
-
for (p in table[state])
|
267
|
-
|
268
|
-
|
269
|
-
|
299
|
+
for (p in table[state])
|
300
|
+
if (this.terminals_[p] && p > 2) {
|
301
|
+
expected.push("'" + this.terminals_[p] + "'");
|
302
|
+
}
|
270
303
|
if (this.lexer.showPosition) {
|
271
|
-
errStr =
|
304
|
+
errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
|
272
305
|
} else {
|
273
|
-
errStr =
|
274
|
-
(symbol == 1 /*EOF*/ ? "end of input" :
|
275
|
-
("'"+(this.terminals_[symbol] || symbol)+"'"));
|
306
|
+
errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'");
|
276
307
|
}
|
277
|
-
this.parseError(errStr,
|
278
|
-
{text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
|
308
|
+
this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
|
279
309
|
}
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
310
|
+
}
|
311
|
+
if (action[0] instanceof Array && action.length > 1) {
|
312
|
+
throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
|
313
|
+
}
|
314
|
+
switch (action[0]) {
|
315
|
+
case 1:
|
316
|
+
stack.push(symbol);
|
317
|
+
vstack.push(this.lexer.yytext);
|
318
|
+
lstack.push(this.lexer.yylloc);
|
319
|
+
stack.push(action[1]);
|
320
|
+
symbol = null;
|
321
|
+
if (!preErrorSymbol) {
|
288
322
|
yyleng = this.lexer.yyleng;
|
289
323
|
yytext = this.lexer.yytext;
|
290
324
|
yylineno = this.lexer.yylineno;
|
291
325
|
yyloc = this.lexer.yylloc;
|
292
|
-
|
326
|
+
if (recovering > 0)
|
327
|
+
recovering--;
|
328
|
+
} else {
|
329
|
+
symbol = preErrorSymbol;
|
330
|
+
preErrorSymbol = null;
|
293
331
|
}
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
if (state == 0) {
|
302
|
-
throw new Error(errStr || 'Parsing halted.');
|
303
|
-
}
|
304
|
-
popStack(1);
|
305
|
-
state = stack[stack.length-1];
|
332
|
+
break;
|
333
|
+
case 2:
|
334
|
+
len = this.productions_[action[1]][1];
|
335
|
+
yyval.$ = vstack[vstack.length - len];
|
336
|
+
yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};
|
337
|
+
if (ranges) {
|
338
|
+
yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
|
306
339
|
}
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
stack.push(symbol);
|
326
|
-
vstack.push(this.lexer.yytext);
|
327
|
-
lstack.push(this.lexer.yylloc);
|
328
|
-
stack.push(action[1]); // push state
|
329
|
-
symbol = null;
|
330
|
-
if (!preErrorSymbol) { // normal execution/no error
|
331
|
-
yyleng = this.lexer.yyleng;
|
332
|
-
yytext = this.lexer.yytext;
|
333
|
-
yylineno = this.lexer.yylineno;
|
334
|
-
yyloc = this.lexer.yylloc;
|
335
|
-
if (recovering > 0)
|
336
|
-
recovering--;
|
337
|
-
} else { // error just occurred, resume old lookahead f/ before error
|
338
|
-
symbol = preErrorSymbol;
|
339
|
-
preErrorSymbol = null;
|
340
|
-
}
|
341
|
-
break;
|
342
|
-
|
343
|
-
case 2: // reduce
|
344
|
-
//this.reductionCount++;
|
345
|
-
|
346
|
-
len = this.productions_[action[1]][1];
|
347
|
-
|
348
|
-
// perform semantic action
|
349
|
-
yyval.$ = vstack[vstack.length-len]; // default to $$ = $1
|
350
|
-
// default location, uses first token for firsts, last for lasts
|
351
|
-
yyval._$ = {
|
352
|
-
first_line: lstack[lstack.length-(len||1)].first_line,
|
353
|
-
last_line: lstack[lstack.length-1].last_line,
|
354
|
-
first_column: lstack[lstack.length-(len||1)].first_column,
|
355
|
-
last_column: lstack[lstack.length-1].last_column
|
356
|
-
};
|
357
|
-
r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
|
358
|
-
|
359
|
-
if (typeof r !== 'undefined') {
|
360
|
-
return r;
|
361
|
-
}
|
362
|
-
|
363
|
-
// pop off stack
|
364
|
-
if (len) {
|
365
|
-
stack = stack.slice(0,-1*len*2);
|
366
|
-
vstack = vstack.slice(0, -1*len);
|
367
|
-
lstack = lstack.slice(0, -1*len);
|
368
|
-
}
|
369
|
-
|
370
|
-
stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce)
|
371
|
-
vstack.push(yyval.$);
|
372
|
-
lstack.push(yyval._$);
|
373
|
-
// goto new state = table[STATE][NONTERMINAL]
|
374
|
-
newState = table[stack[stack.length-2]][stack[stack.length-1]];
|
375
|
-
stack.push(newState);
|
376
|
-
break;
|
377
|
-
|
378
|
-
case 3: // accept
|
379
|
-
return true;
|
340
|
+
r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
|
341
|
+
if (typeof r !== "undefined") {
|
342
|
+
return r;
|
343
|
+
}
|
344
|
+
if (len) {
|
345
|
+
stack = stack.slice(0, -1 * len * 2);
|
346
|
+
vstack = vstack.slice(0, -1 * len);
|
347
|
+
lstack = lstack.slice(0, -1 * len);
|
348
|
+
}
|
349
|
+
stack.push(this.productions_[action[1]][0]);
|
350
|
+
vstack.push(yyval.$);
|
351
|
+
lstack.push(yyval._$);
|
352
|
+
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
353
|
+
stack.push(newState);
|
354
|
+
break;
|
355
|
+
case 3:
|
356
|
+
return true;
|
380
357
|
}
|
381
|
-
|
382
358
|
}
|
383
|
-
|
384
359
|
return true;
|
385
|
-
}
|
360
|
+
}
|
361
|
+
};
|
362
|
+
/* Jison generated lexer */
|
386
363
|
var lexer = (function(){
|
387
|
-
|
388
364
|
var lexer = ({EOF:1,
|
389
365
|
parseError:function parseError(str, hash) {
|
390
|
-
if (this.yy.
|
391
|
-
this.yy.parseError(str, hash);
|
366
|
+
if (this.yy.parser) {
|
367
|
+
this.yy.parser.parseError(str, hash);
|
392
368
|
} else {
|
393
369
|
throw new Error(str);
|
394
370
|
}
|
@@ -400,27 +376,64 @@ setInput:function (input) {
|
|
400
376
|
this.yytext = this.matched = this.match = '';
|
401
377
|
this.conditionStack = ['INITIAL'];
|
402
378
|
this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
|
379
|
+
if (this.options.ranges) this.yylloc.range = [0,0];
|
380
|
+
this.offset = 0;
|
403
381
|
return this;
|
404
382
|
},
|
405
383
|
input:function () {
|
406
384
|
var ch = this._input[0];
|
407
|
-
this.yytext+=ch;
|
385
|
+
this.yytext += ch;
|
408
386
|
this.yyleng++;
|
409
|
-
this.
|
410
|
-
this.
|
411
|
-
|
412
|
-
|
387
|
+
this.offset++;
|
388
|
+
this.match += ch;
|
389
|
+
this.matched += ch;
|
390
|
+
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
391
|
+
if (lines) {
|
392
|
+
this.yylineno++;
|
393
|
+
this.yylloc.last_line++;
|
394
|
+
} else {
|
395
|
+
this.yylloc.last_column++;
|
396
|
+
}
|
397
|
+
if (this.options.ranges) this.yylloc.range[1]++;
|
398
|
+
|
413
399
|
this._input = this._input.slice(1);
|
414
400
|
return ch;
|
415
401
|
},
|
416
402
|
unput:function (ch) {
|
403
|
+
var len = ch.length;
|
404
|
+
var lines = ch.split(/(?:\r\n?|\n)/g);
|
405
|
+
|
417
406
|
this._input = ch + this._input;
|
407
|
+
this.yytext = this.yytext.substr(0, this.yytext.length-len-1);
|
408
|
+
//this.yyleng -= len;
|
409
|
+
this.offset -= len;
|
410
|
+
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
411
|
+
this.match = this.match.substr(0, this.match.length-1);
|
412
|
+
this.matched = this.matched.substr(0, this.matched.length-1);
|
413
|
+
|
414
|
+
if (lines.length-1) this.yylineno -= lines.length-1;
|
415
|
+
var r = this.yylloc.range;
|
416
|
+
|
417
|
+
this.yylloc = {first_line: this.yylloc.first_line,
|
418
|
+
last_line: this.yylineno+1,
|
419
|
+
first_column: this.yylloc.first_column,
|
420
|
+
last_column: lines ?
|
421
|
+
(lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length:
|
422
|
+
this.yylloc.first_column - len
|
423
|
+
};
|
424
|
+
|
425
|
+
if (this.options.ranges) {
|
426
|
+
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
427
|
+
}
|
418
428
|
return this;
|
419
429
|
},
|
420
430
|
more:function () {
|
421
431
|
this._more = true;
|
422
432
|
return this;
|
423
433
|
},
|
434
|
+
less:function (n) {
|
435
|
+
this.unput(this.match.slice(n));
|
436
|
+
},
|
424
437
|
pastInput:function () {
|
425
438
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
426
439
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
@@ -445,6 +458,8 @@ next:function () {
|
|
445
458
|
|
446
459
|
var token,
|
447
460
|
match,
|
461
|
+
tempMatch,
|
462
|
+
index,
|
448
463
|
col,
|
449
464
|
lines;
|
450
465
|
if (!this._more) {
|
@@ -453,30 +468,39 @@ next:function () {
|
|
453
468
|
}
|
454
469
|
var rules = this._currentRules();
|
455
470
|
for (var i=0;i < rules.length; i++) {
|
456
|
-
|
457
|
-
if (match) {
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
last_line: this.yylineno+1,
|
462
|
-
first_column: this.yylloc.last_column,
|
463
|
-
last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}
|
464
|
-
this.yytext += match[0];
|
465
|
-
this.match += match[0];
|
466
|
-
this.matches = match;
|
467
|
-
this.yyleng = this.yytext.length;
|
468
|
-
this._more = false;
|
469
|
-
this._input = this._input.slice(match[0].length);
|
470
|
-
this.matched += match[0];
|
471
|
-
token = this.performAction.call(this, this.yy, this, rules[i],this.conditionStack[this.conditionStack.length-1]);
|
472
|
-
if (token) return token;
|
473
|
-
else return;
|
471
|
+
tempMatch = this._input.match(this.rules[rules[i]]);
|
472
|
+
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
473
|
+
match = tempMatch;
|
474
|
+
index = i;
|
475
|
+
if (!this.options.flex) break;
|
474
476
|
}
|
475
477
|
}
|
478
|
+
if (match) {
|
479
|
+
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
480
|
+
if (lines) this.yylineno += lines.length;
|
481
|
+
this.yylloc = {first_line: this.yylloc.last_line,
|
482
|
+
last_line: this.yylineno+1,
|
483
|
+
first_column: this.yylloc.last_column,
|
484
|
+
last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length};
|
485
|
+
this.yytext += match[0];
|
486
|
+
this.match += match[0];
|
487
|
+
this.matches = match;
|
488
|
+
this.yyleng = this.yytext.length;
|
489
|
+
if (this.options.ranges) {
|
490
|
+
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
491
|
+
}
|
492
|
+
this._more = false;
|
493
|
+
this._input = this._input.slice(match[0].length);
|
494
|
+
this.matched += match[0];
|
495
|
+
token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);
|
496
|
+
if (this.done && this._input) this.done = false;
|
497
|
+
if (token) return token;
|
498
|
+
else return;
|
499
|
+
}
|
476
500
|
if (this._input === "") {
|
477
501
|
return this.EOF;
|
478
502
|
} else {
|
479
|
-
this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
|
503
|
+
return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
|
480
504
|
{text: "", token: null, line: this.yylineno});
|
481
505
|
}
|
482
506
|
},
|
@@ -503,6 +527,7 @@ topState:function () {
|
|
503
527
|
pushState:function begin(condition) {
|
504
528
|
this.begin(condition);
|
505
529
|
}});
|
530
|
+
lexer.options = {};
|
506
531
|
lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
507
532
|
|
508
533
|
var YYSTATE=YY_START
|
@@ -515,82 +540,81 @@ case 0:
|
|
515
540
|
break;
|
516
541
|
case 1: return 14;
|
517
542
|
break;
|
518
|
-
case 2:
|
543
|
+
case 2:
|
544
|
+
if(yy_.yytext.slice(-1) !== "\\") this.popState();
|
545
|
+
if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1);
|
546
|
+
return 14;
|
547
|
+
|
519
548
|
break;
|
520
|
-
case 3: return
|
549
|
+
case 3: yy_.yytext = yy_.yytext.substr(0, yy_.yyleng-4); this.popState(); return 15;
|
521
550
|
break;
|
522
|
-
case 4: return
|
551
|
+
case 4: this.begin("par"); return 24;
|
523
552
|
break;
|
524
|
-
case 5: return
|
553
|
+
case 5: return 16;
|
525
554
|
break;
|
526
|
-
case 6: return
|
555
|
+
case 6: return 20;
|
527
556
|
break;
|
528
557
|
case 7: return 19;
|
529
558
|
break;
|
530
|
-
case 8: return
|
559
|
+
case 8: return 19;
|
531
560
|
break;
|
532
561
|
case 9: return 23;
|
533
562
|
break;
|
534
|
-
case 10:
|
563
|
+
case 10: return 23;
|
564
|
+
break;
|
565
|
+
case 11: this.popState(); this.begin('com');
|
566
|
+
break;
|
567
|
+
case 12: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15;
|
568
|
+
break;
|
569
|
+
case 13: return 22;
|
535
570
|
break;
|
536
|
-
case
|
571
|
+
case 14: return 36;
|
537
572
|
break;
|
538
|
-
case
|
573
|
+
case 15: return 35;
|
539
574
|
break;
|
540
|
-
case
|
575
|
+
case 16: return 35;
|
541
576
|
break;
|
542
|
-
case
|
577
|
+
case 17: return 39;
|
543
578
|
break;
|
544
|
-
case
|
579
|
+
case 18: /*ignore whitespace*/
|
545
580
|
break;
|
546
|
-
case
|
581
|
+
case 19: this.popState(); return 18;
|
547
582
|
break;
|
548
|
-
case
|
583
|
+
case 20: this.popState(); return 18;
|
549
584
|
break;
|
550
|
-
case
|
585
|
+
case 21: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 30;
|
551
586
|
break;
|
552
|
-
case
|
587
|
+
case 22: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\'/g,"'"); return 30;
|
553
588
|
break;
|
554
|
-
case
|
589
|
+
case 23: yy_.yytext = yy_.yytext.substr(1); return 28;
|
555
590
|
break;
|
556
|
-
case
|
591
|
+
case 24: return 32;
|
557
592
|
break;
|
558
|
-
case
|
593
|
+
case 25: return 32;
|
559
594
|
break;
|
560
|
-
case
|
595
|
+
case 26: return 31;
|
561
596
|
break;
|
562
|
-
case
|
597
|
+
case 27: return 35;
|
563
598
|
break;
|
564
|
-
case
|
599
|
+
case 28: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 35;
|
565
600
|
break;
|
566
|
-
case
|
601
|
+
case 29: return 'INVALID';
|
602
|
+
break;
|
603
|
+
case 30: /*ignore whitespace*/
|
604
|
+
break;
|
605
|
+
case 31: this.popState(); return 37;
|
606
|
+
break;
|
607
|
+
case 32: return 5;
|
567
608
|
break;
|
568
609
|
}
|
569
610
|
};
|
570
|
-
lexer.rules = [/^[^\x00]*?(?=(\{\{))/,/^[^\x00]
|
571
|
-
lexer.conditions = {"mu":{"rules":[
|
611
|
+
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\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:\s+)/,/^(?:[a-zA-Z0-9_$-/]+)/,/^(?:$)/];
|
612
|
+
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,32],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"com":{"rules":[3],"inclusive":false},"par":{"rules":[30,31],"inclusive":false},"INITIAL":{"rules":[0,1,32],"inclusive":true}};
|
613
|
+
return lexer;})()
|
572
614
|
parser.lexer = lexer;
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
exports.parser = handlebars;
|
577
|
-
exports.parse = function () { return handlebars.parse.apply(handlebars, arguments); }
|
578
|
-
exports.main = function commonjsMain(args) {
|
579
|
-
if (!args[1])
|
580
|
-
throw new Error('Usage: '+args[0]+' FILE');
|
581
|
-
if (typeof process !== 'undefined') {
|
582
|
-
var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), "utf8");
|
583
|
-
} else {
|
584
|
-
var cwd = require("file").path(require("file").cwd());
|
585
|
-
var source = cwd.join(args[1]).read({charset: "utf-8"});
|
586
|
-
}
|
587
|
-
return exports.parser.parse(source);
|
588
|
-
}
|
589
|
-
if (typeof module !== 'undefined' && require.main === module) {
|
590
|
-
exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args);
|
591
|
-
}
|
592
|
-
};
|
593
|
-
;
|
615
|
+
function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser;
|
616
|
+
return new Parser;
|
617
|
+
})();;
|
594
618
|
// lib/handlebars/compiler/base.js
|
595
619
|
Handlebars.Parser = handlebars;
|
596
620
|
|
@@ -601,17 +625,7 @@ Handlebars.parse = function(string) {
|
|
601
625
|
|
602
626
|
Handlebars.print = function(ast) {
|
603
627
|
return new Handlebars.PrintVisitor().accept(ast);
|
604
|
-
}
|
605
|
-
|
606
|
-
Handlebars.logger = {
|
607
|
-
DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3,
|
608
|
-
|
609
|
-
// override in the host environment
|
610
|
-
log: function(level, str) {}
|
611
|
-
};
|
612
|
-
|
613
|
-
Handlebars.log = function(level, str) { Handlebars.logger.log(level, str); };
|
614
|
-
;
|
628
|
+
};;
|
615
629
|
// lib/handlebars/compiler/ast.js
|
616
630
|
(function() {
|
617
631
|
|
@@ -645,13 +659,10 @@ Handlebars.log = function(level, str) { Handlebars.logger.log(level, str); };
|
|
645
659
|
// pass or at runtime.
|
646
660
|
};
|
647
661
|
|
648
|
-
Handlebars.AST.PartialNode = function(
|
649
|
-
this.type
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
this.id = id;
|
654
|
-
this.context = context;
|
662
|
+
Handlebars.AST.PartialNode = function(partialName, context) {
|
663
|
+
this.type = "partial";
|
664
|
+
this.partialName = partialName;
|
665
|
+
this.context = context;
|
655
666
|
};
|
656
667
|
|
657
668
|
var verifyMatch = function(open, close) {
|
@@ -703,21 +714,36 @@ Handlebars.log = function(level, str) { Handlebars.logger.log(level, str); };
|
|
703
714
|
// an ID is simple if it only has one part, and that part is not
|
704
715
|
// `..` or `this`.
|
705
716
|
this.isSimple = parts.length === 1 && !this.isScoped && depth === 0;
|
717
|
+
|
718
|
+
this.stringModeValue = this.string;
|
719
|
+
};
|
720
|
+
|
721
|
+
Handlebars.AST.PartialNameNode = function(name) {
|
722
|
+
this.type = "PARTIAL_NAME";
|
723
|
+
this.name = name;
|
724
|
+
};
|
725
|
+
|
726
|
+
Handlebars.AST.DataNode = function(id) {
|
727
|
+
this.type = "DATA";
|
728
|
+
this.id = id;
|
706
729
|
};
|
707
730
|
|
708
731
|
Handlebars.AST.StringNode = function(string) {
|
709
732
|
this.type = "STRING";
|
710
733
|
this.string = string;
|
734
|
+
this.stringModeValue = string;
|
711
735
|
};
|
712
736
|
|
713
737
|
Handlebars.AST.IntegerNode = function(integer) {
|
714
738
|
this.type = "INTEGER";
|
715
739
|
this.integer = integer;
|
740
|
+
this.stringModeValue = Number(integer);
|
716
741
|
};
|
717
742
|
|
718
743
|
Handlebars.AST.BooleanNode = function(bool) {
|
719
744
|
this.type = "BOOLEAN";
|
720
745
|
this.bool = bool;
|
746
|
+
this.stringModeValue = bool === "true";
|
721
747
|
};
|
722
748
|
|
723
749
|
Handlebars.AST.CommentNode = function(comment) {
|
@@ -727,14 +753,16 @@ Handlebars.log = function(level, str) { Handlebars.logger.log(level, str); };
|
|
727
753
|
|
728
754
|
})();;
|
729
755
|
// lib/handlebars/utils.js
|
756
|
+
|
757
|
+
var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
|
758
|
+
|
730
759
|
Handlebars.Exception = function(message) {
|
731
760
|
var tmp = Error.prototype.constructor.apply(this, arguments);
|
732
761
|
|
733
|
-
|
734
|
-
|
762
|
+
// Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
|
763
|
+
for (var idx = 0; idx < errorProps.length; idx++) {
|
764
|
+
this[errorProps[idx]] = tmp[errorProps[idx]];
|
735
765
|
}
|
736
|
-
|
737
|
-
this.message = tmp.message;
|
738
766
|
};
|
739
767
|
Handlebars.Exception.prototype = new Error();
|
740
768
|
|
@@ -748,6 +776,7 @@ Handlebars.SafeString.prototype.toString = function() {
|
|
748
776
|
|
749
777
|
(function() {
|
750
778
|
var escape = {
|
779
|
+
"&": "&",
|
751
780
|
"<": "<",
|
752
781
|
">": ">",
|
753
782
|
'"': """,
|
@@ -755,7 +784,7 @@ Handlebars.SafeString.prototype.toString = function() {
|
|
755
784
|
"`": "`"
|
756
785
|
};
|
757
786
|
|
758
|
-
var badChars =
|
787
|
+
var badChars = /[&<>"'`]/g;
|
759
788
|
var possible = /[&<>"'`]/;
|
760
789
|
|
761
790
|
var escapeChar = function(chr) {
|
@@ -776,11 +805,7 @@ Handlebars.SafeString.prototype.toString = function() {
|
|
776
805
|
},
|
777
806
|
|
778
807
|
isEmpty: function(value) {
|
779
|
-
if (
|
780
|
-
return true;
|
781
|
-
} else if (value === null) {
|
782
|
-
return true;
|
783
|
-
} else if (value === false) {
|
808
|
+
if (!value && value !== 0) {
|
784
809
|
return true;
|
785
810
|
} else if(Object.prototype.toString.call(value) === "[object Array]" && value.length === 0) {
|
786
811
|
return true;
|
@@ -919,7 +944,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
919
944
|
// evaluate it by executing `blockHelperMissing`
|
920
945
|
this.opcode('pushProgram', program);
|
921
946
|
this.opcode('pushProgram', inverse);
|
922
|
-
this.opcode('
|
947
|
+
this.opcode('pushHash');
|
923
948
|
this.opcode('blockValue');
|
924
949
|
} else {
|
925
950
|
this.ambiguousMustache(mustache, program, inverse);
|
@@ -928,7 +953,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
928
953
|
// evaluate it by executing `blockHelperMissing`
|
929
954
|
this.opcode('pushProgram', program);
|
930
955
|
this.opcode('pushProgram', inverse);
|
931
|
-
this.opcode('
|
956
|
+
this.opcode('pushHash');
|
932
957
|
this.opcode('ambiguousBlockValue');
|
933
958
|
}
|
934
959
|
|
@@ -938,19 +963,24 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
938
963
|
hash: function(hash) {
|
939
964
|
var pairs = hash.pairs, pair, val;
|
940
965
|
|
941
|
-
this.opcode('
|
966
|
+
this.opcode('pushHash');
|
942
967
|
|
943
968
|
for(var i=0, l=pairs.length; i<l; i++) {
|
944
969
|
pair = pairs[i];
|
945
970
|
val = pair[1];
|
946
971
|
|
947
|
-
this.
|
972
|
+
if (this.options.stringParams) {
|
973
|
+
this.opcode('pushStringParam', val.stringModeValue, val.type);
|
974
|
+
} else {
|
975
|
+
this.accept(val);
|
976
|
+
}
|
977
|
+
|
948
978
|
this.opcode('assignToHash', pair[0]);
|
949
979
|
}
|
950
980
|
},
|
951
981
|
|
952
982
|
partial: function(partial) {
|
953
|
-
var
|
983
|
+
var partialName = partial.partialName;
|
954
984
|
this.usePartial = true;
|
955
985
|
|
956
986
|
if(partial.context) {
|
@@ -959,7 +989,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
959
989
|
this.opcode('push', 'depth0');
|
960
990
|
}
|
961
991
|
|
962
|
-
this.opcode('invokePartial',
|
992
|
+
this.opcode('invokePartial', partialName.name);
|
963
993
|
this.opcode('append');
|
964
994
|
},
|
965
995
|
|
@@ -1000,17 +1030,17 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1000
1030
|
simpleMustache: function(mustache, program, inverse) {
|
1001
1031
|
var id = mustache.id;
|
1002
1032
|
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1006
|
-
|
1007
|
-
this.opcode('lookupOnContext', id.parts[0]);
|
1008
|
-
for(var i=1, l=id.parts.length; i<l; i++) {
|
1009
|
-
this.opcode('lookup', id.parts[i]);
|
1010
|
-
}
|
1033
|
+
if (id.type === 'DATA') {
|
1034
|
+
this.DATA(id);
|
1035
|
+
} else if (id.parts.length) {
|
1036
|
+
this.ID(id);
|
1011
1037
|
} else {
|
1038
|
+
// Simplified ID for `this`
|
1039
|
+
this.addDepth(id.depth);
|
1040
|
+
this.opcode('getContext', id.depth);
|
1012
1041
|
this.opcode('pushContext');
|
1013
1042
|
}
|
1043
|
+
|
1014
1044
|
this.opcode('resolvePossibleLambda');
|
1015
1045
|
},
|
1016
1046
|
|
@@ -1030,13 +1060,24 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1030
1060
|
ID: function(id) {
|
1031
1061
|
this.addDepth(id.depth);
|
1032
1062
|
this.opcode('getContext', id.depth);
|
1033
|
-
|
1063
|
+
|
1064
|
+
var name = id.parts[0];
|
1065
|
+
if (!name) {
|
1066
|
+
this.opcode('pushContext');
|
1067
|
+
} else {
|
1068
|
+
this.opcode('lookupOnContext', id.parts[0]);
|
1069
|
+
}
|
1034
1070
|
|
1035
1071
|
for(var i=1, l=id.parts.length; i<l; i++) {
|
1036
1072
|
this.opcode('lookup', id.parts[i]);
|
1037
1073
|
}
|
1038
1074
|
},
|
1039
1075
|
|
1076
|
+
DATA: function(data) {
|
1077
|
+
this.options.data = true;
|
1078
|
+
this.opcode('lookupData', data.id);
|
1079
|
+
},
|
1080
|
+
|
1040
1081
|
STRING: function(string) {
|
1041
1082
|
this.opcode('pushString', string.string);
|
1042
1083
|
},
|
@@ -1061,6 +1102,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1061
1102
|
},
|
1062
1103
|
|
1063
1104
|
addDepth: function(depth) {
|
1105
|
+
if(isNaN(depth)) { throw new Error("EWOT"); }
|
1064
1106
|
if(depth === 0) { return; }
|
1065
1107
|
|
1066
1108
|
if(!this.depths[depth]) {
|
@@ -1102,7 +1144,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1102
1144
|
}
|
1103
1145
|
|
1104
1146
|
this.opcode('getContext', param.depth || 0);
|
1105
|
-
this.opcode('pushStringParam', param.
|
1147
|
+
this.opcode('pushStringParam', param.stringModeValue, param.type);
|
1106
1148
|
} else {
|
1107
1149
|
this[param.type](param);
|
1108
1150
|
}
|
@@ -1116,7 +1158,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1116
1158
|
if(mustache.hash) {
|
1117
1159
|
this.hash(mustache.hash);
|
1118
1160
|
} else {
|
1119
|
-
this.opcode('
|
1161
|
+
this.opcode('pushHash');
|
1120
1162
|
}
|
1121
1163
|
|
1122
1164
|
return params;
|
@@ -1133,7 +1175,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1133
1175
|
if(mustache.hash) {
|
1134
1176
|
this.hash(mustache.hash);
|
1135
1177
|
} else {
|
1136
|
-
this.opcode('
|
1178
|
+
this.opcode('pushHash');
|
1137
1179
|
}
|
1138
1180
|
|
1139
1181
|
return params;
|
@@ -1227,7 +1269,8 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1227
1269
|
if (!this.isChild) {
|
1228
1270
|
var namespace = this.namespace;
|
1229
1271
|
var copies = "helpers = helpers || " + namespace + ".helpers;";
|
1230
|
-
if(this.environment.usePartial) { copies = copies + " partials = partials || " + namespace + ".partials;"; }
|
1272
|
+
if (this.environment.usePartial) { copies = copies + " partials = partials || " + namespace + ".partials;"; }
|
1273
|
+
if (this.options.data) { copies = copies + " data = data || {};"; }
|
1231
1274
|
out.push(copies);
|
1232
1275
|
} else {
|
1233
1276
|
out.push('');
|
@@ -1307,7 +1350,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1307
1350
|
|
1308
1351
|
this.replaceStack(function(current) {
|
1309
1352
|
params.splice(1, 0, current);
|
1310
|
-
return
|
1353
|
+
return "blockHelperMissing.call(" + params.join(", ") + ")";
|
1311
1354
|
});
|
1312
1355
|
},
|
1313
1356
|
|
@@ -1419,7 +1462,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1419
1462
|
this.context.aliases.functionType = '"function"';
|
1420
1463
|
|
1421
1464
|
this.replaceStack(function(current) {
|
1422
|
-
return "typeof " + current + " === functionType ? " + current + "() : " + current;
|
1465
|
+
return "typeof " + current + " === functionType ? " + current + ".apply(depth0) : " + current;
|
1423
1466
|
});
|
1424
1467
|
},
|
1425
1468
|
|
@@ -1436,6 +1479,16 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1436
1479
|
});
|
1437
1480
|
},
|
1438
1481
|
|
1482
|
+
// [lookupData]
|
1483
|
+
//
|
1484
|
+
// On stack, before: ...
|
1485
|
+
// On stack, after: data[id], ...
|
1486
|
+
//
|
1487
|
+
// Push the result of looking up `id` on the current data
|
1488
|
+
lookupData: function(id) {
|
1489
|
+
this.pushStack(this.nameLookup('data', id, 'data'));
|
1490
|
+
},
|
1491
|
+
|
1439
1492
|
// [pushStringParam]
|
1440
1493
|
//
|
1441
1494
|
// On stack, before: ...
|
@@ -1444,9 +1497,24 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1444
1497
|
// This opcode is designed for use in string mode, which
|
1445
1498
|
// provides the string value of a parameter along with its
|
1446
1499
|
// depth rather than resolving it immediately.
|
1447
|
-
pushStringParam: function(string) {
|
1500
|
+
pushStringParam: function(string, type) {
|
1448
1501
|
this.pushStackLiteral('depth' + this.lastContext);
|
1449
|
-
|
1502
|
+
|
1503
|
+
this.pushString(type);
|
1504
|
+
|
1505
|
+
if (typeof string === 'string') {
|
1506
|
+
this.pushString(string);
|
1507
|
+
} else {
|
1508
|
+
this.pushStackLiteral(string);
|
1509
|
+
}
|
1510
|
+
},
|
1511
|
+
|
1512
|
+
pushHash: function() {
|
1513
|
+
this.push('{}');
|
1514
|
+
|
1515
|
+
if (this.options.stringParams) {
|
1516
|
+
this.register('hashTypes', '{}');
|
1517
|
+
}
|
1450
1518
|
},
|
1451
1519
|
|
1452
1520
|
// [pushString]
|
@@ -1554,7 +1622,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1554
1622
|
var nextStack = this.nextStack();
|
1555
1623
|
|
1556
1624
|
this.source.push('if (foundHelper) { ' + nextStack + ' = foundHelper.call(' + helper.callParams + '); }');
|
1557
|
-
this.source.push('else { ' + nextStack + ' = ' + nonHelper + '; ' + nextStack + ' = typeof ' + nextStack + ' === functionType ? ' + nextStack + '() : ' + nextStack + '; }');
|
1625
|
+
this.source.push('else { ' + nextStack + ' = ' + nonHelper + '; ' + nextStack + ' = typeof ' + nextStack + ' === functionType ? ' + nextStack + '.apply(depth0) : ' + nextStack + '; }');
|
1558
1626
|
},
|
1559
1627
|
|
1560
1628
|
// [invokePartial]
|
@@ -1572,7 +1640,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1572
1640
|
}
|
1573
1641
|
|
1574
1642
|
this.context.aliases.self = "this";
|
1575
|
-
this.pushStack("self.invokePartial(" + params.join(", ") + ")
|
1643
|
+
this.pushStack("self.invokePartial(" + params.join(", ") + ")");
|
1576
1644
|
},
|
1577
1645
|
|
1578
1646
|
// [assignToHash]
|
@@ -1584,6 +1652,13 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1584
1652
|
// and pushes the hash back onto the stack.
|
1585
1653
|
assignToHash: function(key) {
|
1586
1654
|
var value = this.popStack();
|
1655
|
+
|
1656
|
+
if (this.options.stringParams) {
|
1657
|
+
var type = this.popStack();
|
1658
|
+
this.popStack();
|
1659
|
+
this.source.push("hashTypes['" + key + "'] = " + type + ";");
|
1660
|
+
}
|
1661
|
+
|
1587
1662
|
var hash = this.topStack();
|
1588
1663
|
|
1589
1664
|
this.source.push(hash + "['" + key + "'] = " + value + ";");
|
@@ -1653,21 +1728,28 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1653
1728
|
},
|
1654
1729
|
|
1655
1730
|
pushStack: function(item) {
|
1656
|
-
this.
|
1657
|
-
this.
|
1658
|
-
|
1731
|
+
var stack = this.incrStack();
|
1732
|
+
this.source.push(stack + " = " + item + ";");
|
1733
|
+
this.compileStack.push(stack);
|
1734
|
+
return stack;
|
1659
1735
|
},
|
1660
1736
|
|
1661
1737
|
replaceStack: function(callback) {
|
1662
|
-
var
|
1738
|
+
var stack = this.topStack(),
|
1739
|
+
item = callback.call(this, stack);
|
1663
1740
|
|
1664
|
-
|
1665
|
-
|
1741
|
+
// Prevent modification of the context depth variable. Through replaceStack
|
1742
|
+
if (/^depth/.test(stack)) {
|
1743
|
+
stack = this.nextStack();
|
1744
|
+
}
|
1745
|
+
|
1746
|
+
this.source.push(stack + " = " + item + ";");
|
1747
|
+
return stack;
|
1666
1748
|
},
|
1667
1749
|
|
1668
1750
|
nextStack: function(skipCompileStack) {
|
1669
1751
|
var name = this.incrStack();
|
1670
|
-
this.compileStack.push(
|
1752
|
+
this.compileStack.push(name);
|
1671
1753
|
return name;
|
1672
1754
|
},
|
1673
1755
|
|
@@ -1722,7 +1804,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1722
1804
|
// the params and contexts arguments are passed in arrays
|
1723
1805
|
// to fill in
|
1724
1806
|
setupParams: function(paramSize, params) {
|
1725
|
-
var options = [], contexts = [], param, inverse, program;
|
1807
|
+
var options = [], contexts = [], types = [], param, inverse, program;
|
1726
1808
|
|
1727
1809
|
options.push("hash:" + this.popStack());
|
1728
1810
|
|
@@ -1751,12 +1833,15 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1751
1833
|
params.push(param);
|
1752
1834
|
|
1753
1835
|
if(this.options.stringParams) {
|
1836
|
+
types.push(this.popStack());
|
1754
1837
|
contexts.push(this.popStack());
|
1755
1838
|
}
|
1756
1839
|
}
|
1757
1840
|
|
1758
1841
|
if (this.options.stringParams) {
|
1759
1842
|
options.push("contexts:[" + contexts.join(",") + "]");
|
1843
|
+
options.push("types:[" + types.join(",") + "]");
|
1844
|
+
options.push("hashTypes:hashTypes");
|
1760
1845
|
}
|
1761
1846
|
|
1762
1847
|
if(this.options.data) {
|
@@ -1802,16 +1887,28 @@ Handlebars.JavaScriptCompiler = function() {};
|
|
1802
1887
|
})(Handlebars.Compiler, Handlebars.JavaScriptCompiler);
|
1803
1888
|
|
1804
1889
|
Handlebars.precompile = function(string, options) {
|
1805
|
-
|
1890
|
+
if (typeof string !== 'string') {
|
1891
|
+
throw new Handlebars.Exception("You must pass a string to Handlebars.compile. You passed " + string);
|
1892
|
+
}
|
1806
1893
|
|
1894
|
+
options = options || {};
|
1895
|
+
if (!('data' in options)) {
|
1896
|
+
options.data = true;
|
1897
|
+
}
|
1807
1898
|
var ast = Handlebars.parse(string);
|
1808
1899
|
var environment = new Handlebars.Compiler().compile(ast, options);
|
1809
1900
|
return new Handlebars.JavaScriptCompiler().compile(environment, options);
|
1810
1901
|
};
|
1811
1902
|
|
1812
1903
|
Handlebars.compile = function(string, options) {
|
1813
|
-
|
1904
|
+
if (typeof string !== 'string') {
|
1905
|
+
throw new Handlebars.Exception("You must pass a string to Handlebars.compile. You passed " + string);
|
1906
|
+
}
|
1814
1907
|
|
1908
|
+
options = options || {};
|
1909
|
+
if (!('data' in options)) {
|
1910
|
+
options.data = true;
|
1911
|
+
}
|
1815
1912
|
var compiled;
|
1816
1913
|
function compile() {
|
1817
1914
|
var ast = Handlebars.parse(string);
|
@@ -1885,7 +1982,7 @@ Handlebars.VM = {
|
|
1885
1982
|
} else if (!Handlebars.compile) {
|
1886
1983
|
throw new Handlebars.Exception("The partial " + name + " could not be compiled when running in runtime-only mode");
|
1887
1984
|
} else {
|
1888
|
-
partials[name] = Handlebars.compile(partial);
|
1985
|
+
partials[name] = Handlebars.compile(partial, {data: data !== undefined});
|
1889
1986
|
return partials[name](context, options);
|
1890
1987
|
}
|
1891
1988
|
}
|