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() {
// 大写语言标识应通过小写回退路径匹配到对应语法。