rivets-rails 0.2.0 → 0.2.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.
@@ -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) {