rails_blocks 0.7.12 → 0.9.0.beta.1
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 +16 -2
- data/lib/rails_blocks/path.rb +8 -3
- data/lib/rails_blocks/version.rb +1 -1
- data/lib/rails_blocks.rb +4 -0
- data/rails_blocks.gemspec +1 -1
- metadata +19 -14
- 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: 033ebb0f7ed446801f2ae9cd57276c54881fa1ce0790b67475e8c0d3d58aaf68
|
4
|
+
data.tar.gz: 909f87b36efb9f8c909de64e51564b5ca57c575253052374c4791b891f0705c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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);
|
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,12 +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
|
-
template.nil? ? empty(content) : render(
|
87
|
+
template.nil? ? empty(content) : render(template: template, locals: {content: content, options: options, slots: ctx.rendered_slots})
|
74
88
|
end
|
75
89
|
|
76
90
|
def empty(content)
|
data/lib/rails_blocks/path.rb
CHANGED
@@ -10,12 +10,14 @@ module RailsBlocks
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.tree
|
13
|
-
#so slow, переделать на оновление при запросе, а не каждый раз
|
14
|
-
#return build_tree if Rails.env.development?
|
15
13
|
@tree ||= (
|
16
14
|
build_tree
|
17
15
|
)
|
18
16
|
end
|
17
|
+
|
18
|
+
def self.reload_tree
|
19
|
+
@tree = build_tree
|
20
|
+
end
|
19
21
|
|
20
22
|
def self.blocks_dir
|
21
23
|
Rails.root.join RailsBlocks.config.blocks_dir
|
@@ -64,8 +66,11 @@ module RailsBlocks
|
|
64
66
|
files = Dir["#{blocks_dir}/**/*#{RailsBlocks.config.template_engine}"]
|
65
67
|
files.each do |file|
|
66
68
|
file.sub! blocks_dir.to_s + '/', ''
|
69
|
+
file.sub! '.html' + RailsBlocks.config.template_engine, ''
|
70
|
+
|
67
71
|
parts = file.split('/')
|
68
|
-
filename =
|
72
|
+
filename = File.basename(file, RailsBlocks.config.template_engine)
|
73
|
+
filename = File.basename(filename, '.html')
|
69
74
|
template = {
|
70
75
|
level: parts[0],
|
71
76
|
block: parts[1],
|
data/lib/rails_blocks/version.rb
CHANGED
data/lib/rails_blocks.rb
CHANGED
data/rails_blocks.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency 'rails',
|
21
|
+
spec.add_dependency 'rails', ">= 5.2", "< 7.1"
|
22
22
|
#testing
|
23
23
|
spec.add_development_dependency 'combustion', '~> 0.5.5'
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
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.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:
|
11
|
+
date: 2023-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '5.
|
19
|
+
version: '5.2'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '7.1'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '5.2'
|
30
|
+
- - "<"
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
32
|
+
version: '7.1'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: combustion
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,11 +157,11 @@ files:
|
|
151
157
|
- LICENSE.txt
|
152
158
|
- README.md
|
153
159
|
- Rakefile
|
154
|
-
- app/assets/javascripts/bem_blocks.
|
155
|
-
- app/assets/javascripts/block.
|
156
|
-
- 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
|
157
163
|
- app/assets/javascripts/rails_blocks.js
|
158
|
-
- app/assets/javascripts/utils.
|
164
|
+
- app/assets/javascripts/utils.js
|
159
165
|
- app/assets/stylesheets/rails_blocks.sass
|
160
166
|
- app/helpers/block_helper.rb
|
161
167
|
- app/views/rails_blocks/element.slim
|
@@ -221,12 +227,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
221
227
|
version: '0'
|
222
228
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
223
229
|
requirements:
|
224
|
-
- - "
|
230
|
+
- - ">"
|
225
231
|
- !ruby/object:Gem::Version
|
226
|
-
version:
|
232
|
+
version: 1.3.1
|
227
233
|
requirements: []
|
228
|
-
|
229
|
-
rubygems_version: 2.7.7
|
234
|
+
rubygems_version: 3.4.15
|
230
235
|
signing_key:
|
231
236
|
specification_version: 4
|
232
237
|
summary: Rails plugin for work with some modification of BEM methodology
|
@@ -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
|