From 362e56b520cd5f3efcc7600d558b515a8aec6a79 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Thu, 14 Oct 2021 07:53:36 +0200 Subject: 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 --- .../tst_qtextmarkdownimporter.cpp | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'tests/auto') 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("input"); + QTest::addColumn("fragmentToCheck"); + QTest::addColumn("expectedText"); + QTest::addColumn("propertyToCheck"); + QTest::addColumn("expectedPropertyValue"); + QTest::addColumn("expectedNumberOfBlocks"); + QTest::addColumn("expectedNumberOfFragments"); + + QTest::newRow("entitiesInHtmlFontBlock") // QTBUG-94245 + << QString("<123 test> test") + << 0 << "<123 test>" << QTextFormat::ForegroundBrush << QVariant(QBrush(QColor("red"))) + << 1 << 2; + QTest::newRow("entitiesInHtmlBoldBlock") // QTBUG-91222 + << QString("x&lt;") + << 0 << "x<" << 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("warning"); -- cgit v1.2.3