diff --git a/src/highlight.rs b/src/highlight.rs index a2243ae..03b2887 100644 --- a/src/highlight.rs +++ b/src/highlight.rs @@ -48,15 +48,20 @@ pub mod server { if let Some(s) = ss.find_syntax_by_name(lang) { return s; } - // 小写后再匹配一次 + // 小写扩展名再匹配一次(部分语言的扩展名习惯小写) let lower = lang.to_lowercase(); if lower != lang { if let Some(s) = ss.find_syntax_by_extension(&lower) { return s; } - if let Some(s) = ss.find_syntax_by_name(&lower) { - return s; - } + } + // 大小写不敏感的语法名称匹配(syntect 的语法名通常首字母大写,如 Haskell) + if let Some(s) = ss + .syntaxes() + .iter() + .find(|s| s.name.eq_ignore_ascii_case(lang)) + { + return s; } // 常用语言别名映射表 let aliases: &[(&str, &str)] = &[ @@ -163,6 +168,23 @@ mod tests { assert!(result.contains(r#"1"#)); } + #[test] + fn highlight_code_haskell_by_full_name() { + // Haskell 语法名首字母大写,扩展名为 hs;直接写 "haskell" 应能匹配。 + let code = "factorial :: Integer -> Integer\nfactorial 0 = 1"; + let result = highlight_code(code, Some("haskell")); + assert!( + !result.contains(r#""#), + "Haskell 不应回退到纯文本: {}", + result + ); + assert!( + result.contains("source haskell"), + "Haskell 应输出 source haskell: {}", + result + ); + } + #[test] fn highlight_code_uppercase_language_falls_back_via_lowercase() { // 大写语言标识应通过小写回退路径匹配到对应语法。