Serenity Operating System
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}