fix(highlight): 大小写不敏感的语法名称匹配,修复 haskell 等高亮失效
Some checks failed
CI / check (push) Failing after 25m52s
CI / build (push) Has been skipped

This commit is contained in:
xfy 2026-06-16 16:20:21 +08:00
parent 6ce8915e6c
commit b7afd12538

View File

@ -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#"<span class="constant numeric integer decimal rust">1</span>"#));
}
#[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#"<span class="text plain">"#),
"Haskell 不应回退到纯文本: {}",
result
);
assert!(
result.contains("source haskell"),
"Haskell 应输出 source haskell: {}",
result
);
}
#[test]
fn highlight_code_uppercase_language_falls_back_via_lowercase() {
// 大写语言标识应通过小写回退路径匹配到对应语法。