Serenity Operating System
at master 141 lines 4.1 kB view raw
1/* 2 * Copyright (c) 2020-2022, the SerenityOS developers. 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include "Language.h" 8#include <AK/LexicalPath.h> 9#include <LibGUI/TextEditor.h> 10#include <LibSyntax/Highlighter.h> 11 12namespace Syntax { 13 14StringView language_to_string(Language language) 15{ 16 switch (language) { 17 case Language::CMake: 18 return "CMake"sv; 19 case Language::CMakeCache: 20 return "CMakeCache"sv; 21 case Language::Cpp: 22 return "C++"sv; 23 case Language::CSS: 24 return "CSS"sv; 25 case Language::GitCommit: 26 return "Git"sv; 27 case Language::GML: 28 return "GML"sv; 29 case Language::HTML: 30 return "HTML"sv; 31 case Language::INI: 32 return "INI"sv; 33 case Language::JavaScript: 34 return "JavaScript"sv; 35 case Language::PlainText: 36 return "Plain Text"sv; 37 case Language::Shell: 38 return "Shell"sv; 39 case Language::SQL: 40 return "SQL"sv; 41 } 42 VERIFY_NOT_REACHED(); 43} 44 45StringView common_language_extension(Language language) 46{ 47 switch (language) { 48 case Language::CMake: 49 return "cmake"sv; 50 case Language::CMakeCache: 51 return {}; 52 case Language::Cpp: 53 return "cpp"sv; 54 case Language::CSS: 55 return "css"sv; 56 case Language::GitCommit: 57 return {}; 58 case Language::GML: 59 return "gml"sv; 60 case Language::HTML: 61 return "html"sv; 62 case Language::INI: 63 return "ini"sv; 64 case Language::JavaScript: 65 return "js"sv; 66 case Language::PlainText: 67 return "txt"sv; 68 case Language::Shell: 69 return "sh"sv; 70 case Language::SQL: 71 return "sql"sv; 72 } 73 VERIFY_NOT_REACHED(); 74} 75 76Optional<Language> language_from_name(StringView name) 77{ 78 if (name.equals_ignoring_ascii_case("CMake"sv)) 79 return Language::CMake; 80 if (name.equals_ignoring_ascii_case("CMakeCache"sv)) 81 return Language::CMakeCache; 82 if (name.equals_ignoring_ascii_case("Cpp"sv)) 83 return Language::Cpp; 84 if (name.equals_ignoring_ascii_case("CSS"sv)) 85 return Language::CSS; 86 if (name.equals_ignoring_ascii_case("GitCommit"sv)) 87 return Language::GitCommit; 88 if (name.equals_ignoring_ascii_case("GML"sv)) 89 return Language::GML; 90 if (name.equals_ignoring_ascii_case("HTML"sv)) 91 return Language::HTML; 92 if (name.equals_ignoring_ascii_case("INI"sv)) 93 return Language::INI; 94 if (name.equals_ignoring_ascii_case("JavaScript"sv)) 95 return Language::JavaScript; 96 if (name.equals_ignoring_ascii_case("PlainText"sv)) 97 return Language::PlainText; 98 if (name.equals_ignoring_ascii_case("SQL"sv)) 99 return Language::SQL; 100 if (name.equals_ignoring_ascii_case("Shell"sv)) 101 return Language::Shell; 102 103 return {}; 104} 105 106Optional<Language> language_from_filename(LexicalPath const& file) 107{ 108 if (file.title() == "COMMIT_EDITMSG"sv) 109 return Language::GitCommit; 110 111 auto extension = file.extension(); 112 VERIFY(!extension.starts_with('.')); 113 if (extension == "cmake"sv || (extension == "txt"sv && file.title() == "CMakeLists"sv)) 114 return Language::CMake; 115 if (extension == "txt"sv && file.title() == "CMakeCache"sv) 116 return Language::CMakeCache; 117 if (extension.is_one_of("c"sv, "cc"sv, "cxx"sv, "cpp"sv, "c++", "h"sv, "hh"sv, "hxx"sv, "hpp"sv, "h++"sv)) 118 return Language::Cpp; 119 if (extension == "css"sv) 120 return Language::CSS; 121 if (extension == "gml"sv) 122 return Language::GML; 123 if (extension.is_one_of("html"sv, "htm"sv)) 124 return Language::HTML; 125 if (extension.is_one_of("ini"sv, "af"sv)) 126 return Language::INI; 127 if (extension.is_one_of("js"sv, "mjs"sv, "json"sv)) 128 return Language::JavaScript; 129 if (extension.is_one_of("sh"sv, "bash"sv)) 130 return Language::Shell; 131 if (extension == "sql"sv) 132 return Language::SQL; 133 134 // Check "txt" after the CMake related files that use "txt" as their extension. 135 if (extension == "txt"sv) 136 return Language::PlainText; 137 138 return {}; 139} 140 141}