Avoid guessing JavaScript from shared let and arrow syntax
This commit is contained in:
1 parent
970cdd5441
commit
6ea6bf20a8
2 files changed
+12
-3
No files matched your search
@@ -42,7 +42,8 @@ const Rule rules[] = {
|
||||
{Php, 4, QRegularExpression(R"(\$[a-zA-Z_]\w*\s*(?:->|\[|=))")},
|
||||
{Php, 4, QRegularExpression(R"(\bfunction\s+\w+\s*\([^\n)]*\$|\b(?:public|private|protected)\s+(?:static\s+)?function\b)")},
|
||||
{Php, 3, QRegularExpression(R"(\b(?:echo|require_once|include_once)\b|\barray\s*\(|\$this\b)")},
|
||||
{JavaScript, 4, QRegularExpression(R"(\b(?:const|let|var)\s+[a-zA-Z_$][\w$]*\s*=)")},
|
||||
{JavaScript, 4, QRegularExpression(R"(\b(?:const|var)\s+[a-zA-Z_$][\w$]*\s*=)")},
|
||||
{JavaScript, 2, QRegularExpression(R"(\blet\s+[a-zA-Z_$][\w$]*\s*=)")},
|
||||
{JavaScript, 3, QRegularExpression(R"(=>|\bfunction\s*[\w$]*\s*\()")},
|
||||
{JavaScript, 4, QRegularExpression(R"(\b(?:module\.exports|exports\.\w+|console\.\w+|document\.\w+)\b)")},
|
||||
{JavaScript, 4, QRegularExpression(R"(^\s*(?:export\s+(?:default|function|const|class)\b|import\s+[^;\n]+\s+from\b))",
|
||||
@@ -74,10 +75,15 @@ QString detectCodeLanguage(QStringView source) {
|
||||
}
|
||||
std::array<int, LanguageCount> scores{};
|
||||
for (const auto& rule : rules) if (rule.pattern.match(code).hasMatch()) scores[rule.language] += rule.weight;
|
||||
// Фрагменты HTML без doctype: нужен парный известный тег; JSX с объявлениями JS не выбираем как HTML.
|
||||
// Структурные теги отличают HTML с вложенным JS/CSS; одиночный div внутри JSX недостаточен.
|
||||
static const QRegularExpression structuralTags(R"(</?(?:html|head|body|script|style)\b[^<>]*>)",
|
||||
QRegularExpression::CaseInsensitiveOption);
|
||||
static const QRegularExpression tags(R"(<(div|span|p|a|ul|li|table|section|form|button|h[1-6])\b[^<>]*>[\s\S]*?</\1\s*>)",
|
||||
QRegularExpression::CaseInsensitiveOption);
|
||||
if (scores[JavaScript] == 0 && tags.match(code).hasMatch()) { scores[Html] = 7; scores[Css] = 0; }
|
||||
if (structuralTags.match(code).hasMatch() || (scores[JavaScript] == 0 && tags.match(code).hasMatch())) {
|
||||
GUI_DEBUG("code language: result=HTML markup tags sampled=%d", int(sample.size()));
|
||||
return QStringLiteral("HTML");
|
||||
}
|
||||
// std:: и Type::method встречаются также в Rust; use/fn/impl отличают его от C++.
|
||||
if (scores[Rust] >= 7) scores[Cpp] = 0;
|
||||
// C является подмножеством C++: специфичные конструкции C++ имеют приоритет.
|
||||
|
||||
Reference in new issue
Block a user