aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-06-23 22:08:33 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-06-25 10:13:49 +0000
commitecff7d18b62d8168082dbf59498e4bf01233eb95 (patch)
tree091c25854cad1bf974cd36fd2938f55a9c2f7ca3
parent6bba0aa85264f5336863e2cf910cae13a548bcf3 (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. Task-number: PYSIDE-1112 Change-Id: I2d97d8bfd9f1a838853c58b6a657aa9e4cf719e6 Reviewed-by: Christian Tismer <tismer@stackless.com> (cherry picked from commit 9a7f4732c3bd0758fe3a47ff7022a2fbcf4d2dcf) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp67
-rw-r--r--sources/shiboken6/generator/qtdoc/qtxmltosphinx.h4
2 files changed, 52 insertions, 19 deletions
diff --git a/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp b/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp
index e7d611f8b..6bca4498c 100644
--- a/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp
+++ b/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp
@@ -575,27 +575,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)
@@ -792,12 +811,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();
}
}
@@ -1007,6 +1030,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;