bemer 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/{LICENSE-RU → LICENSE-RU.txt} +0 -0
- data/{LICENSE → LICENSE.txt} +5 -5
- data/README.md +47 -16
- data/docs/BEMHTML.md +5 -0
- data/docs//320/232/320/276/320/275/321/202/320/265/320/272/321/201/321/202-/321/203/320/267/320/273/320/260.md +275 -0
- data/docs//320/232/320/276/320/275/321/204/320/270/320/263/321/203/321/200/320/260/321/206/320/270/321/217.md +158 -0
- data/docs//320/237/321/200/320/265/320/264/320/270/320/272/320/260/321/202/321/213.md +205 -0
- data/docs//320/240/320/265/320/266/320/270/320/274/321/213.md +274 -0
- data/docs//320/241/320/276/320/267/320/264/320/260/320/275/320/270/320/265-/320/270-/320/270/321/201/320/277/320/276/320/273/321/214/320/267/320/276/320/262/320/260/320/275/320/270/320/265-UI-/320/272/320/276/320/274/320/277/320/276/320/275/320/265/320/275/321/202.md +173 -0
- data/docs//320/244/320/260/320/270/314/206/320/273/320/276/320/262/320/260/321/217-/321/201/321/202/321/200/321/203/320/272/321/202/321/203/321/200/320/260.md +167 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-bem_mix.md +62 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-bem_mods.md +63 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-block_tag.md +215 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_asset_path.md +71 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_pack.md +101 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_partial_path.md +28 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-define_component.md +154 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-define_templates.md +96 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-elem_tag.md +38 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-refine_component.md +114 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-render_component.md +108 -0
- data/docs//320/250/320/260/320/261/320/273/320/276/320/275/321/213.md +44 -0
- data/lib/bemer.rb +3 -1
- data/lib/bemer/builders.rb +8 -0
- data/lib/bemer/builders/tree.rb +0 -8
- data/lib/bemer/configuration.rb +3 -1
- data/lib/bemer/context_extentions/structure.rb +2 -3
- data/lib/bemer/entity.rb +2 -2
- data/lib/bemer/entity_builder.rb +5 -9
- data/lib/bemer/helpers.rb +10 -0
- data/lib/bemer/mixin_list.rb +1 -1
- data/lib/bemer/modifier_list.rb +2 -2
- data/lib/bemer/path_resolver.rb +23 -0
- data/lib/bemer/pipeline/handler.rb +4 -6
- data/lib/bemer/railtie.rb +22 -9
- data/lib/bemer/renderer.rb +1 -1
- data/lib/bemer/template_list.rb +2 -4
- data/lib/bemer/tree.rb +3 -3
- data/lib/bemer/tree/node.rb +5 -7
- data/lib/bemer/version.rb +1 -1
- data/spec/bemer/railtie_spec.rb +95 -0
- data/spec/dummy/config/application.rb +30 -12
- data/spec/dummy/config/initializers/backtrace_silencers.rb +1 -5
- data/spec/dummy/config/initializers/bemer.rb +1 -3
- data/spec/rails_helper.rb +5 -9
- metadata +87 -129
- data/.gitignore +0 -17
- data/.overcommit.yml +0 -59
- data/.rspec +0 -4
- data/.rubocop.yml +0 -21
- data/.rubocop_todo.yml +0 -11
- data/Gemfile +0 -12
- data/Rakefile +0 -12
- data/bemer.gemspec +0 -43
- data/spec/dummy/Rakefile +0 -8
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +0 -4
- data/spec/dummy/app/jobs/application_job.rb +0 -4
- data/spec/dummy/app/mailers/application_mailer.rb +0 -6
- data/spec/dummy/app/models/application_record.rb +0 -5
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +0 -13
- data/spec/dummy/app/views/layouts/mailer.text.erb +0 -1
- data/spec/dummy/bin/bundle +0 -5
- data/spec/dummy/bin/rails +0 -6
- data/spec/dummy/bin/rake +0 -6
- data/spec/dummy/bin/setup +0 -39
- data/spec/dummy/bin/update +0 -31
- data/spec/dummy/bin/yarn +0 -13
- data/spec/dummy/config/cable.yml +0 -10
- data/spec/dummy/config/database.yml +0 -25
- data/spec/dummy/config/environments/development.rb +0 -51
- data/spec/dummy/config/environments/production.rb +0 -84
- data/spec/dummy/config/environments/test.rb +0 -44
- data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -7
- data/spec/dummy/config/initializers/cookies_serializer.rb +0 -7
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -6
- data/spec/dummy/config/initializers/inflections.rb +0 -17
- data/spec/dummy/config/initializers/mime_types.rb +0 -5
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
- data/spec/dummy/config/locales/en.yml +0 -33
- data/spec/dummy/config/puma.rb +0 -58
- data/spec/dummy/config/routes.rb +0 -5
- data/spec/dummy/config/secrets.yml +0 -32
- data/spec/dummy/config/spring.rb +0 -8
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/package.json +0 -5
- data/spec/dummy/public/404.html +0 -67
- data/spec/dummy/public/422.html +0 -67
- data/spec/dummy/public/500.html +0 -66
- data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
@@ -0,0 +1,205 @@
|
|
1
|
+
# Предикаты
|
2
|
+
|
3
|
+
Позволяют указать условия для выбора узлов в структуре/дереве компонента.
|
4
|
+
|
5
|
+
#### Предикат `block`
|
6
|
+
|
7
|
+
С помощью предиката `block` можно задать условия для выбора узла(ов) с типом блок по БЭМ методологии в структуре/дереве компонента.
|
8
|
+
|
9
|
+
В качестве параметров можно указать:
|
10
|
+
1. [Название блока](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D0%B8) как `String` или `Symbol`, по умолчанию равно `'*'`.
|
11
|
+
1. Вторым параметром можно передать условие, которым может быть `Proc`, `lambda`, название метода или какое-либо выражение, для `Proc` и `lambda` в качестве аргумента будет передан контекст (context) узла, для которого происходит проверка условий.
|
12
|
+
1. `mods` задает список модификаторов которые должны присутствовать в списке модификаторов узла.
|
13
|
+
1. `mix` задает список миксов которые должны присутствовать в списке миксов узла.
|
14
|
+
|
15
|
+
##### Примеры
|
16
|
+
|
17
|
+
Выбрать блоки с названием `panel` и заменить css классы:
|
18
|
+
```slim
|
19
|
+
= render_component :panel do |template|
|
20
|
+
= template.block(:panel).cls :panel, :panel_success
|
21
|
+
```
|
22
|
+
|
23
|
+
Выбрать блоки с названием `panel` и применить несколько режимов:
|
24
|
+
```slim
|
25
|
+
/ Эквивалентные записи
|
26
|
+
= render_component :panel do |template|
|
27
|
+
= template.block(:panel).cls :panel, :panel_success
|
28
|
+
= template.block(:panel).bem true
|
29
|
+
= template.block(:panel).js true
|
30
|
+
|
31
|
+
= render_component :panel do |template|
|
32
|
+
= template.block(:panel) do |panel|
|
33
|
+
= panel.cls :panel, :panel_success
|
34
|
+
= panel.bem true
|
35
|
+
= panel.js true
|
36
|
+
```
|
37
|
+
|
38
|
+
Выбрать все блоки(с любым названием) и выключить генерацию данных связанных с БЭМ методологией:
|
39
|
+
```slim
|
40
|
+
/ Эквивалентные записи
|
41
|
+
= render_component :panel do |template|
|
42
|
+
= template.block.bem false
|
43
|
+
|
44
|
+
= render_component :panel do |template|
|
45
|
+
= template.block('*').bem false
|
46
|
+
```
|
47
|
+
|
48
|
+
Выбрать блоки без названия и выключить генерацию данных связанных с БЭМ методологией:
|
49
|
+
```slim
|
50
|
+
= render_component :panel do |template|
|
51
|
+
= template.block('').tag false
|
52
|
+
```
|
53
|
+
|
54
|
+
Выбрать все блоки которые занимают первую позицию среди своих братьев/сестер(siblings) и заменить их на строку `'Plain text'`:
|
55
|
+
```slim
|
56
|
+
= render_component :panel do |template|
|
57
|
+
= template.block('*', ->(node) { node.first? }).replace 'Plain text'
|
58
|
+
```
|
59
|
+
|
60
|
+
Выбрать блоки у которых есть микс `block__elem` и заменить их содержимое на строку `'Plain text'`:
|
61
|
+
```slim
|
62
|
+
= render_component :panel do |template|
|
63
|
+
= template.block(mix: { block: :elem }).content 'Plain text'
|
64
|
+
```
|
65
|
+
|
66
|
+
Выбрать блоки у которых есть модификатор с названием `enabled` и значением `true` и добавить `js` атрибуты:
|
67
|
+
```slim
|
68
|
+
= render_component :panel do |template|
|
69
|
+
= template.block(mods: :enabled).js true
|
70
|
+
```
|
71
|
+
|
72
|
+
#### Предикат `elem`
|
73
|
+
|
74
|
+
С помощью предиката `elem` можно задать условия для выбора узла(ов) с типом элемент по БЭМ методологии в структуре/дереве компонента.
|
75
|
+
|
76
|
+
В качестве параметров можно указать:
|
77
|
+
1. [Название элемента](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-elem_tag.md#%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D0%B8) как `String` или `Symbol`, по умолчанию равно `'*'`.
|
78
|
+
1. Вторым параметром можно передать условие, которым может быть `Proc`, `lambda`, название метода или какое-либо выражение, для `Proc` и `lambda` в качестве аргумента будет передан контекст (context) узла, для которого происходит проверка условий.
|
79
|
+
1. `block` [название блока](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D0%B8), как `String` или `Symbol`, по умолчанию равно `'*'`.
|
80
|
+
1. `mods` задает список модификаторов которые должны присутствовать в списке модификаторов узла.
|
81
|
+
1. `mix` задает список миксов которые должны присутствовать в списке миксов узла.
|
82
|
+
|
83
|
+
##### Примеры
|
84
|
+
|
85
|
+
Выбрать элементы с названием `heading` и заменить их контент/содержимое:
|
86
|
+
```slim
|
87
|
+
= render_component :panel do |template|
|
88
|
+
= template.elem(:heading).content
|
89
|
+
h3.panel-title Panel title
|
90
|
+
```
|
91
|
+
|
92
|
+
Выбрать элементы с названием `heading` и применить несколько режимов:
|
93
|
+
```slim
|
94
|
+
/ Эквивалентные записи
|
95
|
+
= render_component :panel do |template|
|
96
|
+
= template.elem(:heading).cls :css_class
|
97
|
+
= template.elem(:heading).bem true
|
98
|
+
= template.elem(:heading).js true
|
99
|
+
|
100
|
+
= render_component :panel do |template|
|
101
|
+
= template.elem(:heading) do |heading|
|
102
|
+
= heading.cls :css_class
|
103
|
+
= heading.bem true
|
104
|
+
= heading.js true
|
105
|
+
```
|
106
|
+
|
107
|
+
Выбрать все элементы(с любым названием) и выключить генерацию данных связанных с БЭМ методологией:
|
108
|
+
```slim
|
109
|
+
/ Эквивалентные записи
|
110
|
+
= render_component :panel do |template|
|
111
|
+
= template.elem.bem false
|
112
|
+
|
113
|
+
= render_component :panel do |template|
|
114
|
+
= template.elem('*', block: '*').bem false
|
115
|
+
```
|
116
|
+
|
117
|
+
Выбрать элементы без названия и отключить отображение HTML тега:
|
118
|
+
```slim
|
119
|
+
= render_component :panel do |template|
|
120
|
+
= template.elem('').tag ''
|
121
|
+
```
|
122
|
+
|
123
|
+
Выбрать все элементы которые занимают последнюю позицию среди своих братьев/сестер(siblings) и заменить их на строку `'Plain text'`:
|
124
|
+
```slim
|
125
|
+
= render_component :panel do |template|
|
126
|
+
= template.elem('*', ->(node) { node.last? }).replace 'Plain text'
|
127
|
+
```
|
128
|
+
|
129
|
+
Выбрать элементы у которых есть микс `block__elem` и заменить HTML атрибуты:
|
130
|
+
```slim
|
131
|
+
= render_component :panel do |template|
|
132
|
+
= template.block(mix: 'block__elem' }).attrs key: :val
|
133
|
+
```
|
134
|
+
|
135
|
+
Выбрать элементы у которых есть модификатор с названием `theme` и значением `green_islands` и добавить `js` атрибуты:
|
136
|
+
```slim
|
137
|
+
= render_component :panel do |template|
|
138
|
+
= template.elem(mods: { theme: :green_islands }).js key: :val
|
139
|
+
```
|
140
|
+
|
141
|
+
#### Предикат `match`
|
142
|
+
|
143
|
+
С помощью предиката `match` можно задать условия для выбора узла(ов) с типом блок и/или элемент по БЭМ методологии в структуре/дереве компонента. Если условия заданы для блоков и элементов, тогда необходимо использовать `&block` см. примеры.
|
144
|
+
|
145
|
+
В качестве параметров можно указать:
|
146
|
+
1. Условие, которым может быть `Proc`, `lambda`, название метода или какое-либо выражение, для `Proc` и `lambda` в качестве аргумента будет передан контекст (context) узла, для которого происходит проверка условий.
|
147
|
+
1. `block` название блока, как `String` или `Symbol`, по умолчанию равно `'*'`.
|
148
|
+
1. `elem` название элемента, как `String` или `Symbol`, по умолчанию равно `'*'`.
|
149
|
+
1. `mods` задает список модификаторов которые должны присутствовать в списке модификаторов узла.
|
150
|
+
1. `mix` задает список миксов которые должны присутствовать в списке миксов узла.
|
151
|
+
|
152
|
+
##### Примеры
|
153
|
+
|
154
|
+
Выбрать все блоки и элементы, и выключить генерацию данных связанных с БЭМ методологией:
|
155
|
+
```slim
|
156
|
+
/ Эквивалентные записи
|
157
|
+
= render_component :panel do |template|
|
158
|
+
= template.match do |block, elem|
|
159
|
+
= block.bem false
|
160
|
+
= elem.bem false
|
161
|
+
|
162
|
+
= render_component :panel do |template|
|
163
|
+
= template.match(block: '*', elem: '*') do |block, elem|
|
164
|
+
= block.bem false
|
165
|
+
= elem.bem false
|
166
|
+
```
|
167
|
+
|
168
|
+
Выбрать блоки без названия и отключить отображение HTML тега:
|
169
|
+
```slim
|
170
|
+
/ Эквивалентные записи
|
171
|
+
= render_component :panel do |template|
|
172
|
+
= template.match(block: '', elem: false).tag ''
|
173
|
+
|
174
|
+
= render_component :panel do |template|
|
175
|
+
= template.match(block: '', elem: nil).tag ''
|
176
|
+
```
|
177
|
+
Выбрать все элементы и отключить отображение HTML тега:
|
178
|
+
```slim
|
179
|
+
/ Эквивалентные записи
|
180
|
+
= render_component :panel do |template|
|
181
|
+
= template.match(block: false).tag ''
|
182
|
+
|
183
|
+
= render_component :panel do |template|
|
184
|
+
= template.match(block: nil).tag ''
|
185
|
+
```
|
186
|
+
|
187
|
+
Использование других параметров такое же как у предикатов `block` и `elem`.
|
188
|
+
|
189
|
+
#### Указание дополнительных условий с помощью `specify`
|
190
|
+
|
191
|
+
Метод `specify` позволяет указать дополнительные (уточнить) условия для предиката (выстроить цепочку условий), с учетом, что они еще не были объявлены до этого, есть исключения:
|
192
|
+
|
193
|
+
1. Название блока можно переопределить если оно равно `'*'`
|
194
|
+
1. Название элемента можно переопределить если оно равно `'*'` или `nil`
|
195
|
+
1. Условие которое идет вторым параметром у предикат `block` `elem` и первым параметром у `match` можно переопределять всегда
|
196
|
+
1. Параметры `mix` и `mods` можно переопределить если они еще не были объявлены
|
197
|
+
|
198
|
+
##### Примеры
|
199
|
+
|
200
|
+
```slim
|
201
|
+
= render_component :panel do |template|
|
202
|
+
= template.block(mix: :block) do |block|
|
203
|
+
= block.specify(block: :block1).tag false
|
204
|
+
= block.specify(block: :block2).tag true
|
205
|
+
```
|
@@ -0,0 +1,274 @@
|
|
1
|
+
# Режимы
|
2
|
+
|
3
|
+
**ВАЖНО**. *Только для компонент, [структура (дерево) которых была создана](Создание-и-использование-UI-компонент.md) с помощью [хелпера `define_component`](Хелпер-define_component.md) доступно использование [BEMHTML шаблонов](Шаблоны.md).*
|
4
|
+
|
5
|
+
**ВАЖНО**. *Количество режимов и правила их использования отличаются от [bem-xjst](https://github.com/bem/bem-xjst/blob/f69293e95672e387ee5f734c253bb5829654974c/docs/ru/5-templates-syntax.md#Описание-стандартных-режимов).*
|
6
|
+
|
7
|
+
**ВАЖНО**. *Порядок поиска и применения шаблонов такой же как и в [bem-xjst](https://github.com/bem/bem-xjst/blob/f69293e95672e387ee5f734c253bb5829654974c/docs/ru/7-runtime.md#Как-выбираются-и-применяются-шаблоны).*
|
8
|
+
|
9
|
+
Режимы (моды, modes) позволяют производить различные манипуляции (добавлять/изменять/заменять/удалять) над узлами дерева (структуры). При работе с BEMHTML шаблонами доступно 9 основных и 4 вспомогательных режима.
|
10
|
+
|
11
|
+
Для всех примеров используется файловая структура:
|
12
|
+
```
|
13
|
+
app/
|
14
|
+
├── assets/
|
15
|
+
| ├── javascripts/
|
16
|
+
| | └── application.js
|
17
|
+
| └── stylesheets/
|
18
|
+
| └── application.css
|
19
|
+
├── bemer_components/
|
20
|
+
| ├── common/
|
21
|
+
| | ├── alert/
|
22
|
+
| | | ├── index.html.slim
|
23
|
+
| | | ├── index.bemhtml.slim
|
24
|
+
| | | ├── index.js
|
25
|
+
| | | └── index.css
|
26
|
+
| | └── ...
|
27
|
+
| └── ...
|
28
|
+
└── ...
|
29
|
+
```
|
30
|
+
Подключение технологий JavaScript и CSS компонента `alert` при использование Sprockets:
|
31
|
+
|
32
|
+
```js
|
33
|
+
// Файл app/assets/javascripts/application.js
|
34
|
+
//= require common/alert
|
35
|
+
```
|
36
|
+
|
37
|
+
```scss
|
38
|
+
// Файл app/assets/stylesheets/application.css
|
39
|
+
//= require common/alert
|
40
|
+
```
|
41
|
+
|
42
|
+
В качестве структуры компонента `alert` будет взят [компонент `alert` из библиотеки Twitter Bootstrap](https://getbootstrap.com/docs/3.3/components/#alerts):
|
43
|
+
|
44
|
+
```html
|
45
|
+
<!-- Исходная HTML структура компонента alert из библиотеки Twitter Bootstrap -->
|
46
|
+
<div class="alert alert-info alert-dismissible" role="alert">
|
47
|
+
<button type="button" class="close" data-dismiss="alert">
|
48
|
+
<span aria-hidden="true">×</span>
|
49
|
+
</button>
|
50
|
+
<strong>Warning!</strong> Better check yourself, you're not looking too good.
|
51
|
+
</div>
|
52
|
+
```
|
53
|
+
Возможный вариант разметки компонента `alert` по БЭМ методологии:
|
54
|
+
```slim
|
55
|
+
/ Содержимое файла index.html.slim компонента alert
|
56
|
+
= define_component bem_cascade: false do |component|
|
57
|
+
= component.block :alert, tag: :div, cls: 'alert alert-dismissible', role: :alert do |alert|
|
58
|
+
= alert.elem :close, type: :button, tag: :button, cls: :close, data: { dismiss: :alert }
|
59
|
+
span aria-hidden='true' ×
|
60
|
+
= alert.elem :message, tag: false
|
61
|
+
strong> Warning!
|
62
|
+
| Better check yourself, you're not looking too good.
|
63
|
+
```
|
64
|
+
Возможный вариант шаблонов по умолчанию для компонента `alert`:
|
65
|
+
```slim
|
66
|
+
/ Содержимое файла index.bemhtml.slim компонента alert
|
67
|
+
= define_templates do |template|
|
68
|
+
= template.block(:alert).add_cls :alert_info
|
69
|
+
```
|
70
|
+
HTML структура компонента `alert` после вызова `render_component`:
|
71
|
+
```slim
|
72
|
+
/ Шаблонизатор Slim
|
73
|
+
= render_component 'common/alert'
|
74
|
+
|
75
|
+
/ =>
|
76
|
+
/ <div role="alert" class="alert alert-dismissible alert-info">
|
77
|
+
/ <button type="button" data-dismiss="alert" class="close">
|
78
|
+
/ <span aria-hidden="true">×</span>
|
79
|
+
/ </button>
|
80
|
+
/ <strong>Warning!</strong> Better check yourself, you're not looking too good.
|
81
|
+
/ </div>
|
82
|
+
```
|
83
|
+
|
84
|
+
## Основные режимы
|
85
|
+
|
86
|
+
Список основных режимов и порядок их применения: `replace`, `content`, `tag`, `cls`, `attrs`, `bem`, `mods`, `mix`, `js`.
|
87
|
+
|
88
|
+
### Режим `replace`
|
89
|
+
|
90
|
+
**ВАЖНО**. *Режим `content` работает быстрее режима `replace`.*
|
91
|
+
|
92
|
+
**ВАЖНО**. *В тело шаблона вторым параметром передается билдер (builder) компонента.*
|
93
|
+
|
94
|
+
**ВАЖНО**. *Методы `ctx` и `content` доступны ТОЛЬКО в режимах `replace` и `content`*.
|
95
|
+
|
96
|
+
Заменяет/удаляет узел в дереве(структуре) компонента.
|
97
|
+
|
98
|
+
Аргументом метода (телом шаблона) может быть `String`, `Proc`, `lambda` или `&block`.
|
99
|
+
|
100
|
+
Найти элемент `message` и заменить на другой текст:
|
101
|
+
```slim
|
102
|
+
/ Шаблонизатор Slim
|
103
|
+
= render_component 'common/alert' do |template|
|
104
|
+
= template.elem(:message).replace
|
105
|
+
strong> Heads up!
|
106
|
+
| This
|
107
|
+
=< link_to 'alert needs your attention', '#', class: 'alert-link'
|
108
|
+
| , but it's not super important.
|
109
|
+
|
110
|
+
/ =>
|
111
|
+
/ <div role="alert" class="alert alert-dismissible alert-info">
|
112
|
+
/ <button type="button" data-dismiss="alert" class="close">
|
113
|
+
/ <span aria-hidden="true">×</span>
|
114
|
+
/ </button>
|
115
|
+
/ <strong>Heads up!</strong>
|
116
|
+
/ This <a class="alert-link" href="#">alert needs your attention</a>,
|
117
|
+
/ but it's not super important.
|
118
|
+
/ </div>
|
119
|
+
```
|
120
|
+
|
121
|
+
Найти элемент `close` и заменить на пустую строку, т.е. будет выполнено удаление:
|
122
|
+
```slim
|
123
|
+
/ Шаблонизатор Slim
|
124
|
+
= render_component 'common/alert' do |template|
|
125
|
+
= template.elem(:close).replace
|
126
|
+
|
127
|
+
/ =>
|
128
|
+
/ <div role="alert" class="alert alert-dismissible alert-info">
|
129
|
+
/ <strong>Warning!</strong> Better check yourself, you're not looking too good.
|
130
|
+
/ </div>
|
131
|
+
```
|
132
|
+
|
133
|
+
### Режим `content`
|
134
|
+
|
135
|
+
**ВАЖНО**. *Режим `content` работает быстрее режима `replace`.*
|
136
|
+
|
137
|
+
**ВАЖНО**. *В тело шаблона вторым параметром передается билдер (builder) компонента.*
|
138
|
+
|
139
|
+
**ВАЖНО**. *Методы `ctx` и `content` доступны ТОЛЬКО в режимах `replace` и `content`*.
|
140
|
+
|
141
|
+
Заменяет/удаляет содержимое узла в дереве(структуре) компонента.
|
142
|
+
|
143
|
+
Аргументом метода (телом шаблона) может быть `String`, `Proc`, `lambda` или `&block`.
|
144
|
+
|
145
|
+
Пример из режима `replace`, будет работать быстрее для режима `content`:
|
146
|
+
```slim
|
147
|
+
/ Шаблонизатор Slim
|
148
|
+
= render_component 'common/alert' do |template|
|
149
|
+
= template.elem(:message).content
|
150
|
+
strong> Heads up!
|
151
|
+
| This
|
152
|
+
=< link_to 'alert needs your attention', '#', class: 'alert-link'
|
153
|
+
| , but it's not super important.
|
154
|
+
|
155
|
+
/ =>
|
156
|
+
/ <div role="alert" class="alert alert-dismissible alert-info">
|
157
|
+
/ <button type="button" data-dismiss="alert" class="close">
|
158
|
+
/ <span aria-hidden="true">×</span>
|
159
|
+
/ </button>
|
160
|
+
/ <strong>Heads up!</strong>
|
161
|
+
/ This <a class="alert-link" href="#">alert needs your attention</a>,
|
162
|
+
/ but it's not super important.
|
163
|
+
/ </div>
|
164
|
+
```
|
165
|
+
|
166
|
+
### Режим `tag`
|
167
|
+
|
168
|
+
Изменяет [параметр `tag`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-tag) аргументом (телом шаблона) может быть `Proc` и `lambda`.
|
169
|
+
|
170
|
+
### Режим `cls`
|
171
|
+
|
172
|
+
Изменяет [параметр `cls`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-cls-%D1%81%D0%B8%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC-class) аргументом (телом шаблона) может быть `Proc` и `lambda`.
|
173
|
+
|
174
|
+
### Режим `attrs`
|
175
|
+
|
176
|
+
Изменяет [HTML атрибуты](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%90%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D1%8B), аргументом (телом шаблона) может быть `Hash`, `Proc`, `lambda` или `Array`.
|
177
|
+
|
178
|
+
### Режим `bem`
|
179
|
+
|
180
|
+
Изменяет [параметр `bem`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-bem) аргументом (телом шаблона) может быть `Proc` и `lambda`.
|
181
|
+
|
182
|
+
### Режим `mods`
|
183
|
+
|
184
|
+
Изменяет [параметр `mods`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-mods) аргументом (телом шаблона) может быть `Proc` и `lambda`.
|
185
|
+
|
186
|
+
### Режим `mix`
|
187
|
+
|
188
|
+
Изменяет [параметр `mix`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-mix) аргументом (телом шаблона) может быть `Proc` и `lambda`.
|
189
|
+
|
190
|
+
### Режим `js`
|
191
|
+
|
192
|
+
Изменяет [параметр `js`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-js) аргументом (телом шаблона) может быть `Proc` и `lambda`.
|
193
|
+
|
194
|
+
## Вспомогательные режимы
|
195
|
+
|
196
|
+
**ВАЖНО**. *Вспомогательные режимы это всего лишь синтаксический сахар (syntactic sugar) для некоторых основных режимов.*
|
197
|
+
|
198
|
+
Список вспомогательных режимов: `add_attrs`, `add_cls`, `add_mix`, `add_mods`.
|
199
|
+
|
200
|
+
### Режим `add_attrs`
|
201
|
+
|
202
|
+
**ВАЖНО**. *Аргументы такие же как и у режима `attrs`.*
|
203
|
+
|
204
|
+
Добавляет HTML атрибуты.
|
205
|
+
|
206
|
+
```slim
|
207
|
+
/ Эквивалентные записи
|
208
|
+
= render_component 'common/alert' do |template|
|
209
|
+
= template.block(:alert).add_attrs key: :value
|
210
|
+
|
211
|
+
= render_component 'common/alert' do |template|
|
212
|
+
= template.block(:alert).attrs ->(node) { node.apply_next.merge!(key: :value) }
|
213
|
+
|
214
|
+
= render_component 'common/alert' do |template|
|
215
|
+
= template.block(:alert).attrs ->(node) { node.apply(:attrs).merge!(key: :value) }
|
216
|
+
```
|
217
|
+
|
218
|
+
### Режим `add_cls`
|
219
|
+
|
220
|
+
**ВАЖНО**. *Аргументы такие же как и у режима `cls`.*
|
221
|
+
|
222
|
+
Добавляет css классы.
|
223
|
+
|
224
|
+
```slim
|
225
|
+
/ Эквивалентные записи
|
226
|
+
= render_component 'common/alert' do |template|
|
227
|
+
= template.block(:alert).add_cls :css_class
|
228
|
+
|
229
|
+
= render_component 'common/alert' do |template|
|
230
|
+
= template.block(:alert).cls ->(node) { node.apply_next << :css_class }
|
231
|
+
|
232
|
+
= render_component 'common/alert' do |template|
|
233
|
+
= template.block(:alert).cls ->(node) { node.apply(:cls) << :css_class }
|
234
|
+
```
|
235
|
+
|
236
|
+
### Режим `add_mix`
|
237
|
+
|
238
|
+
**ВАЖНО**. *Аргументы такие же как и у режима `mix`.*
|
239
|
+
|
240
|
+
Добавляет миксы.
|
241
|
+
|
242
|
+
```slim
|
243
|
+
/ Эквивалентные записи
|
244
|
+
= render_component 'common/alert' do |template|
|
245
|
+
= template.block(:alert).add_mix block: :elem
|
246
|
+
|
247
|
+
= render_component 'common/alert' do |template|
|
248
|
+
= template.block(:alert).mix ->(node) { node.apply_next << { block: :elem } }
|
249
|
+
|
250
|
+
= render_component 'common/alert' do |template|
|
251
|
+
= template.block(:alert).mix ->(node) { node.apply(:mix) << { block: :elem } }
|
252
|
+
|
253
|
+
/ С использованием хелпера bem_mix
|
254
|
+
= render_component 'common/alert' do |template|
|
255
|
+
= template.block(:alert).mix ->(node) { node.apply(:mix) << bem_mix(block: :elem) }
|
256
|
+
```
|
257
|
+
|
258
|
+
### Режим `add_mods`
|
259
|
+
|
260
|
+
**ВАЖНО**. *Аргументы такие же как и у режима `mods`.*
|
261
|
+
|
262
|
+
Добавляет модификаторы.
|
263
|
+
|
264
|
+
```slim
|
265
|
+
/ Эквивалентные записи
|
266
|
+
= render_component 'common/alert' do |template|
|
267
|
+
= template.block(:alert).add_mods :enabled
|
268
|
+
|
269
|
+
= render_component 'common/alert' do |template|
|
270
|
+
= template.block(:alert).mods ->(node) { node.apply_next.merge!(enabled: true) }
|
271
|
+
|
272
|
+
= render_component 'common/alert' do |template|
|
273
|
+
= template.block(:alert).mods ->(node) { node.apply(:mods).merge!(enabled: true) }
|
274
|
+
```
|