rivets-rails 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
- TAG=v0.5.7
1
+ TAG=v0.5.10
2
2
  curl -s -o dist/rivets.js https://raw.github.com/mikeric/rivets/$TAG/dist/rivets.js
3
3
  curl -s -o dist/rivets.min.js https://raw.github.com/mikeric/rivets/$TAG/dist/rivets.min.js
@@ -1,5 +1,5 @@
1
1
  // rivets.custom_by_vkill.js
2
- // version: 0.1.0
2
+ // version: 0.1.1
3
3
  // author: vkill
4
4
  // license: MIT
5
5
  (function() {
@@ -1,5 +1,5 @@
1
1
  // rivets.custom_by_vkill.js
2
- // version: 0.1.0
2
+ // version: 0.1.1
3
3
  // author: vkill
4
4
  // license: MIT
5
5
  !function(){var a;a=this.rivets,a.configure({prefix:"bind"})}.call(this),function(){var a;a=this.rivets,a.binders.content={routine:a.binders.text,bind:function(b){var c;return c=this,this.callback=function(){return a.config.adapter.publish(c.model,c.keypath,b.textContent)},b.addEventListener("input",this.callback,!1)},unbind:function(a){return a.removeEventListener("input",this.callback,!1)}}}.call(this),function(){var a;a=this.rivets,a.formatters.shortdate=function(a){return moment(a).format("YYYY-MM-DD")},a.formatters.number=function(a){return+a},a.formatters.string=function(a){return String(a)},a.formatters.negate=function(a){return!a},a.formatters.eq=function(a,b){return a===b},a.formatters.not_eq=function(a,b){return a!==b},a.formatters.gt=function(a,b){return a>b},a.formatters.lt=function(a,b){return b>a},a.formatters.blank=function(a){return null==a||""===a},a.formatters.preventDefault=function(a){return function(b){return b.preventDefault(),a.call(this,b),!1}},a.formatters.length=function(a){return a.length}}.call(this),function(){var a;a=this.rivets,a.configure({adapter:{subscribe:function(a,b,c){return null!=a.on?a.on("change:"+b,c):void 0},unsubscribe:function(a,b,c){return null!=a.off?a.off("change:"+b,c):void 0},read:function(a,b){return a[b]},publish:function(a,b,c){return a[b]=c}}})}.call(this);
@@ -1,11 +1,13 @@
1
1
  // Rivets.js
2
- // version: 0.5.7
2
+ // version: 0.5.10
3
3
  // author: Michael Richards
4
4
  // license: MIT
5
5
  (function() {
6
6
  var Rivets,
7
7
  __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
8
8
  __slice = [].slice,
9
+ __hasProp = {}.hasOwnProperty,
10
+ __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; },
9
11
  __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; };
10
12
 
11
13
  Rivets = {};
@@ -34,7 +36,7 @@
34
36
  this.set = __bind(this.set, this);
35
37
  this.eventHandler = __bind(this.eventHandler, this);
36
38
  this.formattedValue = __bind(this.formattedValue, this);
37
- if (!(this.binder = this.view.binders[type])) {
39
+ if (!(this.binder = Rivets.internalBinders[this.type] || this.view.binders[type])) {
38
40
  _ref = this.view.binders;
39
41
  for (identifier in _ref) {
40
42
  value = _ref[identifier];
@@ -173,16 +175,115 @@
173
175
  }
174
176
  };
175
177
 
176
- Binding.prototype.update = function() {
177
- this.unbind();
178
- this.model = this.key ? this.view.models[this.key] : this.view.models;
179
- return this.bind();
178
+ Binding.prototype.update = function(models) {
179
+ var _ref;
180
+
181
+ if (models == null) {
182
+ models = {};
183
+ }
184
+ if (this.key) {
185
+ if (models[this.key]) {
186
+ if (!this.options.bypass) {
187
+ this.view.config.adapter.unsubscribe(this.model, this.keypath, this.sync);
188
+ }
189
+ this.model = models[this.key];
190
+ if (this.options.bypass) {
191
+ this.sync();
192
+ } else {
193
+ this.view.config.adapter.subscribe(this.model, this.keypath, this.sync);
194
+ if (this.view.config.preloadData) {
195
+ this.sync();
196
+ }
197
+ }
198
+ }
199
+ } else {
200
+ this.sync();
201
+ }
202
+ return (_ref = this.binder.update) != null ? _ref.call(this, models) : void 0;
180
203
  };
181
204
 
182
205
  return Binding;
183
206
 
184
207
  })();
185
208
 
209
+ Rivets.ComponentBinding = (function(_super) {
210
+ __extends(ComponentBinding, _super);
211
+
212
+ function ComponentBinding(view, el, type) {
213
+ var attribute, _i, _len, _ref, _ref1;
214
+
215
+ this.view = view;
216
+ this.el = el;
217
+ this.type = type;
218
+ this.unbind = __bind(this.unbind, this);
219
+ this.bind = __bind(this.bind, this);
220
+ this.update = __bind(this.update, this);
221
+ this.locals = __bind(this.locals, this);
222
+ this.component = Rivets.components[this.type];
223
+ this.attributes = {};
224
+ this.inflections = {};
225
+ _ref = this.el.attributes || [];
226
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
227
+ attribute = _ref[_i];
228
+ if (_ref1 = attribute.name, __indexOf.call(this.component.attributes, _ref1) >= 0) {
229
+ this.attributes[attribute.name] = attribute.value;
230
+ } else {
231
+ this.inflections[attribute.name] = attribute.value;
232
+ }
233
+ }
234
+ }
235
+
236
+ ComponentBinding.prototype.sync = function() {};
237
+
238
+ ComponentBinding.prototype.locals = function(models) {
239
+ var inverse, key, model, result, _ref, _ref1;
240
+
241
+ if (models == null) {
242
+ models = this.view.models;
243
+ }
244
+ result = {};
245
+ _ref = this.inflections;
246
+ for (key in _ref) {
247
+ inverse = _ref[key];
248
+ result[key] = models[inverse];
249
+ }
250
+ for (key in models) {
251
+ model = models[key];
252
+ if ((_ref1 = result[key]) == null) {
253
+ result[key] = model;
254
+ }
255
+ }
256
+ return result;
257
+ };
258
+
259
+ ComponentBinding.prototype.update = function(models) {
260
+ var _ref;
261
+
262
+ return (_ref = this.componentView) != null ? _ref.update(this.locals(models)) : void 0;
263
+ };
264
+
265
+ ComponentBinding.prototype.bind = function() {
266
+ var el, _ref;
267
+
268
+ if (this.componentView != null) {
269
+ return (_ref = this.componentView) != null ? _ref.bind() : void 0;
270
+ } else {
271
+ el = this.component.build.call(this.attributes);
272
+ (this.componentView = new Rivets.View(el, this.locals(), this.view.options)).bind();
273
+ return this.el.parentNode.replaceChild(el, this.el);
274
+ }
275
+ };
276
+
277
+ ComponentBinding.prototype.unbind = function() {
278
+ var _ref;
279
+
280
+ return (_ref = this.componentView) != null ? _ref.unbind() : void 0;
281
+ };
282
+
283
+ return ComponentBinding;
284
+
285
+ })(Rivets.Binding);
286
+
186
287
  Rivets.View = (function() {
187
288
  function View(els, models, options) {
188
289
  var k, option, v, _base, _i, _len, _ref, _ref1, _ref2, _ref3;
@@ -197,6 +298,7 @@
197
298
  this.bind = __bind(this.bind, this);
198
299
  this.select = __bind(this.select, this);
199
300
  this.build = __bind(this.build, this);
301
+ this.componentRegExp = __bind(this.componentRegExp, this);
200
302
  this.bindingRegExp = __bind(this.bindingRegExp, this);
201
303
  if (!(this.els.jquery || this.els instanceof Array)) {
202
304
  this.els = [this.els];
@@ -234,108 +336,144 @@
234
336
  }
235
337
  };
236
338
 
339
+ View.prototype.componentRegExp = function() {
340
+ var _ref, _ref1;
341
+
342
+ return new RegExp("^" + ((_ref = (_ref1 = this.config.prefix) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : 'RV') + "-");
343
+ };
344
+
237
345
  View.prototype.build = function() {
238
- var bindingRegExp, el, node, parse, skipNodes, _i, _j, _len, _len1, _ref, _ref1,
346
+ var bindingRegExp, buildBinding, componentRegExp, el, parse, skipNodes, _i, _len, _ref,
239
347
  _this = this;
240
348
 
241
349
  this.bindings = [];
242
350
  skipNodes = [];
243
351
  bindingRegExp = this.bindingRegExp();
352
+ componentRegExp = this.componentRegExp();
353
+ buildBinding = function(node, type, declaration) {
354
+ var context, ctx, dependencies, key, keypath, options, path, pipe, pipes, splitPath;
355
+
356
+ options = {};
357
+ pipes = (function() {
358
+ var _i, _len, _ref, _results;
359
+
360
+ _ref = declaration.split('|');
361
+ _results = [];
362
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
363
+ pipe = _ref[_i];
364
+ _results.push(pipe.trim());
365
+ }
366
+ return _results;
367
+ })();
368
+ context = (function() {
369
+ var _i, _len, _ref, _results;
370
+
371
+ _ref = pipes.shift().split('<');
372
+ _results = [];
373
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
374
+ ctx = _ref[_i];
375
+ _results.push(ctx.trim());
376
+ }
377
+ return _results;
378
+ })();
379
+ path = context.shift();
380
+ splitPath = path.split(/\.|:/);
381
+ options.formatters = pipes;
382
+ options.bypass = path.indexOf(':') !== -1;
383
+ if (splitPath[0]) {
384
+ key = splitPath.shift();
385
+ } else {
386
+ key = null;
387
+ splitPath.shift();
388
+ }
389
+ keypath = splitPath.join('.');
390
+ if (dependencies = context.shift()) {
391
+ options.dependencies = dependencies.split(/\s+/);
392
+ }
393
+ return _this.bindings.push(new Rivets.Binding(_this, node, type, key, keypath, options));
394
+ };
244
395
  parse = function(node) {
245
- var attribute, attributes, binder, context, ctx, dependencies, identifier, key, keypath, n, options, path, pipe, pipes, regexp, splitPath, type, value, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3;
396
+ var attribute, attributes, binder, childNode, delimiters, identifier, n, parser, regexp, restTokens, startToken, text, token, tokens, type, value, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4, _results;
246
397
 
247
398
  if (__indexOf.call(skipNodes, node) < 0) {
248
- _ref = node.attributes;
249
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
250
- attribute = _ref[_i];
251
- if (bindingRegExp.test(attribute.name)) {
252
- type = attribute.name.replace(bindingRegExp, '');
253
- if (!(binder = _this.binders[type])) {
254
- _ref1 = _this.binders;
255
- for (identifier in _ref1) {
256
- value = _ref1[identifier];
257
- if (identifier !== '*' && identifier.indexOf('*') !== -1) {
258
- regexp = new RegExp("^" + (identifier.replace('*', '.+')) + "$");
259
- if (regexp.test(type)) {
260
- binder = value;
399
+ if (node.nodeType === Node.TEXT_NODE) {
400
+ parser = Rivets.TextTemplateParser;
401
+ if (delimiters = _this.config.templateDelimiters) {
402
+ if ((tokens = parser.parse(node.data, delimiters)).length) {
403
+ if (!(tokens.length === 1 && tokens[0].type === parser.types.text)) {
404
+ startToken = tokens[0], restTokens = 2 <= tokens.length ? __slice.call(tokens, 1) : [];
405
+ node.data = startToken.value;
406
+ switch (startToken.type) {
407
+ case 0:
408
+ node.data = startToken.value;
409
+ break;
410
+ case 1:
411
+ buildBinding(node, 'textNode', startToken.value);
412
+ }
413
+ for (_i = 0, _len = restTokens.length; _i < _len; _i++) {
414
+ token = restTokens[_i];
415
+ node.parentNode.appendChild((text = document.createTextNode(token.value)));
416
+ if (token.type === 1) {
417
+ buildBinding(text, 'textNode', token.value);
261
418
  }
262
419
  }
263
420
  }
264
421
  }
265
- binder || (binder = _this.binders['*']);
266
- if (binder.block) {
267
- _ref2 = node.getElementsByTagName('*');
268
- for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
269
- n = _ref2[_j];
270
- skipNodes.push(n);
271
- }
272
- attributes = [attribute];
273
- }
274
422
  }
275
- }
276
- _ref3 = attributes || node.attributes;
277
- for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
278
- attribute = _ref3[_k];
279
- if (bindingRegExp.test(attribute.name)) {
280
- options = {};
281
- type = attribute.name.replace(bindingRegExp, '');
282
- pipes = (function() {
283
- var _l, _len3, _ref4, _results;
284
-
285
- _ref4 = attribute.value.split('|');
286
- _results = [];
287
- for (_l = 0, _len3 = _ref4.length; _l < _len3; _l++) {
288
- pipe = _ref4[_l];
289
- _results.push(pipe.trim());
423
+ } else if (componentRegExp.test(node.tagName)) {
424
+ type = node.tagName.replace(componentRegExp, '').toLowerCase();
425
+ _this.bindings.push(new Rivets.ComponentBinding(_this, node, type));
426
+ } else if (node.attributes != null) {
427
+ _ref = node.attributes;
428
+ for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
429
+ attribute = _ref[_j];
430
+ if (bindingRegExp.test(attribute.name)) {
431
+ type = attribute.name.replace(bindingRegExp, '');
432
+ if (!(binder = _this.binders[type])) {
433
+ _ref1 = _this.binders;
434
+ for (identifier in _ref1) {
435
+ value = _ref1[identifier];
436
+ if (identifier !== '*' && identifier.indexOf('*') !== -1) {
437
+ regexp = new RegExp("^" + (identifier.replace('*', '.+')) + "$");
438
+ if (regexp.test(type)) {
439
+ binder = value;
440
+ }
441
+ }
442
+ }
290
443
  }
291
- return _results;
292
- })();
293
- context = (function() {
294
- var _l, _len3, _ref4, _results;
295
-
296
- _ref4 = pipes.shift().split('<');
297
- _results = [];
298
- for (_l = 0, _len3 = _ref4.length; _l < _len3; _l++) {
299
- ctx = _ref4[_l];
300
- _results.push(ctx.trim());
444
+ binder || (binder = _this.binders['*']);
445
+ if (binder.block) {
446
+ _ref2 = node.childNodes;
447
+ for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
448
+ n = _ref2[_k];
449
+ skipNodes.push(n);
450
+ }
451
+ attributes = [attribute];
301
452
  }
302
- return _results;
303
- })();
304
- path = context.shift();
305
- splitPath = path.split(/\.|:/);
306
- options.formatters = pipes;
307
- options.bypass = path.indexOf(':') !== -1;
308
- if (splitPath[0]) {
309
- key = splitPath.shift();
310
- } else {
311
- key = null;
312
- splitPath.shift();
313
453
  }
314
- keypath = splitPath.join('.');
315
- if (!key || (_this.models[key] != null)) {
316
- if (dependencies = context.shift()) {
317
- options.dependencies = dependencies.split(/\s+/);
318
- }
319
- _this.bindings.push(new Rivets.Binding(_this, node, type, key, keypath, options));
454
+ }
455
+ _ref3 = attributes || node.attributes;
456
+ for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
457
+ attribute = _ref3[_l];
458
+ if (bindingRegExp.test(attribute.name)) {
459
+ type = attribute.name.replace(bindingRegExp, '');
460
+ buildBinding(node, type, attribute.value);
320
461
  }
321
462
  }
322
463
  }
323
- if (attributes) {
324
- attributes = null;
464
+ _ref4 = node.childNodes;
465
+ _results = [];
466
+ for (_m = 0, _len4 = _ref4.length; _m < _len4; _m++) {
467
+ childNode = _ref4[_m];
468
+ _results.push(parse(childNode));
325
469
  }
470
+ return _results;
326
471
  }
327
472
  };
328
473
  _ref = this.els;
329
474
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
330
475
  el = _ref[_i];
331
476
  parse(el);
332
- _ref1 = el.getElementsByTagName('*');
333
- for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
334
- node = _ref1[_j];
335
- if (node.attributes != null) {
336
- parse(node);
337
- }
338
- }
339
477
  }
340
478
  };
341
479
 
@@ -404,33 +542,85 @@
404
542
  };
405
543
 
406
544
  View.prototype.update = function(models) {
407
- var binding, key, model, _results;
545
+ var binding, key, model, _i, _len, _ref, _results;
408
546
 
409
547
  if (models == null) {
410
548
  models = {};
411
549
  }
412
- _results = [];
413
550
  for (key in models) {
414
551
  model = models[key];
415
552
  this.models[key] = model;
416
- _results.push((function() {
417
- var _i, _len, _ref, _results1;
553
+ }
554
+ _ref = this.bindings;
555
+ _results = [];
556
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
557
+ binding = _ref[_i];
558
+ _results.push(binding.update(models));
559
+ }
560
+ return _results;
561
+ };
562
+
563
+ return View;
564
+
565
+ })();
566
+
567
+ Rivets.TextTemplateParser = (function() {
568
+ function TextTemplateParser() {}
418
569
 
419
- _ref = this.select(function(b) {
420
- return b.key === key;
570
+ TextTemplateParser.types = {
571
+ text: 0,
572
+ binding: 1
573
+ };
574
+
575
+ TextTemplateParser.parse = function(template, delimiters) {
576
+ var index, lastIndex, lastToken, length, substring, tokens, value;
577
+
578
+ tokens = [];
579
+ length = template.length;
580
+ index = 0;
581
+ lastIndex = 0;
582
+ while (lastIndex < length) {
583
+ index = template.indexOf(delimiters[0], lastIndex);
584
+ if (index < 0) {
585
+ tokens.push({
586
+ type: this.types.text,
587
+ value: template.slice(lastIndex)
421
588
  });
422
- _results1 = [];
423
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
424
- binding = _ref[_i];
425
- _results1.push(binding.update());
589
+ break;
590
+ } else {
591
+ if (index > 0 && lastIndex < index) {
592
+ tokens.push({
593
+ type: this.types.text,
594
+ value: template.slice(lastIndex, index)
595
+ });
426
596
  }
427
- return _results1;
428
- }).call(this));
597
+ lastIndex = index + 2;
598
+ index = template.indexOf(delimiters[1], lastIndex);
599
+ if (index < 0) {
600
+ substring = template.slice(lastIndex - 2);
601
+ lastToken = tokens[tokens.length - 1];
602
+ if ((lastToken != null ? lastToken.type : void 0) === this.types.text) {
603
+ lastToken.value += substring;
604
+ } else {
605
+ tokens.push({
606
+ type: this.types.text,
607
+ value: substring
608
+ });
609
+ }
610
+ break;
611
+ }
612
+ value = template.slice(lastIndex, index).trim();
613
+ tokens.push({
614
+ type: this.types.binding,
615
+ value: value
616
+ });
617
+ lastIndex = index + 2;
618
+ }
429
619
  }
430
- return _results;
620
+ return tokens;
431
621
  };
432
622
 
433
- return View;
623
+ return TextTemplateParser;
434
624
 
435
625
  })();
436
626
 
@@ -610,7 +800,7 @@
610
800
  routine: function(el, value) {
611
801
  var key, model, models, options, _ref;
612
802
 
613
- if (value === (this.nested == null)) {
803
+ if (!!value === (this.nested == null)) {
614
804
  if (value) {
615
805
  models = {};
616
806
  _ref = this.view.models;
@@ -631,6 +821,9 @@
631
821
  return delete this.nested;
632
822
  }
633
823
  }
824
+ },
825
+ update: function(models) {
826
+ return this.nested.update(models);
634
827
  }
635
828
  },
636
829
  unless: {
@@ -643,6 +836,9 @@
643
836
  },
644
837
  routine: function(el, value) {
645
838
  return Rivets.binders["if"].routine.call(this, el, !value);
839
+ },
840
+ update: function(models) {
841
+ return Rivets.binders["if"].update.call(this, models);
646
842
  }
647
843
  },
648
844
  "on-*": {
@@ -737,6 +933,24 @@
737
933
  }
738
934
  }
739
935
  return _results;
936
+ },
937
+ update: function(models) {
938
+ var data, key, model, view, _i, _len, _ref, _results;
939
+
940
+ data = {};
941
+ for (key in models) {
942
+ model = models[key];
943
+ if (key !== this.args[0]) {
944
+ data[key] = model;
945
+ }
946
+ }
947
+ _ref = this.iterated;
948
+ _results = [];
949
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
950
+ view = _ref[_i];
951
+ _results.push(view.update(data));
952
+ }
953
+ return _results;
740
954
  }
741
955
  },
742
956
  "class-*": function(el, value) {
@@ -756,6 +970,14 @@
756
970
  }
757
971
  };
758
972
 
973
+ Rivets.internalBinders = {
974
+ textNode: function(node, value) {
975
+ return node.data = value != null ? value : '';
976
+ }
977
+ };
978
+
979
+ Rivets.components = {};
980
+
759
981
  Rivets.config = {
760
982
  preloadData: true,
761
983
  handler: function(context, ev, binding) {
@@ -766,7 +988,9 @@
766
988
  Rivets.formatters = {};
767
989
 
768
990
  Rivets.factory = function(exports) {
991
+ exports._ = Rivets;
769
992
  exports.binders = Rivets.binders;
993
+ exports.components = Rivets.components;
770
994
  exports.formatters = Rivets.formatters;
771
995
  exports.config = Rivets.config;
772
996
  exports.configure = function(options) {