From a3b83f93c37ce0ba0df93a2ea13c8bf6634ee6a1 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Mon, 25 Mar 2024 16:02:04 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=84=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=B8=D0=BC=D0=B5=D0=BD=20=D0=B6=D0=B0?= =?UTF-8?q?=D0=BD=D1=80=D0=BE=D0=B2=20=D0=B2=20=D0=B8=D0=BD=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=20=D0=BA=D0=BD?= =?UTF-8?q?=D0=B8=D0=B3=D0=B5(#24)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Search/BookInfoDialog/BookInfoDialog.vue | 22 ++++++++++++++ client/components/Search/Search.vue | 2 +- server/core/WebWorker.js | 28 ++++++++++++++++-- server/core/opds/BookPage.js | 29 ++++++++++++++++++- 4 files changed, 76 insertions(+), 5 deletions(-) diff --git a/client/components/Search/BookInfoDialog/BookInfoDialog.vue b/client/components/Search/BookInfoDialog/BookInfoDialog.vue index 1307331..01c9dae 100644 --- a/client/components/Search/BookInfoDialog/BookInfoDialog.vue +++ b/client/components/Search/BookInfoDialog/BookInfoDialog.vue @@ -118,6 +118,7 @@ class BookInfoDialog { _props = { modelValue: Boolean, bookInfo: Object, + genreMap: Object, }; dialogVisible = false; @@ -169,6 +170,19 @@ class BookInfoDialog { return `${size.toFixed(1)} ${unit}`; } + convertGenres(genreArr) { + let result = []; + if (genreArr) { + for (const genre of genreArr) { + const g = genre.trim(); + const name = this.genreMap.get(g); + result.push(name ? name : g); + } + } + + return result.join(', '); + } + get inpx() { const mapping = [ {name: 'fileInfo', label: 'Информация о файле', value: [ @@ -211,6 +225,9 @@ class BookInfoDialog { if (nodePath == 'titleInfo/author') return value.split(',').join(', '); + if (nodePath == 'titleInfo/genre') + return this.convertGenres(value.split(',')); + if (nodePath == 'titleInfo/librate' && !value) return null; @@ -279,11 +296,16 @@ class BookInfoDialog { } } + const self = this; this.fb2 = parser.bookInfoList(infoObj, { valueToString(value, nodePath, origVTS) {//eslint-disable-line no-unused-vars if (nodePath == 'documentInfo/historyHtml' && value) return value.replace(/

/g, `

`); + if ((nodePath == 'titleInfo/genre' || nodePath == 'srcTitleInfo/genre') && value) { + return self.convertGenres(value); + } + return origVTS(value, nodePath); }, }); diff --git a/client/components/Search/Search.vue b/client/components/Search/Search.vue index 5883d5d..3d09034 100644 --- a/client/components/Search/Search.vue +++ b/client/components/Search/Search.vue @@ -347,7 +347,7 @@ - + diff --git a/server/core/WebWorker.js b/server/core/WebWorker.js index 83b5d93..e9994ac 100644 --- a/server/core/WebWorker.js +++ b/server/core/WebWorker.js @@ -314,7 +314,7 @@ class WebWorker { let result; const db = this.db; - if (!db.wwCache.genres) { + if (!db.wwCache.genreTree) { const genres = _.cloneDeep(genreTree); const last = genres[genres.length - 1]; @@ -362,9 +362,31 @@ class WebWorker { inpxHash: (config.inpxHash ? config.inpxHash : ''), }; - db.wwCache.genres = result; + db.wwCache.genreTree = result; } else { - result = db.wwCache.genres; + result = db.wwCache.genreTree; + } + + return result; + } + + async getGenreMap() { + this.checkMyState(); + + let result; + const db = this.db; + if (!db.wwCache.genreMap) { + const genreTree = await this.getGenreTree(); + + result = new Map(); + for (const section of genreTree.genreTree) { + for (const g of section.value) + result.set(g.value, g.name); + } + + db.wwCache.genreMap = result; + } else { + result = db.wwCache.genreMap; } return result; diff --git a/server/core/opds/BookPage.js b/server/core/opds/BookPage.js index 72ea59e..6ff9de4 100644 --- a/server/core/opds/BookPage.js +++ b/server/core/opds/BookPage.js @@ -24,6 +24,19 @@ class BookPage extends BasePage { return `${size.toFixed(1)} ${unit}`; } + convertGenres(genreArr) { + let result = []; + if (genreArr) { + for (const genre of genreArr) { + const g = genre.trim(); + const name = this.genreMap.get(g); + result.push(name ? name : g); + } + } + + return result.join(', '); + } + inpxInfo(bookRec) { const mapping = [ {name: 'fileInfo', label: 'Информация о файле', value: [ @@ -66,6 +79,9 @@ class BookPage extends BasePage { if (nodePath == 'titleInfo/author') return value.split(',').join(', '); + if (nodePath == 'titleInfo/genre') + return this.convertGenres(value.split(',')); + if (nodePath == 'titleInfo/librate' && !value) return null; @@ -118,6 +134,7 @@ class BookPage extends BasePage { async body(req) { const result = {}; + this.genreMap = await this.webWorker.getGenreMap(); result.link = this.baseLinks(req, true); const bookUid = req.query.uid; @@ -183,7 +200,17 @@ class BookPage extends BasePage { } ann = infoObj.titleInfo.annotationHtml || ''; - const infoList = parser.bookInfoList(infoObj); + const self = this; + const infoList = parser.bookInfoList(infoObj, { + valueToString(value, nodePath, origVTS) {//eslint-disable-line no-unused-vars + if ((nodePath == 'titleInfo/genre' || nodePath == 'srcTitleInfo/genre') && value) { + return self.convertGenres(value); + } + + return origVTS(value, nodePath); + }, + }); + info += this.htmlInfo('Fb2 инфо', infoList); } }