/** @fileOverview Module for internal BEM helpers */ /** @requires BEM */ (function(BEM, $, undefined) { /** * Separator for modifiers and their values * @const * @type String */ var MOD_DELIM = '_', /** * Separator between names of a block and a nested element * @const * @type String */ ELEM_DELIM = '__', /** * Pattern for acceptable element and modifier names * @const * @type String */ NAME_PATTERN = '[a-zA-Z0-9-]+'; function buildModPostfix(modName, modVal, buffer) { buffer.push(MOD_DELIM, modName, MOD_DELIM, modVal); } function buildBlockClass(name, modName, modVal, buffer) { buffer.push(name); modVal && buildModPostfix(modName, modVal, buffer); } function buildElemClass(block, name, modName, modVal, buffer) { buildBlockClass(block, undefined, undefined, buffer); buffer.push(ELEM_DELIM, name); modVal && buildModPostfix(modName, modVal, buffer); } BEM.INTERNAL = { NAME_PATTERN : NAME_PATTERN, MOD_DELIM : MOD_DELIM, ELEM_DELIM : ELEM_DELIM, buildModPostfix : function(modName, modVal, buffer) { var res = buffer || []; buildModPostfix(modName, modVal, res); return buffer? res : res.join(''); }, /** * Builds the class of a block or element with a modifier * @private * @param {String} block Block name * @param {String} [elem] Element name * @param {String} [modName] Modifier name * @param {String} [modVal] Modifier value * @param {Array} [buffer] Buffer * @returns {String|Array} Class or buffer string (depending on whether the buffer parameter is present) */ buildClass : function(block, elem, modName, modVal, buffer) { var typeOf = typeof modName; if(typeOf == 'string') { if(typeof modVal != 'string') { buffer = modVal; modVal = modName; modName = elem; elem = undefined; } } else if(typeOf != 'undefined') { buffer = modName; modName = undefined; } else if(elem && typeof elem != 'string') { buffer = elem; elem = undefined; } if(!(elem || modName || buffer)) { // оптимизация для самого простого случая return block; } var res = buffer || []; elem? buildElemClass(block, elem, modName, modVal, res) : buildBlockClass(block, modName, modVal, res); return buffer? res : res.join(''); }, /** * Builds full classes for a buffer or element with modifiers * @private * @param {String} block Block name * @param {String} [elem] Element name * @param {Object} [mods] Modifiers * @param {Array} [buffer] Buffer * @returns {String|Array} Class or buffer string (depending on whether the buffer parameter is present) */ buildClasses : function(block, elem, mods, buffer) { if(elem && typeof elem != 'string') { buffer = mods; mods = elem; elem = undefined; } var res = buffer || []; elem? buildElemClass(block, elem, undefined, undefined, res) : buildBlockClass(block, undefined, undefined, res); mods && $.each(mods, function(modName, modVal) { if(modVal) { res.push(' '); elem? buildElemClass(block, elem, modName, modVal, res) : buildBlockClass(block, modName, modVal, res); } }); return buffer? res : res.join(''); /*var typeOf = typeof elem; if(typeOf != 'string' && typeOf != 'undefined') { buffer = mods; mods = elem; elem = undefined; } if($.isArray(mods)) { buffer = mods; mods = undefined; } var res = buffer || []; buildClasses(block, elem, mods, res); return buffer? res : res.join('');*/ } } })(BEM, jQuery);