История: diff прямо в Просмотре версии + код не в одну строку

- Подсветка: highlight() отдаёт <br/> вместо сырых \n (RichText их схлопывал — код был одной строкой); plainToRich для fallback-путей
- MdParser.parseBlocksWithDiff(old,new): поблочный LCS-diff с fence-aware разбивкой, change same/del/add, изменённые блоки в цветном div (красный/зелёный как в diff), codeId для копирования сохранены
- MarkdownView.compareMarkdown: при задании рендерит версию с подсветкой отличий
- История: Просмотр версии сравнивается со свежим содержимым с диска (workdirContent), легенда на обеих вкладках
- Тесты: <br/>, порядок del/add, тинты, identical без подсветки
This commit is contained in:
2026-09-06 19:26:53 +03:00
parent 3d04ac0095
commit beb1eb2956
7 changed files with 307 additions and 12 deletions
+7 -1
View File
@@ -9,6 +9,9 @@ Item {
property string vaultRoot: ""
property string fileDir: ""
property string emptyText: qsTr("Пустой файл — начните писать в режиме редактирования")
// Если задан — markdown считается старой версией и подсвечиваются отличия от него
// (блоки del — только в markdown, add — только в compareMarkdown)
property string compareMarkdown: ""
implicitHeight: column.implicitHeight + 24
signal linkActivated(string href)
@@ -17,7 +20,9 @@ Item {
function update() {
// Триггерим пересборку блоков
blocksModel.clear()
const blocks = mdParser.parseBlocks(markdown, vaultRoot, fileDir)
const blocks = compareMarkdown.length > 0
? mdParser.parseBlocksWithDiff(markdown, compareMarkdown, vaultRoot, fileDir)
: mdParser.parseBlocks(markdown, vaultRoot, fileDir)
for (let i = 0; i < blocks.length; i++) {
blocksModel.append(blocks[i])
}
@@ -26,6 +31,7 @@ Item {
}
onMarkdownChanged: update()
onCompareMarkdownChanged: update()
onVaultRootChanged: update()
onFileDirChanged: update()