UNPKG

fs-grep

Version:

Contents of the file grep

215 lines (165 loc) 5.1 kB
'use strict'; 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 }); }