From 2948cfdc27d9f1fd5afa8a0179aec29d985b4be3 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Tue, 16 Aug 2022 18:34:16 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=BD=D0=B0=D0=B4=20InpxParse?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/core/InpxParser.js | 83 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 server/core/InpxParser.js diff --git a/server/core/InpxParser.js b/server/core/InpxParser.js new file mode 100644 index 0000000..88c2f71 --- /dev/null +++ b/server/core/InpxParser.js @@ -0,0 +1,83 @@ +const path = require(path); +const ZipReader = require('./ZipReader'); + +const collectionInfo = 'collection.info'; +const structureInfo = 'structure.info'; +const versionInfo = 'version.info'; + +const defaultStructure = 'AUTHOR;GENRE;TITLE;SERIES;SERNO;FILE;SIZE;LIBID;DEL;EXT;DATE;LANG;LIBRATE;KEYWORDS'; + +class InpxParser { + constructor() { + this.info = {}; + } + + async safeExtractToString(zipReader, fileName) { + let result = ''; + + try { + result = await zipReader.extractToBuf(fileName).toString(); + } catch (e) { + //quiet + } + return result.trim(); + } + + async parse(inpxFile, readFileCallback, parsedCallback) { + if (!readFileCallback) + readFileCallback = async() => {}; + + if (!parsedCallback) + parsedCallback = async() => {}; + + + const zipReader = new ZipReader(); + await zipReader.open(inpxFile); + + try { + const info = this.info; + + //info + await readFileCallback(collectionInfo); + info.collection = await this.safeExtractToString(zipReader, collectionInfo); + + await readFileCallback(structureInfo); + info.structure = await this.safeExtractToString(zipReader, structureInfo); + + await readFileCallback(versionInfo); + info.version = await this.safeExtractToString(zipReader, versionInfo); + + //structure + let inpxStructure = info.structure; + if (!inpxStructure) + inpxStructure = defaultStructure; + inpxStructure = inpxStructure.toLowerCase(); + const structure = inpxStructure.split(';'); + + //inp-файлы + let chunk = []; + const entries = Object.values(zipReader.entries); + for (const entry of entries) { + if (!entry.isDirectory && path.extname(entry.name) == '.inp') { + + await readFileCallback(entry.name); + const buf = await zipReader.extractToBuf(entry.name); + chunk.push(this.parseInp(buf, structure)); + } + } + } finally { + zipReader.close(); + } + } + + parseInp(inpBuf, structure) { + const rows = inpBuf.toString().split('\n'); + console.log(rows); + } + + get info() { + return this.info; + } +} + +module.exports = InpxParser; \ No newline at end of file