Skip to content

Commit

Permalink
Merge cabb2f4 into e72fe2e
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrew Abramov committed Aug 21, 2014
2 parents e72fe2e + cabb2f4 commit 9b3fe75
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 29 deletions.
12 changes: 6 additions & 6 deletions README.md
Expand Up @@ -223,18 +223,18 @@ To use your own naming convention to define strings that represent BEM-entities

Constructor `BEMNaming` gets the object from the following options:

* **String** `modSeparator` — separates names and values of modifiers from blocks and elements. Default as `_`.
* **String** `elemSeparator` — separates element's name from block. Default as `__`.
* **String** `literal` — defines which symbols can be used for block, element and modifier's names. Default as `[a-zA-Z0-9-]`.
* **String** `elem` — separates element's name from block. Default as `__`.
* **String** `mod` — separates names and values of modifiers from blocks and elements. Default as `_`.
* **String** `wordPattern` — defines which symbols can be used for block, element and modifier's names. Default as `[a-z0-9]+(?:-[a-z0-9]+)*`.

Example:

```js
var BEMNaming = bemNaming.BEMNaming;
var myNaming = new BEMNaming({
elemSeparator: '-',
modSeparator: '--',
literal: '[a-zA-Z0-9]' // because element and modifier's separators include
elem: '-',
mod: '--',
wordPattern: '[a-zA-Z0-9]+' // because element and modifier's separators include
}); // hyphen in it, we need to exclude it from block,
// element and modifier's name

Expand Down
12 changes: 6 additions & 6 deletions README.ru.md
Expand Up @@ -223,18 +223,18 @@ bemNaming.isElemMod({ block: 'block',

Конструктор `BEMNaming` принимает объект из следующих опций:

* **String** `modSeparator` — отделяет названия и значения модификаторов от блоков и элементов. По умолчанию  `_`.
* **String** `elemSeparator` — отделяет имя элемента от блока. По умолчанию  `__`.
* **String** `literal` — определяет, какие символы могут быть использованы в именах блоков, элементов и модификаторов. По умолчанию  `[a-zA-Z0-9-]`.
* **String** `elem` — отделяет имя элемента от блока. По умолчанию  `__`.
* **String** `mod` — отделяет названия и значения модификаторов от блоков и элементов. По умолчанию  `_`.
* **String** `wordPattern` — определяет, какие символы могут быть использованы в именах блоков, элементов и модификаторов. По умолчанию  `[a-z0-9]+(?:-[a-z0-9]+)*`.

Пример:

```js
var BEMNaming = bemNaming.BEMNaming;
var myNaming = new BEMNaming({
elemSeparator: '-',
modSeparator: '--',
literal: '[a-zA-Z0-9]' // т.к. сепараторы элемента и модификаотра включают
elem: '-',
mod: '--',
wordPattern: '[a-zA-Z0-9]+' // т.к. сепараторы элемента и модификаотра включают
}); // в себя дефис, исключим его из имён блоков,
// элементов и модификаторов

Expand Down
30 changes: 13 additions & 17 deletions lib/bem-naming.js
@@ -1,28 +1,24 @@
(function (global) {

var LITERAL = '[a-zA-Z0-9-]',
MOD_SEPARATOR = '_',
ELEM_SEPARATOR = '__';

/**
* BEMNaming allows getting information about BEM-entity using string as well as forming string
* representation based on BEM-naming.
*
* @param {Object} [options]
* @param {Object} [options.modSeparator='_'] Separates names and values of modifiers from blocks and elements.
* @param {Object} [options.elemSeparator='__'] Separates element's name from block.
* @param {Object} [options.literal='[a-zA-Z0-9-]'] Defines which symbols can be used for block,
* element and modifier's names.
* @param {Object} [options.elem='__'] Separates element's name from block.
* @param {Object} [options.mod='_'] Separates names and values of modifiers from blocks and elements.
* @param {Object} [options.wordPattern='[a-z0-9]+(?:-[a-z0-9]+)*'] Defines which symbols can be used for block,
* element and modifier's names.
*
* @name BEMNaming
* @constructor
*/
var BEMNaming = function (options) {
options || (options = {});

this._modSeparator = options.modSeparator || MOD_SEPARATOR;
this._elemSeparator = options.elemSeparator || ELEM_SEPARATOR;
this._literal = options.literal || LITERAL;
this._elemDelimiter = options.elem || options.elemSeparator || '__';
this._modDelimiter = options.mod || options.modSeparator || '_';
this._wordPattern = options.wordPattern || options.literal && (options.literal + '+') || '[a-z0-9]+(?:-[a-z0-9]+)*';

this._buildRegex();
};
Expand Down Expand Up @@ -129,29 +125,29 @@ BEMNaming.prototype.stringify = function (obj) {
var buf = [obj.block];

if (obj.elem) {
buf.push(this._elemSeparator + obj.elem);
buf.push(this._elemDelimiter + obj.elem);
}

if (obj.modName) {
var modVal = obj.modVal;

if (modVal || modVal === 0 || !obj.hasOwnProperty('modVal')) {
buf.push(this._modSeparator + obj.modName);
buf.push(this._modDelimiter + obj.modName);
}

if (modVal && modVal !== true) {
buf.push(this._modSeparator + modVal);
buf.push(this._modDelimiter + modVal);
}
}

return buf.join('');
};

BEMNaming.prototype._buildRegex = function () {
var word = this._literal + '+',
var word = this._wordPattern,
block = '(' + word + ')',
mod = '(?:' + this._modSeparator + '(' + word + '))?',
elem = '(?:' + this._elemSeparator + '(' + word + '))?';
elem = '(?:' + this._elemDelimiter + '(' + word + '))?',
mod = '(?:' + this._modDelimiter + '(' + word + '))?';

this._regex = new RegExp(['^', block, mod, mod, '$|^', block, elem, mod, mod, '$'].join(''));
};
Expand Down

0 comments on commit 9b3fe75

Please sign in to comment.