From 272b386f586615eeb7ae633ca0c91a2b457ff26e Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Thu, 11 Mar 2021 22:02:15 +0000 Subject: [PATCH] Enhance FictionBook support: book annotation, text-author for the cite, section subtitles BUG: 340134 --- generators/fictionbook/converter.cpp | 49 ++++++++++++++++++++++++++++ generators/fictionbook/converter.h | 1 + 2 files changed, 50 insertions(+) diff --git a/generators/fictionbook/converter.cpp b/generators/fictionbook/converter.cpp index 0243086de..3c0b7a03f 100644 --- a/generators/fictionbook/converter.cpp +++ b/generators/fictionbook/converter.cpp @@ -34,6 +34,7 @@ public: QStringList mGenres; QString mAuthor; QString mTitle; + QString mAnnotation; QStringList mKeywords; QDate mDate; QDomElement mCoverPage; @@ -163,6 +164,19 @@ QTextDocument *Converter::convert(const QString &fileName) mCursor->insertBlock(); } + if (mTitleInfo && !mTitleInfo->mAnnotation.isEmpty()) { + frameFormat.setBorder(0); + mCursor->insertFrame(frameFormat); + + QTextCharFormat charFormat; + charFormat.setFontPointSize(10); + charFormat.setFontItalic(true); + mCursor->insertText(mTitleInfo->mAnnotation, charFormat); + + mCursor->setPosition(topFrame->lastPosition()); + mCursor->insertBlock(); + } + mCursor->insertBlock(); if (!convertBody(element)) { @@ -287,6 +301,9 @@ bool Converter::convertTitleInfo(const QDomElement &element) return false; mTitleInfo->mKeywords = keywords.split(QLatin1Char(' '), QString::SkipEmptyParts); + } else if (child.tagName() == QLatin1String("annotation")) { + if (!convertAnnotation(child, mTitleInfo->mAnnotation)) + return false; } else if (child.tagName() == QLatin1String("date")) { if (!convertDate(child, mTitleInfo->mDate)) return false; @@ -384,6 +401,20 @@ bool Converter::convertDate(const QDomElement &element, QDate &date) return true; } +bool Converter::convertAnnotation(const QDomElement &element, QString &data) +{ + QDomElement child = element.firstChildElement(); + while (!child.isNull()) { + QString text = child.text(); + if (!text.isNull()) + data = child.text(); + + child = child.nextSiblingElement(); + } + + return true; +} + bool Converter::convertSection(const QDomElement &element) { if (element.hasAttribute(QStringLiteral("id"))) @@ -657,6 +688,12 @@ bool Converter::convertEpigraph(const QDomElement &element) } else if (child.tagName() == QLatin1String("empty-line")) { if (!convertEmptyLine(child)) return false; + } else if (child.tagName() == QLatin1String("text-author")) { + QTextBlockFormat format; + format.setTextIndent(10); + mCursor->insertBlock(format); + if (!convertParagraph(child)) + return false; } child = child.nextSiblingElement(); @@ -681,6 +718,12 @@ bool Converter::convertPoem(const QDomElement &element) } else if (child.tagName() == QLatin1String("stanza")) { if (!convertStanza(child)) return false; + } else if (child.tagName() == QLatin1String("text-author")) { + QTextBlockFormat format; + format.setTextIndent(10); + mCursor->insertBlock(format); + if (!convertParagraph(child)) + return false; } child = child.nextSiblingElement(); @@ -723,6 +766,12 @@ bool Converter::convertCite(const QDomElement &element) } else if (child.tagName() == QLatin1String("poem")) { if (!convertParagraph(child)) return false; + } else if (child.tagName() == QLatin1String("text-author")) { + QTextBlockFormat format; + format.setTextIndent(10); + mCursor->insertBlock(format); + if (!convertParagraph(child)) + return false; } else if (child.tagName() == QLatin1String("empty-line")) { if (!convertEmptyLine(child)) return false; diff --git a/generators/fictionbook/converter.h b/generators/fictionbook/converter.h index 4cff9d8fd..ccc1e74ec 100644 --- a/generators/fictionbook/converter.h +++ b/generators/fictionbook/converter.h @@ -63,6 +63,7 @@ private: bool convertAuthor(const QDomElement &element, QString &firstName, QString &middleName, QString &lastName, QString &email, QString &nickname); bool convertDate(const QDomElement &element, QDate &date); bool convertTextNode(const QDomElement &element, QString &data); + bool convertAnnotation(const QDomElement &element, QString &data); QTextDocument *mTextDocument; QTextCursor *mCursor;