Selaa lähdekoodia

Переименования

Book Pauk 2 vuotta sitten
vanhempi
commit
ec6b72868b

+ 3 - 3
server/core/WebWorker.js

@@ -15,7 +15,7 @@ const ayncExit = new (require('./AsyncExit'))();
 const log = new (require('./AppLogger'))().log;//singleton
 const utils = require('./utils');
 const genreTree = require('./genres');
-const Fb2Parser = require('./fb2/Fb2Parser');
+const Fb2Helper = require('./fb2/Fb2Helper');
 
 //server states
 const ssNormal = 'normal';
@@ -45,7 +45,7 @@ class WebWorker {
             }
             
             this.inpxHashCreator = new InpxHashCreator(config);
-            this.fb2Parser = new Fb2Parser();
+            this.fb2Helper = new Fb2Helper();
             this.inpxFileHash = '';
 
             this.wState = this.workerState.getControl('server_state');
@@ -480,7 +480,7 @@ class WebWorker {
                 result.fb2 = false;
 
                 if (book.ext == 'fb2') {
-                    const {desc, cover, coverExt} = await this.fb2Parser.getDescAndCover(bookFile);
+                    const {desc, cover, coverExt} = await this.fb2Helper.getDescAndCover(bookFile);
                     result.fb2 = desc;
 
                     if (cover) {

+ 22 - 86
server/core/fb2/Fb2Parser.js

@@ -1,101 +1,37 @@
-const fs = require('fs-extra');
-const iconv = require('iconv-lite');
-const textUtils = require('./textUtils');
-
 const XmlParser = require('../xml/XmlParser');
-const utils = require('../utils');
 
 class Fb2Parser {
-    checkEncoding(data) {
-        //Корректируем кодировку UTF-16
-        let encoding = textUtils.getEncoding(data);
-        if (encoding.indexOf('UTF-16') == 0) {
-            data = Buffer.from(iconv.decode(data, encoding));
-            encoding = 'utf-8';
-        }
-
-        //Корректируем пробелы, всякие файлы попадаются :(
-        if (data[0] == 32) {
-            data = Buffer.from(data.toString().trim());
-        }
-
-        //Окончательно корректируем кодировку
-        let result = data;
-
-        let left = data.indexOf('<?xml version="1.0"');
-        if (left < 0) {
-            left = data.indexOf('<?xml version=\'1.0\'');
-        }
-
-        if (left >= 0) {
-            const right = data.indexOf('?>', left);
-            if (right >= 0) {
-                const head = data.slice(left, right + 2).toString();
-                const m = head.match(/encoding=['"](.*?)['"]/);
-                if (m) {
-                    let enc = m[1].toLowerCase();
-                    if (enc != 'utf-8') {
-                        //enc может не соответсвовать реальной кодировке файла, поэтому:
-                        if (encoding.indexOf('ISO-8859') >= 0) {
-                            encoding = enc;
-                        }
-
-                        result = iconv.decode(data, encoding);
-                        result = Buffer.from(result.toString().replace(m[0], `encoding="utf-8"`));
-                    }
-                }
-            }
-        }
-
-        return result;
+    constructor() {
+        this.xml = new XmlParser();
     }
 
-    async getDescAndCover(bookFile) {
-        let data = await fs.readFile(bookFile);
-        data = await utils.gunzipBuffer(data);
-
-        data = this.checkEncoding(data);
-
-        const xml = new XmlParser();
-
-        xml.fromString(data.toString(), {
-            lowerCase: true,
-            pickNode: route => route.indexOf('fictionbook/body') !== 0,
-        });
+    toString(options) {
+        return this.xml.toString(options);
+    }
 
-        const desc = xml.$$('description').toObject();
-        const coverImage = xml.navigator(desc).$('description/title-info/coverpage/image');
+    fromString(fb2String) {
+        this.xml.fromString(fb2String);
+        return this;
+    }
 
-        let cover = null;
-        let coverExt = '';
-        if (coverImage) {
-            const coverAttrs = coverImage.attrs();
-            const href = coverAttrs['l:href'];
-            let coverType = coverAttrs['content-type'];
-            coverType = (coverType == 'image/jpg' || coverType == 'application/octet-stream' ? 'image/jpeg' : coverType);
-            coverExt = (coverType == 'image/png' ? '.png' : '.jpg');
+    toObject(options) {
+        return this.xml.toObject(options);
+    }
 
-            if (href) {
-                const binaryId = (href[0] == '#' ? href.substring(1) : href);
+    fromObject(fb2Object) {
+        this.xml.fromObject(fb2Object);
+        return this;
+    }
 
-                //найдем нужный image
-                xml.$$('binary').eachSelf(node => {
-                    let attrs = node.attrs();
-                    if (!attrs)
-                        return;
-                    attrs = Object.fromEntries(attrs);
+    bookInfo(fb2Object) {
+        if (!fb2Object)
+            fb2Object = this.toObject();
 
-                    if (attrs.id === binaryId) {
-                        const textNode = new XmlParser(node.value);
-                        const base64 = textNode.$self('*TEXT').value;
+        //const result = {};
 
-                        cover = (base64 ? Buffer.from(base64, 'base64') : null);
-                    }
-                });
-            }
-        }
+    }
 
-        return {desc, cover, coverExt};
+    bookInfoList(fb2Object) {
     }
 }
 

+ 3 - 3
server/core/xml/ObjectNavigator.js → server/core/xml/ObjectInspector.js

@@ -1,4 +1,4 @@
-class ObjectNavigator {
+class ObjectInspector {
     constructor(raw = null) {
         this.raw = raw;
     }
@@ -62,7 +62,7 @@ class ObjectNavigator {
 
         const result = [];
         for (const r of raw)
-            result.push(new ObjectNavigator(r));
+            result.push(new ObjectInspector(r));
 
         return result;
     }
@@ -106,4 +106,4 @@ class ObjectNavigator {
     }
 }
 
-module.exports = ObjectNavigator;
+module.exports = ObjectInspector;

+ 3 - 3
server/core/xml/XmlParser.js

@@ -1,5 +1,5 @@
 const sax = require('./sax');
-const ObjectNavigator = require('./ObjectNavigator');
+const ObjectInspector = require('./ObjectInspector');
 
 //node types
 const NODE = 1;
@@ -760,11 +760,11 @@ class XmlParser extends NodeBase {
         return this;
     }
 
-    navigator(obj) {
+    inspector(obj) {
         if (!obj)
             obj = this.toObject();
 
-        return new ObjectNavigator(obj);
+        return new ObjectInspector(obj);
     }
 }