bem
Version:
158 lines (121 loc) • 4.09 kB
JavaScript
/** @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);