|
@@ -240,45 +240,33 @@ class BookConverter {
|
|
let body = {_n: 'body', section: {_a: [pars]}};
|
|
let body = {_n: 'body', section: {_a: [pars]}};
|
|
let fb2 = [desc, body];
|
|
let fb2 = [desc, body];
|
|
|
|
|
|
|
|
+ let inSubtitle = false;
|
|
let path = '';
|
|
let path = '';
|
|
let tag = '';// eslint-disable-line no-unused-vars
|
|
let tag = '';// eslint-disable-line no-unused-vars
|
|
|
|
|
|
let inText = false;
|
|
let inText = false;
|
|
- let center = false;
|
|
|
|
- //let italic = false;
|
|
|
|
- //let bold = false;
|
|
|
|
let node = {};
|
|
let node = {};
|
|
|
|
|
|
const newParagraph = () => {
|
|
const newParagraph = () => {
|
|
- node = {_n: 'p', _t: ''};
|
|
|
|
|
|
+ node = {_n: 'p', _a: []};
|
|
pars.push(node);
|
|
pars.push(node);
|
|
};
|
|
};
|
|
|
|
|
|
- const newSubTitle = () => {
|
|
|
|
- node = {_n: 'subtitle', _t: ''};
|
|
|
|
- pars.push(node);
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- const newItalic = () => {
|
|
|
|
- let n = {_n: 'emphasis', _t: ''};
|
|
|
|
- if (!node._a)
|
|
|
|
- node._a = [];
|
|
|
|
|
|
+ const openTag = (name) => {
|
|
|
|
+ let n = {_n: name, _a: [], _p: node};
|
|
node._a.push(n);
|
|
node._a.push(n);
|
|
node = n;
|
|
node = n;
|
|
};
|
|
};
|
|
|
|
|
|
- const newBold = () => {
|
|
|
|
- let n = {_n: 'strong', _t: ''};
|
|
|
|
- if (!node._a)
|
|
|
|
- node._a = [];
|
|
|
|
- node._a.push(n);
|
|
|
|
- node = n;
|
|
|
|
|
|
+ const closeTag = (name) => {
|
|
|
|
+ if (node._n == name && node._p)
|
|
|
|
+ node = node._p;
|
|
};
|
|
};
|
|
|
|
|
|
const growParagraph = (text) => {
|
|
const growParagraph = (text) => {
|
|
- if (node._t == '')
|
|
|
|
|
|
+ if (node._a.length == 0)
|
|
text = text.trimLeft();
|
|
text = text.trimLeft();
|
|
- node._t += text;
|
|
|
|
|
|
+ node._a.push({_t: text});
|
|
};
|
|
};
|
|
|
|
|
|
newParagraph();
|
|
newParagraph();
|
|
@@ -297,23 +285,21 @@ class BookConverter {
|
|
path += '/' + elemName;
|
|
path += '/' + elemName;
|
|
tag = elemName;
|
|
tag = elemName;
|
|
} else {
|
|
} else {
|
|
- if (!center && (elemName == 'p' || elemName == 'dd')) {
|
|
|
|
|
|
+ if (!inSubtitle && (elemName == 'p' || elemName == 'dd')) {
|
|
newParagraph();
|
|
newParagraph();
|
|
}
|
|
}
|
|
|
|
|
|
switch (elemName) {
|
|
switch (elemName) {
|
|
case 'i':
|
|
case 'i':
|
|
- newItalic();
|
|
|
|
- //italic = true;
|
|
|
|
|
|
+ openTag('emphasis');
|
|
break;
|
|
break;
|
|
case 'b':
|
|
case 'b':
|
|
- newBold();
|
|
|
|
- //bold = true;
|
|
|
|
|
|
+ openTag('strong');
|
|
break;
|
|
break;
|
|
case 'div':
|
|
case 'div':
|
|
if (tail == 'center') {
|
|
if (tail == 'center') {
|
|
- newSubTitle();
|
|
|
|
- center = true;
|
|
|
|
|
|
+ openTag('subtitle');
|
|
|
|
+ inSubtitle = true;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -338,13 +324,13 @@ class BookConverter {
|
|
} else {
|
|
} else {
|
|
switch (elemName) {
|
|
switch (elemName) {
|
|
case 'i':
|
|
case 'i':
|
|
- //italic = false;
|
|
|
|
|
|
+ closeTag('emphasis');
|
|
break;
|
|
break;
|
|
case 'b':
|
|
case 'b':
|
|
- //bold = false;
|
|
|
|
|
|
+ closeTag('strong');
|
|
break;
|
|
break;
|
|
case 'div':
|
|
case 'div':
|
|
- center = false;
|
|
|
|
|
|
+ closeTag('subtitle');
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -415,26 +401,29 @@ class BookConverter {
|
|
out += this.formatFb2Node(n);
|
|
out += this.formatFb2Node(n);
|
|
}
|
|
}
|
|
} else if (typeof node == 'string') {
|
|
} else if (typeof node == 'string') {
|
|
- out += `<${name}>${node}</${name}>`;
|
|
|
|
|
|
+ if (name)
|
|
|
|
+ out += `<${name}>${node}</${name}>`;
|
|
|
|
+ else
|
|
|
|
+ out += node;
|
|
} else {
|
|
} else {
|
|
if (node._n)
|
|
if (node._n)
|
|
name = node._n;
|
|
name = node._n;
|
|
- if (!name)
|
|
|
|
- throw new Error(`malformed fb2 object`);
|
|
|
|
|
|
|
|
- out += `<${name}>`;
|
|
|
|
|
|
+ if (name)
|
|
|
|
+ out += `<${name}>`;
|
|
if (node.hasOwnProperty('_t'))
|
|
if (node.hasOwnProperty('_t'))
|
|
out += node._t;
|
|
out += node._t;
|
|
|
|
|
|
for (let nodeName in node) {
|
|
for (let nodeName in node) {
|
|
- if (nodeName == '_n' || nodeName == '_t')
|
|
|
|
|
|
+ if (nodeName && nodeName[0] == '_' && nodeName != '_a')
|
|
continue;
|
|
continue;
|
|
|
|
|
|
const n = node[nodeName];
|
|
const n = node[nodeName];
|
|
out += this.formatFb2Node(n, nodeName);
|
|
out += this.formatFb2Node(n, nodeName);
|
|
}
|
|
}
|
|
|
|
|
|
- out += `</${name}>`;
|
|
|
|
|
|
+ if (name)
|
|
|
|
+ out += `</${name}>`;
|
|
}
|
|
}
|
|
return out;
|
|
return out;
|
|
}
|
|
}
|