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