From 5e4e428210742d252fe73e46e4c3393375173e0c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 16 Feb 2018 15:09:56 +0100 Subject: shiboken/docgenerator: Refactor code doing the escapes for rst Introduce a streamable class that does the escaping and some helpers for QString/QStringRef. Task-number: PYSIDE-363 Change-Id: Ica6d8a2ab43eeb597b4e9080330dc2ce700e0ed2 Reviewed-by: Cristian Maureira-Fredes Reviewed-by: Alexandru Croitor --- .../shiboken2/generator/qtdoc/qtdocgenerator.cpp | 57 +++++++++++++++------- 1 file changed, 39 insertions(+), 18 deletions(-) (limited to 'sources/shiboken2/generator') diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp index 2b494cbc4..f33cebfae 100644 --- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp +++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp @@ -107,17 +107,35 @@ inline QTextStream &operator<<(QTextStream &str, const Pad &pad) return str; } -static QString escape(QString str) -{ - str.replace(QLatin1Char('*'), QLatin1String("\\*")); - str.replace(QLatin1Char('_'), QLatin1String("\\_")); - return str; +template +static int writeEscapedRstText(QTextStream &str, const String &s) +{ + int escaped = 0; + for (const QChar &c : s) { + if (c == QLatin1Char('*') || c == QLatin1Char('_')) { + str << '\\'; + ++escaped; + } + str << c; + } + return s.size() + escaped; } -static QString escape(const QStringRef& strref) +class escape +{ +public: + explicit escape(const QStringRef &s) : m_string(s) {} + + void write(QTextStream &str) const { writeEscapedRstText(str, m_string); } + +private: + const QStringRef m_string; +}; + +inline QTextStream &operator<<(QTextStream &str, const escape &e) { - QString str = strref.toString(); - return escape(str); + e.write(str); + return str; } static QString msgTagWarning(const QXmlStreamReader &reader, const QString &context, @@ -416,7 +434,7 @@ QString QtXmlToSphinx::readFromLocation(const QString &location, const QString & void QtXmlToSphinx::handleHeadingTag(QXmlStreamReader& reader) { - static QString heading; + static int headingSize = 0; static char type; static char types[] = { '-', '^' }; QXmlStreamReader::TokenType token = reader.tokenType(); @@ -427,10 +445,11 @@ void QtXmlToSphinx::handleHeadingTag(QXmlStreamReader& reader) else type = types[typeIdx]; } else if (token == QXmlStreamReader::EndElement) { - m_output << Pad(type, heading.length()) << endl << endl; + m_output << Pad(type, headingSize) << endl << endl; } else if (token == QXmlStreamReader::Characters) { - heading = escape(reader.text()).trimmed(); - m_output << endl << endl << heading << endl; + m_output << endl << endl; + headingSize = writeEscapedRstText(m_output, reader.text().trimmed()); + m_output << endl; } } @@ -448,14 +467,14 @@ void QtXmlToSphinx::handleParaTag(QXmlStreamReader& reader) m_output << INDENT << result << endl << endl; } else if (token == QXmlStreamReader::Characters) { - QString text = escape(reader.text()); - if (!m_output.string()->isEmpty()) { + const QStringRef text = reader.text(); + if (!text.isEmpty() && INDENT.indent == 0 && !m_output.string()->isEmpty()) { QChar start = text[0]; QChar end = m_output.string()->at(m_output.string()->length() - 1); if ((end == QLatin1Char('*') || end == QLatin1Char('`')) && start != QLatin1Char(' ') && !start.isPunct()) m_output << '\\'; } - m_output << INDENT << text; + m_output << INDENT << escape(text); } } @@ -466,7 +485,7 @@ void QtXmlToSphinx::handleItalicTag(QXmlStreamReader& reader) m_insideItalic = !m_insideItalic; m_output << '*'; } else if (token == QXmlStreamReader::Characters) { - m_output << escape(reader.text()).trimmed(); + m_output << escape(reader.text().trimmed()); } } @@ -477,7 +496,7 @@ void QtXmlToSphinx::handleBoldTag(QXmlStreamReader& reader) m_insideBold = !m_insideBold; m_output << "**"; } else if (token == QXmlStreamReader::Characters) { - m_output << escape(reader.text()).trimmed(); + m_output << escape(reader.text().trimmed()); } } @@ -788,7 +807,9 @@ void QtXmlToSphinx::handleLinkTag(QXmlStreamReader& reader) } else if (token == QXmlStreamReader::EndElement) { if (!l_linktext.isEmpty()) l_linktagending.prepend(QLatin1Char('>')); - m_output << l_linktag << l_linktext << escape(l_linkref) << l_linktagending; + m_output << l_linktag << l_linktext; + writeEscapedRstText(m_output, l_linkref); + m_output << l_linktagending; } } -- cgit v1.2.3