Merge fe5cc44fd7
into 0e575b2809
This commit is contained in:
commit
45bba9f3af
2 changed files with 52 additions and 0 deletions
|
@ -52,6 +52,15 @@ impl FileIcons {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handle cases where the file extension is made up of multiple important
|
||||||
|
// parts (e.g Component.stories.tsx) that refer to an alternative icon style
|
||||||
|
if let Some(suffix) = path.multiple_extensions() {
|
||||||
|
let maybe_path = get_icon_from_suffix(suffix.as_str());
|
||||||
|
if maybe_path.is_some() {
|
||||||
|
return maybe_path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// primary case: check if the files extension or the hidden file name
|
// primary case: check if the files extension or the hidden file name
|
||||||
// matches some icon path
|
// matches some icon path
|
||||||
if let Some(suffix) = path.extension_or_hidden_file_name() {
|
if let Some(suffix) = path.extension_or_hidden_file_name() {
|
||||||
|
@ -72,6 +81,7 @@ impl FileIcons {
|
||||||
return maybe_path;
|
return maybe_path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.get_icon_for_type("default", cx)
|
this.get_icon_for_type("default", cx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use globset::{Glob, GlobSet, GlobSetBuilder};
|
use globset::{Glob, GlobSet, GlobSetBuilder};
|
||||||
|
use itertools::Itertools;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
|
@ -20,6 +21,7 @@ pub fn home_dir() -> &'static PathBuf {
|
||||||
pub trait PathExt {
|
pub trait PathExt {
|
||||||
fn compact(&self) -> PathBuf;
|
fn compact(&self) -> PathBuf;
|
||||||
fn extension_or_hidden_file_name(&self) -> Option<&str>;
|
fn extension_or_hidden_file_name(&self) -> Option<&str>;
|
||||||
|
fn multiple_extensions(&self) -> Option<String>;
|
||||||
fn to_sanitized_string(&self) -> String;
|
fn to_sanitized_string(&self) -> String;
|
||||||
fn try_from_bytes<'a>(bytes: &'a [u8]) -> anyhow::Result<Self>
|
fn try_from_bytes<'a>(bytes: &'a [u8]) -> anyhow::Result<Self>
|
||||||
where
|
where
|
||||||
|
@ -84,6 +86,27 @@ impl<T: AsRef<Path>> PathExt for T {
|
||||||
.or_else(|| path.file_stem()?.to_str())
|
.or_else(|| path.file_stem()?.to_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a file's "full" joined collection of extensions, in the case where a file does not
|
||||||
|
/// just have a singular extension but instead has multiple (e.g File.tar.gz, Component.stories.tsx)
|
||||||
|
///
|
||||||
|
/// Will provide back the extensions joined together such as tar.gz or stories.tsx
|
||||||
|
fn multiple_extensions(&self) -> Option<String> {
|
||||||
|
let path = self.as_ref();
|
||||||
|
let file_name = path.file_name()?.to_str()?;
|
||||||
|
|
||||||
|
let parts: Vec<&str> = file_name
|
||||||
|
.split('.')
|
||||||
|
// Skip the part with the file name extension
|
||||||
|
.skip(1)
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
if parts.len() < 2 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(parts.into_iter().join("."))
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns a sanitized string representation of the path.
|
/// Returns a sanitized string representation of the path.
|
||||||
/// Note, on Windows, this assumes that the path is a valid UTF-8 string and
|
/// Note, on Windows, this assumes that the path is a valid UTF-8 string and
|
||||||
/// is not a UNC path.
|
/// is not a UNC path.
|
||||||
|
@ -1171,6 +1194,25 @@ mod tests {
|
||||||
assert_eq!(path.extension_or_hidden_file_name(), Some("eslintrc.js"));
|
assert_eq!(path.extension_or_hidden_file_name(), Some("eslintrc.js"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_multiple_extensions() {
|
||||||
|
// No extensions
|
||||||
|
let path = Path::new("/a/b/c/file_name");
|
||||||
|
assert_eq!(path.multiple_extensions(), None);
|
||||||
|
|
||||||
|
// Only one extension
|
||||||
|
let path = Path::new("/a/b/c/file_name.tsx");
|
||||||
|
assert_eq!(path.multiple_extensions(), None);
|
||||||
|
|
||||||
|
// Stories sample extension
|
||||||
|
let path = Path::new("/a/b/c/file_name.stories.tsx");
|
||||||
|
assert_eq!(path.multiple_extensions(), Some("stories.tsx".to_string()));
|
||||||
|
|
||||||
|
// Longer sample extension
|
||||||
|
let path = Path::new("/a/b/c/long.app.tar.gz");
|
||||||
|
assert_eq!(path.multiple_extensions(), Some("app.tar.gz".to_string()));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn edge_of_glob() {
|
fn edge_of_glob() {
|
||||||
let path = Path::new("/work/node_modules");
|
let path = Path::new("/work/node_modules");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue