Работа над BookInfoDialog

This commit is contained in:
Book Pauk
2022-11-10 19:45:26 +07:00
parent d7d04fcda8
commit e39611098a
2 changed files with 61 additions and 32 deletions

View File

@@ -245,19 +245,11 @@ class BookInfoDialog {
//fb2 //fb2
if (bookInfo.fb2) { if (bookInfo.fb2) {
this.fb2 = parser.bookInfoList(bookInfo.fb2, { this.fb2 = parser.bookInfoList(bookInfo.fb2, {
valueToString(value, nodePath) {//eslint-disable-line no-unused-vars valueToString(value, nodePath, origVTS) {//eslint-disable-line no-unused-vars
if (nodePath == 'documentInfo/historyHtml' && value) if (nodePath == 'documentInfo/historyHtml' && value)
return value.replace(/<p>/g, `<p class="p-history">`); return value.replace(/<p>/g, `<p class="p-history">`);
if (typeof(value) === 'string') { return origVTS(value, nodePath);
return value;
} else if (Array.isArray(value)) {
return value.join(', ');
} else if (typeof(value) === 'object') {
return JSON.stringify(value);
}
return value;
}, },
}); });

View File

@@ -46,6 +46,20 @@ class Fb2Parser extends XmlParser {
return authors; return authors;
} }
const parseSequence = (node, tagName) => {
const sequence = [];
for (const s of node.$$(tagName)) {
const seqAttrs = s.attrs() || {};
const name = seqAttrs['name'] || null;
const num = seqAttrs['number'] || null;
const lang = seqAttrs['xml:lang'] || null;
sequence.push({name, num, lang});
}
return sequence;
}
const parseTitleInfo = (titleInfo) => { const parseTitleInfo = (titleInfo) => {
const info = {}; const info = {};
@@ -77,10 +91,7 @@ class Fb2Parser extends XmlParser {
info.translator = parseAuthors(titleInfo, 'translator'); info.translator = parseAuthors(titleInfo, 'translator');
const seqAttrs = titleInfo.attrs('sequence') || {}; info.sequence = parseSequence(titleInfo, 'sequence');
info.sequenceName = seqAttrs['name'] || null;
info.sequenceNum = seqAttrs['number'] || null;
info.sequenceLang = seqAttrs['xml:lang'] || null;
return info; return info;
} }
@@ -114,7 +125,7 @@ class Fb2Parser extends XmlParser {
info.id = documentInfo.text('id'); info.id = documentInfo.text('id');
info.version = documentInfo.text('version'); info.version = documentInfo.text('version');
//аналогично annotation, но разбирать в Xml и Html пока не будем //аналогично annotation
info.history = documentInfo.$('history') && documentInfo.$('history').value; info.history = documentInfo.$('history') && documentInfo.$('history').value;
info.historyXml = null; info.historyXml = null;
info.historyHtml = null; info.historyHtml = null;
@@ -126,12 +137,26 @@ class Fb2Parser extends XmlParser {
info.historyHtml = this.toHtml(info.historyXml); info.historyHtml = this.toHtml(info.historyXml);
} }
info.publisher = parseAuthors(documentInfo, 'publisher'); info.publisher = parseAuthors(documentInfo, 'publisher');
result.documentInfo = info; result.documentInfo = info;
} }
//publish-info
const publishInfo = desc.$('publish-info');
if (publishInfo) {
const info = {};
info.bookName = publishInfo.text('book-name');
info.publisher = publishInfo.text('publisher');
info.city = publishInfo.text('city');
info.year = publishInfo.text('year');
info.isbn = publishInfo.text('isbn');
info.sequence = parseSequence(publishInfo, 'sequence');
result.publishInfo = info;
}
return result; return result;
} }
@@ -144,26 +169,31 @@ class Fb2Parser extends XmlParser {
if (!correctMapping) if (!correctMapping)
correctMapping = mapping => mapping; correctMapping = mapping => mapping;
if (!valueToString) { const myValueToString = (value, nodePath, origVTS) => {//eslint-disable-line no-unused-vars
valueToString = (value, nodePath) => {//eslint-disable-line no-unused-vars if (nodePath == 'titleInfo/sequence'
if (typeof(value) === 'string') { || nodePath == 'srcTitleInfo/sequence'
return value; || nodePath == 'publishInfo/sequence')
} else if (Array.isArray(value)) { return value.map(v => [v.name, v.num].filter(s => s).join(' #')).join(', ');
return value.join(', ');
} else if (typeof(value) === 'object') {
return JSON.stringify(value);
}
if (typeof(value) === 'string') {
return value; return value;
}; } else if (Array.isArray(value)) {
} return value.join(', ');
} else if (typeof(value) === 'object') {
return JSON.stringify(value);
}
return value;
};
if (!valueToString)
valueToString = myValueToString;
let mapping = [ let mapping = [
{name: 'titleInfo', label: 'Общая информация', value: [ {name: 'titleInfo', label: 'Общая информация', value: [
{name: 'author', label: 'Автор(ы)'}, {name: 'author', label: 'Автор(ы)'},
{name: 'bookTitle', label: 'Название'}, {name: 'bookTitle', label: 'Название'},
{name: 'sequenceName', label: 'Серия'}, {name: 'sequence', label: 'Серия'},
{name: 'sequenceNum', label: 'Номер в серии'},
{name: 'genre', label: 'Жанр'}, {name: 'genre', label: 'Жанр'},
{name: 'date', label: 'Дата'}, {name: 'date', label: 'Дата'},
@@ -175,8 +205,7 @@ class Fb2Parser extends XmlParser {
{name: 'srcTitleInfo', label: 'Информация о произведении на языке оригинала', value: [ {name: 'srcTitleInfo', label: 'Информация о произведении на языке оригинала', value: [
{name: 'author', label: 'Автор(ы)'}, {name: 'author', label: 'Автор(ы)'},
{name: 'bookTitle', label: 'Название'}, {name: 'bookTitle', label: 'Название'},
{name: 'sequenceName', label: 'Серия'}, {name: 'sequence', label: 'Серия'},
{name: 'sequenceNum', label: 'Номер в серии'},
{name: 'genre', label: 'Жанр'}, {name: 'genre', label: 'Жанр'},
{name: 'date', label: 'Дата'}, {name: 'date', label: 'Дата'},
@@ -185,6 +214,14 @@ class Fb2Parser extends XmlParser {
{name: 'translator', label: 'Переводчик(и)'}, {name: 'translator', label: 'Переводчик(и)'},
{name: 'keywords', label: 'Ключевые слова'}, {name: 'keywords', label: 'Ключевые слова'},
]}, ]},
{name: 'publishInfo', label: 'Издательская информация', value: [
{name: 'bookName', label: 'Название'},
{name: 'publisher', label: 'Издательство'},
{name: 'city', label: 'Город'},
{name: 'year', label: 'Год'},
{name: 'isbn', label: 'ISBN'},
{name: 'sequence', label: 'Серия'},
]},
{name: 'documentInfo', label: 'Информация о документе (OCR)', value: [ {name: 'documentInfo', label: 'Информация о документе (OCR)', value: [
{name: 'author', label: 'Автор(ы)'}, {name: 'author', label: 'Автор(ы)'},
{name: 'programUsed', label: 'Программа'}, {name: 'programUsed', label: 'Программа'},
@@ -214,7 +251,7 @@ class Fb2Parser extends XmlParser {
const subItemOut = { const subItemOut = {
name: subItem.name, name: subItem.name,
label: subItem.label, label: subItem.label,
value: valueToString(info[subItem.name], `${item.name}/${subItem.name}`) value: valueToString(info[subItem.name], `${item.name}/${subItem.name}`, myValueToString),
}; };
if (subItemOut.value) if (subItemOut.value)