Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 15ca855a04 | |||
| 666d2dc90a | |||
| 34583294c6 | |||
| 03615ab4ee | |||
| c722c73e79 | |||
| 8f5199974b | |||
| 8168877fb1 | |||
| 4e20b18d45 | |||
| 5dc1709f58 | |||
| fb1e35172e | |||
| fc9292be3f | |||
| 3f41cb40e2 | |||
| 729024a45f | |||
| ef1407d00e | |||
| 075fc467d2 | |||
| a463f4234c | |||
| beb04101db | |||
| bf60e4265b | |||
| 42421bc57d | |||
| f64ee7b7e9 | |||
| 1fa29cf831 | |||
| 4861dd5d4a | |||
| 5614b723fd | |||
| 5e1e13b091 | |||
| 79ddb3ca92 | |||
| 684929edea | |||
| f02ec8c4ba | |||
| 5fd4ed9b0c | |||
| 003c295084 |
+12
-1
@@ -120,4 +120,15 @@ webhook-log
|
|||||||
start_moderation.sh
|
start_moderation.sh
|
||||||
gh_moderator.toml
|
gh_moderator.toml
|
||||||
moderator-data
|
moderator-data
|
||||||
hyfetch/git
|
hyfetch/git
|
||||||
|
build
|
||||||
|
dist
|
||||||
|
target
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
*.iml
|
||||||
|
*.egg-info
|
||||||
|
__pycache__
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
|||||||
Generated
+324
-243
File diff suppressed because it is too large
Load Diff
+8
-8
@@ -3,7 +3,7 @@ resolver = "2"
|
|||||||
members = ["crates/*"]
|
members = ["crates/*"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "2.0.1"
|
version = "2.0.2"
|
||||||
authors = ["Azalea Gui <azalea@hydev.org>"]
|
authors = ["Azalea Gui <azalea@hydev.org>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
rust-version = "1.75.0"
|
rust-version = "1.75.0"
|
||||||
@@ -17,14 +17,14 @@ ansi_colours = { version = "1.2.2", default-features = false }
|
|||||||
anstream = { version = "0.6.14", default-features = false }
|
anstream = { version = "0.6.14", default-features = false }
|
||||||
anyhow = { version = "1.0.86", default-features = false }
|
anyhow = { version = "1.0.86", default-features = false }
|
||||||
bpaf = { version = "0.9.12", default-features = false }
|
bpaf = { version = "0.9.12", default-features = false }
|
||||||
crossterm = { version = "0.27.0", default-features = false }
|
crossterm = { version = "0.29.0", default-features = false }
|
||||||
deranged = { version = "0.3.11", default-features = false }
|
deranged = { version = "0.3.11", default-features = false }
|
||||||
directories = { version = "5.0.1", default-features = false }
|
directories = { version = "6.0.0", default-features = false }
|
||||||
enable-ansi-support = { version = "0.2.1", default-features = false }
|
enable-ansi-support = { version = "0.2.1", default-features = false }
|
||||||
enterpolation = { version = "0.2.1", default-features = false }
|
enterpolation = { version = "0.2.1", default-features = false }
|
||||||
fastrand = { version = "2.1.0", default-features = false }
|
fastrand = { version = "2.1.0", default-features = false }
|
||||||
indexmap = { version = "2.2.6", default-features = false }
|
indexmap = { version = "2.2.6", default-features = false }
|
||||||
itertools = { version = "0.13.0", default-features = false }
|
itertools = { version = "0.14.0", default-features = false }
|
||||||
normpath = { version = "1.2.0", default-features = false }
|
normpath = { version = "1.2.0", default-features = false }
|
||||||
palette = { version = "0.7.6", default-features = false }
|
palette = { version = "0.7.6", default-features = false }
|
||||||
regex = { version = "1.10.5", default-features = false }
|
regex = { version = "1.10.5", default-features = false }
|
||||||
@@ -33,14 +33,14 @@ serde = { version = "1.0.203", default-features = false }
|
|||||||
serde_json = { version = "1.0.118", default-features = false }
|
serde_json = { version = "1.0.118", default-features = false }
|
||||||
serde_path_to_error = { version = "0.1.16", default-features = false }
|
serde_path_to_error = { version = "0.1.16", default-features = false }
|
||||||
shell-words = { version = "1.1.0", default-features = false }
|
shell-words = { version = "1.1.0", default-features = false }
|
||||||
strum = { version = "0.26.3", default-features = false }
|
strum = { version = "0.27.2", default-features = false }
|
||||||
supports-color = { version = "3.0.0", default-features = false }
|
supports-color = { version = "3.0.0", default-features = false }
|
||||||
tempfile = { version = "3.10.1", default-features = false }
|
tempfile = { version = "3.10.1", default-features = false }
|
||||||
terminal-colorsaurus = { version = "0.4.3", default-features = false }
|
terminal-colorsaurus = { version = "1.0.0", default-features = false }
|
||||||
terminal_size = { version = "0.3.0", default-features = false }
|
terminal_size = { version = "0.4.3", default-features = false }
|
||||||
thiserror = { version = "1.0.61", default-features = false }
|
thiserror = { version = "1.0.61", default-features = false }
|
||||||
time = { version = "0.3.36", default-features = false }
|
time = { version = "0.3.36", default-features = false }
|
||||||
toml_edit = { version = "0.22.16", default-features = false }
|
toml_edit = { version = "0.23.6", default-features = false }
|
||||||
tracing = { version = "0.1.40", default-features = false }
|
tracing = { version = "0.1.40", default-features = false }
|
||||||
tracing-subscriber = { version = "0.3.18", default-features = false }
|
tracing-subscriber = { version = "0.3.18", default-features = false }
|
||||||
unicode-normalization = { version = "0.1.23", default-features = false }
|
unicode-normalization = { version = "0.1.23", default-features = false }
|
||||||
|
|||||||
@@ -129,6 +129,17 @@ cargo install --git https://github.com/hykilpikonna/hyfetch
|
|||||||
|
|
||||||
<!-- CHANGELOG STARTS HERE --->
|
<!-- CHANGELOG STARTS HERE --->
|
||||||
|
|
||||||
|
### 2.0.2
|
||||||
|
|
||||||
|
This is a small patch release that adds more flags and fixes some bugs from the recent Rust rewrite.
|
||||||
|
|
||||||
|
* 🏳️🌈 **New Flags**: Added new pride flags for Nullflux ([#397](https://github.com/hykilpikonna/hyfetch/pull/397)), Hypergender ([#422](https://github.com/hykilpikonna/hyfetch/pull/422)), Fictosexual ([#394](https://github.com/hykilpikonna/hyfetch/pull/394)), and Adipophilia ([#424](https://github.com/hykilpikonna/hyfetch/pull/424)).
|
||||||
|
* 🐛 **Bug Fixes**:
|
||||||
|
* Fixed a critical bug where custom `fastfetch` configurations could break hyfetch ([#420](https://github.com/hykilpikonna/hyfetch/pull/420)).
|
||||||
|
* Corrected the `nixos_small` ASCII logo to display properly ([#421](https://github.com/hykilpikonna/hyfetch/pull/421)).
|
||||||
|
* 🔧 **Improvements**:
|
||||||
|
* Improved a warning message for better clarity ([#419](https://github.com/hykilpikonna/hyfetch/issues/419)).
|
||||||
|
|
||||||
### 2.0.1
|
### 2.0.1
|
||||||
|
|
||||||
(changelog is generated by Gemini from commit history)
|
(changelog is generated by Gemini from commit history)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ fn main() {
|
|||||||
let dir = PathBuf::from(env::var_os("CARGO_WORKSPACE_DIR").unwrap_or_else(|| env::var_os("CARGO_MANIFEST_DIR").unwrap()));
|
let dir = PathBuf::from(env::var_os("CARGO_WORKSPACE_DIR").unwrap_or_else(|| env::var_os("CARGO_MANIFEST_DIR").unwrap()));
|
||||||
let o = PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
let o = PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
||||||
|
|
||||||
for file in &["neofetch", "hyfetch"] {
|
for file in &["neofetch", "hyfetch/data"] {
|
||||||
let src = anything_that_exist(&[
|
let src = anything_that_exist(&[
|
||||||
&dir.join(file),
|
&dir.join(file),
|
||||||
&dir.join("../../").join(file),
|
&dir.join("../../").join(file),
|
||||||
@@ -45,6 +45,7 @@ fn main() {
|
|||||||
// Copy either file or directory
|
// Copy either file or directory
|
||||||
if src.is_dir() {
|
if src.is_dir() {
|
||||||
let opt = CopyOptions { overwrite: true, copy_inside: true, ..CopyOptions::default() };
|
let opt = CopyOptions { overwrite: true, copy_inside: true, ..CopyOptions::default() };
|
||||||
|
println!("copying {} to {}", src.display(), dst.display());
|
||||||
fs_extra::dir::copy(&src, &dst, &opt).expect("Failed to copy directory to OUT_DIR");
|
fs_extra::dir::copy(&src, &dst, &opt).expect("Failed to copy directory to OUT_DIR");
|
||||||
}
|
}
|
||||||
else { fs::copy(&src, &dst).expect("Failed to copy file to OUT_DIR"); }
|
else { fs::copy(&src, &dst).expect("Failed to copy file to OUT_DIR"); }
|
||||||
|
|||||||
@@ -61,8 +61,8 @@ impl RawAsciiArt {
|
|||||||
|
|
||||||
Ok(NormalizedAsciiArt {
|
Ok(NormalizedAsciiArt {
|
||||||
lines,
|
lines,
|
||||||
w,
|
w: w.try_into().context("width does not fit in u8")?,
|
||||||
h,
|
h: h.try_into().context("height does not fit in u8")?,
|
||||||
fg: self.fg.clone(),
|
fg: self.fg.clone(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
+150
-180
@@ -2,7 +2,8 @@ use std::borrow::Cow;
|
|||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::fmt::Write as _;
|
use std::fmt::Write as _;
|
||||||
use std::fs::{self, File};
|
use std::fs::{self, File};
|
||||||
use std::io::{self, IsTerminal as _, Read as _, Write as _};
|
use std::io::{self, IsTerminal as _, Read as _};
|
||||||
|
use std::iter;
|
||||||
use std::iter::zip;
|
use std::iter::zip;
|
||||||
use std::num::NonZeroU8;
|
use std::num::NonZeroU8;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
@@ -24,8 +25,8 @@ use hyfetch::models::Config;
|
|||||||
#[cfg(feature = "macchina")]
|
#[cfg(feature = "macchina")]
|
||||||
use hyfetch::neofetch_util::macchina_path;
|
use hyfetch::neofetch_util::macchina_path;
|
||||||
use hyfetch::neofetch_util::{self, add_pkg_path, fastfetch_path, get_distro_ascii, get_distro_name, literal_input, ColorAlignment, NEOFETCH_COLORS_AC, NEOFETCH_COLOR_PATTERNS, TEST_ASCII};
|
use hyfetch::neofetch_util::{self, add_pkg_path, fastfetch_path, get_distro_ascii, get_distro_name, literal_input, ColorAlignment, NEOFETCH_COLORS_AC, NEOFETCH_COLOR_PATTERNS, TEST_ASCII};
|
||||||
use hyfetch::presets::{AssignLightness, Preset};
|
use hyfetch::presets::{AssignLightness, ColorProfile, Preset};
|
||||||
use hyfetch::pride_month;
|
use hyfetch::{pride_month, printc};
|
||||||
use hyfetch::types::{AnsiMode, Backend, TerminalTheme};
|
use hyfetch::types::{AnsiMode, Backend, TerminalTheme};
|
||||||
use hyfetch::utils::{get_cache_path, input};
|
use hyfetch::utils::{get_cache_path, input};
|
||||||
use hyfetch::font_logo::get_font_logo;
|
use hyfetch::font_logo::get_font_logo;
|
||||||
@@ -64,15 +65,12 @@ fn main() -> Result<()> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if options.test_print {
|
if options.test_print {
|
||||||
let asc = get_distro_ascii(distro, backend).context("failed to get distro ascii")?;
|
println!("{asc}", asc = get_distro_ascii(distro, backend)?.asc);
|
||||||
writeln!(io::stdout(), "{asc}", asc = asc.asc)
|
|
||||||
.context("failed to write ascii to stdout")?;
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
if options.print_font_logo {
|
if options.print_font_logo {
|
||||||
let logo = get_font_logo(backend).context("failed to get font logo")?;
|
println!("{}", get_font_logo(backend)?);
|
||||||
writeln!(io::stdout(), "{}", logo).context("failed to write logo to stdout")?;
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,14 +108,9 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
if show_pride_month && !config.pride_month_disable {
|
if show_pride_month && !config.pride_month_disable {
|
||||||
pride_month::start_animation(color_mode).context("failed to draw pride month animation")?;
|
pride_month::start_animation(color_mode).context("failed to draw pride month animation")?;
|
||||||
writeln!(
|
println!("\nHappy pride month!\n(You can always view the animation again with `hyfetch --june`)\n");
|
||||||
io::stdout(),
|
|
||||||
"\nHappy pride month!\n(You can always view the animation again with `hyfetch \
|
|
||||||
--june`)\n"
|
|
||||||
)
|
|
||||||
.context("failed to write message to stdout")?;
|
|
||||||
|
|
||||||
if !june_path.is_file() {
|
if !june_path.is_file() && !options.june {
|
||||||
File::create(&june_path)
|
File::create(&june_path)
|
||||||
.with_context(|| format!("failed to create file {june_path:?}"))?;
|
.with_context(|| format!("failed to create file {june_path:?}"))?;
|
||||||
}
|
}
|
||||||
@@ -129,9 +122,43 @@ fn main() -> Result<()> {
|
|||||||
let backend = options.backend.unwrap_or(config.backend);
|
let backend = options.backend.unwrap_or(config.backend);
|
||||||
let args = options.args.as_ref().or(config.args.as_ref());
|
let args = options.args.as_ref().or(config.args.as_ref());
|
||||||
|
|
||||||
|
fn parse_preset_string(preset_string: &str) -> Result<ColorProfile> {
|
||||||
|
if preset_string.contains('#') {
|
||||||
|
let colors: Vec<&str> = preset_string.split(',').map(|s| s.trim()).collect();
|
||||||
|
for color in &colors {
|
||||||
|
if !color.starts_with('#') ||
|
||||||
|
(color.len() != 4 && color.len() != 7) ||
|
||||||
|
!color[1..].chars().all(|c| c.is_ascii_hexdigit()) {
|
||||||
|
return Err(anyhow::anyhow!("invalid hex color: {}", color));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ColorProfile::from_hex_colors(colors)
|
||||||
|
.context("failed to create color profile from hex")
|
||||||
|
} else if preset_string == "random" {
|
||||||
|
let mut rng = fastrand::Rng::new();
|
||||||
|
let preset = *rng
|
||||||
|
.choice(<Preset as VariantArray>::VARIANTS)
|
||||||
|
.expect("preset iterator should not be empty");
|
||||||
|
Ok(preset.color_profile())
|
||||||
|
} else {
|
||||||
|
use std::str::FromStr;
|
||||||
|
let preset = Preset::from_str(preset_string)
|
||||||
|
.with_context(|| {
|
||||||
|
format!(
|
||||||
|
"PRESET should be comma-separated hex colors or one of {{{presets}}}",
|
||||||
|
presets = <Preset as VariantNames>::VARIANTS
|
||||||
|
.iter()
|
||||||
|
.chain(iter::once(&"random"))
|
||||||
|
.join(",")
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
Ok(preset.color_profile())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get preset
|
// Get preset
|
||||||
let preset = options.preset.unwrap_or(config.preset);
|
let preset_string = options.preset.as_deref().unwrap_or(&config.preset);
|
||||||
let color_profile = preset.color_profile();
|
let color_profile = parse_preset_string(preset_string)?;
|
||||||
debug!(?color_profile, "color profile");
|
debug!(?color_profile, "color profile");
|
||||||
|
|
||||||
// Lighten
|
// Lighten
|
||||||
@@ -149,7 +176,14 @@ fn main() -> Result<()> {
|
|||||||
};
|
};
|
||||||
debug!(?color_profile, "lightened color profile");
|
debug!(?color_profile, "lightened color profile");
|
||||||
|
|
||||||
let asc = if let Some(path) = options.ascii_file {
|
let asc = if let Some(path_str) = config.custom_ascii_path {
|
||||||
|
let path = PathBuf::from(path_str);
|
||||||
|
RawAsciiArt {
|
||||||
|
asc: fs::read_to_string(&path)
|
||||||
|
.with_context(|| format!("failed to read ascii from {path:?}"))?,
|
||||||
|
fg: Vec::new(),
|
||||||
|
}
|
||||||
|
} else if let Some(path) = options.ascii_file {
|
||||||
RawAsciiArt {
|
RawAsciiArt {
|
||||||
asc: fs::read_to_string(&path)
|
asc: fs::read_to_string(&path)
|
||||||
.with_context(|| format!("failed to read ascii from {path:?}"))?,
|
.with_context(|| format!("failed to read ascii from {path:?}"))?,
|
||||||
@@ -207,9 +241,9 @@ fn det_bg() -> Result<Option<Srgb<u8>>, terminal_colorsaurus::Error> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
background_color(QueryOptions::default())
|
background_color(QueryOptions::default())
|
||||||
.map(|terminal_colorsaurus::Color { r, g, b }| Some(Srgb::new(r, g, b).into_format()))
|
.map(|terminal_colorsaurus::Color { r, g, b , .. }| Some(Srgb::new(r, g, b).into_format()))
|
||||||
.or_else(|err| {
|
.or_else(|err| {
|
||||||
if matches!(err, terminal_colorsaurus::Error::UnsupportedTerminal) {
|
if matches!(err, terminal_colorsaurus::Error::UnsupportedTerminal(_)) {
|
||||||
Ok(None)
|
Ok(None)
|
||||||
} else {
|
} else {
|
||||||
Err(err)
|
Err(err)
|
||||||
@@ -236,10 +270,6 @@ fn create_config(
|
|||||||
} else if color_level.has_256 {
|
} else if color_level.has_256 {
|
||||||
AnsiMode::Ansi256
|
AnsiMode::Ansi256
|
||||||
} else if color_level.has_basic {
|
} else if color_level.has_basic {
|
||||||
// unimplemented!(
|
|
||||||
// "{mode} color mode not supported",
|
|
||||||
// mode = AnsiMode::Ansi16.as_ref()
|
|
||||||
// );
|
|
||||||
AnsiMode::Ansi256
|
AnsiMode::Ansi256
|
||||||
} else {
|
} else {
|
||||||
unreachable!();
|
unreachable!();
|
||||||
@@ -279,13 +309,8 @@ fn create_config(
|
|||||||
.expect("`option_counter` should not overflow `u8`");
|
.expect("`option_counter` should not overflow `u8`");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_title_prompt(
|
fn print_title_prompt(option_counter: NonZeroU8, prompt: &str) {
|
||||||
option_counter: NonZeroU8,
|
printc!("&a{option_counter}. {prompt}");
|
||||||
prompt: &str,
|
|
||||||
color_mode: AnsiMode,
|
|
||||||
) -> Result<()> {
|
|
||||||
printc(format!("&a{option_counter}. {prompt}"), color_mode)
|
|
||||||
.context("failed to print prompt")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
@@ -295,14 +320,8 @@ fn create_config(
|
|||||||
let (Width(term_w), Height(term_h)) = terminal_size().context("failed to get terminal size")?;
|
let (Width(term_w), Height(term_h)) = terminal_size().context("failed to get terminal size")?;
|
||||||
let (term_w_min, term_h_min) = ((asc.w as u32 * 2 + 4).clamp(0, u16::MAX.into()) as u16, 30);
|
let (term_w_min, term_h_min) = ((asc.w as u32 * 2 + 4).clamp(0, u16::MAX.into()) as u16, 30);
|
||||||
if term_w < term_w_min || term_h < term_h_min {
|
if term_w < term_w_min || term_h < term_h_min {
|
||||||
printc(
|
printc!("&cWarning: Your terminal is too small ({term_w} * {term_h}).\n\
|
||||||
format!(
|
Please resize it to at least ({term_w_min} * {term_h_min}) for better experience.");
|
||||||
"&cWarning: Your terminal is too small ({term_w} * {term_h}).\nPlease resize \
|
|
||||||
it to at least ({term_w_min} * {term_h_min}) for better experience."
|
|
||||||
),
|
|
||||||
color_mode,
|
|
||||||
)
|
|
||||||
.context("failed to print message")?;
|
|
||||||
input(Some("Press enter to continue...")).context("failed to read input")?;
|
input(Some("Press enter to continue...")).context("failed to read input")?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -347,18 +366,14 @@ fn create_config(
|
|||||||
(t - a) * ((d - c) / (b - a)) + c
|
(t - a) * ((d - c) / (b - a)) + c
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
let print_color_testing = |label: &str, mode: AnsiMode| {
|
||||||
let label = format!(
|
let label = format!("{label:^term_w$}", term_w = usize::from(term_w));
|
||||||
"{label:^term_w$}",
|
|
||||||
label = "8bit Color Testing",
|
|
||||||
term_w = usize::from(term_w)
|
|
||||||
);
|
|
||||||
let line = zip(gradient.iter(), label.chars()).fold(
|
let line = zip(gradient.iter(), label.chars()).fold(
|
||||||
String::new(),
|
String::new(),
|
||||||
|mut s, (&rgb_f32_color, t)| {
|
|mut s, (&rgb_f32_color, t)| {
|
||||||
let rgb_u8_color = Srgb::<u8>::from_linear(rgb_f32_color);
|
let rgb_u8_color = Srgb::<u8>::from_linear(rgb_f32_color);
|
||||||
let back = rgb_u8_color
|
let back = rgb_u8_color
|
||||||
.to_ansi_string(AnsiMode::Ansi256, ForegroundBackground::Background);
|
.to_ansi_string(mode, ForegroundBackground::Background);
|
||||||
let fore = rgb_u8_color
|
let fore = rgb_u8_color
|
||||||
.contrast_grayscale()
|
.contrast_grayscale()
|
||||||
.to_ansi_string(AnsiMode::Ansi256, ForegroundBackground::Foreground);
|
.to_ansi_string(AnsiMode::Ansi256, ForegroundBackground::Foreground);
|
||||||
@@ -366,42 +381,15 @@ fn create_config(
|
|||||||
s
|
s
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
printc(line, AnsiMode::Ansi256).context("failed to print 8-bit color test line")?;
|
printc!("{line}");
|
||||||
}
|
};
|
||||||
{
|
|
||||||
let label = format!(
|
|
||||||
"{label:^term_w$}",
|
|
||||||
label = "RGB Color Testing",
|
|
||||||
term_w = usize::from(term_w)
|
|
||||||
);
|
|
||||||
let line = zip(gradient.iter(), label.chars()).fold(
|
|
||||||
String::new(),
|
|
||||||
|mut s, (&rgb_f32_color, t)| {
|
|
||||||
let rgb_u8_color = Srgb::<u8>::from_linear(rgb_f32_color);
|
|
||||||
let back = rgb_u8_color
|
|
||||||
.to_ansi_string(AnsiMode::Rgb, ForegroundBackground::Background);
|
|
||||||
let fore = rgb_u8_color
|
|
||||||
.contrast_grayscale()
|
|
||||||
.to_ansi_string(AnsiMode::Ansi256, ForegroundBackground::Foreground);
|
|
||||||
write!(s, "{back}{fore}{t}").unwrap();
|
|
||||||
s
|
|
||||||
},
|
|
||||||
);
|
|
||||||
printc(line, AnsiMode::Rgb).context("failed to print RGB color test line")?;
|
|
||||||
}
|
|
||||||
|
|
||||||
writeln!(io::stdout()).context("failed to write to stdout")?;
|
print_color_testing("8bit Color Testing", AnsiMode::Ansi256);
|
||||||
print_title_prompt(
|
print_color_testing("RGB Color Testing", AnsiMode::Rgb);
|
||||||
option_counter,
|
|
||||||
"Which &bcolor system &ado you want to use?",
|
println!();
|
||||||
color_mode,
|
print_title_prompt(option_counter, "Which &bcolor system &ado you want to use?");
|
||||||
)
|
println!("(If you can't see colors under \"RGB Color Testing\", please choose 8bit)\n");
|
||||||
.context("failed to print title prompt")?;
|
|
||||||
writeln!(
|
|
||||||
io::stdout(),
|
|
||||||
"(If you can't see colors under \"RGB Color Testing\", please choose 8bit)\n"
|
|
||||||
)
|
|
||||||
.context("failed to write message to stdout")?;
|
|
||||||
|
|
||||||
let choice = literal_input(
|
let choice = literal_input(
|
||||||
"Your choice?",
|
"Your choice?",
|
||||||
@@ -434,20 +422,14 @@ fn create_config(
|
|||||||
|
|
||||||
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
||||||
|
|
||||||
print_title_prompt(
|
print_title_prompt(option_counter, "Is your terminal in &blight mode&~ or &4dark mode&~?");
|
||||||
option_counter,
|
|
||||||
"Is your terminal in &blight mode&~ or &4dark mode&~?",
|
|
||||||
color_mode,
|
|
||||||
)
|
|
||||||
.context("failed to print title prompt")?;
|
|
||||||
let choice = literal_input(
|
let choice = literal_input(
|
||||||
"",
|
"",
|
||||||
TerminalTheme::VARIANTS,
|
TerminalTheme::VARIANTS,
|
||||||
TerminalTheme::Dark.as_ref(),
|
TerminalTheme::Dark.as_ref(),
|
||||||
true,
|
true,
|
||||||
color_mode,
|
color_mode,
|
||||||
)
|
)?;
|
||||||
.context("failed to ask for choice input")?;
|
|
||||||
Ok((
|
Ok((
|
||||||
choice.parse().expect("selected theme should be valid"),
|
choice.parse().expect("selected theme should be valid"),
|
||||||
"Selected background color",
|
"Selected background color",
|
||||||
@@ -518,18 +500,12 @@ fn create_config(
|
|||||||
|
|
||||||
let print_flag_page = |page, page_num: u8| -> Result<()> {
|
let print_flag_page = |page, page_num: u8| -> Result<()> {
|
||||||
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
||||||
print_title_prompt(option_counter, "Let's choose a flag!", color_mode)
|
print_title_prompt(option_counter, "Let's choose a flag!");
|
||||||
.context("failed to print title prompt")?;
|
println!("Available flag presets:\nPage: {page_num} of {num_pages}\n", page_num = page_num + 1);
|
||||||
writeln!(
|
|
||||||
io::stdout(),
|
|
||||||
"Available flag presets:\nPage: {page_num} of {num_pages}\n",
|
|
||||||
page_num = page_num.checked_add(1).unwrap()
|
|
||||||
)
|
|
||||||
.context("failed to write header to stdout")?;
|
|
||||||
for &row in page {
|
for &row in page {
|
||||||
print_flag_row(row, color_mode).context("failed to print flag row")?;
|
print_flag_row(row, color_mode).context("failed to print flag row")?;
|
||||||
}
|
}
|
||||||
writeln!(io::stdout()).context("failed to write to stdout")?;
|
println!();
|
||||||
Ok(())
|
Ok(())
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -541,7 +517,7 @@ fn create_config(
|
|||||||
}
|
}
|
||||||
printc(line.join(" "), color_mode).context("failed to print line")?;
|
printc(line.join(" "), color_mode).context("failed to print line")?;
|
||||||
}
|
}
|
||||||
writeln!(io::stdout()).context("failed to write to stdout")?;
|
println!();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -566,16 +542,9 @@ fn create_config(
|
|||||||
let mut opts: Vec<&str> = <Preset as VariantNames>::VARIANTS.into();
|
let mut opts: Vec<&str> = <Preset as VariantNames>::VARIANTS.into();
|
||||||
opts.extend(["next", "n", "prev", "p"]);
|
opts.extend(["next", "n", "prev", "p"]);
|
||||||
|
|
||||||
writeln!(
|
println!("Enter '[n]ext' to go to the next page and '[p]rev' to go to the previous page.");
|
||||||
io::stdout(),
|
|
||||||
"Enter '[n]ext' to go to the next page and '[p]rev' to go to the previous page."
|
|
||||||
)
|
|
||||||
.context("failed to write message to stdout")?;
|
|
||||||
let selection = literal_input(
|
let selection = literal_input(
|
||||||
format!(
|
format!("Which {preset_default_colored} do you want to use? "),
|
||||||
"Which {preset} do you want to use? ",
|
|
||||||
preset = preset_default_colored
|
|
||||||
),
|
|
||||||
&opts[..],
|
&opts[..],
|
||||||
Preset::Rainbow.as_ref(),
|
Preset::Rainbow.as_ref(),
|
||||||
false,
|
false,
|
||||||
@@ -624,22 +593,15 @@ fn create_config(
|
|||||||
|
|
||||||
let select_lightness = || -> Result<Lightness> {
|
let select_lightness = || -> Result<Lightness> {
|
||||||
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
||||||
print_title_prompt(
|
print_title_prompt(option_counter, "Let's adjust the color brightness!");
|
||||||
option_counter,
|
println!(
|
||||||
"Let's adjust the color brightness!",
|
|
||||||
color_mode,
|
|
||||||
)
|
|
||||||
.context("failed to print title prompt")?;
|
|
||||||
writeln!(
|
|
||||||
io::stdout(),
|
|
||||||
"The colors might be a little bit too {bright_dark} for {light_dark} mode.\n",
|
"The colors might be a little bit too {bright_dark} for {light_dark} mode.\n",
|
||||||
bright_dark = match theme {
|
bright_dark = match theme {
|
||||||
TerminalTheme::Light => "bright",
|
TerminalTheme::Light => "bright",
|
||||||
TerminalTheme::Dark => "dark",
|
TerminalTheme::Dark => "dark",
|
||||||
},
|
},
|
||||||
light_dark = theme.as_ref()
|
light_dark = theme.as_ref()
|
||||||
)
|
);
|
||||||
.context("failed to write message to stdout")?;
|
|
||||||
|
|
||||||
let color_align = ColorAlignment::Horizontal;
|
let color_align = ColorAlignment::Horizontal;
|
||||||
|
|
||||||
@@ -697,14 +659,10 @@ fn create_config(
|
|||||||
}
|
}
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
writeln!(
|
println!("\nWhich brightness level looks the best? (Default: {default:.0}% for {light_dark} mode)",
|
||||||
io::stdout(),
|
|
||||||
"\nWhich brightness level looks the best? (Default: {default:.0}% for \
|
|
||||||
{light_dark} mode)",
|
|
||||||
default = f32::from(default_lightness) * 100.0,
|
default = f32::from(default_lightness) * 100.0,
|
||||||
light_dark = theme.as_ref()
|
light_dark = theme.as_ref()
|
||||||
)
|
);
|
||||||
.context("failed to write prompt to stdout")?;
|
|
||||||
let lightness = input(Some("> "))
|
let lightness = input(Some("> "))
|
||||||
.context("failed to read input")?
|
.context("failed to read input")?
|
||||||
.trim()
|
.trim()
|
||||||
@@ -716,12 +674,7 @@ fn create_config(
|
|||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
debug!(%err, "could not parse lightness");
|
debug!(%err, "could not parse lightness");
|
||||||
printc(
|
printc!("&cUnable to parse lightness value, please enter a lightness value such as 45%, .45, or 45");
|
||||||
"&cUnable to parse lightness value, please enter a lightness value such \
|
|
||||||
as 45%, .45, or 45",
|
|
||||||
color_mode,
|
|
||||||
)
|
|
||||||
.context("failed to print message")?;
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -845,16 +798,11 @@ fn create_config(
|
|||||||
}
|
}
|
||||||
printc(line.join(" "), color_mode).context("failed to print ascii line")?;
|
printc(line.join(" "), color_mode).context("failed to print ascii line")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
writeln!(io::stdout()).context("failed to write to stdout")?;
|
println!();
|
||||||
}
|
}
|
||||||
|
|
||||||
print_title_prompt(
|
print_title_prompt(option_counter, "Do you want the default logo, or the small logo?");
|
||||||
option_counter,
|
|
||||||
"Do you want the default logo, or the small logo?",
|
|
||||||
color_mode,
|
|
||||||
)
|
|
||||||
.context("failed to print title prompt")?;
|
|
||||||
let opts: Vec<Cow<str>> = ["default", "small"].map(Into::into).into();
|
let opts: Vec<Cow<str>> = ["default", "small"].map(Into::into).into();
|
||||||
let choice = literal_input("Your choice?", &opts[..], "default", true, color_mode)
|
let choice = literal_input("Your choice?", &opts[..], "default", true, color_mode)
|
||||||
.context("failed to ask for choice input")
|
.context("failed to ask for choice input")
|
||||||
@@ -969,21 +917,11 @@ fn create_config(
|
|||||||
}
|
}
|
||||||
printc(line.join(" "), color_mode).context("failed to print ascii line")?;
|
printc(line.join(" "), color_mode).context("failed to print ascii line")?;
|
||||||
}
|
}
|
||||||
writeln!(io::stdout()).context("failed to write to stdout")?;
|
println!();
|
||||||
}
|
}
|
||||||
|
|
||||||
print_title_prompt(
|
print_title_prompt(option_counter, "Let's choose a color arrangement!");
|
||||||
option_counter,
|
println!("You can choose standard horizontal or vertical alignment, or use one of the random color schemes.\nYou can type \"roll\" to randomize again.\n");
|
||||||
"Let's choose a color arrangement!",
|
|
||||||
color_mode,
|
|
||||||
)
|
|
||||||
.context("failed to print title prompt")?;
|
|
||||||
writeln!(
|
|
||||||
io::stdout(),
|
|
||||||
"You can choose standard horizontal or vertical alignment, or use one of the random \
|
|
||||||
color schemes.\nYou can type \"roll\" to randomize again.\n"
|
|
||||||
)
|
|
||||||
.context("failed to write message to stdout")?;
|
|
||||||
let mut opts: Vec<Cow<str>> = ["horizontal", "vertical", "roll"].map(Into::into).into();
|
let mut opts: Vec<Cow<str>> = ["horizontal", "vertical", "roll"].map(Into::into).into();
|
||||||
opts.extend((0..random_count).map(|i| format!("random{i}").into()));
|
opts.extend((0..random_count).map(|i| format!("random{i}").into()));
|
||||||
let choice = literal_input("Your choice?", &opts[..], "horizontal", true, color_mode)
|
let choice = literal_input("Your choice?", &opts[..], "horizontal", true, color_mode)
|
||||||
@@ -1022,42 +960,27 @@ fn create_config(
|
|||||||
|
|
||||||
let select_backend = || -> Result<Backend> {
|
let select_backend = || -> Result<Backend> {
|
||||||
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
||||||
print_title_prompt(option_counter, "Select a *fetch backend", color_mode)
|
print_title_prompt(option_counter, "Select a *fetch backend");
|
||||||
.context("failed to print title prompt")?;
|
|
||||||
|
|
||||||
// Check if fastfetch is installed
|
// Check if fastfetch is installed
|
||||||
let fastfetch_path = fastfetch_path().ok();
|
let fastfetch_path = fastfetch_path().ok();
|
||||||
|
|
||||||
// Check if macchina is installed
|
// Check if macchina is installed
|
||||||
#[cfg(feature = "macchina")]
|
#[cfg(feature = "macchina")]
|
||||||
let macchina_path = macchina_path().context("failed to get macchina path")?;
|
let macchina_path = macchina_path().unwrap_or(None);
|
||||||
|
|
||||||
printc(
|
printc!("- &bneofetch&r: Written in bash, &nbest compatibility&r on Unix systems");
|
||||||
"- &bneofetch&r: Written in bash, &nbest compatibility&r on Unix systems",
|
printc!("- &bfastfetch&r: Written in C, &nbest performance&r {}",
|
||||||
color_mode,
|
fastfetch_path
|
||||||
)
|
.map(|path| format!("&a(Installed at {path})", path = path.display()))
|
||||||
.context("failed to print message")?;
|
.unwrap_or_else(|| "&c(Not installed)".to_owned())
|
||||||
printc(
|
);
|
||||||
format!(
|
|
||||||
"- &bfastfetch&r: Written in C, &nbest performance&r {installed_not_installed}",
|
|
||||||
installed_not_installed = fastfetch_path
|
|
||||||
.map(|path| format!("&a(Installed at {path})", path = path.display()))
|
|
||||||
.unwrap_or_else(|| "&c(Not installed)".to_owned())
|
|
||||||
),
|
|
||||||
color_mode,
|
|
||||||
)
|
|
||||||
.context("failed to print message")?;
|
|
||||||
#[cfg(feature = "macchina")]
|
#[cfg(feature = "macchina")]
|
||||||
printc(
|
printc!("- &bmacchina&r: Written in Rust, &nbest performance&r {}\n",
|
||||||
format!(
|
macchina_path
|
||||||
"- &bmacchina&r: Written in Rust, &nbest performance&r {installed_not_installed}\n",
|
.map(|path| format!("&a(Installed at {path})", path = path.display()))
|
||||||
installed_not_installed = macchina_path
|
.unwrap_or_else(|| "&c(Not installed)".to_owned())
|
||||||
.map(|path| format!("&a(Installed at {path})", path = path.display()))
|
);
|
||||||
.unwrap_or_else(|| "&c(Not installed)".to_owned())
|
|
||||||
),
|
|
||||||
color_mode,
|
|
||||||
)
|
|
||||||
.context("failed to print message")?;
|
|
||||||
|
|
||||||
let choice = literal_input(
|
let choice = literal_input(
|
||||||
"Your choice?",
|
"Your choice?",
|
||||||
@@ -1078,10 +1001,56 @@ fn create_config(
|
|||||||
backend.as_ref(),
|
backend.as_ref(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//////////////////////////////
|
||||||
|
// 8. Custom ASCII file
|
||||||
|
let mut custom_ascii_path: Option<String> = None;
|
||||||
|
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
||||||
|
let choice = literal_input(
|
||||||
|
"Do you want to specify a custom ASCII file?",
|
||||||
|
&["y", "n"],
|
||||||
|
"n",
|
||||||
|
true,
|
||||||
|
color_mode,
|
||||||
|
)
|
||||||
|
.context("failed to ask for choice input")?;
|
||||||
|
|
||||||
|
if choice == "y" {
|
||||||
|
loop {
|
||||||
|
let pth = input(Some("Path to custom ASCII file (must be UTF-8 encoded, empty to skip): "))?.trim().to_owned();
|
||||||
|
if pth.is_empty() {
|
||||||
|
printc!("&cNo path entered. Skipping custom ASCII file.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let pth_buf = PathBuf::from(&pth);
|
||||||
|
if !pth_buf.is_file() {
|
||||||
|
printc!("&cError: File not found at {pth}");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
match fs::read_to_string(&pth_buf) {
|
||||||
|
Ok(_) => {
|
||||||
|
custom_ascii_path = Some(pth);
|
||||||
|
update_title(
|
||||||
|
&mut title,
|
||||||
|
&mut option_counter,
|
||||||
|
"Custom ASCII file",
|
||||||
|
custom_ascii_path.as_ref().unwrap(),
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
printc!("&cError: File is not UTF-8 encoded or an unexpected error occurred: {e}");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create config
|
// Create config
|
||||||
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
||||||
let config = Config {
|
let config = Config {
|
||||||
preset,
|
preset: preset.as_ref().to_string(),
|
||||||
mode: color_mode,
|
mode: color_mode,
|
||||||
light_dark: Some(theme),
|
light_dark: Some(theme),
|
||||||
auto_detect_light_dark: Some(det_bg.is_some()),
|
auto_detect_light_dark: Some(det_bg.is_some()),
|
||||||
@@ -1091,6 +1060,7 @@ fn create_config(
|
|||||||
args: None,
|
args: None,
|
||||||
distro: logo_chosen,
|
distro: logo_chosen,
|
||||||
pride_month_disable: false,
|
pride_month_disable: false,
|
||||||
|
custom_ascii_path,
|
||||||
};
|
};
|
||||||
debug!(?config, "created config");
|
debug!(?config, "created config");
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use bpaf::ShellComp;
|
|||||||
use bpaf::{construct, long, OptionParser, Parser as _};
|
use bpaf::{construct, long, OptionParser, Parser as _};
|
||||||
use directories::BaseDirs;
|
use directories::BaseDirs;
|
||||||
use itertools::Itertools as _;
|
use itertools::Itertools as _;
|
||||||
use strum::{VariantArray, VariantNames};
|
use strum::VariantNames;
|
||||||
|
|
||||||
use crate::color_util::{color, Lightness};
|
use crate::color_util::{color, Lightness};
|
||||||
use crate::presets::Preset;
|
use crate::presets::Preset;
|
||||||
@@ -18,7 +18,7 @@ use crate::types::{AnsiMode, Backend};
|
|||||||
pub struct Options {
|
pub struct Options {
|
||||||
pub config: bool,
|
pub config: bool,
|
||||||
pub config_file: PathBuf,
|
pub config_file: PathBuf,
|
||||||
pub preset: Option<Preset>,
|
pub preset: Option<String>,
|
||||||
pub mode: Option<AnsiMode>,
|
pub mode: Option<AnsiMode>,
|
||||||
pub backend: Option<Backend>,
|
pub backend: Option<Backend>,
|
||||||
pub args: Option<Vec<String>>,
|
pub args: Option<Vec<String>>,
|
||||||
@@ -55,7 +55,7 @@ pub fn options() -> OptionParser<Options> {
|
|||||||
let preset = long("preset")
|
let preset = long("preset")
|
||||||
.short('p')
|
.short('p')
|
||||||
.help(&*format!(
|
.help(&*format!(
|
||||||
"Use preset
|
"Use preset or comma-separated color list or comma-separated hex colors (e.g., \"#ff0000,#00ff00,#0000ff\")
|
||||||
PRESET={{{presets}}}",
|
PRESET={{{presets}}}",
|
||||||
presets = <Preset as VariantNames>::VARIANTS
|
presets = <Preset as VariantNames>::VARIANTS
|
||||||
.iter()
|
.iter()
|
||||||
@@ -65,30 +65,7 @@ PRESET={{{presets}}}",
|
|||||||
.argument::<String>("PRESET");
|
.argument::<String>("PRESET");
|
||||||
#[cfg(feature = "autocomplete")]
|
#[cfg(feature = "autocomplete")]
|
||||||
let preset = preset.complete(complete_preset);
|
let preset = preset.complete(complete_preset);
|
||||||
let preset = preset
|
let preset = preset.optional();
|
||||||
.parse(|s| {
|
|
||||||
Preset::from_str(&s)
|
|
||||||
.or_else(|e| {
|
|
||||||
if s == "random" {
|
|
||||||
let mut rng = fastrand::Rng::new();
|
|
||||||
Ok(*rng
|
|
||||||
.choice(<Preset as VariantArray>::VARIANTS)
|
|
||||||
.expect("preset iterator should not be empty"))
|
|
||||||
} else {
|
|
||||||
Err(e)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.with_context(|| {
|
|
||||||
format!(
|
|
||||||
"PRESET should be one of {{{presets}}}",
|
|
||||||
presets = <Preset as VariantNames>::VARIANTS
|
|
||||||
.iter()
|
|
||||||
.chain(iter::once(&"random"))
|
|
||||||
.join(",")
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.optional();
|
|
||||||
let mode = long("mode")
|
let mode = long("mode")
|
||||||
.short('m')
|
.short('m')
|
||||||
.help(&*format!(
|
.help(&*format!(
|
||||||
|
|||||||
@@ -403,18 +403,20 @@ where
|
|||||||
Ok(dst)
|
Ok(dst)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! printc {
|
||||||
|
($($arg:tt)*) => {
|
||||||
|
println!("{}", color(format!("{}&r", format!($($arg)*)), AnsiMode::Rgb).expect("failed to color message"));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/// Prints with color.
|
/// Prints with color.
|
||||||
pub fn printc<S>(msg: S, mode: AnsiMode) -> Result<()>
|
pub fn printc<S>(msg: S, mode: AnsiMode) -> Result<()>
|
||||||
where
|
where
|
||||||
S: AsRef<str>,
|
S: AsRef<str>,
|
||||||
{
|
{
|
||||||
writeln!(
|
println!("{msg}", msg = color(format!("{msg}&r", msg = msg.as_ref()), mode).context("failed to color message")?);
|
||||||
io::stdout(),
|
Ok(())
|
||||||
"{msg}",
|
|
||||||
msg = color(format!("{msg}&r", msg = msg.as_ref()), mode)
|
|
||||||
.context("failed to color message")?
|
|
||||||
)
|
|
||||||
.context("failed to write message to stdout")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Clears screen using ANSI escape codes.
|
/// Clears screen using ANSI escape codes.
|
||||||
|
|||||||
@@ -2,12 +2,11 @@ use serde::{Deserialize, Serialize};
|
|||||||
|
|
||||||
use crate::color_util::Lightness;
|
use crate::color_util::Lightness;
|
||||||
use crate::neofetch_util::ColorAlignment;
|
use crate::neofetch_util::ColorAlignment;
|
||||||
use crate::presets::Preset;
|
|
||||||
use crate::types::{AnsiMode, Backend, TerminalTheme};
|
use crate::types::{AnsiMode, Backend, TerminalTheme};
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub preset: Preset,
|
pub preset: String,
|
||||||
pub mode: AnsiMode,
|
pub mode: AnsiMode,
|
||||||
pub auto_detect_light_dark: Option<bool>,
|
pub auto_detect_light_dark: Option<bool>,
|
||||||
pub light_dark: Option<TerminalTheme>,
|
pub light_dark: Option<TerminalTheme>,
|
||||||
@@ -19,6 +18,7 @@ pub struct Config {
|
|||||||
pub args: Option<Vec<String>>,
|
pub args: Option<Vec<String>>,
|
||||||
pub distro: Option<String>,
|
pub distro: Option<String>,
|
||||||
pub pride_month_disable: bool,
|
pub pride_month_disable: bool,
|
||||||
|
pub custom_ascii_path: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
|
|||||||
@@ -113,16 +113,12 @@ where
|
|||||||
};
|
};
|
||||||
|
|
||||||
if let Some(selected) = find_selection(&selection, options) {
|
if let Some(selected) = find_selection(&selection, options) {
|
||||||
writeln!(io::stdout()).context("failed to write to stdout")?;
|
println!();
|
||||||
|
|
||||||
return Ok(selected);
|
return Ok(selected);
|
||||||
} else {
|
} else {
|
||||||
let options_text = options.iter().map(AsRef::as_ref).join("|");
|
let options_text = options.iter().map(AsRef::as_ref).join("|");
|
||||||
writeln!(
|
println!("Invalid selection! {selection} is not one of {options_text}");
|
||||||
io::stdout(),
|
|
||||||
"Invalid selection! {selection} is not one of {options_text}"
|
|
||||||
)
|
|
||||||
.context("failed to write message to stdout")?;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,7 +281,7 @@ pub fn run(asc: RecoloredAsciiArt, backend: Backend, args: Option<&Vec<String>>)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Gets distro ascii width and height, ignoring color code.
|
/// Gets distro ascii width and height, ignoring color code.
|
||||||
pub fn ascii_size<S>(asc: S) -> Result<(u8, u8)>
|
pub fn ascii_size<S>(asc: S) -> Result<(u16, u16)>
|
||||||
where
|
where
|
||||||
S: AsRef<str>,
|
S: AsRef<str>,
|
||||||
{
|
{
|
||||||
@@ -307,25 +303,11 @@ where
|
|||||||
return Ok((0, 0));
|
return Ok((0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
let width = asc
|
let width = asc.lines()
|
||||||
.lines()
|
.map(|line| line.graphemes(true).count()).max()
|
||||||
.map(|line| line.graphemes(true).count())
|
|
||||||
.max()
|
|
||||||
.expect("line iterator should not be empty");
|
.expect("line iterator should not be empty");
|
||||||
let width: u8 = width.try_into().with_context(|| {
|
let width: u16 = width.try_into().context("ascii art width should fit in u16")?;
|
||||||
format!(
|
let height: u16 = asc.lines().count().try_into().context("ascii art height should fit in u16")?;
|
||||||
"`asc` should not have more than {limit} characters per line",
|
|
||||||
limit = u8::MAX
|
|
||||||
)
|
|
||||||
})?;
|
|
||||||
let height = asc.lines().count();
|
|
||||||
let height: u8 = height.try_into().with_context(|| {
|
|
||||||
format!(
|
|
||||||
"`asc` should not have more than {limit} lines",
|
|
||||||
limit = u8::MAX
|
|
||||||
)
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok((width, height))
|
Ok((width, height))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,13 +468,8 @@ pub fn get_distro_name(backend: Backend) -> Result<String> {
|
|||||||
match backend {
|
match backend {
|
||||||
Backend::Neofetch => run_neofetch_command_piped(&["ascii_distro_name"])
|
Backend::Neofetch => run_neofetch_command_piped(&["ascii_distro_name"])
|
||||||
.context("failed to get distro name from neofetch"),
|
.context("failed to get distro name from neofetch"),
|
||||||
Backend::Fastfetch => Ok(run_fastfetch_command_piped(&[
|
Backend::Fastfetch => Ok(run_fastfetch_command_piped(&["--logo", "none", "-c", "none", "-s", "OS",])
|
||||||
"--logo",
|
.context("failed to get distro name from fastfetch")?.replace("OS: ", "")),
|
||||||
"none",
|
|
||||||
"-s",
|
|
||||||
"OS",
|
|
||||||
"--disable-linewrap",
|
|
||||||
]).context("failed to get distro name from fastfetch")?.replace("OS: ", "")),
|
|
||||||
#[cfg(feature = "macchina")]
|
#[cfg(feature = "macchina")]
|
||||||
Backend::Macchina => {
|
Backend::Macchina => {
|
||||||
// Write ascii art to temp file
|
// Write ascii art to temp file
|
||||||
|
|||||||
@@ -63,6 +63,8 @@ pub enum Preset {
|
|||||||
|
|
||||||
Aromantic,
|
Aromantic,
|
||||||
|
|
||||||
|
Fictosexual,
|
||||||
|
|
||||||
Aroace1,
|
Aroace1,
|
||||||
|
|
||||||
Aroace2,
|
Aroace2,
|
||||||
@@ -111,6 +113,10 @@ pub enum Preset {
|
|||||||
|
|
||||||
Genderflux,
|
Genderflux,
|
||||||
|
|
||||||
|
Nullflux,
|
||||||
|
|
||||||
|
Hypergender, Hyperboy, Hypergirl, Hyperandrogyne, Hyperneutrois,
|
||||||
|
|
||||||
Finsexual,
|
Finsexual,
|
||||||
|
|
||||||
Unlabeled1,
|
Unlabeled1,
|
||||||
@@ -165,6 +171,8 @@ pub enum Preset {
|
|||||||
|
|
||||||
Twink,
|
Twink,
|
||||||
|
|
||||||
|
Adipophilia,
|
||||||
|
|
||||||
Kenochoric,
|
Kenochoric,
|
||||||
|
|
||||||
Veldian,
|
Veldian,
|
||||||
@@ -221,6 +229,10 @@ pub enum Preset {
|
|||||||
|
|
||||||
/// Meme flag
|
/// Meme flag
|
||||||
Band,
|
Band,
|
||||||
|
|
||||||
|
Libragender, Librafeminine, Libramasculine, Libraandrogyne, Libranonbinary,
|
||||||
|
|
||||||
|
Fluidfluxa, Fluidfluxb,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Eq, PartialEq, Debug)]
|
#[derive(Clone, Eq, PartialEq, Debug)]
|
||||||
@@ -304,6 +316,11 @@ impl Preset {
|
|||||||
"#3BA740", "#A8D47A", "#FFFFFF", "#ABABAB", "#000000",
|
"#3BA740", "#A8D47A", "#FFFFFF", "#ABABAB", "#000000",
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
// https://orientation.fandom.com/wiki/Fictosexual
|
||||||
|
Self::Fictosexual => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#000000", "#C4C4C4", "#A349A5", "#C4C4C4", "#000000",
|
||||||
|
]),
|
||||||
|
|
||||||
// sourced from https://flag.library.lgbt/flags/aroace/
|
// sourced from https://flag.library.lgbt/flags/aroace/
|
||||||
Self::Aroace1 => ColorProfile::from_hex_colors(vec![
|
Self::Aroace1 => ColorProfile::from_hex_colors(vec![
|
||||||
"#E28C00", "#ECCD00", "#FFFFFF", "#62AEDC", "#203856",
|
"#E28C00", "#ECCD00", "#FFFFFF", "#62AEDC", "#203856",
|
||||||
@@ -433,6 +450,30 @@ impl Preset {
|
|||||||
"f47694", "f2a2b9", "cecece", "7ce0f7", "3ecdf9", "fff48d",
|
"f47694", "f2a2b9", "cecece", "7ce0f7", "3ecdf9", "fff48d",
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
Self::Nullflux => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#0B0C0E", "#A28DB9", "#E1D4EF", "#F0E6DD", "#665858",
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Hypergender => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#EFEFEF", "#FFFFFF", "#FBFF75", "#000000", "#FBFF75", "#FFFFFF", "#EFEFEF",
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Hyperboy => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#EFEFEF", "#FFFFFF", "#74D7FE", "#000000", "#74D7FE", "#FFFFFF", "#EFEFEF",
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Hypergirl => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#EFEFEF", "#FFFFFF", "#FC76D3", "#000000", "#FC76D3", "#FFFFFF", "#EFEFEF",
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Hyperandrogyne => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#EFEFEF", "#FFFFFF", "#BB83FF", "#000000", "#BB83FF", "#FFFFFF", "#EFEFEF",
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Hyperneutrois => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#EFEFEF", "#FFFFFF", "#BAFA74", "#000000", "#BAFA74", "#FFFFFF", "#EFEFEF",
|
||||||
|
]),
|
||||||
|
|
||||||
// sourced from https://lgbtqia.wiki/wiki/Finsexual
|
// sourced from https://lgbtqia.wiki/wiki/Finsexual
|
||||||
Self::Finsexual => ColorProfile::from_hex_colors(vec![
|
Self::Finsexual => ColorProfile::from_hex_colors(vec![
|
||||||
"#B18EDF", "#D7B1E2", "#F7CDE9", "#F39FCE", "#EA7BB3",
|
"#B18EDF", "#D7B1E2", "#F7CDE9", "#F39FCE", "#EA7BB3",
|
||||||
@@ -543,6 +584,11 @@ impl Preset {
|
|||||||
// colorpicked from https://commons.wikimedia.org/wiki/File:Twink_Pride_Flag_(proposed).svg
|
// colorpicked from https://commons.wikimedia.org/wiki/File:Twink_Pride_Flag_(proposed).svg
|
||||||
Self::Twink => ColorProfile::from_hex_colors(vec!["#FFB2FF", "#FFFFFF", "#FFFF81"]),
|
Self::Twink => ColorProfile::from_hex_colors(vec!["#FFB2FF", "#FFFFFF", "#FFFF81"]),
|
||||||
|
|
||||||
|
// https://en.wikipedia.org/wiki/File:FatFetishFlag.png
|
||||||
|
Self::Adipophilia => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#000000", "#E16180", "#FFF9BE", "#603E41", "#000000",
|
||||||
|
]),
|
||||||
|
|
||||||
Self::Kenochoric => {
|
Self::Kenochoric => {
|
||||||
ColorProfile::from_hex_colors(vec!["#000000", "#2E1569", "#824DB7", "#C7A1D6"])
|
ColorProfile::from_hex_colors(vec!["#000000", "#2E1569", "#824DB7", "#C7A1D6"])
|
||||||
},
|
},
|
||||||
@@ -645,6 +691,33 @@ impl Preset {
|
|||||||
"#2670C0", "#F5BD00", "#DC0045", "#E0608E"
|
"#2670C0", "#F5BD00", "#DC0045", "#E0608E"
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
Self::Libragender => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#000000", "#808080", "#92D8E9", "#FFF544", "#FFB0CA", "#808080", "#000000"
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Librafeminine => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#000000", "#A3A3A3", "#FFFFFF", "#C6568F", "#FFFFFF", "#A3A3A3", "#000000"
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Libramasculine => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#000000", "#A3A3A3", "#FFFFFF", "#56C5C5", "#FFFFFF", "#A3A3A3", "#000000"
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Libraandrogyne => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#000000", "#A3A3A3", "#FFFFFF", "#9186B1", "#FFFFFF", "#A3A3A3", "#000000"
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Libranonbinary => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#000000", "#A3A3A3", "#FFFFFF", "#FFF987", "#FFFFFF", "#A3A3A3", "#000000"
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Fluidfluxa => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#ff115f", "#a34aa3", "#00a4e7", "#ffdf00", "#000000", "#ffed71", "#85daff", "#dbadda", "#fe8db1"
|
||||||
|
]),
|
||||||
|
|
||||||
|
Self::Fluidfluxb => ColorProfile::from_hex_colors(vec![
|
||||||
|
"#c6d1d2", "#f47b9d", "#f09f9b", "#e3f09e", "#75eeea", "#52d2ed", "#c6d1d2"
|
||||||
|
]),
|
||||||
})
|
})
|
||||||
.expect("preset color profiles should be valid")
|
.expect("preset color profiles should be valid")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,58 +47,32 @@ pub fn start_animation(color_mode: AnsiMode) -> Result<()> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let text = &TEXT_ASCII[1..TEXT_ASCII.len().checked_sub(1).unwrap()];
|
let text = &TEXT_ASCII[1..TEXT_ASCII.len().checked_sub(1).unwrap()];
|
||||||
let (text_width, text_height) =
|
let (text_w, text_h) = ascii_size(text)?;
|
||||||
ascii_size(text).expect("text ascii should have valid width and height");
|
|
||||||
let (text, text_width, text_height) = {
|
let (text, text_width, text_height) = {
|
||||||
const TEXT_BORDER_WIDTH: u16 = 2;
|
const TEXT_BORDER_WIDTH: u16 = 2;
|
||||||
const NOTICE_BORDER_WIDTH: u16 = 1;
|
const NOTICE_BORDER_WIDTH: u16 = 1;
|
||||||
const VERTICAL_MARGIN: u16 = 1;
|
const VERTICAL_MARGIN: u16 = 1;
|
||||||
let notice_w = NOTICE.len();
|
let notice_w: u16 = NOTICE.len().try_into()?;
|
||||||
let notice_w: u8 = notice_w
|
let notice_h: u16 = NOTICE.lines().count().try_into()?;
|
||||||
.try_into()
|
|
||||||
.expect("`NOTICE` width should fit in `u8`");
|
|
||||||
let notice_h = NOTICE.lines().count();
|
|
||||||
let notice_h: u8 = notice_h
|
|
||||||
.try_into()
|
|
||||||
.expect("`NOTICE` height should fit in `u8`");
|
|
||||||
let term_w_min = cmp::max(
|
let term_w_min = cmp::max(
|
||||||
u16::from(text_width)
|
text_w + TEXT_BORDER_WIDTH * 2,
|
||||||
.checked_add(TEXT_BORDER_WIDTH.checked_mul(2).unwrap())
|
notice_w + NOTICE_BORDER_WIDTH * 2,
|
||||||
.unwrap(),
|
|
||||||
u16::from(notice_w)
|
|
||||||
.checked_add(NOTICE_BORDER_WIDTH.checked_mul(2).unwrap())
|
|
||||||
.unwrap(),
|
|
||||||
);
|
);
|
||||||
let term_h_min = u16::from(text_height)
|
let term_h_min = u16::from(text_h) + notice_h + VERTICAL_MARGIN * 2;
|
||||||
.checked_add(notice_h.into())
|
|
||||||
.unwrap()
|
|
||||||
.checked_add(VERTICAL_MARGIN.checked_mul(2).unwrap())
|
|
||||||
.unwrap();
|
|
||||||
if w.get() >= term_w_min && h.get() >= term_h_min {
|
if w.get() >= term_w_min && h.get() >= term_h_min {
|
||||||
(text, text_width, text_height)
|
(text, text_w, text_h)
|
||||||
} else {
|
} else {
|
||||||
let text = &TEXT_ASCII_SMALL[1..TEXT_ASCII_SMALL.len().checked_sub(1).unwrap()];
|
let text = &TEXT_ASCII_SMALL[1..TEXT_ASCII_SMALL.len().checked_sub(1).unwrap()];
|
||||||
let (text_width, text_height) =
|
let (text_w, text_h) = ascii_size(text)?;
|
||||||
ascii_size(text).expect("text ascii should have valid width and height");
|
|
||||||
let term_w_min = cmp::max(
|
let term_w_min = cmp::max(
|
||||||
u16::from(text_width)
|
text_w + TEXT_BORDER_WIDTH * 2,
|
||||||
.checked_add(TEXT_BORDER_WIDTH.checked_mul(2).unwrap())
|
notice_w + NOTICE_BORDER_WIDTH * 2,
|
||||||
.unwrap(),
|
|
||||||
u16::from(notice_w)
|
|
||||||
.checked_add(NOTICE_BORDER_WIDTH.checked_mul(2).unwrap())
|
|
||||||
.unwrap(),
|
|
||||||
);
|
);
|
||||||
let term_h_min = u16::from(text_height)
|
let term_h_min = text_h + notice_h + VERTICAL_MARGIN * 2;
|
||||||
.checked_add(notice_h.into())
|
|
||||||
.unwrap()
|
|
||||||
.checked_add(VERTICAL_MARGIN.checked_mul(2).unwrap())
|
|
||||||
.unwrap();
|
|
||||||
if w.get() < term_w_min || h.get() < term_h_min {
|
if w.get() < term_w_min || h.get() < term_h_min {
|
||||||
return Err(anyhow!(
|
return Err(anyhow!("terminal size should be at least ({term_w_min} * {term_h_min})"));
|
||||||
"terminal size should be at least ({term_w_min} * {term_h_min})"
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
(text, text_width, text_height)
|
(text, text_w, text_h)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let text_lines: Vec<&str> = text.lines().collect();
|
let text_lines: Vec<&str> = text.lines().collect();
|
||||||
@@ -165,8 +139,7 @@ pub fn start_animation(color_mode: AnsiMode) -> Result<()> {
|
|||||||
.rem_euclid(colors.len())]
|
.rem_euclid(colors.len())]
|
||||||
.to_ansi_string(color_mode, ForegroundBackground::Background),
|
.to_ansi_string(color_mode, ForegroundBackground::Background),
|
||||||
fg = fg.to_ansi_string(color_mode, ForegroundBackground::Foreground)
|
fg = fg.to_ansi_string(color_mode, ForegroundBackground::Foreground)
|
||||||
)
|
)?;
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
// Loop over the width
|
// Loop over the width
|
||||||
for x in 0..w.get() {
|
for x in 0..w.get() {
|
||||||
@@ -176,27 +149,11 @@ pub fn start_animation(color_mode: AnsiMode) -> Result<()> {
|
|||||||
.wrapping_add_signed((2.0 * (y as f64 + 0.5 * frame as f64).sin()) as isize);
|
.wrapping_add_signed((2.0 * (y as f64 + 0.5 * frame as f64).sin()) as isize);
|
||||||
let y_text = text_start_y <= y && y < text_end_y;
|
let y_text = text_start_y <= y && y < text_end_y;
|
||||||
|
|
||||||
let border = 1u16
|
let border = 1u16 + if y == text_start_y || y == (text_end_y - 1) { 0 } else { 1 };
|
||||||
.checked_add(
|
let text_bounds_x1 = text_start_x - border;
|
||||||
if y == text_start_y || y == text_end_y.checked_sub(1).unwrap() {
|
let text_bounds_x2 = text_end_x - border;
|
||||||
0
|
let notice_bounds_x1 = notice_start_x - 1;
|
||||||
} else {
|
let notice_bounds_x2 = notice_end_x - 1;
|
||||||
1
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
let text_bounds_x1 = text_start_x
|
|
||||||
.checked_sub(border)
|
|
||||||
.expect("`text_start_x - border` should not underflow `u16`");
|
|
||||||
let text_bounds_x2 = text_end_x
|
|
||||||
.checked_add(border)
|
|
||||||
.expect("`text_end_x + border` should not overflow `u16`");
|
|
||||||
let notice_bounds_x1 = notice_start_x
|
|
||||||
.checked_sub(1)
|
|
||||||
.expect("`notice_start_x - 1` should not underflow `u16`");
|
|
||||||
let notice_bounds_x2 = notice_end_x
|
|
||||||
.checked_add(1)
|
|
||||||
.expect("`notice_end_x + 1` should not overflow `u16`");
|
|
||||||
|
|
||||||
// If it's a switching point
|
// If it's a switching point
|
||||||
if idx.rem_euclid(NonZeroUsize::from(block_width).get()) == 0
|
if idx.rem_euclid(NonZeroUsize::from(block_width).get()) == 0
|
||||||
@@ -215,19 +172,9 @@ pub fn start_animation(color_mode: AnsiMode) -> Result<()> {
|
|||||||
{
|
{
|
||||||
let c: LinSrgba = c.with_alpha(1.0).into_linear();
|
let c: LinSrgba = c.with_alpha(1.0).into_linear();
|
||||||
let c = Srgb::<u8>::from_linear(c.overlay(black).without_alpha());
|
let c = Srgb::<u8>::from_linear(c.overlay(black).without_alpha());
|
||||||
write!(
|
write!(buf, "{bg}", bg = c.to_ansi_string(color_mode, ForegroundBackground::Background))?;
|
||||||
buf,
|
|
||||||
"{bg}",
|
|
||||||
bg = c.to_ansi_string(color_mode, ForegroundBackground::Background),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
} else {
|
} else {
|
||||||
write!(
|
write!(buf, "{bg}", bg = c.to_ansi_string(color_mode, ForegroundBackground::Background))?;
|
||||||
buf,
|
|
||||||
"{bg}",
|
|
||||||
bg = c.to_ansi_string(color_mode, ForegroundBackground::Background),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,8 +187,7 @@ pub fn start_animation(color_mode: AnsiMode) -> Result<()> {
|
|||||||
.chars()
|
.chars()
|
||||||
.nth(usize::from(x.checked_sub(text_start_x).unwrap()))
|
.nth(usize::from(x.checked_sub(text_start_x).unwrap()))
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
)
|
)?;
|
||||||
.unwrap();
|
|
||||||
} else if y == notice_y && notice_start_x <= x && x < notice_end_x {
|
} else if y == notice_y && notice_start_x <= x && x < notice_end_x {
|
||||||
write!(
|
write!(
|
||||||
buf,
|
buf,
|
||||||
@@ -250,21 +196,15 @@ pub fn start_animation(color_mode: AnsiMode) -> Result<()> {
|
|||||||
.chars()
|
.chars()
|
||||||
.nth(usize::from(x.checked_sub(notice_start_x).unwrap()))
|
.nth(usize::from(x.checked_sub(notice_start_x).unwrap()))
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
)
|
)?;
|
||||||
.unwrap();
|
|
||||||
} else {
|
} else {
|
||||||
write!(buf, " ").unwrap();
|
write!(buf, " ")?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// New line if it isn't the last line
|
// New line if it isn't the last line
|
||||||
if y != h.get().checked_sub(1).unwrap() {
|
if y != h.get().checked_sub(1).unwrap() {
|
||||||
writeln!(
|
writeln!(buf, "{reset}", reset = color("&r", color_mode)?)?;
|
||||||
buf,
|
|
||||||
"{reset}",
|
|
||||||
reset = color("&r", color_mode).expect("reset should be valid"),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
||||||
.TH VERSION: "1" "August 2025" "Version: 2.0.1" "User Commands"
|
.TH VERSION: "1" "September 2025" "Version: 2.0.2" "User Commands"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
Version: \- manual page for Version: 2.0.1
|
Version: \- manual page for Version: 2.0.2
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B hyfetch
|
.B hyfetch
|
||||||
[\fI\,-c\/\fR] [\fI\,-C=CONFIG_FILE\/\fR] [\fI\,-p=PRESET\/\fR] [\fI\,-m=MODE\/\fR] [\fI\,-b=BACKEND\/\fR] [\fI\,--args=ARGS\/\fR] [\fI\,--c-scale=\/\fR
|
[\fI\,-c\/\fR] [\fI\,-C=CONFIG_FILE\/\fR] [\fI\,-p=PRESET\/\fR] [\fI\,-m=MODE\/\fR] [\fI\,-b=BACKEND\/\fR] [\fI\,--args=ARGS\/\fR] [\fI\,--c-scale=\/\fR
|
||||||
@@ -21,7 +21,7 @@ Use another config file
|
|||||||
.TP
|
.TP
|
||||||
\fB\-p\fR, \fB\-\-preset\fR=\fI\,PRESET\/\fR
|
\fB\-p\fR, \fB\-\-preset\fR=\fI\,PRESET\/\fR
|
||||||
Use preset
|
Use preset
|
||||||
PRESET={rainbow,transgender,nonbinary,xenogender,agender,queer,genderfluid,bisexual,pansexual,polysexual,omnisexual,omniromantic,gay\-men,lesbian,abrosexual,asexual,aromantic,aroace1,aroace2,aroace3,greysexual,autosexual,intergender,greygender,akiosexual,bigender,demigender,demiboy,demigirl,transmasculine,transfeminine,genderfaun,demifaun,genderfae,demifae,neutrois,biromantic1,autoromantic,boyflux2,girlflux,genderflux,finsexual,unlabeled1,unlabeled2,pangender,pangender.contrast,gendernonconforming1,gendernonconforming2,femboy,tomboy,gynesexual,androsexual,gendervoid,voidgirl,voidboy,nonhuman\-unity,caninekin,plural,fraysexual,bear,butch,leather,otter,twink,kenochoric,veldian,solian,lunian,polyam,sapphic,androgyne,interprogress,progress,intersex,old\-polyam,equal\-rights,drag,pronounfluid,pronounflux,exipronoun,neopronoun,neofluid,genderqueer,cisgender,baker,beiyang,burger,throatlozenges,band,random}
|
PRESET={rainbow,transgender,nonbinary,xenogender,agender,queer,genderfluid,bisexual,pansexual,polysexual,omnisexual,omniromantic,gay\-men,lesbian,abrosexual,asexual,aromantic,fictosexual,aroace1,aroace2,aroace3,greysexual,autosexual,intergender,greygender,akiosexual,bigender,demigender,demiboy,demigirl,transmasculine,transfeminine,genderfaun,demifaun,genderfae,demifae,neutrois,biromantic1,autoromantic,boyflux2,girlflux,genderflux,nullflux,hypergender,hyperboy,hypergirl,hyperandrogyne,hyperneutrois,finsexual,unlabeled1,unlabeled2,pangender,pangender.contrast,gendernonconforming1,gendernonconforming2,femboy,tomboy,gynesexual,androsexual,gendervoid,voidgirl,voidboy,nonhuman\-unity,caninekin,plural,fraysexual,bear,butch,leather,otter,twink,adipophilia,kenochoric,veldian,solian,lunian,polyam,sapphic,androgyne,interprogress,progress,intersex,old\-polyam,equal\-rights,drag,pronounfluid,pronounflux,exipronoun,neopronoun,neofluid,genderqueer,cisgender,baker,beiyang,burger,throatlozenges,band,random}
|
||||||
.TP
|
.TP
|
||||||
\fB\-m\fR, \fB\-\-mode\fR=\fI\,MODE\/\fR
|
\fB\-m\fR, \fB\-\-mode\fR=\fI\,MODE\/\fR
|
||||||
Color mode MODE={8bit,rgb}
|
Color mode MODE={8bit,rgb}
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
||||||
.TH NEOFETCH "1" "August 2025" "Neofetch 8.0.1" "User Commands"
|
.TH NEOFETCH "1" "September 2025" "Neofetch 8.0.2" "User Commands"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
Neofetch \- manual page for Neofetch 8.0.1
|
Neofetch \- manual page for Neofetch 8.0.2
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B neofetch
|
.B neofetch
|
||||||
\fI\,func_name --option "value" --option "value"\/\fR
|
\fI\,func_name --option "value" --option "value"\/\fR
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
VERSION = '2.0.1'
|
VERSION = '2.0.2'
|
||||||
|
|||||||
+11
-3
@@ -135,9 +135,17 @@ class RGB:
|
|||||||
:return: RGB object
|
:return: RGB object
|
||||||
"""
|
"""
|
||||||
hex = hex.lstrip("#")
|
hex = hex.lstrip("#")
|
||||||
r = int(hex[0:2], 16)
|
|
||||||
g = int(hex[2:4], 16)
|
if len(hex) == 6:
|
||||||
b = int(hex[4:6], 16)
|
r = int(hex[0:2], 16)
|
||||||
|
g = int(hex[2:4], 16)
|
||||||
|
b = int(hex[4:6], 16)
|
||||||
|
elif len(hex) == 3:
|
||||||
|
r = int(hex[0], 16)
|
||||||
|
g = int(hex[1], 16)
|
||||||
|
b = int(hex[2], 16)
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Error: invalid hex length")
|
||||||
return cls(r, g, b)
|
return cls(r, g, b)
|
||||||
|
|
||||||
def to_ansi_rgb(self, foreground: bool = True) -> str:
|
def to_ansi_rgb(self, foreground: bool = True) -> str:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
from . import AsciiArt
|
from . import AsciiArt
|
||||||
|
|
||||||
nixos_small = AsciiArt(match=r'''"nixos_small"''', color='4 6', ascii=r"""
|
nixos_small = AsciiArt(match=r'''"nixos_small"''', color='4 6', ascii=r"""
|
||||||
${c1} \\ \\ //
|
${c1} \\ \\ //
|
||||||
==\\__\\/ //
|
==\\__\\/ //
|
||||||
// \\//
|
// \\//
|
||||||
==// //==
|
==// //==
|
||||||
|
|||||||
+67
-6
@@ -5,6 +5,7 @@ import argparse
|
|||||||
import datetime
|
import datetime
|
||||||
import importlib.util
|
import importlib.util
|
||||||
import json
|
import json
|
||||||
|
import os
|
||||||
import random
|
import random
|
||||||
import traceback
|
import traceback
|
||||||
from itertools import permutations, islice
|
from itertools import permutations, islice
|
||||||
@@ -17,7 +18,7 @@ from .constants import *
|
|||||||
from .font_logo import get_font_logo
|
from .font_logo import get_font_logo
|
||||||
from .models import Config
|
from .models import Config
|
||||||
from .neofetch_util import *
|
from .neofetch_util import *
|
||||||
from .presets import PRESETS
|
from .presets import PRESETS, ColorProfile
|
||||||
|
|
||||||
|
|
||||||
def check_config(path) -> Config:
|
def check_config(path) -> Config:
|
||||||
@@ -318,9 +319,49 @@ def create_config() -> Config:
|
|||||||
backend = select_backend()
|
backend = select_backend()
|
||||||
update_title('Selected backend', backend)
|
update_title('Selected backend', backend)
|
||||||
|
|
||||||
|
##############################
|
||||||
|
# 7. Custom ASCII file
|
||||||
|
custom_ascii_path = None
|
||||||
|
clear_screen(title)
|
||||||
|
if literal_input('Do you want to specify a custom ASCII file?', ['y', 'n'], 'n') == 'y':
|
||||||
|
while True:
|
||||||
|
path_input = input('Path to custom ASCII file (must be .txt and UTF-8 encoded): ').strip()
|
||||||
|
if not path_input:
|
||||||
|
printc('&cNo path entered. Skipping custom ASCII file.')
|
||||||
|
break
|
||||||
|
|
||||||
|
custom_path = Path(path_input)
|
||||||
|
if not custom_path.is_file():
|
||||||
|
printc(f'&cError: File not found at {path_input}')
|
||||||
|
if literal_input('Try again?', ['y', 'n'], 'y') == 'n':
|
||||||
|
break
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not custom_path.suffix == '.txt':
|
||||||
|
printc(f'&cError: File must have a .txt extension. Found {custom_path.suffix}')
|
||||||
|
if literal_input('Try again?', ['y', 'n'], 'y') == 'n':
|
||||||
|
break
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
custom_path.read_text('utf-8')
|
||||||
|
custom_ascii_path = str(custom_path)
|
||||||
|
update_title('Custom ASCII file', custom_ascii_path)
|
||||||
|
break
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
printc(f'&cError: File is not UTF-8 encoded.')
|
||||||
|
if literal_input('Try again?', ['y', 'n'], 'y') == 'n':
|
||||||
|
break
|
||||||
|
continue
|
||||||
|
except Exception as e:
|
||||||
|
printc(f'&cAn unexpected error occurred: {e}')
|
||||||
|
if literal_input('Try again?', ['y', 'n'], 'y') == 'n':
|
||||||
|
break
|
||||||
|
continue
|
||||||
|
|
||||||
# Create config
|
# Create config
|
||||||
clear_screen(title)
|
clear_screen(title)
|
||||||
c = Config(preset, color_system, light_dark, lightness, color_alignment, backend)
|
c = Config(preset, color_system, light_dark, lightness, color_alignment, backend, custom_ascii_path=custom_ascii_path)
|
||||||
|
|
||||||
# Save config
|
# Save config
|
||||||
print()
|
print()
|
||||||
@@ -338,7 +379,7 @@ def create_parser() -> argparse.ArgumentParser:
|
|||||||
|
|
||||||
parser.add_argument('-c', '--config', action='store_true', help=color(f'Configure hyfetch'))
|
parser.add_argument('-c', '--config', action='store_true', help=color(f'Configure hyfetch'))
|
||||||
parser.add_argument('-C', '--config-file', dest='config_file', default=CONFIG_PATH, help=f'Use another config file')
|
parser.add_argument('-C', '--config-file', dest='config_file', default=CONFIG_PATH, help=f'Use another config file')
|
||||||
parser.add_argument('-p', '--preset', help=f'Use preset', choices=list(PRESETS.keys()) + ['random'])
|
parser.add_argument('-p', '--preset', help=f'Use preset or comma-separated hex color list (e.g., "#ff0000,#00ff00,#0000ff")')
|
||||||
parser.add_argument('-m', '--mode', help=f'Color mode', choices=['8bit', 'rgb'])
|
parser.add_argument('-m', '--mode', help=f'Color mode', choices=['8bit', 'rgb'])
|
||||||
parser.add_argument('-b', '--backend', help=f'Choose a *fetch backend', choices=['qwqfetch', 'neofetch', 'fastfetch', 'fastfetch-old'])
|
parser.add_argument('-b', '--backend', help=f'Choose a *fetch backend', choices=['qwqfetch', 'neofetch', 'fastfetch', 'fastfetch-old'])
|
||||||
parser.add_argument('--args', help=f'Additional arguments pass-through to backend')
|
parser.add_argument('--args', help=f'Additional arguments pass-through to backend')
|
||||||
@@ -382,7 +423,7 @@ def run():
|
|||||||
GLOBAL_CFG.use_overlay = args.overlay
|
GLOBAL_CFG.use_overlay = args.overlay
|
||||||
|
|
||||||
if args.version:
|
if args.version:
|
||||||
print(f'Version is {VERSION}')
|
print(f'Version is 1.99.∞\n(python hyfetch legacy mode)')
|
||||||
return
|
return
|
||||||
|
|
||||||
# Ensure git bash for windows
|
# Ensure git bash for windows
|
||||||
@@ -451,7 +492,21 @@ def run():
|
|||||||
GLOBAL_CFG.is_light = config.light_dark == 'light'
|
GLOBAL_CFG.is_light = config.light_dark == 'light'
|
||||||
|
|
||||||
# Get preset
|
# Get preset
|
||||||
preset = PRESETS.get(config.preset)
|
preset = None
|
||||||
|
if config.preset in PRESETS:
|
||||||
|
preset = PRESETS.get(config.preset)
|
||||||
|
elif '#' in config.preset:
|
||||||
|
colors = [color.strip() for color in config.preset.split(',')]
|
||||||
|
|
||||||
|
for color in colors:
|
||||||
|
if not (color.startswith('#') and len(color) in [4, 7] and all(c in '0123456789abcdefABCDEF' for c in color[1:])):
|
||||||
|
print(f'Error: invalid hex color "{color}"')
|
||||||
|
preset = ColorProfile(colors)
|
||||||
|
else:
|
||||||
|
print(f'Preset should be a comma-separated list of hex colors, or one of the following: {', '.join(sorted(PRESETS.keys()))}')
|
||||||
|
|
||||||
|
if preset is None:
|
||||||
|
exit(1)
|
||||||
|
|
||||||
# Lighten (args > config)
|
# Lighten (args > config)
|
||||||
if args.scale:
|
if args.scale:
|
||||||
@@ -463,8 +518,14 @@ def run():
|
|||||||
|
|
||||||
# Run
|
# Run
|
||||||
try:
|
try:
|
||||||
asc = get_distro_ascii() if not args.ascii_file else Path(args.ascii_file).read_text("utf-8")
|
if config.custom_ascii_path:
|
||||||
|
asc = Path(config.custom_ascii_path).read_text("utf-8")
|
||||||
|
elif args.ascii_file:
|
||||||
|
asc = Path(args.ascii_file).read_text("utf-8")
|
||||||
|
else:
|
||||||
|
asc = get_distro_ascii()
|
||||||
asc = config.color_align.recolor_ascii(asc, preset)
|
asc = config.color_align.recolor_ascii(asc, preset)
|
||||||
|
asc = '\n'.join(asc.split('\n')[1:])
|
||||||
neofetch_util.run(asc, config.backend, config.args or '')
|
neofetch_util.run(asc, config.backend, config.args or '')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f'Error: {e}')
|
print(f'Error: {e}')
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ class Config:
|
|||||||
distro: str | None = None
|
distro: str | None = None
|
||||||
pride_month_shown: list[int] = field(default_factory=list) # This is deprecated, see issue #136
|
pride_month_shown: list[int] = field(default_factory=list) # This is deprecated, see issue #136
|
||||||
pride_month_disable: bool = False
|
pride_month_disable: bool = False
|
||||||
|
custom_ascii_path: str | None = None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_dict(cls, d: dict):
|
def from_dict(cls, d: dict):
|
||||||
|
|||||||
@@ -300,6 +300,9 @@ PRESETS: dict[str, ColorProfile] = {
|
|||||||
'#ABABAB',
|
'#ABABAB',
|
||||||
'#000000'
|
'#000000'
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
# https://orientation.fandom.com/wiki/Fictosexual
|
||||||
|
'fictosexual': ColorProfile(["#000000", "#C4C4C4", "#A349A5", "#C4C4C4", "#000000"]),
|
||||||
|
|
||||||
# aroace1 sourced from https://flag.library.lgbt/flags/aroace/
|
# aroace1 sourced from https://flag.library.lgbt/flags/aroace/
|
||||||
'aroace1': ColorProfile([
|
'aroace1': ColorProfile([
|
||||||
@@ -550,6 +553,27 @@ PRESETS: dict[str, ColorProfile] = {
|
|||||||
"3ecdf9",
|
"3ecdf9",
|
||||||
"fff48d",
|
"fff48d",
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
# https://lgbtqia.wiki/wiki/Gendernull
|
||||||
|
'nullflux': ColorProfile([
|
||||||
|
'#0B0C0E', '#A28DB9', '#E1D4EF', '#F0E6DD', '#665858',
|
||||||
|
]),
|
||||||
|
|
||||||
|
'hypergender': ColorProfile([
|
||||||
|
"#EFEFEF", "#FFFFFF", "#FBFF75", "#000000", "#FBFF75", "#FFFFFF", "#EFEFEF",
|
||||||
|
]),
|
||||||
|
'hyperboy': ColorProfile([
|
||||||
|
"#EFEFEF", "#FFFFFF", "#74D7FE", "#000000", "#74D7FE", "#FFFFFF", "#EFEFEF",
|
||||||
|
]),
|
||||||
|
'hypergirl': ColorProfile([
|
||||||
|
"#EFEFEF", "#FFFFFF", "#FC76D3", "#000000", "#FC76D3", "#FFFFFF", "#EFEFEF",
|
||||||
|
]),
|
||||||
|
'hyperandrogyne': ColorProfile([
|
||||||
|
"#EFEFEF", "#FFFFFF", "#BB83FF", "#000000", "#BB83FF", "#FFFFFF", "#EFEFEF",
|
||||||
|
]),
|
||||||
|
'hyperneutrois': ColorProfile([
|
||||||
|
"#EFEFEF", "#FFFFFF", "#BAFA74", "#000000", "#BAFA74", "#FFFFFF", "#EFEFEF",
|
||||||
|
]),
|
||||||
|
|
||||||
"finsexual": ColorProfile([
|
"finsexual": ColorProfile([
|
||||||
"#B18EDF",
|
"#B18EDF",
|
||||||
@@ -751,6 +775,9 @@ PRESETS: dict[str, ColorProfile] = {
|
|||||||
'#FFFFFF',
|
'#FFFFFF',
|
||||||
'#FFFF81',
|
'#FFFF81',
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
# https://en.wikipedia.org/wiki/File:FatFetishFlag.png
|
||||||
|
'adipophilia': ColorProfile(["#000000", "#E16180", "#FFF9BE", "#603E41", "#000000"]),
|
||||||
|
|
||||||
'kenochoric': ColorProfile([
|
'kenochoric': ColorProfile([
|
||||||
'#000000',
|
'#000000',
|
||||||
@@ -984,4 +1011,85 @@ PRESETS: dict[str, ColorProfile] = {
|
|||||||
"#dc0045",
|
"#dc0045",
|
||||||
"#e0608e"
|
"#e0608e"
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
# Adding libragender flags https://lgbtqia.wiki/wiki/Libragender
|
||||||
|
# Sourced from https://lgbtqia.wiki/wiki/Libragender
|
||||||
|
'libragender': ColorProfile([
|
||||||
|
"#000000",
|
||||||
|
"#808080",
|
||||||
|
"#92D8E9",
|
||||||
|
"#FFF544",
|
||||||
|
"#FFB0CA",
|
||||||
|
"#808080",
|
||||||
|
"#000000"
|
||||||
|
]),
|
||||||
|
|
||||||
|
# Sourced from https://lgbtqia.wiki/wiki/Librafeminine
|
||||||
|
'librafeminine': ColorProfile([
|
||||||
|
"#000000",
|
||||||
|
"#A3A3A3",
|
||||||
|
"#FFFFFF",
|
||||||
|
"#C6568F",
|
||||||
|
"#FFFFFF",
|
||||||
|
"#A3A3A3",
|
||||||
|
"#000000"
|
||||||
|
]),
|
||||||
|
|
||||||
|
# Sourced from https://lgbtqia.wiki/wiki/Libramasculine
|
||||||
|
'libramasculine': ColorProfile([
|
||||||
|
"#000000",
|
||||||
|
"#A3A3A3",
|
||||||
|
"#FFFFFF",
|
||||||
|
"#56C5C5",
|
||||||
|
"#FFFFFF",
|
||||||
|
"#A3A3A3",
|
||||||
|
"#000000"
|
||||||
|
]),
|
||||||
|
|
||||||
|
# Sourced from https://lgbtqia.wiki/wiki/Librandrogyne
|
||||||
|
'libraandrogyne': ColorProfile([
|
||||||
|
"#000000",
|
||||||
|
"#A3A3A3",
|
||||||
|
"#FFFFFF",
|
||||||
|
"#9186B1",
|
||||||
|
"#FFFFFF",
|
||||||
|
"#A3A3A3",
|
||||||
|
"#000000"
|
||||||
|
]),
|
||||||
|
|
||||||
|
# Sourced from https://lgbtqia.wiki/wiki/Libranonbinary
|
||||||
|
'libranonbinary': ColorProfile([
|
||||||
|
"#000000",
|
||||||
|
"#A3A3A3",
|
||||||
|
"#FFFFFF",
|
||||||
|
"#FFF987",
|
||||||
|
"#FFFFFF",
|
||||||
|
"#A3A3A3",
|
||||||
|
"#000000"
|
||||||
|
]),
|
||||||
|
|
||||||
|
# Adding Fluidflux flags - ObsoleteDev
|
||||||
|
# Sourced from https://gender.fandom.com/wiki/Fluidflux?file=FC90B24D-CA36-4FE2-A752-C9ABFC65E332.jpeg
|
||||||
|
|
||||||
|
'fluidflux A': ColorProfile([
|
||||||
|
"#ff115f",
|
||||||
|
"#a34aa3",
|
||||||
|
"#00a4e7",
|
||||||
|
"#ffdf00",
|
||||||
|
"#000000",
|
||||||
|
"#ffed71",
|
||||||
|
"#85daff",
|
||||||
|
"#dbadda",
|
||||||
|
"#fe8db1"
|
||||||
|
]),
|
||||||
|
|
||||||
|
'fluidflux B': ColorProfile([
|
||||||
|
"#c6d1d2",
|
||||||
|
"#f47b9d",
|
||||||
|
"#f09f9b",
|
||||||
|
"#e3f09e",
|
||||||
|
"#75eeea",
|
||||||
|
"#52d2ed",
|
||||||
|
"#c6d1d2"
|
||||||
|
]),
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -1,3 +1,4 @@
|
|||||||
|
import os
|
||||||
import platform
|
import platform
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
@@ -12,7 +13,9 @@ def run_rust():
|
|||||||
pd = Path(__file__).parent.joinpath('rust')
|
pd = Path(__file__).parent.joinpath('rust')
|
||||||
pd = pd.joinpath('hyfetch.exe' if platform.system() == 'Windows' else 'hyfetch')
|
pd = pd.joinpath('hyfetch.exe' if platform.system() == 'Windows' else 'hyfetch')
|
||||||
if not pd.exists():
|
if not pd.exists():
|
||||||
printc('&cThe rust executable is not found, falling back to python...')
|
if 'HYFETCH_DONT_WARN_RUST' not in os.environ:
|
||||||
|
printc('&cThe executable for hyfetch v2 (rust) is not found, falling back to legacy v1.99.∞ (python).\n'
|
||||||
|
'You can add environment variable HYFETCH_DONT_WARN_RUST=1 to suppress this warning.\n')
|
||||||
run_py()
|
run_py()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
# SOFTWARE.
|
# SOFTWARE.
|
||||||
|
|
||||||
version=8.0.1
|
version=8.0.2
|
||||||
|
|
||||||
# Fallback to a value of '5' for shells which support bash
|
# Fallback to a value of '5' for shells which support bash
|
||||||
# but do not set the 'BASH_' shell variables (osh).
|
# but do not set the 'BASH_' shell variables (osh).
|
||||||
@@ -225,7 +225,7 @@ package_managers="on"
|
|||||||
|
|
||||||
|
|
||||||
# Show separate user and system packages for supported package managers
|
# Show separate user and system packages for supported package managers
|
||||||
#
|
#
|
||||||
# Default: 'on'
|
# Default: 'on'
|
||||||
# Values: 'on', 'off'
|
# Values: 'on', 'off'
|
||||||
# Flag: --package_separate
|
# Flag: --package_separate
|
||||||
@@ -1145,7 +1145,7 @@ get_distro() {
|
|||||||
on|tiny) distro="LindowsOS" ;;
|
on|tiny) distro="LindowsOS" ;;
|
||||||
*) distro="$(awk '/Version/ {print $2,$3}' /etc/lindowsos-version)"
|
*) distro="$(awk '/Version/ {print $2,$3}' /etc/lindowsos-version)"
|
||||||
esac
|
esac
|
||||||
|
|
||||||
elif [[ -f /etc/astra_version ]]; then
|
elif [[ -f /etc/astra_version ]]; then
|
||||||
distro="Astra Linux"
|
distro="Astra Linux"
|
||||||
distro_version="$(sed -nr 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p' < /etc/astra_version)"
|
distro_version="$(sed -nr 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p' < /etc/astra_version)"
|
||||||
@@ -1349,7 +1349,7 @@ get_distro() {
|
|||||||
windows_version_verbose=$(trim "${windows_version_verbose/REG_SZ}")
|
windows_version_verbose=$(trim "${windows_version_verbose/REG_SZ}")
|
||||||
buildnumber=$(reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -v CurrentBuildNumber | grep REG_)
|
buildnumber=$(reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -v CurrentBuildNumber | grep REG_)
|
||||||
windows_version_verbose=$(trim "${windows_version_verbose/Windows}")
|
windows_version_verbose=$(trim "${windows_version_verbose/Windows}")
|
||||||
windows_buildnumber=$(reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -v CurrentBuildNumber | grep REG_)
|
windows_buildnumber=$(reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -v CurrentBuildNumber | grep REG_)
|
||||||
windows_buildnumber=${buildnumber/CurrentBuildNumber}
|
windows_buildnumber=${buildnumber/CurrentBuildNumber}
|
||||||
windows_buildnumber=${buildnumber/REG_SZ}
|
windows_buildnumber=${buildnumber/REG_SZ}
|
||||||
if [[ "$windows_version_verbose" == *"10"* ]] && (( windows_buildnumber >= 22000 )); then
|
if [[ "$windows_version_verbose" == *"10"* ]] && (( windows_buildnumber >= 22000 )); then
|
||||||
@@ -1823,6 +1823,10 @@ get_model() {
|
|||||||
iPod5,1): "iPod touch 5G" ;;
|
iPod5,1): "iPod touch 5G" ;;
|
||||||
iPod7,1): "iPod touch 6G" ;;
|
iPod7,1): "iPod touch 6G" ;;
|
||||||
iPod9,1): "iPod touch 7G" ;;
|
iPod9,1): "iPod touch 7G" ;;
|
||||||
|
|
||||||
|
AppleTV2,1): "Apple TV 2" ;;
|
||||||
|
AppleTV3,1): "Apple TV 3" ;;
|
||||||
|
AppleTV3,2): "Apple TV 3 (2013)" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
model=$_
|
model=$_
|
||||||
@@ -1936,7 +1940,7 @@ get_kernel() {
|
|||||||
*) kernel=${ver} ;;
|
*) kernel=${ver} ;;
|
||||||
esac
|
esac
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
# In Interix the Kernel version is commonly comprised of the host OS build number,
|
# In Interix the Kernel version is commonly comprised of the host OS build number,
|
||||||
# OS architecture and Interix build number
|
# OS architecture and Interix build number
|
||||||
@@ -2193,7 +2197,7 @@ get_packages() {
|
|||||||
has radula && tot radula -cl
|
has radula && tot radula -cl
|
||||||
# https://github.com/birb-linux/birb
|
# https://github.com/birb-linux/birb
|
||||||
has birb && tot birb --list-installed
|
has birb && tot birb --list-installed
|
||||||
|
|
||||||
has port && pkgs_h=1 tot port installed && ((packages-=1))
|
has port && pkgs_h=1 tot port installed && ((packages-=1))
|
||||||
|
|
||||||
# Using the dnf package cache is much faster than rpm.
|
# Using the dnf package cache is much faster than rpm.
|
||||||
@@ -2324,7 +2328,7 @@ get_packages() {
|
|||||||
has snap && ps -e | grep -qFm 1 snapd >/dev/null && \
|
has snap && ps -e | grep -qFm 1 snapd >/dev/null && \
|
||||||
pkgs_h=1 tot snap list && ((packages-=1))
|
pkgs_h=1 tot snap list && ((packages-=1))
|
||||||
|
|
||||||
# Get AppImageLauncher Application directory,
|
# Get AppImageLauncher Application directory,
|
||||||
# See: https://github.com/TheAssassin/AppImageLauncher/wiki/Configuration#settings-file
|
# See: https://github.com/TheAssassin/AppImageLauncher/wiki/Configuration#settings-file
|
||||||
manager=appimage && has appimaged || [ -f "$HOME"/.config/appimagelauncher.cfg ] &&
|
manager=appimage && has appimaged || [ -f "$HOME"/.config/appimagelauncher.cfg ] &&
|
||||||
if [ -f "$HOME"/.config/appimagelauncher.cfg ]; then
|
if [ -f "$HOME"/.config/appimagelauncher.cfg ]; then
|
||||||
@@ -2336,7 +2340,7 @@ get_packages() {
|
|||||||
AIDIR="$HOME/.local/bin"
|
AIDIR="$HOME/.local/bin"
|
||||||
fi &&
|
fi &&
|
||||||
dir "$AIDIR/*.[Aa]pp[Ii]mage \
|
dir "$AIDIR/*.[Aa]pp[Ii]mage \
|
||||||
$ALDIR/*.[Aa]pp[Ii]mage"
|
$ALDIR/*.[Aa]pp[Ii]mage"
|
||||||
|
|
||||||
# Has devbox & is initialized
|
# Has devbox & is initialized
|
||||||
has devbox && [[ "$(devbox global list)" != *"not activated"* ]] && tot devbox global list
|
has devbox && [[ "$(devbox global list)" != *"not activated"* ]] && tot devbox global list
|
||||||
@@ -2519,7 +2523,7 @@ get_editor() {
|
|||||||
esac
|
esac
|
||||||
editor_v="${editor_v/$'\n'*}"
|
editor_v="${editor_v/$'\n'*}"
|
||||||
editor_v="${editor_v/Version: }"
|
editor_v="${editor_v/Version: }"
|
||||||
|
|
||||||
# Only show editor name if the version string doesn't contain it
|
# Only show editor name if the version string doesn't contain it
|
||||||
echo "$editor_v" | grep -i "$editor_name" &> /dev/null && editor_name=""
|
echo "$editor_v" | grep -i "$editor_name" &> /dev/null && editor_name=""
|
||||||
editor=${editor_name}${editor_v:+ }${editor_v}
|
editor=${editor_name}${editor_v:+ }${editor_v}
|
||||||
@@ -2983,7 +2987,7 @@ get_wm_theme() {
|
|||||||
wm_theme=$(leftwm-theme status | grep "Your current theme" | sed -e 's/Your current theme is //g' -e 's/\,.*$//g')
|
wm_theme=$(leftwm-theme status | grep "Your current theme" | sed -e 's/Your current theme is //g' -e 's/\,.*$//g')
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
fly-wm)
|
fly-wm)
|
||||||
fly_config_file
|
fly_config_file
|
||||||
if grep -q 'DecorTheme' "${fly_config_file}" 2>/dev/null; then
|
if grep -q 'DecorTheme' "${fly_config_file}" 2>/dev/null; then
|
||||||
@@ -3232,6 +3236,10 @@ END
|
|||||||
"iPad7,"[1-4]): "Apple A10X Fusion (6) @ 2.39GHz" ;;
|
"iPad7,"[1-4]): "Apple A10X Fusion (6) @ 2.39GHz" ;;
|
||||||
"iPad8,"[1-8]): "Apple A12X Bionic (8) @ 2.49GHz" ;;
|
"iPad8,"[1-8]): "Apple A12X Bionic (8) @ 2.49GHz" ;;
|
||||||
"iPad8,9" | "iPad8,1"[0-2]): "Apple A12Z Bionic (8) @ 2.49GHz" ;;
|
"iPad8,9" | "iPad8,1"[0-2]): "Apple A12Z Bionic (8) @ 2.49GHz" ;;
|
||||||
|
|
||||||
|
"AppleTV2,1"): "Apple A4 (1) @ 1GHz" ;;
|
||||||
|
"AppleTV3,1"): "Apple A5 (1) @ 1GHz" ;;
|
||||||
|
"AppleTV3,2"): "Apple A5 (1) @ 1GHz" ;;
|
||||||
esac
|
esac
|
||||||
cpu="$_"
|
cpu="$_"
|
||||||
;;
|
;;
|
||||||
@@ -3537,10 +3545,12 @@ get_gpu() {
|
|||||||
"iPhone OS")
|
"iPhone OS")
|
||||||
case $kernel_machine in
|
case $kernel_machine in
|
||||||
"iPhone1,"[1-2]): "PowerVR MBX Lite 3D" ;;
|
"iPhone1,"[1-2]): "PowerVR MBX Lite 3D" ;;
|
||||||
"iPhone2,1" | "iPhone3,"[1-3] | "iPod3,1" | "iPod4,1" | "iPad1,"[1-2]):
|
"iPhone2,1" | "iPhone3,"[1-3] | "iPod3,1" | "iPod4,1" | "iPad1,"[1-2] | "AppleTV2,1"):
|
||||||
"PowerVR SGX535"
|
"PowerVR SGX535"
|
||||||
;;
|
;;
|
||||||
"iPhone4,1" | "iPad2,"[1-7] | "iPod5,1"): "PowerVR SGX543MP2" ;;
|
"iPhone4,1" | "iPad2,"[1-7] | "iPod5,1" | "AppleTV3,"[1-2]):
|
||||||
|
"PowerVR SGX543MP2"
|
||||||
|
;;
|
||||||
"iPhone5,"[1-4]): "PowerVR SGX543MP3" ;;
|
"iPhone5,"[1-4]): "PowerVR SGX543MP3" ;;
|
||||||
"iPhone6,"[1-2] | "iPad4,"[1-9]): "PowerVR G6430" ;;
|
"iPhone6,"[1-2] | "iPad4,"[1-9]): "PowerVR G6430" ;;
|
||||||
"iPhone7,"[1-2] | "iPod7,1" | "iPad5,"[1-2]): "PowerVR GX6450" ;;
|
"iPhone7,"[1-2] | "iPod7,1" | "iPad5,"[1-2]): "PowerVR GX6450" ;;
|
||||||
@@ -4167,6 +4177,7 @@ get_resolution() {
|
|||||||
"iPad13,"[1-2] | "iPad13,1"[6-9]): "1640x2360" ;;
|
"iPad13,"[1-2] | "iPad13,1"[6-9]): "1640x2360" ;;
|
||||||
"iPad8,"[1-4] | "iPad8,"[9-10] | "iPad13,"[4-7] | "iPad14,"[3-6]): "1668x2388" ;;
|
"iPad8,"[1-4] | "iPad8,"[9-10] | "iPad13,"[4-7] | "iPad14,"[3-6]): "1668x2388" ;;
|
||||||
"iPad6,"[7-8] | "iPad7,"[1-2] | "iPad8,"[5-8] | "iPad8,1"[1-2] | "iPad13,"[8-9] | "iPad13,1"[0-1] | "iPad14,"[5-6]): "2048x2732" ;;
|
"iPad6,"[7-8] | "iPad7,"[1-2] | "iPad8,"[5-8] | "iPad8,1"[1-2] | "iPad13,"[8-9] | "iPad13,1"[0-1] | "iPad14,"[5-6]): "2048x2732" ;;
|
||||||
|
"AppleTV"*) return ;;
|
||||||
esac
|
esac
|
||||||
resolution="$_"
|
resolution="$_"
|
||||||
;;
|
;;
|
||||||
@@ -7440,7 +7451,7 @@ EOF
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
"ArseLinux"*)
|
"ArseLinux"*)
|
||||||
set_colors 4 7
|
set_colors 4 7
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1}
|
${c1}
|
||||||
⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
@@ -7972,7 +7983,7 @@ EOF
|
|||||||
"aerOS"*)
|
"aerOS"*)
|
||||||
set_colors fg 0 0 0
|
set_colors fg 0 0 0
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1}
|
${c1}
|
||||||
ooo OOO OOO ooo
|
ooo OOO OOO ooo
|
||||||
oOO OOo
|
oOO OOo
|
||||||
oOO OOo
|
oOO OOo
|
||||||
@@ -8192,23 +8203,23 @@ EOF
|
|||||||
"azos"*)
|
"azos"*)
|
||||||
set_colors 6 1
|
set_colors 6 1
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1} ////. ${c2} (((((
|
${c1} ////. ${c2} (((((
|
||||||
${c1} //////// ${c2} @((((((((
|
${c1} //////// ${c2} @((((((((
|
||||||
${c1} //////// ${c2} @((((((((
|
${c1} //////// ${c2} @((((((((
|
||||||
${c1} //////// /////// ${c2} ((((((( @((((((((
|
${c1} //////// /////// ${c2} ((((((( @((((((((
|
||||||
${c1} //////// ///////// ${c2} ((((((((( @((((((((
|
${c1} //////// ///////// ${c2} ((((((((( @((((((((
|
||||||
${c1} //////// ///////// ${c2} ((((((((( @((((((((
|
${c1} //////// ///////// ${c2} ((((((((( @((((((((
|
||||||
${c1} //////// ///////// ////// ${c2} (((((( ((((((((( @((((((((
|
${c1} //////// ///////// ////// ${c2} (((((( ((((((((( @((((((((
|
||||||
${c1} //////// ///////// //////// ${c2} (((((((( ((((((((( @((((((((
|
${c1} //////// ///////// //////// ${c2} (((((((( ((((((((( @((((((((
|
||||||
${c1} //////// ///////// //////// ${c2} (((((((( ((((((((( @((((((((
|
${c1} //////// ///////// //////// ${c2} (((((((( ((((((((( @((((((((
|
||||||
${c1} //////// ///////// //////// ${c2} ((((((( ((((((((( @((((((((
|
${c1} //////// ///////// //////// ${c2} ((((((( ((((((((( @((((((((
|
||||||
${c1} //////// ///////// /// ${c2} ( ((((((((( @((((((((
|
${c1} //////// ///////// /// ${c2} ( ((((((((( @((((((((
|
||||||
${c1} //////// ///////// ${c2} ((((((((( @((((((((
|
${c1} //////// ///////// ${c2} ((((((((( @((((((((
|
||||||
${c1} //////// ///////// ${c2} &(((((((( @((((((((
|
${c1} //////// ///////// ${c2} &(((((((( @((((((((
|
||||||
${c1} //////// ////// ${c2} @(((( @((((((((
|
${c1} //////// ////// ${c2} @(((( @((((((((
|
||||||
${c1} //////// ${c2} @((((((((
|
${c1} //////// ${c2} @((((((((
|
||||||
${c1} //////// ${c2} @((((((((
|
${c1} //////// ${c2} @((((((((
|
||||||
${c1} ///// ${c2} (((((
|
${c1} ///// ${c2} (((((
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -8367,7 +8378,7 @@ EOF
|
|||||||
"BlackMesa")
|
"BlackMesa")
|
||||||
set_colors 1
|
set_colors 1
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1}
|
${c1}
|
||||||
.-;+$XHHHHHHX$+;-.
|
.-;+$XHHHHHHX$+;-.
|
||||||
,;X@@X%/;=----=:/%X@@X/,
|
,;X@@X%/;=----=:/%X@@X/,
|
||||||
=$@@%=. .=+H@X:
|
=$@@%=. .=+H@X:
|
||||||
@@ -9285,16 +9296,16 @@ ${c2}
|
|||||||
${c3}MMM1ua${c2}
|
${c3}MMM1ua${c2}
|
||||||
${c1}MM${c2}EE ${c3} MMMMM1uazE${c2}
|
${c1}MM${c2}EE ${c3} MMMMM1uazE${c2}
|
||||||
${c1}MM ${c2}EEEE ${c3}M1MM1uazzEn ${c2}EEEE MME
|
${c1}MM ${c2}EEEE ${c3}M1MM1uazzEn ${c2}EEEE MME
|
||||||
EEEEE ${c3}MMM uazEno ${c2}EEEE
|
EEEEE ${c3}MMM uazEno ${c2}EEEE
|
||||||
EEEEE${c1}MMMMMMEno~; ${c2}EE E${c2}
|
EEEEE${c1}MMMMMMEno~; ${c2}EE E${c2}
|
||||||
EE ${c1}MMMMMMMM~;;E ${c2}MMMMM M ${c2}
|
EE ${c1}MMMMMMMM~;;E ${c2}MMMMM M ${c2}
|
||||||
E ${c1}MMMMMMMMM ${c2} E E ${c2}
|
E ${c1}MMMMMMMMM ${c2} E E ${c2}
|
||||||
${c1}MMMMMMMMMMM
|
${c1}MMMMMMMMMMM
|
||||||
${c1}MMMMMMMMM ${c2}EE ${c1}
|
${c1}MMMMMMMMM ${c2}EE ${c1}
|
||||||
MM1MMMM ${c2}EEE ${c1}
|
MM1MMMM ${c2}EEE ${c1}
|
||||||
MMMMM
|
MMMMM
|
||||||
MMM
|
MMM
|
||||||
M
|
M
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -9442,24 +9453,24 @@ EOF
|
|||||||
"openKylin"*)
|
"openKylin"*)
|
||||||
set_colors 2 7
|
set_colors 2 7
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1}
|
${c1}
|
||||||
/KKK]
|
/KKK]
|
||||||
KKKKKKK` ]KKKK\
|
KKKKKKK` ]KKKK\
|
||||||
KKKKK/ /KKKKKKKKK\
|
KKKKK/ /KKKKKKKKK\
|
||||||
KKKK/ ,KKKKKKKKKKKK^
|
KKKK/ ,KKKKKKKKKKKK^
|
||||||
,]KKK =KKK` /KKKKKKOOOOOO`
|
,]KKK =KKK` /KKKKKKOOOOOO`
|
||||||
,KKKKKK =KK /` [\OOOOOOO\
|
,KKKKKK =KK /` [\OOOOOOO\
|
||||||
\KKKKK =K ,OOOOOOO`
|
\KKKKK =K ,OOOOOOO`
|
||||||
,KKKKK =^ \OOOOOO
|
,KKKKK =^ \OOOOOO
|
||||||
,KKKK ^ OOOOOO^
|
,KKKK ^ OOOOOO^
|
||||||
*KKK^ =OOOOO^
|
*KKK^ =OOOOO^
|
||||||
OOKK^ OOOOOO^
|
OOKK^ OOOOOO^
|
||||||
\OOOK\ /OOOOOO`
|
\OOOK\ /OOOOOO`
|
||||||
OOOOOO] ,OOOOOOO^
|
OOOOOO] ,OOOOOOO^
|
||||||
,OOOOOOOO\] ,[OOOOOOOOO/
|
,OOOOOOOO\] ,[OOOOOOOOO/
|
||||||
\OOOOOOOOOOOOOOOOOOOOO`
|
\OOOOOOOOOOOOOOOOOOOOO`
|
||||||
[OOOOOOOOOOOOOOOO/`
|
[OOOOOOOOOOOOOOOO/`
|
||||||
,[OOOOOOOOO]
|
,[OOOOOOOOO]
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -9890,21 +9901,21 @@ EOF
|
|||||||
"eweOS"*)
|
"eweOS"*)
|
||||||
set_colors 7 11 9 8 1
|
set_colors 7 11 9 8 1
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c2} #####%%%
|
${c2} #####%%%
|
||||||
${c2} ##%%${c3}////${c2}%%%%%${c3}///
|
${c2} ##%%${c3}////${c2}%%%%%${c3}///
|
||||||
${c2} #%%%%${c3}////((((////${c2}%
|
${c2} #%%%%${c3}////((((////${c2}%
|
||||||
${c1} *@@@@@@@${c3}/${c5},,,${c3}/////${c5},,,${c2}%${c1}@@@@@@@
|
${c1} *@@@@@@@${c3}/${c5},,,${c3}/////${c5},,,${c2}%${c1}@@@@@@@
|
||||||
${c1} .@@@@@@@@@@@${c3}////////${c2}%%%${c1}@@@@@@@@@@@@
|
${c1} .@@@@@@@@@@@${c3}////////${c2}%%%${c1}@@@@@@@@@@@@
|
||||||
${c1} @@@${c4}...${c1}@@@@@@${c3}////${c2}%%${c3}////${c1}@@@@@@@@@@@@@@@@
|
${c1} @@@${c4}...${c1}@@@@@@${c3}////${c2}%%${c3}////${c1}@@@@@@@@@@@@@@@@
|
||||||
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@
|
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
${c1} @@@@@@@@@@@@@@@@@@@@@@@
|
${c1} @@@@@@@@@@@@@@@@@@@@@@@
|
||||||
${c1} @@@@@@ @@@@@@
|
${c1} @@@@@@ @@@@@@
|
||||||
${c1} @@@ @@@
|
${c1} @@@ @@@
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -12126,7 +12137,7 @@ EOF
|
|||||||
"nixos_small")
|
"nixos_small")
|
||||||
set_colors 4 6
|
set_colors 4 6
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1} \\\\ \\\\ //
|
${c1} \\\\ \\\\ //
|
||||||
==\\\\__\\\\/ //
|
==\\\\__\\\\/ //
|
||||||
// \\\\//
|
// \\\\//
|
||||||
==// //==
|
==// //==
|
||||||
@@ -13034,39 +13045,39 @@ EOF
|
|||||||
set_colors 11
|
set_colors 11
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1}
|
${c1}
|
||||||
'',,, ,,,d,
|
'',,, ,,,d,
|
||||||
',, ,,'
|
',, ,,'
|
||||||
', ,.
|
', ,.
|
||||||
., '
|
., '
|
||||||
. .
|
. .
|
||||||
' .
|
' .
|
||||||
.. oddddkdlc:;,.. ..
|
.. oddddkdlc:;,.. ..
|
||||||
. ............lllc, .
|
. ............lllc, .
|
||||||
. ....................: .
|
. ....................: .
|
||||||
. . ....................
|
. . ....................
|
||||||
'. ..........'o........d0XX0.
|
'. ..........'o........d0XX0.
|
||||||
....lllllllcOOOcllllll............cxlxc...;okkkx.
|
....lllllllcOOOcllllll............cxlxc...;okkkx.
|
||||||
..................................';lc'...lo.
|
..................................';lc'...lo.
|
||||||
.'''''''''''''.....................,;,.......
|
.'''''''''''''.....................,;,.......
|
||||||
',,,,,,,,,,,,,,,,''...............dkkkd......
|
',,,,,,,,,,,,,,,,''...............dkkkd......
|
||||||
',,,,,,,,,,,,,,,,,,,'............;okkkd;....
|
',,,,,,,,,,,,,,,,,,,'............;okkkd;....
|
||||||
.,,,,,,,,,,,,,,,,,,,,,............;cll;.....
|
.,,,,,,,,,,,,,,,,,,,,,............;cll;.....
|
||||||
,,,,,,,,,,,,,,,,,,,,'....................:d,
|
,,,,,,,,,,,,,,,,,,,,'....................:d,
|
||||||
,,,,,,,,,,,,,,,,,,,....................oxxx:
|
,,,,,,,,,,,,,,,,,,,....................oxxx:
|
||||||
.,,,,,,,,,,,,,,,,,'..................oxxxxx. .
|
.,,,,,,,,,,,,,,,,,'..................oxxxxx. .
|
||||||
.,,,,,,,,,,,,,,'.......... ,oxxxxxxx .
|
.,,,,,,,,,,,,,,'.......... ,oxxxxxxx .
|
||||||
.;,,,,,,,,,,,,'.. 'cxxxxxxxxx,
|
.;,,,,,,,,,,,,'.. 'cxxxxxxxxx,
|
||||||
:dl:,'',,'.... .;lxxxxxxxxxd;
|
:dl:,'',,'.... .;lxxxxxxxxxd;
|
||||||
,codol:;'. ...,;cldxxxxxxxxxoc.
|
,codol:;'. ...,;cldxxxxxxxxxoc.
|
||||||
.:cxxxxxdlccccc:ccldxxxxxxxxxxxxxx::.
|
.:cxxxxxdlccccc:ccldxxxxxxxxxxxxxx::.
|
||||||
.'::dxxxxxxxxxxxxxxxxxxxxxxxd::'.
|
.'::dxxxxxxxxxxxxxxxxxxxxxxxd::'.
|
||||||
..,::cdxxxxxxxxxxxxxdc::,..
|
..,::cdxxxxxxxxxxxxxdc::,..
|
||||||
...,;:::::::;,...
|
...,;:::::::;,...
|
||||||
|
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"phyOS"*)
|
"phyOS"*)
|
||||||
set_colors 33 33 7 1
|
set_colors 33 33 7 1
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
@@ -13530,26 +13541,26 @@ EOF
|
|||||||
"Reborn OS"* | "Reborn"*)
|
"Reborn OS"* | "Reborn"*)
|
||||||
set_colors 0 4 6
|
set_colors 0 4 6
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1} .======================.
|
${c1} .======================.
|
||||||
${c1}.#${c2}#*********${c1}%%${c2}*********#${c1}%:
|
${c1}.#${c2}#*********${c1}%%${c2}*********#${c1}%:
|
||||||
${c1}:%${c2}#**********${c1}%%${c2}**********#${c1}%-
|
${c1}:%${c2}#**********${c1}%%${c2}**********#${c1}%-
|
||||||
${c1}-%${c2}************${c1}%%${c2}************${c1}%=
|
${c1}-%${c2}************${c1}%%${c2}************${c1}%=
|
||||||
${c1}+%${c2}******${c1}%%#####${c1}%%#####%%${c2}******${c1}%+
|
${c1}+%${c2}******${c1}%%#####${c1}%%#####%%${c2}******${c1}%+
|
||||||
${c1}*%%#${c2}****${c1}%#${c3}+=====${c1}%%${c3}=====+${c1}#%${c2}****${c1}#%%*
|
${c1}*%%#${c2}****${c1}%#${c3}+=====${c1}%%${c3}=====+${c1}#%${c2}****${c1}#%%*
|
||||||
${c1}*%${c2}*#${c1}#%%#%#${c3}====+++${c1}%%${c3}+++====${c1}#%#%%#${c2}#*${c1}##.
|
${c1}*%${c2}*#${c1}#%%#%#${c3}====+++${c1}%%${c3}+++====${c1}#%#%%#${c2}#*${c1}##.
|
||||||
${c1}.##${c2}*****${c1}#%%%#${c3}*++${c1}%######%${c3}*+*${c1}#%%%#${c2}*****${c1}#%.
|
${c1}.##${c2}*****${c1}#%%%#${c3}*++${c1}%######%${c3}*+*${c1}#%%%#${c2}*****${c1}#%.
|
||||||
${c1}:%#${c2}*****${c1}#%${c3}*=+*${c1}#%%${c3}*++++++*${c1}%%#${c3}*+=*${c1}%#${c2}*****${c1}#%:
|
${c1}:%#${c2}*****${c1}#%${c3}*=+*${c1}#%%${c3}*++++++*${c1}%%#${c3}*+=*${c1}%#${c2}*****${c1}#%:
|
||||||
${c1}-%#${c2}*****${c1}#%${c3}+====*${c1}%${c3}*++++++++*${c1}%#${c3}====+${c1}%#${c2}******${c1}%-
|
${c1}-%#${c2}*****${c1}#%${c3}+====*${c1}%${c3}*++++++++*${c1}%#${c3}====+${c1}%#${c2}******${c1}%-
|
||||||
${c1}-%#${c2}*****${c1}#%${c3}+====*${c1}%${c3}*++++++++*${c1}%#${c3}====+${c1}%#${c2}******${c1}%=
|
${c1}-%#${c2}*****${c1}#%${c3}+====*${c1}%${c3}*++++++++*${c1}%#${c3}====+${c1}%#${c2}******${c1}%=
|
||||||
${c1}:%#${c2}*****${c1}#%${c3}*=+*${c1}#%%${c3}*++++++*${c1}%%#${c3}*+=*${c1}%#${c2}*****${c1}#%-
|
${c1}:%#${c2}*****${c1}#%${c3}*=+*${c1}#%%${c3}*++++++*${c1}%%#${c3}*+=*${c1}%#${c2}*****${c1}#%-
|
||||||
${c1}.##${c2}*****${c1}#%%%#${c3}*+*${c1}%######%${c3}*+*${c1}#%%%#${c2}*****${c1}#%:
|
${c1}.##${c2}*****${c1}#%%%#${c3}*+*${c1}%######%${c3}*+*${c1}#%%%#${c2}*****${c1}#%:
|
||||||
${c1}.##${c2}**${c1}#%%#%#${c3}====+++${c1}%%${c3}+++====${c1}#%#%%#${c2}#*${c1}##.
|
${c1}.##${c2}**${c1}#%%#%#${c3}====+++${c1}%%${c3}+++====${c1}#%#%%#${c2}#*${c1}##.
|
||||||
${c1}*%%#${c2}****${c1}%#${c3}+=====${c1}%%${c3}=====+${c1}#%${c2}****${c1}#%%*
|
${c1}*%%#${c2}****${c1}%#${c3}+=====${c1}%%${c3}=====+${c1}#%${c2}****${c1}#%%*
|
||||||
${c1}+%${c2}******${c1}%%#####%%#####%%${c2}******${c1}%*
|
${c1}+%${c2}******${c1}%%#####%%#####%%${c2}******${c1}%*
|
||||||
${c1}-%${c2}************${c1}%%${c2}************${c1}%=
|
${c1}-%${c2}************${c1}%%${c2}************${c1}%=
|
||||||
${c1}:%${c2}#**********${c1}%%${c2}**********#${c1}%-
|
${c1}:%${c2}#**********${c1}%%${c2}**********#${c1}%-
|
||||||
${c1}:%${c2}#*********${c1}%%${c2}*********#${c1}%:
|
${c1}:%${c2}#*********${c1}%%${c2}*********#${c1}%:
|
||||||
${c1}.======================.
|
${c1}.======================.
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -13723,20 +13734,20 @@ EOF
|
|||||||
"RhaymOS"*)
|
"RhaymOS"*)
|
||||||
set_colors 1
|
set_colors 1
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1}
|
${c1}
|
||||||
###
|
###
|
||||||
#####
|
#####
|
||||||
|
|
||||||
####### /########
|
####### /########
|
||||||
############# ###########
|
############# ###########
|
||||||
,########### #### ####(..
|
,########### #### ####(..
|
||||||
#### #### ####* ##########
|
#### #### ####* ##########
|
||||||
#### ##### ##### (####
|
#### ##### ##### (####
|
||||||
#### ########### ###########
|
#### ########### ###########
|
||||||
#### ######### ##########
|
#### ######### ##########
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
#####################################
|
#####################################
|
||||||
#######################################
|
#######################################
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
@@ -15046,29 +15057,29 @@ oss${c2}yNMMMNyMMh${c1}sssssssssssssshmmmh${c1}ssssssso
|
|||||||
.-\+oossssoo+/-.
|
.-\+oossssoo+/-.
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"Floflis"*)
|
"Floflis"*)
|
||||||
set_colors 1 7 3
|
set_colors 1 7 3
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
\e[96m ,▄▄▄▌▓▓███▓▓▌▄▄▄,
|
\e[96m ,▄▄▄▌▓▓███▓▓▌▄▄▄,
|
||||||
,▄▒▓███████████████████▓▄▄
|
,▄▒▓███████████████████▓▄▄
|
||||||
▄▓███████████████████████████▌
|
▄▓███████████████████████████▌
|
||||||
▓███████████████████████████████
|
▓███████████████████████████████
|
||||||
, ╙▓████████████████████████████▀ ▄
|
, ╙▓████████████████████████████▀ ▄
|
||||||
╓█▓▄ ╙▀▓████████████████████▀▀` ,▄██▓
|
╓█▓▄ ╙▀▓████████████████████▀▀` ,▄██▓
|
||||||
╓█████▌▄, '▀▀▀▀▓▓▓▓▓▓▀▀Å╙` ▄▄▓█████▌
|
╓█████▌▄, '▀▀▀▀▓▓▓▓▓▓▀▀Å╙` ▄▄▓█████▌
|
||||||
██████████▓▌▄ , ▄▓███████████▄
|
██████████▓▌▄ , ▄▓███████████▄
|
||||||
╢████████████▓ ║████▓▓███▌ ╣█████████████▓
|
╢████████████▓ ║████▓▓███▌ ╣█████████████▓
|
||||||
▓█████████████ ▐█████████▀ ▓██████████████
|
▓█████████████ ▐█████████▀ ▓██████████████
|
||||||
▓█████████████ ▐█████████▄ ███████████████
|
▓█████████████ ▐█████████▄ ███████████████
|
||||||
▀████████████▌ ║█████████▌ ▀█████████████▌
|
▀████████████▌ ║█████████▌ ▀█████████████▌
|
||||||
████████████M ▓██████████ ▐█████████████⌐
|
████████████M ▓██████████ ▐█████████████⌐
|
||||||
▀██████████▌ ▐███████████▌ ▀███████████▌
|
▀██████████▌ ▐███████████▌ ▀███████████▌
|
||||||
╙▓█████▓ ▓██████████████▄ ▀███████▀
|
╙▓█████▓ ▓██████████████▄ ▀███████▀
|
||||||
╝▓██▀ ╓▓████████████████▓ ▀▓██▀
|
╝▓██▀ ╓▓████████████████▓ ▀▓██▀
|
||||||
,▄████████████████████▌,
|
,▄████████████████████▌,
|
||||||
╝▀████████████████████▓▀'
|
╝▀████████████████████▓▀'
|
||||||
`╙▀▀▓▓███████▓▀▀╩'
|
`╙▀▀▓▓███████▓▀▀╩'
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -15234,26 +15245,26 @@ EOF
|
|||||||
set_colors 12 12 7 12 4
|
set_colors 12 12 7 12 4
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c3} :${c4}:::::::::::::: ${c5}.
|
${c3} :${c4}:::::::::::::: ${c5}.
|
||||||
${c3}=#${c4}*============. ${c5}:#:
|
${c3}=#${c4}*============. ${c5}:#:
|
||||||
${c3}=##%${c4}+----------. ${c5}.###:
|
${c3}=##%${c4}+----------. ${c5}.###:
|
||||||
${c3}=####. ${c5}.####:
|
${c3}=####. ${c5}.####:
|
||||||
${c3}=####. ${c5}.####:
|
${c3}=####. ${c5}.####:
|
||||||
${c3}=###*. .=${c4}--------. ${c5}####:
|
${c3}=###*. .=${c4}--------. ${c5}####:
|
||||||
${c3}=####. .*#+${c4}======- ${c5}####:
|
${c3}=####. .*#+${c4}======- ${c5}####:
|
||||||
${c3}=###*. .*###+${c4}====- ${c5}####:
|
${c3}=###*. .*###+${c4}====- ${c5}####:
|
||||||
${c3}=###*. .*#####+${c4}==- ${c5}####:
|
${c3}=###*. .*#####+${c4}==- ${c5}####:
|
||||||
${c3}=###*. .*#######+${c4}: ${c5}####:
|
${c3}=###*. .*#######+${c4}: ${c5}####:
|
||||||
${c3}=###*. .*#######+${c4}: ${c5}####:
|
${c3}=###*. .*#######+${c4}: ${c5}####:
|
||||||
${c3}=###*. .*#####+${c4}==- ${c5}####:
|
${c3}=###*. .*#####+${c4}==- ${c5}####:
|
||||||
${c3}=###*. .*###+${c4}====- ${c5}####:
|
${c3}=###*. .*###+${c4}====- ${c5}####:
|
||||||
${c3}=####. .*#+${c4}======- ${c5}####:
|
${c3}=####. .*#+${c4}======- ${c5}####:
|
||||||
${c3}=###*. .=${c4}--------. ${c5}.####:
|
${c3}=###*. .=${c4}--------. ${c5}.####:
|
||||||
${c3}=####. ${c5}.####:
|
${c3}=####. ${c5}.####:
|
||||||
${c3}=####. ${c5}.####:
|
${c3}=####. ${c5}.####:
|
||||||
${c3}=###+${c4}--------------${c5}####:
|
${c3}=###+${c4}--------------${c5}####:
|
||||||
${c3}=#+${c4}=================-${c5}:
|
${c3}=#+${c4}=================-${c5}:
|
||||||
${c3}:${c4}::::::::::::::::::.
|
${c3}:${c4}::::::::::::::::::.
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -15279,25 +15290,25 @@ EOF
|
|||||||
set_colors 8 4
|
set_colors 8 4
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1}
|
${c1}
|
||||||
`-`
|
`-`
|
||||||
-yys+/-`
|
-yys+/-`
|
||||||
`oyyyyy: /osyyyyso+:.
|
`oyyyyy: /osyyyyso+:.
|
||||||
/yyyyy+`+yyyyyyyyyys/.
|
/yyyyy+`+yyyyyyyyyys/.
|
||||||
.-yyyyys.:+//+oyyyyyyyo.
|
.-yyyyys.:+//+oyyyyyyyo.
|
||||||
`oy/`oyyyyy/ ./syyyyy:
|
`oy/`oyyyyy/ ./syyyyy:
|
||||||
syyys`:yyyyyo` :yyyyy:
|
syyys`:yyyyyo` :yyyyy:
|
||||||
/yyyyo .syyyyy- .yyyyy.
|
/yyyyo .syyyyy- .yyyyy.
|
||||||
yyyyy. +yyyyy/ /yyyy/
|
yyyyy. +yyyyy/ /yyyy/
|
||||||
`yyyyy :yyyyys` -yyyyo
|
`yyyyy :yyyyys` -yyyyo
|
||||||
yyyyy. `syyyyy- /yyyy/
|
yyyyy. `syyyyy- /yyyy/
|
||||||
/yyyyo /yyyyy+ .yyyyy.
|
/yyyyo /yyyyy+ .yyyyy.
|
||||||
syyyys. -yyyyys.:yyyy:
|
syyyys. -yyyyys.:yyyy:
|
||||||
`oyyyyyo-` `oyyyyy:.sy:
|
`oyyyyyo-` `oyyyyy:.sy:
|
||||||
:syyyyyyso+/++`/yyyyyo``
|
:syyyyyyso+/++`/yyyyyo``
|
||||||
-oyyyyyyyyyyy-.syyyys.
|
-oyyyyyyyyyyy-.syyyys.
|
||||||
-/+osyyyyso.`+yyyyy/
|
-/+osyyyyso.`+yyyyy/
|
||||||
.-/+syo`
|
.-/+syo`
|
||||||
`.
|
`.
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -15798,21 +15809,21 @@ EOF
|
|||||||
set_colors 4 7
|
set_colors 4 7
|
||||||
read -rd '' ascii_data <<'EOF'
|
read -rd '' ascii_data <<'EOF'
|
||||||
${c1}
|
${c1}
|
||||||
. .:. . .:.
|
. .:. . .:.
|
||||||
.^^.!.:::. .^!?J?^
|
.^^.!.:::. .^!?J?^
|
||||||
.:^.^!!!~:~^. .7??77!~~^.
|
.:^.^!!!~:~^. .7??77!~~^.
|
||||||
.~^.!??77?!.^~: ..:^^7JJJ7~~^.
|
.~^.!??77?!.^~: ..:^^7JJJ7~~^.
|
||||||
.^~.^7???7~.~~. .7??????????!
|
.^~.^7???7~.~~. .7??????????!
|
||||||
.:^:^^~^^:!^ ^: .......^!:...
|
.:^:^^~^^:!^ ^: .......^!:...
|
||||||
.!7~.::.!.::. ~BG~ :^ ^~:
|
.!7~.::.!.::. ~BG~ :^ ^~:
|
||||||
:!!~ ~. ?BBBB! ^?J!. .!~.
|
:!!~ ~. ?BBBB! ^?J!. .!~.
|
||||||
:!. .JBY. .Y#BBBY?~!???J7. :^^.
|
:!. .JBY. .Y#BBBY?~!???J7. :^^.
|
||||||
.. :5#B#P~P#BBP?7?55J?J7:
|
.. :5#B#P~P#BBP?7?55J?J7:
|
||||||
^P#BBBBBBBB5?7J5555J!.....
|
^P#BBBBBBBB5?7J5555J!.....
|
||||||
!BBBBBBGBBGJ77::Y555J?77777^
|
!BBBBBBGBBGJ77::Y555J?77777^
|
||||||
?BBBBG5JJ5PJ?!: .?Y??????77?~.
|
?BBBBG5JJ5PJ?!: .?Y??????77?~.
|
||||||
.YBGPYJ??????Y?^^^^~7?????????7?!.
|
.YBGPYJ??????Y?^^^^~7?????????7?!.
|
||||||
.^^:..::::::::.....:::::::::::..:.
|
.^^:..::::::::.....:::::::::::..:.
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "neowofetch",
|
"name": "neowofetch",
|
||||||
"version": "2.0.1",
|
"version": "2.0.2",
|
||||||
"description": "Updated neofetch",
|
"description": "Updated neofetch",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|||||||
+15
-3
@@ -51,8 +51,15 @@ def edit_versions(version: str):
|
|||||||
path = Path('hyfetch/__version__.py')
|
path = Path('hyfetch/__version__.py')
|
||||||
content = [f"VERSION = '{version}'" if l.startswith('VERSION = ') else l for l in path.read_text().split('\n')]
|
content = [f"VERSION = '{version}'" if l.startswith('VERSION = ') else l for l in path.read_text().split('\n')]
|
||||||
path.write_text('\n'.join(content))
|
path.write_text('\n'.join(content))
|
||||||
|
|
||||||
|
# 3. Cargo.toml
|
||||||
|
print('Editing Cargo.toml...')
|
||||||
|
path = Path('Cargo.toml')
|
||||||
|
content = path.read_text()
|
||||||
|
content = re.sub(r'(?<=^version = ")[^"]+(?="$)', version, content, flags=re.MULTILINE)
|
||||||
|
path.write_text(content)
|
||||||
|
|
||||||
# 3. README.md
|
# 4. README.md
|
||||||
print('Editing README.md...')
|
print('Editing README.md...')
|
||||||
path = Path('README.md')
|
path = Path('README.md')
|
||||||
content = path.read_text()
|
content = path.read_text()
|
||||||
@@ -61,7 +68,7 @@ def edit_versions(version: str):
|
|||||||
content = content[:changelog_i] + f'\n\n### {version}' + content[changelog_i:]
|
content = content[:changelog_i] + f'\n\n### {version}' + content[changelog_i:]
|
||||||
path.write_text(content)
|
path.write_text(content)
|
||||||
|
|
||||||
# 4. neofetch script
|
# 5. neofetch script
|
||||||
print('Editing neofetch...')
|
print('Editing neofetch...')
|
||||||
path = Path('neofetch')
|
path = Path('neofetch')
|
||||||
lines = path.read_text().replace("\t", " ").split('\n')
|
lines = path.read_text().replace("\t", " ").split('\n')
|
||||||
@@ -125,7 +132,12 @@ def create_release(v: str):
|
|||||||
subprocess.check_call(['git', 'tag', f'neofetch-{NEOFETCH_NEW_VERSION}'])
|
subprocess.check_call(['git', 'tag', f'neofetch-{NEOFETCH_NEW_VERSION}'])
|
||||||
|
|
||||||
i = input('Please check the commit is correct. Press y to continue or any other key to cancel.')
|
i = input('Please check the commit is correct. Press y to continue or any other key to cancel.')
|
||||||
assert i == 'y'
|
if i.lower() != 'y':
|
||||||
|
print('Aborting...')
|
||||||
|
subprocess.check_call(['git', 'reset', '--hard', 'HEAD~1'])
|
||||||
|
subprocess.check_call(['git', 'tag', '-d', v])
|
||||||
|
subprocess.check_call(['git', 'tag', '-d', f'neofetch-{NEOFETCH_NEW_VERSION}'])
|
||||||
|
exit(1)
|
||||||
|
|
||||||
# 4. Push
|
# 4. Push
|
||||||
print('Pushing commits...')
|
print('Pushing commits...')
|
||||||
|
|||||||
Reference in New Issue
Block a user