Jelajahi Sumber

Начало работы над InpxParser

Book Pauk 2 tahun lalu
induk
melakukan
2948cfdc27
1 mengubah file dengan 83 tambahan dan 0 penghapusan
  1. 83 0
      server/core/InpxParser.js

+ 83 - 0
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;