LibSyntax: Add Language-from-String/Path functions
These are taken from HackStudio, but slightly rearranged to be more alphabetical, and returning an empty Optional instead of "Unknown".
This commit is contained in:
parent
82f58b8af0
commit
ffce6cc977
Notes:
sideshowbarker
2024-07-16 23:04:17 +09:00
Author: https://github.com/AtkinsSJ Commit: https://github.com/SerenityOS/serenity/commit/ffce6cc977 Pull-request: https://github.com/SerenityOS/serenity/pull/17784 Reviewed-by: https://github.com/trflynn89 ✅
2 changed files with 69 additions and 0 deletions
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include "Language.h"
|
||||
#include <AK/LexicalPath.h>
|
||||
#include <LibGUI/TextEditor.h>
|
||||
#include <LibSyntax/Highlighter.h>
|
||||
|
||||
|
@ -72,4 +73,69 @@ StringView common_language_extension(Language language)
|
|||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
Optional<Language> 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> 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 {};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Forward.h>
|
||||
#include <AK/StringView.h>
|
||||
|
||||
namespace Syntax {
|
||||
|
@ -27,5 +28,7 @@ enum class Language {
|
|||
|
||||
StringView language_to_string(Language);
|
||||
StringView common_language_extension(Language);
|
||||
Optional<Language> language_from_name(StringView);
|
||||
Optional<Language> language_from_filename(LexicalPath const&);
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue