From 1fdae741c3f9cb15b25ab82f3dc502d11f47f691 Mon Sep 17 00:00:00 2001 From: Levi Neely <141506390+lneely@users.noreply.github.com> Date: Mon, 3 Aug 2026 00:31:08 +0200 Subject: [PATCH] render system-user-interruption as a styled yellow box with warning icon --- gui/chatblockmodel.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) 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()) {