|
@@ -34,7 +34,6 @@ class ConvertHtml extends ConvertBase {
|
|
|
} else {
|
|
|
isText = opts.isText;
|
|
|
}
|
|
|
- let {cutTitle} = opts;
|
|
|
|
|
|
let titleInfo = {};
|
|
|
let desc = {_n: 'description', 'title-info': titleInfo};
|
|
@@ -44,7 +43,9 @@ class ConvertHtml extends ConvertBase {
|
|
|
let fb2 = [desc, body, binary];
|
|
|
|
|
|
let title = '';
|
|
|
+ let author = '';
|
|
|
let inTitle = false;
|
|
|
+ let inAuthor = false;
|
|
|
let inSubTitle = false;
|
|
|
let inImage = false;
|
|
|
let image = {};
|
|
@@ -94,7 +95,7 @@ class ConvertHtml extends ConvertBase {
|
|
|
const onTextNode = (text, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars
|
|
|
text = this.escapeEntities(text);
|
|
|
|
|
|
- if (!cutCounter && !(cutTitle && inTitle)) {
|
|
|
+ if (!(cutCounter || inTitle) || inSubTitle) {
|
|
|
let tOpen = '';
|
|
|
tOpen += (inSubTitle ? '<subtitle>' : '');
|
|
|
tOpen += (bold ? '<strong>' : '');
|
|
@@ -110,6 +111,9 @@ class ConvertHtml extends ConvertBase {
|
|
|
if (inTitle && !title)
|
|
|
title = text;
|
|
|
|
|
|
+ if (inAuthor && !author)
|
|
|
+ author = text;
|
|
|
+
|
|
|
if (inImage) {
|
|
|
image._t = text;
|
|
|
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;
|
|
|
- if (tag == 'cut-title')
|
|
|
- cutTitle = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (tag == 'fb2-author') {
|
|
|
+ inAuthor = true;
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
|
|
|
+ if (tag == 'fb2-author') {
|
|
|
+ inAuthor = false;
|
|
|
+ }
|
|
|
+
|
|
|
if (tag == 'fb2-subtitle')
|
|
|
inSubTitle = false;
|
|
|
|
|
@@ -195,10 +205,15 @@ class ConvertHtml extends ConvertBase {
|
|
|
|
|
|
sax.parseSync(buf, {
|
|
|
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;
|
|
|
+ if (author)
|
|
|
+ titleInfo.author = {'last-name': author};
|
|
|
+
|
|
|
+ body.section._a[0] = pars;
|
|
|
+
|
|
|
//подозрение на чистый текст, надо разбить на параграфы
|
|
|
if (isText || (buf.length > 30*1024 && pars.length < buf.length/2000)) {
|
|
|
let total = 0;
|
|
@@ -228,28 +243,19 @@ class ConvertHtml extends ConvertBase {
|
|
|
if (parIndent > 2) parIndent--;
|
|
|
|
|
|
let newPars = [];
|
|
|
+ let curPar = {};
|
|
|
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) {
|
|
|
if (par._n != 'p') {
|
|
|
newPars.push(par);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if (i > 0)
|
|
|
- newPar();
|
|
|
- i++;
|
|
|
+ newPar();
|
|
|
|
|
|
let j = 0;
|
|
|
const lines = par._t.split('\n');
|
|
@@ -266,13 +272,12 @@ class ConvertHtml extends ConvertBase {
|
|
|
newPar();
|
|
|
j++;
|
|
|
}
|
|
|
- growPar(line.trim() + ' ');
|
|
|
+
|
|
|
+ curPar._t += line.trim() + ' ';
|
|
|
}
|
|
|
}
|
|
|
|
|
|
body.section._a[0] = newPars;
|
|
|
- } else {
|
|
|
- body.section._a[0] = pars;
|
|
|
}
|
|
|
|
|
|
//убираем лишнее, делаем валидный fb2, т.к. в рез-те разбиения на параграфы бьются теги
|