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); } }