Работа над стилизацией, промежуточный коммит

This commit is contained in:
Book Pauk
2019-01-17 05:35:49 +07:00
parent f25d39c316
commit 6e78157ccf
2 changed files with 98 additions and 62 deletions

View File

@@ -162,7 +162,7 @@ class TextPage extends Vue {
first: Boolean, first: Boolean,
last: Boolean, last: Boolean,
parts: array of { parts: array of {
style: 'bold'|'italic', style: {bold: Boolean, italic: Boolean}
text: String, text: String,
} }
}*/ }*/

View File

@@ -214,13 +214,34 @@ export default class BookParser {
return result; return result;
} }
removeTags(s) { splitToStyle(s) {
let result = ''; let result = [];/*array of {
style: {bold: Boolean, italic: Boolean},
text: String,
}*/
const parser = new EasySAXParser(); const parser = new EasySAXParser();
let style = {};
parser.on('textNode', (text) => { parser.on('textNode', (text) => {
result += text; result.push({
style: Object.assign({}, style),
text: text
});
});
parser.on('startNode', (elemName, getAttr, isTagEnd, getStrNode) => {// eslint-disable-line no-unused-vars
if (elemName == 'strong')
style.bold = true;
else if (elemName == 'emphasis')
style.italic = true;
});
parser.on('endNode', (elemName, isTagStart, getStrNode) => {// eslint-disable-line no-unused-vars
if (elemName == 'strong')
style.bold = false;
else if (elemName == 'emphasis')
style.italic = false;
}); });
parser.parse(`<p>${s}</p>`); parser.parse(`<p>${s}</p>`);
@@ -304,87 +325,102 @@ export default class BookParser {
first: Boolean, first: Boolean,
last: Boolean, last: Boolean,
parts: array of { parts: array of {
style: 'bold'|'italic', style: {bold: Boolean, italic: Boolean},
text: String, text: String,
} }
}*/ }*/
let text = this.removeTags(para.text); let parts = this.splitToStyle(para.text);
let line = {begin: para.offset, parts: []}; let line = {begin: para.offset, parts: []};
let prevPart = ''; let prevStr = '';
let part = ''; let str = '';
let prevW = 0; let prevW = 0;
let j = 0; let j = 0;//номер строки
let ofs = -1;
let word = ''; let word = '';
let newPara = true; let isNewPara = true;
text += ' '; // тут начинается самый замес, перенос по слогам и стилизация
// тут начинается самый замес, перенос и стилизация let text = '';
for (let i = 0; i < text.length; i++) { let style = {};
if (text[i] != ' ') { for (let part of parts) {
word += text[i]; text = part.text;
continue; style = part.style;
}
part += (newPara ? '' : ' ') + word;
newPara = false;
let p = (j == 0 ? parsed.p : 0); for (let i = 0; i < text.length; i++) {
let w = this.measureText(part) + p; ofs++;
if (w > parsed.w) {
let wordTail;
let pw; if (i < text.length - 1) {
if (parsed.wordWrap) { if (text[i] != ' ') {
let slogi = this.splitToSlogi(word); word += text[i];
continue;
}
} else {
if (text[i] != ' ') {
word += text[i];
}
}
str += (isNewPara ? '' : ' ') + word;
isNewPara = false;
if (slogi.length > 1) { let p = (j == 0 ? parsed.p : 0);
let s = prevPart + ' '; let w = this.measureText(str) + p;
if (w > parsed.w) {
let wordTail;
const slogiLen = slogi.length; if (parsed.wordWrap) {
for (let k = 0; k < slogiLen - 1; k++) { let slogi = this.splitToSlogi(word);
let slog = slogi[0];
if (slog[slog.length - 1] == '-') //убрать '-' в конце слога, добавим свой
slog = slog.substr(0, slog.length - 1);
let ww = this.measureText(s + slog + '-') + p;
if (ww <= parsed.w) {
s += slog;
} else
break;
pw = ww;
slogi.shift();
}
if (pw) { if (slogi.length > 1) {
prevW = pw; let s = prevStr + ' ';
prevPart = s + '-';
wordTail = slogi.join(''); let pw;
const slogiLen = slogi.length;
for (let k = 0; k < slogiLen - 1; k++) {
let slog = slogi[0];
if (slog[slog.length - 1] == '-') //убрать '-' в конце слога, добавим свой
slog = slog.substr(0, slog.length - 1);
let ww = this.measureText(s + slog + '-') + p;
if (ww <= parsed.w) {
s += slog;
} else
break;
pw = ww;
slogi.shift();
}
if (pw) {
prevW = pw;
prevStr = s + '-';
wordTail = slogi.join('');
} else {
wordTail = word;
}
} else { } else {
wordTail = word; wordTail = word;
} }
} else { } else {
wordTail = word; wordTail = word;
} }
} else {
wordTail = word; line.parts.push({style, text: prevStr});
line.end = para.offset + ofs;
line.width = prevW;
line.first = (j == 0);
line.last = false;
lines.push(line);
line = {begin: para.offset + ofs + 1, parts: []};
str = wordTail;
j++;
} }
prevW = w;
line.parts.push({style: '', text: prevPart}); prevStr = str;
line.end = para.offset + i; word = '';
line.width = prevW;
line.first = (j == 0);
line.last = false;
lines.push(line);
line = {begin: line.end + 1, parts: []};
part = wordTail;
j++;
} }
prevW = w;
prevPart = part;
word = '';
} }
line.parts.push({style: '', text: prevPart}); line.parts.push({style, text: prevStr});
line.end = para.offset + para.length - 1; line.end = para.offset + para.length - 1;
line.width = prevW; line.width = prevW;
line.first = (j == 0); line.first = (j == 0);