rails_blocks 0.8.1 → 0.9.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb776741563cf39110602da7ffc497ffd2c736318680605de378c6e0d3380fa9
4
- data.tar.gz: 0336f186612c4cb4f8eafaa9f03ed8018d9a7a6ddc57d7f4617bad359063fd98
3
+ metadata.gz: 033ebb0f7ed446801f2ae9cd57276c54881fa1ce0790b67475e8c0d3d58aaf68
4
+ data.tar.gz: 909f87b36efb9f8c909de64e51564b5ca57c575253052374c4791b891f0705c6
5
5
  SHA512:
6
- metadata.gz: 2ef7424334bd1c1cac0c0097f52f1ddf5dfe93309f38630a988423301bd01e214c2948384a3f0b892626f5149923cc25fd0535252bc245c021619517c7af1458
7
- data.tar.gz: 8696b7e04d9c3a8b065f373b9e0187c09ff7c48bd7c092db44eb5d7816f881ffb5b3754fdc4ec23442939d2af69aba9835a0c4fbcb46661bfb51cb1e7703ef43
6
+ metadata.gz: ed545d3e344a507e4c30cbd7b14bee0186e464e9a54c60d8f4498557607bec1bc1df142eefcfa9d37039f254cb08e5ab7cc0863123d6d4363a9a43480af58133
7
+ data.tar.gz: 6f95e004db9ef7883bf17f41bd36fd226b3c7659ae3b5e85ae975c3dd6f63fcafe093de2674312a12ad915f8fcbc2b50c2ae4197bbbcbbbc9c1d03828cec5be6
@@ -0,0 +1,140 @@
1
+ (function() {
2
+ var hasProp = {}.hasOwnProperty;
3
+
4
+ window.$$ = {
5
+ decls: {},
6
+ cache: {},
7
+ bem_class: 'js-bem',
8
+ bem_class_selector: ".js-bem",
9
+ bemDataKey: 'bem',
10
+ blockInitializationErrorHandler: function(e) {
11
+ return console.error("Can't initialize block " + name + ", check declaration. " + e.name + " : " + e.message);
12
+ },
13
+ processOptions: function($dom, item_name, b_name, o) {
14
+ var attr, attr_value, currentData, e_name, e_o, ref, ref1;
15
+ if (o.attrs) {
16
+ ref = o.attrs;
17
+ for (attr in ref) {
18
+ attr_value = ref[attr];
19
+ $dom.prop(attr, attr_value);
20
+ }
21
+ }
22
+ if (o.content) {
23
+ $dom.html(o.content);
24
+ }
25
+ if (o.mix) {
26
+ $dom.addClass($$.mixClass(o.mix));
27
+ }
28
+ if (o.data) {
29
+ currentData = $dom.data($$.bemDataKey) || {};
30
+ currentData[item_name] = o.data;
31
+ $dom.data($$.bemDataKey, currentData);
32
+ }
33
+ if (o.elements) {
34
+ ref1 = o.elements;
35
+ for (e_name in ref1) {
36
+ e_o = ref1[e_name];
37
+ $$.makeElement($dom, b_name, e_name, e_o);
38
+ }
39
+ }
40
+ return $dom;
41
+ },
42
+ makeDom: function(o, klass) {
43
+ var tag;
44
+ o || (o = {});
45
+ tag = o.tag || 'div';
46
+ return $("<" + tag + ">)").addClass(klass);
47
+ },
48
+ makeElement: function($parent, b_name, e_name, o) {
49
+ var $e, item_name;
50
+ item_name = $$.elementClass(b_name, e_name);
51
+ $e = this.makeDom(o, item_name);
52
+ $$.processOptions($e, item_name, b_name, o);
53
+ if (o.prepend) {
54
+ $parent.prepend($e);
55
+ } else {
56
+ $parent.append($e);
57
+ }
58
+ return $e;
59
+ },
60
+ makeBlock: function(b_name, o) {
61
+ var $b, item_name;
62
+ item_name = $$.blockClass(b_name);
63
+ $b = this.makeDom(o, item_name);
64
+ $$.processOptions($b, item_name, b_name, o);
65
+ return $b;
66
+ },
67
+ init: function($context) {
68
+ var $blocks;
69
+ $blocks = $context.find($$.bem_class_selector);
70
+ if ($context.hasClass($$.bem_class)) {
71
+ $blocks = $blocks.add($context);
72
+ }
73
+ return $$.initBlocks($blocks);
74
+ },
75
+ initBlocks: function($context, options) {
76
+ return $context.each(function() {
77
+ var $node, allParams, name, params, results;
78
+ $node = $(this);
79
+ allParams = $node.data($$.bemDataKey);
80
+ results = [];
81
+ for (name in allParams) {
82
+ if (!hasProp.call(allParams, name)) continue;
83
+ params = allParams[name];
84
+ if (name.indexOf('__') !== -1) {
85
+ continue;
86
+ }
87
+ results.push($$.getBlock($node, name, params));
88
+ }
89
+ return results;
90
+ });
91
+ },
92
+ getBlock: function($b, name, params) {
93
+ var bid, block, cacheKey, e;
94
+ cacheKey = name + "_bid";
95
+ bid = $b.data(cacheKey);
96
+ if (bid) {
97
+ return $$.cache[bid];
98
+ }
99
+ try {
100
+ block = new $$.decls[$$.utils.camelCase(name)]($b, params, name);
101
+ bid = block.id;
102
+ $b.data(cacheKey, bid);
103
+ $$.cache[bid] = block;
104
+ return block;
105
+ } catch (error) {
106
+ e = error;
107
+ if ($$.blockInitializationErrorHandler) {
108
+ return $$.blockInitializationErrorHandler(e, name, params);
109
+ }
110
+ }
111
+ },
112
+ makeMod: function(name, value) {
113
+ var mod;
114
+ mod = name;
115
+ if (value) {
116
+ mod += "_" + value;
117
+ }
118
+ return mod;
119
+ },
120
+ mixClass: function(mix) {
121
+ if (mix.e) {
122
+ return mix.b + "__" + mix.e;
123
+ }
124
+ return mix.b;
125
+ },
126
+ blockModClass: function(name, mod, value) {
127
+ return name + "--" + ($$.makeMod(mod, value));
128
+ },
129
+ elementModClass: function(b_name, e_name, mod, value) {
130
+ return ($$.elementClass(b_name, e_name)) + "--" + ($$.makeMod(mod, value));
131
+ },
132
+ blockClass: function(b_name) {
133
+ return b_name;
134
+ },
135
+ elementClass: function(b_name, e_name) {
136
+ return b_name + "__" + e_name;
137
+ }
138
+ };
139
+
140
+ }).call(this);
@@ -0,0 +1,94 @@
1
+ class Block {
2
+ constructor($b, params, name) {
3
+ this.$node = $b;
4
+ this.name = name;
5
+ this.id = $$.utils.guid();
6
+ this.params = params;
7
+ if (this.events) {
8
+ this._addEvents();
9
+ }
10
+ if (this.init) {
11
+ this.init();
12
+ }
13
+ }
14
+
15
+ elem(e_name, mod_name, mod_value, context) {
16
+ var $elem;
17
+ if (context == null) {
18
+ context = this.$node;
19
+ }
20
+ $elem = $(this.elemSelector(e_name, mod_name, mod_value), context);
21
+ $elem.e_name = e_name;
22
+ $elem.b_name = this.name;
23
+ return $elem;
24
+ };
25
+
26
+ elemSelector(e_name, mod_name, mod_value) {
27
+ if (mod_name) {
28
+ return "." + ($$.elementModClass(this.name, e_name, mod_name, mod_value));
29
+ }
30
+ return "." + (this._elementClass(e_name));
31
+ };
32
+
33
+ on() {
34
+ return this.$node.on.apply(this.$node, arguments);
35
+ };
36
+
37
+ _addEvents(element) {
38
+ var event_name, handler, p, ref, results;
39
+ ref = this.events;
40
+ results = [];
41
+ for (event_name in ref) {
42
+ handler = ref[event_name];
43
+ p = event_name.split(' ');
44
+ if (typeof handler === 'string') {
45
+ handler = decl.methods[handler];
46
+ }
47
+ results.push(this.$node.on(p[0], p[1], handler.bind(this)));
48
+ }
49
+ return results;
50
+ };
51
+
52
+ _trigger(event, data) {
53
+ return this.$node.trigger(event, data);
54
+ };
55
+
56
+ _elementClass(e_name) {
57
+ return $$.elementClass(this.name, e_name);
58
+ };
59
+
60
+ addElem(e_name, o, $parent) {
61
+ var $elem;
62
+ o || (o = {});
63
+ $elem = $$.makeElement($parent || this.$node, this.name, e_name, o);
64
+ $elem.e_name = e_name;
65
+ $elem.b_name = this.name;
66
+ return $elem;
67
+ };
68
+
69
+ asElem($elem, name) {
70
+ $elem.e_name = name;
71
+ $elem.b_name = this.name;
72
+ return $elem;
73
+ };
74
+
75
+ addMod(mod, value) {
76
+ return this.$node.addClass($$.blockModClass(this.name, mod, value));
77
+ };
78
+
79
+ delMod(mod, value) {
80
+ return this.$node.removeClass($$.blockModClass(this.name, mod, value));
81
+ };
82
+
83
+ toggleMod(mod, value) {
84
+ if (this.hasMod(mod, value)) {
85
+ return this.delMod(mod, value);
86
+ } else {
87
+ return this.addMod(mod, value);
88
+ }
89
+ };
90
+
91
+ hasMod(mod, value) {
92
+ return this.$node.hasClass($$.blockModClass(this.name, mod, value));
93
+ };
94
+ }
@@ -0,0 +1,72 @@
1
+ (function() {
2
+ $(function() {
3
+ var originalEq;
4
+ $.b = function(name) {
5
+ arguments[0] = '.' + name;
6
+ return $.apply(null, arguments);
7
+ };
8
+ originalEq = $.fn.eq;
9
+ return $.fn.extend({
10
+ destroyBlocks: function() {
11
+ return this.find($$.bem_class_selector).getBlocks().each(function() {
12
+ return this.destroy();
13
+ });
14
+ },
15
+ isElem: function() {
16
+ if (this.e_name) {
17
+ return true;
18
+ }
19
+ return false;
20
+ },
21
+ addMod: function(name, value) {
22
+ if (this.isElem()) {
23
+ return this.addClass($$.elementModClass(this.b_name, this.e_name, name, value));
24
+ } else {
25
+ return this.addClass($$.blockModClass(this.b_name, name, value));
26
+ }
27
+ },
28
+ hasMod: function(name, value) {
29
+ if (this.isElem()) {
30
+ return this.hasClass($$.elementModClass(this.b_name, this.e_name, name, value));
31
+ } else {
32
+ return this.hasClass($$.blockModClass(this.b_name, name, value));
33
+ }
34
+ },
35
+ toggleMod: function(mod, value) {
36
+ if (this.hasMod(mod, value)) {
37
+ return this.delMod(mod, value);
38
+ } else {
39
+ return this.addMod(mod, value);
40
+ }
41
+ },
42
+ delMod: function(name, value) {
43
+ if (this.isElem()) {
44
+ return this.removeClass($$.elementModClass(this.b_name, this.e_name, name, value));
45
+ } else {
46
+ return this.removeClass($$.blockModClass(this.b_name, name, value));
47
+ }
48
+ },
49
+ asBlock: function(name, o) {
50
+ this.addClass("" + name);
51
+ return $$.getBlock(this, name, o);
52
+ },
53
+ bemParams: function() {
54
+ var allParams;
55
+ allParams = this.data($$.bemDataKey);
56
+ if (this.isElem()) {
57
+ return allParams[$$.elementClass(this.b_name, this.e_name)];
58
+ } else {
59
+ return console.log('Error, only for elements. Use initBlock for blocks.');
60
+ }
61
+ },
62
+ eq: function() {
63
+ var collection;
64
+ collection = originalEq.apply(this, arguments);
65
+ collection.b_name = this.b_name;
66
+ collection.e_name = this.e_name;
67
+ return collection;
68
+ }
69
+ });
70
+ });
71
+
72
+ }).call(this);
@@ -0,0 +1,17 @@
1
+ (function() {
2
+ window.$$.utils = {
3
+ _id: 0,
4
+ camelCase: function(input) {
5
+ return input.toLowerCase().replace(/(^|-)(.)/g, function(match, $1, $2) {
6
+ return $2.toUpperCase();
7
+ });
8
+ },
9
+ dash: function(input) {
10
+ return input.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
11
+ },
12
+ guid: function() {
13
+ return this._id++;
14
+ }
15
+ };
16
+
17
+ }).call(this);
@@ -1,6 +1,18 @@
1
1
  require 'rails_blocks/names'
