From f622dbca7db96658ae133b1bfffd607060073831 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Thu, 17 Jan 2019 00:09:12 +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=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=BF=D0=BE=20=D1=81=D0=BB=D0=BE=D0=B3=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Reader/TextPage/TextPage.vue | 4 +- client/components/Reader/share/BookParser.js | 58 ++++++++++++++++++- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/client/components/Reader/TextPage/TextPage.vue b/client/components/Reader/TextPage/TextPage.vue index a13c03ac..4cead01f 100644 --- a/client/components/Reader/TextPage/TextPage.vue +++ b/client/components/Reader/TextPage/TextPage.vue @@ -54,12 +54,13 @@ class TextPage extends Vue { this.canvas.height = this.$refs.main.clientHeight; this.lineHeight = this.fontSize + this.lineInterval; this.pageLineCount = Math.floor(this.canvas.height/this.lineHeight); - this.w = this.canvas.width - 2*this.indent; + this.w = this.canvas.width - 2*this.indent - 200; if (this.parsed) { this.parsed.p = this.p; this.parsed.w = this.w;// px, ширина текста this.parsed.font = this.font; + this.parsed.wordWrap = this.wordWrap; this.measureText = (text, style) => {// eslint-disable-line no-unused-vars return this.context.measureText(text).width; }; @@ -87,6 +88,7 @@ class TextPage extends Vue { this.textAlignJustify = true;// выравнивание по ширине this.p = 30;// px, отступ параграфа this.indent = 20;// px, отступ всего текста слева и справа + this.wordWrap = true; this.calcDrawProps(); this.drawPage();// пока не загрузили, очистим канвас diff --git a/client/components/Reader/share/BookParser.js b/client/components/Reader/share/BookParser.js index d41b2ce8..f5ad6f54 100644 --- a/client/components/Reader/share/BookParser.js +++ b/client/components/Reader/share/BookParser.js @@ -228,6 +228,42 @@ export default class BookParser { return result; } + splitToSlogi(word) { + let result = []; + + const glas = new Set(['а', 'А', 'о', 'О', 'и', 'И', 'е', 'Е', 'ё', 'Ё', 'э', 'Э', 'ы', 'Ы', 'у', 'У', 'ю', 'Ю', 'я', 'Я']); + const soglas = new Set([ + 'б', 'в', 'г', 'д', 'ж', 'з', 'й', 'к', 'л', 'м', 'н', 'п', 'р', 'с', 'т', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', + 'Б', 'В', 'Г', 'Д', 'Ж', 'З', 'Й', 'К', 'Л', 'М', 'Н', 'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ч', 'Ц', 'Ш', 'Щ' + ]); + const znak = new Set(['ь', 'Ь', 'ъ', 'Ъ', 'й', 'Й']); + const alpha = new Set(...glas, ...soglas, ...znak); + + let slog = ''; + let slogLen = 0; + const len = word.length; + word += ' '; + for (let i = 0; i < len; i++) { + slog += word[i]; + if (alpha.has(word[i])) + slogLen++; + + if (slogLen > 1 && i < len - 2 && ( + (glas.has(word[i]) && !(soglas.has(word[i + 1]) && soglas.has(word[i + 2]))) || + (soglas.has(word[i]) && soglas.has(word[i + 1]) && (glas.has(word[i + 2]) || soglas.has(word[i + 2]))) || + (znak.has(word[i])) + )) { + result.push(slog); + slog = ''; + slogLen = 0; + } + } + if (slog) + result.push(slog); + + return result; + } + parsePara(paraIndex) { const para = this.para[paraIndex]; @@ -246,8 +282,8 @@ export default class BookParser { font: this.font, }; - const lines = []; - /* array of + + const lines = []; /* array of { begin: Number, end: Number, @@ -274,6 +310,22 @@ export default class BookParser { let w = this.measureText(part) + (j == 0 ? parsed.p : 0); if (w > parsed.w) { + let wordTail; + if (parsed.wordWrap) { + let slogi = this.splitToSlogi(word); + /*for (let k = 0; k < slogi.length - 1; k++) { + }*/ + if (slogi.length > 1) { + prevPart += ' ' + slogi[0] + '-'; + slogi.shift(); + wordTail = slogi.join(''); + } else { + wordTail = word; + } + } else { + wordTail = word; + } + line.parts.push({style: '', text: prevPart}); line.end = line.begin + prevPart.length;//нет -1 !!! line.width = prevW; @@ -282,7 +334,7 @@ export default class BookParser { lines.push(line); line = {begin: line.end + 1, parts: []}; - part = word; + part = wordTail; j++; } prevW = w;