Compare commits
211 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| efb61b60f6 | |||
| aee6a60bf6 | |||
| acca0f72cf | |||
| 1c192f1230 | |||
| beb26c3357 | |||
| 071ba1b002 | |||
| 8262573b0c | |||
| 9c2e731311 | |||
| 3b5c470806 | |||
| e6f91a36a7 | |||
| 037bff7968 | |||
| 600d7c8928 | |||
| 4dc001447b | |||
| f22d4ad5ea | |||
| 619df5a2cf | |||
| 9735178c19 | |||
| 0501a60ed2 | |||
| beafa6a98f | |||
| 8ef523174b | |||
| 93947b090a | |||
| 30df722ab0 | |||
| 94c1f63f56 | |||
| d2211a09c4 | |||
| bcb179101a | |||
| ac1164946b | |||
| 0b0eafbd07 | |||
| 7a7e710d34 | |||
| cbf2e8dfb1 | |||
| bc1c43a5d0 | |||
| ee1403df0e | |||
| 496523a9cf | |||
| fac3268754 | |||
| 0494744261 | |||
| f1396670a0 | |||
| 8b02b49884 | |||
| 4abad16e71 | |||
| c097f817c6 | |||
| 61b4b6b0e5 | |||
| 0c179db68d | |||
| 43c4d0d5ee | |||
| 8ed610c76f | |||
| 72dec6443d | |||
| cc779d0af5 | |||
| 3bba6063e3 | |||
| df3f1ebf7a | |||
| a917a9a693 | |||
| 2a6939c11b | |||
| be19e044d4 | |||
| 66ad0f7297 | |||
| 694725c56e | |||
| 7da4db9474 | |||
| b220933ec6 | |||
| cc29a0fff1 | |||
| 6417752e23 | |||
| 69907f6f8b | |||
| ac7be6d3d1 | |||
| a73f05e388 | |||
| 4e9455d2d6 | |||
| cb4cc5ba74 | |||
| b648c5dbec | |||
| cebeae9e85 | |||
| 24104e1696 | |||
| 39fde11d17 | |||
| 62c044cab3 | |||
| 84528b7c0f | |||
| 512d40f4de | |||
| 39474d5dfd | |||
| 17a28c0495 | |||
| de0d381ee2 | |||
| 4835bbba40 | |||
| e35db2b838 | |||
| 9c187da44a | |||
| 2c70ad2444 | |||
| d2d1c0aab4 | |||
| 957e280bed | |||
| 0d5cb3da51 | |||
| 2f0d3db477 | |||
| 5d6f9c45d6 | |||
| 22f7dbb6ec | |||
| 255e1d3f99 | |||
| b32bfea28d | |||
| 9dfbeeb3fe | |||
| 92623417f9 | |||
| 47e8a4b6ae | |||
| ce787650ff | |||
| f38da1da7b | |||
| aa2a46c307 | |||
| 249d88968a | |||
| 47ad86c1b3 | |||
| 3358918a96 | |||
| d210e8b717 | |||
| 2a0e05e228 | |||
| f80262b615 | |||
| 7aa46cb623 | |||
| 2a4242c57a | |||
| 8d3a3cc7f0 | |||
| eb76b2f474 | |||
| c9ed8e2088 | |||
| bee34b6262 | |||
| f4b91ddb9a | |||
| 348c6d4dcc | |||
| d9a46c97c8 | |||
| 82b874549a | |||
| 06d299f2f7 | |||
| cd0f55cd92 | |||
| 5f31542362 | |||
| edd5d39f73 | |||
| 73bf1e7fdf | |||
| a511742239 | |||
| abed2f36e0 | |||
| de253afcf4 | |||
| 946f6b7070 | |||
| 7703bfcbb0 | |||
| de2dda0382 | |||
| fabeccc310 | |||
| 3db30bd5ad | |||
| a83126e500 | |||
| c5a59756aa | |||
| dabf15d34f | |||
| b4bc49d1d7 | |||
| b68e0ccf52 | |||
| 143bfd2db7 | |||
| 2e20d4e529 | |||
| 66ff8d06d9 | |||
| 887f766464 | |||
| 85eaad14f2 | |||
| a797188d45 | |||
| 96382e7ba0 | |||
| 7682408554 | |||
| 9e85fbc151 | |||
| 10408af1a2 | |||
| 23814863f1 | |||
| 8d65521fad | |||
| 0014925ed0 | |||
| d876efec64 | |||
| b9e713f9e2 | |||
| d7b63beb4f | |||
| aa3804e4cb | |||
| afdb162d6e | |||
| 42cda441f1 | |||
| d11796ef02 | |||
| 59f5fd5651 | |||
| a1d687d3bd | |||
| 7bd96e422f | |||
| d1f601048b | |||
| 3b2fb773d3 | |||
| fed771d930 | |||
| 8930f921b4 | |||
| 5de1bf65e4 | |||
| b46d0e96f4 | |||
| 1c67333b45 | |||
| 5e26a44c19 | |||
| 865dea5dc3 | |||
| d5eea9a8ef | |||
| 365aedafe6 | |||
| 399fcd3c64 | |||
| 299adb8e4d | |||
| f86792356e | |||
| 892ed4e141 | |||
| 5364e22f39 | |||
| 6d77ebc7a7 | |||
| 1eab4bb157 | |||
| d59e4a64d3 | |||
| 0dd67146d7 | |||
| 46b7771f2c | |||
| 002697b49a | |||
| 9a77c39170 | |||
| bcc504190a | |||
| c9cf67d363 | |||
| 93cc60f776 | |||
| 273e6abc38 | |||
| b744be3255 | |||
| e97c64e7c2 | |||
| c4eb4ec778 | |||
| 707eac5087 | |||
| 69129587cb | |||
| b572e5d35f | |||
| 86af5598c6 | |||
| d7273909f6 | |||
| 7b4f209ebe | |||
| 46d00666e2 | |||
| 1cffe3556a | |||
| 07d94eec8b | |||
| 62469e6f52 | |||
| 2c8261dc9a | |||
| 3219547c92 | |||
| b0bc4e64a9 | |||
| 7bb049ea20 | |||
| 73becf78c4 | |||
| 7f949fe6b2 | |||
| 9abdae5fb4 | |||
| c2f2fb6bd8 | |||
| 37b8def5cd | |||
| 6ff45d0edd | |||
| 99f99efc1c | |||
| 0c08b3950f | |||
| 2fc419476d | |||
| abac3b2bb3 | |||
| 43924305b9 | |||
| 29f771caec | |||
| 35f5e6eec9 | |||
| 0a7356a560 | |||
| 6a5edd037a | |||
| 27d711cc61 | |||
| 333e04ef45 | |||
| 4a1c69cb7a | |||
| 7c5b92a05b | |||
| ee8d01ed2a | |||
| ae7c2d7854 | |||
| 2a81916124 | |||
| 48630bbda5 |
@@ -4,14 +4,34 @@ neofetch with pride flags <3
|
||||
|
||||