2
2
  require 'rails_blocks/path'
3
3
 
4
+ class RenderContext
5
+ attr_accessor :slots, :rendered_slots
6
+ def initialize
7
+ @slots = {}
8
+ @rendered_slots = {}
9
+ end
10
+
11
+ def slot(name, &block)
12
+ slots[name] = block
13
+ end
14
+ end
15
+
4
16
  module BlockHelper
5
17
  include RailsBlocks::Path
6
18
  include RailsBlocks::Names
@@ -65,13 +77,14 @@ module BlockHelper
65
77
  end
66
78
 
67
79
  def entity(template, type, name, options, &block)
68
- content = block ? capture(&block) : options[:content]
80
+ ctx = RenderContext.new
81
+ content = block ? capture(ctx, &block) : options[:content]
82
+ ctx.slots.each {|k, v| ctx.rendered_slots[k] = capture(&v)}
69
83
  #важно заполнять публичные поля только после того, как закапчюрится то, что внутри энтити, иначе они перезапишутся.
70
84
  @attrs = nil
71
85
  @current_options = options
72
86
  @current_entity = {type: type, name: name}
73
- p template
74
- template.nil? ? empty(content) : render(template: template, locals: {content: content, options: options})
87
+ template.nil? ? empty(content) : render(template: template, locals: {content: content, options: options, slots: ctx.rendered_slots})
75
88
  end
