diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2022-05-16 13:32:44 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2022-05-20 23:45:36 +0200 |
commit | 567340e1222d6be354b17ec66bf5f23066d4fa82 (patch) | |
tree | 5f5ff48e3b06c23ad3b47ce05174d5170a94d374 | |
parent | c140c37676fd55ed98eff360b1d11ac3e0d45c0b (diff) |
Avoid ending Markdown fenced code blocks with gratuitous blank lines6.3
This caused unnecessary empty <pre> blocks when converting markdown to
HTML, made code blocks too large using QSyntaxHighlighter to highlight
the whole block, and caused assymmetry when rewriting markdown.
Also remove redundant qCDebug in QTextMarkdownImporter::cbText().
Fixes: QTBUG-101031
Change-Id: I08016577ccb92edb4afae31d7df3259cb011d5c8
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
(cherry picked from commit ff153d9874f728c9ec3ab40b87f55ccf0239e538)
5 files changed, 16 insertions, 10 deletions
diff --git a/src/gui/text/qtextmarkdownimporter.cpp b/src/gui/text/qtextmarkdownimporter.cpp index 0d672658fc..806ecb8eda 100644 --- a/src/gui/text/qtextmarkdownimporter.cpp +++ b/src/gui/text/qtextmarkdownimporter.cpp @@ -532,6 +532,14 @@ int QTextMarkdownImporter::cbText(int textType, const char *text, unsigned size) case MD_BLOCK_TD: m_nonEmptyTableCells.append(m_tableCol); break; + case MD_BLOCK_CODE: + if (s == Newline) { + // defer a blank line until we see something else in the code block, + // to avoid ending every code block with a gratuitous blank line + m_needsInsertBlock = true; + s = QString(); + } + break; default: break; } @@ -569,8 +577,6 @@ int QTextMarkdownImporter::cbText(int textType, const char *text, unsigned size) << "bindent" << bfmt.indent() << "tindent" << bfmt.textIndent() << "margins" << bfmt.leftMargin() << bfmt.topMargin() << bfmt.bottomMargin() << bfmt.rightMargin(); } - qCDebug(lcMD) << textType << "in block" << m_blockType << s << "in list?" << m_cursor->currentList() - << "indent" << m_cursor->blockFormat().indent(); return 0; // no error } diff --git a/src/gui/text/qtextmarkdownwriter.cpp b/src/gui/text/qtextmarkdownwriter.cpp index bd5f3bde95..4009b77d88 100644 --- a/src/gui/text/qtextmarkdownwriter.cpp +++ b/src/gui/text/qtextmarkdownwriter.cpp @@ -190,11 +190,11 @@ void QTextMarkdownWriter::writeFrame(const QTextFrame *frame) for (int col = cell.column(); col < spanEndCol; ++col) m_stream << "|"; } else if (m_fencedCodeBlock && ending) { - m_stream << m_linePrefix << QString(m_wrappedLineIndent, Space) + m_stream << Newline << m_linePrefix << QString(m_wrappedLineIndent, Space) << m_codeBlockFence << Newline << Newline; m_codeBlockFence.clear(); } else if (m_indentedCodeBlock && nextIsDifferent) { - m_stream << Newline; + m_stream << Newline << Newline; } else if (endingCol > 0) { if (block.textList() || block.blockFormat().hasProperty(QTextFormat::BlockCodeLanguage)) { m_stream << Newline; diff --git a/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp b/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp index 9eacabfda3..c4e7db004b 100644 --- a/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp +++ b/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp @@ -405,7 +405,7 @@ void tst_QTextMarkdownImporter::avoidBlankLineAtBeginning_data() QTest::newRow("Text block") << QString("Markdown text") << 1; QTest::newRow("Headline") << QString("Markdown text\n============") << 1; - QTest::newRow("Code block") << QString(" Markdown text") << 2; + QTest::newRow("Code block") << QString(" Markdown text") << 1; QTest::newRow("Unordered list") << QString("* Markdown text") << 1; QTest::newRow("Ordered list") << QString("1. Markdown text") << 1; QTest::newRow("Blockquote") << QString("> Markdown text") << 1; @@ -526,18 +526,17 @@ void tst_QTextMarkdownImporter::fencedCodeBlocks_data() QTest::addColumn<QString>("expectedFenceChar"); QTest::addColumn<QString>("rewrite"); - // TODO shouldn't add empty blocks: QTBUG-101031 QTest::newRow("backtick fence with language") << "```pseudocode\nprint('hello world\\n')\n```\n" - << 2 << 0 << "pseudocode" << "`" + << 1 << 0 << "pseudocode" << "`" << "```pseudocode\nprint('hello world\\n')\n```\n\n"; QTest::newRow("tilde fence with language") << "~~~pseudocode\nprint('hello world\\n')\n~~~\n" - << 2 << 0 << "pseudocode" << "~" + << 1 << 0 << "pseudocode" << "~" << "~~~pseudocode\nprint('hello world\\n')\n~~~\n\n"; QTest::newRow("embedded backticks") << "```\nnone `one` ``two``\n```\nplain\n```\n```three``` ````four````\n```\nplain\n" - << 4 << 2 << QString() << "`" + << 2 << 2 << QString() << "`" << "```\nnone `one` ``two``\n```\nplain\n\n```\n```three``` ````four````\n```\nplain\n\n"; } diff --git a/tests/auto/gui/text/qtextmarkdownwriter/data/blockquotes.md b/tests/auto/gui/text/qtextmarkdownwriter/data/blockquotes.md index 702ccef134..b29b53651b 100644 --- a/tests/auto/gui/text/qtextmarkdownwriter/data/blockquotes.md +++ b/tests/auto/gui/text/qtextmarkdownwriter/data/blockquotes.md @@ -50,6 +50,7 @@ Now let's have an indented code block: } and end with a fenced code block: + ~~~pseudocode #include <something.h> #include <else.h> diff --git a/tests/auto/gui/text/qtextmarkdownwriter/tst_qtextmarkdownwriter.cpp b/tests/auto/gui/text/qtextmarkdownwriter/tst_qtextmarkdownwriter.cpp index 9e6e4ab4b4..b7fddad4fa 100644 --- a/tests/auto/gui/text/qtextmarkdownwriter/tst_qtextmarkdownwriter.cpp +++ b/tests/auto/gui/text/qtextmarkdownwriter/tst_qtextmarkdownwriter.cpp @@ -519,7 +519,7 @@ void tst_QTextMarkdownWriter::fromHtml_data() "\n\n"; QTest::newRow("code") << "<pre class=\"language-pseudocode\">\n#include \"foo.h\"\n\nblock {\n statement();\n}\n\n</pre>" << - "```pseudocode\n#include \"foo.h\"\n\nblock {\n statement();\n}\n```\n\n"; + "```pseudocode\n#include \"foo.h\"\n\nblock {\n statement();\n}\n\n```\n\n"; // TODO // QTest::newRow("escaped number and paren after double newline") << // "<p>(The first sentence of this paragraph is a line, the next paragraph has a number</p>13) but that's not part of an ordered list" << |