diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-06-23 22:08:33 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-06-25 10:03:39 +0200 |
commit | 9a7f4732c3bd0758fe3a47ff7022a2fbcf4d2dcf (patch) | |
tree | 513d42b4e5117abc292e9a07da8de7b4f13ffa10 | |
parent | 04aa821b169a2341a89b00a3213cbaeb7e2dd9ff (diff) |
shiboken6/doc generator: Fix tables nested in paragraphs
Tables embedded within paragraphs were broken since they were
rst-escaped and newlines simplified by the </para> handling. To fix
this, end the <para> when a <table> is encountered and restart again
afterwards.
Pick-to: 6.1
Task-number: PYSIDE-1112
Change-Id: I2d97d8bfd9f1a838853c58b6a657aa9e4cf719e6
Reviewed-by: Christian Tismer <tismer@stackless.com>
-rw-r--r-- | sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp | 67 | ||||
-rw-r--r-- | sources/shiboken6/generator/qtdoc/qtxmltosphinx.h | 4 |
2 files changed, 52 insertions, 19 deletions
diff --git a/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp b/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp index a4b6616c6..1c22eb4af 100644 --- a/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp +++ b/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp @@ -576,27 +576,46 @@ void QtXmlToSphinx::handleHeadingTag(QXmlStreamReader& reader) void QtXmlToSphinx::handleParaTag(QXmlStreamReader& reader) { - QXmlStreamReader::TokenType token = reader.tokenType(); - if (token == QXmlStreamReader::StartElement) { - pushOutputBuffer(); - } else if (token == QXmlStreamReader::EndElement) { - QString result = popOutputBuffer().simplified(); - if (result.startsWith(QLatin1String("**Warning:**"))) - result.replace(0, 12, QLatin1String(".. warning:: ")); - else if (result.startsWith(QLatin1String("**Note:**"))) - result.replace(0, 9, QLatin1String(".. note:: ")); + switch (reader.tokenType()) { + case QXmlStreamReader::StartElement: + handleParaTagStart(); + break; + case QXmlStreamReader::EndElement: + handleParaTagEnd(); + break; + case QXmlStreamReader::Characters: + handleParaTagText(reader); + break; + default: + break; + } +} - m_output << result << "\n\n"; - } else if (token == QXmlStreamReader::Characters) { - const auto text = reader.text(); - const QChar end = m_output.lastChar(); - if (!text.isEmpty() && m_output.indentation() == 0 && !end.isNull()) { - QChar start = text[0]; - if ((end == QLatin1Char('*') || end == QLatin1Char('`')) && start != QLatin1Char(' ') && !start.isPunct()) - m_output << '\\'; - } - m_output << escape(text); +void QtXmlToSphinx::handleParaTagStart() +{ + pushOutputBuffer(); +} + +void QtXmlToSphinx::handleParaTagText(QXmlStreamReader& reader) +{ + const auto text = reader.text(); + const QChar end = m_output.lastChar(); + if (!text.isEmpty() && m_output.indentation() == 0 && !end.isNull()) { + QChar start = text[0]; + if ((end == u'*' || end == u'`') && start != u' ' && !start.isPunct()) + m_output << '\\'; } + m_output << escape(text); +} + +void QtXmlToSphinx::handleParaTagEnd() +{ + QString result = popOutputBuffer().simplified(); + if (result.startsWith(u"**Warning:**")) + result.replace(0, 12, QStringLiteral(".. warning:: ")); + else if (result.startsWith(u"**Note:**")) + result.replace(0, 9, QStringLiteral(".. note:: ")); + m_output << result << "\n\n"; } void QtXmlToSphinx::handleItalicTag(QXmlStreamReader& reader) @@ -793,12 +812,16 @@ void QtXmlToSphinx::handleTableTag(QXmlStreamReader& reader) { QXmlStreamReader::TokenType token = reader.tokenType(); if (token == QXmlStreamReader::StartElement) { + if (parentTag() == WebXmlTag::para) + handleParaTagEnd(); // End <para> to prevent the table from being rst-escaped m_currentTable.clear(); m_tableHasHeader = false; } else if (token == QXmlStreamReader::EndElement) { // write the table on m_output formatCurrentTable(); m_currentTable.clear(); + if (parentTag() == WebXmlTag::para) + handleParaTagStart(); } } @@ -1008,6 +1031,12 @@ void QtXmlToSphinx::handleLinkEnd(LinkContext *linkContext) m_output << *linkContext; } +WebXmlTag QtXmlToSphinx::parentTag() const +{ + const auto index = m_tagStack.size() - 2; + return index >= 0 ? m_tagStack.at(index) : WebXmlTag::Unknown; +} + // Copy images that are placed in a subdirectory "images" under the webxml files // by qdoc to a matching subdirectory under the "rst/PySide6/<module>" directory static bool copyImage(const QString &href, const QString &docDataDir, diff --git a/sources/shiboken6/generator/qtdoc/qtxmltosphinx.h b/sources/shiboken6/generator/qtdoc/qtxmltosphinx.h index 1895bcc2d..cb6bb504a 100644 --- a/sources/shiboken6/generator/qtdoc/qtxmltosphinx.h +++ b/sources/shiboken6/generator/qtdoc/qtxmltosphinx.h @@ -135,6 +135,9 @@ private: void handleHeadingTag(QXmlStreamReader& reader); void handleParaTag(QXmlStreamReader& reader); + void handleParaTagStart(); + void handleParaTagText(QXmlStreamReader &reader); + void handleParaTagEnd(); void handleItalicTag(QXmlStreamReader& reader); void handleBoldTag(QXmlStreamReader& reader); void handleArgumentTag(QXmlStreamReader& reader); @@ -168,6 +171,7 @@ private: LinkContext *handleLinkStart(const QString &type, QString ref) const; static void handleLinkText(LinkContext *linkContext, const QString &linktext) ; void handleLinkEnd(LinkContext *linkContext); + WebXmlTag parentTag() const; void warn(const QString &message) const; void debug(const QString &message) const; |