Рефакторинг, плюс небольшие доработки
This commit is contained in:
@@ -39,13 +39,13 @@ class ConvertFb3 extends ConvertHtml {
|
|||||||
const title = this.getTitle(text)
|
const title = this.getTitle(text)
|
||||||
.replace(/<\/?p>/g, '')
|
.replace(/<\/?p>/g, '')
|
||||||
;
|
;
|
||||||
text = `<title>${title}</title>` + text
|
text = `<fb2-title>${title}</fb2-title>` + text
|
||||||
.replace(/<title>/g, '<br><b>')
|
.replace(/<title>/g, '<br><b>')
|
||||||
.replace(/<\/title>/g, '</b><br>')
|
.replace(/<\/title>/g, '</b><br>')
|
||||||
.replace(/<subtitle>/g, '<br><br><fb2-subtitle>')
|
.replace(/<subtitle>/g, '<br><br><fb2-subtitle>')
|
||||||
.replace(/<\/subtitle>/g, '</fb2-subtitle>')
|
.replace(/<\/subtitle>/g, '</fb2-subtitle>')
|
||||||
;
|
;
|
||||||
return await super.run(Buffer.from(text), {skipCheck: true, cutTitle: true});
|
return await super.run(Buffer.from(text), {skipCheck: true});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ class ConvertHtml extends ConvertBase {
|
|||||||
} else {
|
} else {
|
||||||
isText = opts.isText;
|
isText = opts.isText;
|
||||||
}
|
}
|
||||||
let {cutTitle} = opts;
|
|
||||||
|
|
||||||
let titleInfo = {};
|
let titleInfo = {};
|
||||||
let desc = {_n: 'description', 'title-info': titleInfo};
|
let desc = {_n: 'description', 'title-info': titleInfo};
|
||||||
@@ -44,7 +43,9 @@ class ConvertHtml extends ConvertBase {
|
|||||||
let fb2 = [desc, body, binary];
|
let fb2 = [desc, body, binary];
|
||||||
|
|
||||||
let title = '';
|
let title = '';
|
||||||
|
let author = '';
|
||||||
let inTitle = false;
|
let inTitle = false;
|
||||||
|
let inAuthor = false;
|
||||||
let inSubTitle = false;
|
let inSubTitle = false;
|
||||||
let inImage = false;
|
let inImage = false;
|
||||||
let image = {};
|
let image = {};
|
||||||
@@ -94,7 +95,7 @@ class ConvertHtml extends ConvertBase {
|
|||||||
const onTextNode = (text, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars
|
const onTextNode = (text, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars
|
||||||
text = this.escapeEntities(text);
|
text = this.escapeEntities(text);
|
||||||
|
|
||||||
if (!cutCounter && !(cutTitle && inTitle)) {
|
if (!(cutCounter || inTitle) || inSubTitle) {
|
||||||
let tOpen = '';
|
let tOpen = '';
|
||||||
tOpen += (inSubTitle ? '<subtitle>' : '');
|
tOpen += (inSubTitle ? '<subtitle>' : '');
|
||||||
tOpen += (bold ? '<strong>' : '');
|
tOpen += (bold ? '<strong>' : '');
|
||||||
@@ -110,6 +111,9 @@ class ConvertHtml extends ConvertBase {
|
|||||||
if (inTitle && !title)
|
if (inTitle && !title)
|
||||||
title = text;
|
title = text;
|
||||||
|
|
||||||
|
if (inAuthor && !author)
|
||||||
|
author = text;
|
||||||
|
|
||||||
if (inImage) {
|
if (inImage) {
|
||||||
image._t = text;
|
image._t = text;
|
||||||
binary.push(image);
|
binary.push(image);
|
||||||
@@ -142,10 +146,12 @@ class ConvertHtml extends ConvertBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tag == 'title' || tag == 'cut-title') {
|
if (tag == 'title' || tag == 'fb2-title') {
|
||||||
inTitle = true;
|
inTitle = true;
|
||||||
if (tag == 'cut-title')
|
}
|
||||||
cutTitle = true;
|
|
||||||
|
if (tag == 'fb2-author') {
|
||||||
|
inAuthor = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tag == 'fb2-subtitle') {
|
if (tag == 'fb2-subtitle') {
|
||||||
@@ -181,9 +187,13 @@ class ConvertHtml extends ConvertBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tag == 'title' || tag == 'cut-title')
|
if (tag == 'title' || tag == 'fb2-title')
|
||||||
inTitle = false;
|
inTitle = false;
|
||||||
|
|
||||||
|
if (tag == 'fb2-author') {
|
||||||
|
inAuthor = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (tag == 'fb2-subtitle')
|
if (tag == 'fb2-subtitle')
|
||||||
inSubTitle = false;
|
inSubTitle = false;
|
||||||
|
|
||||||
@@ -195,10 +205,15 @@ class ConvertHtml extends ConvertBase {
|
|||||||
|
|
||||||
sax.parseSync(buf, {
|
sax.parseSync(buf, {
|
||||||
onStartNode, onEndNode, onTextNode,
|
onStartNode, onEndNode, onTextNode,
|
||||||
innerCut: new Set(['head', 'script', 'style', 'binary', 'fb2-image'])
|
innerCut: new Set(['head', 'script', 'style', 'binary', 'fb2-image', 'fb2-title', 'fb2-author'])
|
||||||
});
|
});
|
||||||
|
|
||||||
titleInfo['book-title'] = title;
|
titleInfo['book-title'] = title;
|
||||||
|
if (author)
|
||||||
|
titleInfo.author = {'last-name': author};
|
||||||
|
|
||||||
|
body.section._a[0] = pars;
|
||||||
|
|
||||||
//подозрение на чистый текст, надо разбить на параграфы
|
//подозрение на чистый текст, надо разбить на параграфы
|
||||||
if (isText || (buf.length > 30*1024 && pars.length < buf.length/2000)) {
|
if (isText || (buf.length > 30*1024 && pars.length < buf.length/2000)) {
|
||||||
let total = 0;
|
let total = 0;
|
||||||
@@ -228,28 +243,19 @@ class ConvertHtml extends ConvertBase {
|
|||||||
if (parIndent > 2) parIndent--;
|
if (parIndent > 2) parIndent--;
|
||||||
|
|
||||||
let newPars = [];
|
let newPars = [];
|
||||||
|
let curPar = {};
|
||||||
const newPar = () => {
|
const newPar = () => {
|
||||||
newPars.push({_n: 'p', _t: ''});
|
curPar = {_n: 'p', _t: ''};
|
||||||
|
newPars.push(curPar);
|
||||||
};
|
};
|
||||||
|
|
||||||
const growPar = (text) => {
|
|
||||||
if (!newPars.length)
|
|
||||||
newPar();
|
|
||||||
|
|
||||||
const l = newPars.length;
|
|
||||||
newPars[l - 1]._t += text;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
for (const par of pars) {
|
for (const par of pars) {
|
||||||
if (par._n != 'p') {
|
if (par._n != 'p') {
|
||||||
newPars.push(par);
|
newPars.push(par);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i > 0)
|
newPar();
|
||||||
newPar();
|
|
||||||
i++;
|
|
||||||
|
|
||||||
let j = 0;
|
let j = 0;
|
||||||
const lines = par._t.split('\n');
|
const lines = par._t.split('\n');
|
||||||
@@ -266,13 +272,12 @@ class ConvertHtml extends ConvertBase {
|
|||||||
newPar();
|
newPar();
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
growPar(line.trim() + ' ');
|
|
||||||
|
curPar._t += line.trim() + ' ';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
body.section._a[0] = newPars;
|
body.section._a[0] = newPars;
|
||||||
} else {
|
|
||||||
body.section._a[0] = pars;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//убираем лишнее, делаем валидный fb2, т.к. в рез-те разбиения на параграфы бьются теги
|
//убираем лишнее, делаем валидный fb2, т.к. в рез-те разбиения на параграфы бьются теги
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ class ConvertSites extends ConvertHtml {
|
|||||||
if (text === false)
|
if (text === false)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return await super.run(Buffer.from(text), {skipCheck: true, cutTitle: true});
|
return await super.run(Buffer.from(text), {skipCheck: true});
|
||||||
}
|
}
|
||||||
|
|
||||||
getTitle(text) {
|
getTitle(text) {
|
||||||
@@ -79,7 +79,7 @@ class ConvertSites extends ConvertHtml {
|
|||||||
let book = this.getTitle(text);
|
let book = this.getTitle(text);
|
||||||
book = book.replace(' (fb2) | Флибуста', '');
|
book = book.replace(' (fb2) | Флибуста', '');
|
||||||
|
|
||||||
const title = `<title>${author}${(author ? ' - ' : '')}${book}</title>`;
|
const title = `<fb2-title>${author}${(author ? ' - ' : '')}${book}</fb2-title>`;
|
||||||
|
|
||||||
let begin = '<h3 class="book">';
|
let begin = '<h3 class="book">';
|
||||||
if (text.indexOf(begin) <= 0)
|
if (text.indexOf(begin) <= 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user