Поправки багов, рефакторинг

This commit is contained in:
Book Pauk
2019-01-27 04:20:46 +07:00
parent 2ce198f55f
commit 3d6d951364
2 changed files with 28 additions and 154 deletions

View File

@@ -97,7 +97,7 @@ class BookConverter {
newParagraph(); newParagraph();
const newPara = new Set(['tr', 'br', 'br/', 'dd', 'p', 'title', '/title', 'h1', 'h2', 'h3', '/h1', '/h2', '/h3']); const newPara = new Set(['tr', 'br', 'br/', 'dd', 'p', 'title', '/title', 'h1', 'h2', 'h3', '/h1', '/h2', '/h3']);
const onTextNode = (text, left, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars const onTextNode = (text, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars
if (!cutCounter) { if (!cutCounter) {
growParagraph(text); growParagraph(text);
} }
@@ -106,7 +106,7 @@ class BookConverter {
title = text; title = text;
}; };
const onStartNode = (tag, tail, left, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars const onStartNode = (tag, tail, singleTag, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars
if (!cutCounter) { if (!cutCounter) {
if (newPara.has(tag)) if (newPara.has(tag))
newParagraph(); newParagraph();
@@ -116,7 +116,7 @@ class BookConverter {
inTitle = true; inTitle = true;
}; };
const onEndNode = (tag, tail, left, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars const onEndNode = (tag, tail, singleTag, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars
if (tag == 'title') if (tag == 'title')
inTitle = false; inTitle = false;
}; };
@@ -225,7 +225,7 @@ class BookConverter {
newParagraph(); newParagraph();
const onStartNode = (elemName, tail, left, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars const onStartNode = (elemName, tail, singleTag, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars
if (elemName == '') if (elemName == '')
return; return;
if (!inText) { if (!inText) {
@@ -253,7 +253,7 @@ class BookConverter {
} }
}; };
const onEndNode = (elemName, tail, left, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars const onEndNode = (elemName, tail, singleTag, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars
if (!inText) { if (!inText) {
const oldPath = path; const oldPath = path;
let t = ''; let t = '';
@@ -286,14 +286,14 @@ class BookConverter {
} }
}; };
const onComment = (text, left, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars const onComment = (text) => {// eslint-disable-line no-unused-vars
if (text == '--------- Собственно произведение -------------') if (text == '--------- Собственно произведение -------------')
inText = true; inText = true;
if (text == '-----------------------------------------------') if (text == '-----------------------------------------------')
inText = false; inText = false;
}; };
const onTextNode = (text, left, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars const onTextNode = (text) => {// eslint-disable-line no-unused-vars
if (text != ' ' && text.trim() == '') if (text != ' ' && text.trim() == '')
text = text.trim(); text = text.trim();

View File

@@ -29,6 +29,7 @@ function parseSync(xstr, options) {
while (i < len) { while (i < len) {
inCdata = false; inCdata = false;
inComment = false; inComment = false;
let singleTag = false;
let left = xstr.indexOf('<', i); let left = xstr.indexOf('<', i);
if (left < 0) if (left < 0)
@@ -70,14 +71,18 @@ function parseSync(xstr, options) {
if (rightData < 0) if (rightData < 0)
break; break;
right = rightData; right = rightData;
if (xstr[right - 1] === '/') {
singleTag = true;
rightData--;
}
} }
let tagData = xstr.substr(leftData + 1, rightData - leftData - 1); let tagData = xstr.substr(leftData + 1, rightData - leftData - 1);
if (inCdata) { if (inCdata) {
onCdata(tagData, left, cutCounter, cutTag); onCdata(tagData, cutCounter, cutTag);
} else if (inComment) { } else if (inComment) {
onComment(tagData, left, cutCounter, cutTag); onComment(tagData, cutCounter, cutTag);
} else { } else {
let tag = ''; let tag = '';
let tail = ''; let tail = '';
@@ -92,16 +97,18 @@ function parseSync(xstr, options) {
const text = xstr.substr(i, left - i); const text = xstr.substr(i, left - i);
onTextNode(text, left, cutCounter, cutTag); onTextNode(text, cutCounter, cutTag);
let endTag = ''; let endTag = (singleTag ? tag : '');
if (tag === '' || tag[0] !== '/') { if (tag === '' || tag[0] !== '/') {
onStartNode(tag, tail, left, cutCounter, cutTag); onStartNode(tag, tail, singleTag, cutCounter, cutTag);
} else { } else {
endTag = tag.substr(1); endTag = tag.substr(1);
onEndNode(endTag, tail, left, cutCounter, cutTag);
} }
if (endTag)
onEndNode(endTag, tail, singleTag, cutCounter, cutTag);
if (innerCut.has(tag) && (!cutCounter || cutTag === tag)) { if (innerCut.has(tag) && (!cutCounter || cutTag === tag)) {
if (!cutCounter) if (!cutCounter)
cutTag = tag; cutTag = tag;
@@ -116,8 +123,7 @@ function parseSync(xstr, options) {
} }
if (right >= nextProg) { if (right >= nextProg) {
const prog = Math.round(right/(len + 1)*100); onProgress(Math.round(right/(len + 1)*100));
onProgress((prog >= 100 ? 99 : prog));
nextProg += progStep; nextProg += progStep;
} }
i = right + 1; i = right + 1;
@@ -125,154 +131,22 @@ function parseSync(xstr, options) {
if (i < len) { if (i < len) {
if (inCdata) { if (inCdata) {
onCdata(xstr.substr(i, len - i), len - 1, cutCounter, cutTag); onCdata(xstr.substr(i, len - i), cutCounter, cutTag);
} else if (inComment) { } else if (inComment) {
onComment(xstr.substr(i, len - i), len - 1, cutCounter, cutTag); onComment(xstr.substr(i, len - i), cutCounter, cutTag);
} else { } else {
onTextNode(xstr.substr(i, len - i), len - 1, cutCounter, cutTag); onTextNode(xstr.substr(i, len - i), cutCounter, cutTag);
} }
} }
onProgress(100); onProgress(100);
} }
//асинхронная копия parseSync
async function parse(xstr, options) { async function parse(xstr, options) {
let {onStartNode, onEndNode, onTextNode, onCdata, onComment, onProgress, innerCut} = options; return new Promise((resolve) => {
parseSync(xstr, options);
if (!onStartNode) resolve();
onStartNode = () => {}; });
if (!onEndNode)
onEndNode = () => {};
if (!onTextNode)
onTextNode = () => {};
if (!onCdata)
onCdata = () => {};
if (!onComment)
onComment = () => {};
if (!onProgress)
onProgress = () => {};
if (!innerCut)
innerCut = new Set();
let i = 0;
const len = xstr.length;
const progStep = len/10;
let nextProg = 0;
let cutCounter = 0;
let cutTag = '';
let inCdata;
let inComment;
while (i < len) {
inCdata = false;
inComment = false;
let left = xstr.indexOf('<', i);
if (left < 0)
break;
let leftData = left;
if (left < len - 2 && xstr[left + 1] == '!') {
if (xstr[left + 2] == '-') {
const leftComment = xstr.indexOf('<!--', left);
if (leftComment == left) {
inComment = true;
leftData = left + 3;
}
}
if (!inComment && xstr[left + 2] == '[') {
const leftCdata = xstr.indexOf('<![CDATA[', left);
if (leftCdata == left) {
inCdata = true;
leftData = left + 8;
}
}
}
let right = null;
let rightData = null;
if (inCdata) {
rightData = xstr.indexOf(']]>', leftData + 1);
if (rightData < 0)
break;
right = rightData + 2;
} else if (inComment) {
rightData = xstr.indexOf('-->', leftData + 1);
if (rightData < 0)
break;
right = rightData + 2;
} else {
rightData = xstr.indexOf('>', leftData + 1);
if (rightData < 0)
break;
right = rightData;
}
let tagData = xstr.substr(leftData + 1, rightData - leftData - 1);
if (inCdata) {
await onCdata(tagData, left, cutCounter, cutTag);
} else if (inComment) {
await onComment(tagData, left, cutCounter, cutTag);
} else {
let tag = '';
let tail = '';
const firstSpace = tagData.indexOf(' ');
if (firstSpace >= 0) {
tail = tagData.substr(firstSpace);
tag = tagData.substr(0, firstSpace);
} else {
tag = tagData;
}
tag = tag.toLowerCase();
const text = xstr.substr(i, left - i);
await onTextNode(text, left, cutCounter, cutTag);
let endTag = '';
if (tag === '' || tag[0] !== '/') {
await onStartNode(tag, tail, left, cutCounter, cutTag);
} else {
endTag = tag.substr(1);
await onEndNode(endTag, tail, left, cutCounter, cutTag);
}
if (innerCut.has(tag) && (!cutCounter || cutTag === tag)) {
if (!cutCounter)
cutTag = tag;
cutCounter++;
}
if (cutTag === endTag) {
cutCounter = (cutCounter > 0 ? cutCounter - 1 : 0);
if (!cutCounter)
cutTag = '';
}
}
if (right >= nextProg) {
const prog = Math.round(right/(len + 1)*100);
await onProgress((prog >= 100 ? 99 : prog));
nextProg += progStep;
}
i = right + 1;
}
if (i < len) {
if (inCdata) {
await onCdata(xstr.substr(i, len - i), len - 1, cutCounter, cutTag);
} else if (inComment) {
await onComment(xstr.substr(i, len - i), len - 1, cutCounter, cutTag);
} else {
await onTextNode(xstr.substr(i, len - i), len - 1, cutCounter, cutTag);
}
}
await onProgress(100);
} }
module.exports = { module.exports = {