|
||||
|
||||
### Running Updated Original Neofetch
|
||||
|
||||
This repo also serves as an updated version of the original `neofetch` since the upstream [dylanaraps/neofetch](https://github.com/dylanaraps/neofetch) doesn't seem to be maintained anymore (as of Jul 30, 2022, the original repo hasn't merged a pull request for 6 months). If you only want to use the updated neofetch without pride flags, you can install the python package and use `neowofetch` xD.
|
||||
|
||||
If you installed `npm`, you can also run the updated original neofetch using `npx neowofetch`. If not, you can also do this:
|
||||
|
||||
```sh
|
||||
bash <(curl -s "https://raw.githubusercontent.com/Hykilpikonna/HyFetch/HEAD/neofetch")
|
||||
```
|
||||
|
||||
## Installation
|
||||
|
||||
### Method 1: Install using Python pip (Recommended)
|
||||
|
||||
Install Python >= 3.7 first. Then, just do:
|
||||
|
||||
```sh
|
||||
pip install hyfetch
|
||||
```
|
||||
|
||||
### Method 2: Install using system package manager
|
||||
|
||||
Currently, these distributions have existing packages for HyFetch:
|
||||
|
||||
* ArchLinux: `yay -S hyfetch` (Thanks to @ Aleksana)
|
||||
* Nix: `nix-env -i hyfetch` (Thanks to @ YisuiDenghua)
|
||||
* Guix: `guix install hyfetch` (Thanks to @ WammKD)
|
||||
|
||||
## Usage
|
||||
|
||||
When you run `hyfetch` for the first time, it will prompt you to choose a color system and a preset. Just follow the prompt, and everything should work (hopefully). If something doesn't work, feel free to submit an issue!
|
||||
@@ -22,11 +42,7 @@ A: Use `hyfetch -c`
|
||||
|
||||
#### Q: What do I do if the color is too dark/light for my theme?
|
||||
|
||||
A: You can try setting the colors' "lightness" using the `--c-set-l` parameter. The value should be between 0 and 1. For example, if you are using dark theme and the rainbow flag is too dark to display, you can type:
|
||||
|
||||
```sh
|
||||
hyfetch -p rainbow --c-set-l 0.8
|
||||
```
|
||||
A: You can try setting the colors' "lightness" in the configuration menu. The value should be between 0 and 1. For example, if you are using dark theme and the rainbow flag is too dark to display, you can set lightness to 0.7.
|
||||
|
||||
Feel free to experiment with it!
|
||||
|
||||
@@ -34,6 +50,110 @@ Feel free to experiment with it!
|
||||
|
||||
## Change Log
|
||||
|
||||
### About Notation
|
||||
|
||||
Updates to HyFetch begins with the emoji 🌈
|
||||
Updates to `neowofetch` begins with the emoji 🖼️
|
||||
|
||||
### TODO
|
||||
|
||||
* [ ] Paginate flags
|
||||
* [ ] Implement light/dark background detection based on https://github.com/muesli/termenv
|
||||
|
||||
### 1.2.0
|
||||
|
||||
* 🚀 Take over `neofetch` with `neowofetch`
|
||||
|
||||
<details>
|
||||
<summary>🖼️ Ascii Art Changes</summary><br>
|
||||
|
||||
* Ascii - Add uwuntu ([#9](https://github.com/hykilpikonna/hyfetch/pull/9)) (use it with `hyfetch --test-distro uwuntu` or `neowofetch --ascii_distro uwuntu`)
|
||||
* Ascii - Better Void ascii art ([#10](https://github.com/hykilpikonna/hyfetch/pull/10))
|
||||
* Ascii - Update old NixOS logo for compatibility (dylanaraps/neofetch#2114)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>🖼️ Distro/OS Support Changes</summary><br>
|
||||
|
||||
* OS - Identify macOS 13 Ventura ([#8](https://github.com/hykilpikonna/hyfetch/pull/8))
|
||||
* OS - Windows 11 Fluent (dylanaraps/neofetch#2109)
|
||||
* Distro - Add Asahi Linux (dylanaraps/neofetch#2079)
|
||||
* Distro - Add CenterOS (dylanaraps/neofetch#2097)
|
||||
* Distro - Add Finnix (dylanaraps/neofetch#2099)
|
||||
* Distro - Add Miracle Linux (dylanaraps/neofetch#2085)
|
||||
* Distro - Add Univalent (dylanaraps/neofetch#2162)
|
||||
* Distro - Add NomadBSD (dylanaraps/neofetch#2147)
|
||||
* Distro - Add GrapheneOS (dylanaraps/neofetch#2146)
|
||||
* Distro - Add ShastraOS (dylanaraps/neofetch#2149)
|
||||
* Distro - Add Ubuntu Touch (dylanaraps/neofetch#2167)
|
||||
* Distro - Add Ubuntu Sway (dylanaraps/neofetch#2136)
|
||||
* Distro - Add Orchid Linux (dylanaraps/neofetch#2144)
|
||||
* Distro - Add AOSC OS/Retro (dylanaraps/neofetch#2124)
|
||||
* Distro - Add Ultramarine Linux (dylanaraps/neofetch#2115)
|
||||
* Distro - Improve NixOS version detection (dylanaraps/neofetch#2157)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>🖼️ Device Support Changes</summary><br>
|
||||
|
||||
* Terminal - Add Termux (dylanaraps/neofetch#2168)
|
||||
* CPU - Add loongarch64 (dylanaraps/neofetch#2140)
|
||||
* CPU - Identify CPU name for ARM / RISCV (dylanaraps/neofetch#2139)
|
||||
* Battery - Fix file not found (dylanaraps/neofetch#2130)
|
||||
* GPU - Identify open-kernal Nvidia driver version (dylanaraps/neofetch#2128)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>🖼️ Bug Fixes</summary><br>
|
||||
|
||||
* Bug Fix - Fix broken fedora output (dylanaraps/neofetch#2084)
|
||||
|
||||
</details>
|
||||
|
||||
<img width="200px" src="https://user-images.githubusercontent.com/22280294/181790059-47aa6f80-be99-4e67-8fa5-5c02b02842c6.png" align="right">
|
||||
|
||||
### 1.1.3rc1
|
||||
|
||||
* 🌈 Add foreground-background color arrangement to make Fedora and Ubuntu look nicer
|
||||
* 🌈 Allow typing abbreviations in flag selection
|
||||
* 🌈 Fix: Duplicate random color arrangements are appearing in selection screen
|
||||
* 🌈 Fix: Inconsistant color arrangement when saved to config file
|
||||
|
||||
### 1.1.2
|
||||
|
||||
* Add more flags ([#5](https://github.com/hykilpikonna/hyfetch/pull/5))
|
||||
* Removed `numpy` dependency that was used in 1.1.0
|
||||
|
||||
<img width="200px" src="https://user-images.githubusercontent.com/22280294/180901539-014f036e-c926-4470-ac72-a6d6dcf30672.png" align="right">
|
||||
|
||||
### 1.1.0
|
||||
|
||||
* Refactored a lot of things
|
||||
* Added Beiyang flag xD
|
||||
* Added interactive configurator for brightness adjustment
|
||||
* Added dark/light mode selection
|
||||
* Added color bar preview for RGB/8bit mode selection
|
||||
* Added random color arrangement feature (for NixOS)
|
||||
|
||||
### 1.0.7
|
||||
|
||||
* Fix: Make config path not on init but when it's actually needed.
|
||||
|
||||
### 1.0.6
|
||||
|
||||
* Remove `hypy_utils` dependency to make packaging easier.
|
||||
|
||||
### 1.0.5
|
||||
|
||||
* Fix terminal emulator detection ([PR #2](https://github.com/hykilpikonna/hyfetch/pull/2))
|
||||
|
||||
### 1.0.4
|
||||
|
||||
* Add more flags ([PR #1](https://github.com/hykilpikonna/hyfetch/pull/1))
|
||||
|
||||
### 1.0.3
|
||||
|
||||
* Fix missing dependency for setuptools
|
||||
@@ -53,6 +173,9 @@ Feel free to experiment with it!
|
||||
## More Screenshots
|
||||
|
||||

|
||||

|
||||
|
||||
## Original Readme from Neofetch Below
|
||||
|
||||
<h3 align="center"><img src="https://i.imgur.com/ZQI2EYz.png" alt="logo" height="100px"></h3>
|
||||
<p align="center">A command-line system information tool written in bash 3.2+</p>
|
||||
@@ -75,6 +198,7 @@ The information by default is displayed alongside your operating system's logo.
|
||||
|
||||
You can further configure Neofetch to display exactly what you want it to. Through the use of command-line flags and the configuration file you can change existing information outputs or add your own custom ones.
|
||||
|
||||
|
||||
Neofetch supports almost 150 different operating systems. From Linux to Windows, all the way to more obscure operating systems like Minix, AIX and Haiku. If your favourite operating system is unsupported: Open up an issue and support will be added.
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env python3
|
||||
import argparse
|
||||
import os
|
||||
import shlex
|
||||
from subprocess import check_output
|
||||
|
||||
import pyperclip
|
||||
import requests
|
||||
from github import Github
|
||||
|
||||
upstream = 'dylanaraps/neofetch'
|
||||
my_fork = 'hykilpikonna/hyfetch'
|
||||
my_base = 'master'
|
||||
# gh_token = os.environ['GH_TOKEN']
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description='Helper for accepting upstream pull requests')
|
||||
parser.add_argument('pull', type=int, help='Pull request number')
|
||||
args = parser.parse_args()
|
||||
pr = args.pull
|
||||
|
||||
print(f'Accepting pull request {pr}...')
|
||||
|
||||
# Fetch original pr's information
|
||||
info = requests.get(f'https://api.github.com/repos/{upstream}/pulls/{pr}').json()
|
||||
# print(info)
|
||||
head = info['head']['repo']['full_name']
|
||||
head_br = info['head']['ref']
|
||||
head_lbl = info['head']['label']
|
||||
user = info['user']['login']
|
||||
print()
|
||||
print('Original Pull Request Info:')
|
||||
print('> State:', info['state'])
|
||||
print('> Title:', info['title'])
|
||||
print('> User:', user)
|
||||
print('> Created:', info['created_at'])
|
||||
print('> Head:', head, head_br, head_lbl)
|
||||
|
||||
# Fetch commit information
|
||||
commits = requests.get(f'https://api.github.com/repos/{upstream}/pulls/{pr}/commits').json()
|
||||
author = commits[0]['commit']['author']
|
||||
|
||||
# Fetch head branch
|
||||
print()
|
||||
print('Fetching head branch...')
|
||||
os.system(f'git fetch https://github.com/{head} {head_br}')
|
||||
|
||||
# Merge head branch
|
||||
print()
|
||||
print('Merging fetch_head...')
|
||||
title = info["title"].replace('"', '\\"')
|
||||
os.system(f'git merge FETCH_HEAD --no-ff --no-edit '
|
||||
f'-m "[PR] {upstream}#{pr} from {user} - {title}" '
|
||||
f'-m "Upstream PR: https://github.com/{upstream}/pull/{pr} \n'
|
||||
f'Thanks to @{user}\n\n'
|
||||
f'Co-authored-by: {author["name"]} <{author["email"]}>"')
|
||||
|
||||
# Push
|
||||
print()
|
||||
print('Pushing...')
|
||||
os.system('git push')
|
||||
|
||||
# Get commit SHA
|
||||
sha = check_output(shlex.split('git rev-parse --short HEAD')).decode().strip()
|
||||
|
||||
# Copy comment to clipboard
|
||||
comment = f"""
|
||||
Thank you for your contribution!
|
||||
|
||||
This PR is [merged into hyfetch](https://github.com/hykilpikonna/hyfetch/commit/{sha}) since this repo (dylanaraps/neofetch) seems no longer maintained.
|
||||
|
||||
[HyFetch](https://github.com/hykilpikonna/hyfetch) is a fork of neofetch with LGBTQ pride flags, but the repo also serves as an updated version of neofetch, addressing many pull requests that are not merged in the original repo.
|
||||
"""
|
||||
pyperclip.copy(comment.strip())
|
||||
print()
|
||||
print('Done!')
|
||||
print('Comment response copied to clipboard.')
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
with import <nixpkgs> {};
|
||||
|
||||
rec {
|
||||
hyfetch = python3Packages.buildPythonPackage rec {
|
||||
pname = "HyFetch";
|
||||
version = "1.0.7";
|
||||
|
||||
src = pythonPackages.fetchPypi {
|
||||
inherit pname version;
|
||||
hash = "sha256-3/6/3EtTqHXTMuRIo2nclIxYSzOFvQegR29OJsKMQU4=";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = with python3Packages; [
|
||||
typing-extensions
|
||||
setuptools
|
||||
];
|
||||
|
||||
doCheck = false;
|
||||
|
||||
meta = with lib; {
|
||||
description = "neofetch with pride flags <3";
|
||||
longDescription = ''
|
||||
HyFetch is a command-line system information tool fork of neofetch.
|
||||
HyFetch displays information about your system next to your OS logo
|
||||
in ASCII representation. The ASCII representation is then colored in
|
||||
the pattern of the pride flag of your choice. The main purpose of
|
||||
HyFetch is to be used in screenshots to show other users what
|
||||
operating system or distribution you are running, what theme or
|
||||
icon set you are using, etc.
|
||||
'';
|
||||
homepage = "https://github.com/hykilpikonna/HyFetch";
|
||||
license = licenses.mit;
|
||||
mainProgram = "hyfetch";
|
||||
};
|
||||
};
|
||||
}
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from . import main
|
||||
|
||||
|
||||
__version__ = '1.0.3'
|
||||
__version__ = main.VERSION
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
"""
|
||||
This version of color_scale is a special version made without numpy dependency. The numpy version
|
||||
would be faster, but numpy is 11 MB large. In comparison, hyfetch 1.0.7 is only 105 kB, so it's not
|
||||
a good idea to depend on numpy.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from .color_util import RGB
|
||||
|
||||
|
||||
def create_gradient_hex(colors: list[str], resolution: int = 300) -> list[RGB]:
|
||||
"""
|
||||
Create gradient array from hex
|
||||
"""
|
||||
colors = [RGB.from_hex(s) for s in colors]
|
||||
return create_gradient(colors, resolution)
|
||||
|
||||
|
||||
def create_gradient(colors: list[RGB], resolution: int) -> list[RGB]:
|
||||
"""
|
||||
Create gradient array
|
||||
|
||||
Usage: arr[ratio / len(arr)] = Scaled gradient color at that point
|
||||
"""
|
||||
result = []
|
||||
|
||||
# Create gradient mapping
|
||||
for i in range(len(colors) - 1):
|
||||
c1 = colors[i]
|
||||
c2 = colors[i + 1]
|
||||
bi = i * resolution
|
||||
|
||||
for ri in range(resolution):
|
||||
ratio = ri / resolution
|
||||
r = int(c2.r * ratio + c1.r * (1 - ratio))
|
||||
g = int(c2.g * ratio + c1.g * (1 - ratio))
|
||||
b = int(c2.b * ratio + c1.b * (1 - ratio))
|
||||
result.append(RGB(r, g, b))
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def get_raw(gradient: list[RGB], ratio: float) -> RGB:
|
||||
"""
|
||||
:param gradient: Gradient array (2d)
|
||||
:param ratio: Between 0-1
|
||||
:return: RGB subarray (1d, has 3 values)
|
||||
"""
|
||||
if ratio == 1:
|
||||
return gradient[-1]
|
||||
|
||||
i = int(ratio * len(gradient))
|
||||
return gradient[i]
|
||||
|
||||
|
||||
class Scale:
|
||||
colors: list[RGB]
|
||||
rgb: list[RGB]
|
||||
|
||||
def __init__(self, scale: list[str], resolution: int = 300):
|
||||
self.colors = [RGB.from_hex(s) for s in scale]
|
||||
self.rgb = create_gradient(self.colors, resolution)
|
||||
|
||||
def __call__(self, ratio: float) -> RGB:
|
||||
"""
|
||||
:param ratio: Between 0-1
|
||||
"""
|
||||
return get_raw(self.rgb, ratio)
|
||||
|
||||
|
||||
def test_color_scale():
|
||||
scale = Scale(['#232323', '#4F1879', '#B43A78', '#F98766', '#FCFAC0'])
|
||||
|
||||
colors = 100
|
||||
for i in range(colors + 1):
|
||||
print(scale(i / colors).to_ansi_rgb(False), end=' ')
|
||||
+80
-5
@@ -1,10 +1,69 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import colorsys
|
||||
from typing import NamedTuple
|
||||
from typing import NamedTuple, Callable, Optional
|
||||
|
||||
from typing_extensions import Literal
|
||||
|
||||
from .constants import GLOBAL_CFG
|
||||
|
||||
AnsiMode = Literal['default', 'ansi', '8bit', 'rgb']
|
||||
LightDark = Literal['light', 'dark']
|
||||
|
||||
|
||||
MINECRAFT_COLORS = ["&0/\033[0;30m", "&1/\033[0;34m", "&2/\033[0;32m", "&3/\033[0;36m", "&4/\033[0;31m",
|
||||
"&5/\033[0;35m", "&6/\033[0;33m", "&7/\033[0;37m", "&8/\033[1;30m", "&9/\033[1;34m",
|
||||
"&a/\033[1;32m", "&b/\033[1;36m", "&c/\033[1;31m", "&d/\033[1;35m", "&e/\033[1;33m",
|
||||
"&f/\033[1;37m",
|
||||
"&r/\033[0m", "&l/\033[1m", "&o/\033[3m", "&n/\033[4m", "&-/\n"]
|
||||
MINECRAFT_COLORS = [(r[:2], r[3:]) for r in MINECRAFT_COLORS]
|
||||
|
||||
|
||||
def color(msg: str) -> str:
|
||||
"""
|
||||
Replace extended minecraft color codes in string
|
||||
:param msg: Message with minecraft color codes
|
||||
:return: Message with escape codes
|
||||
"""
|
||||
for code, esc in MINECRAFT_COLORS:
|
||||
msg = msg.replace(code, esc)
|
||||
|
||||
while '&gf(' in msg or '&gb(' in msg:
|
||||
i = msg.index('&gf(') if '&gf(' in msg else msg.index('&gb(')
|
||||
end = msg.index(')', i)
|
||||
code = msg[i + 4:end]
|
||||
fore = msg[i + 2] == 'f'
|
||||
|
||||
if code.startswith('#'):
|
||||
rgb = tuple(int(code.lstrip('#')[i:i+2], 16) for i in (0, 2, 4))
|
||||
else:
|
||||
code = code.replace(',', ' ').replace(';', ' ').replace(' ', ' ')
|
||||
rgb = tuple(int(c) for c in code.split(' '))
|
||||
|
||||
msg = msg[:i] + RGB(*rgb).to_ansi(foreground=fore) + msg[end + 1:]
|
||||
|
||||
return msg
|
||||
|
||||
|
||||
def printc(msg: str):
|
||||
"""
|
||||
Print with color
|
||||
:param msg: Message with minecraft color codes
|
||||
"""
|
||||
print(color(msg + '&r'))
|
||||
|
||||
|
||||
def clear_screen(title: str = ''):
|
||||
"""
|
||||
Clear screen using ANSI escape codes
|
||||
"""
|
||||
if not GLOBAL_CFG.debug:
|
||||
print('\033[2J\033[H', end='')
|
||||
|
||||
if title:
|
||||
print()
|
||||
printc(title)
|
||||
print()
|
||||
|
||||
|
||||
def redistribute_rgb(r: int, g: int, b: int) -> tuple[int, int, int]:
|
||||
@@ -99,7 +158,9 @@ class RGB(NamedTuple):
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def to_ansi(self, mode: AnsiMode, foreground: bool = True):
|
||||
def to_ansi(self, mode: AnsiMode | None = None, foreground: bool = True):
|
||||
if not mode:
|
||||
mode = GLOBAL_CFG.color_mode
|
||||
if mode == 'rgb':
|
||||
return self.to_ansi_rgb(foreground)
|
||||
if mode == '8bit':
|
||||
@@ -116,12 +177,26 @@ class RGB(NamedTuple):
|
||||
"""
|
||||
return RGB(*redistribute_rgb(*[v * multiplier for v in self]))
|
||||
|
||||
def set_light(self, light: int) -> 'RGB':
|
||||
def set_light(self, light: float, at_least: bool | None = None, at_most: bool | None = None) -> 'RGB':
|
||||
"""
|
||||
Set HSL lightness value
|
||||
|
||||
:param light: Lightness value
|
||||
:param light: Lightness value (0-1)
|
||||
:param at_least: Set the lightness to at least this value (no change if greater)
|
||||
:param at_most: Set the lightness to at most this value (no change if lesser)
|
||||
:return: New color (original isn't modified)
|
||||
"""
|
||||
# Convert to HSL
|
||||
h, l, s = colorsys.rgb_to_hls(*[v / 255.0 for v in self])
|
||||
return RGB(*[round(v * 255.0) for v in colorsys.hls_to_rgb(h, light, s)])
|
||||
|
||||
# Modify light value
|
||||
if at_least is None and at_most is None:
|
||||
l = light
|
||||
else:
|
||||
if at_most:
|
||||
l = min(l, light)
|
||||
if at_least:
|
||||
l = max(l, light)
|
||||
|
||||
# Convert back to RGB
|
||||
return RGB(*[round(v * 255.0) for v in colorsys.hls_to_rgb(h, l, s)])
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
|
||||
from typing_extensions import Literal
|
||||
|
||||
CONFIG_PATH = Path.home() / '.config/hyfetch.json'
|
||||
VERSION = '1.2.0'
|
||||
|
||||
# Obtain terminal size
|
||||
try:
|
||||
TERM_LEN = os.get_terminal_size().columns
|
||||
except Exception:
|
||||
TERM_LEN = 40
|
||||
|
||||
TEST_ASCII = r"""
|
||||
### |\___/| ###
|
||||
### ) ( ###
|
||||
## =\ /= ##
|
||||
#### )===( ####
|
||||
### / \ ###
|
||||
### | | ###
|
||||
## / {txt} \ ##
|
||||
## \ / ##
|
||||
_/\_\_ _/_/\_
|
||||
|##| ( ( |##|
|
||||
|##| ) ) |##|
|
||||
|##| (_( |##|""".strip('\n')
|
||||
|
||||
TEST_ASCII_WIDTH = max(len(line) for line in TEST_ASCII.split('\n'))
|
||||
DEFAULT_DARK_L = 0.
|
||||
|
||||
@dataclass
|
||||
class GlobalConfig:
|
||||
# Global color mode default to 8-bit for compatibility
|
||||
color_mode: str
|
||||
override_distro: str | None
|
||||
debug: bool
|
||||
is_light: bool
|
||||
|
||||
def light_dark(self) -> Literal['light', 'dark']:
|
||||
return 'light' if self.is_light else 'dark'
|
||||
|
||||
def default_lightness(self, term: Literal['light', 'dark'] | None = None) -> float:
|
||||
if term is None:
|
||||
term = self.light_dark()
|
||||
return 0.65 if term.lower() == 'dark' else 0.4
|
||||
|
||||
|
||||
GLOBAL_CFG = GlobalConfig(color_mode='8bit', override_distro=None, debug=False, is_light=False)
|
||||
+230
-71
@@ -3,27 +3,16 @@ from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
import random
|
||||
import re
|
||||
from itertools import permutations
|
||||
from typing import Iterable
|
||||
|
||||
from hypy_utils import printc, json_stringify, color
|
||||
|
||||
from .color_util import AnsiMode
|
||||
from .neofetch_util import run_neofetch
|
||||
from .presets import PRESETS, ColorProfile
|
||||
|
||||
CONFIG_PATH = Path.home() / '.config/hyfetch.json'
|
||||
CONFIG_PATH.parent.mkdir(exist_ok=True, parents=True)
|
||||
|
||||
|
||||
@dataclass
|
||||
class Config:
|
||||
preset: str
|
||||
mode: AnsiMode
|
||||
|
||||
def save(self):
|
||||
CONFIG_PATH.write_text(json_stringify(self), 'utf-8')
|
||||
from .color_util import printc, color, clear_screen
|
||||
from .constants import CONFIG_PATH, VERSION, TERM_LEN, TEST_ASCII_WIDTH, TEST_ASCII, GLOBAL_CFG
|
||||
from .models import Config
|
||||
from .neofetch_util import run_neofetch, get_distro_ascii, ColorAlignment, ascii_size, get_fore_back
|
||||
from .presets import PRESETS
|
||||
|
||||
|
||||
def check_config() -> Config:
|
||||
@@ -36,56 +25,56 @@ def check_config() -> Config:
|
||||
:return: Config object
|
||||
"""
|
||||
if CONFIG_PATH.is_file():
|
||||
return Config(**json.loads(CONFIG_PATH.read_text('utf-8')))
|
||||
try:
|
||||
return Config.from_dict(json.loads(CONFIG_PATH.read_text('utf-8')))
|
||||
except KeyError:
|
||||
return create_config()
|
||||
|
||||
return create_config()
|
||||
|
||||
|
||||
def literal_input(prompt: str, options: Iterable[str], default: str) -> str:
|
||||
def literal_input(prompt: str, options: Iterable[str], default: str, show_ops: bool = True) -> str:
|
||||
"""
|
||||
Ask the user to provide an input among a list of options
|
||||
|
||||
:param prompt: Input prompt
|
||||
:param options: Options
|
||||
:param default: Default option
|
||||
:param show_ops: Show options
|
||||
:return: Selection
|
||||
"""
|
||||
options = list(options)
|
||||
lows = [o.lower() for o in options]
|
||||
|
||||
op_text = '|'.join([f'&l&n{o}&r' if o == default else o for o in options])
|
||||
printc(f'{prompt} ({op_text})')
|
||||
selection = input('> ') or default
|
||||
while not selection.lower() in lows:
|
||||
if show_ops:
|
||||
op_text = '|'.join([f'&l&n{o}&r' if o == default else o for o in options])
|
||||
printc(f'{prompt} ({op_text})')
|
||||
else:
|
||||
printc(f'{prompt} (default: {default})')
|
||||
|
||||
def find_selection(sel: str):
|
||||
if not sel:
|
||||
return None
|
||||
|
||||
# Find exact match
|
||||
if sel in lows:
|
||||
return options[lows.index(sel)]
|
||||
|
||||
# Find starting abbreviation
|
||||
for i, op in enumerate(lows):
|
||||
if op.startswith(sel):
|
||||
return options[i]
|
||||
|
||||
return None
|
||||
|
||||
selection = input('> ').lower() or default
|
||||
while not find_selection(selection):
|
||||
print(f'Invalid selection! {selection} is not one of {"|".join(options)}')
|
||||
selection = input('> ') or default
|
||||
selection = input('> ').lower() or default
|
||||
|
||||
print()
|
||||
|
||||
return options[lows.index(selection)]
|
||||
|
||||
|
||||
def center_text(txt: str, spaces: int) -> str:
|
||||
"""
|
||||
Put the text in the center in a defined space
|
||||
|
||||
>>> center_text('meow', 9)
|
||||
' meow '
|
||||
|
||||
:param txt: Text
|
||||
:param spaces: Total space of the text
|
||||
:return: Text with length spaces
|
||||
"""
|
||||
spaces -= len(txt)
|
||||
|
||||
if spaces % 2 == 1:
|
||||
spaces -= 1
|
||||
txt += ' '
|
||||
|
||||
while spaces > 0:
|
||||
spaces -= 2
|
||||
txt = f' {txt} '
|
||||
|
||||
return txt
|
||||
return find_selection(selection)
|
||||
|
||||
|
||||
def create_config() -> Config:
|
||||
@@ -94,35 +83,178 @@ def create_config() -> Config:
|
||||
|
||||
:return: Config object (automatically stored)
|
||||
"""
|
||||
# Select color system
|
||||
# TODO: Demo of each color system
|
||||
color_system = literal_input('Which &acolor &bsystem &rdo you want to use?',
|
||||
['8bit', 'rgb'], 'rgb')
|
||||
title = 'Welcome to &b&lhy&f&lfetch&r! Let\'s set up some colors first.'
|
||||
clear_screen(title)
|
||||
|
||||
# Print preset
|
||||
print('Available presets:\n')
|
||||
spacing = max(max(len(k) for k in PRESETS.keys()), 30)
|
||||
##############################
|
||||
# 1. Select color system
|
||||
try:
|
||||
# Demonstrate RGB with a gradient. This requires numpy
|
||||
from .color_scale import Scale
|
||||
|
||||
scale2 = Scale(['#12c2e9', '#c471ed', '#f7797d'])
|
||||
_8bit = [scale2(i / TERM_LEN).to_ansi_8bit(False) for i in range(TERM_LEN)]
|
||||
_rgb = [scale2(i / TERM_LEN).to_ansi_rgb(False) for i in range(TERM_LEN)]
|
||||
|
||||
printc('&f' + ''.join(c + t for c, t in zip(_8bit, '8bit Color Testing'.center(TERM_LEN))))
|
||||
printc('&f' + ''.join(c + t for c, t in zip(_rgb, 'RGB Color Testing'.center(TERM_LEN))))
|
||||
|
||||
print()
|
||||
printc(f'&a1. Which &bcolor system &ado you want to use?')
|
||||
printc(f'(If you can\'t see colors under "RGB Color Testing", please choose 8bit)')
|
||||
print()
|
||||
color_system = literal_input('Your choice?', ['8bit', 'rgb'], 'rgb')
|
||||
|
||||
except ModuleNotFoundError:
|
||||
# Numpy not found, skip gradient test, use fallback
|
||||
color_system = literal_input('Which &acolor &bsystem &rdo you want to use?',
|
||||
['8bit', 'rgb'], 'rgb')
|
||||
|
||||
# Override global color mode
|
||||
GLOBAL_CFG.color_mode = color_system
|
||||
title += f'\n&e1. Selected color mode: &r{color_system}'
|
||||
|
||||
##############################
|
||||
# 2. Select light/dark mode
|
||||
clear_screen(title)
|
||||
light_dark = literal_input(f'2. Is your terminal in &gf(#85e7e9)light mode&r or &gf(#c471ed)dark mode&r?',
|
||||
['light', 'dark'], 'dark')
|
||||
is_light = light_dark == 'light'
|
||||
GLOBAL_CFG.is_light = is_light
|
||||
title += f'\n&e2. Light/Dark: &r{light_dark}'
|
||||
|
||||
##############################
|
||||
# 3. Choose preset
|
||||
clear_screen(title)
|
||||
printc('&a3. Let\'s choose a flag!')
|
||||
printc('Available flag presets:')
|
||||
print()
|
||||
|
||||
# Create flags = [[lines]]
|
||||
flags = []
|
||||
spacing = max(max(len(k) for k in PRESETS.keys()), 20)
|
||||
for name, preset in PRESETS.items():
|
||||
flags.append([preset.color_text(' ' * spacing, foreground=False),
|
||||
'&0' + preset.color_text(center_text(name, spacing), foreground=False),
|
||||
preset.color_text(' ' * spacing, foreground=False)])
|
||||
flags_per_row = 3
|
||||
flag = preset.color_text(' ' * spacing, foreground=False)
|
||||
flags.append([name.center(spacing), flag, flag, flag])
|
||||
|
||||
# Calculate flags per row
|
||||
flags_per_row = TERM_LEN // (spacing + 2)
|
||||
while flags:
|
||||
current = flags[:flags_per_row]
|
||||
flags = flags[flags_per_row:]
|
||||
for line in range(len(current[0])):
|
||||
printc(' '.join(flag[line] for flag in current))
|
||||
|
||||
# Print by row
|
||||
[printc(' '.join(line)) for line in zip(*current)]
|
||||
print()
|
||||
|
||||
print()
|
||||
tmp = PRESETS['rainbow'].color_text('preset')
|
||||
preset = literal_input(f'Which {tmp} do you want to use?', PRESETS.keys(), 'rainbow')
|
||||
tmp = PRESETS['rainbow'].set_light_dl_def(light_dark).color_text('preset')
|
||||
preset = literal_input(f'Which {tmp} do you want to use?', PRESETS.keys(), 'rainbow', show_ops=False)
|
||||
_prs = PRESETS[preset]
|
||||
title += f'\n&e3. Selected flag: &r{_prs.color_text(preset)}'
|
||||
|
||||
#############################
|
||||
# 4. Dim/lighten colors
|
||||
clear_screen(title)
|
||||
printc(f'&a4. Let\'s adjust the color brightness!')
|
||||
printc(f'The colors might be a little bit too {"bright" if is_light else "dark"} for {light_dark} mode.')
|
||||
print()
|
||||
|
||||
# Print cats
|
||||
num_cols = TERM_LEN // (TEST_ASCII_WIDTH + 2)
|
||||
ratios = [col / (num_cols - 1) for col in range(num_cols)]
|
||||
ratios = [(r * 0.4 + 0.1) if is_light else (r * 0.4 + 0.5) for r in ratios]
|
||||
lines = [ColorAlignment('horizontal').recolor_ascii(TEST_ASCII.replace(
|
||||
'{txt}', f'{r * 100:.0f}%'.center(5)), _prs.set_light_dl(r, light_dark)).split('\n') for r in ratios]
|
||||
[printc(' '.join(line)) for line in zip(*lines)]
|
||||
|
||||
while True:
|
||||
print()
|
||||
printc(f'Which brightness level look the best? (Default: left blank = {GLOBAL_CFG.default_lightness(light_dark):.2f} for {light_dark} mode)')
|
||||
lightness = input('> ').strip().lower() or None
|
||||
|
||||
# Parse lightness
|
||||
if not lightness or lightness in ['unset', 'none']:
|
||||
lightness = None
|
||||
break
|
||||
|
||||
try:
|
||||
lightness = int(lightness[:-1]) / 100 if lightness.endswith('%') else float(lightness)
|
||||
assert 0 <= lightness <= 1
|
||||
break
|
||||
|
||||
except Exception:
|
||||
printc('&cUnable to parse lightness value, please input it as a decimal or percentage (e.g. 0.5 or 50%)')
|
||||
|
||||
if lightness:
|
||||
_prs = _prs.set_light_dl(lightness, light_dark)
|
||||
title += f'\n&e4. Brightness: &r{f"{lightness:.2f}" if lightness else "unset"}'
|
||||
|
||||
#############################
|
||||
# 5. Color arrangement
|
||||
color_alignment = None
|
||||
while True:
|
||||
clear_screen(title)
|
||||
|
||||
asc = get_distro_ascii()
|
||||
asc_width = ascii_size(asc)[0]
|
||||
fore_back = get_fore_back()
|
||||
arrangements = [
|
||||
('Horizontal', ColorAlignment('horizontal', fore_back=fore_back)),
|
||||
('Vertical', ColorAlignment('vertical'))
|
||||
]
|
||||
ascii_per_row = TERM_LEN // (asc_width + 2)
|
||||
|
||||
# Random color schemes
|
||||
pis = list(range(len(_prs.unique_colors().colors)))
|
||||
slots = len(set(re.findall('(?<=\\${c)[0-9](?=})', asc)))
|
||||
while len(pis) < slots:
|
||||
pis += pis
|
||||
perm = {p[:slots] for p in permutations(pis)}
|
||||
random_count = ascii_per_row * 2 - 2
|
||||
if random_count > len(perm):
|
||||
choices = perm
|
||||
else:
|
||||
choices = random.sample(perm, random_count)
|
||||
choices = [{i + 1: n for i, n in enumerate(c)} for c in choices]
|
||||
arrangements += [(f'random{i}', ColorAlignment('custom', r)) for i, r in enumerate(choices)]
|
||||
asciis = [[*ca.recolor_ascii(asc, _prs).split('\n'), k.center(asc_width)] for k, ca in arrangements]
|
||||
|
||||
while asciis:
|
||||
current = asciis[:ascii_per_row]
|
||||
asciis = asciis[ascii_per_row:]
|
||||
|
||||
# Print by row
|
||||
[printc(' '.join(line)) for line in zip(*current)]
|
||||
print()
|
||||
|
||||
printc(f'&a5. Let\'s choose a color arrangement!')
|
||||
printc(f'You can choose standard horizontal or vertical alignment, or use one of the random color schemes.')
|
||||
print('You can type "roll" to randomize again.')
|
||||
print()
|
||||
choice = literal_input(f'Your choice?', ['horizontal', 'vertical', 'roll'] + [f'random{i}' for i in range(random_count)], 'horizontal')
|
||||
|
||||
if choice == 'roll':
|
||||
continue
|
||||
|
||||
# Save choice
|
||||
arrangement_index = {k.lower(): ca for k, ca in arrangements}
|
||||
if choice in arrangement_index:
|
||||
color_alignment = arrangement_index[choice]
|
||||
else:
|
||||
print('Invalid choice.')
|
||||
continue
|
||||
|
||||
break
|
||||
|
||||
title += f'\n&e5. Color Alignment: &r{color_alignment}'
|
||||
|
||||
# Create config
|
||||
c = Config(preset, color_system)
|
||||
clear_screen(title)
|
||||
c = Config(preset, color_system, light_dark, lightness, color_alignment)
|
||||
|
||||
# Save config
|
||||
print()
|
||||
save = literal_input(f'Save config?', ['y', 'n'], 'y')
|
||||
if save == 'y':
|
||||
c.save()
|
||||
@@ -132,7 +264,7 @@ def create_config() -> Config:
|
||||
|
||||
def run():
|
||||
# Create CLI
|
||||
hyfetch = color('&b&lhy&f&lfetch&r')
|
||||
hyfetch = color('&b&lhyfetch&r')
|
||||
parser = argparse.ArgumentParser(description=color(f'{hyfetch} - neofetch with flags <3'))
|
||||
|
||||
parser.add_argument('-c', '--config', action='store_true', help=color(f'Configure {hyfetch}'))
|
||||
@@ -140,9 +272,29 @@ def run():
|
||||
parser.add_argument('-m', '--mode', help=f'Color mode', choices=['8bit', 'rgb'])
|
||||
parser.add_argument('--c-scale', dest='scale', help=f'Lighten colors by a multiplier', type=float)
|
||||
parser.add_argument('--c-set-l', dest='light', help=f'Set lightness value of the colors', type=float)
|
||||
parser.add_argument('-V', '--version', dest='version', action='store_true', help=f'Check version')
|
||||
parser.add_argument('--debug', action='store_true', help=f'Debug mode')
|
||||
parser.add_argument('--test-distro', help=f'Test for a specific distro')
|
||||
parser.add_argument('--test-print', action='store_true', help=f'Test print distro ascii art only')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.version:
|
||||
print(f'Version is {VERSION}')
|
||||
return
|
||||
|
||||
# Test distro ascii art
|
||||
if args.test_distro:
|
||||
print(f'Setting distro to {args.test_distro}')
|
||||
GLOBAL_CFG.override_distro = args.test_distro
|
||||
|
||||
if args.debug:
|
||||
GLOBAL_CFG.debug = True
|
||||
|
||||
if args.test_print:
|
||||
print(get_distro_ascii())
|
||||
return
|
||||
|
||||
# Load config
|
||||
config = check_config()
|
||||
|
||||
@@ -156,13 +308,20 @@ def run():
|
||||
if args.mode:
|
||||
config.mode = args.mode
|
||||
|
||||
# Override global color mode
|
||||
GLOBAL_CFG.color_mode = config.mode
|
||||
GLOBAL_CFG.is_light = config.light_dark == 'light'
|
||||
|
||||
# Get preset
|
||||
preset = PRESETS.get(config.preset)
|
||||
|
||||
# Lighten
|
||||
if args.scale:
|
||||
preset = ColorProfile([c.lighten(args.scale) for c in preset.colors])
|
||||
preset = preset.lighten(args.scale)
|
||||
if args.light:
|
||||
preset = ColorProfile([c.set_light(args.light) for c in preset.colors])
|
||||
preset = preset.set_light_raw(args.light)
|
||||
if config.lightness:
|
||||
preset = preset.set_light_dl(config.lightness)
|
||||
|
||||
# Run
|
||||
run_neofetch(preset, config.mode)
|
||||
run_neofetch(preset, config.color_align)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
|
||||
from typing_extensions import Literal
|
||||
|
||||
from .color_util import AnsiMode, LightDark
|
||||
from .constants import CONFIG_PATH
|
||||
from .neofetch_util import ColorAlignment
|
||||
from .serializer import json_stringify, from_dict
|
||||
|
||||
|
||||
@dataclass
|
||||
class Config:
|
||||
preset: str
|
||||
mode: AnsiMode
|
||||
light_dark: LightDark = 'dark'
|
||||
lightness: float | None = None
|
||||
color_align: ColorAlignment = ColorAlignment('horizontal')
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, d: dict):
|
||||
d['color_align'] = ColorAlignment.from_dict(d['color_align'])
|
||||
return from_dict(cls, d)
|
||||
|
||||
def save(self):
|
||||
CONFIG_PATH.parent.mkdir(exist_ok=True, parents=True)
|
||||
CONFIG_PATH.write_text(json_stringify(self), 'utf-8')
|
||||
+178
-18
@@ -1,15 +1,124 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import inspect
|
||||
import os
|
||||
import platform
|
||||
import re
|
||||
import subprocess
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from subprocess import check_output
|
||||
from tempfile import TemporaryDirectory
|
||||
|
||||
import pkg_resources
|
||||
from typing_extensions import Literal
|
||||
|
||||
from .color_util import AnsiMode
|
||||
from hyfetch.color_util import color
|
||||
from .constants import GLOBAL_CFG
|
||||
from .presets import ColorProfile
|
||||
from .serializer import from_dict
|
||||
|
||||
RE_NEOFETCH_COLOR = re.compile('\\${c[0-9]}')
|
||||
|
||||
|
||||
def ascii_size(asc: str) -> tuple[int, int]:
|
||||
"""
|
||||
Get distro ascii width, height ignoring color code
|
||||
|
||||
:param asc: Distro ascii
|
||||
:return: Width, Height
|
||||
"""
|
||||
return max(len(line) for line in re.sub(RE_NEOFETCH_COLOR, '', asc).split('\n')), len(asc.split('\n'))
|
||||
|
||||
|
||||
def normalize_ascii(asc: str) -> str:
|
||||
"""
|
||||
Make sure every line are the same width
|
||||
"""
|
||||
w = ascii_size(asc)[0]
|
||||
return '\n'.join(line + ' ' * (w - ascii_size(line)[0]) for line in asc.split('\n'))
|
||||
|
||||
|
||||
def fill_starting(asc: str) -> str:
|
||||
"""
|
||||
Fill the missing starting placeholders.
|
||||
|
||||
E.g. "${c1}...\n..." -> "${c1}...\n${c1}..."
|
||||
"""
|
||||
new = []
|
||||
last = ''
|
||||
for line in asc.split('\n'):
|
||||
new.append(last + line)
|
||||
|
||||
# Line has color placeholders
|
||||
matches = RE_NEOFETCH_COLOR.findall(line)
|
||||
if len(matches) > 0:
|
||||
# Get the last placeholder for the next line
|
||||
last = matches[-1]
|
||||
|
||||
return '\n'.join(new)
|
||||
|
||||
|
||||
@dataclass
|
||||
class ColorAlignment:
|
||||
mode: Literal['horizontal', 'vertical', 'custom']
|
||||
|
||||
# custom_colors[ascii color index] = unique color index in preset
|
||||
custom_colors: dict[int, int] = ()
|
||||
|
||||
# Foreground/background ascii color index
|
||||
fore_back: tuple[int, int] = ()
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, d: dict):
|
||||
return from_dict(cls, d)
|
||||
|
||||
def recolor_ascii(self, asc: str, preset: ColorProfile) -> str:
|
||||
"""
|
||||
Use the color alignment to recolor an ascii art
|
||||
|
||||
:return Colored ascii, Uncolored lines
|
||||
"""
|
||||
asc = fill_starting(asc)
|
||||
|
||||
if self.fore_back and self.mode in ['horizontal', 'vertical']:
|
||||
fore, back = self.fore_back
|
||||
|
||||
# Replace foreground colors
|
||||
asc = asc.replace(f'${{c{fore}}}', color('&0' if GLOBAL_CFG.is_light else '&f'))
|
||||
lines = asc.split('\n')
|
||||
|
||||
# Add new colors
|
||||
if self.mode == 'horizontal':
|
||||
colors = preset.with_length(len(lines))
|
||||
asc = '\n'.join([l.replace(f'${{c{back}}}', colors[i].to_ansi()) + color('&r') for i, l in enumerate(lines)])
|
||||
else:
|
||||
raise NotImplementedError()
|
||||
|
||||
# Remove existing colors
|
||||
asc = re.sub(RE_NEOFETCH_COLOR, '', asc)
|
||||
|
||||
elif self.mode in ['horizontal', 'vertical']:
|
||||
# Remove existing colors
|
||||
asc = re.sub(RE_NEOFETCH_COLOR, '', asc)
|
||||
lines = asc.split('\n')
|
||||
|
||||
# Add new colors
|
||||
if self.mode == 'horizontal':
|
||||
colors = preset.with_length(len(lines))
|
||||
asc = '\n'.join([colors[i].to_ansi() + l + color('&r') for i, l in enumerate(lines)])
|
||||
else:
|
||||
asc = '\n'.join(preset.color_text(line) + color('&r') for line in lines)
|
||||
|
||||
else:
|
||||
preset = preset.unique_colors()
|
||||
|
||||
# Apply colors
|
||||
color_map = {ai: preset.colors[pi].to_ansi() for ai, pi in self.custom_colors.items()}
|
||||
for ascii_i, c in color_map.items():
|
||||
asc = asc.replace(f'${{c{ascii_i}}}', c)
|
||||
|
||||
return asc
|
||||
|
||||
|
||||
def get_command_path() -> str:
|
||||
@@ -18,29 +127,43 @@ def get_command_path() -> str:
|
||||
|
||||
:return: Command path
|
||||
"""
|
||||
return pkg_resources.resource_filename(__name__, 'scripts/neofetch_mod.sh')
|
||||
return pkg_resources.resource_filename(__name__, 'scripts/neowofetch')
|
||||
|
||||
|
||||
def get_distro_ascii() -> str:
|
||||
def get_distro_ascii(distro: str | None = None) -> str:
|
||||
"""
|
||||
Get the distro ascii
|
||||
Get the distro ascii of the current distro. Or if distro is specified, get the specific distro's
|
||||
ascii art instead.
|
||||
|
||||
:return: Distro ascii
|
||||
"""
|
||||
return check_output([get_command_path(), "print_ascii"]).decode().strip()
|
||||
if not distro and GLOBAL_CFG.override_distro:
|
||||
distro = GLOBAL_CFG.override_distro
|
||||
if GLOBAL_CFG.debug:
|
||||
print(distro)
|
||||
print(GLOBAL_CFG)
|
||||
cmd = 'print_ascii'
|
||||
if distro:
|
||||
os.environ['CUSTOM_DISTRO'] = distro
|
||||
cmd = 'print_custom_ascii'
|
||||
|
||||
return normalize_ascii(check_output([get_command_path(), cmd]).decode().strip())
|
||||
|
||||
|
||||
def run_neofetch(preset: ColorProfile, mode: AnsiMode):
|
||||
# Get existing ascii
|
||||
def get_distro_name():
|
||||
return check_output([get_command_path(), 'ascii_distro_name']).decode().strip()
|
||||
|
||||
|
||||
def run_neofetch(preset: ColorProfile, alignment: ColorAlignment):
|
||||
"""
|
||||
Run neofetch with colors
|
||||
|
||||
:param preset: Color palette
|
||||
:param alignment: Color alignment settings
|
||||
"""
|
||||
asc = get_distro_ascii()
|
||||
|
||||
# Remove existing colors
|
||||
asc = re.sub('\\${.*?}', '', asc)
|
||||
|
||||
# Add new colors
|
||||
lines = asc.split('\n')
|
||||
colors = preset.with_length(len(lines))
|
||||
asc = '\n'.join([colors[i].to_ansi(mode) + l for i, l in enumerate(lines)])
|
||||
w, h = ascii_size(asc)
|
||||
asc = alignment.recolor_ascii(asc, preset)
|
||||
|
||||
# Write temp file
|
||||
with TemporaryDirectory() as tmp_dir:
|
||||
@@ -49,6 +172,43 @@ def run_neofetch(preset: ColorProfile, mode: AnsiMode):
|
||||
path.write_text(asc)
|
||||
|
||||
# Call neofetch with the temp file
|
||||
os.environ['ascii_len'] = str(max(len(l) for l in lines))
|
||||
os.environ['ascii_lines'] = str(len(lines))
|
||||
os.system(get_command_path() + f' --ascii --source {path.absolute()} --ascii-colors')
|
||||
os.environ['ascii_len'] = str(w)
|
||||
os.environ['ascii_lines'] = str(h)
|
||||
|
||||
if platform.system() != 'Windows':
|
||||
os.system(f'{get_command_path()} --ascii --source {path.absolute()} --ascii-colors')
|
||||
|
||||
if platform.system() == 'Windows':
|
||||
cmd = get_command_path().replace("\\", "/").replace("C:/", "/c/")
|
||||
path_str = str(path.absolute()).replace('\\', '/').replace('C:/', '/c/')
|
||||
|
||||
cmd = f'ascii_len={w} ascii_lines={h} {cmd} --ascii --source {path_str} --ascii-colors'
|
||||
full_cmd = ['C:\\Program Files\\Git\\bin\\bash.exe', '-c', cmd]
|
||||
# print(full_cmd)
|
||||
|
||||
subprocess.run(full_cmd)
|
||||
|
||||
|
||||
def get_fore_back(distro: str | None = None) -> tuple[int, int] | None:
|
||||
"""
|
||||
Get recommended foreground-background configuration for distro, or None if the distro ascii is
|
||||
not suitable for fore-back configuration.
|
||||
|
||||
:return:
|
||||
"""
|
||||
if not distro and GLOBAL_CFG.override_distro:
|
||||
distro = GLOBAL_CFG.override_distro
|
||||
if not distro:
|
||||
distro = get_distro_name().lower()
|
||||
for k, v in fore_back.items():
|
||||
if distro.startswith(k.lower()):
|
||||
return v
|
||||
return None
|
||||
|
||||
|
||||
# Foreground-background recommendation
|
||||
fore_back = {
|
||||
'fedora': (2, 1),
|
||||
'ubuntu': (2, 1),
|
||||
}
|
||||
|
||||
|
||||
+371
-3
@@ -1,8 +1,20 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Iterable
|
||||
|
||||
from typing_extensions import Literal
|
||||
|
||||
from .color_util import RGB
|
||||
from .color_util import RGB, LightDark
|
||||
from .constants import GLOBAL_CFG
|
||||
|
||||
|
||||
def remove_duplicates(seq: Iterable) -> list:
|
||||
"""
|
||||
Remove duplicate items from a sequence while preserving the order
|
||||
"""
|
||||
seen = set()
|
||||
seen_add = seen.add
|
||||
return [x for x in seq if not (x in seen or seen_add(x))]
|
||||
|
||||
|
||||
class ColorProfile:
|
||||
@@ -17,7 +29,6 @@ class ColorProfile:
|
||||
else:
|
||||
self.colors = colors
|
||||
|
||||
|
||||
def with_weights(self, weights: list[int]) -> list[RGB]:
|
||||
"""
|
||||
Map colors based on weights
|
||||
@@ -76,11 +87,58 @@ class ColorProfile:
|
||||
result += '\033[0m'
|
||||
result += t
|
||||
else:
|
||||
result += colors[i].to_ansi_rgb(foreground) + t
|
||||
result += colors[i].to_ansi(foreground=foreground) + t
|
||||
|
||||
result += '\033[0m'
|
||||
return result
|
||||
|
||||
def lighten(self, multiplier: float) -> ColorProfile:
|
||||
"""
|
||||
Lighten the color profile by a multiplier
|
||||
|
||||
:param multiplier: Multiplier
|
||||
:return: Lightened color profile (original isn't modified)
|
||||
"""
|
||||
return ColorProfile([c.lighten(multiplier) for c in self.colors])
|
||||
|
||||
def set_light_raw(self, light: float, at_least: bool | None = None, at_most: bool | None = None) -> 'ColorProfile':
|
||||
"""
|
||||
Set HSL lightness value
|
||||
|
||||
:param light: Lightness value (0-1)
|
||||
:param at_least: Set the lightness to at least this value (no change if greater)
|
||||
:param at_most: Set the lightness to at most this value (no change if lesser)
|
||||
:return: New color profile (original isn't modified)
|
||||
"""
|
||||
return ColorProfile([c.set_light(light, at_least, at_most) for c in self.colors])
|
||||
|
||||
def set_light_dl(self, light: float, term: LightDark = GLOBAL_CFG.light_dark()):
|
||||
"""
|
||||
Set HSL lightness value with respect to dark/light terminals
|
||||
|
||||
:param light: Lightness value (0-1)
|
||||
:param term: Terminal color (can be "dark" or "light")
|
||||
:return: New color profile (original isn't modified)
|
||||
"""
|
||||
assert term.lower() in ['light', 'dark']
|
||||
at_least, at_most = (True, None) if term.lower() == 'dark' else (None, True)
|
||||
return self.set_light_raw(light, at_least, at_most)
|
||||
|
||||
def set_light_dl_def(self, term: LightDark | None = None):
|
||||
"""
|
||||
Set default lightness with respect to dark/light terminals
|
||||
|
||||
:param term: Terminal color (can be "dark" or "light")
|
||||
:return: New color profile (original isn't modified)
|
||||
"""
|
||||
return self.set_light_dl(GLOBAL_CFG.default_lightness(term), term)
|
||||
|
||||
def unique_colors(self) -> ColorProfile:
|
||||
"""
|
||||
Create another color profile with only the unique colors
|
||||
"""
|
||||
return ColorProfile(remove_duplicates(self.colors))
|
||||
|
||||
|
||||
PRESETS: dict[str, ColorProfile] = {
|
||||
'rainbow': ColorProfile([
|
||||
@@ -99,12 +157,14 @@ PRESETS: dict[str, ColorProfile] = {
|
||||
'#F6AAB7',
|
||||
'#55CDFD'
|
||||
]),
|
||||
|
||||
'nonbinary': ColorProfile([
|
||||
'#FCF431',
|
||||
'#FCFCFC',
|
||||
'#9D59D2',
|
||||
'#282828'
|
||||
]),
|
||||
|
||||
'agender': ColorProfile([
|
||||
'#000000',
|
||||
'#BABABA',
|
||||
@@ -114,11 +174,13 @@ PRESETS: dict[str, ColorProfile] = {
|
||||
'#BABABA',
|
||||
'#000000'
|
||||
]),
|
||||
|
||||
'queer': ColorProfile([
|
||||
'#B57FDD',
|
||||
'#FFFFFF',
|
||||
'#49821E'
|
||||
]),
|
||||
|
||||
'genderfluid': ColorProfile([
|
||||
'#FE76A2',
|
||||
'#FFFFFF',
|
||||
@@ -132,11 +194,37 @@ PRESETS: dict[str, ColorProfile] = {
|
||||
'#9B4F96',
|
||||
'#0038A8'
|
||||
]),
|
||||
|
||||
'pansexual': ColorProfile([
|
||||
'#FF1C8D',
|
||||
'#FFD700',
|
||||
'#1AB3FF'
|
||||
]),
|
||||
|
||||
'polysexual': ColorProfile([
|
||||
'#F714BA',
|
||||
'#01D66A',
|
||||
'#1594F6',
|
||||
]),
|
||||
|
||||
# omnisexual sorced from https://www.flagcolorcodes.com/omnisexual
|
||||
'omnisexual': ColorProfile([
|
||||
'#FE9ACE',
|
||||
'#FF53BF',
|
||||
'#200044',
|
||||
'#6760FE',
|
||||
'#8EA6FF',
|
||||
]),
|
||||
|
||||
# gay men sourced from https://www.flagcolorcodes.com/gay-men
|
||||
'gay-men': ColorProfile([
|
||||
'#078D70',
|
||||
'#98E8C1',
|
||||
'#FFFFFF',
|
||||
'#7BADE2',
|
||||
'#3D1A78'
|
||||
]),
|
||||
|
||||
'lesbian': ColorProfile([
|
||||
'#D62800',
|
||||
'#FF9B56',
|
||||
@@ -144,12 +232,24 @@ PRESETS: dict[str, ColorProfile] = {
|
||||
'#D462A6',
|
||||
'#A40062'
|
||||
]),
|
||||
|
||||
# abrosexual used colorpicker to source from
|
||||
# https://fyeahaltpride.tumblr.com/post/151704251345/could-you-guys-possibly-make-an-abrosexual-pride
|
||||
'abrosexual': ColorProfile([
|
||||
'#46D294',
|
||||
'#A3E9CA',
|
||||
'#FFFFFF',
|
||||
'#F78BB3',
|
||||
'#EE1766',
|
||||
]),
|
||||
|
||||
'asexual': ColorProfile([
|
||||
'#000000',
|
||||
'#A4A4A4',
|
||||
'#FFFFFF',
|
||||
'#810081'
|
||||
]),
|
||||
|
||||
'aromantic': ColorProfile([
|
||||
'#3BA740',
|
||||
'#A8D47A',
|
||||
@@ -157,4 +257,272 @@ PRESETS: dict[str, ColorProfile] = {
|
||||
'#ABABAB',
|
||||
'#000000'
|
||||
]),
|
||||
|
||||
# aroace1 sourced from https://flag.library.lgbt/flags/aroace/
|
||||
'aroace1': ColorProfile([
|
||||
'#E28C00',
|
||||
'#ECCD00',
|
||||
'#FFFFFF',
|
||||
'#62AEDC',
|
||||
'#203856'
|
||||
]),
|
||||
|
||||
'aroace2': ColorProfile([
|
||||
'#000000',
|
||||
'#810081',
|
||||
'#A4A4A4',
|
||||
'#FFFFFF',
|
||||
'#A8D47A',
|
||||
'#3BA740'
|
||||
]),
|
||||
|
||||
'aroace3': ColorProfile([
|
||||
'#3BA740',
|
||||
'#A8D47A',
|
||||
'#FFFFFF',
|
||||
'#ABABAB',
|
||||
'#000000',
|
||||
'#A4A4A4',
|
||||
'#FFFFFF',
|
||||
'#810081'
|
||||
]),
|
||||
|
||||
# below sourced from https://www.flagcolorcodes.com/flags/pride
|
||||
# goto f"https://www.flagcolorcodes.com/{preset}" for info
|
||||
# todo: sane sorting
|
||||
'autosexual': ColorProfile([
|
||||
'#99D9EA',
|
||||
'#7F7F7F'
|
||||
]),
|
||||
|
||||
'intergender': ColorProfile([
|
||||
# todo: use weighted spacing
|
||||
'#900DC2',
|
||||
'#900DC2',
|
||||
'#FFE54F',
|
||||
'#900DC2',
|
||||
'#900DC2',
|
||||
]),
|
||||
|
||||
'greygender': ColorProfile([
|
||||
'#B3B3B3',
|
||||
'#B3B3B3',
|
||||
'#FFFFFF',
|
||||
'#062383',
|
||||
'#062383',
|
||||
'#FFFFFF',
|
||||
'#535353',
|
||||
'#535353',
|
||||
]),
|
||||
|
||||
'akiosexual': ColorProfile([
|
||||
'#F9485E',
|
||||
'#FEA06A',
|
||||
'#FEF44C',
|
||||
'#FFFFFF',
|
||||
'#000000',
|
||||
]),
|
||||
|
||||
# bigender sourced from https://www.flagcolorcodes.com/bigender
|
||||
'bigender': ColorProfile([
|
||||
'#C479A2',
|
||||
'#EDA5CD',
|
||||
'#D6C7E8',
|
||||
'#FFFFFF',
|
||||
'#D6C7E8',
|
||||
'#9AC7E8',
|
||||
'#6D82D1',
|
||||
]),
|
||||
|
||||
# demigender yellow sourced from https://lgbtqia.fandom.com/f/p/4400000000000041031
|
||||
# other colors sourced from demiboy and demigirl flags
|
||||
'demigender': ColorProfile([
|
||||
'#7F7F7F',
|
||||
'#C4C4C4',
|
||||
'#FBFF75',
|
||||
'#FFFFFF',
|
||||
'#FBFF75',
|
||||
'#C4C4C4',
|
||||
'#7F7F7F',
|
||||
]),
|
||||
|
||||
# demiboy sourced from https://www.flagcolorcodes.com/demiboy
|
||||
'demiboy': ColorProfile([
|
||||
'#7F7F7F',
|
||||
'#C4C4C4',
|
||||
'#9DD7EA',
|
||||
'#FFFFFF',
|
||||
'#9DD7EA',
|
||||
'#C4C4C4',
|
||||
'#7F7F7F',
|
||||
]),
|
||||
|
||||
# demigirl sourced from https://www.flagcolorcodes.com/demigirl
|
||||
'demigirl': ColorProfile([
|
||||
'#7F7F7F',
|
||||
'#C4C4C4',
|
||||
'#FDADC8',
|
||||
'#FFFFFF',
|
||||
'#FDADC8',
|
||||
'#C4C4C4',
|
||||
'#7F7F7F',
|
||||
]),
|
||||
|
||||
'transmasculine': ColorProfile([
|
||||
'#FF8ABD',
|
||||
'#CDF5FE',
|
||||
'#9AEBFF',
|
||||
'#74DFFF',
|
||||
'#9AEBFF',
|
||||
'#CDF5FE',
|
||||
'#FF8ABD',
|
||||
]),
|
||||
|
||||
# transfeminine used colorpicker to source from https://www.deviantart.com/pride-flags/art/Trans-Woman-Transfeminine-1-543925985
|
||||
# linked from https://gender.fandom.com/wiki/Transfeminine
|
||||
'transfeminine': ColorProfile([
|
||||
'#73DEFF',
|
||||
'#FFE2EE',
|
||||
'#FFB5D6',
|
||||
'#FF8DC0',
|
||||
'#FFB5D6',
|
||||
'#FFE2EE',
|
||||
'#73DEFF',
|
||||
]),
|
||||
|
||||
# genderfaun sourced from https://www.flagcolorcodes.com/genderfaun
|
||||
'genderfaun': ColorProfile([
|
||||
'#FCD689',
|
||||
'#FFF09B',
|
||||
'#FAF9CD',
|
||||
'#FFFFFF',
|
||||
'#8EDED9',
|
||||
'#8CACDE',
|
||||
'#9782EC',
|
||||
]),
|
||||
|
||||
'demifaun': ColorProfile([
|
||||
'#7F7F7F',
|
||||
'#7F7F7F',
|
||||
'#C6C6C6',
|
||||
'#C6C6C6',
|
||||
'#FCC688',
|
||||
'#FFF19C',
|
||||
'#FFFFFF',
|
||||
'#8DE0D5',
|
||||
'#9682EC',
|
||||
'#C6C6C6',
|
||||
'#C6C6C6',
|
||||
'#7F7F7F',
|
||||
'#7F7F7F',
|
||||
]),
|
||||
|
||||
# genderfae sourced from https://www.flagcolorcodes.com/genderfae
|
||||
'genderfae': ColorProfile([
|
||||
'#97C3A5',
|
||||
'#C3DEAE',
|
||||
'#F9FACD',
|
||||
'#FFFFFF',
|
||||
'#FCA2C4',
|
||||
'#DB8AE4',
|
||||
'#A97EDD',
|
||||
]),
|
||||
|
||||
# demifae used colorpicker to source form https://www.deviantart.com/pride-flags/art/Demifae-870194777
|
||||
'demifae': ColorProfile([
|
||||
'#7F7F7F',
|
||||
'#7F7F7F',
|
||||
'#C5C5C5',
|
||||
'#C5C5C5',
|
||||
'#97C3A4',
|
||||
'#C4DEAE',
|
||||
'#FFFFFF',
|
||||
'#FCA2C5',
|
||||
'#AB7EDF',
|
||||
'#C5C5C5',
|
||||
'#C5C5C5',
|
||||
'#7F7F7F',
|
||||
'#7F7F7F',
|
||||
]),
|
||||
|
||||
'neutrois': ColorProfile([
|
||||
'#FFFFFF',
|
||||
'#1F9F00',
|
||||
'#000000'
|
||||
]),
|
||||
|
||||
'biromantic1': ColorProfile([
|
||||
'#8869A5',
|
||||
'#D8A7D8',
|
||||
'#FFFFFF',
|
||||
'#FDB18D',
|
||||
'#151638',
|
||||
]),
|
||||
|
||||
'biromantic2': ColorProfile([
|
||||
'#740194',
|
||||
'#AEB1AA',
|
||||
'#FFFFFF',
|
||||
'#AEB1AA',
|
||||
'#740194',
|
||||
]),
|
||||
|
||||
'autoromantic': ColorProfile([ # symbol interpreted
|
||||
'#99D9EA',
|
||||
'#99D9EA',
|
||||
'#99D9EA',
|
||||
'#99D9EA',
|
||||
'#99D9EA',
|
||||
'#000000',
|
||||
'#3DA542',
|
||||
'#3DA542',
|
||||
'#000000',
|
||||
'#7F7F7F',
|
||||
'#7F7F7F',
|
||||
'#7F7F7F',
|
||||
'#7F7F7F',
|
||||
'#7F7F7F',
|
||||
]),
|
||||
|
||||
# i didn't expect this one to work. cool!
|
||||
'boyflux2': ColorProfile([
|
||||
'#E48AE4',
|
||||
'#9A81B4',
|
||||
'#55BFAB',
|
||||
'#FFFFFF',
|
||||
'#A8A8A8',
|
||||
'#81D5EF',
|
||||
'#81D5EF',
|
||||
'#81D5EF',
|
||||
'#81D5EF',
|
||||
'#81D5EF',
|
||||
'#69ABE5',
|
||||
'#69ABE5',
|
||||
'#69ABE5',
|
||||
'#69ABE5',
|
||||
'#69ABE5',
|
||||
'#69ABE5',
|
||||
'#69ABE5',
|
||||
'#69ABE5',
|
||||
'#69ABE5',
|
||||
'#69ABE5',
|
||||
'#5276D4',
|
||||
'#5276D4',
|
||||
'#5276D4',
|
||||
'#5276D4',
|
||||
'#5276D4',
|
||||
'#5276D4',
|
||||
'#5276D4',
|
||||
'#5276D4',
|
||||
'#5276D4',
|
||||
'#5276D4',
|
||||
]),
|
||||
|
||||
'beiyang': ColorProfile([
|
||||
'#DF1B12',
|
||||
'#FFC600',
|
||||
'#01639D',
|
||||
'#FFFFFF',
|
||||
'#000000',
|
||||
]),
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import dataclasses
|
||||
import inspect
|
||||
import json
|
||||
from datetime import datetime, date
|
||||
|
||||
|
||||
class EnhancedJSONEncoder(json.JSONEncoder):
|
||||
"""
|
||||
An improvement to the json.JSONEncoder class, which supports:
|
||||
encoding for dataclasses, encoding for datetime, and sets
|
||||
"""
|
||||
|
||||
def default(self, o: object) -> object:
|
||||
|
||||
# Support encoding dataclasses
|
||||
# https://stackoverflow.com/a/51286749/7346633
|
||||
if dataclasses.is_dataclass(o):
|
||||
return dataclasses.asdict(o)
|
||||
|
||||
# Support encoding datetime
|
||||
if isinstance(o, (datetime, date)):
|
||||
return o.isoformat()
|
||||
|
||||
# Support for sets
|
||||
# https://stackoverflow.com/a/8230505/7346633
|
||||
if isinstance(o, set):
|
||||
return list(o)
|
||||
|
||||
return super().default(o)
|
||||
|
||||
|
||||
def json_stringify(obj: object, indent: int | None = None) -> str:
|
||||
"""
|
||||
Serialize json string with support for dataclasses and datetime and sets and with custom
|
||||
configuration.
|
||||
Preconditions:
|
||||
- obj != None
|
||||
:param obj: Objects
|
||||
:param indent: Indent size or none
|
||||
:return: Json strings
|
||||
"""
|
||||
return json.dumps(obj, indent=indent, cls=EnhancedJSONEncoder, ensure_ascii=False)
|
||||
|
||||
|
||||
def from_dict(cls, d: dict):
|
||||
return cls(**{k: v for k, v in d.items() if k in inspect.signature(cls).parameters})
|
||||
@@ -780,41 +780,41 @@ image_source="auto"
|
||||
# Default: 'auto'
|
||||
# Values: 'auto', 'distro_name'
|
||||
# Flag: --ascii_distro
|
||||
# NOTE: AIX, Hash, Alpine, AlterLinux, Amazon, Anarchy, Android, instantOS,
|
||||
# NOTE: AIX, Asahi, Hash, Alpine, AlterLinux, Amazon, Anarchy, Android, instantOS,
|
||||
# Antergos, antiX, "AOSC OS", "AOSC OS/Retro", Apricity, ArchCraft,
|
||||
# ArcoLinux, ArchBox, ARCHlabs, ArchStrike, XFerience, ArchMerge, Arch,
|
||||
# Artix, Arya, Bedrock, Bitrig, BlackArch, BLAG, BlankOn, BlueLight,
|
||||
# Bodhi, bonsai, BSD, BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS,
|
||||
# Bodhi, bonsai, BSD, BunsenLabs, Calculate, Carbs, CentOS, CenterOS, Chakra, ChaletOS,
|
||||
# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover, Condres,
|
||||
# Container_Linux, Crystal Linux, CRUX, Cucumber, dahlia, Debian, Deepin,
|
||||
# DesaOS, Devuan, DracOS, DarkOs, Itc, DragonFly, Drauger, Elementary,
|
||||
# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD,
|
||||
# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, Finnix, FreeBSD,
|
||||
# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo,
|
||||
# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra, HydroOS
|
||||
# Hyperbola, iglunix, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion, Korora,
|
||||
# gNewSense, GNOME, GNU, GoboLinux, GrapheneOS, Grombyang, Guix, Haiku, Huayra,
|
||||
# HydroOS, Hyperbola, iglunix, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion, Korora,
|
||||
# KSLinux, Kubuntu, LEDE, LaxerOS, LibreELEC, LFS, Linux_Lite, LMDE,
|
||||
# Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva, Manjaro, TeArch, Maui,
|
||||
# Mer, Minix, LinuxMint, Live_Raizo, MX_Linux, Namib, Neptune, NetBSD,
|
||||
# Netrunner, Nitrux, NixOS, Nurunner, NuTyX, OBRevenge, OpenBSD,
|
||||
# Mer, Minix, MIRACLE_LINUX, LinuxMint, Live_Raizo, MX_Linux, Namib, Neptune, NetBSD,
|
||||
# Netrunner, Nitrux, NixOS, NomadBSD, Nurunner, NuTyX, OBRevenge, OpenBSD,
|
||||
# openEuler, OpenIndiana, openmamba, OpenMandriva, OpenStage, OpenWrt,
|
||||
# osmc, Oracle, OS Elbrus, PacBSD, Parabola, Pardus, Parrot, Parsix,
|
||||
# osmc, Oracle, Orchid, OS Elbrus, PacBSD, Parabola, Pardus, Parrot, Parsix,
|
||||
# TrueOS, PCLinuxOS, Pengwin, Peppermint, Pisi, popos, Porteus, PostMarketOS,
|
||||
# Proxmox, PuffOS, Puppy, PureOS, Qubes, Qubyt, Quibian, Radix, Raspbian,
|
||||
# Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan, Regata, Regolith,
|
||||
# Rocky, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific, Septor,
|
||||
# Rocky, Rosa, sabotage, Sabayon, Sailfish, SalentOS, ShastraOS, Scientific, Septor,
|
||||
# SereneLinux, SharkLinux, Siduction, SkiffOS, Slackware, SliTaz, SmartOS,
|
||||
# Solus, Source_Mage, Sparky, Star, SteamOS, SunOS, openSUSE_Leap, t2,
|
||||
# openSUSE_Tumbleweed, openSUSE, SwagArch, Tails, Trisquel,
|
||||
# Ubuntu-Cinnamon, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE,
|
||||
# Ubuntu-Studio, Ubuntu, Univention, Venom, Void, VNux, LangitKetujuh, semc,
|
||||
# Ubuntu-Cinnamon, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu Touch, Ubuntu-MATE,
|
||||
# Ubuntu-Studio, Ubuntu-Sway, Ubuntu, Ultramarine, Univention, Venom, Void, VNux, LangitKetujuh, semc,
|
||||
# Obarun, windows10, Windows7, Xubuntu, Zorin, and IRIX have ascii logos.
|
||||
# NOTE: Arch, Ubuntu, Redhat, Fedora and Dragonfly have 'old' logo variants.
|
||||
# Use '{distro name}_old' to use the old logos.
|
||||
# NOTE: Ubuntu has flavor variants.
|
||||
# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME,
|
||||
# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors.
|
||||
# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
|
||||
# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android,
|
||||
# NOTE: "AOSC OS/Retro", Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
|
||||
# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, Orchid, android,
|
||||
# Artix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola,
|
||||
# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS,
|
||||
# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian,
|
||||
@@ -999,6 +999,13 @@ get_distro() {
|
||||
*) distro="OS Elbrus $(< /etc/mcst_version)"
|
||||
esac
|
||||
|
||||
elif [[ -f /etc/NIXOS ]]; then
|
||||
case $distro_shorthand in
|
||||
on) distro="NixOS $(nixos-version | awk '{print substr($1,0,5),$2}')" ;;
|
||||
tiny) distro="NixOS" ;;
|
||||
*) distro="NixOS $(nixos-version)" ;;
|
||||
esac
|
||||
|
||||
elif type -p pveversion >/dev/null; then
|
||||
case $distro_shorthand in
|
||||
on|tiny) distro="Proxmox VE" ;;
|
||||
@@ -1034,6 +1041,9 @@ get_distro() {
|
||||
off) distro="${PRETTY_NAME:-${DISTRIB_DESCRIPTION}} ${UBUNTU_CODENAME}" ;;
|
||||
esac
|
||||
|
||||
# Workaround for NomadBSD.
|
||||
[[ $distro = "FreeBSD"* ]] && [[ -f /usr/bin/nomadbsd-sysinfo ]] && distro=NomadBSD
|
||||
|
||||
elif [[ -f /etc/GoboLinuxVersion ]]; then
|
||||
case $distro_shorthand in
|
||||
on|tiny) distro=GoboLinux ;;
|
||||
@@ -1124,6 +1134,15 @@ get_distro() {
|
||||
distro=$(trim_quotes "$distro")
|
||||
distro=${distro/NAME=}
|
||||
|
||||
if [[ -f /usr/bin/system-image-cli ]]; then
|
||||
local ut_ota
|
||||
ut_ota=$(system-image-cli -i | awk '/version tag:/ { print $3 }');
|
||||
distro="Ubuntu Touch $ut_ota";
|
||||
|
||||
# There's a weird UT bug where the HOSTNAME is set to android.
|
||||
HOSTNAME=$(hostname);
|
||||
fi
|
||||
|
||||
# Get Ubuntu flavor.
|
||||
if [[ $distro == "Ubuntu"* ]]; then
|
||||
case $XDG_CONFIG_DIRS in
|
||||
@@ -1134,6 +1153,7 @@ get_distro() {
|
||||
*"Lubuntu"*) distro=${distro/Ubuntu/Lubuntu} ;;
|
||||
*"budgie"*) distro=${distro/Ubuntu/Ubuntu Budgie} ;;
|
||||
*"cinnamon"*) distro=${distro/Ubuntu/Ubuntu Cinnamon} ;;
|
||||
*"ubuntusway"*) distro=${distro/Ubuntu/Ubuntu Sway} ;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
@@ -1155,6 +1175,7 @@ get_distro() {
|
||||
10.16*) codename="macOS Big Sur" ;;
|
||||
11.*) codename="macOS Big Sur" ;;
|
||||
12.*) codename="macOS Monterey" ;;
|
||||
13.*) codename="macOS Ventura" ;;
|
||||
*) codename=macOS ;;
|
||||
esac
|
||||
|
||||
@@ -1549,6 +1570,7 @@ get_packages() {
|
||||
has kiss && tot kiss l
|
||||
has cpt-list && tot cpt-list
|
||||
has pacman-key && tot pacman -Qq --color never
|
||||
has click && tot click list
|
||||
has dpkg && tot dpkg-query -f '.\n' -W
|
||||
has xbps-query && tot xbps-query -l
|
||||
has apk && tot apk info
|
||||
@@ -1677,8 +1699,12 @@ get_packages() {
|
||||
has scoop && pkgs_h=1 dir ~/scoop/apps/* && ((packages-=1))
|
||||
|
||||
# Count chocolatey packages.
|
||||
[[ -d /cygdrive/c/ProgramData/chocolatey/lib ]] && \
|
||||
dir /cygdrive/c/ProgramData/chocolatey/lib/*
|
||||
# [[ -d /c/ProgramData/chocolatey/lib ]] && \
|
||||
# dir /c/ProgramData/chocolatey/lib/*
|
||||
has choco && tot choco list --localonly
|
||||
|
||||
# Count winget
|
||||
has winget && tot winget list
|
||||
;;
|
||||
|
||||
Haiku)
|
||||
@@ -1777,7 +1803,7 @@ get_de() {
|
||||
|
||||
Windows)
|
||||
case $distro in
|
||||
*"Windows 10"*)
|
||||
*"Windows 10"*|*"Windows 11"*)
|
||||
de=Fluent
|
||||
;;
|
||||
|
||||
@@ -2206,6 +2232,18 @@ get_cpu() {
|
||||
[[ -z "$cpu" ]] && cpu="$(awk -F':' '/family/ {printf $2; exit}' "$cpu_file")"
|
||||
;;
|
||||
|
||||
"loongarch64")
|
||||
cpu="$(awk -F':' '/Model/ {print $2; exit}' "$cpu_file")"
|
||||
;;
|
||||
|
||||
"arm"* | "aarch64")
|
||||
cpu="$(lscpu | awk -F': ' '/Vendor ID/ {print $2; exit}' ) $(lscpu | awk -F': ' '/Model name/ {print $2; exit}')"
|
||||
;;
|
||||
|
||||
"riscv"*)
|
||||
cpu="$(awk -F': ' '/uarch/ {print $2; exit}' "$cpu_file")"
|
||||
;;
|
||||
|
||||
*)
|
||||
cpu="$(awk -F '\\s*: | @' \
|
||||
'/model name|Hardware|Processor|^cpu model|chip type|^cpu type/ {
|
||||
@@ -2449,7 +2487,7 @@ get_cpu() {
|
||||
cpu="${cpu//, * Compute Cores}"
|
||||
cpu="${cpu//Core / }"
|
||||
cpu="${cpu//(\"AuthenticAMD\"*)}"
|
||||
cpu="${cpu//with Radeon * Graphics}"
|
||||
cpu="${cpu//with Radeon*Graphics}"
|
||||
cpu="${cpu//, altivec supported}"
|
||||
cpu="${cpu//FPU*}"
|
||||
cpu="${cpu//Chip Revision*}"
|
||||
@@ -3307,6 +3345,7 @@ get_term() {
|
||||
[[ "$TERM" == "tw52" || "$TERM" == "tw100" ]] && term="TosWin2"
|
||||
[[ "$SSH_CONNECTION" ]] && term="$SSH_TTY"
|
||||
[[ "$WT_SESSION" ]] && term="Windows Terminal"
|
||||
[[ "$TERMUX_VERSION" ]] && term="Termux $TERMUX_VERSION"
|
||||
|
||||
# Check $PPID for terminal emulator.
|
||||
while [[ -z "$term" ]]; do
|
||||
@@ -3315,7 +3354,7 @@ get_term() {
|
||||
name="$(get_process_name "$parent")"
|
||||
|
||||
case ${name// } in
|
||||
"${SHELL/*\/}"|*"sh"|"screen"|"su"*|"newgrp") ;;
|
||||
"${SHELL/*\/}"|*"sh"|"screen"|"su"*|"newgrp"|"hyfetch") ;;
|
||||
|
||||
"login"*|*"Login"*|"init"|"(init)")
|
||||
term="$(tty)"
|
||||
@@ -3594,6 +3633,10 @@ END
|
||||
"$termite_config")"
|
||||
;;
|
||||
|
||||
"Termux $TERMUX_VERSION")
|
||||
term_font=$(fc-scan /data/data/com.termux/files/home/.termux/font.ttf|grep fullname:|cut -d '"' -f2)
|
||||
;;
|
||||
|
||||
urxvt|urxvtd|rxvt-unicode|xterm)
|
||||
xrdb=$(xrdb -query)
|
||||
term_font=$(grep -im 1 -e "^${term/d}"'\**\.*font:' -e '^\*font:' <<< "$xrdb")
|
||||
@@ -3765,6 +3808,7 @@ get_battery() {
|
||||
# We use 'prin' here so that we can do multi battery support
|
||||
# with a single battery per line.
|
||||
for bat in "/sys/class/power_supply/"{BAT,axp288_fuel_gauge,CMB}*; do
|
||||
[[ -f ${bat}/capacity && -f ${bat}/status ]] || continue
|
||||
capacity="$(< "${bat}/capacity")"
|
||||
status="$(< "${bat}/status")"
|
||||
|
||||
@@ -3940,8 +3984,7 @@ get_gpu_driver() {
|
||||
gpu_driver="${gpu_driver%, }"
|
||||
|
||||
if [[ "$gpu_driver" == *"nvidia"* ]]; then
|
||||
gpu_driver="$(< /proc/driver/nvidia/version)"
|
||||
gpu_driver="${gpu_driver/*Module }"
|
||||
gpu_driver="$(< /sys/module/nvidia/version)"
|
||||
gpu_driver="NVIDIA ${gpu_driver/ *}"
|
||||
fi
|
||||
;;
|
||||
@@ -4720,11 +4763,11 @@ set_text_colors() {
|
||||
bar_color_elapsed="$(color "$bar_color_elapsed")"
|
||||
fi
|
||||
|
||||
case ${bar_color_total}${1} in
|
||||
distro[736]) bar_color_total=$(color "$1") ;;
|
||||
distro[0-9]) bar_color_total=$(color "$2") ;;
|
||||
*) bar_color_total=$(color "$bar_color_total") ;;
|
||||
esac
|
||||
if [[ "$bar_color_total" == "distro" ]]; then
|
||||
bar_color_total="$(color fg)"
|
||||
else
|
||||
bar_color_total="$(color "$bar_color_total")"
|
||||
fi
|
||||
}
|
||||
|
||||
color() {
|
||||
@@ -5144,7 +5187,7 @@ ASCII:
|
||||
--ascii_colors x x x x x x Colors to print the ascii art
|
||||
--ascii_distro distro Which Distro's ascii art to print
|
||||
|
||||
NOTE: AIX, Hash, Alpine, AlterLinux, Amazon, Anarchy, Android,
|
||||
NOTE: AIX, Asahi, Hash, Alpine, AlterLinux, Amazon, Anarchy, Android,
|
||||
instantOS, Antergos, antiX, \"AOSC OS\", \"AOSC OS/Retro\",
|
||||
Apricity, ArchCraft, ArcoLinux, ArchBox, ARCHlabs, ArchStrike,
|
||||
XFerience, ArchMerge, Arch, Artix, Arya, Bedrock, Bitrig,
|
||||
@@ -5153,25 +5196,25 @@ ASCII:
|
||||
Cleanjaro, ClearOS, Clear_Linux, Clover, Condres, Container_Linux,
|
||||
Crystal Linux, CRUX, Cucumber, dahlia, Debian, Deepin, DesaOS, Devuan,
|
||||
DracOS, DarkOs, Itc, DragonFly, Drauger, Elementary, EndeavourOS, Endless,
|
||||
EuroLinux, Exherbo, Fedora, Feren, FreeBSD, FreeMiNT, Frugalware,
|
||||
EuroLinux, Exherbo, Fedora, Feren, Finnix, FreeBSD, FreeMiNT, Frugalware,
|
||||
Funtoo, GalliumOS, Garuda, Gentoo, Pentoo, gNewSense, GNOME, GNU,
|
||||
GoboLinux, Grombyang, Guix, Haiku, Huayra, Hyperbola, iglunix, janus, Kali,
|
||||
GoboLinux, GrapheneOS, Grombyang, Guix, Haiku, Huayra, Hyperbola, iglunix, janus, Kali,
|
||||
KaOS, KDE_neon, Kibojoe, Kogaion, Korora, KSLinux, Kubuntu, LEDE,
|
||||
LaxerOS, LibreELEC, LFS, Linux_Lite, LMDE, Lubuntu, Lunar, macos,
|
||||
Mageia, MagpieOS, Mandriva, Manjaro, TeArch, Maui, Mer, Minix, LinuxMint,
|
||||
Mageia, MagpieOS, Mandriva, Manjaro, TeArch, Maui, Mer, Minix, MIRACLE_LINUX, LinuxMint,
|
||||
Live_Raizo, MX_Linux, Namib, Neptune, NetBSD, Netrunner, Nitrux,
|
||||
NixOS, Nurunner, NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana,
|
||||
openmamba, OpenMandriva, OpenStage, OpenWrt, osmc, Oracle,
|
||||
NixOS, NomadBSD, Nurunner, NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana,
|
||||
openmamba, OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, Orchid,
|
||||
OS Elbrus, PacBSD, Parabola, Pardus, Parrot, Parsix, TrueOS,
|
||||
PCLinuxOS, Pengwin, Peppermint, Pisi, popos, Porteus, PostMarketOS,
|
||||
Proxmox, PuffOS, Puppy, PureOS, Qubes, Qubyt, Quibian, Radix, Raspbian, Reborn_OS,
|
||||
Redstar, Redcore, Redhat, Refracted_Devuan, Regata, Regolith, Rosa,
|
||||
sabotage, Sabayon, Sailfish, SalentOS, Scientific, Septor,
|
||||
sabotage, Sabayon, Sailfish, SalentOS, ShastraOS, Scientific, Septor,
|
||||
SereneLinux, SharkLinux, Siduction, Slackware, SliTaz, SmartOS,
|
||||
Solus, Source_Mage, Sparky, Star, SteamOS, SunOS, openSUSE_Leap,
|
||||
t2, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails, Trisquel,
|
||||
Ubuntu-Cinnamon, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE,
|
||||
Ubuntu-Studio, Ubuntu, Univention, Venom, Void, VNux, LangitKetujuh, semc,
|
||||
Ubuntu-Studio, Ubuntu-Sway, Ubuntu, Ultramarine, Univention, Venom, Void, VNux, LangitKetujuh, semc,
|
||||
Obarun, windows10, Windows7, Xubuntu, Zorin, and IRIX have ascii logos.
|
||||
|
||||
NOTE: Arch, Ubuntu, Redhat, Fedora and Dragonfly have 'old' logo variants.
|
||||
@@ -5183,8 +5226,8 @@ ASCII:
|
||||
NOTE: Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME,
|
||||
Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors.
|
||||
|
||||
NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
|
||||
CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android,
|
||||
NOTE: \"AOSC OS/Retro\", Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
|
||||
CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, Orchid, android,
|
||||
Artix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola,
|
||||
Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS,
|
||||
Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian,
|
||||
@@ -5557,15 +5600,41 @@ h//NNNNh ossss` +h md- .hm/ `sNNNNN:+y
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Aperio GNU/Linux"*)
|
||||
set_colors 255
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
"Aperio GNU/Linux"*)
|
||||
set_colors 255
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c2}
|
||||
_.._ _ ._.. _
|
||||
(_][_)(/,[ |(_)
|
||||
| GNU/Linux
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Asahi"*)
|
||||
set_colors 3 2 1 8 7 6 4
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} ## ${c2}**
|
||||
${c1}*####${c2}****.
|
||||
${c1}###${c2},
|
||||
${c3}...,${c1}/#${c3},,,..
|
||||
${c3}/*,,,,,,,,${c1}*${c3},........${c4},,
|
||||
${c3},((((((//*,,,,,,,,${c4},......
|
||||
${c3}((((((((((((((${c5}%..${c4}..........
|
||||
${c3},(((((((((((((((${c5}@@(${c4}............
|
||||
${c3}(((((((((((((((((${c5}@@@@/${c4}............
|
||||
${c3},((((((((((((((((((${c5}@@@@@&*${c4}...........
|
||||
${c3}((((((((((((((((((((${c5}@@@@@@@&${c4},...........
|
||||
${c3}(((((((((((((((((((((${c5}@@@${c6}&%&${c5}@@@%${c4},..........
|
||||
${c3}/(((((((((((((((((((${c5}@@@${c6}&%%&${c5}@@@@(${c4}........
|
||||
${c3},((((((((((((((((${c5}@@@${c6}&&${c5}@@&/&@@@/${c4}..
|
||||
${c3}/((((((((((((${c5}@@@@@@/${c4}.../&&
|
||||
${c3}.(((((((((${c5}@@@@(${c4}....
|
||||
${c3}/(((((${c5}@@#${c4}...
|
||||
${c3}.((${c4}&,
|
||||
|
||||
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Hash"*)
|
||||
set_colors 123
|
||||
@@ -5868,6 +5937,21 @@ ${c2} .........
|
||||
${c3}################
|
||||
EOF
|
||||
;;
|
||||
|
||||
"aoscosretro_small")
|
||||
set_colors 4 7 1 3
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c2} _____ ${c1}_____${c2}
|
||||
-' '-${c1}| |${c2}
|
||||
/ ___ ${c1}| |${c2}
|
||||
| / _ \\${c1}|_____|${c2}
|
||||
' / /_\\ \\
|
||||
\\ / _____ \\${c4}___
|
||||
${c3}|${c2}/_/ ${c3}| ${c4}| |
|
||||
${c3}| | ${c4}|___|
|
||||
${c3}|_____|
|
||||
EOF
|
||||
;;
|
||||
|
||||
"AOSC OS"*)
|
||||
set_colors 4 7 1
|
||||
@@ -6637,6 +6721,24 @@ ${c2} <><><><>
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Center"*)
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c2} .
|
||||
o,
|
||||
. d, .
|
||||
';' ..d;.. .cl'
|
||||
.:; 'oldO,.oo.
|
||||
..,:,xKXxoo;'.
|
||||
,;;;;;ldxkONMMMXxkxc;;;;;.
|
||||
.....':oddXWMNOxlcl:......
|
||||
.:dlxk0c;:. .
|
||||
:d:.,xcld,.,:.
|
||||
;l, .l; ';'
|
||||
.o;
|
||||
l,
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Chakra"*)
|
||||
set_colors 4 5 7 6
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
@@ -7491,6 +7593,29 @@ ${c1} `----------`
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Finnix"*)
|
||||
set_colors 4 7 7
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} ,,:;;;;:,,
|
||||
,;*%S########S%*;,
|
||||
;?#################S?:
|
||||
:%######################?:
|
||||
+##########################;
|
||||
+############################;
|
||||
:#############.**,#############,
|
||||
*###########+ +###########+
|
||||
?########## ${c3}Finnix${c1} ##########*
|
||||
*###########, ,###########+
|
||||
:#############%..%#############,
|
||||
*############################+
|
||||
*##########################+
|
||||
;S######################%:
|
||||
,+%##################%;
|
||||
:+?S##########S?+:
|
||||
,:;++++;:,
|
||||
EOF
|
||||
;;
|
||||
|
||||
"freebsd_small")
|
||||
set_colors 1 7 3
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
@@ -7809,6 +7934,35 @@ ${c1} _____ _
|
||||
EOF
|
||||
;;
|
||||
|
||||
"GrapheneOS"*)
|
||||
set_colors 7 4
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} B?
|
||||
G~
|
||||
G~&
|
||||
G!^:^?#
|
||||
&^.:::.J
|
||||
&PG& #G5JJ7~^~?JY5B& #PG
|
||||
B5JJPGJ77YG5JYP# && &B5JYPGJ7?YG5JYP#
|
||||
&Y..::.:P& &?..::.:G
|
||||
#!::::? B~::::J
|
||||
B~J# B!?#
|
||||
!P 75
|
||||
!P 75
|
||||
!5 7Y
|
||||
&Y~:^!P &J~:^!P
|
||||
P..::.:B Y..::.:#
|
||||
#PYJJ~^^!JJYP# &B5YJ?~^^!JJYG#
|
||||
&YYG# && #PYJ5G5??JGGYJ5G& && #PYP
|
||||
B^.::..7&
|
||||
J::::^G
|
||||
#Y^G&
|
||||
B~
|
||||
G!
|
||||
#
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Grombyang"*)
|
||||
set_colors 4 2 1
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
@@ -8683,6 +8837,28 @@ ${c2} -sdhyo+:-` -/syymm:
|
||||
EOF
|
||||
;;
|
||||
|
||||
"MIRACLE LINUX"* | "MIRACLE_LINUX"*)
|
||||
set_colors 29
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} ,A
|
||||
.###
|
||||
.#' .#### .#.
|
||||
r##: :#### ####.
|
||||
+###; :#### ######C
|
||||
:####: #### ,######".#.
|
||||
.# :####. :### #####'.#####.
|
||||
##: `####. ### ###'.########+.
|
||||
#### `####::## ##'.#######+'
|
||||
####+.`###i## #',####:'
|
||||
`+###MI`##### 'l###:'
|
||||
`+####+`### ;#E'
|
||||
`+###:## #'
|
||||
`:### '
|
||||
'##
|
||||
';
|
||||
EOF
|
||||
;;
|
||||
|
||||
"linuxmint_small"*)
|
||||
set_colors 2 7
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
@@ -8956,25 +9132,34 @@ EOF
|
||||
"nixos_old"*)
|
||||
set_colors 4 6
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} ::::. ${c2}'::::: ::::'
|
||||
${c1} '::::: ${c2}':::::. ::::'
|
||||
${c1} ::::: ${c2}'::::.:::::
|
||||
${c1} .......:::::..... ${c2}::::::::
|
||||
${c1} ::::::::::::::::::. ${c2}:::::: ${c1}::::.
|
||||
::::::::::::::::::::: ${c2}:::::. ${c1}.::::'
|
||||
${c2} ..... ::::' ${c1}:::::'
|
||||
${c2} ::::: '::' ${c1}:::::'
|
||||
${c2} ........::::: ' ${c1}:::::::::::.
|
||||
${c2}::::::::::::: ${c1}:::::::::::::
|
||||
${c2} ::::::::::: ${c1}.. ${c1}:::::
|
||||
${c2} .::::: ${c1}.::: ${c1}:::::
|
||||
${c2} .::::: ${c1}::::: ${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}/\
|
||||
${c1} \######\ ${c2}\###########/ ${c1}/##\
|
||||
${c1} ________\######\______${c2}\#########/ ${c1}/####\
|
||||
${c1} /#######################${c2}\#######/ ${c1}/######
|
||||
${c1} /#########################${c2}\######\ ${c1}/######/
|
||||
${c1} /###########################${c2}\######\ ${c1}/######/
|
||||
${c1} ¯¯¯¯¯¯¯¯¯¯¯¯${c2}/######/${c1}¯¯¯¯¯¯¯¯¯${c2}\######${c1}/######/
|
||||
${c2} /######/ ${c2}\####${c1}/######/________
|
||||
${c2} _____________/######/ ${c2}\##${c1}/################\
|
||||
${c2} /###################/ ${c2}\${c1}/##################\
|
||||
${c2} \##################/${c1}\ /###################/
|
||||
${c2} \################/${c1}##\ /######/¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||
${c2} ¯¯¯¯¯¯¯¯/######/${c1}####\ /######/
|
||||
${c2} /######/${c1}######\${c2}_________${c1}/######/${c2}____________
|
||||
${c2} /######/ ${c1}\######\${c2}###########################/
|
||||
${c2} /######/ ${c1}\######\${c2}#########################/
|
||||
${c2} ######/ ${c1}/#######\${c2}#######################/
|
||||
${c2} \####/ ${c1}/#########\${c2}¯¯¯¯¯¯\######\¯¯¯¯¯¯¯¯
|
||||
${c2} \##/ ${c1}/###########\${c2} \######\
|
||||
${c2} \/ ${c1}/#####/\######\${c2} \######\
|
||||
${c1} ${c1}/#####/ \######\${c2} \######\
|
||||
${c1} ${c1}/#####/ \######\${c2} \######
|
||||
${c1} ${c1}\####/ \######\${c2} \####/
|
||||
${c1} ${c1}¯¯¯¯ ¯¯¯¯¯¯¯${c2} ¯¯¯¯
|
||||
EOF
|
||||
;;
|
||||
|
||||
@@ -9004,6 +9189,25 @@ ${c1} ▝▀▀▀ ▀▀▀▀▘ ${c2}▀▀▀▘
|
||||
EOF
|
||||
;;
|
||||
|
||||
"NomadBSD"*)
|
||||
set_colors 4
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} _======__
|
||||
(===============\\
|
||||
(===================\\
|
||||
_ _---__
|
||||
(= ====-
|
||||
(= ======
|
||||
(== ======
|
||||
(== ======
|
||||
(==\\ \\=-_ _=/ /====/
|
||||
(==\\ \\========/ /====/ /====-_
|
||||
(==\\ \\=====/ /==/ /===--
|
||||
/================/ /===-
|
||||
\\===========/
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Nurunner"*)
|
||||
set_colors 4
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
@@ -9312,6 +9516,51 @@ ${c1}
|
||||
EOF
|
||||
;;
|
||||
|
||||
"orchid_small"*)
|
||||
set_colors 255 127
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c2} :##:
|
||||
-#${c1}@@@@${c2}#-
|
||||
#${c1}@@${c2}=..=${c1}@@${c2}#
|
||||
+${c1}@@${c2}- -${c1}@@${c2}+
|
||||
-#${c1}@@${c2}*..*${c1}@${c2}..${c1}@${c2}*..*${c1}@@${c2}#-
|
||||
:#${c1}@@${c2}*+%${c1}@${c2}= . . =${c1}@${c2}%+*${c1}@@${c2}#:
|
||||
+${c1}@@@${c2}: :-. .-: :${c1}@@@${c2}+
|
||||
:#${c1}@@${c2}*+%${c1}@${c2}= . . =${c1}@${c2}%+*${c1}@@${c2}#:
|
||||
-#${c1}@@${c2}*..*${c1}@${c2}..${c1}@${c2}*..*${c1}@@${c2}#-
|
||||
+${c1}@@${c2}- -${c1}@@${c2}+
|
||||
#${c1}@@${c2}=..=${c1}@@${c2}#
|
||||
-#${c1}@@@@${c2}#-
|
||||
:##:
|
||||
EOF
|
||||
;;
|
||||
|
||||
"orchid"*)
|
||||
set_colors 255 127 127
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c2} .==.
|
||||
.-${c3}#${c1}@@${c3}#${c2}-.
|
||||
.-${c3}##${c1}@@@@${c3}##${c2}-.
|
||||
.-${c3}##${c1}@@@@@@@@${c3}##${c2}-.
|
||||
:*${c1}@@@@@${c3}####${c1}@@@@@${c2}*:
|
||||
..:*${c1}@@@@${c2}==--==${c1}@@@@${c2}*:..
|
||||
.-*${c1}%%${c3}#${c2}==${c3}#${c1}@@${c3}#${c2}====${c3}#${c1}@@${c3}#${c2}==${c3}#${c1}%%${c2}*-.
|
||||
.-${c3}#${c1}@@@@@${c3}##${c2}==${c3}#${c1}@@${c2}++${c1}@@${c3}##${c2}==${c3}#${c1}@@@@@${c3}#${c2}-.
|
||||
.-${c3}#${c1}@@@@@${c2}#${c1}@@@${c3}#${c2}++#====${c3}#${c2}++#${c1}@@@${c2}#${c1}@@@@@${c3}#${c2}-.
|
||||
.-${c3}#${c1}@@@@@${c3}#${c2}-==**${c3}###${c2}+:--:+${c3}###${c2}**==-${c3}#${c1}@@@@@${c3}#${c2}-.
|
||||
.-${c3}#${c1}@@@@@${c3}#${c2}-==**${c3}###${c2}+:--:+${c3}###${c2}**==-${c3}#${c1}@@@@@${c3}#${c2}-.
|
||||
.-${c3}#${c1}@@@@@${c2}#${c1}@@@${c3}#${c2}++#====${c3}#${c2}++#${c1}@@@${c2}#${c1}@@@@@${c3}#${c2}-.
|
||||
.-${c3}#${c1}@@@@@${c3}##${c2}==${c3}#${c1}@@${c2}++${c1}@@${c3}##${c2}==${c3}#${c1}@@@@@${c3}#${c2}-.
|
||||
.-*${c1}%%${c3}#${c2}==${c3}#${c1}@@${c3}#${c2}====${c3}#${c1}@@${c3}#${c2}==${c3}#${c1}%%${c2}*-.
|
||||
..:*${c1}@@@@${c2}==--==${c1}@@@@${c2}*:..
|
||||
:*${c1}@@@@@${c3}####${c1}@@@@@${c2}*:
|
||||
.-${c3}##${c1}@@@@@@@@${c3}##${c2}-.
|
||||
.-${c3}##${c1}@@@@${c3}##${c2}-.
|
||||
.-${c3}#${c1}@@${c3}#${c2}-.
|
||||
.==.
|
||||
EOF
|
||||
;;
|
||||
|
||||
"OS Elbrus"*)
|
||||
set_colors 4 7 3
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
@@ -10328,6 +10577,31 @@ ${c2} `:smMM${c4}yy${c3}MMNy/`
|
||||
EOF
|
||||
;;
|
||||
|
||||
"ShastraOS"*)
|
||||
set_colors 6
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} ..,;;,'.
|
||||
':oo. ;o:
|
||||
:o, ol
|
||||
.oo ..';co:
|
||||
ooo',;:looo;
|
||||
.;lddl
|
||||
cx .xl .c:'
|
||||
dd xx xx ,d;
|
||||
.xd cx. xx dd.
|
||||
cx: .xo xx ,x:
|
||||
'xl xx cx' .xl
|
||||
xd, xx .xd dx.
|
||||
.xo:xx xx .xx
|
||||
'c xx:.'lx:
|
||||
..,;cxxxo
|
||||
.';:codxxl lxo
|
||||
cd. 'xo
|
||||
:o, 'ld
|
||||
.oc'...';lo
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Scientific"*)
|
||||
set_colors 4 7 1
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
@@ -10944,6 +11218,20 @@ ${c4} `soooo. .oooo`
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Ubuntu Touch"*)
|
||||
set_colors 3 7
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1}
|
||||
###############
|
||||
## ##
|
||||
## ${c2}##${c1} ${c2}##${c1} ##
|
||||
## ${c2}##${c1} ${c2}#${c1} ${c2}#${c1} ${c2}##${c1} ##
|
||||
## ${c2}###${c1} ##
|
||||
## ##
|
||||
###############
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Ubuntu MATE"* | "Ubuntu-MATE"*)
|
||||
set_colors 2 7
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
@@ -11020,7 +11308,33 @@ ${c1} ..-::::::-.`
|
||||
..-::::::-..
|
||||
EOF
|
||||
;;
|
||||
|
||||
|
||||
"Ubuntu Sway"* | "Ubuntu-Sway")
|
||||
set_colors 6 7
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} .-/+oossssoo+\-.
|
||||
´:+ssssssssssssssssss+:`
|
||||
-+ssssssssssssssssss${c2}yy${c1}ssss+-
|
||||
.ossssssssssssssssss${c2}dMMMNyy${c1}ssso.
|
||||
/sssssssssss${c2}hdmmNNmmyNMMMMh${c1}ssssss\
|
||||
+sssssssss${c2}hm${c1}ydMMMMMMMNdd${c2}ddy${c1}ssssssss+
|
||||
/ssssssss${c2}hN${c1}MM${c2}M${c1}yh${c2}hyyyyhmNM${c1}MM${c2}Nh${c1}ssssssss\
|
||||
.ssssssss${c2}dM${c1}MM${c2}Nh${c1}ssssssssss${c2}hN${c1}MM${c2}Md${c1}ssssssss.
|
||||
+sss${c2}yyyyyN${c1}MM${c2}Ny${c1}ssssssssssss${c2}yN${c1}MM${c2}My${c1}sssssss+
|
||||
ossy${c2}NMMMNy${c1}MM${c2}h${c1}ssssssssssssss${c2}hm${c1}mm${c2}h${c1}ssssssso
|
||||
ossy${c2}NMMMNy${c1}MM${c2}h${c1}sssssssssssssshmmmh${c1}ssssssso
|
||||
+sss${c2}yyyyyN${c1}MM${c2}Ny${c1}ssssssssssss${c2}yN${c1}MM${c2}My${c1}sssssss+
|
||||
.ssssssss${c2}dM${c1}MM${c2}Nh${c1}ssssssssss${c2}hN${c1}MM${c2}Md${c1}ssssssss.
|
||||
\ssssssss${c2}hN${c1}MM${c2}M${c1}yh${c2}hyyyyhdNM${c1}M${c2}MNh${c1}ssssssss/
|
||||
+sssssssss${c2}dm${c1}ydMMMMMMMMdd${c2}ddy${c1}ssssssss+
|
||||
\sssssssssss${c2}hdmNNNNmyNMMMMh${c1}ssssss/
|
||||
.ossssssssssssssssss${c2}dMMMNyy${c1}ssso.
|
||||
-+sssssssssssssssss${c2}yy${c1}sss+-
|
||||
`:+ssssssssssssssssss+:`
|
||||
.-\+oossssoo+/-.
|
||||
EOF
|
||||
;;
|
||||
|
||||
"ubuntu_small")
|
||||
set_colors 1 7 3
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
@@ -11058,6 +11372,57 @@ oss${c2}yNMMMNyMMh${c1}sssssssssssssshmmmh${c1}ssssssso
|
||||
.-\+oossssoo+/-.
|
||||
EOF
|
||||
;;
|
||||
"Ultramarine Linux"* | "ultramarine"*)
|
||||
set_colors 4 7
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} .cd0NNNNNNNXOdc.
|
||||
.:xKNNNNNNNNNNNNNNNNKd;.
|
||||
,dXNNNNNNNNNNNNNNNNNNNNNNNd,
|
||||
'ONNNNNNNNNNNNNNNNNNNNNNNNNNNNO'
|
||||
.xNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNk.
|
||||
.0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0.
|
||||
.0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0.
|
||||
dNNNNNNNNNNNNWWWWWWWWNNNNNNNNNNNNNNNNNNd
|
||||
NNNNNNNNNNNNNW${c2}MMMMMMMM${c1}WWNNNNNNNNNNNNNNNN
|
||||
NNNNNNNNNNNNNNW${c2}MMMMMMMMM${c1}WWNNNNNNNNNNNNNN
|
||||
NNNNNNNNNNNNNNW${c2}MMMMMMMMMMMM${c1}WNNNNNNNNNNNN
|
||||
NNNNNNNNNNWWW${c2}MMMMMMMMMMMMMMMM${c1}WWWNNNNNNNX
|
||||
oNWWWW${c2}MMMMMMMMMMMMMMMMMMMMMMMMMMMM${c1}WWWNNo
|
||||
OW${c2}MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM${c1}WO
|
||||
.OW${c2}MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM${c1}WO.
|
||||
lNW${c2}MMMMMMMMMMMMMMMMMMMMMMMMMMMM${c1}WNl
|
||||
.dNW${c2}MMMMMMMMMMMMMMMMMMMMMMMM${c1}WNd.
|
||||
.cKW${c2}MMMMMMMMMMMMMMMMMMMM${c1}WKc.
|
||||
'oOXWWW${c2}MMMMMMMM${c1}WWWXOl.
|
||||
;lkXNNNNNNXkl'
|
||||
EOF
|
||||
;;
|
||||
|
||||
|
||||
"Univalent"*)
|
||||
set_colors 6 6
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1}
|
||||
UUUUUUU UUUUUUU
|
||||
UUUUUUU UUUUUUU
|
||||
UUUUUUU A UUUUUUU
|
||||
UUUUUUU A|A UUUUUUU
|
||||
UUUUUUU A | A UUUUUUU
|
||||
UUUUUUU A | A UUUUUUU
|
||||
UUUUUUU A| | |A UUUUUUU
|
||||
UUUUUUU A | | | A UUUUUUU
|
||||
UUUUUUU A | | | A UUUUUUU
|
||||
UUUUUUU A | | | A UUUUUUU
|
||||
UUUUUUU A | | | A UUUUUUU
|
||||
UUUUUUU A | | | A UUUUUUU
|
||||
UUUUUUU A | | | A UUUUUUU
|
||||
UUUUUUU A | | | A UUUUUUU
|
||||
UUUUUUU A | | | A UUUUUUU
|
||||
UUUUUUUAAAAAAAAAAAUUUUUUU
|
||||
UUUUUUUUUUUUUUUUUUU
|
||||
UUUUUUUUUUUUU
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Univention"*)
|
||||
set_colors 1 7
|
||||
@@ -11085,6 +11450,32 @@ ${c1} ./osssssssssssssssssssssso+-
|
||||
EOF
|
||||
;;
|
||||
|
||||
"uwuntu"*)
|
||||
set_colors 225 206 52
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} &&
|
||||
&&&&&&&&
|
||||
, *&&&&&& &&&&&&&&(
|
||||
&%%%%&&&& &&&&&&&&&&&& ,&&&&&
|
||||
%%${c2}%%%%&&${c1}&&& ,&&&&&&&&&&&&&, %&&&$&&&%%$%%%.
|
||||
&%%%${c2}%&&&&&${c1}&&# &, &&&&&&${c2}&&&&&&&%%%${c1}%%
|
||||
&%%&&${c2}&&&&${c1}&&&( &&&${c2}&&&&&&%${c1}%%%
|
||||
&&&&&${c2}&&&${c1}&% *&&${c2}&&&&&${c1}&&%
|
||||
&&&/ &&&&${c3}\${c1}& ,${c3}/${c1}*.**
|
||||
%&&&&&&&& &&&${c3}⟩${c1}., *.${c3}⟨${c1}
|
||||
%&&&&&&&& &&${c3}/${c1}.. ${c3}/ \${c1} ..${c3}\${c1}(&&&&&&
|
||||
#&&&#%%%%.%%%( ${c3}\_/\_/${c1} (%%%.%%%%/
|
||||
/%%%%%%%&&* ,&&&%%%%%%&
|
||||
&&&&&&&& &&&&&&&&&&&
|
||||
(&&&&& &&&&&&&&&&&
|
||||
${c2}%%${c1} & &&&&&&&&&&&& &&&&&&&
|
||||
${c2}%%%${c1} #&&&&&&# &&&&&&&&&
|
||||
${c2}%%%%% %%${c1} #&&&&&(
|
||||
${c2}&%. %%%${c1}
|
||||
${c2}%%%%%%%
|
||||
EOF
|
||||
;;
|
||||
|
||||
"Venom"*)
|
||||
set_colors 8 4
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
@@ -11120,28 +11511,34 @@ EOF
|
||||
;;
|
||||
|
||||
"Void"*)
|
||||
set_colors 2 8
|
||||
set_colors 8 2 7
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1} __.;=====;.__
|
||||
_.=+==++=++=+=+===;.
|
||||
-=+++=+===+=+=+++++=_
|
||||
. -=:`` `--==+=++==.
|
||||
_vi, ` --+=++++:
|
||||
.uvnvi. _._ -==+==+.
|
||||
.vvnvnI` .;==|==;. :|=||=|.
|
||||
${c2}+QmQQm${c1}pvvnv; ${c2}_yYsyQQWUUQQQm #QmQ#${c1}:${c2}QQQWUV$QQm.
|
||||
${c2} -QQWQW${c1}pvvo${c2}wZ?.wQQQE${c1}==<${c2}QWWQ/QWQW.QQWW${c1}(: ${c2}jQWQE
|
||||
${c2} -$QQQQmmU' jQQQ@${c1}+=<${c2}QWQQ)mQQQ.mQQQC${c1}+;${c2}jWQQ@'
|
||||
${c2} -$WQ8Y${c1}nI: ${c2}QWQQwgQQWV${c1}`${c2}mWQQ.jQWQQgyyWW@!
|
||||
${c1} -1vvnvv. `~+++` ++|+++
|
||||
+vnvnnv, `-|===
|
||||
+vnvnvns. . :=-
|
||||
-Invnvvnsi..___..=sv=. `
|
||||
+Invnvnvnnnnnnnnvvnn;.
|
||||
~|Invnvnvvnvvvnnv}+`
|
||||
-~|{*l}*|~
|
||||
${c1} ..........
|
||||
.::::::::::::::::::..
|
||||
..:::::::::::::::::::::::::.
|
||||
'::::::::::::::::::::::::::::.
|
||||
':::::'' '':::::::::::::.
|
||||
${c3} .. ${c1}' '':::::::::.
|
||||
${c3} .||. ${c1}':::::::::
|
||||
${c3} .|||||. ${c1}'::::::::
|
||||
${c3} .|||||||: ${c1}::::::::
|
||||
${c3} |||||||: ${c1}.::::::::. ::::::::
|
||||
${c2} ######${c3}||||||' ${c2}##^ v##########v${c1}::. ${c2}##### #############v
|
||||
${c2} ######${c3}||||| ${c2}##^ v####${c1}::::::${c2}####v${c1}::${c2}##### #####${c1}:::::${c2}#####
|
||||
${c2} ######${c3}||${c2}##^ #####${c1}::::::${c2}#####${c1}::${c2}##### #####${c1}:::::${c2}######
|
||||
${c2} ######^${c3}|| ${c2}#####${c1}:::::${c2}####^${c1}::${c2}##### #####${c1}:::::${c2}#####^
|
||||
${c2} ##^${c3}||||| ${c2}^###########^${c1}:::${c2}##### ##############^
|
||||
${c3} |||||||: ${c1}'::::::::' .::::::::
|
||||
${c3} '|||||||: ${c1}.::::::::'
|
||||
${c3} '|||||||:. ${c1}'::::::
|
||||
${c3} '||||||||:. ${c1}':::
|
||||
${c3} ':|||||||||. . ${c1}'
|
||||
${c3} '|||||||||||:... ...:||||.
|
||||
${c3} ':||||||||||||||||||||||||||.
|
||||
${c3} ':|||||||||||||||||||||||''
|
||||
${c3} '':||||||||||||||:''
|
||||
${c3} ''''''
|
||||
EOF
|
||||
|
||||
;;
|
||||
|
||||
"VNux"*)
|
||||
@@ -11235,7 +11632,7 @@ EOF
|
||||
|
||||
*"[Windows 11]"*|*"on Windows 11"*|\
|
||||
"Windows 11"* |"windows11")
|
||||
set_colors 6 7
|
||||
set_colors 4 6
|
||||
read -rd '' ascii_data <<'EOF'
|
||||
${c1}
|
||||
################ ################
|
||||
@@ -11594,6 +11991,11 @@ main() {
|
||||
return 0
|
||||
}
|
||||
|
||||
get_ascii_distro_name() {
|
||||
get_distro
|
||||
echo "$ascii_distro"
|
||||
}
|
||||
|
||||
get_print_ascii() {
|
||||
cache_uname
|
||||
get_os
|
||||
@@ -11603,4 +12005,11 @@ get_print_ascii() {
|
||||
echo "$ascii_data"
|
||||
}
|
||||
|
||||
get_print_custom_ascii() {
|
||||
distro="$CUSTOM_DISTRO"
|
||||
ascii_distro=$distro
|
||||
get_distro_ascii
|
||||
echo "$ascii_data"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
|
||||
+5
-5
@@ -309,20 +309,20 @@ bonsai, BSD, BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS,
|
||||
Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover, Condres,
|
||||
Container_Linux, CRUX, Cucumber, dahlia, Debian, Deepin, DesaOS,
|
||||
Devuan, DracOS, DarkOs, Itc, DragonFly, Drauger, Elementary,
|
||||
EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD,
|
||||
EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, Finnix, FreeBSD,
|
||||
FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo,
|
||||
gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra, HydroOS,
|
||||
Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion, Korora,
|
||||
gNewSense, GNOME, GNU, GoboLinux, GrapheneOS, Grombyang, Guix, Haiku, Huayra,
|
||||
HydroOS, Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion, Korora,
|
||||
KSLinux, Kubuntu, LEDE, LaxerOS, LibreELEC, LFS, Linux_Lite, LMDE,
|
||||
Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva, Manjaro, TeArch, Maui,
|
||||
Mer, Minix, LinuxMint, Live_Raizo, MX_Linux, Namib, Neptune, NetBSD,
|
||||
Netrunner, Nitrux, NixOS, Nurunner, NuTyX, OBRevenge, OpenBSD,
|
||||
Netrunner, Nitrux, NixOS, NomadBSD, Nurunner, NuTyX, OBRevenge, OpenBSD,
|
||||
openEuler, OpenIndiana, openmamba, OpenMandriva, OpenStage, OpenWrt,
|
||||
osmc, Oracle, OS Elbrus, PacBSD, Parabola, Pardus, Parrot, Parsix,
|
||||
TrueOS, PCLinuxOS, Pengwin, Peppermint, Pisi, popos, Porteus, PostMarketOS,
|
||||
Proxmox, Puppy, PureOS, Qubes, Quibian, Radix, Raspbian, Reborn_OS,
|
||||
Redstar, Redcore, Redhat, Refracted_Devuan, Regata, Regolith, Rosa,
|
||||
sabotage, Sabayon, Sailfish, SalentOS, Scientific, Septor,
|
||||
sabotage, Sabayon, Sailfish, SalentOS, ShastraOS, Scientific, Septor,
|
||||
SereneLinux, SharkLinux, Siduction, Slackware, SliTaz, SmartOS,
|
||||
Solus, Source_Mage, Sparky, Star, SteamOS, SunOS, openSUSE_Leap,
|
||||
t2, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails, Trisquel,
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "neowofetch",
|
||||
"version": "1.2.0",
|
||||
"description": "Updated neofetch",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/hykilpikonna/neofetch.git"
|
||||
},
|
||||
"bin": {
|
||||
"neowofetch": "neofetch"
|
||||
},
|
||||
"keywords": [
|
||||
"neofetch",
|
||||
"screenfetch"
|
||||
],
|
||||
"author": "dylanaraps",
|
||||
"contributors": [
|
||||
"Azalea Gui <me@hydev.org> (https://github.com/hykilpikonna)"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/hykilpikonna/neofetch/issues"
|
||||
},
|
||||
"homepage": "https://github.com/hykilpikonna/neofetch#readme"
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import hyfetch
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#!/usr/bin/env python3
|
||||
import pathlib
|
||||
|
||||
from setuptools import setup
|
||||
@@ -32,10 +33,11 @@ setup(
|
||||
packages=['hyfetch'],
|
||||
package_data={'hyfetch': ['hyfetch/*']},
|
||||
include_package_data=True,
|
||||
install_requires=['setuptools', 'hypy_utils==1.0.6', 'typing_extensions'],
|
||||
install_requires=['setuptools', 'typing_extensions'],
|
||||
entry_points={
|
||||
"console_scripts": [
|
||||
"hyfetch=hyfetch.main:run",
|
||||
]
|
||||
},
|
||||
scripts=['hyfetch/scripts/neowofetch']
|
||||
)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from hypy_utils import printc
|
||||
|
||||
from hyfetch.color_util import RGB
|
||||
from hyfetch.color_scale import test_color_scale
|
||||
from hyfetch.color_util import RGB, printc
|
||||
from hyfetch.neofetch_util import get_command_path, run_neofetch
|
||||
from hyfetch.presets import PRESETS
|
||||
|
||||
@@ -35,6 +34,6 @@ def test_rgb_8bit_conversion():
|
||||
print()
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_rgb_8bit_conversion()
|
||||
test_color_scale()
|
||||
|
||||
Reference in New Issue
Block a user