Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bhOptions #122

Merged
merged 4 commits into from
Aug 19, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 7 additions & 15 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,6 @@
* Реализована возможность добавлять класс `i-bem` к элементам ([bh#122]).
* Добавлена поддержка CSS-классов без указания принадлежности к блоку ([bh#132]).

#### Настройка BH

Изменены значения по умолчанию для хранения JS-данных в атрибуте:

* [ __*major*__ ] Опция [jsAttrName](api.ru.md#jsattrname): вместо `onclick` используется атрибут `data-bem` ([#50]).
* [ __*major*__ ] Опция [jsAttrScheme](api.ru.md#jsattrscheme): данные храняться в `json`, а не в `js` формате ([#51]).

Для конфигурации шаблонизатора в технологии добавлены следующие опции:

* [jsCls](api.ru.md#jscls) ([#49]).
* [jsElem](api.ru.md#jselem) ([#26]).
* [escapeContent](api.ru.md#escapecontent) ([#66]).

### Новая функциональность

* [Подключение сторонних библиотек](README.md#Подключение-сторонних-библиотек) c помощью опции [requires](api.ru.md#requires) ([#64]).
Expand All @@ -40,8 +27,12 @@

#### Опции технологий

* В технологию `bh-bundle` добавлена опция [scope](api.ru.md#scope) ([#75], [#80]).
* В технологию `bh-common` добавлена опция [devMode](api.ru.md#devmode) ([#78]).
* В технологию [bh-bundle](api.ru.md#bh-bundle) добавлена опция [scope](api.ru.md#scope) ([#75], [#80]).
* В технологию [bh-commonjs](api.ru.md#bh-commonjs) добавлена опция [devMode](api.ru.md#devmode) ([#78]).
* [ __*major*__ ] В технологии [bh-bundle](api.ru.md#bh-bundle) и [bh-commonjs](api.ru.md#bh-commonjs) добавлена опция [bhOptions](api.ru.md#bhoptions) ([#119]). Ее следует использовать вместо следующих опций, которые были удалены:
* `jsAttrName`
* `jsAttrScheme`
* `clsNobaseMods`
* [ __*major*__ ] Чтобы переопределить модуль `bh`, следует использовать опцию [bhFilename](api.ru.md#bhfilename) вместо `bhFile` ([#59], [#118]).
* [ __*major*__ ] Из технологии `bemjson-to-html` были удалены устаревшие опции: `destTarget` и `bemjsonTarget`. Вместо них следует использовать `target` и `bemjsonFile`, соответственно. ([#85]).

Expand Down Expand Up @@ -142,6 +133,7 @@
[bh#115]: https://github.com/bem/bh/pull/115
[bh#96]: https://github.com/bem/bh/pull/96

[#119]: https://github.com/enb-bem/enb-bh/issues/119
[#118]: https://github.com/enb-bem/enb-bh/issues/118
[#101]: https://github.com/enb-bem/enb-bh/issues/101
[#85]: https://github.com/enb-bem/enb-bh/issues/85
Expand Down
59 changes: 29 additions & 30 deletions MIGRATION-1.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,45 +8,18 @@
BH 4.0
------

В шаблонизаторе BH, начиная с версии `4.0`, произошло множество изменений, связанных с генерацией HTML-кода:
В шаблонизаторе BH, начиная с версии `4.0`, произошли следующие изменения:

* [Добавление класса i-bem](#i-bem)
* [Хранение JS-данных](#Атрибут-для-js-данных)
* [Поддержка пустых атрибутов](#Пустые-атрибуты)
* [Обход БЭМ-дерева](#Обход-бэм-дерева)
* [Поддержка BEM.I18N](#bemi18n)

### i-bem

CSS-класс `i-bem` теперь будет добавляться не только к блокам, но и к элементам.
CSS-класс `i-bem` теперь добавляется не только к блокам, но и к элементам.

Чтобы отключить такое поведение и добавлять класс только к блокам, следует использовать опцию [jsElem](api.ru.md#jselem) со значением `false`.

### Атрибут для JS-данных

JS-данные для блоков и элементов больше не предполагается хранить в `onclick` атрибуте.

```html
<div class="button i-bem" onclick="return { button: { key: 'val' } };"></div>
```

Теперь для этого нужно используется `data-bem` атрибут:

* данные в нем хранятся в формате JSON;
* атрибут обрамляется одинарными кавычками, а не двойными.

```html
<div class="button i-bem" data-bem='{ "button": { "key": "val" } }'></div>
```

Чтобы вернуть прежнее поведение, следует использовать опции [jsAttrName](api.ru.md#jsattrname) и [jsAttrScheme](api.ru.md#jsattrscheme):

```js
{
jsAttrName: 'onclick',
jsAttrScheme: 'js'
}
```
Чтобы отключить добавление класса к элементам, следует использовать опцию [bhOptions](api.ru.md#bhoptions) со значением `{ jsElem: false }`.

### Пустые атрибуты

Expand Down Expand Up @@ -164,6 +137,32 @@ module.exports = BH;

**Важно:** шаблоны и подключаемые библиотеки не должны содержать кода, специфичного для какой-то конкретной среды исполнения.

#### Настройка BH

Для настройки шаблонизатора BH вместо опций `jsAttrName`, `jsAttrScheme` и `clsNobaseMods` следует использовать опцию [bhOptions](api.ru.md#bhoptions).

**Было:**

```js
{
jsAttrName: 'data-bem',
jsAttrScheme: 'json',
clsNobaseMods: false
}
```

**Стало:**

```js
{
bhOptions: {
jsAttrName: 'data-bem',
jsAttrScheme: 'json',
clsNobaseMods: false
}
}
```

#### Изолированность шаблонов

Раньше все шаблоны, собранные с помощью технологий `bh-client`, `bh-client-module` или `bh-server-include`, выполнялись в одной области видимости.
Expand Down
88 changes: 10 additions & 78 deletions api.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,7 @@ bh-bundle
* [requires](#requires)
* [mimic](#mimic)
* [scope](#scope)
* [jsAttrName](#jsattrname)
* [jsAttrScheme](#jsattrscheme)
* [jsCls](#jscls)
* [jsElem](#jselem)
* [escapeContent](#escapecontent)
* [clsNobaseMods](#clsnobasemods)
* [bhOptions](#bhoptions)

### target

Expand Down Expand Up @@ -95,41 +90,13 @@ bh-bundle
* `template` — изолирует выполнение шаблонов друг от друга;
* `global`— позволяет выполнять шаблоны в общей области видимости.

#### jsAttrName
#### bhOptions

Тип: `String`. По умолчанию: `data-bem`.

Опция шаблонизатора BH. [Описание](https://ru.bem.info/technology/bh/current/about/#jsattrname).

#### jsAttrScheme

Тип: `String`. По умолчанию: `json`.

Опция шаблонизатора BH. [Описание](https://ru.bem.info/technology/bh/current/about/#jsattrscheme).

#### jsCls

Тип: `String | Boolean`. По умолчанию: `i-bem`.

Опция шаблонизатора BH. [Описание](https://ru.bem.info/technology/bh/current/about/#jscls).

#### jsElem

Тип: `Boolean`. По умолчанию: `true`.

Опция шаблонизатора BH. [Описание](https://github.com/bem/bh/blob/master/README.md#jselem).

#### escapeContent

Тип: `Boolean`. По умолчанию: `false`.

Опция шаблонизатора BH. [Описание](https://ru.bem.info/technology/bh/current/about/#escapecontent).

#### clsNobaseMods
Тип: `Object`. По умолчанию: `{}`.

Тип: `Boolean`. По умолчанию: `false`.
Настраивает шаблонизатор BH с помощью переданных опций.

Опция шаблонизатора BH. [Описание](https://github.com/bem/bh/blob/master/README.md#clsnobasemods).
> Возможные настройки описаны в [документации шаблонизатора](https://ru.bem.info/technology/bh/v4.1.1/about/#Настройка).

--------------------------------------

Expand Down Expand Up @@ -176,12 +143,7 @@ bh-commonjs
* [bhFilename](#bhfilename-1)
* [devMode](#devmode)
* [mimic](#mimic)
* [jsAttrName](#jsattrname)
* [jsAttrScheme](#jsattrscheme)
* [jsCls](#jscls)
* [jsElem](#jselem)
* [escapeContent](#escapecontent)
* [clsNobaseMods](#clsnobasemods)
* [bhOptions](#bhoptions-1)

#### target

Expand Down Expand Up @@ -225,43 +187,13 @@ bh-commonjs

> Принцип работы описан в разделе [Мимикрия под BEMHTML](README.md#Мимикрия-под-bemhtml).

#### jsAttrName

Тип: `String`. По умолчанию: `data-bem`.
#### bhOptions

Опция шаблонизатора BH. [Описание](https://ru.bem.info/technology/bh/current/about/#jsattrname).

Атрибут блока с параметрами инициализации.

#### jsAttrScheme

Тип: `String`. По умолчанию: `json`.

Опция шаблонизатора BH. [Описание](https://ru.bem.info/technology/bh/current/about/#jsattrscheme).

#### jsCls

Тип: `String | Boolean`. По умолчанию: `i-bem`.

Опция шаблонизатора BH. [Описание](https://ru.bem.info/technology/bh/current/about/#jscls).

#### jsElem

Тип: `Boolean`. По умолчанию: `true`.

Опция шаблонизатора BH. [Описание](https://github.com/bem/bh/blob/master/README.md#jselem).

#### escapeContent

Тип: `Boolean`. По умолчанию: `false`.

Опция шаблонизатора BH. [Описание](https://ru.bem.info/technology/bh/current/about/#escapecontent).

#### clsNobaseMods
Тип: `Object`. По умолчанию: `{}`.

Тип: `Boolean`. По умолчанию: `false`.
Настраивает шаблонизатор BH с помощью переданных опций.

Опция шаблонизатора BH. [Описание](https://github.com/bem/bh/blob/master/README.md#clsnobasemods).
> Возможные настройки описаны в [документации шаблонизатора](https://ru.bem.info/technology/bh/v4.1.1/about/#Настройка).

--------------------------------------

Expand Down
16 changes: 2 additions & 14 deletions lib/compiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,7 @@ module.exports = {
* @param {String[]} [opts.mimic] Names for export.
* @param {String} [opts.scope=template] Scope of templates execution.
* @param {Boolean} [opts.sourcemap=false] Includes inline source maps.
* @param {String} [opts.jsAttrName] Sets `jsAttrName` option for BH core.
* @param {String} [opts.jsAttrScheme] Sets `jsAttrScheme` option for BH core.
* @param {String} [opts.jsCls] Sets `jsCls` option for BH core.
* @param {Boolean} [opts.jsElem] Sets `jsElem` option for BH core.
* @param {Boolean} [opts.escapeContent=false] Sets `escapeContent` option for BH core.
* @param {Boolean} [opts.clsNobaseMods=false] Sets `clsNobaseMods` option for BH core.
* @param {String} [opts.bhOptions] Sets options for BH core.
*
* @returns {String} compiled code of BH module.
*/
Expand Down Expand Up @@ -62,14 +57,7 @@ function compile(sources, opts) {
file.writeFileContent(core.path, core.contents);
file.writeLine([
'var bh = new BH();',
'bh.setOptions({',
' jsAttrName: "' + opts.jsAttrName + '",',
' jsAttrScheme: "' + opts.jsAttrScheme + '",',
' jsCls: ' + (opts.jsCls ? ('"' + opts.jsCls + '"') : false) + ',',
' jsElem: ' + opts.jsElem + ',',
' escapeContent: ' + opts.escapeContent + ',',
' clsNobaseMods: ' + opts.clsNobaseMods,
'});'
'bh.setOptions(' + JSON.stringify(opts.bhOptions) + ');'
].join(EOL));

// `init()` will be called after all the dependencies (bh.lib) will be provided
Expand Down
23 changes: 4 additions & 19 deletions techs/bh-bundle.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,7 @@ var vow = require('vow'),
* @param {String[]} [options.mimic] Names for export.
* @param {String} [options.scope='template'] Scope of template execution.
* @param {Boolean} [options.sourcemap=false] Includes inline source maps.
* @param {String} [options.jsAttrName='data-bem'] Sets `jsAttrName` option for BH core.
* @param {String} [options.jsAttrScheme='json'] Sets `jsAttrScheme` option for BH core.
* @param {String} [options.jsCls='i-bem'] Sets `jsCls` option for BH core.
* @param {Boolean} [options.jsElem=true] Sets `jsElem` option for BH core.
* @param {Boolean} [options.escapeContent=false] Sets `escapeContent` option for BH core.
* @param {Boolean} [options.clsNobaseMods=false] Sets `clsNobaseMods` option for BH core.
* @param {Object} [options.bhOptions={}] Sets option for BH core.
*
* @example
* var BHBundleTech = require('enb-bh/techs/bh-bundle'),
Expand Down Expand Up @@ -59,12 +54,7 @@ module.exports = require('enb/lib/build-flow').create()
.defineOption('bhFilename', require.resolve('bh/lib/bh.js'))
.defineOption('requires', {})
.defineOption('mimic', ['bh'])
.defineOption('jsAttrName', 'data-bem')
.defineOption('jsAttrScheme', 'json')
.defineOption('jsCls', 'i-bem')
.defineOption('jsElem', true)
.defineOption('escapeContent', false)
.defineOption('clsNobaseMods', false)
.defineOption('bhOptions', {})
.defineOption('sourcemap', false)
.defineOption('scope', 'template')
.useFileList(['bh.js'])
Expand Down Expand Up @@ -95,15 +85,10 @@ module.exports = require('enb/lib/build-flow').create()
dirname: this.node.getDir(),
bhFilename: this._bhFilename,
sourcemap: this._sourcemap,
jsAttrName: this._jsAttrName,
jsAttrScheme: this._jsAttrScheme,
jsCls: this._jsCls,
jsElem: this._jsElem,
escapeContent: this._escapeContent,
clsNobaseMods: this._clsNobaseMods,
scope: this._scope,
mimic: [].concat(this._mimic),
requires: this._requires
requires: this._requires,
bhOptions: this._bhOptions
};

return compile(sources, opts);
Expand Down
23 changes: 3 additions & 20 deletions techs/bh-commonjs.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,7 @@ var EOL = require('os').EOL;
* @param {String} [options.bhFilename] Path to file with BH core.
* @param {String[]} [options.mimic] Names for export.
* @param {Boolean} [options.devMode=true] Drops cache for `require` of source templates.
* @param {String} [options.jsAttrName='data-bem'] Sets `jsAttrName` option for BH core.
* @param {String} [options.jsAttrScheme='json'] Sets `jsAttrScheme` option for BH core.
* @param {String} [options.jsCls='i-bem'] Sets `jsCls` option for BH core.
* @param {Boolean} [options.jsElem=true] Sets `jsElem` option for BH core.
* @param {Boolean} [options.escapeContent=false] Sets `escapeContent` option for BH core.
* @param {Boolean} [options.clsNobaseMods=false] Sets `clsNobaseMods` option for BH core.
* @param {Object} [options.bhOptions={}] Sets option for BH core.
*
* @example
* var BHCommonJSTech = require('enb-bh/techs/bh-commonjs'),
Expand Down Expand Up @@ -52,12 +47,7 @@ module.exports = require('enb/lib/build-flow').create()
.defineOption('bhFilename', require.resolve('bh/lib/bh.js'))
.defineOption('mimic', ['bh'])
.defineOption('devMode', true)
.defineOption('jsAttrName', 'data-bem')
.defineOption('jsAttrScheme', 'json')
.defineOption('jsCls', 'i-bem')
.defineOption('jsElem', true)
.defineOption('escapeContent', false)
.defineOption('clsNobaseMods', false)
.defineOption('bhOptions', {})
.useFileList(['bh.js'])
.needRebuild(function (cache) {
return cache.needRebuildFile('bh-file', this._bhFilename);
Expand Down Expand Up @@ -135,14 +125,7 @@ module.exports = require('enb/lib/build-flow').create()
devMode ? this._generateDropRequireCacheFunc() : '',
this._compileRequire('BH', bhFilename, devMode),
'var bh = new BH();',
'bh.setOptions({',
' jsAttrName: \'' + this._jsAttrName + '\',',
' jsAttrScheme: \'' + this._jsAttrScheme + '\',',
' jsCls: ' + (this._jsCls ? ('\'' + this._jsCls + '\'') : false) + ',',
' jsElem: ' + this._jsElem + ',',
' escapeContent: ' + this._escapeContent + ',',
' clsNobaseMods: ' + this._clsNobaseMods,
'});',
'bh.setOptions(' + JSON.stringify(this._bhOptions) + ');',
'',
bhFiles.map(function (file) {
return this._compileRequire(null, file.fullname, devMode);
Expand Down
Loading