Доделал распознавание параграфов текста
This commit is contained in:
@@ -55,16 +55,18 @@ class BookConverter {
|
|||||||
return iconv.decode(data, selected);
|
return iconv.decode(data, selected);
|
||||||
}
|
}
|
||||||
|
|
||||||
async convertHtml(data) {
|
async convertHtml(data, isText) {
|
||||||
let titleInfo = {};
|
let titleInfo = {};
|
||||||
let desc = {_n: 'description', 'title-info': titleInfo};
|
let desc = {_n: 'description', 'title-info': titleInfo};
|
||||||
let pars = [];
|
let pars = [];
|
||||||
let body = {_n: 'body', section: {_a: [pars]}};
|
let body = {_n: 'body', section: {_a: []}};
|
||||||
let fb2 = [desc, body];
|
let fb2 = [desc, body];
|
||||||
|
|
||||||
let title = '';
|
let title = '';
|
||||||
let inTitle = false;
|
let inTitle = false;
|
||||||
|
|
||||||
|
let spaceCounter = [];
|
||||||
|
|
||||||
const newParagraph = () => {
|
const newParagraph = () => {
|
||||||
pars.push({_n: 'p', _t: ''});
|
pars.push({_n: 'p', _t: ''});
|
||||||
};
|
};
|
||||||
@@ -76,10 +78,23 @@ class BookConverter {
|
|||||||
text = text.trimLeft();
|
text = text.trimLeft();
|
||||||
pars[l - 1]._t += text;
|
pars[l - 1]._t += text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//посчитаем отступы у текста, чтобы выделить потом параграфы
|
||||||
|
const lines = text.split('\n');
|
||||||
|
for (const line of lines) {
|
||||||
|
const sp = line.split(' ');
|
||||||
|
let l = 0;
|
||||||
|
while (l < sp.length && sp[l].trim() == '') {
|
||||||
|
l++;
|
||||||
|
}
|
||||||
|
if (!spaceCounter[l])
|
||||||
|
spaceCounter[l] = 0;
|
||||||
|
spaceCounter[l]++;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
newParagraph();
|
newParagraph();
|
||||||
const newPara = new Set(['TR', 'BR', 'BR/', 'DD', 'P', 'TITLE', '/TITLE']);
|
const newPara = new Set(['TR', 'BR', 'BR/', 'DD', 'P', 'TITLE', '/TITLE', 'H1', 'H2', 'H3', '/H1', '/H2', '/H3']);
|
||||||
|
|
||||||
const onText = (text) => {
|
const onText = (text) => {
|
||||||
if (inTitle && !title)
|
if (inTitle && !title)
|
||||||
@@ -142,6 +157,58 @@ class BookConverter {
|
|||||||
|
|
||||||
titleInfo['book-title'] = title;
|
titleInfo['book-title'] = title;
|
||||||
|
|
||||||
|
//подозрение на чистый текст, надо разбить на параграфы
|
||||||
|
if ((isText || pars.length < buf.length/2000) && spaceCounter.length) {
|
||||||
|
let total = 0;
|
||||||
|
for (let i = 0; i < spaceCounter.length; i++) {
|
||||||
|
total += (spaceCounter[i] ? spaceCounter[i] : 0);
|
||||||
|
}
|
||||||
|
total /= 10;
|
||||||
|
let i = spaceCounter.length - 1;
|
||||||
|
while (i > 0 && (!spaceCounter[i] || spaceCounter[i] < total)) i--;
|
||||||
|
|
||||||
|
const parIndent = i;
|
||||||
|
if (parIndent > 0) {//нашли отступ параграфа
|
||||||
|
|
||||||
|
let newPars = [];
|
||||||
|
const newPar = () => {
|
||||||
|
newPars.push({_n: 'p', _t: ''});
|
||||||
|
};
|
||||||
|
|
||||||
|
const growPar = (text) => {
|
||||||
|
const l = newPars.length;
|
||||||
|
if (l) {
|
||||||
|
if (newPars[l - 1]._t == '')
|
||||||
|
text = text.trimLeft();
|
||||||
|
newPars[l - 1]._t += text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const par of pars) {
|
||||||
|
newPar();
|
||||||
|
|
||||||
|
const lines = par._t.split('\n');
|
||||||
|
for (const line of lines) {
|
||||||
|
const sp = line.split(' ');
|
||||||
|
let l = 0;
|
||||||
|
while (l < sp.length && sp[l].trim() == '') {
|
||||||
|
l++;
|
||||||
|
}
|
||||||
|
if (l >= parIndent)
|
||||||
|
newPar();
|
||||||
|
growPar(line + ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body.section._a[0] = newPars;
|
||||||
|
} else {
|
||||||
|
body.section._a[0] = pars;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
body.section._a[0] = pars;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return this.formatFb2(fb2);
|
return this.formatFb2(fb2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user