Skip to content

Commit

Permalink
* Реализован перезапуск шаблонов при изменении модификаторов элементо…
Browse files Browse the repository at this point in the history
…в и модификаторов блоков элементов

* Настроен travis и coveralls
  • Loading branch information
tenorok committed Nov 21, 2014
2 parents eaebf27 + 31bcb2f commit 6187c55
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 6 deletions.
18 changes: 18 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
language: node_js

node_js:
- "0.10"

branches:
only:
- master
- dev

install:
- npm install

script:
- grunt test lint

after_success:
- grunt coverage coveralls
3 changes: 3 additions & 0 deletions Gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ module.exports = function(grunt) {
root: 'test/tmp/'
}
}
},
coveralls: {
src: 'coverage/lcov.info'
}
});

Expand Down
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# Bemer — БЭМ-шаблонизатор
[![npm version](https://badge.fury.io/js/bemer.svg)](http://badge.fury.io/js/bemer)
[![Build Status](https://travis-ci.org/tenorok/bemer.svg?branch=master)](https://travis-ci.org/tenorok/bemer)
[![Coverage Status](https://img.shields.io/coveralls/tenorok/bemer/master.svg)](https://coveralls.io/r/tenorok/bemer)

БЭМ — это методология эффективной разработки веб-приложений.
Большое количество информации размещено на официальном сайте [http://ru.bem.info](http://ru.bem.info).
Expand Down Expand Up @@ -501,6 +504,18 @@ bemer({ block: 'header', elem: 'logo' });
<div class="header_theme_blue__logo"></div>
```

При изменении списка модификаторов автоматически накладываются подходящие шаблоны:
```js
bemer
.match('button', { mods: { theme: 'normal' }})
.match('button_theme_normal', { tag: 'span' });
bemer({ block: 'button' });
```

```html
<span class="button button_theme_normal"></span>
```

###### Поле `elemMods`

Тип: `{object}`
Expand All @@ -521,6 +536,18 @@ bemer({ block: 'header', elem: 'logo' });
<div class="header__logo header__logo_size_s"></div>
```

При изменении списка модификаторов автоматически накладываются подходящие шаблоны:
```js
bemer
.match('button__label', { elemMods: { size: 'm' }})
.match('button__label_size_m', { tag: 'label' });
bemer({ block: 'button', elem: 'label' });
```

```html
<label class="button__label button__label_size_m"></label>
```

###### Поле `mix`

Тип: `{array}`
Expand Down
3 changes: 2 additions & 1 deletion modules/Pool.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,8 @@ definer('Pool', /** @exports Pool */ function(array, object) {
processedTemplates.push(this.pool[index]);

// Если изменился набор модификаторов, шаблоны нужно прогонять заново.
if(!object.isEqual(currentBemjson.mods || {}, node.bemjson().mods || {})) {
if(!object.isEqual(currentBemjson.mods || {}, node.bemjson().mods) ||
!object.isEqual(currentBemjson.elemMods || {}, node.bemjson().elemMods)) {
index = this.pool.length;
}
}
Expand Down
10 changes: 6 additions & 4 deletions modules/Template.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,12 @@ definer('Template', /** @exports Template */ function( /* jshint maxparams: fals
}

if(this._matches[i].is(bemjson)) {
processedMods.push({
modName: mods.modName,
elemModName: mods.elemModName
});
if(mods.modName !== '' || mods.elemModName !== '') {
processedMods.push({
modName: mods.modName,
elemModName: mods.elemModName
});
}
return this.transform(object.clone(bemjson), data, baseBemjson, modesFromAnotherTemplates, index);
}
}
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"grunt-contrib-uglify": "~0.4.0",
"grunt-mocha-istanbul": "~2.1.0",
"benchmark": "~1.0.0",
"beautify-benchmark": "~0.2.4"
"beautify-benchmark": "~0.2.4",
"grunt-coveralls": "~1.0.0"
}
}
86 changes: 86 additions & 0 deletions test/bemerTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,92 @@ definer('bemerTest', function(assert, bemer, Helpers) {
);
});

describe('Изменение модификатора блока элемента.', function() {

it('Добавление нового модификатора блоку', function() {
bemer
.match('header__logo', {
mods: { a: 'foo' }
})
.match('header_a_foo__logo', {
tag: 'header'
});
assert.equal(bemer({ block: 'header', elem: 'logo' }),
'<header class="header_a_foo__logo"></header>'
);
});

it('Не нужно выполнять шаблон без модификатора после шаблона с модификатором', function() {
var i = 0;
bemer
.match('header__logo', {
construct: /* istanbul ignore next */ function() {
throw new Error('Excessively execute template');
},
tag: 'footer'
})
.match('header__logo', {
construct: function() {},
attrs: function() {
var attrs = {};
attrs['a' + i] = i++;
return attrs;
},
mods: { a: 'foo' }
})
.match('header_a_foo__logo', {
tag: 'header'
});
assert.equal(bemer({ block: 'header', elem: 'logo' }),
'<header class="header_a_foo__logo" a0="0"></header>'
);
});

});

describe('Изменение модификаторов элементов.', function() {

it('Добавление нового модификатора', function() {
bemer
.match('header__logo', {
elemMods: { a: 'foo' }
})
.match('header__logo_a_foo', {
tag: 'header'
});
assert.equal(bemer({ block: 'header', elem: 'logo' }),
'<header class="header__logo header__logo_a_foo"></header>'
);
});

it('Не нужно выполнять шаблон без модификатора после шаблона с модификатором', function() {
var i = 0;
bemer
.match('header__logo', {
construct: /* istanbul ignore next */ function() {
throw new Error('Excessively execute template');
},
tag: 'footer'
})
.match('header__logo', {
construct: function() {},
attrs: function() {
var attrs = {};
attrs['a' + i] = i++;
return attrs;
},
elemMods: { a: 'foo' }
})
.match('header__logo_a_foo', {
tag: 'header'
});
assert.equal(bemer({ block: 'header', elem: 'logo' }),
'<header class="header__logo header__logo_a_foo" a0="0"></header>'
);
});

});

});

});
Expand Down

0 comments on commit 6187c55

Please sign in to comment.