From dbfc58eed2b6b5c7c36912f4acfb3f9aef028362 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Wed, 23 Jan 2019 00:04:30 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D0=BE=D0=BC=20html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/core/BookConverter/index.js | 91 +++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 2 deletions(-) diff --git a/server/core/BookConverter/index.js b/server/core/BookConverter/index.js index abdeb9a0..500e18e1 100644 --- a/server/core/BookConverter/index.js +++ b/server/core/BookConverter/index.js @@ -26,12 +26,12 @@ class BookConverter { const parsedUrl = new URL(url); if (parsedUrl.hostname == 'samlib.ru' || parsedUrl.hostname == 'budclub.ru') { - await fs.writeFile(outputFile, await this.convertSamlib(data)); + await fs.writeFile(outputFile, await this.convertHtml(data)); return; } //Заглушка - await fs.writeFile(outputFile, data); + await fs.writeFile(outputFile, await this.convertHtml(data)); callback(100); } else { if (fileType) @@ -55,6 +55,93 @@ class BookConverter { return iconv.decode(data, selected); } + async convertHtml(data) { + let titleInfo = {}; + let desc = {_n: 'description', 'title-info': titleInfo}; + let pars = []; + let body = {_n: 'body', section: {_a: [pars]}}; + let fb2 = [desc, body]; + + let path = ''; + let tag = '';// eslint-disable-line no-unused-vars + + const newParagraph = () => { + pars.push({_n: 'p', _t: ''}); + }; + + const growParagraph = (text) => { + const l = pars.length; + if (l) { + if (pars[l - 1]._t == '') + text = text.trimLeft(); + pars[l - 1]._t += text; + } + }; + + const parser = new EasySAXParser(); + + parser.on('error', (msgError) => {// eslint-disable-line no-unused-vars + }); + + parser.on('startNode', (elemName, getAttr, isTagEnd, getStrNode) => {// eslint-disable-line no-unused-vars + path += '/' + elemName; + tag = elemName; + + if (elemName == 'p' || elemName == 'dd') { + newParagraph(); + } + }); + + parser.on('endNode', (elemName, isTagStart, getStrNode) => {// eslint-disable-line no-unused-vars + const oldPath = path; + let t = ''; + do { + let i = path.lastIndexOf('/'); + t = path.substr(i + 1); + path = path.substr(0, i); + } while (t != elemName && path); + + if (t != elemName) { + path = oldPath; + } + + let i = path.lastIndexOf('/'); + tag = path.substr(i + 1); + }); + + parser.on('textNode', (text) => {// eslint-disable-line no-unused-vars + if (text != ' ' && text.trim() == '') + text = text.trim(); + + if (text == '') + return; + + switch (path) { + case '/html/head/title': + titleInfo['book-title'] = text; + return; + } + + growParagraph(text); + }); + + parser.on('cdata', (data) => {// eslint-disable-line no-unused-vars + }); + + parser.on('comment', (text) => {// eslint-disable-line no-unused-vars + }); + + /* + parser.on('progress', async(progress) => { + callback(...........); + }); + */ + + await parser.parse(this.decode(data)); + + return this.formatFb2(fb2); + } + async convertSamlib(data) { let titleInfo = {}; let desc = {_n: 'description', 'title-info': titleInfo};