#pragma once #include #include #include // Рендер Markdown (CommonMark + GFM) в HTML для режима просмотра. // Задачи/ссылки/переходы кодируются ссылками schemes: // flora://task/N — переключить задачу на строке N (1-based) // flora://open/ — открыть файл хранилища // flora://wiki/ — вики-ссылка без найденного файла class MdParser : public QObject { Q_OBJECT public: explicit MdParser(QObject *parent = nullptr); ~MdParser() override; // markdown → HTML. vaultRoot/vaultDir — для разрешения относительных путей. Q_INVOKABLE QString render(const QString &markdown, 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); // Те же блоки, но версия oldMd с подсветкой отличий от newMd (для «Истории»). // Каждый блок дополнительно имеет change:"same"/"del"/"add" (del — только в old, // add — только в new); изменённые блоки обёрнуты в цветной div прямо в html/highlighted. Q_INVOKABLE QVariantList parseBlocksWithDiff(const QString &oldMd, const QString &newMd, 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: Impl *m = nullptr; };