on master help sign in
Handle file extension conflicts in --list-languages
commitc477e23fe9c8c0d677f8ed2b2b94c81262a48cc6 authorKienyew <aobi100bt@hotmail.com> dateSun 6 Sep 2020, 20:08 (6 years ago) parent31fb708
2 files changed+38
src/assets.rs+15 src/bin/bat/main.rs+23
src/assets.rs+15
@@ -170,6 +170,21 @@ impl HighlightingAssets {
170170 self.theme_set.themes.keys().map(|s| s.as_ref())
171171 }
172172
173+ pub fn syntax_for_file_name(
174+ &self,
175+ file_name: impl AsRef<Path>,
176+ mapping: &SyntaxMapping,
177+ ) -> Option<&SyntaxReference> {
178+ let file_name = file_name.as_ref();
179+ match mapping.get_syntax_for(file_name) {
180+ Some(MappingTarget::MapToUnknown) => None,
181+ Some(MappingTarget::MapTo(syntax_name)) => {
182+ self.syntax_set.find_syntax_by_name(syntax_name)
183+ }
184+ None => self.get_extension_syntax(file_name.as_os_str()),
185+ }
186+ }
187+
173188 pub(crate) fn get_theme(&self, theme: &str) -> &Theme {
174189 match self.theme_set.themes.get(theme) {
175190 Some(theme) => theme,
src/bin/bat/main.rs+23
@@ -86,6 +86,29 @@ pub fn list_languages(config: &Config) -> Result<()> {
8686 .filter(|syntax| !syntax.hidden && !syntax.file_extensions.is_empty())
8787 .cloned()
8888 .collect::<Vec<_>>();
89+
90+ // Handling of file-extension conflicts, see issue #1076
91+ for lang in languages.iter_mut() {
92+ let lang_name = lang.name.clone();
93+ lang.file_extensions.retain(|extension| {
94+ // The 'extension' variable is not certainly a real extension.
95+ //
96+ // Skip if 'extension' starts with '.', likely a hidden file like '.vimrc'
97+ // Also skip if the 'extension' contains another real extension, likely
98+ // that is a full match file name like 'CMakeLists.txt' and 'Cargo.lock'
99+ if extension.starts_with('.') || Path::new(extension).extension().is_some() {
100+ true
101+ } else {
102+ let test_file = Path::new("test").with_extension(extension);
103+ if let Some(syntax) = assets.syntax_for_file_name(test_file, &config.syntax_mapping) {
104+ syntax.name == lang_name
105+ } else {
106+ false
107+ }
108+ }
109+ });
110+ }
111+
89112 languages.sort_by_key(|lang| lang.name.to_uppercase());
90113
91114 let configured_languages = get_syntax_mapping_to_paths(config.syntax_mapping.mappings());