riotjs-rails 2.0.2 → 2.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 25dbc5d0c8f66337b2c05e27e1fbc0a106efd067
4
- data.tar.gz: 98de632f5c9140fe0c4affa20c32defad9353ce0
3
+ metadata.gz: e3afcc6d3f0fb93859997d05e835ee6db0249aa9
4
+ data.tar.gz: 3b5176c3b3a83cb53defd47744450328db97d304
5
5
  SHA512:
6
- metadata.gz: c380b2699ff01e0c7b526c2e167ac1adf6516696f595e09ec6af8ac82d07034e6ad7a3531cc58c38684ead5f35ec857e01c4c409970d531cc0229d5fb9502c4b
7
- data.tar.gz: d46e50e7fa8800fcfa31a1628f3fbc9239315e90d5c8d29da19f80d83102a4a832dcd4308284191948c2e8ffffbfab4e52e1b9b3cd2b74d85c64f84b1422a62b
6
+ metadata.gz: f38b2c14492883d2099e7aa8e6411ea77a9088393e1fb24bafc099d5044072468e052640081994501f31d77bc6bc72a4cff6a0d80e25c64565152017664eb4a6
7
+ data.tar.gz: a22e0f819fcb8620d5be77ce7a0e6f71c8859fa4dd9e8592d9a52b7ac869f60f137d2e9d76781234c5aceca47d0c6e81e36044f1c53cba6561ef141d5887cf87
@@ -0,0 +1,3 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 Adam Butler
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,19 @@
1
+ # riotjs-rails <a href="http://badge.fury.io/rb/riotjs-rails"><img src="https://badge.fury.io/rb/riotjs-rails@2x.png" alt="Gem Version" height="18"></a>
2
+
3
+ ### About
4
+
5
+ Rails 3.1+ asset-pipeline gem to provide riot.js
6
+
7
+ ### Setup
8
+
9
+ Have in your Gemfile:
10
+
11
+ gem 'riotjs-rails'
12
+
13
+ And, have in your application.js manifest:
14
+
15
+ //= require riot
16
+
17
+ ## Contributing
18
+
19
+ Contributions are welcome, please follow [GitHub Flow](https://guides.github.com/introduction/flow/index.html)
@@ -0,0 +1,10 @@
1
+ require "riotjs-rails/version"
2
+
3
+ module Riot
4
+ module Rails
5
+ if defined?(::Rails) and Gem::Requirement.new('>= 3.1').satisfied_by?(Gem::Version.new ::Rails.version)
6
+ class Rails::Engine < ::Rails::Engine
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ module Riot
2
+ module Rails
3
+ VERSION = "2.0.3"
4
+ end
5
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "riotjs-rails/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "riotjs-rails"
7
+ s.version = Riot::Rails::VERSION
8
+ s.authors = ["Adam Butler"]
9
+ s.email = ["adam@lab.io"]
10
+ s.homepage = "https://github.com/adambutler/riotjs-rails"
11
+ s.summary = %q{riot.js asset pipeline provider/wrapper}
12
+ s.description = "A simple asset-pipeline wrapper for riot.js by moot"
13
+ s.license = "MIT"
14
+
15
+ s.rubyforge_project = "riotjs-rails"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ end
@@ -0,0 +1,689 @@
1
+ /* Riot 2.0.2, @license MIT, (c) 2015 Muut Inc. + contributors */
2
+
3
+ ;(function() {
4
+
5
+ var riot = { version: 'v2.0.2' }
6
+
7
+ 'use strict'
8
+
9
+ riot.observable = function(el) {
10
+ var callbacks = {}
11
+
12
+ el.on = function(events, fn) {
13
+ if (typeof fn == 'function') {
14
+ events.replace(/\S+/g, function(name, pos) {
15
+ (callbacks[name] = callbacks[name] || []).push(fn)
16
+ fn.typed = pos > 0
17
+ })
18
+ }
19
+ return el
20
+ }
21
+
22
+ el.off = function(events, fn) {
23
+ if (events == '*') callbacks = {}
24
+ else if (fn) {
25
+ var arr = callbacks[events]
26
+ for (var i = 0, cb; (cb = arr && arr[i]); ++i) {
27
+ if (cb == fn) { arr.splice(i, 1); i-- }
28
+ }
29
+ } else {
30
+ events.replace(/\S+/g, function(name) {
31
+ callbacks[name] = []
32
+ })
33
+ }
34
+ return el
35
+ }
36
+
37
+ // only single event supported
38
+ el.one = function(name, fn) {
39
+ if (fn) fn.one = 1
40
+ return el.on(name, fn)
41
+ }
42
+
43
+ el.trigger = function(name) {
44
+ var args = [].slice.call(arguments, 1),
45
+ fns = callbacks[name] || []
46
+
47
+ for (var i = 0, fn; (fn = fns[i]); ++i) {
48
+ if (!fn.busy) {
49
+ fn.busy = 1
50
+ fn.apply(el, fn.typed ? [name].concat(args) : args)
51
+ if (fn.one) { fns.splice(i, 1); i-- }
52
+ fn.busy = 0
53
+ }
54
+ }
55
+
56
+ return el
57
+ }
58
+
59
+ return el
60
+
61
+ }
62
+ ;(function(riot, evt) {
63
+
64
+ // browsers only
65
+ if (!this.top) return
66
+
67
+ var loc = location,
68
+ fns = riot.observable({}),
69
+ current = hash(),
70
+ win = window
71
+
72
+ function hash() {
73
+ return loc.hash.slice(1)
74
+ }
75
+
76
+ function emit(path) {
77
+ if (path.type) path = hash()
78
+
79
+ if (path != current) {
80
+ fns.trigger.apply(null, ['H'].concat(path.split('/')))
81
+ current = path
82
+ }
83
+ }
84
+
85
+ var r = riot.route = function(arg) {
86
+ // string
87
+ if (arg[0]) {
88
+ loc.hash = arg
89
+ emit(arg)
90
+
91
+ // function
92
+ } else {
93
+ fns.on('H', arg)
94
+ }
95
+ }
96
+
97
+ r.exec = function(fn) {
98
+ fn.apply(null, hash().split('/'))
99
+ }
100
+
101
+ win.addEventListener ? win.addEventListener(evt, emit, false) : win.attachEvent('on' + evt, emit)
102
+
103
+ })(riot, 'hashchange')
104
+ /*
105
+
106
+ //// How it works?
107
+
108
+
109
+ Three ways:
110
+
111
+ 1. Expressions: tmpl('{ value }', data).
112
+ Returns the result of evaluated expression as a raw object.
113
+
114
+ 2. Templates: tmpl('Hi { name } { surname }', data).
115
+ Returns a string with evaluated expressions.
116
+
117
+ 3. Filters: tmpl('{ show: !done, highlight: active }', data).
118
+ Returns a space separated list of trueish keys (mainly
119
+ used for setting html classes), e.g. "show highlight".
120
+
121
+
122
+ // Template examples
123
+
124
+ tmpl('{ title || "Untitled" }', data)
125
+ tmpl('Results are { results ? "ready" : "loading" }', data)
126
+ tmpl('Today is { new Date() }', data)
127
+ tmpl('{ message.length > 140 && "Message is too long" }', data)
128
+ tmpl('This item got { Math.round(rating) } stars', data)
129
+ tmpl('<h1>{ title }</h1>{ body }', data)
130
+
131
+
132
+ // Falsy expressions in templates
133
+
134
+ In templates (as opposed to single expressions) all falsy values
135
+ except zero (undefined/null/false) will default to empty string:
136
+
137
+ tmpl('{ undefined } - { false } - { null } - { 0 }', {})
138
+ // will return: " - - - 0"
139
+
140
+ */
141
+
142
+ riot._tmpl = (function() {
143
+
144
+ var cache = {},
145
+
146
+ // find variable names
147
+ re_vars = /("|').+?[^\\]\1|\.\w*|\w*:|\b(?:this|true|false|null|undefined|new|typeof|Number|String|Object|Array|Math|Date|JSON)\b|([a-z_]\w*)/gi
148
+ // [ 1 ][ 2 ][ 3 ][ 4 ][ 5 ]
149
+ // 1. skip quoted strings: "a b", 'a b', 'a \'b\''
150
+ // 2. skip object properties: .name
151
+ // 3. skip object literals: name:
152
+ // 4. skip reserved words
153
+ // 5. match var name
154
+
155
+ // build a template (or get it from cache), render with data
156
+
157
+ return function(str, data) {
158
+ return str && (cache[str] = cache[str] || tmpl(str))(data)
159
+ }
160
+
161
+
162
+ // create a template instance
163
+
164
+ function tmpl(s, p) {
165
+ p = (s || '{}')
166
+
167
+ // temporarily convert \{ and \} to a non-character
168
+ .replace(/\\{/g, '\uFFF0')
169
+ .replace(/\\}/g, '\uFFF1')
170
+
171
+ // split string to expression and non-expresion parts
172
+ .split(/({[\s\S]*?})/)
173
+
174
+ return new Function('d', 'return ' + (
175
+
176
+ // is it a single expression or a template? i.e. {x} or <b>{x}</b>
177
+ !p[0] && !p[2]
178
+
179
+ // if expression, evaluate it
180
+ ? expr(p[1])
181
+
182
+ // if template, evaluate all expressions in it
183
+ : '[' + p.map(function(s, i) {
184
+
185
+ // is it an expression or a string (every second part is an expression)
186
+ return i % 2
187
+
188
+ // evaluate the expressions
189
+ ? expr(s, 1)
190
+
191
+ // process string parts of the template:
192
+ : '"' + s
193
+
194
+ // preserve new lines
195
+ .replace(/\n/g, '\\n')
196
+
197
+ // escape quotes
198
+ .replace(/"/g, '\\"')
199
+
200
+ + '"'
201
+
202
+ }).join(',') + '].join("")'
203
+ )
204
+
205
+ // bring escaped { and } back
206
+ .replace(/\uFFF0/g, '{')
207
+ .replace(/\uFFF1/g, '}')
208
+
209
+ )
210
+
211
+ }
212
+
213
+
214
+ // parse { ... } expression
215
+
216
+ function expr(s, n) {
217
+ s = s
218
+
219
+ // convert new lines to spaces
220
+ .replace(/\n/g, ' ')
221
+
222
+ // trim whitespace, curly brackets, strip comments
223
+ .replace(/^[{ ]+|[ }]+$|\/\*.+?\*\//g, '')
224
+
225
+ // is it an object literal? i.e. { key : value }
226
+ return /^\s*[\w-"']+ *:/.test(s)
227
+
228
+ // if object literal, return trueish keys
229
+ // e.g.: { show: isOpen(), done: item.done } -> "show done"
230
+ ? '[' + s.replace(/\W*([\w-]+)\W*:([^,]+)/g, function(_, k, v) {
231
+
232
+ // safely execute vars to prevent undefined value errors
233
+ return v.replace(/\w[^,|& ]*/g, function(v) { return wrap(v, n) }) + '?"' + k + '":"",'
234
+
235
+ }) + '].join(" ")'
236
+
237
+ // if js expression, evaluate as javascript
238
+ : wrap(s, n)
239
+
240
+ }
241
+
242
+
243
+ // execute js w/o breaking on errors or undefined vars
244
+
245
+ function wrap(s, nonull) {
246
+ return '(function(v){try{v='
247
+
248
+ // prefix vars (name => data.name)
249
+ + (s.replace(re_vars, function(s, _, v) { return v ? 'd.' + v : s })
250
+
251
+ // break the expression if its empty (resulting in undefined value)
252
+ || 'x')
253
+
254
+ + '}finally{return '
255
+
256
+ // default to empty string for falsy values except zero
257
+ + (nonull ? '!v&&v!==0?"":v' : 'v')
258
+
259
+ + '}}).call(d)'
260
+ }
261
+
262
+ })()
263
+ ;(function(riot, doc) {
264
+
265
+ var tmpl = riot._tmpl,
266
+ all_tags = [],
267
+ tag_impl = {}
268
+
269
+ function each(nodes, fn) {
270
+ for (var i = 0; i < (nodes || []).length; i++) {
271
+ if (fn(nodes[i], i) === false) i--
272
+ }
273
+ }
274
+
275
+ function extend(obj, from) {
276
+ from && Object.keys(from).map(function(key) {
277
+ obj[key] = from[key]
278
+ })
279
+ return obj
280
+ }
281
+
282
+ function diff(arr1, arr2) {
283
+ return arr1.filter(function(el) {
284
+ return arr2.indexOf(el) < 0
285
+ })
286
+ }
287
+
288
+ function walk(dom, fn) {
289
+ dom = fn(dom) === false ? dom.nextSibling : dom.firstChild
290
+
291
+ while (dom) {
292
+ walk(dom, fn)
293
+ dom = dom.nextSibling
294
+ }
295
+ }
296
+
297
+
298
+ function mkdom(tmpl) {
299
+ var el = doc.createElement('div')
300
+ el.innerHTML = tmpl
301
+ return el
302
+ }
303
+
304
+
305
+ function update(expressions, instance) {
306
+
307
+ // allow recalculation of context data
308
+ instance.trigger('update')
309
+
310
+ each(expressions, function(expr) {
311
+ var tag = expr.tag,
312
+ dom = expr.dom
313
+
314
+ function remAttr(name) {
315
+ dom.removeAttribute(name)
316
+ }
317
+
318
+ // loops first: TODO remove from expressions arr
319
+ if (expr.loop) {
320
+ remAttr('each')
321
+ return loop(expr, instance)
322
+ }
323
+
324
+ // custom tag
325
+ if (tag) return tag.update ? tag.update() :
326
+ expr.tag = createTag({ tmpl: tag[0], fn: tag[1], root: dom, parent: instance })
327
+
328
+
329
+ var attr_name = expr.attr,
330
+ value = tmpl(expr.expr, instance)
331
+
332
+ if (value == null) value = ''
333
+
334
+ // no change
335
+ if (expr.value === value) return
336
+ expr.value = value
337
+
338
+
339
+ // text node
340
+ if (!attr_name) return dom.nodeValue = value
341
+
342
+ // attribute
343
+ if (!value && expr.bool || /obj|func/.test(typeof value)) remAttr(attr_name)
344
+
345
+ // event handler
346
+ if (typeof value == 'function') {
347
+ dom[attr_name] = function(e) {
348
+
349
+ // cross browser event fix
350
+ e = e || window.event
351
+ e.which = e.which || e.charCode || e.keyCode
352
+ e.target = e.target || e.srcElement
353
+ e.currentTarget = dom
354
+
355
+ // currently looped item
356
+ e.item = instance.__item || instance
357
+
358
+ // prevent default behaviour (by default)
359
+ if (value.call(instance, e) !== true) {
360
+ e.preventDefault && e.preventDefault()
361
+ e.returnValue = false
362
+ }
363
+
364
+ instance.update()
365
+ }
366
+
367
+ // show / hide / if
368
+ } else if (/^(show|hide|if)$/.test(attr_name)) {
369
+ remAttr(attr_name)
370
+ if (attr_name == 'hide') value = !value
371
+ dom.style.display = value ? '' : 'none'
372
+
373
+ // normal attribute
374
+ } else {
375
+ if (expr.bool) {
376
+ if (!value) return
377
+ value = attr_name
378
+ }
379
+
380
+ dom.setAttribute(attr_name, value)
381
+ }
382
+
383
+ })
384
+
385
+ instance.trigger('updated')
386
+
387
+ }
388
+
389
+ function parse(root) {
390
+
391
+ var named_elements = {},
392
+ expressions = []
393
+
394
+ walk(root, function(dom) {
395
+
396
+ var type = dom.nodeType,
397
+ value = dom.nodeValue
398
+
399
+ function addExpr(value, data) {
400
+ if (value ? value.indexOf('{') >= 0 : data) {
401
+ var expr = { dom: dom, expr: value }
402
+ expressions.push(extend(expr, data || {}))
403
+ }
404
+ }
405
+
406
+ // text node
407
+ if (type == 3 && dom.parentNode.tagName != 'STYLE') {
408
+ addExpr(value)
409
+
410
+ // element
411
+ } else if (type == 1) {
412
+
413
+ // loop?
414
+ value = dom.getAttribute('each')
415
+
416
+ if (value) {
417
+ addExpr(value, { loop: 1 })
418
+ return false
419
+ }
420
+
421
+ // custom tag?
422
+ var tag = tag_impl[dom.tagName.toLowerCase()]
423
+
424
+ // attributes
425
+ each(dom.attributes, function(attr) {
426
+ var name = attr.name,
427
+ value = attr.value
428
+
429
+ // named elements
430
+ if (/^(name|id)$/.test(name)) named_elements[value] = dom
431
+
432
+ // expressions
433
+ if (!tag) {
434
+ var bool = name.split('__')[1]
435
+ addExpr(value, { attr: bool || name, bool: bool })
436
+ if (bool) {
437
+ dom.removeAttribute(name)
438
+ return false
439
+ }
440
+ }
441
+
442
+ })
443
+
444
+ if (tag) addExpr(0, { tag: tag })
445
+
446
+ }
447
+
448
+ })
449
+
450
+ return { expr: expressions, elem: named_elements }
451
+
452
+ }
453
+
454
+
455
+
456
+ // create new custom tag (component)
457
+ function createTag(conf) {
458
+
459
+ var opts = conf.opts || {},
460
+ dom = mkdom(conf.tmpl),
461
+ mountNode = conf.root,
462
+ parent = conf.parent,
463
+ ast = parse(dom),
464
+ tag = { root: mountNode, opts: opts, parent: parent, __item: conf.item },
465
+ attributes = {}
466
+
467
+ // named elements
468
+ extend(tag, ast.elem)
469
+
470
+ // attributes
471
+ each(mountNode.attributes, function(attr) {
472
+ attributes[attr.name] = attr.value
473
+ })
474
+
475
+ function updateOpts() {
476
+ Object.keys(attributes).map(function(name) {
477
+ var val = opts[name] = tmpl(attributes[name], parent || tag)
478
+ if (typeof val == 'object') mountNode.removeAttribute(name)
479
+ })
480
+ }
481
+
482
+ updateOpts()
483
+
484
+ if (!tag.on) {
485
+ riot.observable(tag)
486
+ delete tag.off // off method not needed
487
+ }
488
+
489
+ if (conf.fn) conf.fn.call(tag, opts)
490
+
491
+
492
+ tag.update = function(data, _system) {
493
+
494
+ /*
495
+ If loop is defined on the root of the HTML template
496
+ the original parent is a temporary <div/> by mkdom()
497
+ */
498
+ if (parent && dom && !dom.firstChild) {
499
+ mountNode = parent.root
500
+ dom = null
501
+ }
502
+
503
+ if (_system || doc.body.contains(mountNode)) {
504
+ extend(tag, data)
505
+ extend(tag, tag.__item)
506
+ updateOpts()
507
+ update(ast.expr, tag)
508
+
509
+ // update parent
510
+ !_system && tag.__item && parent.update()
511
+ return true
512
+
513
+ } else {
514
+ tag.trigger('unmount')
515
+ }
516
+
517
+ }
518
+
519
+ tag.update(0, true)
520
+
521
+ // append to root
522
+ while (dom.firstChild) {
523
+ if (conf.before) mountNode.insertBefore(dom.firstChild, conf.before)
524
+ else mountNode.appendChild(dom.firstChild)
525
+ }
526
+
527
+
528
+ tag.trigger('mount')
529
+
530
+ all_tags.push(tag)
531
+
532
+ return tag
533
+ }
534
+
535
+
536
+ function loop(expr, instance) {
537
+
538
+ // initialize once
539
+ if (expr.done) return
540
+ expr.done = true
541
+
542
+ var dom = expr.dom,
543
+ prev = dom.previousSibling,
544
+ root = dom.parentNode,
545
+ template = dom.outerHTML,
546
+ val = expr.expr,
547
+ els = val.split(/\s+in\s+/),
548
+ rendered = [],
549
+ checksum,
550
+ keys
551
+
552
+
553
+ if (els[1]) {
554
+ val = '{ ' + els[1]
555
+ keys = els[0].slice(1).trim().split(/,\s*/)
556
+ }
557
+
558
+ // clean template code
559
+ instance.one('mount', function() {
560
+ var p = dom.parentNode
561
+ if (p) {
562
+ root = p
563
+ root.removeChild(dom)
564
+ }
565
+ })
566
+
567
+ function startPos() {
568
+ return Array.prototype.indexOf.call(root.childNodes, prev) + 1
569
+ }
570
+
571
+ instance.on('updated', function() {
572
+
573
+ var items = tmpl(val, instance)
574
+ is_array = Array.isArray(items)
575
+
576
+ if (is_array) items = items.slice(0)
577
+
578
+ else {
579
+
580
+ if (!items) return // some IE8 issue
581
+
582
+ // detect Object changes
583
+ var testsum = JSON.stringify(items)
584
+ if (testsum == checksum) return
585
+ checksum = testsum
586
+
587
+ items = Object.keys(items).map(function(key, i) {
588
+ var item = {}
589
+ item[keys[0]] = key
590
+ item[keys[1]] = items[key]
591
+ return item
592
+ })
593
+
594
+ }
595
+
596
+ // remove redundant
597
+ diff(rendered, items).map(function(item) {
598
+ var pos = rendered.indexOf(item)
599
+ root.removeChild(root.childNodes[startPos() + pos])
600
+ rendered.splice(pos, 1)
601
+ })
602
+
603
+ // add new
604
+ diff(items, rendered).map(function(item, i) {
605
+ var pos = items.indexOf(item)
606
+
607
+ // string array
608
+ if (keys && !checksum) {
609
+ var obj = {}
610
+ obj[keys[0]] = item
611
+ obj[keys[1]] = i
612
+ item = obj
613
+ }
614
+
615
+ var tag = createTag({
616
+ before: root.childNodes[startPos() + pos],
617
+ parent: instance,
618
+ tmpl: template,
619
+ item: item,
620
+ root: root
621
+ })
622
+
623
+ instance.on('update', function() {
624
+ tag.update(0, true)
625
+ })
626
+
627
+ })
628
+
629
+ // assign rendered
630
+ rendered = items
631
+
632
+ })
633
+
634
+ }
635
+
636
+ riot.tag = function(name, tmpl, fn) {
637
+ fn = fn || noop,
638
+ tag_impl[name] = [tmpl, fn]
639
+ }
640
+
641
+ riot.mountTo = function(node, tagName, opts) {
642
+ var tag = tag_impl[tagName]
643
+ return tag && createTag({ tmpl: tag[0], fn: tag[1], root: node, opts: opts })
644
+ }
645
+
646
+ riot.mount = function(selector, opts) {
647
+ if (selector == '*') selector = Object.keys(tag_impl).join(', ')
648
+
649
+ var instances = []
650
+
651
+ each(doc.querySelectorAll(selector), function(node) {
652
+ if (node.riot) return
653
+
654
+ var tagName = node.tagName.toLowerCase(),
655
+ instance = riot.mountTo(node, tagName, opts)
656
+
657
+ if (instance) {
658
+ instances.push(instance)
659
+ node.riot = 1
660
+ }
661
+ })
662
+
663
+ return instances
664
+ }
665
+
666
+ // update everything
667
+ riot.update = function() {
668
+ return all_tags = all_tags.filter(function(tag) {
669
+ return !!tag.update()
670
+ })
671
+ }
672
+
673
+ })(riot, document)
674
+
675
+
676
+ // support CommonJS
677
+ if (typeof exports === 'object')
678
+ module.exports = riot
679
+
680
+ // support AMD
681
+ else if (typeof define === 'function' && define.amd)
682
+ define(function() { return riot })
683
+
684
+ // support browser
685
+ else
686
+ this.riot = riot
687
+
688
+ })();
689
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riotjs-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Butler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-30 00:00:00.000000000 Z
11
+ date: 2016-03-01 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple asset-pipeline wrapper for riot.js by moot
14
14
  email:
@@ -16,7 +16,16 @@ email:
16
16
  executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
- files: []
19
+ files:
20
+ - ".gitignore"
21
+ - Gemfile
22
+ - LICENSE.md
23
+ - Rakefile
24
+ - Readme.md
25
+ - lib/riotjs-rails.rb
26
+ - lib/riotjs-rails/version.rb
27
+ - riotjs-rails.gemspec
28
+ - vendor/assets/javascripts/riot.js
20
29
  homepage: https://github.com/adambutler/riotjs-rails
21
30
  licenses:
22
31
  - MIT
@@ -42,3 +51,4 @@ signing_key:
42
51
  specification_version: 4
43
52
  summary: riot.js asset pipeline provider/wrapper
44
53
  test_files: []
54
+ has_rdoc: