diff --git a/client/components/Reader/Reader.vue b/client/components/Reader/Reader.vue
index 1f327133..14f212a3 100644
--- a/client/components/Reader/Reader.vue
+++ b/client/components/Reader/Reader.vue
@@ -201,7 +201,7 @@ class Reader extends Vue {
mounted() {
(async() => {
- await bookManager.init(this.settings);
+ await bookManager.init();
await restoreOldSettings(this.settings, bookManager, this.commit);
if (this.$root.rootRoute == '/reader') {
diff --git a/client/components/Reader/SettingsPage/SettingsPage.vue b/client/components/Reader/SettingsPage/SettingsPage.vue
index 2f4039b1..796db49e 100644
--- a/client/components/Reader/SettingsPage/SettingsPage.vue
+++ b/client/components/Reader/SettingsPage/SettingsPage.vue
@@ -185,13 +185,13 @@
Перенос по слогам
- Убирать пустые параграфы
+ Убирать пустые параграфы
Добавлять пустые
-
+
diff --git a/client/components/Reader/TextPage/TextPage.vue b/client/components/Reader/TextPage/TextPage.vue
index ffbb440c..c9e9a4ca 100644
--- a/client/components/Reader/TextPage/TextPage.vue
+++ b/client/components/Reader/TextPage/TextPage.vue
@@ -210,6 +210,8 @@ class TextPage extends Vue {
this.parsed.w = this.w;// px, ширина текста
this.parsed.font = this.font;
this.parsed.wordWrap = this.wordWrap;
+ this.parsed.cutEmptyParagraphs = this.cutEmptyParagraphs;
+ this.parsed.addEmptyParagraphs = this.addEmptyParagraphs;
let t = '';
while (this.drawHelper.measureText(t, {}) < this.w) t += 'Щ';
this.parsed.maxWordLength = t.length - 1;
diff --git a/client/components/Reader/share/BookParser.js b/client/components/Reader/share/BookParser.js
index 82713237..ac8e2f36 100644
--- a/client/components/Reader/share/BookParser.js
+++ b/client/components/Reader/share/BookParser.js
@@ -3,7 +3,7 @@ import sax from '../../../../server/core/BookConverter/sax';
import {sleep} from '../../../share/utils';
export default class BookParser {
- constructor(settings) {
+ constructor() {
// defaults
this.p = 30;// px, отступ параграфа
this.w = 300;// px, ширина страницы
@@ -13,12 +13,6 @@ export default class BookParser {
this.measureText = (text, style) => {// eslint-disable-line no-unused-vars
return text.length*20;
};
-
- //настройки
- if (settings) {
- this.cutEmptyParagraphs = settings.cutEmptyParagraphs;
- this.addEmptyParagraphs = settings.addEmptyParagraphs;
- }
}
async parse(data, callback) {
@@ -51,23 +45,20 @@ export default class BookParser {
index: Number,
offset: Number, //сумма всех length до этого параграфа
length: Number, //длина text без тегов
- text: String //текст параграфа (или title или epigraph и т.д) с вложенными тегами
+ text: String, //текст параграфа с вложенными тегами
+ cut: Boolean, //параграф - кандидат на сокрытие (cutEmptyParagraphs)
+ addIndex: Number, //индекс добавляемого пустого параграфа (addEmptyParagraphs)
}
*/
- const newParagraph = (text, len, noCut) => {
- //схлопывание пустых параграфов
- if (!noCut && this.cutEmptyParagraphs && paraIndex >= 0 && len == 1 && text[0] == ' ') {
- let p = para[paraIndex];
- if (p.length == 1 && p.text[0] == ' ')
- return;
- }
-
+ const newParagraph = (text, len, addIndex) => {
paraIndex++;
let p = {
index: paraIndex,
offset: paraOffset,
length: len,
text: text,
+ cut: (!addIndex && (len == 1 && text[0] == ' ')),
+ addIndex: (addIndex ? addIndex : 0),
};
para[paraIndex] = p;
@@ -82,33 +73,32 @@ export default class BookParser {
}
let p = para[paraIndex];
- if (p) {
- //добавление пустых параграфов
- if (this.addEmptyParagraphs && p.length == 1 && p.text[0] == ' ' && len > 0) {
- let i = this.addEmptyParagraphs;
- while (i > 0) {
- newParagraph(' ', 1, true);
- i--;
- }
- p = para[paraIndex];
+ //добавление пустых (addEmptyParagraphs) параграфов
+ if (p.length == 1 && p.text[0] == ' ' && len > 0) {
+ paraIndex--;
+ paraOffset -= p.length;
+ for (let i = 0; i < 2; i++) {
+ newParagraph(' ', 1, i + 1);
}
- paraOffset -= p.length;
- if (p.length == 1 && p.text[0] == ' ' && len > 0) {
- p.length = 0;
- p.text = p.text.substr(1);
- }
- p.length += len;
- p.text += text;
- } else {
- p = {
- index: paraIndex,
- offset: paraOffset,
- length: len,
- text: text
- };
+ paraIndex++;
+ p.index = paraIndex;
+ p.offset = paraOffset;
+ para[paraIndex] = p;
+ paraOffset += p.length;
}
+ paraOffset -= p.length;
+ //параграф оказался непустой
+ if (p.length == 1 && p.text[0] == ' ' && len > 0) {
+ p.length = 0;
+ p.text = p.text.substr(1);
+ p.cut = (len == 1 && text[0] == ' ');
+ }
+
+ p.length += len;
+ p.text += text;
+
para[paraIndex] = p;
paraOffset += p.length;
};
@@ -432,7 +422,9 @@ export default class BookParser {
para.parsed.p === this.p &&
para.parsed.wordWrap === this.wordWrap &&
para.parsed.maxWordLength === this.maxWordLength &&
- para.parsed.font === this.font
+ para.parsed.font === this.font &&
+ para.parsed.cutEmptyParagraphs === this.cutEmptyParagraphs &&
+ para.parsed.addEmptyParagraphs === this.addEmptyParagraphs
)
return para.parsed;
@@ -442,6 +434,12 @@ export default class BookParser {
wordWrap: this.wordWrap,
maxWordLength: this.maxWordLength,
font: this.font,
+ cutEmptyParagraphs: this.cutEmptyParagraphs,
+ addEmptyParagraphs: this.addEmptyParagraphs,
+ visible: !(
+ (this.cutEmptyParagraphs && para.cut) ||
+ (para.addIndex > this.addEmptyParagraphs)
+ )
};
@@ -614,16 +612,19 @@ export default class BookParser {
let paraIndex = this.findParaIndex(bookPos);
if (paraIndex === undefined)
- return result;
+ return null;
if (n > 0) {
let parsed = this.parsePara(paraIndex);
let i = this.findLineIndex(bookPos, parsed.lines);
if (i === undefined)
- return result;
+ return null;
while (n > 0) {
- result.push(parsed.lines[i]);
+ if (parsed.visible) {
+ result.push(parsed.lines[i]);
+ n--;
+ }
i++;
if (i >= parsed.lines.length) {
@@ -631,21 +632,22 @@ export default class BookParser {
if (paraIndex < this.para.length)
parsed = this.parsePara(paraIndex);
else
- return result;
+ break;
i = 0;
}
-
- n--;
}
} else if (n < 0) {
n = -n;
let parsed = this.parsePara(paraIndex);
let i = this.findLineIndex(bookPos, parsed.lines);
if (i === undefined)
- return result;
+ return null;
while (n > 0) {
- result.push(parsed.lines[i]);
+ if (parsed.visible) {
+ result.push(parsed.lines[i]);
+ n--;
+ }
i--;
if (i < 0) {
@@ -653,16 +655,15 @@ export default class BookParser {
if (paraIndex >= 0)
parsed = this.parsePara(paraIndex);
else
- return result;
+ break;
i = parsed.lines.length - 1;
}
-
- n--;
}
}
if (!result.length)
result = null;
+
return result;
}
}
\ No newline at end of file
diff --git a/client/components/Reader/share/bookManager.js b/client/components/Reader/share/bookManager.js
index 12215372..1d91b0dc 100644
--- a/client/components/Reader/share/bookManager.js
+++ b/client/components/Reader/share/bookManager.js
@@ -18,8 +18,7 @@ const bmRecentStore = localForage.createInstance({
});
class BookManager {
- async init(settings) {
- this.settings = settings;
+ async init() {
this.books = {};
this.recent = {};
this.recentChanged1 = true;
@@ -132,7 +131,7 @@ class BookManager {
async parseBook(meta, data, callback) {
if (!this.books)
await this.init();
- const parsed = new BookParser(this.settings);
+ const parsed = new BookParser();
const parsedMeta = await parsed.parse(data, callback);
const result = Object.assign({}, meta, parsedMeta, {