summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKienyew <aobi100bt@hotmail.com>2020-08-08 12:01:02 +0800
committerDavid Peter <sharkdp@users.noreply.github.com>2020-09-20 12:14:21 +0200
commitf97634011e9f2a4947c297b017acb0fb0c55cb71 (patch)
tree3ffa8fb1bbee36ccdbac636a9a267057ecc8c9f4
parenta4ffc9d5ed6aa63853c41ebfa36ec8ff40e1ee4b (diff)
Handle file extension conflicts in --list-languages (#1076)
-rw-r--r--src/bin/bat/main.rs13
-rw-r--r--src/syntax_mapping.rs20
2 files changed, 27 insertions, 6 deletions
diff --git a/src/bin/bat/main.rs b/src/bin/bat/main.rs
index 65129fa7..03fff166 100644
--- a/src/bin/bat/main.rs
+++ b/src/bin/bat/main.rs
@@ -86,6 +86,19 @@ pub fn list_languages(config: &Config) -> Result<()> {
.filter(|syntax| !syntax.hidden && !syntax.file_extensions.is_empty())
.cloned()
.collect::<Vec<_>>();
+
+ for lang in languages.iter_mut() {
+ let lang_name = lang.name.clone();
+ lang.file_extensions.retain(|extension| {
+ let test_file = Path::new("test").with_extension(extension);
+ match config.syntax_mapping.get_syntax_for(test_file) {
+ Some(MappingTarget::MapTo(primary_lang)) => lang_name == primary_lang,
+ Some(MappingTarget::MapToUnknown) => true,
+ None => true,
+ }
+ });
+ }
+
languages.sort_by_key(|lang| lang.name.to_uppercase());
let configured_languages = get_syntax_mapping_to_paths(config.syntax_mapping.mappings());
diff --git a/src/syntax_mapping.rs b/src/syntax_mapping.rs
index 96ce7fc6..84558ede 100644
--- a/src/syntax_mapping.rs
+++ b/src/syntax_mapping.rs
@@ -25,6 +25,12 @@ impl<'a> SyntaxMapping<'a> {
mapping.insert("*.h", MappingTarget::MapTo("C++")).unwrap();
mapping.insert("*.fs", MappingTarget::MapTo("F#")).unwrap();
mapping
+ .insert("*.js", MappingTarget::MapTo("JavaScript (Babel)"))
+ .unwrap();
+ mapping
+ .insert("*.sass", MappingTarget::MapTo("Sass"))
+ .unwrap();
+ mapping
.insert("build", MappingTarget::MapToUnknown)
.unwrap();
mapping
@@ -92,14 +98,16 @@ impl<'a> SyntaxMapping<'a> {
"*.swap",
"*.target",
"*.timer",
- ].iter() {
- mapping
- .insert(glob, MappingTarget::MapTo("INI"))
- .unwrap();
+ ]
+ .iter()
+ {
+ mapping.insert(glob, MappingTarget::MapTo("INI")).unwrap();
}
// pacman hooks
- mapping.insert("*.hook", MappingTarget::MapTo("INI")).unwrap();
+ mapping
+ .insert("*.hook", MappingTarget::MapTo("INI"))
+ .unwrap();
mapping
}
@@ -117,7 +125,7 @@ impl<'a> SyntaxMapping<'a> {
&self.mappings
}
- pub(crate) fn get_syntax_for(&self, path: impl AsRef<Path>) -> Option<MappingTarget<'a>> {
+ pub fn get_syntax_for(&self, path: impl AsRef<Path>) -> Option<MappingTarget<'a>> {
let candidate = Candidate::new(path.as_ref());
let candidate_filename = path.as_ref().file_name().map(Candidate::new);
for (ref glob, ref syntax) in self.mappings.iter().rev() {