Browse Source

Доработки парсинга fb2 - распознаем тег sequence

Book Pauk 4 năm trước cách đây
mục cha
commit
c2131e3654
2 tập tin đã thay đổi với 41 bổ sung3 xóa
  1. 29 1
      client/components/Reader/share/BookParser.js
  2. 12 2
      client/share/utils.js

+ 29 - 1
client/components/Reader/share/BookParser.js

@@ -216,12 +216,32 @@ export default class BookParser {
                 }
             }
 
-            if (tag == 'author' && path.indexOf('/fictionbook/description/title-info/author') == 0) {
+            if (path == '/fictionbook/description/title-info/author') {
                 if (!fb2.author)
                     fb2.author = [];
+
                 fb2.author.push({});
             }
 
+            const isPublishSequence = (path == '/fictionbook/description/publish-info/sequence');
+            if (path == '/fictionbook/description/title-info/sequence' || isPublishSequence) {
+                if (!fb2.sequence)
+                    fb2.sequence = [];
+
+                if (!isPublishSequence || !fb2.sequence.length) {
+                    const attrs = sax.getAttrsSync(tail);
+                    const seq = {};
+                    if (attrs.name && attrs.name.value) {
+                        seq.name = attrs.name.value;
+                    }
+                    if (attrs.number && attrs.number.value) {
+                        seq.number = attrs.number.value;
+                    }
+
+                    fb2.sequence.push(seq);
+                }
+            }
+
             if (path.indexOf('/fictionbook/body') == 0) {
                 if (tag == 'body') {
                     if (isFirstBody && fb2.annotation) {
@@ -233,6 +253,14 @@ export default class BookParser {
                             newParagraph(' ', 1);
                     }
 
+                    if (isFirstBody && fb2.sequence && fb2.sequence.length) {
+                        const bt = utils.getBookTitle(fb2);
+                        if (bt.sequence) {
+                            newParagraph(bt.sequence, bt.sequence.length);
+                            newParagraph(' ', 1);
+                        }
+                    }
+
                     if (!isFirstBody)
                         newParagraph(' ', 1);
                     isFirstBody = false;

+ 12 - 2
client/share/utils.js

@@ -336,8 +336,18 @@ export function getBookTitle(fb2) {
         result.author = authorNames.join(', ');
     }
 
-    if (fb2.bookTitle)
-        result.bookTitle = fb2.bookTitle;
+    if (fb2.sequence) {
+        const seqs = fb2.sequence.map(s => _.compact([
+            s.name,
+            (s.number ? `#${s.number}` : null),
+        ]).join(' '));
+
+        result.sequence = seqs.join(', ');
+        if (result.sequence)
+            result.sequenceTitle = `(${result.sequence})`;
+    }
+
+    result.bookTitle = _.compact([result.sequenceTitle, fb2.bookTitle]).join(' ');
 
     result.title = _.compact([
         result.author,