fs-grep
Version:
Contents of the file grep
215 lines (165 loc) • 5.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
exports.exec = exec;
var _fsReadline = require('fs-readline');
var _fsReadline2 = _interopRequireDefault(_fsReadline);
var _glob = require('glob');
var _glob2 = _interopRequireDefault(_glob);
var _events = require('events');
var _events2 = _interopRequireDefault(_events);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// import iconv from 'iconv-lite';
var Grep = function () {
/**
* 构造函数
*
* @param {Object} options 配置参数
*/
function Grep(options) {
(0, _classCallCheck3.default)(this, Grep);
this.options = (0, _extends3.default)({}, Grep.options, options);
this._event = new _events2.default();
this._init();
}
/**
* 初始化
*
* @private
*/
/**
* 默认参数
*
* @todo
* @type {Object}
*/
(0, _createClass3.default)(Grep, [{
key: '_init',
value: function _init() {
var _this = this;
var options = this.options;
var read = (0, _glob2.default)(options.files, {
nodir: true
});
/**
* 匹配的结果
* @type {Array}
*/
var result = [];
/**
* 匹配到结果的文件个数,用来计算是否结束
* @type {Number}
*/
var rseultLength = 0;
// 监听匹配事件
read.on('match', function (filepath) {
var temp = {
path: filepath,
data: []
};
// 逐行读取
var rl = (0, _fsReadline2.default)(filepath, {
blankLine: false
});
// 匹配文件个数+1
rseultLength += 1;
rl.on('line', function (line, index) {
line = line.toString(options.encoding);
if (line.indexOf(options.pattern) > -1) {
_this._emit('line', filepath, index, line);
temp.data.push({
index: index,
content: line
});
}
});
rl.on('end', function (line) {
// 让匹配文件结果减少
rseultLength -= 1;
// 如果有匹配到内容,则追加到结果集中
if (temp.data.length) {
result.push(temp);
}
if (rseultLength === 0) {
_this._emit('end', result);
}
});
// rl.on('abort', () => {
// this._emit('end', result);
// });
});
read.on('end', function () {
if (rseultLength === 0) {
_this._emit('end', result);
}
});
}
/**
* 绑定事件
*
* @param {string} name 事件名称:line,end
* @param {Function} callback 回调
*
* @return {Object} this
*/
}, {
key: 'on',
value: function on(name, callback) {
this._event.on(name, callback);
return this;
}
/**
* 触发事件
*
* @private
* @param {string} name 事件名称
* @param {...args} args args
*/
}, {
key: '_emit',
value: function _emit(name) {
var _event;
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
(_event = this._event).emit.apply(_event, [name].concat(args));
}
}]);
return Grep;
}();
/**
* 执行搜索方法
*
* @param {string} pattern 规则
* @param {string} files 文件
*
* @return {Object} 实例对象
*/
/**
* @file fs-grep
* @author xiaowu
* @email fe.xiaowu@gmail.com
*/
Grep.options = {
encoding: 'utf8',
maxResultLength: null
};
function exec(pattern, files) {
if ('string' !== typeof pattern || pattern === '') {
throw new Error('pattern is empty');
}
if ('string' !== typeof files) {
throw new Error('files is not string');
}
return new Grep({
pattern: pattern,
files: files
});
}
;