Compare commits
60 Commits
neofetch-8.0.4
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| e64f7efca6 | |||
| 7bfb750f63 | |||
| 7433df5d74 | |||
| 2361be73ba | |||
| 5f8a34142e | |||
| 36c081c2ce | |||
| 4ee3cd6b85 | |||
| 5b9865382e | |||
| 6241531ce9 | |||
| 2196517709 | |||
| 7a2b2ba744 | |||
| 4b7c92ba4b | |||
| 9cf9985973 | |||
| 18bb479415 | |||
| b667cc8ad6 | |||
| e838166b16 | |||
| 43e1dc1067 | |||
| cc5d7570fb | |||
| b05d9c44b4 | |||
| 2995c78e66 | |||
| 1d89f237db | |||
| 75cde60494 | |||
| fa71dfb84e | |||
| c147a2ffc6 | |||
| 9cc0f9a111 | |||
| 0aa7731c17 | |||
| 255dd3e630 | |||
| 7100f7a682 | |||
| 68cb804ccf | |||
| e9b65287a3 | |||
| 5ff0a8d49a | |||
| 635fbfff01 | |||
| 13e56f621b | |||
| 9500e8c0aa | |||
| e5ba2b3be9 | |||
| e78e60da3d | |||
| 809b9c34f4 | |||
| 352a1ba086 | |||
| b81d5fed1b | |||
| f32e2df4fa | |||
| abcc1d265b | |||
| 25824da0e0 | |||
| 5e0f1ee909 | |||
| 62b0fd959f | |||
| 9a66c10afd | |||
| 62fdc22c00 | |||
| 1fdcfa66b8 | |||
| d08a0745a5 | |||
| 4ee5344209 | |||
| 26030b0628 | |||
| 9b376f97c0 | |||
| 2dc18050ca | |||
| e816235637 | |||
| 8046e9bab3 | |||
| e03cda1475 | |||
| 20e5fb3f89 | |||
| e253a75924 | |||
| 2252fc36e7 | |||
| 4e23243384 | |||
| f6dc68d7dc |
Generated
+192
-315
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -3,7 +3,7 @@ resolver = "2"
|
||||
members = ["crates/*"]
|
||||
|
||||
[workspace.package]
|
||||
version = "2.0.4"
|
||||
version = "2.1.0"
|
||||
authors = ["Azalea Gui <azalea@hydev.org>"]
|
||||
edition = "2021"
|
||||
rust-version = "1.75.0"
|
||||
|
||||
@@ -37,7 +37,7 @@ Currently, these distributions have existing packages for HyFetch:
|
||||
* Nix: `nix-env -i hyfetch` (Thanks to [@YisuiDenghua](https://github.com/YisuiDenghua))
|
||||
* Nix Profile: `nix profile install nixpkgs#hyfetch`
|
||||
* Guix: `guix install hyfetch` (Thanks to [@WammKD](https://github.com/WammKD))
|
||||
* Slackware: `sbopkg -b hyfetch` [Slackbuild](https://slackbuilds.org/repository/15.0/desktop/hyfetch/?search=hyfetch) (Thanks to [@bittin](https://github.com/bittin) , willysr (https://github.com/willysr), jebrhansen and Urchlay)
|
||||
* Slackware: `sbopkg -b hyfetch` [Slackbuild](https://slackbuilds.org/repository/15.0/desktop/hyfetch/?search=hyfetch) (Thanks to [@bittin](https://github.com/bittin) , willysr (https://github.com/willysr), jebrhansen and Urchlay and new maintainer MDKDIO)
|
||||
* Homebrew: `brew install hyfetch` (Thanks to [@catumin](https://github.com/catumin) and [@osalbahr](https://github.com/osalbahr))
|
||||
* openSUSE Tumbleweed: `zypper in python311-hyfetch` (Thanks to [@catumin](https://github.com/catumin))
|
||||
* Gentoo: `emerge --ask app-misc/hyfetch` (Thanks to [@catumin](https://github.com/catumin))
|
||||
@@ -109,16 +109,6 @@ You can also install your version locally by running `pip install .` in the repo
|
||||
|
||||
## Change Log
|
||||
|
||||
### About Notation
|
||||
|
||||
Updates to HyFetch begins with the emoji 🌈
|
||||
Updates to `neowofetch` begins with the emoji 🖼️
|
||||
|
||||
### TODO
|
||||
|
||||
* [ ] (Important!) Refactor flag storage & coloring to support non-stride patterns
|
||||
* [ ] Config menu: Allow left-right arrow keys for pagination
|
||||
|
||||
### Nightly
|
||||
|
||||
Note: You can install the latest nightly version by using:
|
||||
@@ -129,6 +119,53 @@ cargo install --git https://github.com/hykilpikonna/hyfetch
|
||||
|
||||
<!-- CHANGELOG STARTS HERE --->
|
||||
|
||||
### 2.1.0
|
||||
|
||||
### 2.1.0-rc1
|
||||
|
||||
### 2.1.0
|
||||
|
||||
(changelog is generated by Gemini from commit history)
|
||||
|
||||
**✨ Features & Enhancements**
|
||||
|
||||
* Random Preset: Now can select multiple presets and let it randomly choose one on each run ([#487](https://github.com/hykilpikonna/hyfetch/issues/487)).
|
||||
* Distro as Data: Migrated distribution ASCII art and metadata to a unified JSON-header format, enabling shared usage across Python and Rust implementations.
|
||||
* Distro Parity: Added missing ASCII art and distros from [fastfetch](https://github.com/fastfetch-cli/fastfetch).
|
||||
* New OS Support: Added support for QNX/Blackberry 10 ([#480](https://github.com/hykilpikonna/hyfetch/issues/480)).
|
||||
* Custom Presets: Added `custom_presets` configuration option to allow user-defined color presets ([#481](https://github.com/hykilpikonna/hyfetch/issues/481)).
|
||||
* Interactive Filtering: Added live filter for preset selection in the configuration menu ([#482](https://github.com/hykilpikonna/hyfetch/issues/482)).
|
||||
* New Distros: Added support for Codex Linux ([#477](https://github.com/hykilpikonna/hyfetch/issues/477)) and Zirconium ([#468](https://github.com/hykilpikonna/hyfetch/issues/468)).
|
||||
* New Flags: Added Peter Griffin pride flag ([#489](https://github.com/hykilpikonna/hyfetch/issues/489)), Rubber flag ([#479](https://github.com/hykilpikonna/hyfetch/issues/479)), and Haruhi Suzumiya flag ([#486](https://github.com/hykilpikonna/hyfetch/issues/486)).
|
||||
|
||||
**🐛 Bug Fixes**
|
||||
|
||||
* Windows/MSYS2: Fixed bash path detection and execution in MINGW64 environment ([#488](https://github.com/hykilpikonna/hyfetch/issues/488)).
|
||||
* Backend Fixes: Fixed issues with the `macchina` backend crashing or reporting incorrect distribution ([#491](https://github.com/hykilpikonna/hyfetch/issues/491)).
|
||||
* Terminal Fixes: Fixed terminal font output issues in Kitty terminal ([#484](https://github.com/hykilpikonna/hyfetch/issues/484)).
|
||||
* Reliability:
|
||||
* Improved path detection to continue even when current path is not found ([#426](https://github.com/hykilpikonna/hyfetch/issues/426)).
|
||||
* Added fallback for operating systems unsupported by the Rust implementation ([#474](https://github.com/hykilpikonna/hyfetch/issues/474)).
|
||||
* Fixed prioritization of CLI-specified ASCII art to ensure it correctly overrides configuration ([#475](https://github.com/hykilpikonna/hyfetch/issues/475)).
|
||||
* Shell Detection: Switched to `os.execv` for more reliable shell detection and transition ([#469](https://github.com/hykilpikonna/hyfetch/issues/469)).
|
||||
* Background Detection Timeout: Prevent crash due to timeout in background color detection ([#453](https://github.com/hykilpikonna/hyfetch/issues/453)).
|
||||
|
||||
|
||||
### 2.0.5
|
||||
|
||||
**✨ Features & Enhancements**
|
||||
|
||||
* Added support for Secureblue ([#434](https://github.com/hykilpikonna/hyfetch/pull/434)).
|
||||
* Added `void_old` logo variant ([#457](https://github.com/hykilpikonna/hyfetch/pull/457)).
|
||||
* Added Femme flag ([#456](https://github.com/hykilpikonna/hyfetch/pull/456)).
|
||||
|
||||
**🐛 Bug Fixes**
|
||||
|
||||
* Fixed a panic when entering an invalid alignment option after rolling ([#460](https://github.com/hykilpikonna/hyfetch/issues/460)).
|
||||
* Fixed Traceback printing on KeyboardInterrupt ([#462](https://github.com/hykilpikonna/hyfetch/issues/462)).
|
||||
* Restored flags lost during Python/Rust presets merge ([#466](https://github.com/hykilpikonna/hyfetch/pull/466)).
|
||||
* Fixed a panic with file metadata access ([#465](https://github.com/hykilpikonna/hyfetch/issues/465)).
|
||||
|
||||
### 2.0.4
|
||||
|
||||
**🔧 Building Pipeline Refactoring**
|
||||
@@ -232,6 +269,11 @@ This is a massive update, rewriting the entire hyfetch core from Python to Rust
|
||||
|
||||
This version would be the last version of HyFetch on Python as we migrate to Rust (Huge thanks to everyone on [#317](https://github.com/hykilpikonna/hyfetch/pull/317)!). It will also be an effort to start a transition that phases out the neowofetch/neofetch backend in favor of FastFetch, since the time needed to maintain the NF backend currently exceed our capacity. If you are willing to help maintaining it, please let us know!
|
||||
|
||||
### About Notation
|
||||
|
||||
Updates to HyFetch begins with the emoji 🌈
|
||||
Updates to `neowofetch` begins with the emoji 🖼️
|
||||
|
||||
* 🌈 **Improve Windows support**
|
||||
* 🌈 **Include FastFetch into HyFetch PyPI package**
|
||||
* 🌈 Detached our fork from neofetch
|
||||
|
||||
@@ -15,7 +15,7 @@ ansi_colours = { workspace = true, features = [] }
|
||||
anstream = { workspace = true, features = [], optional = true }
|
||||
anyhow = { workspace = true, features = ["std"] }
|
||||
bpaf = { workspace = true, features = [] }
|
||||
crossterm = { workspace = true, features = [] }
|
||||
crossterm = { workspace = true, features = ["events"] }
|
||||
deranged = { workspace = true, features = ["serde", "std"] }
|
||||
directories = { workspace = true, features = [] }
|
||||
enterpolation = { workspace = true, features = ["bspline", "std"] }
|
||||
|
||||
+128
-79
@@ -7,16 +7,27 @@ use anyhow::{Context, Result};
|
||||
use fs_extra::dir::CopyOptions;
|
||||
use heck::ToUpperCamelCase;
|
||||
use indexmap::IndexMap;
|
||||
use regex::Regex;
|
||||
use serde::Deserialize;
|
||||
use unicode_normalization::UnicodeNormalization as _;
|
||||
|
||||
#[derive(Debug)]
|
||||
struct AsciiDistro {
|
||||
pattern: String,
|
||||
color: String,
|
||||
foreground: Vec<u8>,
|
||||
background: Option<u8>,
|
||||
art: String,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
struct DistroHeader {
|
||||
#[serde(rename = "match")]
|
||||
pattern: String,
|
||||
color: serde_json::Value,
|
||||
foreground: Option<Vec<u8>>,
|
||||
background: Option<u8>,
|
||||
}
|
||||
|
||||
impl AsciiDistro {
|
||||
fn friendly_name(&self) -> String {
|
||||
self.pattern
|
||||
@@ -37,31 +48,35 @@ fn main() -> Result<()> {
|
||||
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());
|
||||
|
||||
for file in &["neofetch", "hyfetch/data"] {
|
||||
let src = anything_that_exist(&[
|
||||
&dir.join(file),
|
||||
&dir.join("../../").join(file),
|
||||
]).context("couldn't find neofetch")?;
|
||||
let dst = o.join(file);
|
||||
println!("cargo:rerun-if-changed={}", src.display());
|
||||
let data_dir = anything_that_exist(&[
|
||||
&dir.join("hyfetch/data"),
|
||||
&dir.join("../../hyfetch/data"),
|
||||
]).context("couldn't find hyfetch/data")?;
|
||||
|
||||
let dst_root = o.join("hyfetch");
|
||||
fs::create_dir_all(&dst_root)?;
|
||||
|
||||
// Copy hyfetch/data
|
||||
let opt = CopyOptions { overwrite: true, copy_inside: true, ..CopyOptions::default() };
|
||||
fs_extra::dir::copy(&data_dir, &dst_root, &opt)?;
|
||||
|
||||
// Copy either file or directory
|
||||
if src.is_dir() {
|
||||
let opt = CopyOptions { overwrite: true, copy_inside: true, ..CopyOptions::default() };
|
||||
println!("copying {} to {}", src.display(), dst.display());
|
||||
fs_extra::dir::copy(&src, &dst, &opt)?;
|
||||
}
|
||||
else { fs::copy(&src, &dst)?; }
|
||||
}
|
||||
// Copy neofetch
|
||||
let neofetch_src = anything_that_exist(&[
|
||||
&dir.join("neofetch"),
|
||||
&dir.join("../../neofetch"),
|
||||
]).context("couldn't find neofetch")?;
|
||||
fs::copy(&neofetch_src, o.join("neofetch"))?;
|
||||
|
||||
preset_codegen(&o.join("hyfetch/data/presets.json"), &o.join("presets.rs"))?;
|
||||
export_distros(&o.join("neofetch"), &o)?;
|
||||
|
||||
let distros_dir = data_dir.join("distros");
|
||||
export_distros(&distros_dir, &o)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn export_distros(neofetch_path: &Path, out_path: &Path) -> Result<()>
|
||||
fn export_distros(distro_dir: &Path, out_path: &Path) -> Result<()>
|
||||
{
|
||||
let distros = parse_ascii_distros(neofetch_path)?;
|
||||
let distros = parse_ascii_distros(distro_dir)?;
|
||||
let mut variants = IndexMap::with_capacity(distros.len());
|
||||
|
||||
for distro in &distros {
|
||||
@@ -131,9 +146,7 @@ impl Distro {
|
||||
|
||||
// Both sides are *
|
||||
if m.starts_with('*') && m.ends_with('*') {
|
||||
conds.push(format!(
|
||||
r#"name.starts_with("{stripped}") || name.ends_with("{stripped}")"#
|
||||
));
|
||||
conds.push(format!(r#"name.contains("{stripped}")"#));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -164,6 +177,66 @@ impl Distro {
|
||||
None
|
||||
}
|
||||
|
||||
pub fn color(&self) -> &str {
|
||||
match self {
|
||||
"###,
|
||||
);
|
||||
|
||||
for (variant, AsciiDistro { color, .. }) in &variants {
|
||||
write!(buf, r###"
|
||||
Self::{variant} => {color:?},
|
||||
"###, color = color)?;
|
||||
}
|
||||
|
||||
buf.push_str(
|
||||
r###"
|
||||
}
|
||||
}
|
||||
|
||||
pub fn foreground(&self) -> &[u8] {
|
||||
match self {
|
||||
"###,
|
||||
);
|
||||
|
||||
for (variant, AsciiDistro { foreground, .. }) in &variants {
|
||||
if foreground.is_empty() {
|
||||
write!(buf, r###"
|
||||
Self::{variant} => &[],
|
||||
"###)?;
|
||||
} else {
|
||||
write!(buf, r###"
|
||||
Self::{variant} => &{:?},
|
||||
"###, foreground)?;
|
||||
}
|
||||
}
|
||||
|
||||
buf.push_str(
|
||||
r###"
|
||||
}
|
||||
}
|
||||
|
||||
pub fn background(&self) -> Option<u8> {
|
||||
match self {
|
||||
"###,
|
||||
);
|
||||
|
||||
for (variant, AsciiDistro { background, .. }) in &variants {
|
||||
if let Some(b) = background {
|
||||
write!(buf, r###"
|
||||
Self::{variant} => Some({b}),
|
||||
"###)?;
|
||||
} else {
|
||||
write!(buf, r###"
|
||||
Self::{variant} => None,
|
||||
"###)?;
|
||||
}
|
||||
}
|
||||
|
||||
buf.push_str(
|
||||
r###"
|
||||
}
|
||||
}
|
||||
|
||||
pub fn ascii_art(&self) -> &str {
|
||||
let art = match self {
|
||||
"###,
|
||||
@@ -191,67 +264,43 @@ impl Distro {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Parses ascii distros from neofetch script.
|
||||
fn parse_ascii_distros(neofetch_path: &Path) -> Result<Vec<AsciiDistro>>
|
||||
fn parse_ascii_distros(distro_dir: &Path) -> Result<Vec<AsciiDistro>>
|
||||
{
|
||||
let nf = {
|
||||
let nf = fs::read_to_string(neofetch_path)?;
|
||||
let mut distros = Vec::new();
|
||||
let mut paths: Vec<_> = fs::read_dir(distro_dir)?
|
||||
.filter_map(|e| e.ok())
|
||||
.map(|e| e.path())
|
||||
.collect();
|
||||
// Sort by name length descending, then name descending.
|
||||
// This ensures that more specific distros (e.g. windows_11, arch_small) are
|
||||
// checked before more general ones (e.g. windows, arch).
|
||||
paths.sort_by(|a, b| {
|
||||
b.to_str()
|
||||
.map_or(0, |s| s.len())
|
||||
.cmp(&a.to_str().map_or(0, |s| s.len()))
|
||||
.then(b.cmp(a))
|
||||
});
|
||||
|
||||
// Get the content of "get_distro_ascii" function
|
||||
let (_, nf) = nf
|
||||
.split_once("get_distro_ascii() {\n")
|
||||
.context("couldn't find get_distro_ascii function")?;
|
||||
let (nf, _) = nf
|
||||
.split_once("\n}\n")
|
||||
.context("couldn't find end of get_distro_ascii function")?;
|
||||
|
||||
let mut nf = nf.replace('\t', &" ".repeat(4));
|
||||
|
||||
// Remove trailing spaces
|
||||
while nf.contains(" \n") {
|
||||
nf = nf.replace(" \n", "\n");
|
||||
for path in paths {
|
||||
if path.extension().and_then(|s| s.to_str()) == Some("ascii") {
|
||||
let content = fs::read_to_string(&path)?;
|
||||
let (header_line, art) = content.split_once('\n').context("invalid distro file")?;
|
||||
let header: DistroHeader = serde_json::from_str(header_line)?;
|
||||
let color = match header.color {
|
||||
serde_json::Value::String(s) => s,
|
||||
serde_json::Value::Number(n) => n.to_string(),
|
||||
_ => "7".to_owned(),
|
||||
};
|
||||
distros.push(AsciiDistro {
|
||||
pattern: header.pattern,
|
||||
color,
|
||||
foreground: header.foreground.unwrap_or_default(),
|
||||
background: header.background,
|
||||
art: art.to_owned(),
|
||||
});
|
||||
}
|
||||
nf
|
||||
};
|
||||
|
||||
let case_re = Regex::new(r"case .*? in\n")?;
|
||||
let eof_re = Regex::new(r"EOF[ \n]*?;;")?;
|
||||
|
||||
// Split by blocks
|
||||
let mut blocks = Vec::new();
|
||||
for b in case_re.split(&nf) {
|
||||
blocks.extend(eof_re.split(b).map(|sub| sub.trim()));
|
||||
}
|
||||
|
||||
// Parse blocks
|
||||
fn parse_block(block: &str) -> Option<AsciiDistro> {
|
||||
let (block, art) = block.split_once("'EOF'\n")?;
|
||||
|
||||
// Join \
|
||||
//
|
||||
// > A <backslash> that is not quoted shall preserve the literal value of the
|
||||
// > following character, with the exception of a <newline>. If a <newline>
|
||||
// > follows the <backslash>, the shell shall interpret this as line
|
||||
// > continuation. The <backslash> and <newline> shall be removed before
|
||||
// > splitting the input into tokens. Since the escaped <newline> is removed
|
||||
// > entirely from the input and is not replaced by any white space, it cannot
|
||||
// > serve as a token separator.
|
||||
// See https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02_01
|
||||
let block = block.replace("\\\n", "");
|
||||
|
||||
// Get case pattern
|
||||
let pattern = block
|
||||
.split('\n')
|
||||
.next()
|
||||
.and_then(|pattern| pattern.trim().strip_suffix(')'))?;
|
||||
|
||||
// Unescape backslashes here because backslashes are escaped in neofetch
|
||||
// for printf
|
||||
let art = art.replace(r"\\", r"\");
|
||||
|
||||
Some(AsciiDistro { pattern: pattern.to_owned(), art })
|
||||
}
|
||||
Ok(blocks.iter().filter_map(|block| parse_block(block)).collect())
|
||||
Ok(distros)
|
||||
}
|
||||
|
||||
// Preset parsing
|
||||
|
||||
@@ -372,12 +372,7 @@ impl NormalizedAsciiArt {
|
||||
// Line starts with neofetch color code
|
||||
last = Some(&line[m.span()]);
|
||||
},
|
||||
Some(_) => {
|
||||
new.push_str(last.context(
|
||||
"failed to find neofetch color code from a previous line",
|
||||
)?);
|
||||
},
|
||||
None => {
|
||||
_ => {
|
||||
new.push_str(last.unwrap_or(NEOFETCH_COLOR_PATTERNS[0]));
|
||||
},
|
||||
}
|
||||
@@ -385,7 +380,6 @@ impl NormalizedAsciiArt {
|
||||
|
||||
// Get the last placeholder for the next line
|
||||
if let Some(m) = matches.last() {
|
||||
last.context("non-space character seen before first color code")?;
|
||||
last = Some(&line[m.span()]);
|
||||
}
|
||||
|
||||
|
||||
+363
-136
@@ -1,8 +1,9 @@
|
||||
use std::borrow::Cow;
|
||||
use std::cmp;
|
||||
use std::collections::HashMap;
|
||||
use std::fmt::Write as _;
|
||||
use std::fs::{self, File};
|
||||
use std::io::{self, IsTerminal as _, Read as _};
|
||||
use std::io::{self, IsTerminal as _, Read as _, Write};
|
||||
use std::iter;
|
||||
use std::iter::zip;
|
||||
use std::num::NonZeroU8;
|
||||
@@ -10,6 +11,8 @@ use std::path::{Path, PathBuf};
|
||||
|
||||
use aho_corasick::AhoCorasick;
|
||||
use anyhow::{Context as _, Result};
|
||||
use crossterm::event::{self, Event, KeyCode, KeyEventKind, KeyModifiers};
|
||||
use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
|
||||
use deranged::RangedU8;
|
||||
use enterpolation::bspline::BSpline;
|
||||
use enterpolation::{Curve as _, Generator as _};
|
||||
@@ -21,7 +24,7 @@ use hyfetch::color_util::{
|
||||
NeofetchAsciiIndexedColor, PresetIndexedColor, Theme as _, ToAnsiString as _,
|
||||
};
|
||||
use hyfetch::distros::Distro;
|
||||
use hyfetch::models::Config;
|
||||
use hyfetch::models::{build_hex_color_profile, Config, PresetValue};
|
||||
#[cfg(feature = "macchina")]
|
||||
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};
|
||||
@@ -44,7 +47,7 @@ use tracing::debug;
|
||||
|
||||
fn main() -> Result<()> {
|
||||
add_pkg_path().expect("failed to add pkg path");
|
||||
|
||||
|
||||
#[cfg(windows)]
|
||||
if let Err(err) = enable_ansi_support::enable_ansi_support() {
|
||||
debug!(%err, "could not enable ANSI escape code support");
|
||||
@@ -52,6 +55,16 @@ fn main() -> Result<()> {
|
||||
|
||||
let options = options().run();
|
||||
|
||||
// Read ascii file first to avoid any issues with file descriptors being closed by other operations, and to allow CLI arguments to override config. (https://github.com/hykilpikonna/hyfetch/issues/475)
|
||||
let cli_ascii = if let Some(path) = &options.ascii_file {
|
||||
Some(RawAsciiArt {
|
||||
asc: fs::read_to_string(path).with_context(|| format!("failed to read ascii from {path:?}"))?,
|
||||
fg: Vec::new(),
|
||||
})
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let debug_mode = options.debug;
|
||||
|
||||
init_tracing_subsriber(debug_mode).context("failed to init tracing subscriber")?;
|
||||
@@ -123,43 +136,61 @@ fn main() -> Result<()> {
|
||||
let backend = options.backend.unwrap_or(config.backend);
|
||||
let args = options.args.as_ref().or(config.args.as_ref());
|
||||
|
||||
fn parse_preset_string(preset_string: &str) -> Result<ColorProfile> {
|
||||
fn parse_preset_string(preset_string: &str, config: &Config) -> 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 colors: Vec<String> = preset_string
|
||||
.split(',')
|
||||
.map(|s| s.trim().to_owned())
|
||||
.collect();
|
||||
let color_profile = build_hex_color_profile(&colors)
|
||||
.context("failed to create color profile from hex")?;
|
||||
return Ok(color_profile);
|
||||
}
|
||||
|
||||
let mut preset_profiles: HashMap<String, ColorProfile> = <Preset as VariantArray>::VARIANTS
|
||||
.iter()
|
||||
.map(|preset| (preset.as_ref().to_owned(), preset.color_profile()))
|
||||
.collect();
|
||||
preset_profiles.extend(config.custom_preset_profiles()?);
|
||||
|
||||
if preset_string.contains(',') {
|
||||
let presets: Vec<&str> = preset_string.split(',').map(|s| s.trim()).collect();
|
||||
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())
|
||||
let selected_index = rng.usize(0..presets.len());
|
||||
return parse_preset_string(presets[selected_index], config);
|
||||
}
|
||||
|
||||
if preset_string == "random" {
|
||||
let presets: Vec<ColorProfile> = preset_profiles.values().cloned().collect();
|
||||
if presets.is_empty() {
|
||||
return Err(anyhow::anyhow!("preset iterator should not be empty"));
|
||||
}
|
||||
let mut rng = fastrand::Rng::new();
|
||||
let selected_index = rng.usize(0..presets.len());
|
||||
return Ok(presets[selected_index].clone());
|
||||
}
|
||||
|
||||
if let Some(color_profile) = preset_profiles.get(preset_string) {
|
||||
Ok(color_profile.clone())
|
||||
} 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())
|
||||
let presets = preset_profiles
|
||||
.keys()
|
||||
.map(String::as_str)
|
||||
.chain(iter::once("random"))
|
||||
.sorted()
|
||||
.join(",");
|
||||
Err(anyhow::anyhow!(
|
||||
"PRESET should be comma-separated hex colors or one of {{{presets}}}"
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
// Get preset
|
||||
let preset_string = options.preset.as_deref().unwrap_or(&config.preset);
|
||||
let color_profile = parse_preset_string(preset_string)?;
|
||||
let preset_string = options
|
||||
.preset
|
||||
.clone()
|
||||
.unwrap_or_else(|| config.preset.get_random_if_multiple());
|
||||
let color_profile = parse_preset_string(&preset_string, &config)?;
|
||||
debug!(?color_profile, "color profile");
|
||||
|
||||
// Lighten
|
||||
@@ -177,19 +208,15 @@ fn main() -> Result<()> {
|
||||
};
|
||||
debug!(?color_profile, "lightened color profile");
|
||||
|
||||
let asc = if let Some(path_str) = config.custom_ascii_path {
|
||||
let asc = if let Some(asc) = cli_ascii {
|
||||
asc
|
||||
} else 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 {
|
||||
asc: fs::read_to_string(&path)
|
||||
.with_context(|| format!("failed to read ascii from {path:?}"))?,
|
||||
fg: Vec::new(),
|
||||
}
|
||||
} else {
|
||||
get_distro_ascii(distro, backend).context("failed to get distro ascii")?
|
||||
};
|
||||
@@ -241,15 +268,15 @@ fn det_bg() -> Result<Option<Srgb<u8>>, terminal_colorsaurus::Error> {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
background_color(QueryOptions::default())
|
||||
.map(|terminal_colorsaurus::Color { r, g, b , .. }| Some(Srgb::new(r, g, b).into_format()))
|
||||
.or_else(|err| {
|
||||
if matches!(err, terminal_colorsaurus::Error::UnsupportedTerminal(_)) {
|
||||
Ok(None)
|
||||
} else {
|
||||
Err(err)
|
||||
}
|
||||
})
|
||||
match background_color(QueryOptions::default()) {
|
||||
Ok(terminal_colorsaurus::Color { r, g, b, .. }) => {
|
||||
Ok(Some(Srgb::new(r, g, b).into_format()))
|
||||
}
|
||||
Err(err) => {
|
||||
debug!(?err, "failed to detect background color");
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates config interactively.
|
||||
@@ -447,6 +474,40 @@ fn create_config(
|
||||
//////////////////////////////
|
||||
// 3. Choose preset
|
||||
|
||||
struct RawModeGuard {
|
||||
enabled: bool,
|
||||
}
|
||||
|
||||
impl RawModeGuard {
|
||||
fn new() -> Result<Self> {
|
||||
Ok(Self { enabled: false })
|
||||
}
|
||||
|
||||
fn enable(&mut self) -> Result<()> {
|
||||
if !self.enabled {
|
||||
enable_raw_mode().context("failed to enable terminal raw mode")?;
|
||||
self.enabled = true;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn disable(&mut self) -> Result<()> {
|
||||
if self.enabled {
|
||||
disable_raw_mode().context("failed to disable terminal raw mode")?;
|
||||
self.enabled = false;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for RawModeGuard {
|
||||
fn drop(&mut self) {
|
||||
if self.enabled {
|
||||
let _ = disable_raw_mode();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create flag lines
|
||||
let mut flags = Vec::with_capacity(Preset::COUNT);
|
||||
let spacing = {
|
||||
@@ -473,7 +534,11 @@ fn create_config(
|
||||
name = preset.as_ref(),
|
||||
spacing = usize::from(spacing)
|
||||
);
|
||||
flags.push([name, flag.clone(), flag.clone(), flag]);
|
||||
flags.push((
|
||||
preset.clone(),
|
||||
[name, flag.clone(), flag.clone(), flag],
|
||||
preset.as_ref().to_ascii_lowercase(),
|
||||
));
|
||||
}
|
||||
|
||||
// Calculate flags per row
|
||||
@@ -483,34 +548,28 @@ fn create_config(
|
||||
let rows_per_page = (term_h.saturating_sub(13) / 5).clamp(1, u8::MAX.into()) as u8;
|
||||
(flags_per_row, rows_per_page)
|
||||
};
|
||||
let num_pages = (Preset::COUNT.div_ceil(flags_per_row as usize * rows_per_page as usize)).clamp(0, u8::MAX.into()) as u8;
|
||||
let flags_per_page = usize::from(flags_per_row) * usize::from(rows_per_page);
|
||||
|
||||
// Create pages
|
||||
let mut pages = Vec::with_capacity(usize::from(num_pages));
|
||||
for flags in flags.chunks(usize::from(
|
||||
u16::from(flags_per_row)
|
||||
.checked_mul(u16::from(rows_per_page))
|
||||
.unwrap(),
|
||||
)) {
|
||||
let mut page = Vec::with_capacity(usize::from(rows_per_page));
|
||||
for flags in flags.chunks(usize::from(flags_per_row)) {
|
||||
page.push(flags);
|
||||
fn filter_flag_indices(query: &str, flags: &[(Preset, [String; 4], String)]) -> Vec<usize> {
|
||||
if query.is_empty() {
|
||||
return (0..flags.len()).collect();
|
||||
}
|
||||
pages.push(page);
|
||||
|
||||
let mut matched = flags
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter_map(|(idx, (_, _, preset_name))| {
|
||||
let position = preset_name.find(query)?;
|
||||
Some((idx, preset_name.starts_with(query), position))
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
// Prefix matches are shown first, then other substring matches ordered by earliest index.
|
||||
matched.sort_by_key(|&(idx, is_prefix, position)| (!is_prefix, position, idx));
|
||||
matched.into_iter().map(|(idx, _, _)| idx).collect()
|
||||
}
|
||||
|
||||
let print_flag_page = |page, page_num: u8| -> Result<()> {
|
||||
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
||||
print_title_prompt(option_counter, "Let's choose a flag!");
|
||||
println!("Available flag presets:\nPage: {page_num} of {num_pages}\n", page_num = page_num + 1);
|
||||
for &row in page {
|
||||
print_flag_row(row, color_mode).context("failed to print flag row")?;
|
||||
}
|
||||
println!();
|
||||
Ok(())
|
||||
};
|
||||
|
||||
fn print_flag_row(row: &[[String; 4]], color_mode: AnsiMode) -> Result<()> {
|
||||
fn print_flag_row(row: &[&[String; 4]], color_mode: AnsiMode) -> Result<()> {
|
||||
for i in 0..4 {
|
||||
let mut line = Vec::new();
|
||||
for flag in row {
|
||||
@@ -533,50 +592,214 @@ fn create_config(
|
||||
)
|
||||
.expect("coloring text with default preset should not fail");
|
||||
|
||||
let preset: Preset;
|
||||
let color_profile;
|
||||
let print_flag_page = |filtered_indices: &[usize],
|
||||
page_num: usize,
|
||||
filter: &str,
|
||||
hint: Option<&str>|
|
||||
-> Result<()> {
|
||||
let num_pages = filtered_indices.len().div_ceil(flags_per_page).max(1);
|
||||
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
||||
print_title_prompt(option_counter, "Let's choose a flag!");
|
||||
println!(
|
||||
"Available flag presets:\nPage: {page} of {num_pages}\n",
|
||||
page = page_num + 1
|
||||
);
|
||||
|
||||
let mut page: u8 = 0;
|
||||
loop {
|
||||
print_flag_page(&pages[usize::from(page)], page).context("failed to print flag page")?;
|
||||
let start = page_num * flags_per_page;
|
||||
let end = (start + flags_per_page).min(filtered_indices.len());
|
||||
let mut visible_rows: usize = 0;
|
||||
if start >= end {
|
||||
println!("No presets matched this filter.");
|
||||
} else {
|
||||
for row in filtered_indices[start..end].chunks(usize::from(flags_per_row)) {
|
||||
let row = row
|
||||
.iter()
|
||||
.map(|&idx| &flags[idx].1)
|
||||
.collect::<Vec<&[String; 4]>>();
|
||||
print_flag_row(&row, color_mode).context("failed to print flag row")?;
|
||||
visible_rows += 1;
|
||||
}
|
||||
println!();
|
||||
}
|
||||
// Keep the prompt anchored by reserving a full page worth of flag rows.
|
||||
for _ in visible_rows..usize::from(rows_per_page) {
|
||||
for _ in 0..5 {
|
||||
println!();
|
||||
}
|
||||
}
|
||||
|
||||
let mut opts: Vec<&str> = <Preset as VariantNames>::VARIANTS.into();
|
||||
opts.extend(["next", "n", "prev", "p"]);
|
||||
|
||||
println!("Enter '[n]ext' to go to the next page and '[p]rev' to go to the previous page.");
|
||||
let selection = literal_input(
|
||||
format!("Which {preset_default_colored} do you want to use? "),
|
||||
&opts[..],
|
||||
Preset::Rainbow.as_ref(),
|
||||
false,
|
||||
println!(
|
||||
"Use the up/down arrow keys to go to the previous/next page. Type to filter and press Enter to select."
|
||||
);
|
||||
printc(
|
||||
format!(
|
||||
"Which {preset_default_colored} do you want to use? (default: {}, comma-separated for multiple at random)",
|
||||
Preset::Rainbow.as_ref()
|
||||
),
|
||||
color_mode,
|
||||
)
|
||||
.context("failed to ask for choice input")
|
||||
.context("failed to select preset")?;
|
||||
if selection == "next" || selection == "n" {
|
||||
page = (page + 1) % num_pages;
|
||||
} else if selection == "prev" || selection == "p" {
|
||||
page = (page + num_pages - 1) % num_pages;
|
||||
} else {
|
||||
preset = selection.parse().expect("selected preset should be valid");
|
||||
debug!(?preset, "selected preset");
|
||||
color_profile = preset.color_profile();
|
||||
update_title(
|
||||
&mut title,
|
||||
&mut option_counter,
|
||||
"Selected flag",
|
||||
&color_profile
|
||||
.with_lightness_adaptive(default_lightness, theme)
|
||||
.color_text(
|
||||
preset.as_ref(),
|
||||
color_mode,
|
||||
ForegroundBackground::Foreground,
|
||||
false,
|
||||
)
|
||||
.expect("coloring text with selected preset should not fail"),
|
||||
);
|
||||
break;
|
||||
.context("failed to print preset prompt")?;
|
||||
print!("> {filter}");
|
||||
io::stdout().flush().context("failed to flush preset prompt")?;
|
||||
|
||||
if let Some(hint) = hint {
|
||||
println!("\n{hint}");
|
||||
}
|
||||
Ok(())
|
||||
};
|
||||
|
||||
let selected_preset_names: Vec<String>;
|
||||
let color_profile;
|
||||
|
||||
let mut page: usize = 0;
|
||||
let mut filter = String::new();
|
||||
let mut hint: Option<&str> = None;
|
||||
let mut raw_mode = RawModeGuard::new().context("failed to initialize raw input mode")?;
|
||||
loop {
|
||||
raw_mode
|
||||
.disable()
|
||||
.context("failed to disable raw mode for rendering")?;
|
||||
let filter_lower = filter.to_ascii_lowercase();
|
||||
let parts: Vec<&str> = filter_lower.split(',').collect();
|
||||
let current_query = parts.last().cloned().unwrap_or("");
|
||||
let filtered_indices = filter_flag_indices(current_query, &flags);
|
||||
let num_pages = filtered_indices.len().div_ceil(flags_per_page).max(1);
|
||||
page = page.min(num_pages - 1);
|
||||
|
||||
print_flag_page(&filtered_indices, page, &filter, hint)
|
||||
.context("failed to print flag page")?;
|
||||
hint = None;
|
||||
|
||||
raw_mode
|
||||
.enable()
|
||||
.context("failed to enable raw mode for key input")?;
|
||||
let event = event::read().context("failed to read keyboard event")?;
|
||||
let Event::Key(key) = event else {
|
||||
continue;
|
||||
};
|
||||
if !matches!(key.kind, KeyEventKind::Press | KeyEventKind::Repeat) {
|
||||
continue;
|
||||
}
|
||||
|
||||
match key.code {
|
||||
KeyCode::Enter => {
|
||||
let filter_lower = filter.to_ascii_lowercase();
|
||||
let parts: Vec<&str> = filter_lower.split(',').map(|s| s.trim()).filter(|s| !s.is_empty()).collect();
|
||||
let mut resolved_presets = Vec::new();
|
||||
|
||||
if parts.is_empty() {
|
||||
// Default to Rainbow if nothing is entered
|
||||
resolved_presets.push(Preset::Rainbow.as_ref().to_owned());
|
||||
} else {
|
||||
for part in parts.iter() {
|
||||
let selection = flags
|
||||
.iter()
|
||||
.find(|(_, _, name)| name == part)
|
||||
.map(|(preset, _, _)| preset.as_ref().to_owned())
|
||||
.or_else(|| {
|
||||
// Fuzzy match each part
|
||||
let filtered = filter_flag_indices(part, &flags);
|
||||
filtered.first().map(|&idx| flags[idx].0.as_ref().to_owned())
|
||||
});
|
||||
|
||||
if let Some(p) = selection {
|
||||
resolved_presets.push(p);
|
||||
} else {
|
||||
hint = Some("One or more presets could not be found.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if hint.is_none() {
|
||||
selected_preset_names = resolved_presets;
|
||||
break;
|
||||
}
|
||||
},
|
||||
KeyCode::Up => {
|
||||
page = (page + num_pages - 1) % num_pages;
|
||||
},
|
||||
KeyCode::Down => {
|
||||
page = (page + 1) % num_pages;
|
||||
},
|
||||
KeyCode::Backspace => {
|
||||
filter.pop();
|
||||
page = 0;
|
||||
},
|
||||
KeyCode::Esc => {
|
||||
filter.clear();
|
||||
page = 0;
|
||||
},
|
||||
KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => {
|
||||
raw_mode
|
||||
.disable()
|
||||
.context("failed to disable raw mode before interrupting")?;
|
||||
println!();
|
||||
return Err(anyhow::anyhow!("interrupted by user"));
|
||||
},
|
||||
KeyCode::Char(c)
|
||||
if !key.modifiers.contains(KeyModifiers::CONTROL)
|
||||
&& !key.modifiers.contains(KeyModifiers::ALT) =>
|
||||
{
|
||||
filter.push(c);
|
||||
page = 0;
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
}
|
||||
raw_mode
|
||||
.disable()
|
||||
.context("failed to disable raw mode after preset selection")?;
|
||||
|
||||
let selected_presets = if selected_preset_names.len() > 1 {
|
||||
PresetValue::Multiple(selected_preset_names.clone())
|
||||
} else {
|
||||
PresetValue::Single(selected_preset_names.first().cloned().unwrap_or_else(|| Preset::Rainbow.as_ref().to_owned()))
|
||||
};
|
||||
|
||||
color_profile = {
|
||||
let first_name = selected_preset_names.first().cloned().unwrap_or_else(|| Preset::Rainbow.as_ref().to_owned());
|
||||
if first_name.contains('#') {
|
||||
let colors: Vec<String> = first_name.split(',').map(|s| s.trim().to_owned()).collect();
|
||||
build_hex_color_profile(&colors).expect("hex colors should be valid")
|
||||
} else {
|
||||
flags.iter().find(|(_, _, name)| name == &first_name).map(|(p, _, _)| p.color_profile()).unwrap_or_else(|| Preset::Rainbow.color_profile())
|
||||
}
|
||||
};
|
||||
|
||||
{
|
||||
let colored_names = selected_preset_names.iter().map(|name| {
|
||||
let profile = if name.contains('#') {
|
||||
let colors: Vec<String> = name.split(',').map(|s| s.trim().to_owned()).collect();
|
||||
build_hex_color_profile(&colors).expect("hex colors should be valid")
|
||||
} else {
|
||||
flags.iter().find(|(_, _, n)| n == name).map(|(p, _, _)| p.color_profile()).unwrap_or_else(|| Preset::Rainbow.color_profile())
|
||||
};
|
||||
profile.with_lightness_adaptive(default_lightness, theme)
|
||||
.color_text(name, color_mode, ForegroundBackground::Foreground, false)
|
||||
.expect("coloring text should not fail")
|
||||
}).join(", ");
|
||||
|
||||
let label = if selected_preset_names.len() > 1 {
|
||||
"Selected flags (random)"
|
||||
} else {
|
||||
"Selected flag"
|
||||
};
|
||||
|
||||
update_title(
|
||||
&mut title,
|
||||
&mut option_counter,
|
||||
label,
|
||||
&colored_names,
|
||||
);
|
||||
|
||||
printc(
|
||||
format!(
|
||||
"Which {preset_default_colored} do you want to use? {}\n",
|
||||
colored_names
|
||||
),
|
||||
color_mode,
|
||||
)
|
||||
.context("failed to print preset selection summary")?;
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
@@ -736,26 +959,26 @@ fn create_config(
|
||||
} else {
|
||||
detected_dst.unwrap()
|
||||
};
|
||||
|
||||
|
||||
let running_dst_sml = if Distro::detect(&detected_dst_small_fmt).is_some() {
|
||||
detected_dst_small_fmt
|
||||
} else {
|
||||
"".to_string()
|
||||
};
|
||||
|
||||
|
||||
|
||||
// load ascii
|
||||
let small_asc = get_distro_ascii(Some(&running_dst_sml), backend).context("failed to get distro ascii")?;
|
||||
let small_asc = small_asc.to_normalized().context("failed to normalize ascii")?;
|
||||
|
||||
|
||||
let mut asc = asc;
|
||||
let mut logo_chosen: Option<String> = distro.cloned();
|
||||
|
||||
if small_asc.lines != asc.lines && running_dst_sml != "" {
|
||||
let mut logo_chosen: Option<String> = distro.cloned();
|
||||
|
||||
if small_asc.lines != asc.lines && running_dst_sml != "" {
|
||||
let ds_arrangements = [
|
||||
("Default", asc.clone()),
|
||||
("Small", small_asc.clone())
|
||||
];
|
||||
];
|
||||
|
||||
let arrangements: IndexMap<Cow<str>, NormalizedAsciiArt> =
|
||||
ds_arrangements.map(|(k, a)| (k.into(), a)).into();
|
||||
@@ -792,15 +1015,15 @@ fn create_config(
|
||||
|
||||
// prints small logo w/ big logo
|
||||
for row in &asciis.into_iter().chunks(usize::from(ascii_per_row)) {
|
||||
|
||||
|
||||
let row: Vec<Vec<String>> = row.collect();
|
||||
|
||||
|
||||
for i in 0..usize::from(asc.h).checked_add(1).unwrap() {
|
||||
let mut line = Vec::new();
|
||||
for lines in &row {
|
||||
line.push(&*lines[i]);
|
||||
}
|
||||
printc(line.join(" "), color_mode).context("failed to print ascii line")?;
|
||||
printc(line.join(" "), color_mode).context("failed to print ascii line")?;
|
||||
}
|
||||
|
||||
println!();
|
||||
@@ -811,7 +1034,7 @@ fn create_config(
|
||||
let choice = literal_input("Your choice?", &opts[..], "default", true, color_mode)
|
||||
.context("failed to ask for choice input")
|
||||
.context("failed to select logo type").context("failed to ask for choice input")?;
|
||||
|
||||
|
||||
if choice.to_lowercase() == "small" {
|
||||
logo_chosen = Some(running_dst_sml);
|
||||
asc = small_asc;
|
||||
@@ -938,16 +1161,19 @@ fn create_config(
|
||||
}
|
||||
|
||||
// Save choice
|
||||
color_align = arrangements
|
||||
.into_iter()
|
||||
.find_map(|(k, ca)| {
|
||||
if k.to_lowercase() == choice {
|
||||
Some(ca)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.expect("selected color alignment should be valid");
|
||||
color_align = if choice == "horizontal" { ColorAlignment::Horizontal }
|
||||
else if choice == "vertical" { ColorAlignment::Vertical }
|
||||
else {
|
||||
arrangements.into_iter()
|
||||
.find_map(|(k, ca)| {
|
||||
if k.to_lowercase() == choice {
|
||||
Some(ca)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.expect("selected color alignment is not valid") // TODO: it sould ask the user to retry instead of panicking
|
||||
};
|
||||
debug!(?color_align, "selected color alignment");
|
||||
break;
|
||||
}
|
||||
@@ -1054,7 +1280,7 @@ fn create_config(
|
||||
// Create config
|
||||
clear_screen(Some(&title), color_mode, debug_mode).context("failed to clear screen")?;
|
||||
let config = Config {
|
||||
preset: preset.as_ref().to_string(),
|
||||
preset: selected_presets,
|
||||
mode: color_mode,
|
||||
light_dark: Some(theme),
|
||||
auto_detect_light_dark: Some(det_bg.is_some()),
|
||||
@@ -1065,6 +1291,7 @@ fn create_config(
|
||||
distro: logo_chosen,
|
||||
pride_month_disable: false,
|
||||
custom_ascii_path,
|
||||
custom_presets: None,
|
||||
};
|
||||
debug!(?config, "created config");
|
||||
|
||||
@@ -1143,4 +1370,4 @@ fn init_tracing_subsriber(debug_mode: bool) -> Result<()> {
|
||||
subscriber
|
||||
.try_init()
|
||||
.context("failed to set the global default subscriber")
|
||||
}
|
||||
}
|
||||
@@ -55,7 +55,7 @@ pub fn options() -> OptionParser<Options> {
|
||||
let preset = long("preset")
|
||||
.short('p')
|
||||
.help(&*format!(
|
||||
"Use preset or comma-separated color list or comma-separated hex colors (e.g., \"#ff0000,#00ff00,#0000ff\")
|
||||
"Use preset or comma-separated color list or comma-separated hex colors (e.g., \"#ff0000,#00ff00,#0000ff\"). Comma-separated preset names will pick one randomly.
|
||||
PRESET={{{presets}}}",
|
||||
presets = <Preset as VariantNames>::VARIANTS
|
||||
.iter()
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use anyhow::{Context as _, Result};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::color_profile::ColorProfile;
|
||||
use crate::color_util::Lightness;
|
||||
use crate::neofetch_util::ColorAlignment;
|
||||
use crate::types::{AnsiMode, Backend, TerminalTheme};
|
||||
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
pub struct Config {
|
||||
pub preset: String,
|
||||
pub preset: PresetValue,
|
||||
pub mode: AnsiMode,
|
||||
pub auto_detect_light_dark: Option<bool>,
|
||||
pub light_dark: Option<TerminalTheme>,
|
||||
@@ -19,6 +23,7 @@ pub struct Config {
|
||||
pub distro: Option<String>,
|
||||
pub pride_month_disable: bool,
|
||||
pub custom_ascii_path: Option<String>,
|
||||
pub custom_presets: Option<HashMap<String, Vec<String>>>,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
@@ -32,6 +37,40 @@ impl Config {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
pub fn custom_preset_profiles(&self) -> Result<HashMap<String, ColorProfile>> {
|
||||
let mut profiles = HashMap::new();
|
||||
if let Some(custom_presets) = &self.custom_presets {
|
||||
for (preset_name, colors) in custom_presets {
|
||||
if preset_name == "random" {
|
||||
return Err(anyhow::anyhow!("custom preset key `random` is reserved"));
|
||||
}
|
||||
let color_profile = build_hex_color_profile(colors).with_context(|| {
|
||||
format!("failed to validate custom preset key `{preset_name}`")
|
||||
})?;
|
||||
profiles.insert(preset_name.clone(), color_profile);
|
||||
}
|
||||
}
|
||||
Ok(profiles)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn build_hex_color_profile(hex_colors: &[String]) -> Result<ColorProfile> {
|
||||
if hex_colors.is_empty() {
|
||||
return Err(anyhow::anyhow!("hex color list cannot be empty"));
|
||||
}
|
||||
|
||||
for color in hex_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(hex_colors.to_vec())
|
||||
.context("failed to create color profile from hex")
|
||||
}
|
||||
|
||||
mod args_serde {
|
||||
@@ -117,3 +156,33 @@ mod args_serde {
|
||||
deserializer.deserialize_option(OptionVisitor)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum PresetValue {
|
||||
Single(String),
|
||||
Multiple(Vec<String>),
|
||||
}
|
||||
|
||||
impl From<String> for PresetValue {
|
||||
fn from(s: String) -> Self {
|
||||
PresetValue::Single(s)
|
||||
}
|
||||
}
|
||||
|
||||
impl PresetValue {
|
||||
pub fn get_random_if_multiple(&self) -> String {
|
||||
match self {
|
||||
PresetValue::Single(s) => s.clone(),
|
||||
PresetValue::Multiple(v) => {
|
||||
if v.is_empty() {
|
||||
"random".to_owned()
|
||||
} else {
|
||||
let mut rng = fastrand::Rng::new();
|
||||
let selected_index = rng.usize(0..v.len());
|
||||
v[selected_index].clone()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,6 @@ use std::ffi::OsStr;
|
||||
#[cfg(feature = "macchina")]
|
||||
use std::fs;
|
||||
use std::io::{Write as _};
|
||||
#[cfg(windows)]
|
||||
use std::io::{self};
|
||||
use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
use std::sync::OnceLock;
|
||||
@@ -155,7 +153,13 @@ pub fn add_pkg_path() -> Result<()> {
|
||||
// Get PATH
|
||||
let pv = &env::var_os("PATH").context("`PATH` env var is not set or invalid")?;
|
||||
let mut path = env::split_paths(pv).collect::<Vec<_>>();
|
||||
let exe = env::current_exe().context("failed to get path of current running executable")?;
|
||||
let exe = match env::current_exe() {
|
||||
Ok(exe) => exe,
|
||||
Err(e) => {
|
||||
debug!("Failed to get path of current running executable: {}", e);
|
||||
return Ok(());
|
||||
}
|
||||
};
|
||||
let base = exe.parent().unwrap();
|
||||
|
||||
// Add from bin: ../git, ../fastfetch, ../scripts
|
||||
@@ -235,27 +239,27 @@ pub fn get_distro_ascii<S>(distro: Option<S>, backend: Backend) -> Result<RawAsc
|
||||
where
|
||||
S: AsRef<str> + fmt::Debug,
|
||||
{
|
||||
let distro: Cow<_> = if let Some(distro) = distro.as_ref() {
|
||||
let distro_name: Cow<_> = if let Some(distro) = distro.as_ref() {
|
||||
distro.as_ref().into()
|
||||
} else {
|
||||
get_distro_name(backend)
|
||||
.context("failed to get distro name")?
|
||||
.into()
|
||||
};
|
||||
debug!(%distro, "distro name");
|
||||
debug!(%distro_name, "distro name");
|
||||
|
||||
// Try new codegen-based detection method
|
||||
if let Some(distro) = Distro::detect(&distro) {
|
||||
if let Some(distro) = Distro::detect(&distro_name) {
|
||||
let asc = distro.ascii_art().to_owned();
|
||||
let fg = ascii_foreground(&distro);
|
||||
|
||||
return Ok(RawAsciiArt { asc, fg });
|
||||
}
|
||||
|
||||
debug!(%distro, "could not find a match for distro; falling back to neofetch");
|
||||
debug!(%distro_name, "could not find a match for distro; falling back to neofetch");
|
||||
|
||||
// Old detection method that calls neofetch
|
||||
let asc = run_neofetch_command_piped(&["print_ascii", "--ascii_distro", distro.as_ref()])
|
||||
let asc = run_neofetch_command_piped(&["print_ascii", "--ascii_distro", distro_name.as_ref()])
|
||||
.context("failed to get ascii art from neofetch")?;
|
||||
|
||||
// Unescape backslashes here because backslashes are escaped in neofetch for
|
||||
@@ -316,31 +320,53 @@ where
|
||||
/// Gets the absolute path of the bash command.
|
||||
#[cfg(windows)]
|
||||
fn bash_path() -> Result<PathBuf> {
|
||||
// Find `bash.exe` in `PATH`, but exclude the known bad paths
|
||||
if let Some(bash_path) = find_in_path("bash.exe").context("bash.exe not found")? {
|
||||
// Check if it's not MSYS bash https://stackoverflow.com/a/58418686/1529493
|
||||
if !bash_path.ends_with(r"Git\usr\bin\bash.exe") {
|
||||
// Check if it's not WSL bash
|
||||
// See https://github.com/hykilpikonna/hyfetch/issues/233
|
||||
let windir = env::var_os("windir").context("`windir` environ not found")?;
|
||||
match is_same_file(&bash_path, Path::new(&windir).join(r"System32\bash.exe")) {
|
||||
Ok(false) => return Ok(bash_path),
|
||||
Err(err) if err.kind() == io::ErrorKind::NotFound => return Ok(bash_path),
|
||||
_ => {}
|
||||
// 1. Try to find a good bash.exe in PATH
|
||||
let bash_in_path = find_in_path("bash.exe").unwrap_or(None);
|
||||
if let Some(pth) = &bash_in_path {
|
||||
// Check if it's not WSL bash
|
||||
// See https://github.com/hykilpikonna/hyfetch/issues/233
|
||||
let is_wsl = (|| {
|
||||
let windir = env::var_os("windir")?;
|
||||
let wsl_bash = Path::new(&windir).join(r"System32\bash.exe");
|
||||
Some(is_same_file(pth, &wsl_bash).unwrap_or(false))
|
||||
})()
|
||||
.unwrap_or(false);
|
||||
|
||||
if !is_wsl {
|
||||
// Check if it's not MSYS bash https://stackoverflow.com/a/58418686/1529493
|
||||
// We prefer the Git wrapper bash if possible, but we'll accept this if it's all we have.
|
||||
if !pth.ends_with(r"Git\usr\bin\bash.exe") {
|
||||
return Ok(pth.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(bash_path) = find_in_path("git.exe").context("failed to find `git.exe` in `PATH`")? {
|
||||
if bash_path.ends_with(r"Git\cmd\git.exe") {
|
||||
let pth = bash_path.parent().unwrap().parent().unwrap().join(r"bin\bash.exe");
|
||||
if pth.is_file() {
|
||||
return Ok(pth);
|
||||
// 2. Try to find git.exe in PATH and look for bash.exe relative to it
|
||||
if let Ok(Some(git_path)) = find_in_path("git.exe") {
|
||||
let mut current = git_path.clone();
|
||||
for _ in 0..3 {
|
||||
if let Some(parent) = current.parent() {
|
||||
let bin_bash = parent.join(r"bin\bash.exe");
|
||||
if bin_bash.is_file() {
|
||||
return Ok(bin_bash);
|
||||
}
|
||||
let usr_bin_bash = parent.join(r"usr\bin\bash.exe");
|
||||
if usr_bin_bash.is_file() {
|
||||
return Ok(usr_bin_bash);
|
||||
}
|
||||
current = parent.to_path_buf();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Err(anyhow!("bash.exe not found"))
|
||||
// 3. Fallback to whatever bash we found in PATH (even if it was the MSYS one)
|
||||
if let Some(pth) = bash_in_path {
|
||||
return Ok(pth);
|
||||
}
|
||||
|
||||
Err(anyhow!("bash.exe not found. Please ensure Git for Windows is installed and in your PATH."))
|
||||
}
|
||||
|
||||
/// Runs neofetch command, returning the piped stdout output.
|
||||
@@ -383,8 +409,14 @@ where
|
||||
{
|
||||
let bash_path = bash_path().context("failed to get bash path")?;
|
||||
let mut command = Command::new(bash_path);
|
||||
command.arg(neofetch_path);
|
||||
command.args(args);
|
||||
|
||||
// Convert path to use forward slashes because bash will interpret backslashes as escapes
|
||||
command.arg(neofetch_path.to_string_lossy().replace('\\', "/"));
|
||||
|
||||
for arg in args {
|
||||
// Also convert any backslashes in arguments to forward slashes for bash
|
||||
command.arg(arg.as_ref().to_string_lossy().replace('\\', "/"));
|
||||
}
|
||||
Ok(command)
|
||||
}
|
||||
}
|
||||
@@ -503,7 +535,7 @@ pub fn get_distro_name(backend: Backend) -> Result<String> {
|
||||
doc["spacing"] = value(0);
|
||||
doc["padding"] = value(0);
|
||||
// See https://github.com/Macchina-CLI/macchina/issues/319
|
||||
// doc["hide_ascii"] = value(true);
|
||||
doc["hide_ascii"] = value(false);
|
||||
doc["separator"] = value("");
|
||||
doc["custom_ascii"] = Item::Table(Table::from_iter([(
|
||||
"path",
|
||||
@@ -534,8 +566,11 @@ pub fn get_distro_name(backend: Backend) -> Result<String> {
|
||||
];
|
||||
run_macchina_command_piped(&args[..])
|
||||
.map(|s| {
|
||||
anstream::adapter::strip_str(&s)
|
||||
.to_string()
|
||||
let s = anstream::adapter::strip_str(&s).to_string();
|
||||
let s = s.trim();
|
||||
s.splitn(2, '-')
|
||||
.last()
|
||||
.expect("splitn with 2 should always have at least 1 element")
|
||||
.trim()
|
||||
.to_owned()
|
||||
})
|
||||
@@ -655,6 +690,7 @@ fn run_macchina(asc: String, args: Option<&Vec<String>>) -> Result<()> {
|
||||
.context("failed to create temp file for macchina theme")?;
|
||||
let theme_doc = {
|
||||
let mut doc = DocumentMut::new();
|
||||
doc["hide_ascii"] = value(false);
|
||||
doc["custom_ascii"] = Item::Table(Table::from_iter([(
|
||||
"path",
|
||||
&*asc_file_path.to_string_lossy(),
|
||||
@@ -696,65 +732,8 @@ fn run_macchina(asc: String, args: Option<&Vec<String>>) -> Result<()> {
|
||||
/// Gets the color indices that should be considered as foreground, for a
|
||||
/// particular distro's ascii art.
|
||||
fn ascii_foreground(distro: &Distro) -> Vec<NeofetchAsciiIndexedColor> {
|
||||
let fg: Vec<u8> = match distro {
|
||||
Distro::Anarchy => vec![2],
|
||||
Distro::Android => vec![2],
|
||||
Distro::Antergos => vec![1],
|
||||
Distro::ArchStrike => vec![2],
|
||||
Distro::Arkane => vec![1],
|
||||
Distro::Asahi => vec![5],
|
||||
Distro::Astra_Linux => vec![2],
|
||||
Distro::BlackArch => vec![3],
|
||||
Distro::CelOS => vec![3],
|
||||
Distro::Chapeau => vec![2],
|
||||
Distro::Chrom => vec![5],
|
||||
Distro::Clear_Linux_OS => vec![2],
|
||||
Distro::Container_Linux_by_CoreOS => vec![3],
|
||||
Distro::CRUX => vec![3],
|
||||
Distro::EuroLinux => vec![2],
|
||||
Distro::eweOS => vec![3],
|
||||
Distro::Fedora => vec![2],
|
||||
Distro::Fedora_Sericea => vec![2],
|
||||
Distro::Fedora_Silverblue => vec![2],
|
||||
Distro::GalliumOS => vec![2],
|
||||
Distro::Gentoo => vec![1],
|
||||
Distro::HarDClanZ => vec![2],
|
||||
Distro::Kibojoe => vec![3],
|
||||
Distro::KrassOS => vec![2],
|
||||
Distro::Kubuntu => vec![2],
|
||||
Distro::Linux => vec![1],
|
||||
Distro::LinuxFromScratch => vec![1, 3],
|
||||
Distro::Lubuntu => vec![2],
|
||||
Distro::openEuler => vec![2],
|
||||
Distro::orchid => vec![1],
|
||||
Distro::Panwah => vec![1],
|
||||
Distro::Peppermint => vec![2],
|
||||
Distro::PNM_Linux => vec![2],
|
||||
Distro::Pop__OS => vec![2],
|
||||
Distro::Reborn_OS => vec![1],
|
||||
Distro::SalentOS => vec![4],
|
||||
Distro::Septor => vec![2],
|
||||
Distro::Ubuntu_Cinnamon => vec![2],
|
||||
Distro::Ubuntu_Kylin => vec![2],
|
||||
Distro::Ubuntu_MATE => vec![2],
|
||||
Distro::Ubuntu_old => vec![2],
|
||||
Distro::Ubuntu_Studio => vec![2],
|
||||
Distro::Ubuntu_Sway => vec![2],
|
||||
Distro::Ultramarine_Linux => vec![2],
|
||||
Distro::Univention => vec![2],
|
||||
Distro::uwuntu => vec![2],
|
||||
Distro::Vanilla => vec![2],
|
||||
Distro::VNux => vec![3, 5],
|
||||
Distro::Void => vec![2],
|
||||
Distro::Xray_OS => vec![2, 3],
|
||||
Distro::Xubuntu => vec![2],
|
||||
_ => Vec::new(),
|
||||
};
|
||||
|
||||
fg.into_iter()
|
||||
.map(|fore| {
|
||||
fore.try_into()
|
||||
.expect("`fore` should be a valid neofetch color index")
|
||||
})
|
||||
distro.foreground()
|
||||
.iter()
|
||||
.map(|&f| f.try_into().expect("neofetch color index should be valid"))
|
||||
.collect()
|
||||
}
|
||||
|
||||
@@ -85,12 +85,7 @@ where
|
||||
|
||||
let metadata = match fs::metadata(path) {
|
||||
Ok(metadata) => metadata,
|
||||
Err(err) if err.kind() == io::ErrorKind::NotFound => {
|
||||
return Ok(None);
|
||||
},
|
||||
Err(err) => {
|
||||
return Err(err).with_context(|| format!("failed to get metadata for {path:?}"));
|
||||
},
|
||||
Err(_) => return Ok(None)
|
||||
};
|
||||
|
||||
if !metadata.is_file() {
|
||||
|
||||
+5
-4
@@ -1,7 +1,7 @@
|
||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
||||
.TH VERSION: "1" "October 2025" "Version: 2.0.4" "User Commands"
|
||||
.TH VERSION: "1" "April 2026" "Version: 2.1.0" "User Commands"
|
||||
.SH NAME
|
||||
Version: \- manual page for Version: 2.0.4
|
||||
Version: \- manual page for Version: 2.1.0
|
||||
.SH SYNOPSIS
|
||||
.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
|
||||
@@ -21,8 +21,9 @@ Use another config file
|
||||
.TP
|
||||
\fB\-p\fR, \fB\-\-preset\fR=\fI\,PRESET\/\fR
|
||||
Use preset or comma\-separated color list or comma\-separated hex colors
|
||||
(e.g., "#ff0000,#00ff00,#0000ff")
|
||||
PRESET={rainbow,transgender,nonbinary,xenogender,agender,queer,genderfluid,bisexual,pansexual,polysexual,omnisexual,omniromantic,gay\-men,lesbian,abrosexual,asexual,aromantic,fictosexual,aroace1,aroace2,aroace3,autosexual,intergender,greygender,akiosexual,bigender,demigender,demiboy,demigirl,transmasculine,transfeminine,genderfaun,demifaun,genderfae,demifae,neutrois,biromantic1,biromantic2,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,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,caninekin,libragender,librafeminine,libramasculine,libraandrogyne,libranonbinary,fluidflux1,fluidflux2,beiyang,burger,throatlozenges,band,random}
|
||||
(e.g., "#ff0000,#00ff00,#0000ff"). Comma\-separated preset names will
|
||||
pick one randomly.
|
||||
PRESET={rainbow,transgender,nonbinary,xenogender,agender,queer,genderfluid,bisexual,pansexual,polysexual,omnisexual,omniromantic,gay\-men,lesbian,abrosexual,asexual,aromantic,fictosexual,aroace1,aroace2,aroace3,autosexual,intergender,greygender,akiosexual,bigender,demigender,demiboy,demigirl,transmasculine,transfeminine,genderfaun,demifaun,genderfae,demifae,neutrois,biromantic1,biromantic2,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,plural,fraysexual,bear,butch,femme,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,caninekin,libragender,librafeminine,libramasculine,libraandrogyne,libranonbinary,fluidflux1,fluidflux2,transbian,autism,cenelian,transneutral,beiyang,burger,throatlozenges,band,petergriffin,rubber,haruhi,random}
|
||||
.TP
|
||||
\fB\-m\fR, \fB\-\-mode\fR=\fI\,MODE\/\fR
|
||||
Color mode MODE={8bit,rgb}
|
||||
|
||||
+23
-21
@@ -1,7 +1,7 @@
|
||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
||||
.TH NEOFETCH "1" "October 2025" "Neofetch 8.0.4" "User Commands"
|
||||
.TH NEOFETCH "1" "April 2026" "Neofetch 8.1.0" "User Commands"
|
||||
.SH NAME
|
||||
Neofetch \- manual page for Neofetch 8.0.4
|
||||
Neofetch \- manual page for Neofetch 8.1.0
|
||||
.SH SYNOPSIS
|
||||
.B neofetch
|
||||
\fI\,func_name --option "value" --option "value"\/\fR
|
||||
@@ -326,13 +326,13 @@ BigLinux_large, Bitrig, BlackArch, BlackMesa, blackPanther, BLAG,
|
||||
BlankOn, BlueLight, Bodhi, bonsai, BSD, BunsenLabs, CachyOS,
|
||||
Calculate, CalinixOS, Carbs, CBL\-Mariner, CelOS, Center, CentOS,
|
||||
Chakra, ChaletOS, Chapeau, Chimera, ChonkySealOS, Chrom, Cleanjaro,
|
||||
Clear Linux OS, ClearOS, Clover, Cobalt, Condres, Container Linux by
|
||||
CoreOS, CRUX, Crystal Linux, Cucumber, CutefishOS, CuteOS, CyberOS,
|
||||
dahlia, DarkOs, Darwin, Debian, Deepin, DesaOS, Devuan, DietPi,
|
||||
digital UNIX, DracOS, DragonFly, Drauger, Droidian, Elementary,
|
||||
Elive, EncryptOS, EndeavourOS, Endless, Enso, EuroLinux,
|
||||
EvolutionOS, eweOS, Exherbo, Exodia Predator OS, Fedora, Fedora
|
||||
Kinoite, Fedora Sericea, Fedora Silverblue, Fedora_unicode,
|
||||
Clear Linux OS, ClearOS, Clover, Cobalt, Codex Linux, Condres,
|
||||
Container Linux by CoreOS, CRUX, Crystal Linux, Cucumber,
|
||||
CutefishOS, CuteOS, CyberOS, dahlia, DarkOs, Darwin, Debian, Deepin,
|
||||
DesaOS, Devuan, DietPi, digital UNIX, DracOS, DragonFly, Drauger,
|
||||
Droidian, Elementary, Elive, EncryptOS, EndeavourOS, Endless, Enso,
|
||||
EuroLinux, EvolutionOS, eweOS, Exherbo, Exodia Predator OS, Fedora,
|
||||
Fedora Kinoite, Fedora Sericea, Fedora Silverblue, Fedora_unicode,
|
||||
FemboyOS, Feren, Finnix, Floflis, FreeBSD, FreeMiNT, Frugalware,
|
||||
Funtoo, Furreto, GalliumOS, Garuda, Gentoo, GhostBSD, glaucus,
|
||||
Gloire, gNewSense, GNOME, GNU, GoboLinux, GrapheneOS, Grombyang,
|
||||
@@ -352,22 +352,24 @@ Tumbleweed, openSUSE Tumbleweed\-Slowroll, OPNsense, Oracle, orchid,
|
||||
OS Elbrus, PacBSD, Panwah, Parabola, parch, Pardus, Parrot, Parsix,
|
||||
PCBSD, PCLinuxOS, pearOS, Pengwin, Pentoo, Peppermint, Peropesis,
|
||||
phyOS, PikaOS, Pisi, PNM Linux, Pop!_OS, Porteus, PostMarketOS,
|
||||
Profelis SambaBOX, Proxmox, PuffOS, Puppy, PureOS, Q4OS, Qubes,
|
||||
Profelis SambaBOX, Proxmox, PuffOS, Puppy, PureOS, Q4OS, QNX, Qubes,
|
||||
Qubyt, Quibian, Radix, Raspbian, ravynOS, Reborn OS, Red Star,
|
||||
Redcore, Redhat, Refracted Devuan, Regata, Regolith, RhaymOS, Rhino
|
||||
Linux, rocky, Rosa, Sabayon, sabotage, Sailfish, SalentOS, Salient
|
||||
OS, Salix, Sasanqua, Scientific, semc, Septor, Serene, SharkLinux,
|
||||
ShastraOS, Siduction, SkiffOS, Slackel, Slackware, SliTaz, SmartOS,
|
||||
Soda, Solus, Source Mage, Sparky, Star, SteamOS, Stock Linux, Sulin,
|
||||
SunOS, SwagArch, t2, Tails, Tatra, TeArch, TorizonCore, Trisquel,
|
||||
Twister, Ubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin,
|
||||
Ubuntu MATE, Ubuntu Studio, Ubuntu Sway, Ubuntu Touch, Ubuntu\-GNOME,
|
||||
ubuntu_old02, Ultramarine Linux, unicodearch, Univalent, Univention,
|
||||
Uos, UrukOS, uwuntu, Vanilla, Venom, VNux, Void, VzLinux, wii\-linuxngx, Windows, Windows 10, Windows 11, Windows95, Wrt, Xenia, Xenia2,
|
||||
XFerience, Xray_OS, Xubuntu, yiffOS, Zorin have ascii logos.
|
||||
OS, Salix, Sasanqua, Scientific, secureblue, semc, Septor, Serene,
|
||||
SharkLinux, ShastraOS, Siduction, SkiffOS, Slackel, Slackware,
|
||||
SliTaz, SmartOS, Soda, Solus, Source Mage, Sparky, Star, SteamOS,
|
||||
Stock Linux, Sulin, SunOS, SwagArch, t2, Tails, Tatra, TeArch,
|
||||
TorizonCore, Trisquel, Twister, Ubuntu, Ubuntu Budgie, Ubuntu
|
||||
Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Sway,
|
||||
Ubuntu Touch, Ubuntu\-GNOME, ubuntu_old02, Ultramarine Linux,
|
||||
unicodearch, Univalent, Univention, Uos, UrukOS, uwuntu, Vanilla,
|
||||
Venom, VNux, Void, VzLinux, wii\-linux\-ngx, Windows, Windows 10,
|
||||
Windows 11, Windows95, Wrt, Xenia, Xenia2, XFerience, Xray_OS,
|
||||
Xubuntu, yiffOS, Zirconium, Zorin have ascii logos.
|
||||
.TP
|
||||
NOTE: arch, dragonfly, Fedora, LangitKetujuh, nixos, redhat, Ubuntu
|
||||
have 'old' logo variants, use {distro}_old to use them.
|
||||
NOTE: arch, dragonfly, Fedora, LangitKetujuh, nixos, redhat, Ubuntu,
|
||||
void have 'old' logo variants, use {distro}_old to use them.
|
||||
.TP
|
||||
NOTE: alpine, android, arch, arcolinux, artix, CalinixOS, centos,
|
||||
cleanjaro, crux, debian, dragonfly, elementary, endeavouros, fedora,
|
||||
|
||||
@@ -5,6 +5,13 @@ import os
|
||||
from .py import run_py
|
||||
from .rs import run_rust
|
||||
|
||||
|
||||
def run_neofetch():
|
||||
from .neofetch_util import run_neofetch_cmd
|
||||
import sys
|
||||
run_neofetch_cmd(sys.argv[1:])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if os.environ.get('HYFETCH_PY', False):
|
||||
run_py()
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
VERSION = '2.0.4'
|
||||
VERSION = '2.1.0'
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
adelie = AsciiArt(match=r'''"Adélie"* | "Adelie"*''', color='4 7 6', ascii=r"""
|
||||
{"match": "\"Ad\u00e9lie\"* | \"Adelie\"*", "color": "4 7 6"}
|
||||
${c1} ${c3} ,-^-___
|
||||
${c3} /\\\///
|
||||
${c2}refined.${c1} /\\\\//
|
||||
@@ -18,6 +14,4 @@ ${c1} ///////${c3}\\\\\\\\\\//
|
||||
/\\\/${c1}\\/
|
||||
/\\\\//
|
||||
//////
|
||||
/// ${c3}\\\\\
|
||||
""")
|
||||
|
||||
/// ${c3}\\\\\
|
||||
@@ -0,0 +1,15 @@
|
||||
{"match": "\"Aeon\"*", "color": "38;5;36 38;5;36"}
|
||||
⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷
|
||||
⣿⡇ ⢸⣿
|
||||
⣿⡇ ⢀⣀ ⣀⡀ ⢸⣿
|
||||
⣿⣇ ⠸⣿⣄ ⣠⣿⠇ ⣸⣿
|
||||
⢹⣿⡄ ⠙⠻⠿⠿⠟⠋ ⢠⣿⡏
|
||||
⠹⣿⣦⡀ ⢀⣴⣿⠏
|
||||
⠈⠛⢿⣶⣤⣄ ⣠⣤⣶⡿⠛⠁
|
||||
${c2} ⣠⣴⡿⠿⠛ ⠛⠿⢿⣦⣄
|
||||
⣠⣾⠟⠉ ⠉⠻⣷⣄
|
||||
⢰⣿⠏ ⢀⣤⣶⣶⣤⡀ ⠹⣿⡆
|
||||
⣿⡟ ⢰⣿⠏⠁⠈⠹⣿⡆ ⢿⣿
|
||||
⣿⡇ ⠈⠋ ⠙⠁ ⢸⣿
|
||||
⣿⡇ ⢸⣿
|
||||
⣿⣷⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣾⣿
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
aeros = AsciiArt(match=r'''"aerOS"*''', color='fg 0 0 0', ascii=r"""
|
||||
{"match": "\"aerOS\"*", "color": "fg 0 0 0"}
|
||||
${c1}
|
||||
ooo OOO OOO ooo
|
||||
oOO OOo
|
||||
@@ -24,6 +20,4 @@ ${c1}
|
||||
oO OOo
|
||||
oOO OOo
|
||||
oOO OOo
|
||||
ooo OOO OOO ooo
|
||||
""")
|
||||
|
||||
ooo OOO OOO ooo
|
||||
@@ -0,0 +1,17 @@
|
||||
{"match": "\"AerynOS\"*", "color": "7 5"}
|
||||
;llll.
|
||||
0MMMMMM:
|
||||
NMMMMMMMMd
|
||||
.@ .cccccccccoWMMMMMMMMMM0
|
||||
@@ .MMMMMMMMMMMMMMMMMMMMMMMN
|
||||
OMMMMMMMMMMMMMMMW.
|
||||
.@ .MMMMMMMMMMMMMMMMMMM.
|
||||
.@ dMMMMMMMMMMMMMMMMMMl OMMMMMMMMk
|
||||
.OWMMMMM; dMMMMMMMMMk
|
||||
.MMMMMMMMMk
|
||||
@@ ooooooooooooooooooo .MMMMMMMMMN
|
||||
.@ oooooMMMMMMMMMMMMP NMMMMMMMMW.
|
||||
KMMMMMMMMMM. 0MMMMMMMMM:
|
||||
NMMMMMMMMM. dMMMMMMMMMd
|
||||
.WMMMMMMMW. XMMMMMMMMO
|
||||
.MMMMMMMk. xMMMMMMMMX
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
afterglow = AsciiArt(match=r'''"Afterglow"*''', color='5 1 3 4', ascii=r"""
|
||||
{"match": "\"Afterglow\"*", "color": "5 1 3 4"}
|
||||
${c2} .
|
||||
${c1}. ${c2}.{!
|
||||
${c1}.L! ${c2}J@||*
|
||||
@@ -17,6 +13,4 @@ ${c2} .
|
||||
${c3}.@FJJJF`${c4},@LFFFF`
|
||||
${c3}_@FFFFF ${c4}VLLLP`
|
||||
${c3}J@@LL@" ${c4}`"
|
||||
${c3}V@@"
|
||||
""")
|
||||
|
||||
${c3}V@@"
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
aix = AsciiArt(match=r'''"AIX"*''', color='2 7', ascii=r"""
|
||||
{"match": "\"AIX\"*", "color": "2 7"}
|
||||
${c1} `:+ssssossossss+-`
|
||||
.oys///oyhddddhyo///sy+.
|
||||
/yo:+hNNNNNNNNNNNNNNNNh+:oy/
|
||||
@@ -22,6 +18,4 @@ h//NNNNh ossss` +h md- .hm/ `sNNNNN:+y
|
||||
:h+-yNNNNNNNNNNNNNNNNNNNNNNs-oh-
|
||||
:ys:/yNNNNNNNNNNNNNNNmy/:sy:
|
||||
.+ys///osyhhhhys+///sy+.
|
||||
-/osssossossso/-
|
||||
""")
|
||||
|
||||
-/osssossossso/-
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
almalinux = AsciiArt(match=r'''"AlmaLinux"*''', color='1 3 4 2 6', ascii=r"""
|
||||
{"match": "\"AlmaLinux\"*", "color": "1 3 4 2 6"}
|
||||
${c1} 'c:.
|
||||
${c1} lkkkx, .. ${c2}.. ,cc,
|
||||
${c1} okkkk:ckkx' ${c2}.lxkkx.okkkkd
|
||||
@@ -22,6 +18,4 @@ ${c3} ..... ${c5}.;dk:. ${c5}lkk. ${c4}:;,
|
||||
,c,,;;;:xkkd.
|
||||
;kkkkl...
|
||||
;kkkkl
|
||||
,od;
|
||||
""")
|
||||
|
||||
,od;
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
alpine = AsciiArt(match=r'''"Alpine"*''', color='4 5 7 6', ascii=r"""
|
||||
{"match": "\"Alpine\"*", "color": "4 5 7 6"}
|
||||
${c1} .hddddddddddddddddddddddh.
|
||||
:dddddddddddddddddddddddddd:
|
||||
/dddddddddddddddddddddddddddd/
|
||||
@@ -22,6 +18,4 @@ hdddyo+ohddyosdddddddddho+oydddy++ohdddh
|
||||
+dddddddddddddddddddddddddddddd+
|
||||
/dddddddddddddddddddddddddddd/
|
||||
:dddddddddddddddddddddddddd:
|
||||
.hddddddddddddddddddddddh.
|
||||
""")
|
||||
|
||||
.hddddddddddddddddddddddh.
|
||||
@@ -0,0 +1,18 @@
|
||||
{"match": "\"Alpine2\"*", "color": "4 7"}
|
||||
.:::::::::::::::::::::.
|
||||
.:::::::::::::::::::::::.
|
||||
.:::::::::::::::::::::::::.
|
||||
.:::::::::::::::::::::::::::.
|
||||
.:::::::::${c2},db,${c1}::::::::::::::::.
|
||||
.::::::::${c2},d%%%%b,${c1}::${c2},db,${c1}:::::::::.
|
||||
.:::::::${c2},%%%%P'%%%b,d%%%b,${c1}::::::::.
|
||||
.::::::${c2},%%%%P,${c1}:::${c2}`%%%b'^q%%b,${c1}:::::::.
|
||||
'::::${c2},%%%%P,d|${c1}:::::${c2}`%%%b:'^%%b,${c1}:::::'
|
||||
'::${c2}`%%%'${c1}:${c2}'q$|${c1}:::::::${c2}'q%%b'`q%%b'${c1}::'
|
||||
':::::::::::::::::::::::::::::::'
|
||||
':::::::::::::::::::::::::::::'
|
||||
':::::::::::::::::::::::::::'
|
||||
':::::::::::::::::::::::::'
|
||||
':::::::::::::::::::::::'
|
||||
':::::::::::::::::::::'
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
{"match": "\"alpine2_small\"*", "color": "4 7"}
|
||||
${c1} /\ /\
|
||||
/${c2}/ ${c1}\ \
|
||||
/${c2}// ${c1}\ \
|
||||
/${c2}// ${c1}\ \
|
||||
${c2}// ${c1}\ \
|
||||
\
|
||||
@@ -0,0 +1,8 @@
|
||||
{"match": "\"alpine3_small\"*", "color": "7"}
|
||||
,db,
|
||||
,d%%%%b, ,db,
|
||||
,%%%%P'%%%b,d%%%b,
|
||||
,%%%%P, `%%%b'^q%%b,
|
||||
,%%%%P,d| `%%%b '^%%b,
|
||||
`%%%' 'q$| 'q%%b'`q%%b
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
{"match": "\"alpine_small\"", "color": "4 7"}
|
||||
${c1} /\ /\
|
||||
/${c2}/ ${c1}\ \
|
||||
/${c2}/ ${c1}\ \
|
||||
/${c2}// ${c1}\ \
|
||||
${c2}// ${c1}\ \
|
||||
\
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
alter = AsciiArt(match=r'''"Alter"*''', color='6 6', ascii=r"""
|
||||
{"match": "\"Alter\"*", "color": "6 6"}
|
||||
${c1} %,
|
||||
^WWWw
|
||||
'wwwwww
|
||||
@@ -22,6 +18,4 @@ ${c1} %,
|
||||
@~:~~: ~:~~:~:(zltlltlO a,wwwwww
|
||||
8~~:~~:~~~~:~~~~_1ltltu ,www
|
||||
5~~:~~:~~:~~:~~:~~~_1ltq N,,
|
||||
g~:~~:~~~:~~:~~:~:~~~~1q N,
|
||||
""")
|
||||
|
||||
g~:~~:~~~:~~:~~:~:~~~~1q N,
|
||||
@@ -0,0 +1,23 @@
|
||||
{"match": "\"ALTLinux\"*", "color": "3 8 7"}
|
||||
##############
|
||||
######################
|
||||
##########################
|
||||
##+${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}+###${c3}####${c1}##########${c2}%#*${c1}#######
|
||||
##########${c2}###*${c3}######${c2}+#+${c1}#####${c2}+##*${c1}######
|
||||
#########${c2}##%${c3}#####${c2}:%#####${c1}###${c2}###*${c1}#####
|
||||
########${c2}%#+${c3}######${c2}#############${c1}####
|
||||
#####${c2}##%:${c3}######${c2}:############${c1}##
|
||||
##${c2}+##*${c3}########${c2}############${c1}
|
||||
${c2}###${c3}#########${c2}##########${c1}
|
||||
${c3}########${c2}######
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
amazon = AsciiArt(match=r'''"Amazon"*''', color='3 7', ascii=r"""
|
||||
{"match": "\"Amazon\"*", "color": "3 7"}
|
||||
${c1} `-/oydNNdyo:.`
|
||||
`.:+shmMMMMMMMMMMMMMMmhs+:.`
|
||||
-+hNNMMMMMMMMMMMMMMMMMMMMMMNNho-
|
||||
@@ -21,6 +17,4 @@ dMMMMMMMMMMMMMMMMh yMMMMMMMMMMMMMMMMd
|
||||
dMMMMMMMMMMMMMMMMh yMMMMMMMMMMMMMMMMd
|
||||
.:+ydNMMMMMMMMMMMh yMMMMMMMMMMMNdy+:.
|
||||
`.:+shNMMMMMh yMMMMMNhs+:``
|
||||
`-+shy shs+:`
|
||||
""")
|
||||
|
||||
`-+shy shs+:`
|
||||
@@ -0,0 +1,11 @@
|
||||
{"match": "\"Amazon Linux\"*|\"amzn\"*", "color": "7 38;5;178"}
|
||||
, ${c2}#_${c1}
|
||||
~\_ ${c2}####_${c1}
|
||||
~~ \_${c2}#####\${c1}
|
||||
~~ \${c2}###|${c1}
|
||||
~~ \${c2}#/${c1} ___
|
||||
~~ V~' '->
|
||||
~~~ /
|
||||
~~._. _/
|
||||
_/ _/
|
||||
_/m/'
|
||||
@@ -0,0 +1,15 @@
|
||||
{"match": "\"Amiga\"*", "color": "1 1 3 4 6 3 2"}
|
||||
----.---
|
||||
:-==.-==-
|
||||
${c2} -=== ===:
|
||||
===-:===.
|
||||
${c3} -+++:=++=
|
||||
=+++ +++.
|
||||
${c6} .+++-=++=
|
||||
${c4}.::. ::: ${c6} :**+ +**-
|
||||
${c4} :--:.---. ${c6} .+**=-***.
|
||||
${c5} :--- ---::${c6}***:***+
|
||||
${c5} .---::-${c6}=##*.*##-
|
||||
${c7} ----+${c6}##=:##*.
|
||||
${c7} :-${c6}###-*##+
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
amogos = AsciiArt(match=r'''"AmogOS"*''', color='15 6', ascii=r"""
|
||||
{"match": "\"AmogOS\"*", "color": "15 6"}
|
||||
${c1} ___________
|
||||
/ \
|
||||
/ ${c2}______${c1} \
|
||||
@@ -21,6 +17,4 @@ ${c1} ___________
|
||||
| / ____/ |
|
||||
\_________/ / |
|
||||
\ __/
|
||||
\_______/
|
||||
""")
|
||||
|
||||
\_______/
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
anarchy = AsciiArt(match=r'''"Anarchy"*''', color='7 4', ascii=r"""
|
||||
{"match": "\"Anarchy\"*", "color": "7 4", "foreground": [2]}
|
||||
${c2}..${c1}
|
||||
${c2}..${c1}
|
||||
${c2}:..${c1}
|
||||
@@ -30,6 +26,4 @@ anarchy = AsciiArt(match=r'''"Anarchy"*''', color='7 4', ascii=r"""
|
||||
${c2}.${c1} ${c2}.:+++${c1}.
|
||||
${c2}.:${c1}:
|
||||
${c2}..${c1}
|
||||
${c2}..${c1}
|
||||
""")
|
||||
|
||||
${c2}..${c1}
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
android = AsciiArt(match=r'''"Android"*''', color='2 7', ascii=r"""
|
||||
{"match": "\"Android\"*", "color": "2 7", "foreground": [2]}
|
||||
${c1} -o o-
|
||||
+hydNNNNdyh+
|
||||
+mMMMMMMMMMMMMm+
|
||||
@@ -20,6 +16,4 @@ ${c1} -o o-
|
||||
`/++MMMMh++hMMMM++/`
|
||||
MMMMo oMMMM
|
||||
MMMMo oMMMM
|
||||
oNMm- -mMNs
|
||||
""")
|
||||
|
||||
oNMm- -mMNs
|
||||
@@ -0,0 +1,7 @@
|
||||
{"match": "\"android_small\"*", "color": "2 7"}
|
||||
${c1} ;, ,;
|
||||
';,.-----.,;'
|
||||
,' ',
|
||||
/ O O \
|
||||
| |
|
||||
'-----------------'
|
||||
@@ -0,0 +1,21 @@
|
||||
{"match": "\"anduinos\"*", "color": "6 4"}
|
||||
${c1}+++++++++++
|
||||
+++++++++++++++++++++
|
||||
+++++++++++++++++++++++++++++++
|
||||
=+++++++++++++++++++++++++++++++++++++++=
|
||||
+++++++++++++++++++++++++++++++++++++++++++++
|
||||
=++++++++++++++++++++++++++++++++++++++++++++
|
||||
==+++++++++++++++++++++++++++++++++==
|
||||
+++++++++++++++++++++++++++
|
||||
${c2}**** ${c1}++=+++++++++++=++ ${c2}****
|
||||
********** ${c1}+++++++ ${c2}**********
|
||||
************** **************
|
||||
**************** ****************
|
||||
***********************
|
||||
****** ************* ******
|
||||
*********** *** ***********
|
||||
*************** ***************
|
||||
*************** ***************
|
||||
*********************
|
||||
***********
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
antergos = AsciiArt(match=r'''"Antergos"*''', color='4 6', ascii=r"""
|
||||
{"match": "\"Antergos\"*", "color": "4 6", "foreground": [1]}
|
||||
${c2} `.-/::/-``
|
||||
.-/osssssssso/.
|
||||
:osyysssssssyyys+-
|
||||
@@ -21,6 +17,4 @@ dmmmdddddddhhhyso${c1}++++++${c2}shhhhhddddddmmmmh
|
||||
-dmmmdddddddhhys${c1}o++++o${c2}shhhhdddddddmmmmd-
|
||||
.smmmmddddddddhhhhhhhhhdddddddddmmmms.
|
||||
`+ydmmmdddddddddddddddddddmmmmdy/.
|
||||
`.:+ooyyddddddddddddyyso+:.`
|
||||
""")
|
||||
|
||||
`.:+ooyyddddddddddddyyso+:.`
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
antix = AsciiArt(match=r'''"antiX"*''', color='1 7 3', ascii=r"""
|
||||
{"match": "\"antiX\"*", "color": "1 7 3"}
|
||||
${c1}
|
||||
\
|
||||
, - ~ ^ ~ - \ /
|
||||
@@ -15,6 +11,4 @@ ${c1}
|
||||
\,_/\_/ | |_/|_/|_/_/ \,
|
||||
, / ,\
|
||||
, / , ' \
|
||||
' - , _ _ _ , '
|
||||
""")
|
||||
|
||||
' - , _ _ _ , '
|
||||
@@ -0,0 +1,22 @@
|
||||
{"match": "\"AnushOS\"*", "color": "7 8 3 6 1"}
|
||||
${c4}#######################
|
||||
${c4}# ${c2}##### ${c4}#
|
||||
${c4}# ${c2}####### ${c4}#
|
||||
${c4}# ${c2}##${c5}O${c2}#${c5}O${c2}## ${c4}#
|
||||
${c4}# ${c2}#${c3}#####${c2}# ${c4}#
|
||||
${c4}# ${c2}##${c1}##${c3}###${c1}##${c2}## ${c4}#
|
||||
${c4}# ${c2}#${c1}##########${c2}## ${c4}#
|
||||
${c4}# ${c2}#${c1}############${c2}## ${c4}#
|
||||
${c4}# ${c2}#${c1}######${c5}A_O${c1}####${c2}### ${c4}#
|
||||
${c4}# ${c3}##${c2}#${c1}############${c2}##${c3}## ${c4}#
|
||||
${c4}#${c3}######${c2}#${c1}#######${c2}#${c3}######${c4}#
|
||||
${c4}#${c3}#######${c2}#${c1}#####${c2}#${c3}#######${c4}#
|
||||
${c4}# ${c3}#####${c2}#######${c3}##### ${c4}#
|
||||
${c4}#######################
|
||||
${c4}#${c5}╔═╗╔╗╔╦ ╦╔═╗╦ ╦╔═╗╔═╗${c4}#
|
||||
${c4}#${c5}╠═╣║║║║ ║╚═╗╠═╣║ ║╚═╗${c4}#
|
||||
${c4}#${c5}╩ ╩╝╚╝╚═╝╚═╝╩ ╩╚═╝╚═╝${c4}#
|
||||
${c4}#######################
|
||||
${c4}# ${c3}WWW.ANUSHOS.ORG ${c4}#
|
||||
${c4}#######################
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
aosc_os = AsciiArt(match=r'''"AOSC OS"*''', color='4 0 1 3', ascii=r'''
|
||||
{"match": "\"AOSC OS\"*", "color": "4 0 1 3"}
|
||||
${c2} __
|
||||
${c2}gpBBBBBBBBBP
|
||||
${c2}_gBBBBBBBBBRP
|
||||
@@ -19,6 +15,4 @@ ${c2} __
|
||||
${c3}_gBNNNNNNNNNNNNNNNNNP"
|
||||
${c3}_wNNNNNNNNNNNNNNNNNNNM^
|
||||
${c3}""Y^^MNNNNNNNNNNNNP`
|
||||
${c3}`"""""""
|
||||
''')
|
||||
|
||||
${c3}`"""""""
|
||||
@@ -0,0 +1,21 @@
|
||||
{"match": "\"Aosc OS_old\"*|\"aoscos_old\"*", "color": "7"}
|
||||
.:+syhhhhys+:.
|
||||
.ohNMMMMMMMMMMMMMMNho.
|
||||
`+mMMMMMMMMMMmdmNMMMMMMMMm+`
|
||||
+NMMMMMMMMMMMM/ `./smMMMMMN+
|
||||
.mMMMMMMMMMMMMMMo -yMMMMMm.
|
||||
:NMMMMMMMMMMMMMMMs .hMMMMN:
|
||||
.NMMMMhmMMMMMMMMMMm+/- oMMMMN.
|
||||
dMMMMs ./ymMMMMMMMMMMNy. sMMMMd
|
||||
-MMMMN` oMMMMMMMMMMMN: `NMMMM-
|
||||
/MMMMh NMMMMMMMMMMMMm hMMMM/
|
||||
/MMMMh NMMMMMMMMMMMMm hMMMM/
|
||||
-MMMMN` :MMMMMMMMMMMMy. `NMMMM-
|
||||
dMMMMs .yNMMMMMMMMMMMNy/. sMMMMd
|
||||
.NMMMMo -/+sMMMMMMMMMMMmMMMMN.
|
||||
:NMMMMh. .MMMMMMMMMMMMMMMN:
|
||||
.mMMMMMy- NMMMMMMMMMMMMMm.
|
||||
+NMMMMMms/.` mMMMMMMMMMMMN+
|
||||
`+mMMMMMMMMNmddMMMMMMMMMMm+`
|
||||
.ohNMMMMMMMMMMMMMMNho.
|
||||
.:+syhhhhys+:.
|
||||
@@ -0,0 +1,19 @@
|
||||
{"match": "\"Aosc OS/Retro\"*|\"aoscosretro\"*", "color": "4 7"}
|
||||
${c2} .........
|
||||
...................
|
||||
.....................${c1}################${c2}
|
||||
.............. ....${c1}################${c2}
|
||||
.............. ...${c1}################${c2}
|
||||
............. ..${c1}****************${c2}
|
||||
............ . .${c1}****************${c2}
|
||||
........... ... ${c1}................${c2}
|
||||
.......... ..... ${c1}...............${c2}
|
||||
......... ....... ...
|
||||
.${c3}...... ${c2}.
|
||||
${c3}..... .....${c2}.... ${c4}...........
|
||||
${c3}.... ......${c2}. ${c4}...........
|
||||
${c3}... ....... ${c4}...........
|
||||
${c3}................ ${c4}***********
|
||||
${c3}................ ${c4}###########
|
||||
${c3}****************
|
||||
${c3}################
|
||||
@@ -0,0 +1,10 @@
|
||||
{"match": "\"Aosc OS/Retro_small\"*|\"aoscosretro_small\"*", "color": "4 7"}
|
||||
${c2} _____ ${c1}_____${c2}
|
||||
-' '-${c1}| |${c2}
|
||||
/ ___ ${c1}| |${c2}
|
||||
| / _ \${c1}|_____|${c2}
|
||||
' / /_\ \
|
||||
\ / _____ \${c4}___
|
||||
${c3}|${c2}/_/ ${c3}| ${c4}| |
|
||||
${c3}| | ${c4}|___|
|
||||
${c3}|_____|
|
||||
@@ -0,0 +1,5 @@
|
||||
{"match": "\"Aperio GNU/Linux\"*", "color": "255"}
|
||||
${c2}
|
||||
_.._ _ ._.. _
|
||||
(_][_)(/,[ |(_)
|
||||
| GNU/Linux
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
aperture = AsciiArt(match=r'''"Aperture"*''', color='6 6 7 1', ascii=r"""
|
||||
{"match": "\"Aperture\"*", "color": "6 6 7 1"}
|
||||
${c1} .,-:;//;:=,
|
||||
. :H@@@MM@M#H/.,+%;,
|
||||
,/X+ +M@@M@MM%=,-%HMMM@X/,
|
||||
@@ -22,6 +18,4 @@ ${c1} .,-:;//;:=,
|
||||
=XMMM@MM@MM#H;,-+HMM@M+ /MMMX=
|
||||
=%@M@M#@$-.=$@MM@@@M; %M%=
|
||||
,:+$+-,/H#MMMMMMM@= =,
|
||||
=++%%%%+/:-.
|
||||
""")
|
||||
|
||||
=++%%%%+/:-.
|
||||
@@ -0,0 +1,18 @@
|
||||
{"match": "\"Apple\"*", "color": "2 3 1 1 5 4"}
|
||||
..'
|
||||
,xNMM.
|
||||
.OMMMMo
|
||||
lMM"
|
||||
.;loddo:. .olloddol;.
|
||||
cKMMMMMMMMMMNWMMMMMMMMMM0:
|
||||
${c2}.KMMMMMMMMMMMMMMMMMMMMMMMWd.
|
||||
XMMMMMMMMMMMMMMMMMMMMMMMX.
|
||||
${c3};MMMMMMMMMMMMMMMMMMMMMMMM:
|
||||
:MMMMMMMMMMMMMMMMMMMMMMMM:
|
||||
${c4}.MMMMMMMMMMMMMMMMMMMMMMMMX.
|
||||
kMMMMMMMMMMMMMMMMMMMMMMMMWd.
|
||||
${c5}'XMMMMMMMMMMMMMMMMMMMMMMMMMMk
|
||||
'XMMMMMMMMMMMMMMMMMMMMMMMMK.
|
||||
${c6}kMMMMMMMMMMMMMMMMMMMMMMd
|
||||
;KMMMMMMMWXXWMMMMMMMk.
|
||||
"cooc*" "*coo'"
|
||||
@@ -0,0 +1,8 @@
|
||||
{"match": "\"Apple_small\"*", "color": "2 3 1 5 4"}
|
||||
${c1} .:'
|
||||
__ :'__
|
||||
${c2} .'`__`-'__``.
|
||||
${c3}:__________.-'
|
||||
${c4}:_________:
|
||||
:_________`-;
|
||||
${c5} `.__.-.__.'
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
apricity = AsciiArt(match=r'''"Apricity"*''', color='4 7 1', ascii=r"""
|
||||
{"match": "\"Apricity\"*", "color": "4 7 1"}
|
||||
${c2} ./o-
|
||||
``...`` `:. -/:
|
||||
`-+ymNMMMMMNmho-` :sdNNm/
|
||||
@@ -20,6 +16,4 @@ MMMMMM/`.-/ohmNMMMMMMy-
|
||||
MMMMMMNmNNMMMMMMMMmo.
|
||||
MMMMMMMMMMMMMMMms:`
|
||||
MMMMMMMMMMNds/.
|
||||
dhhyys+/-`
|
||||
""")
|
||||
|
||||
dhhyys+/-`
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
arch = AsciiArt(match=r'''"Arch"*''', color='6 6 7 1', ascii=r"""
|
||||
{"match": "\"Arch\"*", "color": "6 6 7 1"}
|
||||
${c1} -`
|
||||
.o+`
|
||||
`ooo/
|
||||
@@ -21,6 +17,4 @@ ${c2} .oossssso-````/ossssss+`
|
||||
`/ossssso+/:- -:/+osssso+-
|
||||
`+sso+:-` `.-/+oso:
|
||||
`++:. `-/+/
|
||||
.` `/
|
||||
""")
|
||||
|
||||
.` `/
|
||||
@@ -0,0 +1,20 @@
|
||||
{"match": "\"arch2\"*", "color": "6 6"}
|
||||
▄
|
||||
▟█▙
|
||||
▟███▙
|
||||
▟█████▙
|
||||
▟███████▙
|
||||
▂▔▀▜██████▙
|
||||
▟██▅▂▝▜█████▙
|
||||
▟█████████████▙
|
||||
▟███████████████▙
|
||||
▟█████████████████▙
|
||||
▟███████████████████▙
|
||||
${c2} ▟█████████▛▀▀▜████████▙
|
||||
▟████████▛ ▜███████▙
|
||||
▟█████████ ████████▙
|
||||
▟██████████ █████▆▅▄▃▂
|
||||
▟██████████▛ ▜█████████▙
|
||||
▟██████▀▀▀ ▀▀██████▙
|
||||
▟███▀▘ ▝▀███▙
|
||||
▟▛▀ ▀▜▙
|
||||
@@ -0,0 +1,20 @@
|
||||
{"match": "\"arch3\"*", "color": "6 6"}
|
||||
.
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
/>, \
|
||||
/ `*. \
|
||||
/ ` \
|
||||
/ \
|
||||
/ \
|
||||
${c2} / ,.-+-.. \
|
||||
/ ,/' `\. \
|
||||
/ .|' `|. _ \
|
||||
/ :|. ,|; `+.\
|
||||
/ .\: ;/, "<\
|
||||
/ __,--+" "+--.__ \
|
||||
/ _,+'" "'+._ \
|
||||
/,-' `-.\
|
||||
' '
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
arch_old = AsciiArt(match=r'''"arch_old"''', color='6 7 1', ascii=r"""
|
||||
{"match": "\"arch_old\"", "color": "6 7 1"}
|
||||
${c1} __
|
||||
_=(SDGJT=_
|
||||
_GTDJHGGFCVS)
|
||||
@@ -18,6 +14,4 @@ ${c1}JSNRVW'${c2} __+MNAEC${c1}\IOI,${c2}\BN'
|
||||
${c1}HELK['${c2} __,=OFFXCBGHC${c1}\FD)
|
||||
${c1}?KGHE ${c2}\_-#DASDFLSV='${c1} 'EF
|
||||
'EHTI !H
|
||||
`0F' '!
|
||||
""")
|
||||
|
||||
`0F' '!
|
||||
@@ -0,0 +1,8 @@
|
||||
{"match": "\"arch_small\"", "color": "6 7 1"}
|
||||
${c1} /\
|
||||
/ \
|
||||
/\ \
|
||||
${c2} / \
|
||||
/ ,, \
|
||||
/ | | -\
|
||||
/_-'' ''-_\
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
archbox = AsciiArt(match=r'''"ArchBox"*''', color='2 7 1', ascii=r"""
|
||||
{"match": "\"ArchBox\"*", "color": "2 7 1"}
|
||||
${c1} ...:+oh/:::..
|
||||
..-/oshhhhhh` `::::-.
|
||||
.:/ohhhhhhhhhhhh` `-::::.
|
||||
@@ -21,6 +17,4 @@ ${c1} ...:+oh/:::..
|
||||
/:::+`hhhhoos` `hhhhhhhhhhhhhhhhhs+`
|
||||
`--/:` /: `hhhhhhhhhhhho/-
|
||||
-/:. `hhhhhhs+:-`
|
||||
::::/ho/-`
|
||||
""")
|
||||
|
||||
::::/ho/-`
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
archcraft = AsciiArt(match=r'''"Archcraft"*''', color='6 1 2 3 4 5', ascii=r"""
|
||||
{"match": "\"Archcraft\"*", "color": "6 1 2 3 4 5"}
|
||||
${c1}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄${c1}⢰⡆${c1}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄
|
||||
${c2}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄${c1}⢠⣿⣿⡄${c2}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄
|
||||
${c3}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄${c1}⢀⣾⣿⣿⣿⡀${c3}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄
|
||||
@@ -22,6 +18,4 @@ ${c4}⠄⠄⠄⠄${c1}⢀⣾⣿⣿⣿⣿⣿⣿⣷⣤⡀${c4}⠄⠄⠄${c1}⠻⣿
|
||||
${c5}⠄⠄⠄${c1}⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏${c5}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄${c1}⢿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀${c5}⠄⠄⠄
|
||||
${c6}⠄⠄${c1}⢠⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠁${c6}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄${c1}⠙⠻⣿⣿⣿⣿⣿⣿⣿⣿⡄${c6}⠄⠄
|
||||
${c1}⠄${c1}⣠⣿⣿⣿⣿⠿⠛⠋⠁${c1}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄${c1}⠉⠙⠻⢿⣿⣿⣿⣿⣆${c1}⠄
|
||||
${c1}⡰⠟⠛⠉⠁${c2}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄${c1}⠉⠙⠛⠿⢆
|
||||
""")
|
||||
|
||||
${c1}⡰⠟⠛⠉⠁${c2}⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄${c1}⠉⠙⠛⠿⢆
|
||||
@@ -1,9 +1,5 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
archcraft_ascii = AsciiArt(match=r'''"archcraft_ascii"*''', color='6 1 2 3 4 5', ascii=r"""
|
||||
${c1} -o\
|
||||
{"match": "\"Archcraft2\"*", "color": "6"}
|
||||
-o\
|
||||
:ooo:
|
||||
.ooooo.
|
||||
ooooooo.
|
||||
@@ -23,5 +19,3 @@ ${c1} -o\
|
||||
.+osossos+-` `-+osososs+.
|
||||
:sss+=-:` `:-=+ssss:
|
||||
:=-:` `-=+:
|
||||
""")
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
{"match": "\"archcraft_ascii\"*", "color": "6 1 2 3 4 5"}
|
||||
${c1} -o\
|
||||
:ooo:
|
||||
.ooooo.
|
||||
ooooooo.
|
||||
+oooooooo.
|
||||
-oooooooooo.
|
||||
--:-+oooooooo.
|
||||
yooo+=+sooooooo.
|
||||
yoooooosooooooooo.
|
||||
y+ooooooooooooooooo.
|
||||
yoooooooooooooooooooo`
|
||||
yoooooo+oo= :oo++ooooo`
|
||||
:oooooo. +ooooo-
|
||||
-ooooooo. .::. +ooosoo=
|
||||
-oooooo` .oooo` +os-=o=
|
||||
=ooooooo=: `oo+ :=ooo=--`.
|
||||
+ooooooooos. .=sooooooo+-
|
||||
.+osossos+-` `-+osososs+.
|
||||
:sss+=-:` `:-=+ssss:
|
||||
:=-:` `-=+:
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
archcraft_minimal = AsciiArt(match=r'''"archcraft_minimal"*''', color='6 1 2 3 4 5', ascii=r"""
|
||||
{"match": "\"archcraft_minimal\"*", "color": "6 1 2 3 4 5"}
|
||||
${c1} ⢰⡆
|
||||
⢠⣿⣿⡄
|
||||
⢀⣾⣿⣿⣿⡀
|
||||
@@ -22,6 +18,4 @@ ${c1} ⢰⡆
|
||||
⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏ ⢿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀
|
||||
⢠⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠁ ⠙⠻⣿⣿⣿⣿⣿⣿⣿⣿⡄
|
||||
⣠⣿⣿⣿⣿⠿⠛⠋⠁ ⠉⠙⠻⢿⣿⣿⣿⣿⣆
|
||||
⡰⠟⠛⠉⠁ ⠉⠙⠛⠿⢆
|
||||
""")
|
||||
|
||||
⡰⠟⠛⠉⠁ ⠉⠙⠛⠿⢆
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
archlabs = AsciiArt(match=r'''"ARCHlabs"*''', color='6 6 7 1', ascii=r"""
|
||||
{"match": "\"ARCHlabs\"*", "color": "6 6 7 1"}
|
||||
${c1} 'c'
|
||||
'kKk,
|
||||
.dKKKx.
|
||||
@@ -23,6 +19,4 @@ ${c1} 'c'
|
||||
'xKXXXXK0kdl:. ${c4}.ok; ${c1}.cdk0KKXXXKx'
|
||||
'xKK0koc,.. ${c4}'c, ${c1} ..,cok0KKk,
|
||||
,xko:'. ${c4}.. ${c1} .':okx;
|
||||
.,'. .',.
|
||||
""")
|
||||
|
||||
.,'. .',.
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
archmerge = AsciiArt(match=r'''"ArchMerge"*''', color='6 6 7 1', ascii=r"""
|
||||
{"match": "\"ArchMerge\"*", "color": "6 6 7 1"}
|
||||
${c1} y:
|
||||
sMN-
|
||||
+MMMm`
|
||||
@@ -22,6 +18,4 @@ ${c1} y:
|
||||
-NMMMMMMMMMh `mNMMMMMMMMd`
|
||||
/NMMMNds+:.` `-/oymMMMm.
|
||||
+Mmy/. `:smN:
|
||||
/+. -o.
|
||||
""")
|
||||
|
||||
/+. -o.
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
archstrike = AsciiArt(match=r'''"ArchStrike"*''', color='8 6', ascii=r"""
|
||||
{"match": "\"ArchStrike\"*", "color": "8 6", "foreground": [2]}
|
||||
${c1} *
|
||||
**.
|
||||
****
|
||||
@@ -19,6 +15,4 @@ ${c1} *
|
||||
****${c2}/${c1}**** ${c2}/////${c1}***${c2}/${c1}****
|
||||
******${c2}/${c1}*** ${c2}//// ${c1}**${c2}/${c1}******
|
||||
********${c2}/${c1}* ${c2}/// ${c1}*${c2}/${c1}********
|
||||
,****** ${c2}// ______ / ${c1}******,
|
||||
""")
|
||||
|
||||
,****** ${c2}// ______ / ${c1}******,
|
||||
@@ -0,0 +1,21 @@
|
||||
{"match": "\"arco\"*|\"arcolinux\"*", "color": "4 7"}
|
||||
/-
|
||||
ooo:
|
||||
yoooo/
|
||||
yooooooo
|
||||
yooooooooo
|
||||
yooooooooooo
|
||||
.yooooooooooooo
|
||||
.oooooooooooooooo
|
||||
.oooooooarcoooooooo
|
||||
.ooooooooo-oooooooooo
|
||||
.ooooooooo- oooooooooo
|
||||
:ooooooooo. :ooooooooo
|
||||
:ooooooooo. :ooooooooo
|
||||
:oooarcooo .oooarcooo
|
||||
:ooooooooy .ooooooooo
|
||||
${c1}:ooooooooo ${c2}/ooooooooooooooooooo
|
||||
${c1}:ooooooooo ${c2}.-ooooooooooooooooo.
|
||||
${c1}ooooooooo- ${c2}-ooooooooooooo.
|
||||
${c1}ooooooooo- ${c2}.-oooooooooo.
|
||||
${c1}ooooooooo. ${c2}-ooooooooo
|
||||
@@ -0,0 +1,12 @@
|
||||
{"match": "\"arco_small\"*|\"arcolinux_small\"*", "color": "4 7"}
|
||||
A
|
||||
ooo
|
||||
ooooo
|
||||
ooooooo
|
||||
ooooooooo
|
||||
ooooo ooooo
|
||||
ooooo ooooo
|
||||
ooooo ooooo
|
||||
ooooo ${c2}<oooooooo>${c1}
|
||||
ooooo ${c2}<oooooo>${c1}
|
||||
ooooo ${c2}<oooo>
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
arcolinux = AsciiArt(match=r'''"ArcoLinux"*''', color='7 4', ascii=r"""
|
||||
{"match": "\"ArcoLinux\"*", "color": "7 4"}
|
||||
${c2} /-
|
||||
ooo:
|
||||
yoooo/
|
||||
@@ -22,6 +18,4 @@ ${c2} /-
|
||||
:ooooooooo ${c1}.-ooooooooooooooooo.${c2}
|
||||
ooooooooo- ${c1}-ooooooooooooo.${c2}
|
||||
ooooooooo- ${c1}.-oooooooooo.${c2}
|
||||
ooooooooo. ${c1}-ooooooooo${c2}
|
||||
""")
|
||||
|
||||
ooooooooo. ${c1}-ooooooooo${c2}
|
||||
@@ -0,0 +1,12 @@
|
||||
{"match": "\"arcolinux_small\"*", "color": "7 4"}
|
||||
${c2} A
|
||||
ooo
|
||||
ooooo
|
||||
ooooooo
|
||||
ooooooooo
|
||||
ooooo ooooo
|
||||
ooooo ooooo
|
||||
ooooo ooooo
|
||||
ooooo ${c1}<oooooooo>${c2}
|
||||
ooooo ${c1}<oooooo>${c2}
|
||||
ooooo ${c1}<oooo>${c2}
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
arkane = AsciiArt(match=r'''"Arkane"*''', color='7 130 237', ascii=r"""
|
||||
{"match": "\"Arkane\"*", "color": "7 130 237", "foreground": [1]}
|
||||
${c3} .:..
|
||||
..:::......
|
||||
${c2}.${c3} .${c2}.${c3}.....
|
||||
@@ -25,6 +21,4 @@ ${c2}.-==+++***++*${c1}*#########${c3}=:::.
|
||||
${c2}.-=++++*++++**${c1}#######%%###${c3}=
|
||||
${c2}.:==++++++**${c1}#############${c3}:
|
||||
${c2}.${c3}-+*++*+++==${c1}###${c3}+
|
||||
-${c1}*+${c3}:
|
||||
""")
|
||||
|
||||
-${c1}*+${c3}:
|
||||
@@ -0,0 +1,12 @@
|
||||
{"match": "\"Armbian\"*", "color": "7 1"}
|
||||
..
|
||||
`:]x**j-,'
|
||||
.,+t***********z\<"
|
||||
?******************;
|
||||
'*n` .'`^,;;,^`'. ,cc.
|
||||
-<. .[l
|
||||
// ^^ ^^ \
|
||||
!^ ${c2}^^${c1} ":
|
||||
'tt}` ${c2}!~]rj_${c1} ")t/.
|
||||
Itttt?' ${c2}~~]rr]${c1} `{tttt,
|
||||
\tttttt!""I${c2}_]r(${c1}
|
||||
@@ -0,0 +1,15 @@
|
||||
{"match": "\"Armbian2\"*", "color": "1"}
|
||||
█ █ █ █ █ █ █ █ █ █ █
|
||||
███████████████████████
|
||||
▄▄██ ██▄▄
|
||||
▄▄██ ███████████ ██▄▄
|
||||
▄▄██ ██ ██ ██▄▄
|
||||
▄▄██ ██ ██ ██▄▄
|
||||
▄▄██ ██ ██ ██▄▄
|
||||
▄▄██ █████████████ ██▄▄
|
||||
▄▄██ ██ ██ ██▄▄
|
||||
▄▄██ ██ ██ ██▄▄
|
||||
▄▄██ ██ ██ ██▄▄
|
||||
▄▄██ ██▄▄
|
||||
███████████████████████
|
||||
█ █ █ █ █ █ █ █ █ █ █
|
||||
@@ -0,0 +1,16 @@
|
||||
{"match": "\"arse\"*|\"arselinux\"*|\"arse-linux\"*", "color": "4 7"}
|
||||
⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⠀⣴⣶⠀⠀⠀⠀⠀
|
||||
⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣄⠀⠀⠀⠀⣼⠟⠁⠀⠀⢀⣀⠀
|
||||
⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⢀⣤⡀⠀⠀⠀⠉⢻⣷⡄⠀⠀⠁⠀⢀⣤⣾⡿⠟⠀
|
||||
⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣷⣿⠏⠀⠀⠀⠀⠀⠀⠹⣿⡄⠀⠀⠀⠙⠉⠁⠀⠀⠀
|
||||
⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⡄⠀⠀⠀⠀⠀⠀⠀⢹⣿⠀⠀⠀⠀⠠⣶⣶⣶⡶
|
||||
⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⢠⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠂⠀⠀⠀⠀⠀⢀⣾⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⠇⠀⠀⠀⠀⠀⣠⣾⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣿⣇⣀⣀⣀⣠⣴⣾⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⢸⣿⠀⠀⠀⠀⠀⣤⣤⣴⣶⣾⠿⠟⣿⡏⠙⠛⠛⠛⠋⠉⢀⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⣿⡄⠀⠀⠀⠀⠈⠉⠉⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⢸⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⠇⠀⠀⠀⠀⠀⠀⠘⠿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
arselinux = AsciiArt(match=r'''"ArseLinux"*''', color='4 7', ascii=r"""
|
||||
{"match": "\"ArseLinux\"*", "color": "4 7"}
|
||||
${c1}
|
||||
⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⠀⣴⣶⠀⠀⠀⠀⠀
|
||||
@@ -18,6 +14,4 @@ ${c1}
|
||||
⢸⣿⠀⠀⠀⠀⠀⣤⣤⣴⣶⣾⠿⠟⣿⡏⠙⠛⠛⠛⠋⠉⢀⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⣿⡄⠀⠀⠀⠀⠈⠉⠉⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⢸⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⠇⠀⠀⠀⠀⠀⠀⠘⠿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
""")
|
||||
|
||||
⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
artix = AsciiArt(match=r'''"Artix"*''', color='6 6 7 1', ascii=r"""
|
||||
{"match": "\"Artix\"*", "color": "6 6 7 1"}
|
||||
${c1} '
|
||||
'o'
|
||||
'ooo'
|
||||
@@ -22,6 +18,4 @@ ${c1} '
|
||||
'ooooxooi::'` .:iiixkxxo'
|
||||
'ooooi:'` `'';ioxxo'
|
||||
'i:'` '':io'
|
||||
'` `'
|
||||
""")
|
||||
|
||||
'` `'
|
||||
@@ -0,0 +1,9 @@
|
||||
{"match": "\"artix2_small\"*", "color": "6"}
|
||||
/\
|
||||
/ \
|
||||
/`'.,\
|
||||
/ ',
|
||||
/ ,`\
|
||||
/ ,.'`. \
|
||||
/.,'` `'.\
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
artix_small = AsciiArt(match=r'''"artix_small"*''', color='6 6 7 1', ascii=r"""
|
||||
{"match": "\"artix_small\"*", "color": "6 6 7 1"}
|
||||
${c1} '
|
||||
'A'
|
||||
'ooo'
|
||||
@@ -15,6 +11,4 @@ ${c1} '
|
||||
'ookxxkoo'` .'oo'
|
||||
'ooxoo'` .:ooxxo'
|
||||
'io'` `'oo'
|
||||
'` `'
|
||||
""")
|
||||
|
||||
'` `'
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
arya = AsciiArt(match=r'''"Arya"*''', color='2 1', ascii=r"""
|
||||
{"match": "\"Arya\"*", "color": "2 1"}
|
||||
${c1} `oyyy/${c2}-yyyyyy+
|
||||
${c1} -syyyy/${c2}-yyyyyy+
|
||||
${c1} .syyyyy/${c2}-yyyyyy+
|
||||
@@ -17,6 +13,4 @@ ${c1} +yyyyyys :yyyyyy/${c2}-yyyyyy+
|
||||
${c1} .oyyyyyyo. :yyyyyy/${c2}-yyyyyy+ ---------
|
||||
${c1} .syyyyyy+` :yyyyyy/${c2}-yyyyy+-+syyyyyyyy
|
||||
${c1} -syyyyyy/ :yyyyyy/${c2}-yyys:.syyyyyyyyyy
|
||||
${c1}:syyyyyy/ :yyyyyy/${c2}-yyo.:syyyyyyyyyyy
|
||||
""")
|
||||
|
||||
${c1}:syyyyyy/ :yyyyyy/${c2}-yyo.:syyyyyyyyyyy
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
asahi = AsciiArt(match=r'''"Asahi"*''', color='3 2 1 8 7 6 4', ascii=r"""
|
||||
{"match": "\"Asahi\"*", "color": "3 2 1 8 7 6 4", "foreground": [5]}
|
||||
${c1} ## ${c2}**
|
||||
${c1}*####${c2}****.
|
||||
${c1}###${c2},
|
||||
@@ -20,6 +16,4 @@ ${c3}(((((((((((((((((((((${c5}@@@${c6}&%&${c5}@@@%${c4},..........
|
||||
${c3}/((((((((((((${c5}@@@@@@/${c4}.../&&
|
||||
${c3}.(((((((((${c5}@@@@(${c4}....
|
||||
${c3}/(((((${c5}@@#${c4}...
|
||||
${c3}.((${c4}&,
|
||||
""")
|
||||
|
||||
${c3}.((${c4}&,
|
||||
@@ -0,0 +1,19 @@
|
||||
{"match": "\"asahi2\"*|\"asahi-linux2\"*", "color": "3 6 1 1 7 8 6"}
|
||||
${c1}_wwM ${c2}_ww
|
||||
${c1}MMM${c2}MMMM
|
||||
${c1}MM
|
||||
${c3}_ww##############yy_
|
||||
${c4}wMMMMM${c3}###########${c4}MMMMm
|
||||
${c4},MMMMMMMMM${c3}######${c4}MMMMMMMM0_
|
||||
${c4}wMMMMMMMMMMMMM${c5}MM${c6}0MMMMMMMMMMm
|
||||
${c4},MMMMMMMMMMMMMMM${c5}MMMM${c6}0MMMMMMMMM0,
|
||||
${c4}wMMMMMMMMMMMMMMMM${c5}MMMMM0${c6}MMMMMMMMMMb
|
||||
${c4}_MMMMMMMMMMMMMMMMMM${c5}MMMMMMM0${c6}MMMMMMMMM0,
|
||||
${c4}_MMMMMMMMMMMMMMMMMMM${c5}MMMM${c7}M${c5}MMMW${c6}MMMMMMMMMM_
|
||||
${c4}_MMMMMMMMMMMMMMMMMMMM${c5}MMMM${c7}M0${c5}MMMW${c6}MMMMMMMMMM_
|
||||
${c4}~MMMMMMMMMMMMMMMMM${c5}MMMM${c7}M${c5}MMMW${c6}MMMMM00~
|
||||
${c4}~MMMMMMMMMMMMM${c5}MMMWMMM${c6}0MM${c5}MMM${c6}~
|
||||
${c4}~MMMMMMMMMM${c5}MMMMM${c6}0MMM~~
|
||||
${c4}~MMMMMM${c5}MMM${c6}0MM~
|
||||
${c4}~MM${c5}M${c6}@~
|
||||
${c4}M
|
||||
@@ -0,0 +1,19 @@
|
||||
{"match": "\"aster\"*", "color": "6"}
|
||||
...''...
|
||||
.;oOXWMWNXXXNMMN0d:.
|
||||
.oXMWOo;.. ..:oO;
|
||||
;KMWx, co,
|
||||
'KMNl dMMW.
|
||||
oMMx xMMMMk
|
||||
xMM: dMMMMMM;
|
||||
cMMl dMMMMMMMW
|
||||
NMK xMMMx::dXMx
|
||||
,MMl xMMN' .o.
|
||||
cMM; dMMW'
|
||||
;MMc oMMW,
|
||||
WMK dMMW, ccccccc.
|
||||
lMMl oMMM; ooooooo.
|
||||
OMMc ...
|
||||
xMMx
|
||||
;XMN:
|
||||
,.
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
asteroidos = AsciiArt(match=r'''"AsteroidOS"*''', color='160 208 202 214', ascii=r"""
|
||||
{"match": "\"AsteroidOS\"*", "color": "160 208 202 214"}
|
||||
${c1} ***
|
||||
${c1} *****
|
||||
${c1} **********
|
||||
@@ -19,6 +15,4 @@ ${c3} /######## ########
|
||||
${c4} #######%#######
|
||||
${c4} (#%%%%%%%#
|
||||
${c4} %%%%%
|
||||
${c4} %%%
|
||||
""")
|
||||
|
||||
${c4} %%%
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
astos = AsciiArt(match=r'''"astOS"*''', color='8', ascii=r"""
|
||||
{"match": "\"astOS\"*", "color": "8"}
|
||||
${c1} oQA#$%UMn
|
||||
H 9
|
||||
G #
|
||||
@@ -25,6 +21,4 @@ uURF$##Bv nKWB$%ABc aM@3R@D@b
|
||||
8 M @ O # %
|
||||
% & G U @ @
|
||||
& @ # % % #
|
||||
!HGN@MNCf t&$9#%HQr ?@G#6S@QP
|
||||
""")
|
||||
|
||||
!HGN@MNCf t&$9#%HQr ?@G#6S@QP
|
||||
@@ -0,0 +1,23 @@
|
||||
{"match": "\"Astra\"*|\"Astra Linux\"*|\"astralinux\"*", "color": "1 7"}
|
||||
AA
|
||||
AaaA
|
||||
Aa${c2}/\${c1}aA
|
||||
${c1} Aa${c2}/${c1}aa${c2}\${c1}aA
|
||||
${c1} Aa${c2}/${c1}aAAa${c2}\${c1}aA
|
||||
${c1} aA${c2}/${c1}aaAAaa${c2}\${c1}Aa
|
||||
${c1} aA${c2}/${c1}aaAAAAaa${c2}\${c1}Aa
|
||||
${c1} aaaaaaAAAAa${c2}/${c1}aaAAAAAAaa${c2}\${c1}aAAAAaaaaa
|
||||
${c1}aAAa${c2}-----${c1}aaaaaAAAAAAAAAAaaaaa${c2}-----${c1}aAAa
|
||||
${c1} aAA${c2}\ ${c1}aAAAAAAAAAAAAAAAAAAAAAAa${c2} /${c1}AAa
|
||||
${c1} aAa${c2}\${c1}aAAA${c2}\${c1}AAAA${c2}\${c1}AAAA${c2}\${c1}AAA${c2}\${c1}AAa${c2}/${c1}aAa
|
||||
${c1} aAa${c2}\${c1}aA${c2}\${c1}AAA${c2}\${c1}AAA${c2}\${c1}AA${c2}\/${c1}aAa
|
||||
${c1} aAA${c2}\${c1}aA${c2}\${c1}AAA${c2}\${c1}AAA${c2}\${c1}Aa${c2}/${c1}AAa
|
||||
${c1} aA${c2}\${c1}aA${c2}\${c1}AAA${c2}\${c1}AAA${c2}\/${c1}Aa
|
||||
${c1} aA${c2}/${c1}AA${c2}\\${c1}AA${c2}\\${c1}AA${c2}\\${c1}Aa
|
||||
${c1} aA${c2}/\${c1}AAa${c2}\\${c1}Aa${c2}\\${c1}Aa${c2}\\${c1}Aa
|
||||
${c1} aA${c2}/\${c1}AAa${c2}\/\${c1}a${c2}\\${c1}Aa${c2}\${c1}Aa
|
||||
${c1} aA${c2}/${c1}a${c2}\\${c1}Aa${c2}\/${c1}AA${c2}\\\${c1}Aa${c2}\${c1}Aa
|
||||
${c1} aA${c2}/${c1}aA${c2}\/${c1}aAa aAa${c2}\\${c1}Aa${c2}\${c1}Aa
|
||||
${c1} aA${c2}/\${c1}A${c2}\/${c1}Aa aA${c2}\${c1}A${c2}\${c1}Aa
|
||||
${c1} A${c2}|/${c1}aaAa aAaa${c2}\|${c1}A
|
||||
${c1} aAaa aaAa
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
astra_linux = AsciiArt(match=r'''"Astra Linux"*''', color='160 231', ascii=r"""
|
||||
{"match": "\"Astra Linux\"*", "color": "160 231", "foreground": [2]}
|
||||
${c1} AA
|
||||
${c1} AaaA
|
||||
${c1} Aa${c2}/\${c1}aA
|
||||
@@ -24,6 +20,4 @@ ${c1} aA${c2}/${c1}a${c2}\\\${c1}Aa${c2}\/${c1}AA${c2}\\\\\${c1}Aa${c2}\\
|
||||
${c1} aA${c2}/${c1}aA${c2}\\/${c1}aAa aAa${c2}\\\${c1}Aa${c2}\${c1}Aa
|
||||
${c1} aA${c2}/\${c1}A${c2}\/${c1}Aa aA${c2}\\${c1}A${c2}\\${c1}Aa
|
||||
${c1} A${c2}|/${c1}aaAa aAaa${c2}\|${c1}A
|
||||
${c1} aAaa aaAa
|
||||
""")
|
||||
|
||||
${c1} aAaa aaAa
|
||||
@@ -1,9 +1,5 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
januslinux = AsciiArt(match=r'''"januslinux"*|"janus"*|"Ataraxia Linux"*|"Ataraxia"*''', color='4 5 6 2', ascii=r"""
|
||||
${c1} 'l:
|
||||
{"match": "\"Ataraxia Linux\"*|\"Ataraxia\"*", "color": "4 5"}
|
||||
'l:
|
||||
loooooo
|
||||
loooo coooool
|
||||
looooooooooooooooooool
|
||||
@@ -27,5 +23,3 @@ ${c1} cooo: ${c2}coooooooooooooooooool
|
||||
:oooool, coool:, looool:,
|
||||
looool: ooooooooooooooo:
|
||||
cooolc .ooooooooooool
|
||||
""")
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
{"match": "\"Athena\"*", "color": "7 3"}
|
||||
${c1} . ..
|
||||
${c1} :####: ####.
|
||||
${c1} .################
|
||||
${c1} :##################
|
||||
${c1}.###################.
|
||||
${c1}######## #######
|
||||
${c1}####### ${c2}####${c1} #####
|
||||
${c1}:#######. ####
|
||||
${c1} ######### ${c2}#${c1} ## #
|
||||
${c1} ####### ${c2}##${c1} ####
|
||||
${c1}######## ${c2}####${c1} #######
|
||||
${c1}######## ${c2}#####${c1} ########
|
||||
${c1}######## ${c2}#######${c1} #######
|
||||
${c1} ####### ${c2}########${c1} #######
|
||||
${c1} ######## ${c2}#########${c1} ######
|
||||
${c1} ######## ${c2}#########${c1} #####
|
||||
${c1} ####### ${c2}#########${c1} ####
|
||||
${c1} ####### ${c2}#########${c1} ##
|
||||
${c1} ####### ${c2}########${c1} ##
|
||||
${c1} ###### ${c2}########${c1} #
|
||||
${c1} ### ${c2}#######${c1}
|
||||
${c1} ${c2}######${c1}
|
||||
${c1} ${c2}####${c1}
|
||||
${c1} ${c2}##${c1}
|
||||
@@ -0,0 +1,30 @@
|
||||
{"match": "\"AthenaOS\"*", "color": "4 4"}
|
||||
u.
|
||||
..:Y
|
||||
.Y..1
|
||||
..::i::.. .br7S.
|
||||
.::::...::::. 5dDr:
|
||||
..:::.. .:i::.. Y7:
|
||||
..:::::.. ..::::.
|
||||
...:i:i:i:.. ${c2}... ${c1}:.:..:i:::...
|
||||
::i:. ${c2}.USL Yr ${c1}..i::.
|
||||
.:::. ${c2}:K :u. ${c1}.::.
|
||||
:... ${c2}jB. .:vUi: 77 KB: ${c1}..::
|
||||
...: ${c2}iBR vP::5X5PgSKXvLjS. iBB ${c1}.::.
|
||||
:i:: ${c2}BBQr jgDIuj1UuJjXbbi 2BBP ${c1}:::;
|
||||
'i:: ${c2}sQBg: i2S55121XSSU. YBQZ: ${c1}.:::
|
||||
r::: ${c2}r:JgBMu. Q :BqEqZEB: Q :qBBK7i: ${c1}:i:i
|
||||
.rir. ${c2}IBqPDgQBDr P rB :q 1QBRgEqgB ${c1}.::i.
|
||||
:i:i ${c2}:JsXPDDRQQPBL P qQXBQRDDPIYY ${c1}rir:
|
||||
:iii ${c2}5qvLUDDMgMgBB5 :DBQZRgMDdJ7Ygi ${c1}iir:
|
||||
iri: ${c2}MBRgdZZggQgRBMIBQQRRggdZdMBBr ${c1}riri
|
||||
irii ${c2}IBQgdZbDDRRRgQgQQMZDdZdgBB. ${c1}iiri
|
||||
i7rr ${c2}.BBQZZbEEMQQDBQMEZdDDBBP ${c1}.rir:
|
||||
:7ir. ${c2}7BBQMDMQSbB5ZBggQBBQ. ${c1}ivr7.
|
||||
:r7r. ${c2}7BBBB:rBbQ.1BBBM. ${c1}:r7vi
|
||||
::rLrr. ${c2}.b:rBQ7QB uU. ${c1}:7vLi.
|
||||
.BB .iLYv: ${c1}idL B1 ${c1}:r77r.
|
||||
LBB :vrvvr rvu7r:
|
||||
ZB. ':7v177Lsvurr:'
|
||||
.d2 ''::r:''
|
||||
:'
|
||||
@@ -1,9 +1,5 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
athena = AsciiArt(match=r'''"Athena"*''', color='7 3', ascii=r"""
|
||||
${c1} . ..
|
||||
{"match": "\"AthenaOS_old\"*", "color": "7 3"}
|
||||
. ..
|
||||
${c1} :####: ####.
|
||||
${c1} .################
|
||||
${c1} :##################
|
||||
@@ -27,5 +23,3 @@ ${c1} ### ${c2}#######${c1}
|
||||
${c1} ${c2}######${c1}
|
||||
${c1} ${c2}####${c1}
|
||||
${c1} ${c2}##${c1}
|
||||
""")
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
{"match": "\"Aurora\"*", "color": "4 5 1 7"}
|
||||
+++++++++
|
||||
+++++${c4}+${c1}++++++${c4}+${c1}++
|
||||
++++++${c4}+${c1}+++ +++++++++++
|
||||
+++++++++++ ${c2}+${c1} +++++${c4}+${c1}+++++
|
||||
++++++${c4}+${c1}++++ ${c4}+++${c1} +++++++++++
|
||||
++++++++++${c4} + +++++ ++ ${c2}+++++${c4}+${c2}++++
|
||||
+++${c4}+${c1}++++${c4} + + + +++++++ + + ${c2}+++++${c4}+${c2}++
|
||||
++++++${c4} ${c2}+${c4} +++ +++++++++ +++ ${c2}++++++++
|
||||
+++${c4}+${c1}++${c4} + +++++ +++++ +
|
||||
++++++${c4} ${c2}+${c4} +++++ +++++ +++++
|
||||
++${c4}+${c2}+++${c4} + +++++ ++++++ ++++++++++
|
||||
++++++${c4} +++++ +++++ + +++++++++++++++++++
|
||||
++++++${c4} + +++++ + +++++++++++++++
|
||||
+++${c4}++${c2}+${c4} ++++++ +++++++++++++
|
||||
++++++${c4} + ++++++ +++++++++++++ ${c2}+++ ${c4}++
|
||||
++++++${c4} ++++++++++++++++ ${c2}++${c4}+${c2}+ ${c4}++ ${c1}+
|
||||
++++++${c4} ++++++++++++++ ${c3}+ ${c2}++++
|
||||
++++++${c4} +++++++++++ + ${c4}+ ${c3}++++++
|
||||
++${c4}+${c3}+++${c4} ++++++++++ +++ ${c3}+++++++++++++
|
||||
+++++ ${c4}+++++++++ + ${c3}+++++++++++++
|
||||
+++ ${c4}++++++++ ${c2}++${c4} + ${c3}++++++++++++++ ++++
|
||||
++ ${c4}++++++++ ${c3}+ ++++++++++++++ +++++++
|
||||
${c4}++++++ ${c2}+ ${c3}+++++++++++++ +++++++${c2}++
|
||||
${c4}++++ ${c3}+++++++++++++ ++++++${c2}+++
|
||||
+++++++++++ ++++++${c2}+++
|
||||
+++++ ++++++${c2}+++
|
||||
++++++${c2}++
|
||||
+++++
|
||||
@@ -0,0 +1,17 @@
|
||||
{"match": "\"AxOS\"*", "color": "38;2;222;6;255 38;2;222;6;255"}
|
||||
▂🬭⎻⎻🬭▂
|
||||
▁▂━▂🬭🬭🭗 🬁🬭🬭▂▁━▂▁
|
||||
🬂🬂🮂━🮂▔ ▔🮂━🮂🬂🬂🬿
|
||||
🭄🬨▍ 🬜🮂▔ ▁▂▂🬭🬭▂▂▁ ▔🮂🬪 🮈🬕
|
||||
🭄🭙▐▎ 🭃██████████🭎 🭢🮇▌🭤
|
||||
🭄🭙 ▐🭄🭙 🭋█████🭜█████🭀 🭤🭏▌ 🭤🭏
|
||||
🭗 🮉🭛 🭃███🭝🭙 🭥🭒███🭎 🭦▋ 🭢
|
||||
▟🬮━🭷🭘 🭋████▄▂ ▂▄████🭀 🭣━🬯🭏
|
||||
🭕╾🭺🬽 🭃██🭡 🭖██🭐 🭈╼🬡🭠
|
||||
🬼 🮉🭀 🭋███΄ 🭤███🭀 🭋▊ 🭇
|
||||
🬾 ▐🬾▁▁ 🭃██ ██🭐 ▁▁🭉🭫▌ 🭉🭠
|
||||
🬾🮈▎ ▔🮂🬂▀🬎🬎 🮅🬎▀🬂🮂▔ 🮇▌🭉
|
||||
🭿▍ ▂▁ ▁▂🬜΄🮈🬲
|
||||
🭥🬭🬭▂▁━▂▁ ▁▂━▂🬭🬭🭚
|
||||
▔⎺━▔🮂🬂🬂🬼 🭇🬂🬂🮂▔━⎺▔
|
||||
⠈🮂🭷╾🭄╼🬂🮂΄
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
azos = AsciiArt(match=r'''"azos"*''', color='6 1', ascii=r"""
|
||||
{"match": "\"azos\"*", "color": "6 1"}
|
||||
${c1} ////. ${c2} (((((
|
||||
${c1} //////// ${c2} @((((((((
|
||||
${c1} //////// ${c2} @((((((((
|
||||
@@ -19,6 +15,4 @@ ${c1} //////// ///////// ${c2} &(((((((( @((((((((
|
||||
${c1} //////// ////// ${c2} @(((( @((((((((
|
||||
${c1} //////// ${c2} @((((((((
|
||||
${c1} //////// ${c2} @((((((((
|
||||
${c1} ///// ${c2} (((((
|
||||
""")
|
||||
|
||||
${c1} ///// ${c2} (((((
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
bazzite = AsciiArt(match=r'''"Bazzite"*''', color='5 5', ascii=r"""
|
||||
{"match": "\"Bazzite\"*", "color": "5 5"}
|
||||
${c1} %%%%%%====%%%%%%%%%%
|
||||
%%%%%%%% %%%%%%%%%%%%%%
|
||||
%%%%%%%%% %%%%%%%%%%%%%%%%
|
||||
@@ -21,6 +17,4 @@ ${c1} %%%%%%====%%%%%%%%%%
|
||||
%#######==========#########
|
||||
#######################
|
||||
###################
|
||||
###########
|
||||
""")
|
||||
|
||||
###########
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
bedrock = AsciiArt(match=r'''"Bedrock"*''', color='8 7', ascii=r"""
|
||||
{"match": "\"Bedrock\"*", "color": "8 7"}
|
||||
${c1}--------------------------------------
|
||||
--------------------------------------
|
||||
--------------------------------------
|
||||
@@ -19,6 +15,4 @@ ${c1}--------------------------------------
|
||||
-------------${c2}\\\////////////////${c1}------
|
||||
--------------------------------------
|
||||
--------------------------------------
|
||||
--------------------------------------
|
||||
""")
|
||||
|
||||
--------------------------------------
|
||||
@@ -0,0 +1,8 @@
|
||||
{"match": "\"bedrock_small\"*", "color": "8 7"}
|
||||
_________
|
||||
| ${c2}__ ${c1} |
|
||||
| ${c2}\ \___ ${c1} |
|
||||
| ${c2} \ _ \${c1} |
|
||||
| ${c2} \___/${c1} |
|
||||
|_________|
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
biglinux = AsciiArt(match=r'''"BigLinux"*''', color='6 11 4', ascii=r"""
|
||||
{"match": "\"BigLinux\"*", "color": "6 11 4"}
|
||||
${c1} ...
|
||||
:OWMMMNd.
|
||||
:NMMMMMMMMWc
|
||||
@@ -21,6 +17,4 @@ ${c3} .X. oMMMMW. l.
|
||||
dMk:..;xWMMMMW,
|
||||
kMMMMMMMMMMX.
|
||||
:XMMMMMMK:
|
||||
':MM:" Made in Brazil
|
||||
""")
|
||||
|
||||
':MM:" Made in Brazil
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
biglinux_large = AsciiArt(match=r'''"BigLinux_large"*''', color='2 3 4 7', ascii=r"""
|
||||
{"match": "\"BigLinux_large\"*", "color": "2 3 4 7"}
|
||||
${c4}
|
||||
${c3}.cd0KXXX${c4}0${c3}x;
|
||||
${c3}.oXM${c4}M${c3}MMMMMMMMMWo
|
||||
@@ -24,6 +20,4 @@ ${c4}
|
||||
${c1}0MMMX0O0XMMMMMMMMMMo
|
||||
${c1}oWMMMMMMMMMMMMMMk.
|
||||
${c1}.oXMMMMMMMMW0c.
|
||||
${c1}.;ccc:,.
|
||||
""")
|
||||
|
||||
${c1}.;ccc:,.
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
bitrig = AsciiArt(match=r'''"Bitrig"*''', color='2 7', ascii=r"""
|
||||
{"match": "\"Bitrig\"*", "color": "2 7"}
|
||||
${c1} `hMMMMN+
|
||||
-MMo-dMd`
|
||||
oMN- oMN`
|
||||
@@ -19,6 +15,4 @@ ${c1} `hMMMMN+
|
||||
:NMMMNmmmmmMMh
|
||||
/MN/-------oNN:
|
||||
hMd. .dMh
|
||||
sm/ /ms
|
||||
""")
|
||||
|
||||
sm/ /ms
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
blackarch = AsciiArt(match=r'''"BlackArch"*''', color='1 1 0 1', ascii=r"""
|
||||
{"match": "\"BlackArch\"*", "color": "1 1 0 1", "foreground": [3]}
|
||||
${c3} 00
|
||||
11
|
||||
====${c1}
|
||||
@@ -23,6 +19,4 @@ ${c2} .oossssso-`${c3}//${c1}`/ossssss+`
|
||||
`/ossssso+/:- ${c3}//${c1} -:/+osssso+-
|
||||
`+sso+:-` ${c3}//${c1} `.-/+oso:
|
||||
`++:. ${c3}//${c1} `-/+/
|
||||
.` ${c3}/${c1} `/
|
||||
""")
|
||||
|
||||
.` ${c3}/${c1} `/
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
blackmesa = AsciiArt(match=r'''"BlackMesa"''', color='1', ascii=r"""
|
||||
{"match": "\"BlackMesa\"", "color": "1"}
|
||||
${c1}
|
||||
.-;+$XHHHHHHX$+;-.
|
||||
,;X@@X%/;=----=:/%X@@X/,
|
||||
@@ -23,6 +19,4 @@ H@: :HHHHHHHHHHHHHHHHHHX, =@H
|
||||
=X@@@@@@@@@@@@@@@@@@@@@@@@@@@@X=
|
||||
:$@@@@@@@@@@@@@@@@@@@M@@@@$:
|
||||
,;$@@@@@@@@@@@@@@@@@@X/-
|
||||
.-;+$XXHHHHHX$+;-.
|
||||
""")
|
||||
|
||||
.-;+$XXHHHHHX$+;-.
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
blackpanther = AsciiArt(match=r'''"blackPanther"* | 'blackpanther'*''', color='1 11 12', ascii=r"""
|
||||
{"match": "\"blackPanther\"* | 'blackpanther'*", "color": "1 11 12"}
|
||||
${c3} ........
|
||||
.,»╔╗╗╬▄▄╫█▀▓▄▄╬╗╗g≈,.
|
||||
,j╗╬╣▓▓███████▌;»╙▀▀▀▀█▄▄╗j,
|
||||
@@ -25,6 +21,4 @@ ${c3} ........
|
||||
`╙▀█▄@»»»;`▀███▌¿ ,▄▀Ñ"`
|
||||
`"╨▀█▄▄▄░`▐█████▄, ,▄▄▀▀░`
|
||||
`"╙╩▀▀▀▀████████▓▌▌▌▀▀▀╨"``
|
||||
``""░╚╨╝╝╝╝╨╨░""``
|
||||
""")
|
||||
|
||||
``""░╚╨╝╝╝╝╨╨░""``
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
blag = AsciiArt(match=r'''"BLAG"*''', color='5 7', ascii=r"""
|
||||
{"match": "\"BLAG\"*", "color": "5 7"}
|
||||
${c1} d
|
||||
,MK:
|
||||
xMMMX:
|
||||
@@ -19,6 +15,4 @@ ${c1} d
|
||||
.NMMMMMNd. `':ldko
|
||||
OMMMK:
|
||||
oWk,
|
||||
;:
|
||||
""")
|
||||
|
||||
;:
|
||||
@@ -1,8 +1,4 @@
|
||||
# This file is automatically generated. Please do not modify.
|
||||
|
||||
from . import AsciiArt
|
||||
|
||||
blankon = AsciiArt(match=r'''"BlankOn"*''', color='1 7 3', ascii=r"""
|
||||
{"match": "\"BlankOn\"*", "color": "1 7 3"}
|
||||
${c2} `./ohdNMMMMNmho+.` ${c1} .+oo:`
|
||||
${c2} -smMMMMMMMMMMMMMMMMmy-` ${c1}`yyyyy+
|
||||
${c2} `:dMMMMMMMMMMMMMMMMMMMMMMd/` ${c1}`yyyyys
|
||||
@@ -19,6 +15,4 @@ ${c2} +MMMMMMMNho:.` `.:ohNMMMMMMNo ${c1}`yyyyys
|
||||
${c2} -hMMMMMMMMNNNmmNNNMMMMMMMMh- ${c1}`yyyyys
|
||||
${c2} :yNMMMMMMMMMMMMMMMMMMNy:` ${c1}`yyyyys
|
||||
${c2} .:sdNMMMMMMMMMMNds/. ${c1}`yyyyyo
|
||||
${c2} `.:/++++/:.` ${c1}:oys+.
|
||||
""")
|
||||
|
||||
${c2} `.:/++++/:.` ${c1}:oys+.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user