Блоки кода: отдельный компонент CodeBlock + MarkdownView (Telegram-пузырь)

- CodeBlock.qml: отдельный Rectangle #2e4d6a radius 12, header с языком и кнопкой 📋 Копировать (hover rgba 0.22/active 0.30, border, radius 11), код в rgba(0,0,0,0.22) radius 8, JetBrains Mono 13/tab 4, syntax highlight тёмной темой, selectByMouse
- MarkdownView.qml: ScrollView+Column+Repeater, parseBlocks() разбивает markdown на html/code блоки, html через Text RichText, code через CodeBlock, copyRequested → mdParser.copyToClipboard
- MdParser: parseBlocks() regex ```lang\n.*?\n``` + render для html частей, codeId/highlighted, highlightedCode(), highlight(...,true) forceDark, QTime удалён, QRegularExpression добавлен
- EditorPanel: viewArea/livePreview теперь MarkdownView (markdown property), liveDebounce/markdown, onLinkActivated → handleLink, viewMode переключает markdown
- CMake: добавлены CodeBlock.qml/MarkdownView.qml в qml модуль
- Исправлены qmllint: rgba → Qt.rgba, lineHeight убран, model.type → required property
This commit is contained in:
2026-09-01 21:07:55 +03:00
parent 79b76c8c42
commit ed7dc4e033
6 changed files with 338 additions and 47 deletions
+8
View File
@@ -2,6 +2,7 @@
#include <QObject>
#include <QString>
#include <QVariantList>
// Рендер Markdown (CommonMark + GFM) в HTML для режима просмотра.
// Задачи/ссылки/переходы кодируются ссылками schemes:
@@ -21,8 +22,15 @@ public:
const QString &vaultRoot,
const QString &fileDir);
// Разбор на блоки для отдельного отображения кодовых блоков (CodeBlock.qml)
// Возвращает список {type:"html"/"code", html/code/language/codeId/highlighted}
Q_INVOKABLE QVariantList parseBlocks(const QString &markdown,
const QString &vaultRoot,
const QString &fileDir);
Q_INVOKABLE QString getCodeBlock(const QString &id) const;
Q_INVOKABLE void copyToClipboard(const QString &text) const;
Q_INVOKABLE QString highlightedCode(const QString &code, const QString &language) const;
struct Impl;
private: