rails_blocks 0.8.1 → 0.9.0.beta.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/bem_blocks.js +140 -0
- data/app/assets/javascripts/block.js +94 -0
- data/app/assets/javascripts/jquery.bem_exts.js +72 -0
- data/app/assets/javascripts/utils.js +17 -0
- data/app/helpers/block_helper.rb +35 -11
- data/lib/rails_blocks/path.rb +32 -15
- data/lib/rails_blocks/version.rb +1 -1
- metadata +8 -8
- data/app/assets/javascripts/bem_blocks.coffee +0 -95
- data/app/assets/javascripts/block.coffee +0 -65
- data/app/assets/javascripts/jquery.bem_exts.coffee +0 -56
- data/app/assets/javascripts/utils.coffee +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e037cb85e19c073e95220d11d5216f35bb58f1544a61c6510f2b2885dbc45565
|
4
|
+
data.tar.gz: bf00672538f7e357accdf84659f826b2967ce86ccae8584530cdfb3a19721850
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87b20842800181fe3d7af4a2a6694dc1fb471224ab1812e72b660c530ff3032eef8fba240b1cd9df110549680df707fcc7de326c817da1df53497d26bbd6a309
|
7
|
+
data.tar.gz: d3af99de53ce9fd44a444b5eb930d39212688381daa0b8a726f5f2b46a254ab8f0288d46ed418e141ba86fa0559d356f7ffa96bdbeed4d4326568391fa6c73de
|
@@ -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);
|
data/app/helpers/block_helper.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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)
|
@@ -120,10 +133,14 @@ module BlockHelper
|
|
120
133
|
private
|
121
134
|
def current_bem_data
|
122
135
|
data = {}
|
123
|
-
|
136
|
+
if(@current_entity[:type] == :block)
|
137
|
+
data.merge! block_data(@current_entity[:name], @current_options[:js])
|
138
|
+
else
|
139
|
+
data.merge! element_data(context_block, @current_entity[:name], @current_options[:js])
|
140
|
+
end
|
124
141
|
data.merge! mix_data(@current_options[:mix]) if @current_options[:mix]
|
125
142
|
|
126
|
-
return nil if data ==
|
143
|
+
return nil if data.length == 0
|
127
144
|
data
|
128
145
|
end
|
129
146
|
|
@@ -132,18 +149,25 @@ module BlockHelper
|
|
132
149
|
data = mixes.map do |mix|
|
133
150
|
next unless mix[:js]
|
134
151
|
if mix[:e]
|
135
|
-
|
136
|
-
entity_data(element_name(mix[:b], mix[:e]), mix[:js])
|
137
|
-
else
|
138
|
-
entity_data(element_name(context_block, mix[:e]), mix[:js])
|
139
|
-
end
|
152
|
+
element_data(mix[:b] || context_block, mix[:e], mix[:js])
|
140
153
|
else
|
141
154
|
raise RailsBlocks::BadMixError if mix[:b].nil?
|
142
|
-
|
155
|
+
block_data(mix[:b], mix[:js])
|
143
156
|
end
|
144
157
|
end.compact.inject(&:merge) || {}
|
145
158
|
end
|
146
159
|
|
160
|
+
def block_data(name, js)
|
161
|
+
level = block_js_level(context_block, @current_options[:levels])
|
162
|
+
return {} if !js
|
163
|
+
data = (js == true ? {} : js).merge!({level: level})
|
164
|
+
entity_data(name, data)
|
165
|
+
end
|
166
|
+
|
167
|
+
def element_data(b, e, js)
|
168
|
+
entity_data(element_name(b || context_block, e), js)
|
169
|
+
end
|
170
|
+
|
147
171
|
def entity_data(name, data)
|
148
172
|
return {name => data} if data.is_a? Hash
|
149
173
|
return {name => {}} if data == true
|
data/lib/rails_blocks/path.rb
CHANGED
@@ -30,6 +30,12 @@ module RailsBlocks
|
|
30
30
|
end
|
31
31
|
nil
|
32
32
|
end
|
33
|
+
|
34
|
+
def block_js_level(b_name, levels)
|
35
|
+
return levels.reverse.find do |level|
|
36
|
+
Path.tree.dig(level, b_name, :js)
|
37
|
+
end
|
38
|
+
end
|
33
39
|
|
34
40
|
def element_template(b_name, e_name, options = {})
|
35
41
|
options[:levels].reverse.each do |level|
|
@@ -41,7 +47,6 @@ module RailsBlocks
|
|
41
47
|
end
|
42
48
|
|
43
49
|
private
|
44
|
-
|
45
50
|
def mod(options)
|
46
51
|
return '' unless options[:mods] && !options[:mods].empty?
|
47
52
|
mod_class(*options[:mods].first)
|
@@ -63,32 +68,44 @@ module RailsBlocks
|
|
63
68
|
|
64
69
|
def self.file_tree
|
65
70
|
t = {}
|
66
|
-
|
71
|
+
engine_ext = RailsBlocks.config.template_engine
|
72
|
+
files = Dir["#{blocks_dir}/**/*#{engine_ext}"]
|
67
73
|
files.each do |file|
|
68
74
|
file.sub! blocks_dir.to_s + '/', ''
|
69
|
-
file.sub! '.html' +
|
75
|
+
file.sub! '.html' + engine_ext, ''
|
70
76
|
|
71
77
|
parts = file.split('/')
|
72
|
-
filename = File.basename(file,
|
78
|
+
filename = File.basename(file, engine_ext)
|
73
79
|
filename = File.basename(filename, '.html')
|
74
|
-
p filename
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
file: filename
|
79
|
-
}
|
80
|
-
t[template[:level]] ||= {}
|
81
|
-
t[template[:level]][template[:block]] ||= {elements: {}}
|
80
|
+
# p filename
|
81
|
+
level, block = parts
|
82
|
+
t[level] ||= {}
|
83
|
+
block_def = (t[level][block] ||= {elements: {}})
|
82
84
|
|
83
85
|
if is_e_file(filename)
|
84
|
-
|
85
|
-
|
86
|
+
block_def[:elements][get_e_name(filename)] ||= {}
|
87
|
+
block_def[:elements][get_e_name(filename)][get_e_mod(filename)] = file
|
86
88
|
else
|
87
|
-
|
89
|
+
block_def[get_b_mod(filename)] = file
|
88
90
|
end
|
89
91
|
end
|
92
|
+
add_js(t)
|
90
93
|
t.with_indifferent_access.freeze
|
91
94
|
end
|
95
|
+
|
96
|
+
def self.add_js(t)
|
97
|
+
js_files = Dir["#{blocks_dir}/**/*.js"]
|
98
|
+
js_files.each do |file|
|
99
|
+
file.sub! blocks_dir.to_s + '/', ''
|
100
|
+
parts = file.split('/')
|
101
|
+
level, block, filename = parts
|
102
|
+
filename = File.basename(filename, '.*')
|
103
|
+
|
104
|
+
t[level] ||= {}
|
105
|
+
block_def = t[level][block] ||= {elements: {}}
|
106
|
+
block_def[:js] = true
|
107
|
+
end
|
108
|
+
end
|
92
109
|
|
93
110
|
def self.is_e_file(file)
|
94
111
|
file.start_with? ELEMENT_FILE_PREFIX
|
data/lib/rails_blocks/version.rb
CHANGED
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.
|
4
|
+
version: 0.9.0.beta.2
|
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-
|
11
|
+
date: 2023-07-26 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.
|
161
|
-
- app/assets/javascripts/block.
|
162
|
-
- app/assets/javascripts/jquery.bem_exts.
|
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.
|
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:
|
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
|