import * as fs from "fs"; import * as readline from "readline"; import { Readable } from "stream"; import { Observer } from "rxjs/Observer"; import { Observable, Subscription } from "rxjs"; import { Line } from "./Line"; import { IExamImportParser } from "../models/IExamImportParser"; import { IParserLine } from "../models/IParserLine"; /** * Handles the parsing of file directly * * @export * @class FileParser */ export class Parser implements IExamImportParser { constructor() { } /** * Take a stream (Line) and parses * @param stream stream to parse */ private parse(stream: Readable): Observable { return Observable.create((observer: any) => { let lineNo = 0; let eof = false; const rl = readline.createInterface({ input: stream, terminal: false }); rl.on("line", line => { if (line != null && line.length > 0) { observer.next(new Line(lineNo++, line)); } }); rl.on("close", () => { observer.complete(); }); }); } /** * Opens a file and starts breaking down the lines * * @param {string} fileName * @returns {(Subscriber | null)} * @memberof FileParser */ open(fileName: string): Observable { const readStream = fs.createReadStream(fileName); return this.parse(readStream); } fromString(file: string): Observable { let stream = new Readable(); stream.push(file); stream.push(null); return this.parse(stream); } }