diff --git a/gui/chatblockmodel.cpp b/gui/chatblockmodel.cpp index b71eb67..9d70f47 100644 --- a/gui/chatblockmodel.cpp +++ b/gui/chatblockmodel.cpp @@ -193,18 +193,35 @@ QString ChatBlockModel::highlightCode(const QString &code, const QString &langua QString ChatBlockModel::renderMarkdown(const QString &markdown) const { + // Pre-process: render blocks as styled boxes. + static const QRegularExpression interruptionRe( + R"(\n([\s\S]*?)\n)"); + QString processed = markdown; + processed.replace(interruptionRe, [](const QString &match) -> QString { + // Extract content between the tags (after opening "\n" + // and before trailing "\n"). + const int start = QStringLiteral("\n").size(); + const int end = match.size() - QStringLiteral("\n").size(); + const QString content = match.mid(start, end - start).toHtmlEscaped(); + return QStringLiteral( + "
" + "\u26A0\uFE0F User interruption\n") + content + + QStringLiteral("
"); + }); + static const QRegularExpression fenceRe( R"(```([A-Za-z0-9_+.-]*)[^\n]*\n([\s\S]*?)\n```(\n|$))"); QString result; int cursor = 0; - auto it = fenceRe.globalMatch(markdown); + auto it = fenceRe.globalMatch(processed); while (it.hasNext()) { const auto match = it.next(); // Prose before this fence: HTML-escape and wrap in pre-wrap div to // preserve newlines and whitespace. QTextDocument::setMarkdown would // collapse single newlines (standard Markdown behavior). - const QString prose = markdown.mid(cursor, match.capturedStart() - cursor); + const QString prose = processed.mid(cursor, match.capturedStart() - cursor); if (!prose.isEmpty()) result += QStringLiteral("
") + prose.toHtmlEscaped() + QStringLiteral("
"); @@ -218,7 +235,7 @@ QString ChatBlockModel::renderMarkdown(const QString &markdown) const static const QRegularExpression openFenceRe( R"(^```([A-Za-z0-9_+.-]*)[^\n]*\n([\s\S]*)$)", QRegularExpression::MultilineOption); - const auto tail = markdown.mid(cursor); + const auto tail = processed.mid(cursor); if (!tail.isEmpty()) { const auto open = openFenceRe.match(tail); if (open.hasMatch()) {