diff --git a/Userland/Libraries/LibSyntax/Language.cpp b/Userland/Libraries/LibSyntax/Language.cpp index 2ab0fd1313..f06959453a 100644 --- a/Userland/Libraries/LibSyntax/Language.cpp +++ b/Userland/Libraries/LibSyntax/Language.cpp @@ -5,6 +5,7 @@ */ #include "Language.h" +#include #include #include @@ -72,4 +73,69 @@ StringView common_language_extension(Language language) VERIFY_NOT_REACHED(); } +Optional language_from_name(StringView name) +{ + if (name.equals_ignoring_ascii_case("CMake"sv)) + return Language::CMake; + if (name.equals_ignoring_ascii_case("CMakeCache"sv)) + return Language::CMakeCache; + if (name.equals_ignoring_ascii_case("Cpp"sv)) + return Language::Cpp; + if (name.equals_ignoring_ascii_case("CSS"sv)) + return Language::CSS; + if (name.equals_ignoring_ascii_case("GitCommit"sv)) + return Language::GitCommit; + if (name.equals_ignoring_ascii_case("GML"sv)) + return Language::GML; + if (name.equals_ignoring_ascii_case("HTML"sv)) + return Language::HTML; + if (name.equals_ignoring_ascii_case("INI"sv)) + return Language::INI; + if (name.equals_ignoring_ascii_case("JavaScript"sv)) + return Language::JavaScript; + if (name.equals_ignoring_ascii_case("PlainText"sv)) + return Language::PlainText; + if (name.equals_ignoring_ascii_case("SQL"sv)) + return Language::SQL; + if (name.equals_ignoring_ascii_case("Shell"sv)) + return Language::Shell; + + return {}; +} + +Optional language_from_filename(LexicalPath const& file) +{ + if (file.title() == "COMMIT_EDITMSG"sv) + return Language::GitCommit; + + auto extension = file.extension(); + VERIFY(!extension.starts_with('.')); + if (extension == "cmake"sv || (extension == "txt"sv && file.title() == "CMakeLists"sv)) + return Language::CMake; + if (extension == "txt"sv && file.title() == "CMakeCache"sv) + return Language::CMakeCache; + if (extension.is_one_of("c"sv, "cc"sv, "cxx"sv, "cpp"sv, "c++", "h"sv, "hh"sv, "hxx"sv, "hpp"sv, "h++"sv)) + return Language::Cpp; + if (extension == "css"sv) + return Language::CSS; + if (extension == "gml"sv) + return Language::GML; + if (extension.is_one_of("html"sv, "htm"sv)) + return Language::HTML; + if (extension.is_one_of("ini"sv, "af"sv)) + return Language::INI; + if (extension.is_one_of("js"sv, "mjs"sv, "json"sv)) + return Language::JavaScript; + if (extension.is_one_of("sh"sv, "bash"sv)) + return Language::Shell; + if (extension == "sql"sv) + return Language::SQL; + + // Check "txt" after the CMake related files that use "txt" as their extension. + if (extension == "txt"sv) + return Language::PlainText; + + return {}; +} + } diff --git a/Userland/Libraries/LibSyntax/Language.h b/Userland/Libraries/LibSyntax/Language.h index 9907b78d31..4c78e07ceb 100644 --- a/Userland/Libraries/LibSyntax/Language.h +++ b/Userland/Libraries/LibSyntax/Language.h @@ -6,6 +6,7 @@ #pragma once +#include #include namespace Syntax { @@ -27,5 +28,7 @@ enum class Language { StringView language_to_string(Language); StringView common_language_extension(Language); +Optional language_from_name(StringView); +Optional language_from_filename(LexicalPath const&); }