enb
Version:
Faster BEM/BEViS assembler
104 lines (96 loc) • 3.36 kB
JavaScript
/**
* FileList
* ========
*/
var fs = require('fs'),
inherit = require('inherit'),
path = require('path');
/**
* FileList — класс для работы со списком файлов.
* Умеет быстро выдавать файлы по суффиксу.
* @name FileList
* @class
*/
module.exports = inherit({
/**
* Конструктор.
*/
__constructor: function () {
this.items = [];
this.slices = [];
this.bySuffix = {};
},
/**
* Добавляет файлы в FileList.
* Каждый файл описывается в виде:
* { fullname: <абсолютный путь к файлу>, name: <имя файла>, suffix: <суффикс>, mtime: <время изменения> }
* @param {Object[]} files
*/
addFiles: function (files) {
this.slices.push(files);
for (var i = 0, l = files.length; i < l; i++) {
var file = files[i];
this.items.push(file);
(this.bySuffix[file.suffix] || (this.bySuffix[file.suffix] = [])).push(file);
}
},
/**
* Возвращает файлы по суффиксу.
* Каждый файл описывается в виде:
* { fullname: <абсолютный путь к файлу>, name: <имя файла>, suffix: <суффикс>, mtime: <время изменения> }
* @param {String|String[]} suffix.
* @returns {Object[]}
*/
getBySuffix: function (suffix) {
if (Array.isArray(suffix) && suffix.length === 1) {
suffix = suffix[0];
}
if (Array.isArray(suffix)) {
var res = [];
this.slices.forEach(function (slice) {
suffix.forEach(function (s) {
for (var i = 0, l = slice.length; i < l; i++) {
var file = slice[i];
if (file.suffix === s) {
res.push(file);
}
}
});
});
return res;
} else {
return this.bySuffix[suffix] || [];
}
},
/**
* Возвращает файлы по имени.
* Каждый файл описывается в виде:
* { fullname: <абсолютный путь к файлу>, name: <имя файла>, suffix: <суффикс>, mtime: <время изменения> }
* @param {String} name.
* @returns {Object[]}
*/
getByName: function (name) {
return this.items.filter(function (file) {
return file.name === name;
});
},
/**
* Возвращает информацию о файле в виде:
* { fullname: <абсолютный путь к файлу>, name: <имя файла>, suffix: <суффикс>, mtime: <время изменения> }
*/
getFileInfo: getFileInfo
}, {
getFileInfo: getFileInfo
});
function getFileInfo(filename) {
var baseName = path.basename(filename),
suffix = baseName.split('.').slice(1).join('.'),
stat = fs.statSync(filename);
return {
name: baseName,
fullname: filename,
suffix: suffix,
mtime: stat.mtime.getTime(),
isDirectory: stat.isDirectory()
};
}