Доделал перенос по слогам

This commit is contained in:
Book Pauk
2019-01-17 01:15:12 +07:00
parent f622dbca7d
commit 439296bf04
2 changed files with 46 additions and 14 deletions

View File

@@ -54,7 +54,7 @@ class TextPage extends Vue {
this.canvas.height = this.$refs.main.clientHeight; this.canvas.height = this.$refs.main.clientHeight;
this.lineHeight = this.fontSize + this.lineInterval; this.lineHeight = this.fontSize + this.lineInterval;
this.pageLineCount = Math.floor(this.canvas.height/this.lineHeight); this.pageLineCount = Math.floor(this.canvas.height/this.lineHeight);
this.w = this.canvas.width - 2*this.indent - 200; this.w = this.canvas.width - 2*this.indent;
if (this.parsed) { if (this.parsed) {
this.parsed.p = this.p; this.parsed.p = this.p;
@@ -82,7 +82,7 @@ class TextPage extends Vue {
this.textColor = 'black'; this.textColor = 'black';
this.backgroundColor = '#478355'; this.backgroundColor = '#478355';
this.fontStyle = '';// 'bold','italic' this.fontStyle = '';// 'bold','italic'
this.fontSize = 20;// px this.fontSize = 40;// px
this.fontName = 'arial'; this.fontName = 'arial';
this.lineInterval = 5;// px, межстрочный интервал this.lineInterval = 5;// px, межстрочный интервал
this.textAlignJustify = true;// выравнивание по ширине this.textAlignJustify = true;// выравнивание по ширине

View File

@@ -237,22 +237,35 @@ export default class BookParser {
'Б', 'В', 'Г', 'Д', 'Ж', 'З', 'Й', 'К', 'Л', 'М', 'Н', 'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ч', 'Ц', 'Ш', 'Щ' 'Б', 'В', 'Г', 'Д', 'Ж', 'З', 'Й', 'К', 'Л', 'М', 'Н', 'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ч', 'Ц', 'Ш', 'Щ'
]); ]);
const znak = new Set(['ь', 'Ь', 'ъ', 'Ъ', 'й', 'Й']); const znak = new Set(['ь', 'Ь', 'ъ', 'Ъ', 'й', 'Й']);
const alpha = new Set(...glas, ...soglas, ...znak); const alpha = new Set([...glas, ...soglas, ...znak, ' ']);
let slog = ''; let slog = '';
let slogLen = 0; let slogLen = 0;
const len = word.length; const len = word.length;
word += ' '; word += ' ';
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
slog += word[i]; slog += word[i];
if (alpha.has(word[i])) if (alpha.has(word[i]))
slogLen++; slogLen++;
if (slogLen > 1 && i < len - 2 && ( if (slogLen > 1 && i < len - 2 && (
(glas.has(word[i]) && !(soglas.has(word[i + 1]) && soglas.has(word[i + 2]))) || //гласная, а следом не 2 согласные буквы
(soglas.has(word[i]) && soglas.has(word[i + 1]) && (glas.has(word[i + 2]) || soglas.has(word[i + 2]))) || (glas.has(word[i]) && !(soglas.has(word[i + 1]) &&
soglas.has(word[i + 2])) && alpha.has(word[i + 1]) && alpha.has(word[i + 2])
) ||
//предыдущая не согласная буква, текущая согласная, а следом согласная и согласная|гласная буквы
(alpha.has(word[i - 1]) && !soglas.has(word[i - 1]) &&
soglas.has(word[i]) && soglas.has(word[i + 1]) &&
(glas.has(word[i + 2]) || soglas.has(word[i + 2])) &&
alpha.has(word[i + 1]) && alpha.has(word[i + 2])
) ||
//мягкий или твердый знак или Й
(znak.has(word[i])) (znak.has(word[i]))
)) { ) &&
//нельзя оставлять окончания на ь, ъ, й
!(znak.has(word[i + 2]) && !alpha.has(word[i + 3]))
) {
result.push(slog); result.push(slog);
slog = ''; slog = '';
slogLen = 0; slogLen = 0;
@@ -308,17 +321,36 @@ export default class BookParser {
const word = words[i]; const word = words[i];
part += word; part += word;
let w = this.measureText(part) + (j == 0 ? parsed.p : 0); let p = (j == 0 ? parsed.p : 0);
let w = this.measureText(part) + p;
if (w > parsed.w) { if (w > parsed.w) {
let wordTail; let wordTail;
if (parsed.wordWrap) { if (parsed.wordWrap) {
let slogi = this.splitToSlogi(word); let slogi = this.splitToSlogi(word);
/*for (let k = 0; k < slogi.length - 1; k++) {
}*/
if (slogi.length > 1) { if (slogi.length > 1) {
prevPart += ' ' + slogi[0] + '-'; let s = prevPart + ' ';
slogi.shift(); let pw;
wordTail = slogi.join('');
const slogiLen = slogi.length;
for (let k = 0; k < slogiLen - 1; k++) {
let ww = this.measureText(s + slogi[0] + '-') + p;
if (ww <= parsed.w) {
s += slogi[0];
} else
break;
pw = ww;
slogi.shift();
}
if (pw) {
prevW = pw;
prevPart = s + '-';
wordTail = slogi.join('');
} else {
wordTail = word;
}
} else { } else {
wordTail = word; wordTail = word;
} }