76
89
 
77
90
  def empty(content)
@@ -71,7 +71,6 @@ module RailsBlocks
71
71
  parts = file.split('/')
72
72
  filename = File.basename(file, RailsBlocks.config.template_engine)
73
73
  filename = File.basename(filename, '.html')
74
- p filename
75
74
  template = {
76
75
  level: parts[0],
77
76
  block: parts[1],
@@ -1,3 +1,3 @@
1
1
  module RailsBlocks
2
- VERSION = "0.8.1".freeze
2
+ VERSION = "0.9.0.beta.1".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_blocks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Potetiurin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-12 00:00:00.000000000 Z
11
+ date: 2023-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -157,11 +157,11 @@ files:
157
157
  - LICENSE.txt
158
158
  - README.md
159
159
  - Rakefile
160
- - app/assets/javascripts/bem_blocks.coffee
161
- - app/assets/javascripts/block.coffee
162
- - app/assets/javascripts/jquery.bem_exts.coffee
160
+ - app/assets/javascripts/bem_blocks.js
161
+ - app/assets/javascripts/block.js
162
+ - app/assets/javascripts/jquery.bem_exts.js
163
163
  - app/assets/javascripts/rails_blocks.js
164
- - app/assets/javascripts/utils.coffee
164
+ - app/assets/javascripts/utils.js
165
165
  - app/assets/stylesheets/rails_blocks.sass
166
166
  - app/helpers/block_helper.rb
167
167
  - app/views/rails_blocks/element.slim
@@ -227,9 +227,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
227
227
  version: '0'
228
228
  required_rubygems_version: !ruby/object:Gem::Requirement
229
229
  requirements:
230
- - - ">="
230
+ - - ">"
231
231
  - !ruby/object:Gem::Version
232
- version: '0'
232
+ version: 1.3.1
233
233
  requirements: []
234
234
  rubygems_version: 3.4.15
235
235
  signing_key:
@@ -1,95 +0,0 @@
1
- window.$$ =
2
- decls: {}
3
- cache: {}
4
- bem_class: 'js-bem'
5
- bem_class_selector: ".js-bem"
6
- bemDataKey: 'bem'
7
-
8
- blockInitializationErrorHandler: (e) ->
9
- console.error "Can't initialize block #{name}, check declaration. #{e.name} : #{e.message}"
10
-
11
- processOptions: ($dom, item_name, b_name, o) ->
12
- if o.attrs
13
- for attr, attr_value of o.attrs
14
- $dom.prop(attr, attr_value)
15
- if o.content
16
- $dom.html(o.content)
17
- if o.mix
18
- $dom.addClass($$.mixClass(o.mix))
19
- if o.data
20
- currentData = $dom.data($$.bemDataKey) || {}
21
- currentData[item_name] = o.data
22
- $dom.data($$.bemDataKey, currentData)
23
- if o.elements
24
- for e_name, e_o of o.elements
25
- $$.makeElement($dom, b_name, e_name, e_o)
26
- $dom
27
-
28
- makeDom: (o, klass) ->
29
- o ||= {}
30
- tag = o.tag || 'div'
31
- $("<#{tag}>)").addClass(klass)
32
-
33
- makeElement: ($parent, b_name, e_name, o) ->
34
- item_name = $$.elementClass(b_name, e_name)
35
- $e = @makeDom(o, item_name)
36
- $$.processOptions($e, item_name, b_name, o)
37
- if o.prepend
38
- $parent.prepend $e
39
- else
40
- $parent.append $e
41
- $e
42
-
43
- makeBlock: (b_name, o) ->
44
- item_name = $$.blockClass(b_name)
45
- $b = @makeDom(o, item_name)
46
- $$.processOptions($b, item_name, b_name, o)
47
- $b
48
-
49
- init: ($context) ->
50
- $blocks = $context.find($$.bem_class_selector)
51
- $blocks = $blocks.add($context) if $context.hasClass $$.bem_class
52
- $$.initBlocks($blocks)
53
-
54
- initBlocks: ($context, options) ->
55
- $context.each ->
56
- $node = $(this)
57
- allParams = $node.data($$.bemDataKey)
58
- for own name, params of allParams
59
- continue if name.indexOf('__') != -1
60
- $$.getBlock($node, name, params)
61
-
62
- getBlock: ($b, name, params)->
63
- cacheKey = "#{name}_bid"
64
- bid = $b.data(cacheKey)
65
- if bid
66
- return $$.cache[bid]
67
- try
68
- block = new $$.decls[$$.utils.camelCase(name)]($b, params, name)
69
- bid = block.id
70
- $b.data cacheKey, bid
71
- $$.cache[bid] = block
72
- block
73
- catch e
74
- $$.blockInitializationErrorHandler(e) if $$.blockInitializationErrorHandler
75
-
76
- makeMod: (name, value) ->
77
- mod = name
78
- mod += "_#{value}" if value
79
- mod
80
-
81
- mixClass: (mix) ->
82
- return "#{mix.b}__#{mix.e}" if mix.e
83
- mix.b
84
-
85
- blockModClass: (name, mod, value) ->
86
- "#{name}--#{$$.makeMod(mod, value)}"
87
-
88
- elementModClass: (b_name, e_name, mod, value) ->
89
- "#{$$.elementClass(b_name, e_name)}--#{$$.makeMod(mod, value)}"
90
-
91
- blockClass: (b_name) ->
92
- b_name
93
-
94
- elementClass: (b_name, e_name) ->
95
- "#{b_name}__#{e_name}"
@@ -1,65 +0,0 @@
1
- class window.Block
2
- constructor: ($b, params, name) ->
3
- @$node = $b
4
- @name = name
5
- @id = $$.utils.guid()
6
- @params = params
7
- #$.extend this, decl.methods
8
- @_addEvents() if @events
9
- # if @elements
10
- # for element in @elements
11
- # @_addEvents(element)
12
- @init() if @init
13
-
14
- elem: (e_name, mod_name, mod_value, context = @$node) ->
15
- $elem = $(@elemSelector.apply(@, arguments), context)
16
- $elem.e_name = e_name
17
- $elem.b_name = @name
18
- $elem
19
-
20
- elemSelector: (e_name, mod_name, mod_value) ->
21
- return ".#{$$.elementModClass(@name, e_name, mod_name, mod_value)}" if mod_name
22
- ".#{@_elementClass(e_name)}"
23
-
24
- on: () ->
25
- @$node.on.apply(@$node, arguments)
26
-
27
- _addEvents: (element)->
28
- for event_name, handler of @events
29
- p = event_name.split(' ')
30
- if typeof handler == 'string'
31
- handler = decl.methods[handler]
32
- @$node.on p[0], p[1], handler.bind(@)
33
-
34
- _trigger: (event, data) ->
35
- @$node.trigger event, data
36
-
37
- _elementClass: (e_name) ->
38
- $$.elementClass(@name, e_name)
39
-
40
- addElem: (e_name, o, $parent) ->
41
- o ||= {}
42
- $elem = $$.makeElement($parent || @$node, @name, e_name, o)
43
- $elem.e_name = e_name
44
- $elem.b_name = @name
45
- $elem
46
-
47
- asElem: ($elem, name) ->
48
- $elem.e_name = name
49
- $elem.b_name = @name
50
- $elem
51
-
52
- addMod: (mod, value) ->
53
- @$node.addClass($$.blockModClass(@name, mod, value))
54
-
55
- delMod: (mod, value) ->
56
- @$node.removeClass($$.blockModClass(@name, mod, value))
57
-
58
- toggleMod: (mod, value) ->
59
- if @hasMod(mod, value)
60
- @delMod(mod, value)
61
- else
62
- @addMod(mod, value)
63
-
64
- hasMod: (mod, value) ->
65
- @$node.hasClass($$.blockModClass(@name, mod, value))
@@ -1,56 +0,0 @@
1
- $ ->
2
- $.b = (name) ->
3
- arguments[0] = '.' + name
4
- $.apply(null, arguments)
5
-
6
- originalEq = $.fn.eq;
7
-
8
- $.fn.extend
9
- destroyBlocks: ->
10
- @find($$.bem_class_selector).getBlocks().each ->
11
- @destroy()
12
-
13
- isElem: ->
14
- return true if @e_name
15
- false
16
-
17
- addMod: (name, value) ->
18
- if @isElem()
19
- @addClass($$.elementModClass(@b_name, @e_name, name, value))
20
- else
21
- @addClass($$.blockModClass(@b_name, name, value))
22
-
23
- hasMod: (name, value) ->
24
- if @isElem()
25
- return @hasClass($$.elementModClass(@b_name, @e_name, name, value))
26
- else
27
- return @hasClass($$.blockModClass(@b_name, name, value))
28
-
29
- toggleMod: (mod, value) ->
30
- if @hasMod(mod, value)
31
- @delMod(mod, value)
32
- else
33
- @addMod(mod, value)
34
-
35
- delMod: (name, value) ->
36
- if @isElem()
37
- @removeClass($$.elementModClass(@b_name, @e_name, name, value))
38
- else
39
- @removeClass($$.blockModClass(@b_name, name, value))
40
-
41
- asBlock: (name, o) ->
42
- @addClass("#{name}")
43
- $$.getBlock(@, name, o)
44
-
45
- bemParams: () ->
46
- allParams = @data($$.bemDataKey)
47
- if @isElem()
48
- return allParams[$$.elementClass(@b_name, @e_name)]
49
- else
50
- console.log('Error, only for elements. Use initBlock for blocks.')
51
-
52
- eq: () ->
53
- collection = originalEq.apply(@, arguments)
54
- collection.b_name = @b_name
55
- collection.e_name = @e_name
56
- collection
@@ -1,9 +0,0 @@
1
- window.$$.utils =
2
- _id: 0
3
- camelCase: (input) ->
4
- input.toLowerCase().replace /(^|-)(.)/g, (match, $1, $2) ->
5
- $2.toUpperCase()
6
- dash: (input) ->
7
- input.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()
8
- guid: () ->
9
- return @_id++