diff --git a/server/core/BookConverter/index.js b/server/core/BookConverter/index.js index bda48687..c60b5982 100644 --- a/server/core/BookConverter/index.js +++ b/server/core/BookConverter/index.js @@ -7,6 +7,8 @@ const sax = require('./sax'); const FileDetector = require('../FileDetector'); +const repSpaces = (text) => text.replace(/ |[\t\n\r]/g, ' '); + class BookConverter { constructor() { this.detector = new FileDetector(); @@ -30,7 +32,6 @@ class BookConverter { return; } - //Заглушка await fs.writeFile(outputFile, await this.convertHtml(data)); callback(100); } else { @@ -96,7 +97,7 @@ class BookConverter { newParagraph(); const newPara = new Set(['tr', 'br', 'br/', 'dd', 'p', 'title', '/title', 'h1', 'h2', 'h3', '/h1', '/h2', '/h3']); - const onText = (text, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars + const onTextNode = (text, left, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars if (!cutCounter) { growParagraph(text); } @@ -105,7 +106,7 @@ class BookConverter { title = text; }; - const onNode = (tag, tail, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars + const onStartNode = (tag, tail, left, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars if (!cutCounter) { if (newPara.has(tag)) newParagraph(); @@ -113,13 +114,19 @@ class BookConverter { if (tag == 'title') inTitle = true; - else if (tag == '/title') + }; + + const onEndNode = (tag, tail, left, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars + if (tag == 'title') inTitle = false; }; let buf = this.decode(data).toString(); - this.parseHtml(buf, onNode, onText, new Set(['head', 'script', 'style'])); + sax.parse(buf, { + onStartNode, onEndNode, onTextNode, + innerCut: new Set(['head', 'script', 'style']) + }); titleInfo['book-title'] = title; @@ -172,6 +179,10 @@ class BookConverter { body.section._a[0] = pars; } + //убираем лишнее + for (let i = 0; i < pars.length; i++) + pars[i]._t = repSpaces(pars[i]._t).trim(); + return this.formatFb2(fb2); } @@ -310,7 +321,7 @@ class BookConverter { growParagraph(text); }; - sax.parse(this.decode(data).toString(), { + sax.parse(repSpaces(this.decode(data).toString()), { onStartNode, onEndNode, onTextNode, onComment, innerCut: new Set(['head', 'script', 'style']) }); @@ -344,17 +355,15 @@ class BookConverter { formatFb2Node(node, name) { let out = ''; - const repl = (text) => text.replace(/ |[\t\n\r]/g, ' '); - if (Array.isArray(node)) { for (const n of node) { out += this.formatFb2Node(n); } } else if (typeof node == 'string') { if (name) - out += `<${name}>${repl(node)}`; + out += `<${name}>${repSpaces(node)}`; else - out += repl(node); + out += repSpaces(node); } else { if (node._n) name = node._n; @@ -362,7 +371,7 @@ class BookConverter { if (name) out += `<${name}>`; if (node.hasOwnProperty('_t')) - out += repl(node._t); + out += repSpaces(node._t); for (let nodeName in node) { if (nodeName && nodeName[0] == '_' && nodeName != '_a')