summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2021-10-14 07:53:36 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2021-10-16 16:10:49 +0200
commit362e56b520cd5f3efcc7600d558b515a8aec6a79 (patch)
treef3a79dec069a0a5cf3131572bd8d3bf85a2a52dc
parent848e3855f922e56a156ab8275f45cfb7a361acb5 (diff)
Markdown importer: keep entities in HTML blocks with the HTML
If an entity occurs directly in markdown, we parse and insert it directly; but if it occurs in an HTML block, it has to be added to the HTML accumulator string for deferred parsing when the HTML block ends. Pick-to: 6.2 Fixes: QTBUG-91222 Fixes: QTBUG-94245 Change-Id: I0cf586d68d6751892ca035a98f77cd67950d3bc4 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r--src/gui/text/qtextmarkdownimporter.cpp5
-rw-r--r--tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp66
2 files changed, 70 insertions, 1 deletions
diff --git a/src/gui/text/qtextmarkdownimporter.cpp b/src/gui/text/qtextmarkdownimporter.cpp
index 75b5a324c8..35feb0b3b1 100644
--- a/src/gui/text/qtextmarkdownimporter.cpp
+++ b/src/gui/text/qtextmarkdownimporter.cpp
@@ -490,7 +490,10 @@ int QTextMarkdownImporter::cbText(int textType, const char *text, unsigned size)
break;
#if QT_CONFIG(texthtmlparser)
case MD_TEXT_ENTITY:
- m_cursor->insertHtml(s);
+ if (m_htmlTagDepth)
+ m_htmlAccumulator += s;
+ else
+ m_cursor->insertHtml(s);
s = QString();
break;
#endif
diff --git a/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp b/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp
index 5a8df45d99..9b376c41f4 100644
--- a/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp
+++ b/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp
@@ -62,6 +62,8 @@ private slots:
void nestedSpans();
void avoidBlankLineAtBeginning_data();
void avoidBlankLineAtBeginning();
+ void fragmentsAndProperties_data();
+ void fragmentsAndProperties();
void pathological_data();
void pathological();
@@ -378,6 +380,70 @@ void tst_QTextMarkdownImporter::avoidBlankLineAtBeginning() // QTBUG-81060
QCOMPARE(i, expectedNumberOfParagraphs);
}
+void tst_QTextMarkdownImporter::fragmentsAndProperties_data()
+{
+ QTest::addColumn<QString>("input");
+ QTest::addColumn<int>("fragmentToCheck");
+ QTest::addColumn<QString>("expectedText");
+ QTest::addColumn<QTextFormat::Property>("propertyToCheck");
+ QTest::addColumn<QVariant>("expectedPropertyValue");
+ QTest::addColumn<int>("expectedNumberOfBlocks");
+ QTest::addColumn<int>("expectedNumberOfFragments");
+
+ QTest::newRow("entitiesInHtmlFontBlock") // QTBUG-94245
+ << QString("<font color='red'>&lt;123 test&gt;</font>&nbsp;test")
+ << 0 << "<123 test>" << QTextFormat::ForegroundBrush << QVariant(QBrush(QColor("red")))
+ << 1 << 2;
+ QTest::newRow("entitiesInHtmlBoldBlock") // QTBUG-91222
+ << QString("<b>x&amp;lt;</b>")
+ << 0 << "x&lt;" << QTextFormat::FontWeight << QVariant(700)
+ << 1 << 1;
+}
+
+void tst_QTextMarkdownImporter::fragmentsAndProperties()
+{
+ QFETCH(QString, input);
+ QFETCH(int, fragmentToCheck);
+ QFETCH(QString, expectedText);
+ QFETCH(QTextFormat::Property, propertyToCheck);
+ QFETCH(QVariant, expectedPropertyValue);
+ QFETCH(int, expectedNumberOfBlocks);
+ QFETCH(int, expectedNumberOfFragments);
+
+ QTextDocument doc;
+ QTextMarkdownImporter(QTextMarkdownImporter::DialectGitHub).import(&doc, input);
+#ifdef DEBUG_WRITE_HTML
+ {
+ QFile out("/tmp/" + QLatin1String(QTest::currentDataTag()) + ".html");
+ out.open(QFile::WriteOnly);
+ out.write(doc.toHtml().toLatin1());
+ out.close();
+ }
+#endif
+ QTextFrame::iterator blockIter = doc.rootFrame()->begin();
+ int blockCount = 0;
+ int fragCount = 0;
+ while (!blockIter.atEnd()) {
+ QTextBlock block = blockIter.currentBlock();
+ auto fragIter = block.begin();
+ while (!fragIter.atEnd()) {
+ auto frag = fragIter.fragment();
+ qCDebug(lcTests) << "fragment" << fragCount << ':' << frag.text() << Qt::hex << frag.charFormat().properties();
+ if (fragCount == fragmentToCheck) {
+ QVariant prop = frag.charFormat().property(propertyToCheck);
+ QCOMPARE(prop, expectedPropertyValue);
+ QCOMPARE(frag.text(), expectedText);
+ }
+ ++fragIter;
+ ++fragCount;
+ }
+ ++blockIter;
+ ++blockCount;
+ }
+ QCOMPARE(blockCount, expectedNumberOfBlocks);
+ QCOMPARE(fragCount, expectedNumberOfFragments);
+}
+
void tst_QTextMarkdownImporter::pathological_data()
{
QTest::addColumn<QString>("warning");