aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-11-26 11:19:00 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-11-30 09:47:32 +0000
commitf9f044b6e26b255fe4e88f061b3106ec4f310fb4 (patch)
tree7b5a22d706fae1823fb87b77332365da2b4784f2 /sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp
parentd55a0ffb6b7ed154f5971c71b29621b532a394f5 (diff)
shiboken6: Replace handler map in QtXmlToSphinx by an enumeration
Constructing the strings and populating a hash with function pointers for each invocation on a snippet is wasteful. Introduce an enum, populate a constant static hash with it and dispatch the call via switch. Change-Id: Ia8e0123fc31802c35b33308edb0fa9edc6add775 Reviewed-by: Christian Tismer <tismer@stackless.com> Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp')
-rw-r--r--sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp319
1 files changed, 238 insertions, 81 deletions
diff --git a/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp b/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp
index 427421a17..45dd1557e 100644
--- a/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp
+++ b/sources/shiboken6/generator/qtdoc/qtxmltosphinx.cpp
@@ -122,88 +122,247 @@ TextStream &operator<<(TextStream &str, const QtXmlToSphinx::LinkContext &linkCo
return str;
}
+enum class WebXmlTag {
+ Unknown,
+ heading, brief, para, italic, bold, see_also, snippet, dots, codeline,
+ table, header, row, item, argument, teletype, link, inlineimage, image,
+ list, term, raw, underline, superscript, code, badcode, legalese,
+ rst, section, quotefile,
+ // ignored tags
+ generatedlist, tableofcontents, quotefromfile, skipto, target, page, group,
+ // useless tags
+ description, definition, printuntil, relation,
+ // Doxygen tags
+ title, ref, computeroutput, detaileddescription, name, listitem,
+ parametername, parameteritem, ulink, itemizedlist, parameternamelist,
+ parameterlist,
+ // Doxygen ignored tags
+ highlight, linebreak, programlisting, xreftitle, sp, entry, simplesect,
+ verbatim, xrefsect, xrefdescription,
+};
+
+using WebXmlTagHash = QHash<QStringView, WebXmlTag>;
+
+static const WebXmlTagHash &webXmlTagHash()
+{
+ static const WebXmlTagHash result = {
+ {u"heading", WebXmlTag::heading},
+ {u"brief", WebXmlTag::brief},
+ {u"para", WebXmlTag::para},
+ {u"italic", WebXmlTag::italic},
+ {u"bold", WebXmlTag::bold},
+ {u"see-also", WebXmlTag::see_also},
+ {u"snippet", WebXmlTag::snippet},
+ {u"dots", WebXmlTag::dots},
+ {u"codeline", WebXmlTag::codeline},
+ {u"table", WebXmlTag::table},
+ {u"header", WebXmlTag::header},
+ {u"row", WebXmlTag::row},
+ {u"item", WebXmlTag::item},
+ {u"argument", WebXmlTag::argument},
+ {u"teletype", WebXmlTag::teletype},
+ {u"link", WebXmlTag::link},
+ {u"inlineimage", WebXmlTag::inlineimage},
+ {u"image", WebXmlTag::image},
+ {u"list", WebXmlTag::list},
+ {u"term", WebXmlTag::term},
+ {u"raw", WebXmlTag::raw},
+ {u"underline", WebXmlTag::underline},
+ {u"superscript", WebXmlTag::superscript},
+ {u"code", WebXmlTag::code},
+ {u"badcode", WebXmlTag::badcode},
+ {u"legalese", WebXmlTag::legalese},
+ {u"rst", WebXmlTag::rst},
+ {u"section", WebXmlTag::section},
+ {u"quotefile", WebXmlTag::quotefile},
+ {u"generatedlist", WebXmlTag::generatedlist},
+ {u"tableofcontents", WebXmlTag::tableofcontents},
+ {u"quotefromfile", WebXmlTag::quotefromfile},
+ {u"skipto", WebXmlTag::skipto},
+ {u"target", WebXmlTag::target},
+ {u"page", WebXmlTag::page},
+ {u"group", WebXmlTag::group},
+ {u"description", WebXmlTag::description},
+ {u"definition", WebXmlTag::definition},
+ {u"printuntil", WebXmlTag::printuntil},
+ {u"relation", WebXmlTag::relation},
+ {u"title", WebXmlTag::title},
+ {u"ref", WebXmlTag::ref},
+ {u"computeroutput", WebXmlTag::computeroutput},
+ {u"detaileddescription", WebXmlTag::detaileddescription},
+ {u"name", WebXmlTag::name},
+ {u"listitem", WebXmlTag::listitem},
+ {u"parametername", WebXmlTag::parametername},
+ {u"parameteritem", WebXmlTag::parameteritem},
+ {u"ulink", WebXmlTag::ulink},
+ {u"itemizedlist", WebXmlTag::itemizedlist},
+ {u"parameternamelist", WebXmlTag::parameternamelist},
+ {u"parameterlist", WebXmlTag::parameterlist},
+ {u"highlight", WebXmlTag::highlight},
+ {u"linebreak", WebXmlTag::linebreak},
+ {u"programlisting", WebXmlTag::programlisting},
+ {u"xreftitle", WebXmlTag::xreftitle},
+ {u"sp", WebXmlTag::sp},
+ {u"entry", WebXmlTag::entry},
+ {u"simplesect", WebXmlTag::simplesect},
+ {u"verbatim", WebXmlTag::verbatim},
+ {u"xrefsect", WebXmlTag::xrefsect},
+ {u"xrefdescription", WebXmlTag::xrefdescription},
+ };
+ return result;
+}
+
QtXmlToSphinx::QtXmlToSphinx(const QtDocGenerator *generator,
const QString& doc, const QString& context)
: m_output(static_cast<QString *>(nullptr)),
m_tableHasHeader(false), m_context(context), m_generator(generator),
m_insideBold(false), m_insideItalic(false)
{
- m_handlerMap.insert(QLatin1String("heading"), &QtXmlToSphinx::handleHeadingTag);
- m_handlerMap.insert(QLatin1String("brief"), &QtXmlToSphinx::handleParaTag);
- m_handlerMap.insert(QLatin1String("para"), &QtXmlToSphinx::handleParaTag);
- m_handlerMap.insert(QLatin1String("italic"), &QtXmlToSphinx::handleItalicTag);
- m_handlerMap.insert(QLatin1String("bold"), &QtXmlToSphinx::handleBoldTag);
- m_handlerMap.insert(QLatin1String("see-also"), &QtXmlToSphinx::handleSeeAlsoTag);
- m_handlerMap.insert(QLatin1String("snippet"), &QtXmlToSphinx::handleSnippetTag);
- m_handlerMap.insert(QLatin1String("dots"), &QtXmlToSphinx::handleDotsTag);
- m_handlerMap.insert(QLatin1String("codeline"), &QtXmlToSphinx::handleDotsTag);
- m_handlerMap.insert(QLatin1String("table"), &QtXmlToSphinx::handleTableTag);
- m_handlerMap.insert(QLatin1String("header"), &QtXmlToSphinx::handleRowTag);
- m_handlerMap.insert(QLatin1String("row"), &QtXmlToSphinx::handleRowTag);
- m_handlerMap.insert(QLatin1String("item"), &QtXmlToSphinx::handleItemTag);
- m_handlerMap.insert(QLatin1String("argument"), &QtXmlToSphinx::handleArgumentTag);
- m_handlerMap.insert(QLatin1String("teletype"), &QtXmlToSphinx::handleArgumentTag);
- m_handlerMap.insert(QLatin1String("link"), &QtXmlToSphinx::handleLinkTag);
- m_handlerMap.insert(QLatin1String("inlineimage"), &QtXmlToSphinx::handleInlineImageTag);
- m_handlerMap.insert(QLatin1String("image"), &QtXmlToSphinx::handleImageTag);
- m_handlerMap.insert(QLatin1String("list"), &QtXmlToSphinx::handleListTag);
- m_handlerMap.insert(QLatin1String("term"), &QtXmlToSphinx::handleTermTag);
- m_handlerMap.insert(QLatin1String("raw"), &QtXmlToSphinx::handleRawTag);
- m_handlerMap.insert(QLatin1String("underline"), &QtXmlToSphinx::handleItalicTag);
- m_handlerMap.insert(QLatin1String("superscript"), &QtXmlToSphinx::handleSuperScriptTag);
- m_handlerMap.insert(QLatin1String("code"), &QtXmlToSphinx::handleCodeTag);
- m_handlerMap.insert(QLatin1String("badcode"), &QtXmlToSphinx::handleCodeTag);
- m_handlerMap.insert(QLatin1String("legalese"), &QtXmlToSphinx::handleCodeTag);
- m_handlerMap.insert(QLatin1String("rst"), &QtXmlToSphinx::handleRstPassTroughTag);
- m_handlerMap.insert(QLatin1String("section"), &QtXmlToSphinx::handleAnchorTag);
- m_handlerMap.insert(QLatin1String("quotefile"), &QtXmlToSphinx::handleQuoteFileTag);
-
- // ignored tags
- m_handlerMap.insert(QLatin1String("generatedlist"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("tableofcontents"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("quotefromfile"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("skipto"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("target"), &QtXmlToSphinx::handleTargetTag);
- m_handlerMap.insert(QLatin1String("page"), &QtXmlToSphinx::handlePageTag);
- m_handlerMap.insert(QLatin1String("group"), &QtXmlToSphinx::handlePageTag);
-
- // useless tags
- m_handlerMap.insert(QLatin1String("description"), &QtXmlToSphinx::handleUselessTag);
- m_handlerMap.insert(QLatin1String("definition"), &QtXmlToSphinx::handleUselessTag);
- m_handlerMap.insert(QLatin1String("printuntil"), &QtXmlToSphinx::handleUselessTag);
- m_handlerMap.insert(QLatin1String("relation"), &QtXmlToSphinx::handleUselessTag);
-
- // Doxygen tags
- m_handlerMap.insert(QLatin1String("title"), &QtXmlToSphinx::handleHeadingTag);
- m_handlerMap.insert(QLatin1String("ref"), &QtXmlToSphinx::handleParaTag);
- m_handlerMap.insert(QLatin1String("computeroutput"), &QtXmlToSphinx::handleParaTag);
- m_handlerMap.insert(QLatin1String("detaileddescription"), &QtXmlToSphinx::handleParaTag);
- m_handlerMap.insert(QLatin1String("name"), &QtXmlToSphinx::handleParaTag);
- m_handlerMap.insert(QLatin1String("listitem"), &QtXmlToSphinx::handleItemTag);
- m_handlerMap.insert(QLatin1String("parametername"), &QtXmlToSphinx::handleItemTag);
- m_handlerMap.insert(QLatin1String("parameteritem"), &QtXmlToSphinx::handleItemTag);
- m_handlerMap.insert(QLatin1String("ulink"), &QtXmlToSphinx::handleLinkTag);
- m_handlerMap.insert(QLatin1String("itemizedlist"), &QtXmlToSphinx::handleListTag);
- m_handlerMap.insert(QLatin1String("parameternamelist"), &QtXmlToSphinx::handleListTag);
- m_handlerMap.insert(QLatin1String("parameterlist"), &QtXmlToSphinx::handleListTag);
-
- // Doxygen ignored tags
- m_handlerMap.insert(QLatin1String("highlight"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("linebreak"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("programlisting"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("xreftitle"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("sp"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("entry"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("simplesect"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("verbatim"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("xrefsect"), &QtXmlToSphinx::handleIgnoredTag);
- m_handlerMap.insert(QLatin1String("xrefdescription"), &QtXmlToSphinx::handleIgnoredTag);
-
m_result = transform(doc);
}
QtXmlToSphinx::~QtXmlToSphinx() = default;
+void QtXmlToSphinx::callHandler(WebXmlTag t, QXmlStreamReader &r)
+{
+ switch (t) {
+ case WebXmlTag::heading:
+ handleHeadingTag(r);
+ break;
+ case WebXmlTag::brief:
+ case WebXmlTag::para:
+ handleParaTag(r);
+ break;
+ case WebXmlTag::italic:
+ handleItalicTag(r);
+ break;
+ case WebXmlTag::bold:
+ handleBoldTag(r);
+ break;
+ case WebXmlTag::see_also:
+ handleSeeAlsoTag(r);
+ break;
+ case WebXmlTag::snippet:
+ handleSnippetTag(r);
+ break;
+ case WebXmlTag::dots:
+ case WebXmlTag::codeline:
+ handleDotsTag(r);
+ break;
+ case WebXmlTag::table:
+ handleTableTag(r);
+ break;
+ case WebXmlTag::header:
+ handleRowTag(r);
+ break;
+ case WebXmlTag::row:
+ handleRowTag(r);
+ break;
+ case WebXmlTag::item:
+ handleItemTag(r);
+ break;
+ case WebXmlTag::argument:
+ handleArgumentTag(r);
+ break;
+ case WebXmlTag::teletype:
+ handleArgumentTag(r);
+ break;
+ case WebXmlTag::link:
+ handleLinkTag(r);
+ break;
+ case WebXmlTag::inlineimage:
+ handleInlineImageTag(r);
+ break;
+ case WebXmlTag::image:
+ handleImageTag(r);
+ break;
+ case WebXmlTag::list:
+ handleListTag(r);
+ break;
+ case WebXmlTag::term:
+ handleTermTag(r);
+ break;
+ case WebXmlTag::raw:
+ handleRawTag(r);
+ break;
+ case WebXmlTag::underline:
+ handleItalicTag(r);
+ break;
+ case WebXmlTag::superscript:
+ handleSuperScriptTag(r);
+ break;
+ case WebXmlTag::code:
+ case WebXmlTag::badcode:
+ case WebXmlTag::legalese:
+ handleCodeTag(r);
+ break;
+ case WebXmlTag::rst:
+ handleRstPassTroughTag(r);
+ break;
+ case WebXmlTag::section:
+ handleAnchorTag(r);
+ break;
+ case WebXmlTag::quotefile:
+ handleQuoteFileTag(r);
+ break;
+ case WebXmlTag::generatedlist:
+ case WebXmlTag::tableofcontents:
+ case WebXmlTag::quotefromfile:
+ case WebXmlTag::skipto:
+ handleIgnoredTag(r);
+ break;
+ case WebXmlTag::target:
+ handleTargetTag(r);
+ break;
+ case WebXmlTag::page:
+ case WebXmlTag::group:
+ handlePageTag(r);
+ break;
+ case WebXmlTag::description:
+ case WebXmlTag::definition:
+ case WebXmlTag::printuntil:
+ case WebXmlTag::relation:
+ handleUselessTag(r);
+ break;
+ case WebXmlTag::title:
+ handleHeadingTag(r);
+ break;
+ case WebXmlTag::ref:
+ case WebXmlTag::computeroutput:
+ case WebXmlTag::detaileddescription:
+ case WebXmlTag::name:
+ handleParaTag(r);
+ break;
+ case WebXmlTag::listitem:
+ case WebXmlTag::parametername:
+ case WebXmlTag::parameteritem:
+ handleItemTag(r);
+ break;
+ case WebXmlTag::ulink:
+ handleLinkTag(r);
+ break;
+ case WebXmlTag::itemizedlist:
+ case WebXmlTag::parameternamelist:
+ case WebXmlTag::parameterlist:
+ handleListTag(r);
+ break;
+ case WebXmlTag::highlight:
+ case WebXmlTag::linebreak:
+ case WebXmlTag::programlisting:
+ case WebXmlTag::xreftitle:
+ case WebXmlTag::sp:
+ case WebXmlTag::entry:
+ case WebXmlTag::simplesect:
+ case WebXmlTag::verbatim:
+ case WebXmlTag::xrefsect:
+ case WebXmlTag::xrefdescription:
+ handleIgnoredTag(r);
+ break;
+ case WebXmlTag::Unknown:
+ break;
+ }
+}
+
void QtXmlToSphinx::pushOutputBuffer()
{
auto *buffer = new QString();
@@ -299,19 +458,17 @@ QString QtXmlToSphinx::transform(const QString& doc)
}
if (token == QXmlStreamReader::StartElement) {
- const auto tagName = reader.name();
- TagHandler handler = m_handlerMap.value(tagName.toString(), &QtXmlToSphinx::handleUnknownTag);
- if (!m_handlers.isEmpty() && ( (m_handlers.top() == &QtXmlToSphinx::handleIgnoredTag) ||
- (m_handlers.top() == &QtXmlToSphinx::handleRawTag)) )
- handler = &QtXmlToSphinx::handleIgnoredTag;
-
- m_handlers.push(handler);
+ WebXmlTag tag = webXmlTagHash().value(reader.name(), WebXmlTag::Unknown);
+ if (!m_tagStack.isEmpty() && tag == WebXmlTag::raw)
+ tag = WebXmlTag::Unknown;
+ m_tagStack.push(tag);
}
- if (!m_handlers.isEmpty())
- (this->*(m_handlers.top()))(reader);
+
+ if (!m_tagStack.isEmpty())
+ callHandler(m_tagStack.top(), reader);
if (token == QXmlStreamReader::EndElement) {
- m_handlers.pop();
+ m_tagStack.pop();
m_lastTagName = reader.name().toString();
}
}