diff options
author | Anton Kudryavtsev <anton.kudryavtsev@vk.team> | 2024-03-06 15:24:56 +0300 |
---|---|---|
committer | Anton Kudryavtsev <antkudr@mail.ru> | 2024-03-13 19:34:23 +0000 |
commit | e10c9b5c0f8f194a79ce12dcf9b6b5cb19976942 (patch) | |
tree | e124d156841e0ebabd27ecc276aeeeb1c33c67f1 /src/gui | |
parent | ed553b720de2da79b1fb3676e4a6a6edbdb38d99 (diff) |
QTextMarkdownImporter: use string view more
to reduce allocations. While touching code, reorder condition
and extract string literal to remove magic number
Change-Id: I3972097dc9b976438e9ba0029f674cea2614f966
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/text/qtextmarkdownimporter.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/gui/text/qtextmarkdownimporter.cpp b/src/gui/text/qtextmarkdownimporter.cpp index 511c0883a4..e7fcad67b5 100644 --- a/src/gui/text/qtextmarkdownimporter.cpp +++ b/src/gui/text/qtextmarkdownimporter.cpp @@ -27,6 +27,8 @@ Q_LOGGING_CATEGORY(lcMD, "qt.text.markdown") static const QChar qtmi_Newline = u'\n'; static const QChar qtmi_Space = u' '; +static constexpr auto markerString() noexcept { return "---"_L1; } + // TODO maybe eliminate the margins after all views recognize BlockQuoteLevel, CSS can format it, etc. static const int qtmi_BlockQuoteIndent = 40; // pixels, same as in QTextHtmlParserNode::initializeProperties @@ -139,24 +141,26 @@ void QTextMarkdownImporter::import(const QString &markdown) else m_monoFont.setPixelSize(defaultFont.pixelSize()); qCDebug(lcMD) << "default font" << defaultFont << "mono font" << m_monoFont; - QByteArray md = markdown.toUtf8(); - if (md.startsWith("---") && m_features.testFlag(QTextMarkdownImporter::FeatureFrontMatter)) { - qsizetype endMarkerPos = md.indexOf("---", 4); + QStringView md = markdown; + + if (m_features.testFlag(QTextMarkdownImporter::FeatureFrontMatter) && md.startsWith(markerString())) { + qsizetype endMarkerPos = md.indexOf(markerString(), markerString().size() + 1); if (endMarkerPos > 4) { qsizetype firstLinePos = 4; // first line of yaml - while (md.at(firstLinePos) == '\n' || md.at(firstLinePos) == '\r') + while (md.at(firstLinePos) == '\n'_L1 || md.at(firstLinePos) == '\r'_L1) ++firstLinePos; - QByteArray frontMatter = md.sliced(firstLinePos, endMarkerPos - firstLinePos); + auto frontMatter = md.sliced(firstLinePos, endMarkerPos - firstLinePos); firstLinePos = endMarkerPos + 4; // first line of markdown after yaml - while (md.size() > firstLinePos && (md.at(firstLinePos) == '\n' || md.at(firstLinePos) == '\r')) + while (md.size() > firstLinePos && (md.at(firstLinePos) == '\n'_L1 || md.at(firstLinePos) == '\r'_L1)) ++firstLinePos; - md.remove(0, firstLinePos); - doc->setMetaInformation(QTextDocument::FrontMatter, QString::fromUtf8(frontMatter)); + md = md.sliced(firstLinePos); + doc->setMetaInformation(QTextDocument::FrontMatter, frontMatter.toString()); qCDebug(lcMD) << "extracted FrontMatter: size" << frontMatter.size(); } } + const auto mdUtf8 = md.toUtf8(); m_cursor.beginEditBlock(); - md_parse(md.constData(), MD_SIZE(md.size()), &callbacks, this); + md_parse(mdUtf8.constData(), MD_SIZE(mdUtf8.size()), &callbacks, this); m_cursor.endEditBlock(); } |