enb
Version:
Faster BEM/BEViS assembler
103 lines (99 loc) • 3.2 kB
JavaScript
/**
* LevelBuilder
* ============
*/
var inherit = require('inherit');
var fs = require('fs');
var Vow = require('vow');
/**
* Построитель структуры уровня переопределения.
*
* @name LevelBuilder
*/
module.exports = inherit({
/**
* Конструктор.
*/
__constructor: function () {
this._blocks = {};
},
/**
* Добавляет декларацию файла.
* @param {String} filename
* @param {String} blockName
* @param {String} elemName
* @param {String} modName
* @param {String} modVal
*/
addFile: function (filename, blockName, elemName, modName, modVal) {
var baseName = filename.split('/').slice(-1)[0];
var baseNameParts = baseName.split('.');
var stat = fs.statSync(filename);
var suffix = baseNameParts.slice(1).join('.');
var fileInfo = {
name: baseName,
fullname: filename,
suffix: suffix,
mtime: stat.mtime.getTime(),
isDirectory: stat.isDirectory()
};
if (fileInfo.isDirectory) {
fileInfo.files = filterFiles(fs.readdirSync(filename)).map(function (subFilename) {
var subFullname = filename + '/' + subFilename;
var subStat = fs.statSync(subFullname);
return {
name: subFilename,
fullname: subFullname,
suffix: subFilename.split('.').slice(1).join('.'),
mtime: subStat.mtime.getTime(),
isDirectory: subStat.isDirectory()
};
});
}
var block = this._blocks[blockName] || (this._blocks[blockName] = {
name: blockName,
files: [],
dirs: [],
elements: {},
mods: {}
});
var destElement;
if (elemName) {
destElement = block.elements[elemName] || (block.elements[elemName] = {
name: elemName,
files: [],
dirs: [],
mods: {}
});
} else {
destElement = block;
}
var collectionKey = fileInfo.isDirectory ? 'dirs' : 'files';
if (modName) {
var mod = destElement.mods[modName] || (destElement.mods[modName] = {});
var modValueFiles = (mod[modVal] || (mod[modVal] = {files: [], dirs: []}))[collectionKey];
modValueFiles.push(fileInfo);
} else {
destElement[collectionKey].push(fileInfo);
}
},
/**
* Возвращает структуру блоков/элементов/модификаторов.
* @returns {Object}
*/
getBlocks: function () {
return this._blocks;
},
/**
* Выполняет построение уровня переопределения.
* @returns {Promise}
*/
build: function () {
return Vow.fulfill();
}
});
function filterFiles(filenames) {
return filenames.filter(function (filename) {
return filename.charAt(0) !== '.';
});
}