aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/generator/qtdoc
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2018-04-30 16:52:16 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2018-05-02 13:27:46 +0000
commitc5582d3120249a902681454b2319df765ffa2cd8 (patch)
treed514c205fadc95f8aa61b813ba388a8a843667b9 /sources/shiboken2/generator/qtdoc
parentd5581049f8789eae86e91372f34ec8ed794272aa (diff)
QtXmlToSphinx: Refactor label handling
Add utility functions to remove invalid characters and a helper for streaming Task-number: PYSIDE-363 Change-Id: I45eb33ed60deed82912262a99551436c538eee22 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io> Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/shiboken2/generator/qtdoc')
-rw-r--r--sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp42
-rw-r--r--sources/shiboken2/generator/qtdoc/qtdocgenerator.h2
2 files changed, 38 insertions, 6 deletions
diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp
index 7b9f25369..b90077e84 100644
--- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp
+++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp
@@ -167,6 +167,36 @@ static void formatSince(QTextStream &s, const char *what, const TypeEntry *te)
}
}
+// RST anchor string: Anything else but letters, numbers, '_' or '.' replaced by '-'
+static inline bool isValidRstLabelChar(QChar c)
+{
+ return c.isLetterOrNumber() || c == QLatin1Char('_') || c == QLatin1Char('.');
+}
+
+static QString toRstLabel(QString s)
+{
+ for (int i = 0, size = s.size(); i < size; ++i) {
+ if (!isValidRstLabelChar(s.at(i)))
+ s[i] = QLatin1Char('-');
+ }
+ return s;
+}
+
+class rstLabel
+{
+public:
+ explicit rstLabel(const QString &l) : m_label(l) {}
+
+ friend QTextStream &operator<<(QTextStream &str, const rstLabel &a)
+ {
+ str << ".. _" << toRstLabel(a.m_label) << ':' << endl << endl;
+ return str;
+ }
+
+private:
+ const QString &m_label;
+};
+
static QString msgTagWarning(const QXmlStreamReader &reader, const QString &context,
const QString &tag, const QString &message)
{
@@ -851,9 +881,11 @@ void QtXmlToSphinx::handleLinkTag(QXmlStreamReader& reader)
}
}
-QtXmlToSphinx::LinkContext *QtXmlToSphinx::handleLinkStart(const QString &type, const QString &ref) const
+QtXmlToSphinx::LinkContext *QtXmlToSphinx::handleLinkStart(const QString &type, QString ref) const
{
- LinkContext *result = new LinkContext(ref, type);
+ ref.replace(QLatin1String("::"), QLatin1String("."));
+ ref.remove(QLatin1String("()"));
+ LinkContext *result = new LinkContext(toRstLabel(ref), type);
result->linkTagEnding = QLatin1String("` ");
if (m_insideBold) {
@@ -864,8 +896,6 @@ QtXmlToSphinx::LinkContext *QtXmlToSphinx::handleLinkStart(const QString &type,
result->linkTagEnding.append(QLatin1Char('*'));
}
- result->linkRef.replace(QLatin1String("::"), QLatin1String("."));
- result->linkRef.remove(QLatin1String("()"));
if (result->type == functionLinkType() && !m_context.isEmpty()) {
result->linkTag = QLatin1String(" :meth:`");
@@ -1094,7 +1124,9 @@ void QtXmlToSphinx::handleAnchorTag(QXmlStreamReader& reader)
anchor = reader.attributes().value(QLatin1String("name")).toString();
if (!anchor.isEmpty() && m_opened_anchor != anchor) {
m_opened_anchor = anchor;
- m_output << INDENT << ".. _" << m_context << "_" << anchor.toLower() << ":" << endl << endl;
+ if (!m_context.isEmpty())
+ anchor.prepend(m_context + QLatin1Char('_'));
+ m_output << INDENT << rstLabel(anchor);
}
} else if (token == QXmlStreamReader::EndElement) {
m_opened_anchor.clear();
diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.h b/sources/shiboken2/generator/qtdoc/qtdocgenerator.h
index 04d3a3e62..df0e5ef9c 100644
--- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.h
+++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.h
@@ -158,7 +158,7 @@ private:
void handleUselessTag(QXmlStreamReader& reader);
void handleAnchorTag(QXmlStreamReader& reader);
- LinkContext *handleLinkStart(const QString &type, const QString &ref) const;
+ LinkContext *handleLinkStart(const QString &type, QString ref) const;
void handleLinkText(LinkContext *linkContext, QString linktext) const;
void handleLinkEnd(LinkContext *linkContext);