// Тест MdParser (Фаза 6): рендер Markdown → HTML // (заголовки, жирный/курсив/зачёркнутый, таблицы, ссылки, картинки, // задачи с переключаемыми ссылками, подсветка кода, вики-ссылки). #include #include #include #include #include #include "markdown/MdParser.h" static int fail(const char *msg, const QString &detail = QString()) { std::fprintf(stderr, "FAIL: %s | %s\n", msg, qPrintable(detail)); return 1; } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QTemporaryDir dir; if (!dir.isValid()) return fail("temp dir"); const QString vault = dir.path(); QDir(vault).mkpath("sub"); { QFile f(vault + "/sub/b.md"); f.open(QIODevice::WriteOnly); f.write("b"); f.close(); QFile g(vault + "/sub/pic.png"); g.open(QIODevice::WriteOnly); g.write("\x89PNG fake"); g.close(); } MdParser p; const QString fileDir = vault + "/sub"; auto probe = [](const QString &html, const char *sub) { return html.contains(QString::fromUtf8(sub)); }; // Заголовок QString h = p.render("# Заголовок\n", vault, fileDir); if (!probe(h, "

Заголовок

")) return fail("заголовок", h); // Жирный / курсив / зачёркнутый QString f = p.render("**ж** *к* ~~з~~\n", vault, fileDir); if (!probe(f, "ж") || !probe(f, "к") || !probe(f, "з")) return fail("инлайн-разметка", f); // Таблица GFM QString t = p.render("| A | B |\n|---|---|\n| 1 | 2 |\n", vault, fileDir); if (!probe(t, "б")) return fail("ссылка", lk); // Вики-ссылка [[b]] QString wk = p.render("[[b]]\n", vault, fileDir); if (!probe(wk, "flora://open/") || !probe(wk, ">b")) return fail("вики-ссылка", wk); // Подсветка кода python (должны появиться цветные span'ы) QString c = p.render("```python\nprint(\"hi\")\n```\n", vault, fileDir); if (!probe(c, "language-Python") || !probe(c, "style=\"color:")) return fail("подсветка кода", c); // Простой код без языка — не должен падать p.render("```\nпросто\n```\n", vault, fileDir); // Язык «С++» из кириллицы должен мапиться на C++ (подсветка сработает) QString cpp = p.render("```С++\nint x = 1;\n```\n", vault, fileDir); if (!probe(cpp, "language-C++")) return fail("алиас С++", cpp); // Экранирование HTML — опасные теги должны экранироваться QString e = p.render("\n", vault, fileDir); if (probe(e, "