| |
| 'use strict' |
| |
| const fs = require('fs') |
| const stream = require('stream') |
| |
| const parse = require('./parser') |
| |
| const stringify = require('./stringifier') |
| |
| module.exports = parse |
| |
| module.exports.stringify = stringify |
| |
| /* ------- Transform stream ------- */ |
| |
| class Parser extends stream.Transform { |
| constructor (opts) { |
| opts = opts || {} |
| super({ objectMode: true }) |
| this._extract = parse.mkextract(opts) |
| } |
| |
| _transform (data, encoding, done) { |
| let block |
| const lines = data.toString().split(/\n/) |
| |
| while (lines.length) { |
| block = this._extract(lines.shift()) |
| if (block) { |
| this.push(block) |
| } |
| } |
| |
| done() |
| } |
| } |
| |
| module.exports.stream = function stream (opts) { |
| return new Parser(opts) |
| } |
| |
| /* ------- File parser ------- */ |
| |
| module.exports.file = function file (file_path, done) { |
| let opts = {} |
| const collected = [] |
| |
| if (arguments.length === 3) { |
| opts = done |
| done = arguments[2] |
| } |
| |
| return fs.createReadStream(file_path, { encoding: 'utf8' }) |
| .on('error', done) |
| .pipe(new Parser(opts)) |
| .on('error', done) |
| .on('data', function (data) { |
| collected.push(data) |
| }) |
| .on('finish', function () { |
| done(null, collected) |
| }) |
| } |