Language.cpp 4.2 KB

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