diff --git a/tools/chatgui/src/code_language.cpp b/tools/chatgui/src/code_language.cpp index 4a7a2eeeb..d0aa48232 100644 --- a/tools/chatgui/src/code_language.cpp +++ b/tools/chatgui/src/code_language.cpp @@ -66,7 +66,9 @@ QString detectCodeLanguage(QStringView source) { return language; } // Убираем строки и комментарии перед поиском конструкций, сохраняя границы строк. - static const QRegularExpression ignored(R"re(/\*[\s\S]*?(?:\*/|$)||$)|//[^\n]*|"(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*')re"); + static const QRegularExpression ignored( + R"re(/\*[\s\S]*?(?:\*/|$)||$)|//[^\n]*|"""[\s\S]*?(?:"""|$))re" + R"re(|`(?:\\[\s\S]|[^`\\])*(?:`|$)|"(?:\\.|[^"\\\n])*(?:"|$)|'(?:\\.|[^'\\\n])*(?:'|$))re"); QString code = sample; auto matches = ignored.globalMatch(sample); while (matches.hasNext()) { diff --git a/tools/chatgui/tests/test_code_language.cpp b/tools/chatgui/tests/test_code_language.cpp index 93d1d67da..825fd5d70 100644 --- a/tools/chatgui/tests/test_code_language.cpp +++ b/tools/chatgui/tests/test_code_language.cpp @@ -37,6 +37,9 @@ private slots: QTest::newRow("prose") << "Java and Kotlin have class and function declarations; use CSS for color." << ""; QTest::newRow("comments") << "/* fn main() { println!(\"hello\"); } */\n// std::vector x;" << ""; QTest::newRow("strings") << "\"std::vector\"\n'fun main() {}'" << ""; + QTest::newRow("template-string") << "const code = `std::vector\nfn main() {}`;" << ""; + QTest::newRow("multiline-string") << "\"\"\"\nfun main() {}\n\"\"\"" << ""; + QTest::newRow("incomplete-string") << "\"std::vector" << ""; QTest::newRow("json") << "{\"code\": \"fn main() {}\", \"color\": \"red\"}" << ""; QTest::newRow("conflicting") << "fn test() {}\nfun main() {}" << ""; QTest::newRow("repeated-weak") << QString("const value = 1;\n").repeated(200) << ""; @@ -54,6 +57,7 @@ private slots: QCOMPARE(error.error, QJsonParseError::NoError); QVERIFY(document.isArray()); const QDir directory = QFileInfo(manifest).absoluteDir(); struct Counts { int correct = 0, unknown = 0, wrong = 0; } full, snippets; + QElapsedTimer elapsed; elapsed.start(); for (const auto& item : document.array()) { const auto entry = item.toObject(); const QString path = entry["file"].toString(); QFile source(directory.filePath(path)); QVERIFY2(source.open(QIODevice::ReadOnly), qPrintable(path)); @@ -80,6 +84,7 @@ private slots: } GUI_INFO("corpus totals: full correct=%d unknown=%d wrong=%d; snippets correct=%d unknown=%d wrong=%d", full.correct, full.unknown, full.wrong, snippets.correct, snippets.unknown, snippets.wrong); + GUI_INFO("corpus elapsed: %lld ms including input/SHA-256/logging", (long long)elapsed.elapsed()); QVERIFY(full.correct > 0); QCOMPARE(full.wrong, 0); QCOMPARE(snippets.wrong, 0); } };