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);
}
}