1
0
mirror of https://github.com/sharkdp/bat.git synced 2025-04-14 23:00:37 +01:00

Consolidate syntax detection behavior for all InputKind types

This commit is contained in:
Ethan P 2020-05-13 01:56:19 -07:00
parent 82981c9663
commit 59140b458c
No known key found for this signature in database
GPG Key ID: 6963FD04F6CF35EA

View File

@ -191,63 +191,50 @@ impl HighlightingAssets {
input: &mut OpenedInput, input: &mut OpenedInput,
mapping: &SyntaxMapping, mapping: &SyntaxMapping,
) -> &SyntaxReference { ) -> &SyntaxReference {
let syntax = if let Some(language) = language { let syntax = if match input.kind {
OpenedInputKind::ThemePreviewFile => true,
_ => false,
} {
// FIXME: replace the above match statement with matches macro when min Rust >= 1.42.0
self.syntax_set.find_syntax_by_name("Rust")
} else if let Some(language) = language {
self.syntax_set.find_syntax_by_token(language) self.syntax_set.find_syntax_by_token(language)
} else { } else {
match input.kind { let line_syntax = self.get_first_line_syntax(&mut input.reader);
OpenedInputKind::OrdinaryFile(ref actual_path) => {
let path_str = input
.metadata
.user_provided_name
.as_ref()
.unwrap_or(actual_path);
let path = Path::new(path_str);
let line_syntax = self.get_first_line_syntax(&mut input.reader);
let absolute_path = path.canonicalize().ok().unwrap_or_else(|| path.to_owned()); // Get the path of the file:
match mapping.get_syntax_for(absolute_path) { // If this was set by the metadata, that will take priority.
Some(MappingTarget::MapTo(syntax_name)) => { // If it wasn't, it will use the real file path (if available).
// TODO: we should probably return an error here if this syntax can not be let path_str =
// found. Currently, we just fall back to 'plain'. input
self.syntax_set.find_syntax_by_name(syntax_name) .metadata
} .user_provided_name
Some(MappingTarget::MapToUnknown) => line_syntax, .as_ref()
None => { .or_else(|| match input.kind {
let file_name = path.file_name().unwrap_or_default(); OpenedInputKind::OrdinaryFile(ref path) => Some(path),
self.get_extension_syntax(file_name).or(line_syntax) _ => None,
} });
}
}
OpenedInputKind::StdIn => {
if let Some(ref name) = input.metadata.user_provided_name {
self.get_extension_syntax(&name)
.or_else(|| self.get_first_line_syntax(&mut input.reader))
} else {
self.get_first_line_syntax(&mut input.reader)
}
}
OpenedInputKind::CustomReader => {
if let Some(ref path_str) = input.metadata.user_provided_name {
let path = Path::new(path_str);
let absolute_path =
path.canonicalize().ok().unwrap_or_else(|| path.to_owned());
let line_syntax = self.get_first_line_syntax(&mut input.reader);
match mapping.get_syntax_for(absolute_path) { if let Some(path_str) = path_str {
Some(MappingTarget::MapTo(syntax_name)) => { // If a path was provided, we try and detect the syntax based on extension mappings.
self.syntax_set.find_syntax_by_name(syntax_name) let path = Path::new(path_str);
} let absolute_path = path.canonicalize().ok().unwrap_or_else(|| path.to_owned());
Some(MappingTarget::MapToUnknown) => line_syntax,
None => { match mapping.get_syntax_for(absolute_path) {
let file_name = path.file_name().unwrap_or_default(); Some(MappingTarget::MapToUnknown) => line_syntax,
self.get_extension_syntax(file_name).or(line_syntax) Some(MappingTarget::MapTo(syntax_name)) => {
} // TODO: we should probably return an error here if this syntax can not be
} // found. Currently, we just fall back to 'plain'.
} else { self.syntax_set.find_syntax_by_name(syntax_name)
self.get_first_line_syntax(&mut input.reader) }
None => {
let file_name = path.file_name().unwrap_or_default();
self.get_extension_syntax(file_name).or(line_syntax)
} }
} }
OpenedInputKind::ThemePreviewFile => self.syntax_set.find_syntax_by_name("Rust"), } else {
// If a path wasn't provided, we fall back to the detect first-line syntax.
line_syntax
} }
}; };