From e304f503e5bdebc1902a0a7c5a5f2c4495e0f947 Mon Sep 17 00:00:00 2001 From: grendervill Date: Mon, 7 Sep 2026 17:20:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=83=D0=B7=D1=8B=D1=80=D1=8C=20~sql=20?= =?UTF-8?q?=D0=BA=D0=B0=D0=BA=20=D1=83=20=D0=BA=D0=BE=D0=B4=D0=B0:=20?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=BD=D0=B5=D0=B2=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B4=D0=BD=D0=BE=D0=B3=D0=BE=20CSS,=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B8=D1=82=D0=B5=D0=BB=D0=B8=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Удалены max-width:88%%/box-shadow: невалидный %% гасил весь style в Qt rich text (пузырь не красился); заодно в кодоблоке - Таблица без width=100% (вылезала за панель), td вместо th (чёрная плашка заголовка), border-top разделители, zero-width space в путях для переносов --- src/markdown/MdParser.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/markdown/MdParser.cpp b/src/markdown/MdParser.cpp index d9e281b..8645c27 100644 --- a/src/markdown/MdParser.cpp +++ b/src/markdown/MdParser.cpp @@ -459,6 +459,16 @@ QString vaultFileForCell(Database *db, const QString &cell) return QString(); } +// Путь для показа: вставляем zero-width space после '/' — движок rich text +// умеет переносить только по пробелам, длинные пути иначе рвут пузырь. +// На href/копирование не влияет (только отображаемый текст). +QString breakablePath(const QString &cell) +{ + QString d = esc(cell); + d.replace(QLatin1Char('/'), QStringLiteral("/\u200b")); + return d; +} + // ~sql-блок → результат в пузыре кодоблока (как в Telegram). // Имена файлов — ссылки flora://open (новая вкладка), пути — flora://copycode // (клик копирует путь). codeId — кнопка «скопировать запрос». @@ -488,10 +498,13 @@ QString renderSqlBlock(Database *db, MdParser::Impl *impl, const QString &sql, c const QVariantList rows = res.value("rows").toList(); const bool truncated = res.value("truncated").toBool(); const int colCount = cols.size(); - inner = QStringLiteral(""); + // th не используем: Qt рисует заголовкам свою чёрную плашку поверх стилей. + // width=100% тоже нельзя: такая таблица в Qt игнорирует padding'и + // родительских div'ов и вылезает за панель. + inner = QStringLiteral("
"); inner += QStringLiteral(""); for (int c = 0; c < colCount; ++c) { - inner += QStringLiteral("") + inner += QStringLiteral("") .arg(esc(cols[c])); } inner += QStringLiteral(""); @@ -508,7 +521,7 @@ QString renderSqlBlock(Database *db, MdParser::Impl *impl, const QString &sql, c inner += QStringLiteral(""); for (int c = 0; c < colCount; ++c) { const QString cell = c < row.size() ? row[c].toString() : QString(); - const QString cs = QStringLiteral("padding:6px 10px;text-align:left;color:#ffffff;border-top:1px solid rgba(255,255,255,0.12);word-break:break-word"); + const QString cs = QStringLiteral("padding:8px 12px;text-align:left;color:#ffffff;border-top:1px solid rgba(255,255,255,0.12)"); QString body; if (cell == QLatin1String("NULL")) { body = QStringLiteral("NULL"); @@ -521,9 +534,9 @@ QString renderSqlBlock(Database *db, MdParser::Impl *impl, const QString &sql, c impl->codeBlocks.insert(pid, abs); } body = pid.isEmpty() - ? esc(cell) + ? breakablePath(cell) : QStringLiteral("%2") - .arg(pid, esc(cell)); + .arg(pid, breakablePath(cell)); } else if (c < cols.size() && cols[c].trimmed().compare(QLatin1String("title"), Qt::CaseInsensitive) == 0) { // Имя: клик открывает файл в соседней вкладке @@ -550,7 +563,7 @@ QString renderSqlBlock(Database *db, MdParser::Impl *impl, const QString &sql, c QString out = QStringLiteral( "" - "
" + "
" "
%2
" "
%3
") .arg(bubbleBg, copyLink, inner); @@ -808,7 +821,7 @@ private: return QStringLiteral( "" - "
" + "
" "
%2
" "
" "
"
%1%1