История: diff внутри того же блока кода + насыщенные цвета

- parseBlocksWithDiff: пара del/add кодовых блоков сливается в ОДИН блок (change=mod) с построчным LCS-diff внутри: удалённые строки — розовая подложка rgba(244,63,94,.45) с −, добавленные — зелёная rgba(34,197,94,.45) с +, неизменные — как были; копируется новое содержимое; fallback — два блока
- Цвета насыщеннее: html тинты #ffd6dd/#b7f5c6 (были бледные), текстовый diff тоже, легенда в тон; на тёмном пузыре светлый текст читается
- Тесты: merge в один блок, маркеры, цвета, copy-нового
This commit is contained in:
2026-09-06 20:18:05 +03:00
parent beb1eb2956
commit e292f6586e
5 changed files with 119 additions and 17 deletions
+28 -6
View File
@@ -155,13 +155,13 @@ int main(int argc, char *argv[])
if (changeOf(0) != "same") return fail("diff[0] должен быть same", changeOf(0));
if (d[0].toMap().value("type").toString() != "html") return fail("diff[0] тип");
if (changeOf(1) != "del") return fail("diff[1] должен быть del", changeOf(1));
if (!d[1].toMap().value("html").toString().contains("ffebe9")) return fail("diff[1] без красной подсветки");
if (!d[1].toMap().value("html").toString().contains("ffd6dd")) return fail("diff[1] без розовой подсветки");
if (changeOf(2) != "del" || d[2].toMap().value("type").toString() != "code")
return fail("diff[2] код del", changeOf(2));
if (!d[2].toMap().value("highlightedText").toString().contains("ffebe9"))
return fail("diff[2] код без красной подсветки");
if (!d[2].toMap().value("highlightedText").toString().contains("244,63,94"))
return fail("diff[2] код без розовой подсветки");
if (changeOf(3) != "add") return fail("diff[3] должен быть add", changeOf(3));
if (!d[3].toMap().value("html").toString().contains("e6ffec")) return fail("diff[3] без зелёной подсветки");
if (!d[3].toMap().value("html").toString().contains("b7f5c6")) return fail("diff[3] без зелёной подсветки");
if (changeOf(4) != "add" || d[4].toMap().value("type").toString() != "code")
return fail("diff[4] код add", changeOf(4));
// кодовые блоки сохранили id для копирования
@@ -177,12 +177,34 @@ int main(int argc, char *argv[])
for (const auto &v : d) {
if (v.toMap().value("change").toString() != "same")
return fail("identical должен быть same");
if (v.toMap().value("html").toString().contains("ffebe9")
|| v.toMap().value("html").toString().contains("e6ffec"))
if (v.toMap().value("html").toString().contains("ffd6dd")
|| v.toMap().value("html").toString().contains("b7f5c6"))
return fail("identical с подсветкой");
}
}
// parseBlocksWithDiff: правка внутри кода — ОДИН блок с построчным diff внутри
{
const QString oldMd = "# T\n\n```cpp\nint a = 1;\nint b = 2;\n```\n";
const QString newMd = "# T\n\n```cpp\nint a = 1;\nint b = 3;\n```\n";
auto d = p.parseBlocksWithDiff(oldMd, newMd, vault, fileDir);
if (d.size() != 2) return fail("merge размер", QString::number(d.size()));
if (d[0].toMap().value("change").toString() != "same") return fail("merge[0] same");
if (d[1].toMap().value("type").toString() != "code"
|| d[1].toMap().value("change").toString() != "mod")
return fail("merge[1] должен быть code/mod", d[1].toMap().value("change").toString());
const QString hl = d[1].toMap().value("highlightedText").toString();
if (!hl.contains("244,63,94")) return fail("merge без розовой строки");
if (!hl.contains("34,197,94")) return fail("merge без зелёной строки");
// маркеры −/+ у изменённых строк (текст режется спанами подсветки, ищем маркеры)
if (!hl.contains(QChar(0x2212))) return fail("merge без маркера −");
if (!hl.contains("+ </span>")) return fail("merge без маркера +");
// копируется новое содержимое
const QString cid = d[1].toMap().value("codeId").toString();
if (cid.isEmpty()) return fail("merge codeId пуст");
if (!p.getCodeBlock(cid).contains("int b = 3;")) return fail("merge copy даёт не новое", p.getCodeBlock(cid));
}
std::printf("MDPARSER TEST OK\n");
return 0;
}