using System.Collections.Frozen;
using System.Diagnostics.CodeAnalysis;
using AIStudio.Tools.CodeHighlighting.Languages;
namespace AIStudio.Tools.CodeHighlighting;
///
/// The languages AI Studio highlights itself, beyond those MudBlazor.Markdown highlights.
///
///
/// MudBlazor.Markdown highlights C#, Go, Kotlin, Razor, Rust, JSON, XML, and YAML. Its highlighter is
/// internal, so the languages models write just as often, such as Python, get rules of their own here.
/// A language is found by the name SourceCodeLanguages gives it, which already knows all the aliases
/// models write behind the fence, such as py or Python3.
///
public static class CodeHighlighters
{
private static readonly FrozenDictionary RULES_BY_LANGUAGE = new Dictionary(StringComparer.Ordinal)
{
["C"] = CppCodeRules.RULES,
["C++"] = CppCodeRules.RULES,
["CSS"] = CssCodeRules.RULES,
["Java"] = JavaCodeRules.RULES,
["JavaScript"] = JavaScriptCodeRules.RULES,
["JSX"] = JavaScriptCodeRules.RULES,
["Lua"] = LuaCodeRules.RULES,
["PowerShell"] = PowerShellCodeRules.RULES,
["Python"] = PythonCodeRules.RULES,
["Shell"] = ShellCodeRules.RULES,
["SQL"] = SqlCodeRules.RULES,
["TSX"] = TypeScriptCodeRules.RULES,
["TypeScript"] = TypeScriptCodeRules.RULES,
}.ToFrozenDictionary(StringComparer.Ordinal);
///
/// The names of the languages AI Studio highlights itself, as SourceCodeLanguages names them.
///
internal static IEnumerable LanguageNames => RULES_BY_LANGUAGE.Keys;
///
/// Finds the rules for the language a model names behind the opening fence of a code block.
///
/// The language behind the opening fence, as Markdig reads it.
/// The rules of the language, when AI Studio highlights it itself.
/// Whether AI Studio highlights the language itself. Otherwise, MudBlazor.Markdown renders the
/// block, highlighted when it knows the language.
public static bool TryGetRules(string? fenceLanguage, [NotNullWhen(true)] out CodeLanguageRules? rules)
{
rules = null;
if (string.IsNullOrWhiteSpace(fenceLanguage))
return false;
return RULES_BY_LANGUAGE.TryGetValue(SourceCodeLanguages.FromCodeFenceLanguage(fenceLanguage).Name, out rules);
}
}