From ec6b72868b7a5c273d010e778abd1bbacb0961fa Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Thu, 10 Nov 2022 00:40:44 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/core/WebWorker.js | 6 +- server/core/fb2/Fb2Parser.js | 108 ++++-------------- ...{ObjectNavigator.js => ObjectInspector.js} | 6 +- server/core/xml/XmlParser.js | 6 +- 4 files changed, 31 insertions(+), 95 deletions(-) rename server/core/xml/{ObjectNavigator.js => ObjectInspector.js} (96%) diff --git a/server/core/WebWorker.js b/server/core/WebWorker.js index f01829d..ae54819 100644 --- a/server/core/WebWorker.js +++ b/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) { diff --git a/server/core/fb2/Fb2Parser.js b/server/core/fb2/Fb2Parser.js index 3cf2564..97708d2 100644 --- a/server/core/fb2/Fb2Parser.js +++ b/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('= 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); + toString(options) { + return this.xml.toString(options); + } - data = this.checkEncoding(data); + fromString(fb2String) { + this.xml.fromString(fb2String); + return this; + } - const xml = new XmlParser(); + toObject(options) { + return this.xml.toObject(options); + } - xml.fromString(data.toString(), { - lowerCase: true, - pickNode: route => route.indexOf('fictionbook/body') !== 0, - }); + fromObject(fb2Object) { + this.xml.fromObject(fb2Object); + return this; + } - const desc = xml.$$('description').toObject(); - const coverImage = xml.navigator(desc).$('description/title-info/coverpage/image'); + bookInfo(fb2Object) { + if (!fb2Object) + fb2Object = this.toObject(); - 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'); + //const result = {}; - if (href) { - const binaryId = (href[0] == '#' ? href.substring(1) : href); + } - //найдем нужный image - xml.$$('binary').eachSelf(node => { - let attrs = node.attrs(); - if (!attrs) - return; - attrs = Object.fromEntries(attrs); - - if (attrs.id === binaryId) { - const textNode = new XmlParser(node.value); - const base64 = textNode.$self('*TEXT').value; - - cover = (base64 ? Buffer.from(base64, 'base64') : null); - } - }); - } - } - - return {desc, cover, coverExt}; + bookInfoList(fb2Object) { } } diff --git a/server/core/xml/ObjectNavigator.js b/server/core/xml/ObjectInspector.js similarity index 96% rename from server/core/xml/ObjectNavigator.js rename to server/core/xml/ObjectInspector.js index 929422b..616228d 100644 --- a/server/core/xml/ObjectNavigator.js +++ b/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; \ No newline at end of file +module.exports = ObjectInspector; \ No newline at end of file diff --git a/server/core/xml/XmlParser.js b/server/core/xml/XmlParser.js index ec56c01..26da7e7 100644 --- a/server/core/xml/XmlParser.js +++ b/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); } }