serenade 0.3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +6 -0
- data/README.md +99 -0
- data/Rakefile +29 -0
- data/lib/assets/javascripts/serenade.js +2351 -0
- data/lib/serenade.rb +6 -0
- data/lib/serenade/rails.rb +11 -0
- data/lib/serenade/renderer.rb +43 -0
- data/lib/serenade/sprockets.rb +4 -0
- data/lib/serenade/template.rb +26 -0
- data/lib/serenade/version.rb +4 -0
- data/serenade.gemspec +30 -0
- data/spec/serenade_spec.rb +16 -0
- data/spec/sprockets_spec.rb +14 -0
- metadata +152 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
# Serenade.js for Ruby
|
2
|
+
|
3
|
+
[Serenade.js] is a JavaScript client side MVC framework. This gem makes Serenade.js
|
4
|
+
available for usage with [Sprockets], or the asset pipeline in Ruby on Rails version
|
5
|
+
3.1 or later.
|
6
|
+
|
7
|
+
[serenade.js]: https://github.com/elabs/serenade.js
|
8
|
+
[sprockets]: http://rubygems.org/gems/sprockets
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
To use Serenade with Rails, add Serenade to the assets group in your Gemfile:
|
13
|
+
|
14
|
+
``` ruby
|
15
|
+
group :assets do
|
16
|
+
gem "serenade", :require => "serenade/rails"
|
17
|
+
end
|
18
|
+
```
|
19
|
+
|
20
|
+
You can now require Serenade in your `app/assets/javascripts/application.js` file:
|
21
|
+
|
22
|
+
``` javascript
|
23
|
+
//= require serenade
|
24
|
+
```
|
25
|
+
|
26
|
+
Serenade should now be loaded and ready. See the [Serenade README] for examples.
|
27
|
+
|
28
|
+
[Serenade README]: https://github.com/elabs/serenade.js/blob/master/README.md
|
29
|
+
|
30
|
+
### Using Serenade with Sprockets
|
31
|
+
|
32
|
+
If you are not using Rails, you can still use Serenade with just Sprockets:
|
33
|
+
|
34
|
+
``` ruby
|
35
|
+
gem "serenade", :require => "serenade/sprockets"
|
36
|
+
```
|
37
|
+
|
38
|
+
You’ll also need to register the Serenade asset path with your Sprockets environment.
|
39
|
+
|
40
|
+
``` ruby
|
41
|
+
sprockets.append_path Serenade::ASSET_PATH
|
42
|
+
```
|
43
|
+
|
44
|
+
## Serenade.js views and the asset pipeline
|
45
|
+
|
46
|
+
Serenade.js allows Sprockets or the Rails asset pipeline to compile your Serenade
|
47
|
+
views for you, just use the extension `.serenade` on any asset file. Your views
|
48
|
+
will be precompiled server-side before being served to the client.
|
49
|
+
|
50
|
+
For example, if you create the following view in `app/assets/javascripts/test.serenade`:
|
51
|
+
|
52
|
+
``` serenade
|
53
|
+
h1 "Hello " @name
|
54
|
+
```
|
55
|
+
|
56
|
+
Now you can render this view:
|
57
|
+
|
58
|
+
``` javascript
|
59
|
+
var model = new Serenade.Model({ name: "Vega" })
|
60
|
+
document.body.appendChild(Serenade.render('test', model));
|
61
|
+
```
|
62
|
+
|
63
|
+
And, like in all Serenade.js views, you can change your model and see the DOM
|
64
|
+
update itself accordingly:
|
65
|
+
|
66
|
+
``` javascript
|
67
|
+
model.name = "Mercedes" // HTML now says <h1>Hello Mercedes</h1>
|
68
|
+
```
|
69
|
+
|
70
|
+
### A note about the view path
|
71
|
+
|
72
|
+
If the path to your view starts with `views`, that initial part is stripped off,
|
73
|
+
so you could have placed the above view in `app/assets/javascripts/views/test.serenade`
|
74
|
+
without changing the code.
|
75
|
+
|
76
|
+
## License
|
77
|
+
|
78
|
+
(The MIT License)
|
79
|
+
|
80
|
+
Copyright (c) 2012 Jonas Nicklas, Kim Burgestrand
|
81
|
+
|
82
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
83
|
+
a copy of this software and associated documentation files (the
|
84
|
+
'Software'), to deal in the Software without restriction, including
|
85
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
86
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
87
|
+
permit persons to whom the Software is furnished to do so, subject to
|
88
|
+
the following conditions:
|
89
|
+
|
90
|
+
The above copyright notice and this permission notice shall be
|
91
|
+
included in all copies or substantial portions of the Software.
|
92
|
+
|
93
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
94
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
95
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
96
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
97
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
98
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
99
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
begin
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
rescue LoadError
|
4
|
+
# Only gem pushers need bundler tasks.
|
5
|
+
end
|
6
|
+
|
7
|
+
begin
|
8
|
+
require "yard"
|
9
|
+
YARD::Rake::YardocTask.new("yard:doc") do |task|
|
10
|
+
task.options = ["--no-stats"]
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "List YARD stats, as well as undocumented methods"
|
14
|
+
task "yard:stats" do
|
15
|
+
YARD::CLI::Stats.run("--list-undoc")
|
16
|
+
end
|
17
|
+
|
18
|
+
task "Generate documentation and show stats"
|
19
|
+
task :yard => ["yard:doc", "yard:stats"]
|
20
|
+
rescue LoadError
|
21
|
+
puts "WARN: YARD not available. You may install documentation dependencies via bundler."
|
22
|
+
end
|
23
|
+
|
24
|
+
require "rspec/core/rake_task"
|
25
|
+
RSpec::Core::RakeTask.new("spec") do |task|
|
26
|
+
task.ruby_opts = "-W2"
|
27
|
+
end
|
28
|
+
|
29
|
+
task :default => :spec
|
@@ -0,0 +1,2351 @@
|
|
1
|
+
/**
|
2
|
+
* Serenade.js JavaScript Framework v0.3.0
|
3
|
+
* Revision: 7e7103d7f5
|
4
|
+
* http://github.com/elabs/serenade.js
|
5
|
+
*
|
6
|
+
* Copyright 2011, Jonas Nicklas, Elabs AB
|
7
|
+
* Released under the MIT License
|
8
|
+
*/
|
9
|
+
(function(root) {
|
10
|
+
var Serenade = function() {
|
11
|
+
function require(path){ return require[path]; }
|
12
|
+
require['./events'] = new function() {
|
13
|
+
var exports = this;
|
14
|
+
(function() {
|
15
|
+
var __slice = [].slice;
|
16
|
+
|
17
|
+
exports.Events = {
|
18
|
+
bind: function(ev, callback) {
|
19
|
+
var calls, evs, name, _i, _len;
|
20
|
+
evs = ev.split(' ');
|
21
|
+
calls = this.hasOwnProperty('_callbacks') && this._callbacks || (this._callbacks = {});
|
22
|
+
for (_i = 0, _len = evs.length; _i < _len; _i++) {
|
23
|
+
name = evs[_i];
|
24
|
+
calls[name] || (calls[name] = []);
|
25
|
+
calls[name].push(callback);
|
26
|
+
}
|
27
|
+
return this;
|
28
|
+
},
|
29
|
+
one: function(ev, callback) {
|
30
|
+
return this.bind(ev, function() {
|
31
|
+
this.unbind(ev, arguments.callee);
|
32
|
+
return callback.apply(this, arguments);
|
33
|
+
});
|
34
|
+
},
|
35
|
+
trigger: function() {
|
36
|
+
var args, callback, ev, list, _i, _len, _ref;
|
37
|
+
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
38
|
+
ev = args.shift();
|
39
|
+
list = this.hasOwnProperty('_callbacks') && ((_ref = this._callbacks) != null ? _ref[ev] : void 0);
|
40
|
+
if (!list) {
|
41
|
+
return false;
|
42
|
+
}
|
43
|
+
for (_i = 0, _len = list.length; _i < _len; _i++) {
|
44
|
+
callback = list[_i];
|
45
|
+
callback.apply(this, args);
|
46
|
+
}
|
47
|
+
return true;
|
48
|
+
},
|
49
|
+
unbind: function(ev, callback) {
|
50
|
+
var cb, i, list, _i, _len, _ref;
|
51
|
+
if (!ev) {
|
52
|
+
this._callbacks = {};
|
53
|
+
return this;
|
54
|
+
}
|
55
|
+
list = (_ref = this._callbacks) != null ? _ref[ev] : void 0;
|
56
|
+
if (!list) {
|
57
|
+
return this;
|
58
|
+
}
|
59
|
+
if (!callback) {
|
60
|
+
delete this._callbacks[ev];
|
61
|
+
return this;
|
62
|
+
}
|
63
|
+
for (i = _i = 0, _len = list.length; _i < _len; i = ++_i) {
|
64
|
+
cb = list[i];
|
65
|
+
if (!(cb === callback)) {
|
66
|
+
continue;
|
67
|
+
}
|
68
|
+
list = list.slice();
|
69
|
+
list.splice(i, 1);
|
70
|
+
this._callbacks[ev] = list;
|
71
|
+
break;
|
72
|
+
}
|
73
|
+
return this;
|
74
|
+
}
|
75
|
+
};
|
76
|
+
|
77
|
+
exports.NodeEvents = {
|
78
|
+
bindEvent: function(to, name, fun) {
|
79
|
+
if (to != null ? to.bind : void 0) {
|
80
|
+
this.boundEvents || (this.boundEvents = []);
|
81
|
+
this.boundEvents.push({
|
82
|
+
to: to,
|
83
|
+
name: name,
|
84
|
+
fun: fun
|
85
|
+
});
|
86
|
+
return to.bind(name, fun);
|
87
|
+
}
|
88
|
+
},
|
89
|
+
unbindEvents: function() {
|
90
|
+
var fun, name, node, to, _i, _j, _len, _len1, _ref, _ref1, _ref2, _results;
|
91
|
+
if (typeof this.trigger === "function") {
|
92
|
+
this.trigger("unload");
|
93
|
+
}
|
94
|
+
_ref = this.nodes();
|
95
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
96
|
+
node = _ref[_i];
|
97
|
+
node.unbindEvents();
|
98
|
+
}
|
99
|
+
if (this.boundEvents) {
|
100
|
+
_ref1 = this.boundEvents;
|
101
|
+
_results = [];
|
102
|
+
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
103
|
+
_ref2 = _ref1[_j], to = _ref2.to, name = _ref2.name, fun = _ref2.fun;
|
104
|
+
_results.push(to.unbind(name, fun));
|
105
|
+
}
|
106
|
+
return _results;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
};
|
110
|
+
|
111
|
+
}).call(this);
|
112
|
+
|
113
|
+
};require['./helpers'] = new function() {
|
114
|
+
var exports = this;
|
115
|
+
(function() {
|
116
|
+
var Helpers,
|
117
|
+
__hasProp = {}.hasOwnProperty;
|
118
|
+
|
119
|
+
Helpers = {
|
120
|
+
prefix: "_prop_",
|
121
|
+
extend: function(target, source) {
|
122
|
+
var key, value, _results;
|
123
|
+
_results = [];
|
124
|
+
for (key in source) {
|
125
|
+
if (!__hasProp.call(source, key)) continue;
|
126
|
+
value = source[key];
|
127
|
+
_results.push(target[key] = value);
|
128
|
+
}
|
129
|
+
return _results;
|
130
|
+
},
|
131
|
+
format: function(model, key) {
|
132
|
+
var formatter, value, _ref;
|
133
|
+
value = model[key];
|
134
|
+
formatter = (_ref = model[Helpers.prefix + key]) != null ? _ref.format : void 0;
|
135
|
+
if (typeof formatter === 'function') {
|
136
|
+
return formatter.call(this, value);
|
137
|
+
} else {
|
138
|
+
return value;
|
139
|
+
}
|
140
|
+
},
|
141
|
+
isArray: function(object) {
|
142
|
+
return Object.prototype.toString.call(object) === "[object Array]";
|
143
|
+
},
|
144
|
+
pairToObject: function(one, two) {
|
145
|
+
var temp;
|
146
|
+
temp = {};
|
147
|
+
temp[one] = two;
|
148
|
+
return temp;
|
149
|
+
},
|
150
|
+
serializeObject: function(object) {
|
151
|
+
var item, _i, _len, _results;
|
152
|
+
if (object && typeof object.toJSON === 'function') {
|
153
|
+
return object.toJSON();
|
154
|
+
} else if (Helpers.isArray(object)) {
|
155
|
+
_results = [];
|
156
|
+
for (_i = 0, _len = object.length; _i < _len; _i++) {
|
157
|
+
item = object[_i];
|
158
|
+
_results.push(Helpers.serializeObject(item));
|
159
|
+
}
|
160
|
+
return _results;
|
161
|
+
} else {
|
162
|
+
return object;
|
163
|
+
}
|
164
|
+
},
|
165
|
+
capitalize: function(word) {
|
166
|
+
return word.slice(0, 1).toUpperCase() + word.slice(1);
|
167
|
+
}
|
168
|
+
};
|
169
|
+
|
170
|
+
Helpers.extend(exports, Helpers);
|
171
|
+
|
172
|
+
}).call(this);
|
173
|
+
|
174
|
+
};require['./cache'] = new function() {
|
175
|
+
var exports = this;
|
176
|
+
(function() {
|
177
|
+
var Cache, serializeObject;
|
178
|
+
|
179
|
+
serializeObject = require('./helpers').serializeObject;
|
180
|
+
|
181
|
+
Cache = {
|
182
|
+
_storage: typeof window !== "undefined" && window !== null ? window.localStorage : void 0,
|
183
|
+
_identityMap: {},
|
184
|
+
get: function(ctor, id) {
|
185
|
+
var name, _ref;
|
186
|
+
name = ctor.uniqueId();
|
187
|
+
if (name && id) {
|
188
|
+
return ((_ref = this._identityMap[name]) != null ? _ref[id] : void 0) || this.retrieve(ctor, id);
|
189
|
+
}
|
190
|
+
},
|
191
|
+
set: function(ctor, id, obj) {
|
192
|
+
var name, _base;
|
193
|
+
name = ctor.uniqueId();
|
194
|
+
if (name && id) {
|
195
|
+
(_base = this._identityMap)[name] || (_base[name] = {});
|
196
|
+
return this._identityMap[name][id] = obj;
|
197
|
+
}
|
198
|
+
},
|
199
|
+
unset: function(ctor, id) {
|
200
|
+
var name, _base;
|
201
|
+
name = ctor.uniqueId();
|
202
|
+
if (name && id) {
|
203
|
+
(_base = this._identityMap)[name] || (_base[name] = {});
|
204
|
+
return delete this._identityMap[name][id];
|
205
|
+
}
|
206
|
+
},
|
207
|
+
store: function(ctor, id, obj) {
|
208
|
+
var name;
|
209
|
+
name = ctor.uniqueId();
|
210
|
+
if (name && id && (typeof JSON !== "undefined" && JSON !== null)) {
|
211
|
+
return this._storage.setItem("" + name + "_" + id, JSON.stringify(serializeObject(obj)));
|
212
|
+
}
|
213
|
+
},
|
214
|
+
retrieve: function(ctor, id) {
|
215
|
+
var data, name;
|
216
|
+
name = ctor.uniqueId();
|
217
|
+
if (name && id && ctor.localStorage && (typeof JSON !== "undefined" && JSON !== null)) {
|
218
|
+
data = this._storage.getItem("" + name + "_" + id);
|
219
|
+
if (data) {
|
220
|
+
return new ctor(JSON.parse(data), true);
|
221
|
+
}
|
222
|
+
}
|
223
|
+
}
|
224
|
+
};
|
225
|
+
|
226
|
+
exports.Cache = Cache;
|
227
|
+
|
228
|
+
}).call(this);
|
229
|
+
|
230
|
+
};require['./collection'] = new function() {
|
231
|
+
var exports = this;
|
232
|
+
(function() {
|
233
|
+
var Events, extend, isArrayIndex, serializeObject, _ref,
|
234
|
+
__slice = [].slice;
|
235
|
+
|
236
|
+
Events = require('./events').Events;
|
237
|
+
|
238
|
+
_ref = require('./helpers'), extend = _ref.extend, serializeObject = _ref.serializeObject;
|
239
|
+
|
240
|
+
isArrayIndex = function(index) {
|
241
|
+
return ("" + index).match(/^\d+$/);
|
242
|
+
};
|
243
|
+
|
244
|
+
exports.Collection = (function() {
|
245
|
+
var fun, _i, _len, _ref1;
|
246
|
+
|
247
|
+
Collection.name = 'Collection';
|
248
|
+
|
249
|
+
extend(Collection.prototype, Events);
|
250
|
+
|
251
|
+
function Collection(list) {
|
252
|
+
var index, val, _i, _len;
|
253
|
+
for (index = _i = 0, _len = list.length; _i < _len; index = ++_i) {
|
254
|
+
val = list[index];
|
255
|
+
this[index] = val;
|
256
|
+
}
|
257
|
+
this.length = (list != null ? list.length : void 0) || 0;
|
258
|
+
}
|
259
|
+
|
260
|
+
Collection.prototype.get = function(index) {
|
261
|
+
return this[index];
|
262
|
+
};
|
263
|
+
|
264
|
+
Collection.prototype.set = function(index, value) {
|
265
|
+
this[index] = value;
|
266
|
+
if (isArrayIndex(index)) {
|
267
|
+
this.length = Math.max(this.length, index + 1);
|
268
|
+
}
|
269
|
+
this.trigger("change:" + index, value);
|
270
|
+
this.trigger("set", index, value);
|
271
|
+
this.trigger("change", this);
|
272
|
+
return value;
|
273
|
+
};
|
274
|
+
|
275
|
+
Collection.prototype.update = function(list) {
|
276
|
+
var index, old, val, _, _i, _len;
|
277
|
+
old = this.clone();
|
278
|
+
for (index in this) {
|
279
|
+
_ = this[index];
|
280
|
+
if (isArrayIndex(index)) {
|
281
|
+
delete this[index];
|
282
|
+
}
|
283
|
+
}
|
284
|
+
for (index = _i = 0, _len = list.length; _i < _len; index = ++_i) {
|
285
|
+
val = list[index];
|
286
|
+
this[index] = val;
|
287
|
+
}
|
288
|
+
this.length = (list != null ? list.length : void 0) || 0;
|
289
|
+
this.trigger("update", old, this);
|
290
|
+
this.trigger("change", this);
|
291
|
+
return list;
|
292
|
+
};
|
293
|
+
|
294
|
+
Collection.prototype.sortBy = function(attribute) {
|
295
|
+
return this.sort(function(a, b) {
|
296
|
+
if (a[attribute] < b[attribute]) {
|
297
|
+
return -1;
|
298
|
+
} else {
|
299
|
+
return 1;
|
300
|
+
}
|
301
|
+
});
|
302
|
+
};
|
303
|
+
|
304
|
+
Collection.prototype.includes = function(item) {
|
305
|
+
return this.indexOf(item) >= 0;
|
306
|
+
};
|
307
|
+
|
308
|
+
Collection.prototype.find = function(fun) {
|
309
|
+
var item, _i, _len;
|
310
|
+
for (_i = 0, _len = this.length; _i < _len; _i++) {
|
311
|
+
item = this[_i];
|
312
|
+
if (fun(item)) {
|
313
|
+
return item;
|
314
|
+
}
|
315
|
+
}
|
316
|
+
};
|
317
|
+
|
318
|
+
Collection.prototype.insertAt = function(index, value) {
|
319
|
+
Array.prototype.splice.call(this, index, 0, value);
|
320
|
+
this.trigger("insert", index, value);
|
321
|
+
this.trigger("change", this);
|
322
|
+
return value;
|
323
|
+
};
|
324
|
+
|
325
|
+
Collection.prototype.deleteAt = function(index) {
|
326
|
+
var value;
|
327
|
+
value = this[index];
|
328
|
+
Array.prototype.splice.call(this, index, 1);
|
329
|
+
this.trigger("delete", index, value);
|
330
|
+
this.trigger("change", this);
|
331
|
+
return value;
|
332
|
+
};
|
333
|
+
|
334
|
+
Collection.prototype["delete"] = function(item) {
|
335
|
+
var index;
|
336
|
+
index = this.indexOf(item);
|
337
|
+
if (index !== -1) {
|
338
|
+
return this.deleteAt(index);
|
339
|
+
}
|
340
|
+
};
|
341
|
+
|
342
|
+
Collection.prototype.first = function() {
|
343
|
+
return this[0];
|
344
|
+
};
|
345
|
+
|
346
|
+
Collection.prototype.last = function() {
|
347
|
+
return this[this.length - 1];
|
348
|
+
};
|
349
|
+
|
350
|
+
Collection.prototype.toArray = function() {
|
351
|
+
var array, index, val;
|
352
|
+
array = [];
|
353
|
+
for (index in this) {
|
354
|
+
val = this[index];
|
355
|
+
if (isArrayIndex(index)) {
|
356
|
+
array[index] = val;
|
357
|
+
}
|
358
|
+
}
|
359
|
+
return array;
|
360
|
+
};
|
361
|
+
|
362
|
+
Collection.prototype.clone = function() {
|
363
|
+
return new Collection(this.toArray());
|
364
|
+
};
|
365
|
+
|
366
|
+
Collection.prototype.push = function(element) {
|
367
|
+
this[this.length++] = element;
|
368
|
+
this.trigger("add", element);
|
369
|
+
this.trigger("change", this);
|
370
|
+
return element;
|
371
|
+
};
|
372
|
+
|
373
|
+
Collection.prototype.pop = function() {
|
374
|
+
return this.deleteAt(this.length - 1);
|
375
|
+
};
|
376
|
+
|
377
|
+
Collection.prototype.unshift = function(item) {
|
378
|
+
return this.insertAt(0, item);
|
379
|
+
};
|
380
|
+
|
381
|
+
Collection.prototype.shift = function() {
|
382
|
+
return this.deleteAt(0);
|
383
|
+
};
|
384
|
+
|
385
|
+
Collection.prototype.splice = function() {
|
386
|
+
var deleteCount, deleted, list, old, start;
|
387
|
+
start = arguments[0], deleteCount = arguments[1], list = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
|
388
|
+
old = this.clone();
|
389
|
+
deleted = Array.prototype.splice.apply(this, [start, deleteCount].concat(__slice.call(list)));
|
390
|
+
this.trigger("update", old, this);
|
391
|
+
this.trigger("change", this);
|
392
|
+
return new Collection(deleted);
|
393
|
+
};
|
394
|
+
|
395
|
+
Collection.prototype.sort = function(fun) {
|
396
|
+
var old;
|
397
|
+
old = this.clone();
|
398
|
+
Array.prototype.sort.call(this, fun);
|
399
|
+
this.trigger("update", old, this);
|
400
|
+
this.trigger("change", this);
|
401
|
+
return this;
|
402
|
+
};
|
403
|
+
|
404
|
+
Collection.prototype.reverse = function() {
|
405
|
+
var old;
|
406
|
+
old = this.clone();
|
407
|
+
Array.prototype.reverse.call(this);
|
408
|
+
this.trigger("update", old, this);
|
409
|
+
this.trigger("change", this);
|
410
|
+
return this;
|
411
|
+
};
|
412
|
+
|
413
|
+
_ref1 = ["forEach", "indexOf", "lastIndexOf", "join", "every", "some", "reduce", "reduceRight"];
|
414
|
+
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
415
|
+
fun = _ref1[_i];
|
416
|
+
Collection.prototype[fun] = Array.prototype[fun];
|
417
|
+
}
|
418
|
+
|
419
|
+
Collection.prototype.map = function() {
|
420
|
+
var args;
|
421
|
+
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
422
|
+
return new Collection(Array.prototype.map.apply(this, args));
|
423
|
+
};
|
424
|
+
|
425
|
+
Collection.prototype.filter = function() {
|
426
|
+
var args;
|
427
|
+
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
428
|
+
return new Collection(Array.prototype.filter.apply(this, args));
|
429
|
+
};
|
430
|
+
|
431
|
+
Collection.prototype.slice = function() {
|
432
|
+
var args, _ref2;
|
433
|
+
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
434
|
+
return new Collection((_ref2 = this.toArray()).slice.apply(_ref2, args));
|
435
|
+
};
|
436
|
+
|
437
|
+
Collection.prototype.concat = function() {
|
438
|
+
var arg, args, _ref2;
|
439
|
+
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
440
|
+
args = (function() {
|
441
|
+
var _j, _len1, _results;
|
442
|
+
_results = [];
|
443
|
+
for (_j = 0, _len1 = args.length; _j < _len1; _j++) {
|
444
|
+
arg = args[_j];
|
445
|
+
if (arg instanceof Collection) {
|
446
|
+
_results.push(arg.toArray());
|
447
|
+
} else {
|
448
|
+
_results.push(arg);
|
449
|
+
}
|
450
|
+
}
|
451
|
+
return _results;
|
452
|
+
})();
|
453
|
+
return new Collection((_ref2 = this.toArray()).concat.apply(_ref2, args));
|
454
|
+
};
|
455
|
+
|
456
|
+
Collection.prototype.toString = function() {
|
457
|
+
return this.toArray().toString();
|
458
|
+
};
|
459
|
+
|
460
|
+
Collection.prototype.toLocaleString = function() {
|
461
|
+
return this.toArray().toLocaleString();
|
462
|
+
};
|
463
|
+
|
464
|
+
Collection.prototype.toJSON = function() {
|
465
|
+
return serializeObject(this.toArray());
|
466
|
+
};
|
467
|
+
|
468
|
+
return Collection;
|
469
|
+
|
470
|
+
})();
|
471
|
+
|
472
|
+
}).call(this);
|
473
|
+
|
474
|
+
};require['./association_collection'] = new function() {
|
475
|
+
var exports = this;
|
476
|
+
(function() {
|
477
|
+
var AssociationCollection, Collection,
|
478
|
+
__hasProp = {}.hasOwnProperty,
|
479
|
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; },
|
480
|
+
__slice = [].slice;
|
481
|
+
|
482
|
+
Collection = require('./collection').Collection;
|
483
|
+
|
484
|
+
AssociationCollection = (function(_super) {
|
485
|
+
|
486
|
+
__extends(AssociationCollection, _super);
|
487
|
+
|
488
|
+
AssociationCollection.name = 'AssociationCollection';
|
489
|
+
|
490
|
+
function AssociationCollection(owner, options, list) {
|
491
|
+
var item;
|
492
|
+
this.owner = owner;
|
493
|
+
this.options = options;
|
494
|
+
AssociationCollection.__super__.constructor.call(this, (function() {
|
495
|
+
var _i, _len, _results;
|
496
|
+
_results = [];
|
497
|
+
for (_i = 0, _len = list.length; _i < _len; _i++) {
|
498
|
+
item = list[_i];
|
499
|
+
_results.push(this._convert(item));
|
500
|
+
}
|
501
|
+
return _results;
|
502
|
+
}).call(this));
|
503
|
+
}
|
504
|
+
|
505
|
+
AssociationCollection.prototype.set = function(index, item) {
|
506
|
+
return AssociationCollection.__super__.set.call(this, index, this._convert(item));
|
507
|
+
};
|
508
|
+
|
509
|
+
AssociationCollection.prototype.push = function(item) {
|
510
|
+
return AssociationCollection.__super__.push.call(this, this._convert(item));
|
511
|
+
};
|
512
|
+
|
513
|
+
AssociationCollection.prototype.update = function(list) {
|
514
|
+
var item;
|
515
|
+
return AssociationCollection.__super__.update.call(this, (function() {
|
516
|
+
var _i, _len, _results;
|
517
|
+
_results = [];
|
518
|
+
for (_i = 0, _len = list.length; _i < _len; _i++) {
|
519
|
+
item = list[_i];
|
520
|
+
_results.push(this._convert(item));
|
521
|
+
}
|
522
|
+
return _results;
|
523
|
+
}).call(this));
|
524
|
+
};
|
525
|
+
|
526
|
+
AssociationCollection.prototype.splice = function() {
|
527
|
+
var deleteCount, item, list, start;
|
528
|
+
start = arguments[0], deleteCount = arguments[1], list = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
|
529
|
+
list = (function() {
|
530
|
+
var _i, _len, _results;
|
531
|
+
_results = [];
|
532
|
+
for (_i = 0, _len = list.length; _i < _len; _i++) {
|
533
|
+
item = list[_i];
|
534
|
+
_results.push(this._convert(item));
|
535
|
+
}
|
536
|
+
return _results;
|
537
|
+
}).call(this);
|
538
|
+
return AssociationCollection.__super__.splice.apply(this, [start, deleteCount].concat(__slice.call(list)));
|
539
|
+
};
|
540
|
+
|
541
|
+
AssociationCollection.prototype.insertAt = function(index, item) {
|
542
|
+
return AssociationCollection.__super__.insertAt.call(this, index, this._convert(item));
|
543
|
+
};
|
544
|
+
|
545
|
+
AssociationCollection.prototype._convert = function(item) {
|
546
|
+
if (item.constructor === Object && this.options.as) {
|
547
|
+
item = new (this.options.as())(item);
|
548
|
+
}
|
549
|
+
if (this.options.inverseOf && item[this.options.inverseOf] !== this.owner) {
|
550
|
+
item[this.options.inverseOf] = this.owner;
|
551
|
+
}
|
552
|
+
return item;
|
553
|
+
};
|
554
|
+
|
555
|
+
return AssociationCollection;
|
556
|
+
|
557
|
+
})(Collection);
|
558
|
+
|
559
|
+
exports.AssociationCollection = AssociationCollection;
|
560
|
+
|
561
|
+
}).call(this);
|
562
|
+
|
563
|
+
};require['./properties'] = new function() {
|
564
|
+
var exports = this;
|
565
|
+
(function() {
|
566
|
+
var AssociationCollection, Associations, Collection, Events, Properties, addDependencies, addGlobalDependencies, exp, extend, globalDependencies, pairToObject, prefix, serializeObject, triggerChangesTo, triggerGlobal, _ref,
|
567
|
+
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
|
568
|
+
__hasProp = {}.hasOwnProperty;
|
569
|
+
|
570
|
+
Collection = require('./collection').Collection;
|
571
|
+
|
572
|
+
AssociationCollection = require('./association_collection').AssociationCollection;
|
573
|
+
|
574
|
+
Events = require('./events').Events;
|
575
|
+
|
576
|
+
_ref = require('./helpers'), prefix = _ref.prefix, pairToObject = _ref.pairToObject, serializeObject = _ref.serializeObject, extend = _ref.extend;
|
577
|
+
|
578
|
+
exp = /^_prop_/;
|
579
|
+
|
580
|
+
globalDependencies = {};
|
581
|
+
|
582
|
+
addGlobalDependencies = function(object, dependency, names) {
|
583
|
+
var name, subname, type, _i, _len, _ref1, _ref2, _results;
|
584
|
+
if (!object["_glb_" + dependency]) {
|
585
|
+
object["_glb_" + dependency] = true;
|
586
|
+
_results = [];
|
587
|
+
for (_i = 0, _len = names.length; _i < _len; _i++) {
|
588
|
+
name = names[_i];
|
589
|
+
if (name.match(/\./)) {
|
590
|
+
type = "singular";
|
591
|
+
_ref1 = name.split("."), name = _ref1[0], subname = _ref1[1];
|
592
|
+
} else if (name.match(/:/)) {
|
593
|
+
type = "collection";
|
594
|
+
_ref2 = name.split(":"), name = _ref2[0], subname = _ref2[1];
|
595
|
+
}
|
596
|
+
if (subname) {
|
597
|
+
globalDependencies[subname] || (globalDependencies[subname] = []);
|
598
|
+
_results.push(globalDependencies[subname].push({
|
599
|
+
object: object,
|
600
|
+
dependency: dependency,
|
601
|
+
subname: subname,
|
602
|
+
name: name,
|
603
|
+
type: type
|
604
|
+
}));
|
605
|
+
} else {
|
606
|
+
_results.push(void 0);
|
607
|
+
}
|
608
|
+
}
|
609
|
+
return _results;
|
610
|
+
}
|
611
|
+
};
|
612
|
+
|
613
|
+
addDependencies = function(object, dependency, names) {
|
614
|
+
var name, subname, _i, _len, _name, _ref1, _results;
|
615
|
+
names = [].concat(names);
|
616
|
+
_results = [];
|
617
|
+
for (_i = 0, _len = names.length; _i < _len; _i++) {
|
618
|
+
name = names[_i];
|
619
|
+
if (name.match(/[:\.]/)) {
|
620
|
+
_ref1 = name.split(/[:\.]/), name = _ref1[0], subname = _ref1[1];
|
621
|
+
}
|
622
|
+
object[_name = "_dep_" + name] || (object[_name] = []);
|
623
|
+
if (__indexOf.call(object["_dep_" + name], dependency) < 0) {
|
624
|
+
_results.push(object["_dep_" + name].push(dependency));
|
625
|
+
} else {
|
626
|
+
_results.push(void 0);
|
627
|
+
}
|
628
|
+
}
|
629
|
+
return _results;
|
630
|
+
};
|
631
|
+
|
632
|
+
triggerGlobal = function(object, names) {
|
633
|
+
var dependency, name, _i, _len, _results;
|
634
|
+
_results = [];
|
635
|
+
for (_i = 0, _len = names.length; _i < _len; _i++) {
|
636
|
+
name = names[_i];
|
637
|
+
if (globalDependencies[name]) {
|
638
|
+
_results.push((function() {
|
639
|
+
var _j, _len1, _ref1, _results1;
|
640
|
+
_ref1 = globalDependencies[name];
|
641
|
+
_results1 = [];
|
642
|
+
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
643
|
+
dependency = _ref1[_j];
|
644
|
+
if (dependency.type === "singular") {
|
645
|
+
if (object === dependency.object.get(dependency.name)) {
|
646
|
+
_results1.push(triggerChangesTo(dependency.object, [dependency.dependency]));
|
647
|
+
} else {
|
648
|
+
_results1.push(void 0);
|
649
|
+
}
|
650
|
+
} else if (dependency.type === "collection") {
|
651
|
+
if (__indexOf.call(dependency.object.get(dependency.name), object) >= 0) {
|
652
|
+
_results1.push(triggerChangesTo(dependency.object, [dependency.dependency]));
|
653
|
+
} else {
|
654
|
+
_results1.push(void 0);
|
655
|
+
}
|
656
|
+
} else {
|
657
|
+
_results1.push(void 0);
|
658
|
+
}
|
659
|
+
}
|
660
|
+
return _results1;
|
661
|
+
})());
|
662
|
+
} else {
|
663
|
+
_results.push(void 0);
|
664
|
+
}
|
665
|
+
}
|
666
|
+
return _results;
|
667
|
+
};
|
668
|
+
|
669
|
+
triggerChangesTo = function(object, names) {
|
670
|
+
var changes, findDependencies, name, value, _i, _j, _len, _len1, _results;
|
671
|
+
findDependencies = function(name) {
|
672
|
+
var dependencies, dependency, _i, _len, _results;
|
673
|
+
dependencies = object["_dep_" + name];
|
674
|
+
if (dependencies) {
|
675
|
+
_results = [];
|
676
|
+
for (_i = 0, _len = dependencies.length; _i < _len; _i++) {
|
677
|
+
dependency = dependencies[_i];
|
678
|
+
if (__indexOf.call(names, dependency) < 0) {
|
679
|
+
names.push(dependency);
|
680
|
+
_results.push(findDependencies(dependency));
|
681
|
+
} else {
|
682
|
+
_results.push(void 0);
|
683
|
+
}
|
684
|
+
}
|
685
|
+
return _results;
|
686
|
+
}
|
687
|
+
};
|
688
|
+
for (_i = 0, _len = names.length; _i < _len; _i++) {
|
689
|
+
name = names[_i];
|
690
|
+
findDependencies(name);
|
691
|
+
}
|
692
|
+
changes = {};
|
693
|
+
for (_j = 0, _len1 = names.length; _j < _len1; _j++) {
|
694
|
+
name = names[_j];
|
695
|
+
changes[name] = object.get(name);
|
696
|
+
}
|
697
|
+
object.trigger("change", changes);
|
698
|
+
triggerGlobal(object, names);
|
699
|
+
_results = [];
|
700
|
+
for (name in changes) {
|
701
|
+
if (!__hasProp.call(changes, name)) continue;
|
702
|
+
value = changes[name];
|
703
|
+
_results.push(object.trigger("change:" + name, value));
|
704
|
+
}
|
705
|
+
return _results;
|
706
|
+
};
|
707
|
+
|
708
|
+
Properties = {
|
709
|
+
property: function(name, options) {
|
710
|
+
if (options == null) {
|
711
|
+
options = {};
|
712
|
+
}
|
713
|
+
this[prefix + name] = options;
|
714
|
+
this[prefix + name].name = name;
|
715
|
+
if (this.hasOwnProperty(name)) {
|
716
|
+
this.set(name, this[name]);
|
717
|
+
}
|
718
|
+
if (options.dependsOn) {
|
719
|
+
addDependencies(this, name, options.dependsOn);
|
720
|
+
}
|
721
|
+
Object.defineProperty(this, name, {
|
722
|
+
get: function() {
|
723
|
+
return Properties.get.call(this, name);
|
724
|
+
},
|
725
|
+
set: function(value) {
|
726
|
+
return Properties.set.call(this, name, value);
|
727
|
+
},
|
728
|
+
configurable: true
|
729
|
+
});
|
730
|
+
if (typeof options.serialize === 'string') {
|
731
|
+
return this.property(options.serialize, {
|
732
|
+
get: function() {
|
733
|
+
return this.get(name);
|
734
|
+
},
|
735
|
+
set: function(v) {
|
736
|
+
return this.set(name, v);
|
737
|
+
},
|
738
|
+
configurable: true
|
739
|
+
});
|
740
|
+
}
|
741
|
+
},
|
742
|
+
collection: function(name, options) {
|
743
|
+
if (options == null) {
|
744
|
+
options = {};
|
745
|
+
}
|
746
|
+
extend(options, {
|
747
|
+
get: function() {
|
748
|
+
var _this = this;
|
749
|
+
if (!this.attributes[name]) {
|
750
|
+
this.attributes[name] = new Collection([]);
|
751
|
+
this.attributes[name].bind('change', function() {
|
752
|
+
return triggerChangesTo(_this, [name]);
|
753
|
+
});
|
754
|
+
}
|
755
|
+
return this.attributes[name];
|
756
|
+
},
|
757
|
+
set: function(value) {
|
758
|
+
return this.get(name).update(value);
|
759
|
+
}
|
760
|
+
});
|
761
|
+
return this.property(name, options);
|
762
|
+
},
|
763
|
+
set: function(attributes, value) {
|
764
|
+
var name, names, _ref1;
|
765
|
+
if (typeof attributes === 'string') {
|
766
|
+
attributes = pairToObject(attributes, value);
|
767
|
+
}
|
768
|
+
names = [];
|
769
|
+
for (name in attributes) {
|
770
|
+
value = attributes[name];
|
771
|
+
names.push(name);
|
772
|
+
this.attributes || (this.attributes = {});
|
773
|
+
if (!this[prefix + name]) {
|
774
|
+
Properties.property.call(this, name);
|
775
|
+
}
|
776
|
+
if ((_ref1 = this[prefix + name]) != null ? _ref1.set : void 0) {
|
777
|
+
this[prefix + name].set.call(this, value);
|
778
|
+
} else {
|
779
|
+
this.attributes[name] = value;
|
780
|
+
}
|
781
|
+
}
|
782
|
+
return triggerChangesTo(this, names);
|
783
|
+
},
|
784
|
+
get: function(name) {
|
785
|
+
var _ref1, _ref2, _ref3;
|
786
|
+
if ((_ref1 = this[prefix + name]) != null ? _ref1.dependsOn : void 0) {
|
787
|
+
addGlobalDependencies(this, name, [].concat(this[prefix + name].dependsOn));
|
788
|
+
}
|
789
|
+
this.attributes || (this.attributes = {});
|
790
|
+
if ((_ref2 = this[prefix + name]) != null ? _ref2.get : void 0) {
|
791
|
+
return this[prefix + name].get.call(this);
|
792
|
+
} else if (((_ref3 = this[prefix + name]) != null ? _ref3.hasOwnProperty("default") : void 0) && !this.attributes.hasOwnProperty(name)) {
|
793
|
+
return this[prefix + name]["default"];
|
794
|
+
} else {
|
795
|
+
return this.attributes[name];
|
796
|
+
}
|
797
|
+
},
|
798
|
+
toJSON: function() {
|
799
|
+
var key, name, options, serialized, value, _ref1;
|
800
|
+
serialized = {};
|
801
|
+
for (name in this) {
|
802
|
+
options = this[name];
|
803
|
+
if (name.match(exp)) {
|
804
|
+
if (typeof options.serialize === 'string') {
|
805
|
+
serialized[options.serialize] = serializeObject(this.get(options.name));
|
806
|
+
} else if (typeof options.serialize === 'function') {
|
807
|
+
_ref1 = options.serialize.call(this), key = _ref1[0], value = _ref1[1];
|
808
|
+
serialized[key] = serializeObject(value);
|
809
|
+
} else if (options.serialize) {
|
810
|
+
serialized[options.name] = serializeObject(this.get(options.name));
|
811
|
+
}
|
812
|
+
}
|
813
|
+
}
|
814
|
+
return serialized;
|
815
|
+
}
|
816
|
+
};
|
817
|
+
|
818
|
+
extend(Properties, Events);
|
819
|
+
|
820
|
+
Associations = {
|
821
|
+
belongsTo: function(name, attributes) {
|
822
|
+
if (attributes == null) {
|
823
|
+
attributes = {};
|
824
|
+
}
|
825
|
+
extend(attributes, {
|
826
|
+
set: function(model) {
|
827
|
+
var previous;
|
828
|
+
if (model.constructor === Object && attributes.as) {
|
829
|
+
model = new (attributes.as())(model);
|
830
|
+
}
|
831
|
+
previous = this.attributes[name];
|
832
|
+
this.attributes[name] = model;
|
833
|
+
if (attributes.inverseOf && !model[attributes.inverseOf].includes(this)) {
|
834
|
+
if (previous) {
|
835
|
+
previous[attributes.inverseOf]["delete"](this);
|
836
|
+
}
|
837
|
+
return model[attributes.inverseOf].push(this);
|
838
|
+
}
|
839
|
+
}
|
840
|
+
});
|
841
|
+
this.property(name, attributes);
|
842
|
+
return this.property(name + 'Id', {
|
843
|
+
get: function() {
|
844
|
+
var _ref1;
|
845
|
+
return (_ref1 = this.get(name)) != null ? _ref1.id : void 0;
|
846
|
+
},
|
847
|
+
set: function(id) {
|
848
|
+
if (id != null) {
|
849
|
+
return this.set(name, attributes.as().find(id));
|
850
|
+
}
|
851
|
+
},
|
852
|
+
dependsOn: name,
|
853
|
+
serialize: attributes.serializeId
|
854
|
+
});
|
855
|
+
},
|
856
|
+
hasMany: function(name, attributes) {
|
857
|
+
if (attributes == null) {
|
858
|
+
attributes = {};
|
859
|
+
}
|
860
|
+
extend(attributes, {
|
861
|
+
get: function() {
|
862
|
+
var _this = this;
|
863
|
+
if (!this.attributes[name]) {
|
864
|
+
this.attributes[name] = new AssociationCollection(this, attributes, []);
|
865
|
+
this.attributes[name].bind('change', function() {
|
866
|
+
return triggerChangesTo(_this, [name]);
|
867
|
+
});
|
868
|
+
}
|
869
|
+
return this.attributes[name];
|
870
|
+
},
|
871
|
+
set: function(value) {
|
872
|
+
return this.get(name).update(value);
|
873
|
+
}
|
874
|
+
});
|
875
|
+
this.property(name, attributes);
|
876
|
+
return this.property(name + 'Ids', {
|
877
|
+
get: function() {
|
878
|
+
return new Collection(this.get(name)).map(function(item) {
|
879
|
+
return item != null ? item.id : void 0;
|
880
|
+
});
|
881
|
+
},
|
882
|
+
set: function(ids) {
|
883
|
+
var id, objects;
|
884
|
+
objects = (function() {
|
885
|
+
var _i, _len, _results;
|
886
|
+
_results = [];
|
887
|
+
for (_i = 0, _len = ids.length; _i < _len; _i++) {
|
888
|
+
id = ids[_i];
|
889
|
+
_results.push(attributes.as().find(id));
|
890
|
+
}
|
891
|
+
return _results;
|
892
|
+
})();
|
893
|
+
return this.get(name).update(objects);
|
894
|
+
},
|
895
|
+
dependsOn: name,
|
896
|
+
serialize: attributes.serializeIds
|
897
|
+
});
|
898
|
+
}
|
899
|
+
};
|
900
|
+
|
901
|
+
exports.Properties = Properties;
|
902
|
+
|
903
|
+
exports.Associations = Associations;
|
904
|
+
|
905
|
+
exports.globalDependencies = globalDependencies;
|
906
|
+
|
907
|
+
}).call(this);
|
908
|
+
|
909
|
+
};require['./model'] = new function() {
|
910
|
+
var exports = this;
|
911
|
+
(function() {
|
912
|
+
var Associations, Cache, Model, Properties, capitalize, extend, idCounter, _ref, _ref1,
|
913
|
+
__hasProp = {}.hasOwnProperty,
|
914
|
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; },
|
915
|
+
__slice = [].slice;
|
916
|
+
|
917
|
+
Cache = require('./cache').Cache;
|
918
|
+
|
919
|
+
_ref = require('./properties'), Associations = _ref.Associations, Properties = _ref.Properties;
|
920
|
+
|
921
|
+
_ref1 = require('./helpers'), extend = _ref1.extend, capitalize = _ref1.capitalize;
|
922
|
+
|
923
|
+
idCounter = 1;
|
924
|
+
|
925
|
+
Model = (function() {
|
926
|
+
|
927
|
+
Model.name = 'Model';
|
928
|
+
|
929
|
+
extend(Model.prototype, Properties);
|
930
|
+
|
931
|
+
extend(Model.prototype, Associations);
|
932
|
+
|
933
|
+
Model.property = function() {
|
934
|
+
var _ref2;
|
935
|
+
return (_ref2 = this.prototype).property.apply(_ref2, arguments);
|
936
|
+
};
|
937
|
+
|
938
|
+
Model.collection = function() {
|
939
|
+
var _ref2;
|
940
|
+
return (_ref2 = this.prototype).collection.apply(_ref2, arguments);
|
941
|
+
};
|
942
|
+
|
943
|
+
Model.belongsTo = function() {
|
944
|
+
var _ref2;
|
945
|
+
return (_ref2 = this.prototype).belongsTo.apply(_ref2, arguments);
|
946
|
+
};
|
947
|
+
|
948
|
+
Model.hasMany = function() {
|
949
|
+
var _ref2;
|
950
|
+
return (_ref2 = this.prototype).hasMany.apply(_ref2, arguments);
|
951
|
+
};
|
952
|
+
|
953
|
+
Model.find = function(id) {
|
954
|
+
return Cache.get(this, id) || new this({
|
955
|
+
id: id
|
956
|
+
});
|
957
|
+
};
|
958
|
+
|
959
|
+
Model.property('id', {
|
960
|
+
serialize: true,
|
961
|
+
set: function(val) {
|
962
|
+
Cache.unset(this.constructor, this.attributes.id);
|
963
|
+
Cache.set(this.constructor, val, this);
|
964
|
+
return this.attributes.id = val;
|
965
|
+
}
|
966
|
+
});
|
967
|
+
|
968
|
+
Model.extend = function(ctor) {
|
969
|
+
var New;
|
970
|
+
return New = (function(_super) {
|
971
|
+
|
972
|
+
__extends(New, _super);
|
973
|
+
|
974
|
+
New.name = 'New';
|
975
|
+
|
976
|
+
function New() {
|
977
|
+
var val;
|
978
|
+
val = New.__super__.constructor.apply(this, arguments);
|
979
|
+
if (val) {
|
980
|
+
return val;
|
981
|
+
}
|
982
|
+
if (ctor) {
|
983
|
+
ctor.apply(this, arguments);
|
984
|
+
}
|
985
|
+
}
|
986
|
+
|
987
|
+
return New;
|
988
|
+
|
989
|
+
})(this);
|
990
|
+
};
|
991
|
+
|
992
|
+
Model.delegate = function() {
|
993
|
+
var name, names, options, to, _i, _j, _len, _results,
|
994
|
+
_this = this;
|
995
|
+
names = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), options = arguments[_i++];
|
996
|
+
to = options.to;
|
997
|
+
_results = [];
|
998
|
+
for (_j = 0, _len = names.length; _j < _len; _j++) {
|
999
|
+
name = names[_j];
|
1000
|
+
_results.push((function(name) {
|
1001
|
+
var propName;
|
1002
|
+
propName = name;
|
1003
|
+
if (options.prefix) {
|
1004
|
+
propName = to + capitalize(name);
|
1005
|
+
}
|
1006
|
+
if (options.suffix) {
|
1007
|
+
propName = propName + capitalize(to);
|
1008
|
+
}
|
1009
|
+
return _this.property(propName, {
|
1010
|
+
dependsOn: "" + to + "." + name,
|
1011
|
+
get: function() {
|
1012
|
+
var _ref2;
|
1013
|
+
return (_ref2 = this[to]) != null ? _ref2[name] : void 0;
|
1014
|
+
}
|
1015
|
+
});
|
1016
|
+
})(name));
|
1017
|
+
}
|
1018
|
+
return _results;
|
1019
|
+
};
|
1020
|
+
|
1021
|
+
Model.uniqueId = function() {
|
1022
|
+
if (!(this._uniqueId && this._uniqueGen === this)) {
|
1023
|
+
this._uniqueId = (idCounter += 1);
|
1024
|
+
this._uniqueGen = this;
|
1025
|
+
}
|
1026
|
+
return this._uniqueId;
|
1027
|
+
};
|
1028
|
+
|
1029
|
+
function Model(attributes, bypassCache) {
|
1030
|
+
var fromCache,
|
1031
|
+
_this = this;
|
1032
|
+
if (bypassCache == null) {
|
1033
|
+
bypassCache = false;
|
1034
|
+
}
|
1035
|
+
if (!bypassCache) {
|
1036
|
+
if (attributes != null ? attributes.id : void 0) {
|
1037
|
+
fromCache = Cache.get(this.constructor, attributes.id);
|
1038
|
+
if (fromCache) {
|
1039
|
+
fromCache.set(attributes);
|
1040
|
+
return fromCache;
|
1041
|
+
} else {
|
1042
|
+
Cache.set(this.constructor, attributes.id, this);
|
1043
|
+
}
|
1044
|
+
}
|
1045
|
+
}
|
1046
|
+
if (this.constructor.localStorage) {
|
1047
|
+
this.bind('saved', function() {
|
1048
|
+
return Cache.store(_this.constructor, _this.get('id'), _this);
|
1049
|
+
});
|
1050
|
+
if (this.constructor.localStorage !== 'save') {
|
1051
|
+
this.bind('change', function() {
|
1052
|
+
return Cache.store(_this.constructor, _this.get('id'), _this);
|
1053
|
+
});
|
1054
|
+
}
|
1055
|
+
}
|
1056
|
+
this.set(attributes);
|
1057
|
+
}
|
1058
|
+
|
1059
|
+
Model.prototype.save = function() {
|
1060
|
+
return this.trigger('saved');
|
1061
|
+
};
|
1062
|
+
|
1063
|
+
return Model;
|
1064
|
+
|
1065
|
+
})();
|
1066
|
+
|
1067
|
+
exports.Model = Model;
|
1068
|
+
|
1069
|
+
}).call(this);
|
1070
|
+
|
1071
|
+
};require['./serenade'] = new function() {
|
1072
|
+
var exports = this;
|
1073
|
+
(function() {
|
1074
|
+
var Cache, Properties, Serenade, extend, format, globalDependencies, _ref, _ref1;
|
1075
|
+
|
1076
|
+
Cache = require('./cache').Cache;
|
1077
|
+
|
1078
|
+
_ref = require('./helpers'), extend = _ref.extend, format = _ref.format;
|
1079
|
+
|
1080
|
+
_ref1 = require("./properties"), Properties = _ref1.Properties, globalDependencies = _ref1.globalDependencies;
|
1081
|
+
|
1082
|
+
Serenade = function(attributes) {
|
1083
|
+
if (this === root) {
|
1084
|
+
return new Serenade(attributes);
|
1085
|
+
}
|
1086
|
+
this.set(attributes);
|
1087
|
+
return this;
|
1088
|
+
};
|
1089
|
+
|
1090
|
+
extend(Serenade.prototype, Properties);
|
1091
|
+
|
1092
|
+
extend(Serenade, {
|
1093
|
+
VERSION: '0.3.0',
|
1094
|
+
_views: {},
|
1095
|
+
_controllers: {},
|
1096
|
+
document: typeof window !== "undefined" && window !== null ? window.document : void 0,
|
1097
|
+
format: format,
|
1098
|
+
view: function(nameOrTemplate, template) {
|
1099
|
+
var View;
|
1100
|
+
View = require('./view').View;
|
1101
|
+
if (template) {
|
1102
|
+
return this._views[nameOrTemplate] = new View(nameOrTemplate, template);
|
1103
|
+
} else {
|
1104
|
+
return new View(void 0, nameOrTemplate);
|
1105
|
+
}
|
1106
|
+
},
|
1107
|
+
render: function(name, model, controller, parent, skipCallback) {
|
1108
|
+
return this._views[name].render(model, controller, parent, skipCallback);
|
1109
|
+
},
|
1110
|
+
controller: function(name, klass) {
|
1111
|
+
return this._controllers[name] = klass;
|
1112
|
+
},
|
1113
|
+
controllerFor: function(name) {
|
1114
|
+
return this._controllers[name];
|
1115
|
+
},
|
1116
|
+
clearIdentityMap: function() {
|
1117
|
+
return Cache._identityMap = {};
|
1118
|
+
},
|
1119
|
+
clearLocalStorage: function() {
|
1120
|
+
return Cache._storage.clear();
|
1121
|
+
},
|
1122
|
+
clearCache: function() {
|
1123
|
+
var key, value, _i, _len, _results;
|
1124
|
+
Serenade.clearIdentityMap();
|
1125
|
+
Serenade.clearLocalStorage();
|
1126
|
+
_results = [];
|
1127
|
+
for (key = _i = 0, _len = globalDependencies.length; _i < _len; key = ++_i) {
|
1128
|
+
value = globalDependencies[key];
|
1129
|
+
_results.push(delete globalDependencies[key]);
|
1130
|
+
}
|
1131
|
+
return _results;
|
1132
|
+
},
|
1133
|
+
unregisterAll: function() {
|
1134
|
+
Serenade._views = {};
|
1135
|
+
return Serenade._controllers = {};
|
1136
|
+
},
|
1137
|
+
Events: require('./events').Events,
|
1138
|
+
Model: require('./model').Model,
|
1139
|
+
Collection: require('./collection').Collection,
|
1140
|
+
Helpers: {}
|
1141
|
+
});
|
1142
|
+
|
1143
|
+
exports.Serenade = Serenade;
|
1144
|
+
|
1145
|
+
exports.compile = function() {
|
1146
|
+
var document, fs, window;
|
1147
|
+
document = require("jsdom").jsdom(null, null, {});
|
1148
|
+
fs = require("fs");
|
1149
|
+
window = document.createWindow();
|
1150
|
+
Serenade.document = document;
|
1151
|
+
return function(env) {
|
1152
|
+
var element, html, model, viewName;
|
1153
|
+
model = env.model;
|
1154
|
+
viewName = env.filename.split('/').reverse()[0].replace(/\.serenade$/, '');
|
1155
|
+
Serenade.view(viewName, fs.readFileSync(env.filename).toString());
|
1156
|
+
element = Serenade.render(viewName, model, {});
|
1157
|
+
document.body.appendChild(element);
|
1158
|
+
html = document.body.innerHTML;
|
1159
|
+
if (env.doctype !== false) {
|
1160
|
+
html = "<!DOCTYPE html>\n" + html;
|
1161
|
+
}
|
1162
|
+
return html;
|
1163
|
+
};
|
1164
|
+
};
|
1165
|
+
|
1166
|
+
}).call(this);
|
1167
|
+
|
1168
|
+
};require['./lexer'] = new function() {
|
1169
|
+
var exports = this;
|
1170
|
+
(function() {
|
1171
|
+
var COMMENT, IDENTIFIER, KEYWORDS, LITERAL, Lexer, MULTI_DENT, STRING, WHITESPACE,
|
1172
|
+
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
1173
|
+
|
1174
|
+
IDENTIFIER = /^[a-zA-Z][a-zA-Z0-9\-_]*/;
|
1175
|
+
|
1176
|
+
LITERAL = /^[\[\]=\:\-!#\.@]/;
|
1177
|
+
|
1178
|
+
STRING = /^"((?:\\.|[^"])*)"/;
|
1179
|
+
|
1180
|
+
MULTI_DENT = /^(?:\r?\n[^\r\n\S]*)+/;
|
1181
|
+
|
1182
|
+
WHITESPACE = /^[^\r\n\S]+/;
|
1183
|
+
|
1184
|
+
COMMENT = /^\s*\/\/[^\n]*/;
|
1185
|
+
|
1186
|
+
KEYWORDS = ["IF", "ELSE", "COLLECTION", "IN", "VIEW", "UNLESS"];
|
1187
|
+
|
1188
|
+
Lexer = (function() {
|
1189
|
+
|
1190
|
+
Lexer.name = 'Lexer';
|
1191
|
+
|
1192
|
+
function Lexer() {}
|
1193
|
+
|
1194
|
+
Lexer.prototype.tokenize = function(code, opts) {
|
1195
|
+
var tag;
|
1196
|
+
if (opts == null) {
|
1197
|
+
opts = {};
|
1198
|
+
}
|
1199
|
+
this.code = code.replace(/^\s*/, '').replace(/\s*$/, '');
|
1200
|
+
this.line = opts.line || 0;
|
1201
|
+
this.indent = 0;
|
1202
|
+
this.indents = [];
|
1203
|
+
this.ends = [];
|
1204
|
+
this.tokens = [];
|
1205
|
+
this.i = 0;
|
1206
|
+
while (this.chunk = this.code.slice(this.i)) {
|
1207
|
+
this.i += this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.stringToken() || this.literalToken();
|
1208
|
+
}
|
1209
|
+
while (tag = this.ends.pop()) {
|
1210
|
+
if (tag === 'OUTDENT') {
|
1211
|
+
this.token('OUTDENT');
|
1212
|
+
} else {
|
1213
|
+
this.error("missing " + tag);
|
1214
|
+
}
|
1215
|
+
}
|
1216
|
+
while (this.tokens[0][0] === "TERMINATOR") {
|
1217
|
+
this.tokens.shift();
|
1218
|
+
}
|
1219
|
+
while (this.tokens[this.tokens.length - 1][0] === "TERMINATOR") {
|
1220
|
+
this.tokens.pop();
|
1221
|
+
}
|
1222
|
+
return this.tokens;
|
1223
|
+
};
|
1224
|
+
|
1225
|
+
Lexer.prototype.commentToken = function() {
|
1226
|
+
var match;
|
1227
|
+
if (match = COMMENT.exec(this.chunk)) {
|
1228
|
+
return match[0].length;
|
1229
|
+
} else {
|
1230
|
+
return 0;
|
1231
|
+
}
|
1232
|
+
};
|
1233
|
+
|
1234
|
+
Lexer.prototype.whitespaceToken = function() {
|
1235
|
+
var match;
|
1236
|
+
if (match = WHITESPACE.exec(this.chunk)) {
|
1237
|
+
this.token('WHITESPACE', match[0].length);
|
1238
|
+
return match[0].length;
|
1239
|
+
} else {
|
1240
|
+
return 0;
|
1241
|
+
}
|
1242
|
+
};
|
1243
|
+
|
1244
|
+
Lexer.prototype.token = function(tag, value) {
|
1245
|
+
return this.tokens.push([tag, value, this.line]);
|
1246
|
+
};
|
1247
|
+
|
1248
|
+
Lexer.prototype.identifierToken = function() {
|
1249
|
+
var match, name;
|
1250
|
+
if (match = IDENTIFIER.exec(this.chunk)) {
|
1251
|
+
name = match[0].toUpperCase();
|
1252
|
+
if (name === "ELSE" && this.last(this.tokens, 2)[0] === "TERMINATOR") {
|
1253
|
+
this.tokens.splice(this.tokens.length - 3, 1);
|
1254
|
+
}
|
1255
|
+
if (__indexOf.call(KEYWORDS, name) >= 0) {
|
1256
|
+
this.token(name, match[0]);
|
1257
|
+
} else {
|
1258
|
+
this.token('IDENTIFIER', match[0]);
|
1259
|
+
}
|
1260
|
+
return match[0].length;
|
1261
|
+
} else {
|
1262
|
+
return 0;
|
1263
|
+
}
|
1264
|
+
};
|
1265
|
+
|
1266
|
+
Lexer.prototype.stringToken = function() {
|
1267
|
+
var match;
|
1268
|
+
if (match = STRING.exec(this.chunk)) {
|
1269
|
+
this.token('STRING_LITERAL', match[1]);
|
1270
|
+
return match[0].length;
|
1271
|
+
} else {
|
1272
|
+
return 0;
|
1273
|
+
}
|
1274
|
+
};
|
1275
|
+
|
1276
|
+
Lexer.prototype.lineToken = function() {
|
1277
|
+
var diff, indent, match, prev, size;
|
1278
|
+
if (!(match = MULTI_DENT.exec(this.chunk))) {
|
1279
|
+
return 0;
|
1280
|
+
}
|
1281
|
+
indent = match[0];
|
1282
|
+
this.line += this.count(indent, '\n');
|
1283
|
+
prev = this.last(this.tokens, 1);
|
1284
|
+
size = indent.length - 1 - indent.lastIndexOf('\n');
|
1285
|
+
diff = size - this.indent;
|
1286
|
+
if (size === this.indent) {
|
1287
|
+
this.newlineToken();
|
1288
|
+
} else if (size > this.indent) {
|
1289
|
+
this.token('INDENT');
|
1290
|
+
this.indents.push(diff);
|
1291
|
+
this.ends.push('OUTDENT');
|
1292
|
+
} else {
|
1293
|
+
while (diff < 0) {
|
1294
|
+
this.ends.pop();
|
1295
|
+
diff += this.indents.pop();
|
1296
|
+
this.token('OUTDENT');
|
1297
|
+
}
|
1298
|
+
this.token('TERMINATOR', '\n');
|
1299
|
+
}
|
1300
|
+
this.indent = size;
|
1301
|
+
return indent.length;
|
1302
|
+
};
|
1303
|
+
|
1304
|
+
Lexer.prototype.literalToken = function() {
|
1305
|
+
var match;
|
1306
|
+
if (match = LITERAL.exec(this.chunk)) {
|
1307
|
+
this.token(match[0]);
|
1308
|
+
return 1;
|
1309
|
+
} else {
|
1310
|
+
return this.error("Unexpected token '" + (this.chunk.charAt(0)) + "'");
|
1311
|
+
}
|
1312
|
+
};
|
1313
|
+
|
1314
|
+
Lexer.prototype.newlineToken = function() {
|
1315
|
+
if (this.tag() !== 'TERMINATOR') {
|
1316
|
+
return this.token('TERMINATOR', '\n');
|
1317
|
+
}
|
1318
|
+
};
|
1319
|
+
|
1320
|
+
Lexer.prototype.tag = function(index, tag) {
|
1321
|
+
var tok;
|
1322
|
+
return (tok = this.last(this.tokens, index)) && (tag ? tok[0] = tag : tok[0]);
|
1323
|
+
};
|
1324
|
+
|
1325
|
+
Lexer.prototype.value = function(index, val) {
|
1326
|
+
var tok;
|
1327
|
+
return (tok = this.last(this.tokens, index)) && (val ? tok[1] = val : tok[1]);
|
1328
|
+
};
|
1329
|
+
|
1330
|
+
Lexer.prototype.error = function(message) {
|
1331
|
+
var chunk;
|
1332
|
+
chunk = this.code.slice(Math.max(0, this.i - 10), Math.min(this.code.length, this.i + 10));
|
1333
|
+
throw SyntaxError("" + message + " on line " + (this.line + 1) + " near " + (JSON.stringify(chunk)));
|
1334
|
+
};
|
1335
|
+
|
1336
|
+
Lexer.prototype.count = function(string, substr) {
|
1337
|
+
var num, pos;
|
1338
|
+
num = pos = 0;
|
1339
|
+
if (!substr.length) {
|
1340
|
+
return 1 / 0;
|
1341
|
+
}
|
1342
|
+
while (pos = 1 + string.indexOf(substr, pos)) {
|
1343
|
+
num++;
|
1344
|
+
}
|
1345
|
+
return num;
|
1346
|
+
};
|
1347
|
+
|
1348
|
+
Lexer.prototype.last = function(array, back) {
|
1349
|
+
return array[array.length - (back || 0) - 1];
|
1350
|
+
};
|
1351
|
+
|
1352
|
+
return Lexer;
|
1353
|
+
|
1354
|
+
})();
|
1355
|
+
|
1356
|
+
exports.Lexer = Lexer;
|
1357
|
+
|
1358
|
+
}).call(this);
|
1359
|
+
|
1360
|
+
};require['./node'] = new function() {
|
1361
|
+
var exports = this;
|
1362
|
+
(function() {
|
1363
|
+
var Collection, Events, Node, NodeEvents, Serenade, extend, _ref;
|
1364
|
+
|
1365
|
+
Serenade = require('./serenade').Serenade;
|
1366
|
+
|
1367
|
+
_ref = require('./events'), Events = _ref.Events, NodeEvents = _ref.NodeEvents;
|
1368
|
+
|
1369
|
+
extend = require('./helpers').extend;
|
1370
|
+
|
1371
|
+
Collection = require('./collection').Collection;
|
1372
|
+
|
1373
|
+
Node = (function() {
|
1374
|
+
|
1375
|
+
Node.name = 'Node';
|
1376
|
+
|
1377
|
+
extend(Node.prototype, Events);
|
1378
|
+
|
1379
|
+
extend(Node.prototype, NodeEvents);
|
1380
|
+
|
1381
|
+
function Node(ast, element) {
|
1382
|
+
this.ast = ast;
|
1383
|
+
this.element = element;
|
1384
|
+
this.children = new Collection([]);
|
1385
|
+
}
|
1386
|
+
|
1387
|
+
Node.prototype.append = function(inside) {
|
1388
|
+
return inside.appendChild(this.element);
|
1389
|
+
};
|
1390
|
+
|
1391
|
+
Node.prototype.insertAfter = function(after) {
|
1392
|
+
return after.parentNode.insertBefore(this.element, after.nextSibling);
|
1393
|
+
};
|
1394
|
+
|
1395
|
+
Node.prototype.remove = function() {
|
1396
|
+
var _ref1;
|
1397
|
+
this.unbindEvents();
|
1398
|
+
return (_ref1 = this.element.parentNode) != null ? _ref1.removeChild(this.element) : void 0;
|
1399
|
+
};
|
1400
|
+
|
1401
|
+
Node.prototype.lastElement = function() {
|
1402
|
+
return this.element;
|
1403
|
+
};
|
1404
|
+
|
1405
|
+
Node.prototype.nodes = function() {
|
1406
|
+
return this.children;
|
1407
|
+
};
|
1408
|
+
|
1409
|
+
return Node;
|
1410
|
+
|
1411
|
+
})();
|
1412
|
+
|
1413
|
+
exports.Node = Node;
|
1414
|
+
|
1415
|
+
}).call(this);
|
1416
|
+
|
1417
|
+
};require['./dynamic_node'] = new function() {
|
1418
|
+
var exports = this;
|
1419
|
+
(function() {
|
1420
|
+
var Collection, DynamicNode, NodeEvents, Serenade, extend;
|
1421
|
+
|
1422
|
+
Serenade = require('./serenade').Serenade;
|
1423
|
+
|
1424
|
+
Collection = require('./collection').Collection;
|
1425
|
+
|
1426
|
+
extend = require('./helpers').extend;
|
1427
|
+
|
1428
|
+
NodeEvents = require('./events').NodeEvents;
|
1429
|
+
|
1430
|
+
DynamicNode = (function() {
|
1431
|
+
|
1432
|
+
DynamicNode.name = 'DynamicNode';
|
1433
|
+
|
1434
|
+
extend(DynamicNode.prototype, NodeEvents);
|
1435
|
+
|
1436
|
+
function DynamicNode(ast) {
|
1437
|
+
this.ast = ast;
|
1438
|
+
this.anchor = Serenade.document.createTextNode('');
|
1439
|
+
this.nodeSets = new Collection([]);
|
1440
|
+
}
|
1441
|
+
|
1442
|
+
DynamicNode.prototype.nodes = function() {
|
1443
|
+
var node, nodes, set, _i, _j, _len, _len1, _ref;
|
1444
|
+
nodes = [];
|
1445
|
+
_ref = this.nodeSets;
|
1446
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1447
|
+
set = _ref[_i];
|
1448
|
+
for (_j = 0, _len1 = set.length; _j < _len1; _j++) {
|
1449
|
+
node = set[_j];
|
1450
|
+
nodes.push(node);
|
1451
|
+
}
|
1452
|
+
}
|
1453
|
+
return nodes;
|
1454
|
+
};
|
1455
|
+
|
1456
|
+
DynamicNode.prototype.rebuild = function() {
|
1457
|
+
var last, node, _i, _len, _ref, _results;
|
1458
|
+
if (this.anchor.parentNode) {
|
1459
|
+
last = this.anchor;
|
1460
|
+
_ref = this.nodes();
|
1461
|
+
_results = [];
|
1462
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1463
|
+
node = _ref[_i];
|
1464
|
+
node.insertAfter(last);
|
1465
|
+
_results.push(last = node.lastElement());
|
1466
|
+
}
|
1467
|
+
return _results;
|
1468
|
+
}
|
1469
|
+
};
|
1470
|
+
|
1471
|
+
DynamicNode.prototype.replace = function(sets) {
|
1472
|
+
var set;
|
1473
|
+
this.clear();
|
1474
|
+
this.nodeSets.update((function() {
|
1475
|
+
var _i, _len, _results;
|
1476
|
+
_results = [];
|
1477
|
+
for (_i = 0, _len = sets.length; _i < _len; _i++) {
|
1478
|
+
set = sets[_i];
|
1479
|
+
_results.push(new Collection(set));
|
1480
|
+
}
|
1481
|
+
return _results;
|
1482
|
+
})());
|
1483
|
+
return this.rebuild();
|
1484
|
+
};
|
1485
|
+
|
1486
|
+
DynamicNode.prototype.appendNodeSet = function(nodes) {
|
1487
|
+
return this.insertNodeSet(this.nodeSets.length, nodes);
|
1488
|
+
};
|
1489
|
+
|
1490
|
+
DynamicNode.prototype.deleteNodeSet = function(index) {
|
1491
|
+
var node, _i, _len, _ref;
|
1492
|
+
_ref = this.nodeSets[index];
|
1493
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1494
|
+
node = _ref[_i];
|
1495
|
+
node.remove();
|
1496
|
+
}
|
1497
|
+
return this.nodeSets.deleteAt(index);
|
1498
|
+
};
|
1499
|
+
|
1500
|
+
DynamicNode.prototype.insertNodeSet = function(index, nodes) {
|
1501
|
+
var last, node, _i, _len, _ref, _ref1;
|
1502
|
+
last = ((_ref = this.nodeSets[index - 1]) != null ? (_ref1 = _ref.last()) != null ? _ref1.lastElement() : void 0 : void 0) || this.anchor;
|
1503
|
+
for (_i = 0, _len = nodes.length; _i < _len; _i++) {
|
1504
|
+
node = nodes[_i];
|
1505
|
+
node.insertAfter(last);
|
1506
|
+
last = node.lastElement();
|
1507
|
+
}
|
1508
|
+
return this.nodeSets.insertAt(index, new Collection(nodes));
|
1509
|
+
};
|
1510
|
+
|
1511
|
+
DynamicNode.prototype.clear = function() {
|
1512
|
+
var node, _i, _len, _ref;
|
1513
|
+
_ref = this.nodes();
|
1514
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1515
|
+
node = _ref[_i];
|
1516
|
+
node.remove();
|
1517
|
+
}
|
1518
|
+
return this.nodeSets.update([]);
|
1519
|
+
};
|
1520
|
+
|
1521
|
+
DynamicNode.prototype.remove = function() {
|
1522
|
+
this.unbindEvents();
|
1523
|
+
this.clear();
|
1524
|
+
return this.anchor.parentNode.removeChild(this.anchor);
|
1525
|
+
};
|
1526
|
+
|
1527
|
+
DynamicNode.prototype.append = function(inside) {
|
1528
|
+
inside.appendChild(this.anchor);
|
1529
|
+
return this.rebuild();
|
1530
|
+
};
|
1531
|
+
|
1532
|
+
DynamicNode.prototype.insertAfter = function(after) {
|
1533
|
+
after.parentNode.insertBefore(this.anchor, after.nextSibling);
|
1534
|
+
return this.rebuild();
|
1535
|
+
};
|
1536
|
+
|
1537
|
+
DynamicNode.prototype.lastElement = function() {
|
1538
|
+
var _ref, _ref1;
|
1539
|
+
return ((_ref = this.nodeSets.last()) != null ? (_ref1 = _ref.last()) != null ? _ref1.lastElement() : void 0 : void 0) || this.anchor;
|
1540
|
+
};
|
1541
|
+
|
1542
|
+
return DynamicNode;
|
1543
|
+
|
1544
|
+
})();
|
1545
|
+
|
1546
|
+
exports.DynamicNode = DynamicNode;
|
1547
|
+
|
1548
|
+
}).call(this);
|
1549
|
+
|
1550
|
+
};require['./compile'] = new function() {
|
1551
|
+
var exports = this;
|
1552
|
+
(function() {
|
1553
|
+
var Collection, Compile, DynamicNode, Node, Property, Serenade, compile, compileAll, format, getValue;
|
1554
|
+
|
1555
|
+
Serenade = require('./serenade').Serenade;
|
1556
|
+
|
1557
|
+
Collection = require('./collection').Collection;
|
1558
|
+
|
1559
|
+
Node = require('./node').Node;
|
1560
|
+
|
1561
|
+
DynamicNode = require('./dynamic_node').DynamicNode;
|
1562
|
+
|
1563
|
+
format = require('./helpers').format;
|
1564
|
+
|
1565
|
+
getValue = function(ast, model) {
|
1566
|
+
if (ast.bound && ast.value) {
|
1567
|
+
return format(model, ast.value);
|
1568
|
+
} else if (ast.value != null) {
|
1569
|
+
return ast.value;
|
1570
|
+
} else {
|
1571
|
+
return model;
|
1572
|
+
}
|
1573
|
+
};
|
1574
|
+
|
1575
|
+
Property = {
|
1576
|
+
style: function(ast, node, model, controller) {
|
1577
|
+
var update;
|
1578
|
+
update = function() {
|
1579
|
+
return node.element.style[ast.name] = getValue(ast, model);
|
1580
|
+
};
|
1581
|
+
update();
|
1582
|
+
if (ast.bound) {
|
1583
|
+
return node.bindEvent(model, "change:" + ast.value, update);
|
1584
|
+
}
|
1585
|
+
},
|
1586
|
+
event: function(ast, node, model, controller) {
|
1587
|
+
return node.element.addEventListener(ast.name, function(e) {
|
1588
|
+
if (ast.preventDefault) {
|
1589
|
+
e.preventDefault();
|
1590
|
+
}
|
1591
|
+
return controller[ast.value](model, node.element, e);
|
1592
|
+
});
|
1593
|
+
},
|
1594
|
+
binding: function(ast, node, model, controller) {
|
1595
|
+
var domUpdated, element, handler, modelUpdated, _ref;
|
1596
|
+
element = node.element;
|
1597
|
+
((_ref = node.ast.name) === "input" || _ref === "textarea" || _ref === "select") || (function() {
|
1598
|
+
throw SyntaxError("invalid node type " + node.ast.name + " for two way binding");
|
1599
|
+
})();
|
1600
|
+
ast.value || (function() {
|
1601
|
+
throw SyntaxError("cannot bind to whole model, please specify an attribute to bind to");
|
1602
|
+
})();
|
1603
|
+
domUpdated = function() {
|
1604
|
+
return model[ast.value] = element.type === "checkbox" ? element.checked : element.type === "radio" ? element.checked ? element.getAttribute("value") : void 0 : element.value;
|
1605
|
+
};
|
1606
|
+
modelUpdated = function() {
|
1607
|
+
var val;
|
1608
|
+
val = model[ast.value];
|
1609
|
+
if (element.type === "checkbox") {
|
1610
|
+
return element.checked = !!val;
|
1611
|
+
} else if (element.type === "radio") {
|
1612
|
+
if (val === element.getAttribute("value")) {
|
1613
|
+
return element.checked = true;
|
1614
|
+
}
|
1615
|
+
} else {
|
1616
|
+
if (val === void 0) {
|
1617
|
+
val = "";
|
1618
|
+
}
|
1619
|
+
if (element.value !== val) {
|
1620
|
+
return element.value = val;
|
1621
|
+
}
|
1622
|
+
}
|
1623
|
+
};
|
1624
|
+
modelUpdated();
|
1625
|
+
node.bindEvent(model, "change:" + ast.value, modelUpdated);
|
1626
|
+
if (ast.name === "binding") {
|
1627
|
+
handler = function(e) {
|
1628
|
+
if (element.form === (e.target || e.srcElement)) {
|
1629
|
+
return domUpdated();
|
1630
|
+
}
|
1631
|
+
};
|
1632
|
+
Serenade.document.addEventListener("submit", handler, true);
|
1633
|
+
return node.bind("unload", function() {
|
1634
|
+
return Serenade.document.removeEventListener("submit", handler, true);
|
1635
|
+
});
|
1636
|
+
} else {
|
1637
|
+
return element.addEventListener(ast.name, domUpdated);
|
1638
|
+
}
|
1639
|
+
},
|
1640
|
+
attribute: function(ast, node, model, controller) {
|
1641
|
+
var element, update;
|
1642
|
+
if (ast.name === "binding") {
|
1643
|
+
return Property.binding(ast, node, model, controller);
|
1644
|
+
}
|
1645
|
+
element = node.element;
|
1646
|
+
update = function() {
|
1647
|
+
var classes, value;
|
1648
|
+
value = getValue(ast, model);
|
1649
|
+
if (ast.name === 'value') {
|
1650
|
+
return element.value = value || '';
|
1651
|
+
} else if (node.ast.name === 'input' && ast.name === 'checked') {
|
1652
|
+
return element.checked = !!value;
|
1653
|
+
} else if (ast.name === 'class') {
|
1654
|
+
classes = node.ast.classes;
|
1655
|
+
if (value !== void 0) {
|
1656
|
+
classes = classes.concat(value);
|
1657
|
+
}
|
1658
|
+
if (classes.length) {
|
1659
|
+
return element.className = classes.join(' ');
|
1660
|
+
} else {
|
1661
|
+
element.className = '';
|
1662
|
+
return element.removeAttribute(ast.name);
|
1663
|
+
}
|
1664
|
+
} else if (value === void 0) {
|
1665
|
+
return element.removeAttribute(ast.name);
|
1666
|
+
} else {
|
1667
|
+
if (value === 0) {
|
1668
|
+
value = "0";
|
1669
|
+
}
|
1670
|
+
return element.setAttribute(ast.name, value);
|
1671
|
+
}
|
1672
|
+
};
|
1673
|
+
if (ast.bound) {
|
1674
|
+
node.bindEvent(model, "change:" + ast.value, update);
|
1675
|
+
}
|
1676
|
+
return update();
|
1677
|
+
},
|
1678
|
+
on: function(ast, node, model, controller) {
|
1679
|
+
var _ref;
|
1680
|
+
if ((_ref = ast.name) === "load" || _ref === "unload") {
|
1681
|
+
return node.bind(ast.name, function() {
|
1682
|
+
return controller[ast.value](model, node.element);
|
1683
|
+
});
|
1684
|
+
} else {
|
1685
|
+
throw new SyntaxError("unkown lifecycle event '" + ast.name + "'");
|
1686
|
+
}
|
1687
|
+
}
|
1688
|
+
};
|
1689
|
+
|
1690
|
+
Compile = {
|
1691
|
+
element: function(ast, model, controller) {
|
1692
|
+
var action, child, childNode, element, node, property, _i, _j, _len, _len1, _ref, _ref1, _ref2;
|
1693
|
+
element = Serenade.document.createElement(ast.name);
|
1694
|
+
node = new Node(ast, element);
|
1695
|
+
if (ast.id) {
|
1696
|
+
element.setAttribute('id', ast.id);
|
1697
|
+
}
|
1698
|
+
if ((_ref = ast.classes) != null ? _ref.length : void 0) {
|
1699
|
+
element.setAttribute('class', ast.classes.join(' '));
|
1700
|
+
}
|
1701
|
+
_ref1 = ast.children;
|
1702
|
+
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
1703
|
+
child = _ref1[_i];
|
1704
|
+
childNode = compile(child, model, controller);
|
1705
|
+
childNode.append(element);
|
1706
|
+
node.children.push(childNode);
|
1707
|
+
}
|
1708
|
+
_ref2 = ast.properties;
|
1709
|
+
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
|
1710
|
+
property = _ref2[_j];
|
1711
|
+
action = Property[property.scope];
|
1712
|
+
if (action) {
|
1713
|
+
action(property, node, model, controller);
|
1714
|
+
} else {
|
1715
|
+
throw SyntaxError("" + property.scope + " is not a valid scope");
|
1716
|
+
}
|
1717
|
+
}
|
1718
|
+
node.trigger("load");
|
1719
|
+
return node;
|
1720
|
+
},
|
1721
|
+
view: function(ast, model, parent) {
|
1722
|
+
var controller, skipCallback;
|
1723
|
+
controller = Serenade.controllerFor(ast["arguments"][0]);
|
1724
|
+
if (!controller) {
|
1725
|
+
skipCallback = true;
|
1726
|
+
controller = parent;
|
1727
|
+
}
|
1728
|
+
return Serenade._views[ast["arguments"][0]].node(model, controller, parent, skipCallback);
|
1729
|
+
},
|
1730
|
+
helper: function(ast, model, controller) {
|
1731
|
+
var context, element, helperFunction, render;
|
1732
|
+
render = function(model, controller) {
|
1733
|
+
var child, fragment, node, _i, _len, _ref;
|
1734
|
+
if (model == null) {
|
1735
|
+
model = model;
|
1736
|
+
}
|
1737
|
+
if (controller == null) {
|
1738
|
+
controller = controller;
|
1739
|
+
}
|
1740
|
+
fragment = Serenade.document.createDocumentFragment();
|
1741
|
+
_ref = ast.children;
|
1742
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1743
|
+
child = _ref[_i];
|
1744
|
+
node = compile(child, model, controller);
|
1745
|
+
node.append(fragment);
|
1746
|
+
}
|
1747
|
+
return fragment;
|
1748
|
+
};
|
1749
|
+
helperFunction = Serenade.Helpers[ast.command] || (function() {
|
1750
|
+
throw SyntaxError("no helper " + ast.command + " defined");
|
1751
|
+
})();
|
1752
|
+
context = {
|
1753
|
+
render: render,
|
1754
|
+
model: model,
|
1755
|
+
controller: controller
|
1756
|
+
};
|
1757
|
+
element = helperFunction.apply(context, ast["arguments"]);
|
1758
|
+
return new Node(ast, element);
|
1759
|
+
},
|
1760
|
+
text: function(ast, model, controller) {
|
1761
|
+
var getText, node, textNode;
|
1762
|
+
getText = function() {
|
1763
|
+
var value;
|
1764
|
+
value = getValue(ast, model);
|
1765
|
+
if (value === 0) {
|
1766
|
+
value = "0";
|
1767
|
+
}
|
1768
|
+
return value || "";
|
1769
|
+
};
|
1770
|
+
textNode = Serenade.document.createTextNode(getText());
|
1771
|
+
node = new Node(ast, textNode);
|
1772
|
+
if (ast.bound) {
|
1773
|
+
node.bindEvent(model, "change:" + ast.value, function() {
|
1774
|
+
return textNode.nodeValue = getText();
|
1775
|
+
});
|
1776
|
+
}
|
1777
|
+
return node;
|
1778
|
+
},
|
1779
|
+
collection: function(ast, model, controller) {
|
1780
|
+
var collection, compileItem, dynamic, item,
|
1781
|
+
_this = this;
|
1782
|
+
compileItem = function(item) {
|
1783
|
+
return compileAll(ast.children, item, controller);
|
1784
|
+
};
|
1785
|
+
dynamic = new DynamicNode(ast);
|
1786
|
+
collection = model[ast["arguments"][0]];
|
1787
|
+
if (typeof collection.bind === "function") {
|
1788
|
+
dynamic.bindEvent(collection, 'set', function() {
|
1789
|
+
var item;
|
1790
|
+
return dynamic.replace((function() {
|
1791
|
+
var _i, _len, _results;
|
1792
|
+
_results = [];
|
1793
|
+
for (_i = 0, _len = collection.length; _i < _len; _i++) {
|
1794
|
+
item = collection[_i];
|
1795
|
+
_results.push(compileItem(item));
|
1796
|
+
}
|
1797
|
+
return _results;
|
1798
|
+
})());
|
1799
|
+
});
|
1800
|
+
dynamic.bindEvent(collection, 'update', function() {
|
1801
|
+
var item;
|
1802
|
+
return dynamic.replace((function() {
|
1803
|
+
var _i, _len, _results;
|
1804
|
+
_results = [];
|
1805
|
+
for (_i = 0, _len = collection.length; _i < _len; _i++) {
|
1806
|
+
item = collection[_i];
|
1807
|
+
_results.push(compileItem(item));
|
1808
|
+
}
|
1809
|
+
return _results;
|
1810
|
+
})());
|
1811
|
+
});
|
1812
|
+
dynamic.bindEvent(collection, 'add', function(item) {
|
1813
|
+
return dynamic.appendNodeSet(compileItem(item));
|
1814
|
+
});
|
1815
|
+
dynamic.bindEvent(collection, 'insert', function(index, item) {
|
1816
|
+
return dynamic.insertNodeSet(index, compileItem(item));
|
1817
|
+
});
|
1818
|
+
dynamic.bindEvent(collection, 'delete', function(index) {
|
1819
|
+
return dynamic.deleteNodeSet(index);
|
1820
|
+
});
|
1821
|
+
}
|
1822
|
+
dynamic.replace((function() {
|
1823
|
+
var _i, _len, _results;
|
1824
|
+
_results = [];
|
1825
|
+
for (_i = 0, _len = collection.length; _i < _len; _i++) {
|
1826
|
+
item = collection[_i];
|
1827
|
+
_results.push(compileItem(item));
|
1828
|
+
}
|
1829
|
+
return _results;
|
1830
|
+
})());
|
1831
|
+
return dynamic;
|
1832
|
+
},
|
1833
|
+
"in": function(ast, model, controller) {
|
1834
|
+
return Compile.bound(ast, model, controller, function(dynamic, value) {
|
1835
|
+
if (value) {
|
1836
|
+
return dynamic.replace([compileAll(ast.children, value, controller)]);
|
1837
|
+
} else {
|
1838
|
+
return dynamic.clear();
|
1839
|
+
}
|
1840
|
+
});
|
1841
|
+
},
|
1842
|
+
"if": function(ast, model, controller) {
|
1843
|
+
return Compile.bound(ast, model, controller, function(dynamic, value) {
|
1844
|
+
if (value) {
|
1845
|
+
return dynamic.replace([compileAll(ast.children, model, controller)]);
|
1846
|
+
} else if (ast["else"]) {
|
1847
|
+
return dynamic.replace([compileAll(ast["else"].children, model, controller)]);
|
1848
|
+
} else {
|
1849
|
+
return dynamic.clear();
|
1850
|
+
}
|
1851
|
+
});
|
1852
|
+
},
|
1853
|
+
unless: function(ast, model, controller) {
|
1854
|
+
return Compile.bound(ast, model, controller, function(dynamic, value) {
|
1855
|
+
var child, nodes;
|
1856
|
+
if (value) {
|
1857
|
+
return dynamic.clear();
|
1858
|
+
} else {
|
1859
|
+
nodes = (function() {
|
1860
|
+
var _i, _len, _ref, _results;
|
1861
|
+
_ref = ast.children;
|
1862
|
+
_results = [];
|
1863
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1864
|
+
child = _ref[_i];
|
1865
|
+
_results.push(compile(child, model, controller));
|
1866
|
+
}
|
1867
|
+
return _results;
|
1868
|
+
})();
|
1869
|
+
return dynamic.replace([nodes]);
|
1870
|
+
}
|
1871
|
+
});
|
1872
|
+
},
|
1873
|
+
bound: function(ast, model, controller, callback) {
|
1874
|
+
var dynamic, update;
|
1875
|
+
dynamic = new DynamicNode(ast);
|
1876
|
+
update = function() {
|
1877
|
+
var value;
|
1878
|
+
value = model[ast["arguments"][0]];
|
1879
|
+
return callback(dynamic, value);
|
1880
|
+
};
|
1881
|
+
update();
|
1882
|
+
dynamic.bindEvent(model, "change:" + ast["arguments"][0], update);
|
1883
|
+
return dynamic;
|
1884
|
+
}
|
1885
|
+
};
|
1886
|
+
|
1887
|
+
compile = function(ast, model, controller) {
|
1888
|
+
return Compile[ast.type](ast, model, controller);
|
1889
|
+
};
|
1890
|
+
|
1891
|
+
compileAll = function(asts, model, controller) {
|
1892
|
+
var ast, _i, _len, _results;
|
1893
|
+
_results = [];
|
1894
|
+
for (_i = 0, _len = asts.length; _i < _len; _i++) {
|
1895
|
+
ast = asts[_i];
|
1896
|
+
_results.push(Compile[ast.type](ast, model, controller));
|
1897
|
+
}
|
1898
|
+
return _results;
|
1899
|
+
};
|
1900
|
+
|
1901
|
+
exports.compile = compile;
|
1902
|
+
|
1903
|
+
}).call(this);
|
1904
|
+
|
1905
|
+
};require['./parser'] = new function() {
|
1906
|
+
var exports = this;
|
1907
|
+
/* Jison generated parser */
|
1908
|
+
var parser = (function(){
|
1909
|
+
;
|
1910
|
+
var parser = {trace: function trace() { },
|
1911
|
+
yy: {},
|
1912
|
+
symbols_: {"error":2,"Root":3,"Element":4,"ElementIdentifier":5,"AnyIdentifier":6,"#":7,".":8,"[":9,"]":10,"PropertyList":11,"WHITESPACE":12,"Text":13,"INDENT":14,"ChildList":15,"OUTDENT":16,"TextList":17,"Bound":18,"STRING_LITERAL":19,"Child":20,"TERMINATOR":21,"IfInstruction":22,"Instruction":23,"Property":24,"=":25,"!":26,":":27,"-":28,"VIEW":29,"COLLECTION":30,"UNLESS":31,"IN":32,"IDENTIFIER":33,"IF":34,"ElseInstruction":35,"ELSE":36,"@":37,"$accept":0,"$end":1},
|
1913
|
+
terminals_: {2:"error",7:"#",8:".",9:"[",10:"]",12:"WHITESPACE",14:"INDENT",16:"OUTDENT",19:"STRING_LITERAL",21:"TERMINATOR",25:"=",26:"!",27:":",28:"-",29:"VIEW",30:"COLLECTION",31:"UNLESS",32:"IN",33:"IDENTIFIER",34:"IF",36:"ELSE",37:"@"},
|
1914
|
+
productions_: [0,[3,0],[3,1],[5,1],[5,3],[5,2],[5,2],[5,3],[4,1],[4,3],[4,4],[4,3],[4,4],[17,1],[17,3],[13,1],[13,1],[15,1],[15,3],[20,1],[20,1],[20,1],[20,1],[11,1],[11,3],[24,3],[24,3],[24,4],[24,4],[24,3],[24,3],[23,3],[23,3],[23,3],[23,3],[23,3],[23,3],[23,4],[22,3],[22,3],[22,4],[22,2],[35,6],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[18,2],[18,1]],
|
1915
|
+
performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
|
1916
|
+
|
1917
|
+
var $0 = $$.length - 1;
|
1918
|
+
switch (yystate) {
|
1919
|
+
case 1:this.$ = null;
|
1920
|
+
break;
|
1921
|
+
case 2:return this.$
|
1922
|
+
break;
|
1923
|
+
case 3:this.$ = {
|
1924
|
+
name: $$[$0],
|
1925
|
+
classes: []
|
1926
|
+
};
|
1927
|
+
break;
|
1928
|
+
case 4:this.$ = {
|
1929
|
+
name: $$[$0-2],
|
1930
|
+
id: $$[$0],
|
1931
|
+
classes: []
|
1932
|
+
};
|
1933
|
+
break;
|
1934
|
+
case 5:this.$ = {
|
1935
|
+
name: 'div',
|
1936
|
+
id: $$[$0],
|
1937
|
+
classes: []
|
1938
|
+
};
|
1939
|
+
break;
|
1940
|
+
case 6:this.$ = {
|
1941
|
+
name: 'div',
|
1942
|
+
classes: [$$[$0]]
|
1943
|
+
};
|
1944
|
+
break;
|
1945
|
+
case 7:this.$ = (function () {
|
1946
|
+
$$[$0-2].classes.push($$[$0]);
|
1947
|
+
return $$[$0-2];
|
1948
|
+
}());
|
1949
|
+
break;
|
1950
|
+
case 8:this.$ = {
|
1951
|
+
name: $$[$0].name,
|
1952
|
+
id: $$[$0].id,
|
1953
|
+
classes: $$[$0].classes,
|
1954
|
+
properties: [],
|
1955
|
+
children: [],
|
1956
|
+
type: 'element'
|
1957
|
+
};
|
1958
|
+
break;
|
1959
|
+
case 9:this.$ = $$[$0-2];
|
1960
|
+
break;
|
1961
|
+
case 10:this.$ = (function () {
|
1962
|
+
$$[$0-3].properties = $$[$0-1];
|
1963
|
+
return $$[$0-3];
|
1964
|
+
}());
|
1965
|
+
break;
|
1966
|
+
case 11:this.$ = (function () {
|
1967
|
+
$$[$0-2].children = $$[$0-2].children.concat($$[$0]);
|
1968
|
+
return $$[$0-2];
|
1969
|
+
}());
|
1970
|
+
break;
|
1971
|
+
case 12:this.$ = (function () {
|
1972
|
+
$$[$0-3].children = $$[$0-3].children.concat($$[$0-1]);
|
1973
|
+
return $$[$0-3];
|
1974
|
+
}());
|
1975
|
+
break;
|
1976
|
+
case 13:this.$ = [$$[$0]];
|
1977
|
+
break;
|
1978
|
+
case 14:this.$ = $$[$0-2].concat($$[$0]);
|
1979
|
+
break;
|
1980
|
+
case 15:this.$ = {
|
1981
|
+
type: 'text',
|
1982
|
+
value: $$[$0],
|
1983
|
+
bound: true
|
1984
|
+
};
|
1985
|
+
break;
|
1986
|
+
case 16:this.$ = {
|
1987
|
+
type: 'text',
|
1988
|
+
value: $$[$0],
|
1989
|
+
bound: false
|
1990
|
+
};
|
1991
|
+
break;
|
1992
|
+
case 17:this.$ = [].concat($$[$0]);
|
1993
|
+
break;
|
1994
|
+
case 18:this.$ = $$[$0-2].concat($$[$0]);
|
1995
|
+
break;
|
1996
|
+
case 19:this.$ = $$[$0];
|
1997
|
+
break;
|
1998
|
+
case 20:this.$ = $$[$0];
|
1999
|
+
break;
|
2000
|
+
case 21:this.$ = $$[$0];
|
2001
|
+
break;
|
2002
|
+
case 22:this.$ = $$[$0];
|
2003
|
+
break;
|
2004
|
+
case 23:this.$ = [$$[$0]];
|
2005
|
+
break;
|
2006
|
+
case 24:this.$ = $$[$0-2].concat($$[$0]);
|
2007
|
+
break;
|
2008
|
+
case 25:this.$ = {
|
2009
|
+
name: $$[$0-2],
|
2010
|
+
value: $$[$0],
|
2011
|
+
bound: true,
|
2012
|
+
scope: 'attribute'
|
2013
|
+
};
|
2014
|
+
break;
|
2015
|
+
case 26:this.$ = {
|
2016
|
+
name: $$[$0-2],
|
2017
|
+
value: $$[$0],
|
2018
|
+
bound: true,
|
2019
|
+
scope: 'attribute'
|
2020
|
+
};
|
2021
|
+
break;
|
2022
|
+
case 27:this.$ = {
|
2023
|
+
name: $$[$0-3],
|
2024
|
+
value: $$[$0-1],
|
2025
|
+
bound: true,
|
2026
|
+
scope: 'attribute',
|
2027
|
+
preventDefault: true
|
2028
|
+
};
|
2029
|
+
break;
|
2030
|
+
case 28:this.$ = {
|
2031
|
+
name: $$[$0-3],
|
2032
|
+
value: $$[$0-1],
|
2033
|
+
bound: true,
|
2034
|
+
scope: 'attribute',
|
2035
|
+
preventDefault: true
|
2036
|
+
};
|
2037
|
+
break;
|
2038
|
+
case 29:this.$ = {
|
2039
|
+
name: $$[$0-2],
|
2040
|
+
value: $$[$0],
|
2041
|
+
bound: false,
|
2042
|
+
scope: 'attribute'
|
2043
|
+
};
|
2044
|
+
break;
|
2045
|
+
case 30:this.$ = (function () {
|
2046
|
+
$$[$0].scope = $$[$0-2];
|
2047
|
+
return $$[$0];
|
2048
|
+
}());
|
2049
|
+
break;
|
2050
|
+
case 31:this.$ = {
|
2051
|
+
"arguments": [],
|
2052
|
+
children: [],
|
2053
|
+
type: 'view'
|
2054
|
+
};
|
2055
|
+
break;
|
2056
|
+
case 32:this.$ = {
|
2057
|
+
"arguments": [],
|
2058
|
+
children: [],
|
2059
|
+
type: 'collection'
|
2060
|
+
};
|
2061
|
+
break;
|
2062
|
+
case 33:this.$ = {
|
2063
|
+
"arguments": [],
|
2064
|
+
children: [],
|
2065
|
+
type: 'unless'
|
2066
|
+
};
|
2067
|
+
break;
|
2068
|
+
case 34:this.$ = {
|
2069
|
+
"arguments": [],
|
2070
|
+
children: [],
|
2071
|
+
type: 'in'
|
2072
|
+
};
|
2073
|
+
break;
|
2074
|
+
case 35:this.$ = {
|
2075
|
+
command: $$[$0],
|
2076
|
+
"arguments": [],
|
2077
|
+
children: [],
|
2078
|
+
type: 'helper'
|
2079
|
+
};
|
2080
|
+
break;
|
2081
|
+
case 36:this.$ = (function () {
|
2082
|
+
$$[$0-2]["arguments"].push($$[$0].value);
|
2083
|
+
return $$[$0-2];
|
2084
|
+
}());
|
2085
|
+
break;
|
2086
|
+
case 37:this.$ = (function () {
|
2087
|
+
$$[$0-3].children = $$[$0-1];
|
2088
|
+
return $$[$0-3];
|
2089
|
+
}());
|
2090
|
+
break;
|
2091
|
+
case 38:this.$ = {
|
2092
|
+
"arguments": [],
|
2093
|
+
children: [],
|
2094
|
+
type: 'if'
|
2095
|
+
};
|
2096
|
+
break;
|
2097
|
+
case 39:this.$ = (function () {
|
2098
|
+
$$[$0-2]["arguments"].push($$[$0].value);
|
2099
|
+
return $$[$0-2];
|
2100
|
+
}());
|
2101
|
+
break;
|
2102
|
+
case 40:this.$ = (function () {
|
2103
|
+
$$[$0-3].children = $$[$0-1];
|
2104
|
+
return $$[$0-3];
|
2105
|
+
}());
|
2106
|
+
break;
|
2107
|
+
case 41:this.$ = (function () {
|
2108
|
+
$$[$0-1]["else"] = $$[$0];
|
2109
|
+
return $$[$0-1];
|
2110
|
+
}());
|
2111
|
+
break;
|
2112
|
+
case 42:this.$ = {
|
2113
|
+
"arguments": [],
|
2114
|
+
children: $$[$0-1],
|
2115
|
+
type: 'else'
|
2116
|
+
};
|
2117
|
+
break;
|
2118
|
+
case 43:this.$ = $$[$0];
|
2119
|
+
break;
|
2120
|
+
case 44:this.$ = $$[$0];
|
2121
|
+
break;
|
2122
|
+
case 45:this.$ = $$[$0];
|
2123
|
+
break;
|
2124
|
+
case 46:this.$ = $$[$0];
|
2125
|
+
break;
|
2126
|
+
case 47:this.$ = $$[$0];
|
2127
|
+
break;
|
2128
|
+
case 48:this.$ = $$[$0];
|
2129
|
+
break;
|
2130
|
+
case 49:this.$ = $$[$0];
|
2131
|
+
break;
|
2132
|
+
case 50:this.$ = (function () {}());
|
2133
|
+
break;
|
2134
|
+
}
|
2135
|
+
},
|
2136
|
+
table: [{1:[2,1],3:1,4:2,5:3,6:4,7:[1,5],8:[1,6],29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9]},{1:[3]},{1:[2,2],9:[1,13],12:[1,14],14:[1,15]},{1:[2,8],8:[1,16],9:[2,8],12:[2,8],14:[2,8],16:[2,8],21:[2,8]},{1:[2,3],7:[1,17],8:[2,3],9:[2,3],12:[2,3],14:[2,3],16:[2,3],21:[2,3]},{6:18,29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9]},{6:19,29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9]},{1:[2,43],7:[2,43],8:[2,43],9:[2,43],10:[2,43],12:[2,43],14:[2,43],16:[2,43],21:[2,43],25:[2,43],26:[2,43],27:[2,43],28:[2,43]},{1:[2,44],7:[2,44],8:[2,44],9:[2,44],10:[2,44],12:[2,44],14:[2,44],16:[2,44],21:[2,44],25:[2,44],26:[2,44],27:[2,44],28:[2,44]},{1:[2,45],7:[2,45],8:[2,45],9:[2,45],10:[2,45],12:[2,45],14:[2,45],16:[2,45],21:[2,45],25:[2,45],26:[2,45],27:[2,45],28:[2,45]},{1:[2,46],7:[2,46],8:[2,46],9:[2,46],10:[2,46],12:[2,46],14:[2,46],16:[2,46],21:[2,46],25:[2,46],26:[2,46],27:[2,46],28:[2,46]},{1:[2,47],7:[2,47],8:[2,47],9:[2,47],10:[2,47],12:[2,47],14:[2,47],16:[2,47],21:[2,47],25:[2,47],26:[2,47],27:[2,47],28:[2,47]},{1:[2,48],7:[2,48],8:[2,48],9:[2,48],10:[2,48],12:[2,48],14:[2,48],16:[2,48],21:[2,48],25:[2,48],26:[2,48],27:[2,48],28:[2,48]},{6:23,10:[1,20],11:21,24:22,29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9]},{13:24,18:25,19:[1,26],37:[1,27]},{4:30,5:3,6:4,7:[1,5],8:[1,6],13:35,15:28,17:33,18:25,19:[1,26],20:29,22:31,23:32,28:[1,34],29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9],37:[1,27]},{6:36,29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9]},{6:37,29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9]},{1:[2,5],8:[2,5],9:[2,5],12:[2,5],14:[2,5],16:[2,5],21:[2,5]},{1:[2,6],8:[2,6],9:[2,6],12:[2,6],14:[2,6],16:[2,6],21:[2,6]},{1:[2,9],9:[2,9],12:[2,9],14:[2,9],16:[2,9],21:[2,9]},{10:[1,38],12:[1,39]},{10:[2,23],12:[2,23]},{25:[1,40],27:[1,41]},{1:[2,11],9:[2,11],12:[2,11],14:[2,11],16:[2,11],21:[2,11]},{1:[2,15],9:[2,15],12:[2,15],14:[2,15],16:[2,15],21:[2,15],28:[2,15]},{1:[2,16],9:[2,16],12:[2,16],14:[2,16],16:[2,16],21:[2,16],28:[2,16]},{1:[2,50],6:42,9:[2,50],10:[2,50],12:[2,50],14:[2,50],16:[2,50],21:[2,50],26:[2,50],28:[2,50],29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9]},{16:[1,43],21:[1,44]},{16:[2,17],21:[2,17]},{9:[1,13],12:[1,14],14:[1,15],16:[2,19],21:[2,19]},{12:[1,45],14:[1,46],16:[2,20],21:[2,20],28:[1,48],35:47},{12:[1,49],14:[1,50],16:[2,21],21:[2,21]},{12:[1,51],16:[2,22],21:[2,22]},{12:[1,52]},{12:[2,13],16:[2,13],21:[2,13]},{1:[2,7],8:[2,7],9:[2,7],12:[2,7],14:[2,7],16:[2,7],21:[2,7]},{1:[2,4],8:[2,4],9:[2,4],12:[2,4],14:[2,4],16:[2,4],21:[2,4]},{1:[2,10],9:[2,10],12:[2,10],14:[2,10],16:[2,10],21:[2,10]},{6:23,24:53,29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9]},{6:54,18:55,19:[1,56],29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9],37:[1,27]},{6:23,24:57,29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9]},{1:[2,49],9:[2,49],10:[2,49],12:[2,49],14:[2,49],16:[2,49],21:[2,49],26:[2,49],28:[2,49]},{1:[2,12],9:[2,12],12:[2,12],14:[2,12],16:[2,12],21:[2,12]},{4:30,5:3,6:4,7:[1,5],8:[1,6],13:35,17:33,18:25,19:[1,26],20:58,22:31,23:32,28:[1,34],29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9],37:[1,27]},{13:59,18:25,19:[1,26],37:[1,27]},{4:30,5:3,6:4,7:[1,5],8:[1,6],13:35,15:60,17:33,18:25,19:[1,26],20:29,22:31,23:32,28:[1,34],29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9],37:[1,27]},{12:[2,41],14:[2,41],16:[2,41],21:[2,41],28:[2,41]},{12:[1,61]},{13:62,18:25,19:[1,26],37:[1,27]},{4:30,5:3,6:4,7:[1,5],8:[1,6],13:35,15:63,17:33,18:25,19:[1,26],20:29,22:31,23:32,28:[1,34],29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9],37:[1,27]},{13:64,18:25,19:[1,26],37:[1,27]},{29:[1,66],30:[1,67],31:[1,68],32:[1,69],33:[1,70],34:[1,65]},{10:[2,24],12:[2,24]},{10:[2,25],12:[2,25],26:[1,71]},{10:[2,26],12:[2,26],26:[1,72]},{10:[2,29],12:[2,29]},{10:[2,30],12:[2,30]},{16:[2,18],21:[2,18]},{12:[2,39],14:[2,39],16:[2,39],21:[2,39],28:[2,39]},{16:[1,73],21:[1,44]},{36:[1,74]},{12:[2,36],14:[2,36],16:[2,36],21:[2,36]},{16:[1,75],21:[1,44]},{12:[2,14],16:[2,14],21:[2,14]},{12:[2,38],14:[2,38],16:[2,38],21:[2,38],28:[2,38]},{12:[2,31],14:[2,31],16:[2,31],21:[2,31]},{12:[2,32],14:[2,32],16:[2,32],21:[2,32]},{12:[2,33],14:[2,33],16:[2,33],21:[2,33]},{12:[2,34],14:[2,34],16:[2,34],21:[2,34]},{12:[2,35],14:[2,35],16:[2,35],21:[2,35]},{10:[2,27],12:[2,27]},{10:[2,28],12:[2,28]},{12:[2,40],14:[2,40],16:[2,40],21:[2,40],28:[2,40]},{14:[1,76]},{12:[2,37],14:[2,37],16:[2,37],21:[2,37]},{4:30,5:3,6:4,7:[1,5],8:[1,6],13:35,15:77,17:33,18:25,19:[1,26],20:29,22:31,23:32,28:[1,34],29:[1,7],30:[1,8],31:[1,10],32:[1,11],33:[1,12],34:[1,9],37:[1,27]},{16:[1,78],21:[1,44]},{12:[2,42],14:[2,42],16:[2,42],21:[2,42],28:[2,42]}],
|
2137
|
+
defaultActions: {},
|
2138
|
+
parseError: function parseError(str, hash) {
|
2139
|
+
throw new Error(str);
|
2140
|
+
},
|
2141
|
+
parse: function parse(input) {
|
2142
|
+
var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
2143
|
+
this.lexer.setInput(input);
|
2144
|
+
this.lexer.yy = this.yy;
|
2145
|
+
this.yy.lexer = this.lexer;
|
2146
|
+
if (typeof this.lexer.yylloc == "undefined")
|
2147
|
+
this.lexer.yylloc = {};
|
2148
|
+
var yyloc = this.lexer.yylloc;
|
2149
|
+
lstack.push(yyloc);
|
2150
|
+
if (typeof this.yy.parseError === "function")
|
2151
|
+
this.parseError = this.yy.parseError;
|
2152
|
+
function popStack(n) {
|
2153
|
+
stack.length = stack.length - 2 * n;
|
2154
|
+
vstack.length = vstack.length - n;
|
2155
|
+
lstack.length = lstack.length - n;
|
2156
|
+
}
|
2157
|
+
function lex() {
|
2158
|
+
var token;
|
2159
|
+
token = self.lexer.lex() || 1;
|
2160
|
+
if (typeof token !== "number") {
|
2161
|
+
token = self.symbols_[token] || token;
|
2162
|
+
}
|
2163
|
+
return token;
|
2164
|
+
}
|
2165
|
+
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
2166
|
+
while (true) {
|
2167
|
+
state = stack[stack.length - 1];
|
2168
|
+
if (this.defaultActions[state]) {
|
2169
|
+
action = this.defaultActions[state];
|
2170
|
+
} else {
|
2171
|
+
if (symbol == null)
|
2172
|
+
symbol = lex();
|
2173
|
+
action = table[state] && table[state][symbol];
|
2174
|
+
}
|
2175
|
+
if (typeof action === "undefined" || !action.length || !action[0]) {
|
2176
|
+
if (!recovering) {
|
2177
|
+
expected = [];
|
2178
|
+
for (p in table[state])
|
2179
|
+
if (this.terminals_[p] && p > 2) {
|
2180
|
+
expected.push("'" + this.terminals_[p] + "'");
|
2181
|
+
}
|
2182
|
+
var errStr = "";
|
2183
|
+
if (this.lexer.showPosition) {
|
2184
|
+
errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + this.terminals_[symbol] + "'";
|
2185
|
+
} else {
|
2186
|
+
errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'");
|
2187
|
+
}
|
2188
|
+
this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
|
2189
|
+
}
|
2190
|
+
}
|
2191
|
+
if (action[0] instanceof Array && action.length > 1) {
|
2192
|
+
throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
|
2193
|
+
}
|
2194
|
+
switch (action[0]) {
|
2195
|
+
case 1:
|
2196
|
+
stack.push(symbol);
|
2197
|
+
vstack.push(this.lexer.yytext);
|
2198
|
+
lstack.push(this.lexer.yylloc);
|
2199
|
+
stack.push(action[1]);
|
2200
|
+
symbol = null;
|
2201
|
+
if (!preErrorSymbol) {
|
2202
|
+
yyleng = this.lexer.yyleng;
|
2203
|
+
yytext = this.lexer.yytext;
|
2204
|
+
yylineno = this.lexer.yylineno;
|
2205
|
+
yyloc = this.lexer.yylloc;
|
2206
|
+
if (recovering > 0)
|
2207
|
+
recovering--;
|
2208
|
+
} else {
|
2209
|
+
symbol = preErrorSymbol;
|
2210
|
+
preErrorSymbol = null;
|
2211
|
+
}
|
2212
|
+
break;
|
2213
|
+
case 2:
|
2214
|
+
len = this.productions_[action[1]][1];
|
2215
|
+
yyval.$ = vstack[vstack.length - len];
|
2216
|
+
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};
|
2217
|
+
r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
|
2218
|
+
if (typeof r !== "undefined") {
|
2219
|
+
return r;
|
2220
|
+
}
|
2221
|
+
if (len) {
|
2222
|
+
stack = stack.slice(0, -1 * len * 2);
|
2223
|
+
vstack = vstack.slice(0, -1 * len);
|
2224
|
+
lstack = lstack.slice(0, -1 * len);
|
2225
|
+
}
|
2226
|
+
stack.push(this.productions_[action[1]][0]);
|
2227
|
+
vstack.push(yyval.$);
|
2228
|
+
lstack.push(yyval._$);
|
2229
|
+
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
2230
|
+
stack.push(newState);
|
2231
|
+
break;
|
2232
|
+
case 3:
|
2233
|
+
return true;
|
2234
|
+
}
|
2235
|
+
}
|
2236
|
+
return true;
|
2237
|
+
}
|
2238
|
+
};
|
2239
|
+
return parser;
|
2240
|
+
})();
|
2241
|
+
if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
|
2242
|
+
exports.parser = parser;
|
2243
|
+
exports.parse = function () { return parser.parse.apply(parser, arguments); }
|
2244
|
+
exports.main = function commonjsMain(args) {
|
2245
|
+
if (!args[1])
|
2246
|
+
throw new Error('Usage: '+args[0]+' FILE');
|
2247
|
+
if (typeof process !== 'undefined') {
|
2248
|
+
var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), "utf8");
|
2249
|
+
} else {
|
2250
|
+
var cwd = require("file").path(require("file").cwd());
|
2251
|
+
var source = cwd.join(args[1]).read({charset: "utf-8"});
|
2252
|
+
}
|
2253
|
+
return exports.parser.parse(source);
|
2254
|
+
}
|
2255
|
+
if (typeof module !== 'undefined' && require.main === module) {
|
2256
|
+
exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args);
|
2257
|
+
}
|
2258
|
+
}
|
2259
|
+
};require['./view'] = new function() {
|
2260
|
+
var exports = this;
|
2261
|
+
(function() {
|
2262
|
+
var Lexer, Serenade, View, compile, parser,
|
2263
|
+
__slice = [].slice;
|
2264
|
+
|
2265
|
+
parser = require('./parser').parser;
|
2266
|
+
|
2267
|
+
Lexer = require('./lexer').Lexer;
|
2268
|
+
|
2269
|
+
compile = require('./compile').compile;
|
2270
|
+
|
2271
|
+
Serenade = require('./serenade').Serenade;
|
2272
|
+
|
2273
|
+
parser.lexer = {
|
2274
|
+
lex: function() {
|
2275
|
+
var tag, _ref;
|
2276
|
+
_ref = this.tokens[this.pos++] || [''], tag = _ref[0], this.yytext = _ref[1], this.yylineno = _ref[2];
|
2277
|
+
return tag;
|
2278
|
+
},
|
2279
|
+
setInput: function(tokens) {
|
2280
|
+
this.tokens = tokens;
|
2281
|
+
return this.pos = 0;
|
2282
|
+
},
|
2283
|
+
upcomingInput: function() {
|
2284
|
+
return "";
|
2285
|
+
}
|
2286
|
+
};
|
2287
|
+
|
2288
|
+
View = (function() {
|
2289
|
+
|
2290
|
+
View.name = 'View';
|
2291
|
+
|
2292
|
+
function View(name, view) {
|
2293
|
+
this.name = name;
|
2294
|
+
this.view = view;
|
2295
|
+
}
|
2296
|
+
|
2297
|
+
View.prototype.parse = function() {
|
2298
|
+
if (typeof this.view === 'string') {
|
2299
|
+
try {
|
2300
|
+
return this.view = parser.parse(new Lexer().tokenize(this.view));
|
2301
|
+
} catch (e) {
|
2302
|
+
if (this.name) {
|
2303
|
+
e.message = "In view '" + this.name + "': " + e.message;
|
2304
|
+
}
|
2305
|
+
throw e;
|
2306
|
+
}
|
2307
|
+
} else {
|
2308
|
+
return this.view;
|
2309
|
+
}
|
2310
|
+
};
|
2311
|
+
|
2312
|
+
View.prototype.render = function() {
|
2313
|
+
var args;
|
2314
|
+
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
2315
|
+
return this.node.apply(this, args).element;
|
2316
|
+
};
|
2317
|
+
|
2318
|
+
View.prototype.node = function(model, controller, parent, skipCallback) {
|
2319
|
+
var node;
|
2320
|
+
if (this.name) {
|
2321
|
+
controller || (controller = Serenade.controllerFor(this.name, model));
|
2322
|
+
}
|
2323
|
+
controller || (controller = {});
|
2324
|
+
if (typeof controller === "function") {
|
2325
|
+
controller = new controller(model, parent);
|
2326
|
+
}
|
2327
|
+
node = compile(this.parse(), model, controller);
|
2328
|
+
if (!skipCallback) {
|
2329
|
+
if (typeof controller.loaded === "function") {
|
2330
|
+
controller.loaded(model, node.element);
|
2331
|
+
}
|
2332
|
+
}
|
2333
|
+
return node;
|
2334
|
+
};
|
2335
|
+
|
2336
|
+
return View;
|
2337
|
+
|
2338
|
+
})();
|
2339
|
+
|
2340
|
+
exports.View = View;
|
2341
|
+
|
2342
|
+
}).call(this);
|
2343
|
+
|
2344
|
+
};
|
2345
|
+
return require['./serenade'].Serenade
|
2346
|
+
}();
|
2347
|
+
|
2348
|
+
if(typeof define === 'function' && define.amd) {
|
2349
|
+
define(function() { return Serenade });
|
2350
|
+
} else { root.Serenade = Serenade }
|
2351
|
+
}(this));
|