Compare commits

...

17 commits

8 changed files with 306 additions and 202 deletions

View file

@ -1,6 +1,6 @@
[package] [package]
name = "pride" name = "pride"
version = "0.0.1" version = "0.1.4"
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View file

@ -4,13 +4,11 @@
A Rust utility to display pride flags in the terminal. A Rust utility to display pride flags in the terminal.
**This project is under heavy construction! It is subject to major structural and **This project is under heavy construction! It is subject to major structural and
architectural changes. There are no issues with functionality, but I am not architectural changes. There are no issues with functionality, but I will continue
satisfied with the current state of the project. The software is usable, but I will to make major changes and refactors until the main roadmap is complete.**
continue to refer to it as pre-release until I am happy with it.**
Currently supports a variety of stripe flags. Currently supports a variety of stripe flags.
Under Construction features: Under Construction features:
- [Variant Flags](https://git.vwolfe.io/valerie/pride/src/branch/variant)
- ["Complex" Flags](https://git.vwolfe.io/valerie/pride/src/branch/complex) - ["Complex" Flags](https://git.vwolfe.io/valerie/pride/src/branch/complex)

17
src/color.rs Normal file
View file

@ -0,0 +1,17 @@
use termion::color::{ Fg, Rgb, Reset };
pub type Color = Fg<Rgb>;
pub type Colors = Vec<Fg<Rgb>>;
pub static BLACK: Color = Fg(Rgb(0x00, 0x00, 0x00));
pub static WHITE: Color = Fg(Rgb(0xFF, 0xFF, 0xFF));
pub static RESET: Fg<Reset> = Fg(Reset);
pub fn rgb(hex: u32) -> Color {
let [_, r, g, b] = hex.to_be_bytes();
Fg(Rgb(r, g, b))
}

63
src/complex.rs Normal file
View file

@ -0,0 +1,63 @@
use std::process::exit;
use crate::color::*;
use crate::draw;
use crate::flag;
use crate::variant;
pub fn progress() {
let philadelphia = variant::philadelphia();
let trans = flag::transgender();
}
// everything below this point is in alphabetical order
pub fn aroace() {
let aro = flag::aromantic();
let ace = flag::asexual();
}
pub fn demiromantic() {
let green = rgb(0x3DA542);
let gray = rgb(0xD2D2D2);
// WHITE×2 / green / gray×2 vert
// BLACK triangle cutin
}
pub fn demisexual() {
let purple = rgb(0x832FA8);
let grey = rgb(0x7B868C);
// WHITE×2 / green / grey×2 vert
// BLACK triangle cutin
}
pub fn intersex() -> Colors {
let yellow = rgb(0xFFDA00);
let purple = rgb(0x7A00AC);
let stripe = draw::BLOCK.repeat(9);
let part = draw::BLOCK.repeat(4);
println!(
"{yellow}{stripe}\n{part}{purple}{}O{}{yellow}{part}\n{stripe}{RESET}",
yellow.0.bg_string(),
RESET.0.bg_str()
);
exit(0);
}
pub fn polyamorous() {
let blue = rgb(0x019FE3);
let magenta = rgb(0xE50051);
let purple = rgb(0x340C46);
let yellow = rgb(0x00FCBF);
// blue / magenta / purple vert
// WHITE isosceles cutin with yellow heart pointed right
}

View file

@ -1,22 +1,20 @@
use std::{ use std::io::{ self, Write };
io,
io::Write
};
use termion::{ use termion::{
terminal_size, terminal_size,
clear, clear,
color::{ Fg, Rgb },
cursor, cursor,
input::TermRead, input::TermRead,
raw::IntoRawMode, raw::IntoRawMode
style
}; };
use crate::flag::BLOCK; use crate::color::{ RESET, Colors };
pub fn draw(colors: &[Fg<Rgb>]) { pub static BLOCK: &str = "";
pub static UHALF: &str = "";
pub fn full(colors: Colors) {
let mut stdout = io::stdout().into_raw_mode().unwrap(); let mut stdout = io::stdout().into_raw_mode().unwrap();
let stdin = io::stdin(); let stdin = io::stdin();
@ -28,7 +26,6 @@ pub fn draw(colors: &[Fg<Rgb>]) {
stdout.flush().ok(); stdout.flush().ok();
let stripe = BLOCK.repeat(width as usize); let stripe = BLOCK.repeat(width as usize);
let reset = style::Reset;
let mut index = 0; let mut index = 0;
for n in 0..(height as usize) { for n in 0..(height as usize) {
@ -38,7 +35,7 @@ pub fn draw(colors: &[Fg<Rgb>]) {
} }
write!( write!(
stdout, stdout,
"{color}{stripe}{reset}", "{color}{stripe}{RESET}",
color = colors[index] color = colors[index]
).ok(); ).ok();
} }
@ -49,4 +46,18 @@ pub fn draw(colors: &[Fg<Rgb>]) {
stdout.flush().ok(); stdout.flush().ok();
} }
pub fn small(colors: Colors) {
let mut stdout = io::stdout();
let count = colors.len();
let width = count * 3;
let stripe = BLOCK.repeat(width);
for color in colors {
println!("{color}{stripe}");
}
print!("{RESET}");
stdout.flush().ok();
}

View file

@ -1,196 +1,116 @@
use termion::color; use crate::color::*;
use crate::draw::draw; pub fn pride() -> Colors {
let red = rgb(0xE50000);
let orange = rgb(0xFF8D00);
let yellow = rgb(0xFFEE00);
let green = rgb(0x028121);
let blue = rgb(0x004CFF);
let purple = rgb(0x770088);
pub static BLOCK: &str = ""; vec![red, orange, yellow, green, blue, purple]
pub fn pride(small: bool) {
let red = color::Fg(color::Rgb(0xE5, 0x00, 0x00));
let orange = color::Fg(color::Rgb(0xFF, 0x8D, 0x00));
let yellow = color::Fg(color::Rgb(0xFF, 0xEE, 0x00));
let green = color::Fg(color::Rgb(0x02, 0x81, 0x21));
let blue = color::Fg(color::Rgb(0x00, 0x4C, 0xFF));
let purple = color::Fg(color::Rgb(0x77, 0x00, 0x88));
if small { // small flag: 18x6
let width = 18;
println!(
"{red}{stripe}\n{orange}{stripe}\n{yellow}{stripe}\n{green}{stripe}\n{blue}{stripe}\n{purple}{stripe}{reset}",
reset = color::Fg(color::Reset),
stripe = BLOCK.repeat(width)
);
} else { draw(&[red, orange, yellow, green, blue, purple]); }
} }
pub fn transgender(small: bool) { pub fn transgender() -> Colors {
let pink = color::Fg(color::Rgb(0x7A, 0xCB, 0xF5)); let pink = rgb(0x7ACBF5);
let blue = color::Fg(color::Rgb(0xEA, 0xAC, 0xB8)); let blue = rgb(0xEAACB8);
let white = color::Fg(color::Rgb(0xFF, 0xFF, 0xFF));
if small { vec![pink, blue, WHITE, blue, pink]
let width = 15;
println!(
"{pink}{stripe}\n{blue}{stripe}\n{white}{stripe}\n{blue}{stripe}\n{pink}{stripe}{reset}",
reset = color::Fg(color::Reset),
stripe = BLOCK.repeat(width)
);
} else { draw(&[pink, blue, white, blue, pink]); }
} }
// everything below here is alphabetical // everything below here is alphabetical
pub fn aromantic(small: bool) { pub fn agender() -> Colors {
let green = color::Fg(color::Rgb(0x3B, 0xA7, 0x40)); let gray = rgb(0xB9B9B9);
let lime = color::Fg(color::Rgb(0xA8, 0xD4, 0x7A)); let green = rgb(0xB8F483);
let white = color::Fg(color::Rgb(0xFF, 0xFF, 0xFF));
let grey = color::Fg(color::Rgb(0xAB, 0xAB, 0xAB));
let black = color::Fg(color::Rgb(0x00, 0x00, 0x00));
if small { vec![BLACK, gray, WHITE, green, WHITE, gray, BLACK]
let width = 15;
println!(
"{green}{stripe}\n{lime}{stripe}\n{white}{stripe}\n{grey}{stripe}\n{black}{stripe}{reset}",
reset = color::Fg(color::Reset),
stripe = BLOCK.repeat(width)
);
} else { draw(&[green, lime, white, grey, black]); }
} }
pub fn asexual(small: bool) { pub fn aromantic() -> Colors {
let black = color::Fg(color::Rgb(0x00, 0x00, 0x00)); let green = rgb(0x3BA740);
let grey = color::Fg(color::Rgb(0xA4, 0xA4, 0xA4)); let lime = rgb(0xA8D47A);
let white = color::Fg(color::Rgb(0xFF, 0xFF, 0xFF)); let grey = rgb(0xABABAB);
let purple = color::Fg(color::Rgb(0x81, 0x00, 0x81));
if small { vec![green, lime, WHITE, grey, BLACK]
let width = 12;
println!(
"{black}{stripe}\n{grey}{stripe}\n{white}{stripe}\n{purple}{stripe}{reset}",
reset = color::Fg(color::Reset),
stripe = BLOCK.repeat(width)
);
} else { draw(&[black, grey, white, purple]); }
} }
pub fn bigender(small: bool) { pub fn asexual() -> Colors {
let pink = color::Fg(color::Rgb(0xE6, 0x76, 0xA6)); let grey = rgb(0xA4A4A4);
let yellow = color::Fg(color::Rgb(0xF9, 0xF0, 0x4C)); let purple = rgb(0x810081);
let white = color::Fg(color::Rgb(0xFF, 0xFF, 0xFF));
let purple = color::Fg(color::Rgb(0xAB, 0x6B, 0xBB));
let blue = color::Fg(color::Rgb(0x6D, 0x96, 0xDC));
if small { vec![BLACK, grey, WHITE, purple]
let width = 15;
println!(
"{pink}{stripe}\n{yellow}{stripe}\n{white}{stripe}\n{purple}{stripe}\n{blue}{stripe}{reset}",
reset = color::Fg(color::Reset),
stripe = BLOCK.repeat(width)
);
} else { draw(&[pink, yellow, white, purple, blue]); }
} }
pub fn bisexual(small: bool) { pub fn bigender() -> Colors {
let magenta = color::Fg(color::Rgb(0xC4, 0x2A, 0x6F)); let pink = rgb(0xE676A6);
let purple = color::Fg(color::Rgb(0x91, 0x53, 0x92)); let yellow = rgb(0xF9F04C);
let blue = color::Fg(color::Rgb(0x14, 0x37, 0xA2)); let purple = rgb(0xAB6BBB);
let blue = rgb(0x6D96DC);
if small { vec![pink, yellow, WHITE, purple, blue]
let width = 15;
println!(
"{magenta}{stripe}\n{stripe}\n{purple}{stripe}\n{blue}{stripe}\n{stripe}{reset}",
reset = color::Fg(color::Reset),
stripe = BLOCK.repeat(width)
);
} else { draw(&[magenta, magenta, purple, blue, blue]); }
} }
pub fn gendervoid(small: bool) { pub fn bisexual() -> Colors {
let navy = color::Fg(color::Rgb(0x08, 0x11, 0x4A)); let magenta = rgb(0xC42A6F);
let gray = color::Fg(color::Rgb(0x4A, 0x48, 0x4B)); let purple = rgb(0x915392);
let black = color::Fg(color::Rgb(0x00, 0x00, 0x00)); let blue = rgb(0x1437A2);
if small { vec![magenta, magenta, purple, blue, blue]
let width = 15;
println!(
"{navy}{stripe}\n{gray}{stripe}\n{black}{stripe}\n{gray}{stripe}\n{navy}{stripe}{reset}",
reset = color::Fg(color::Reset),
stripe = BLOCK.repeat(width)
);
} else { draw(&[navy, gray, black, gray, navy]); }
} }
pub fn lesbian(small: bool) { pub fn genderfluid() -> Colors {
let red = color::Fg(color::Rgb(0xD6, 0x28, 0x00)); let pink = rgb(0xFF75A2);
let orange = color::Fg(color::Rgb(0xFF, 0x9B, 0x56)); let violet = rgb(0xBE18D6);
let white = color::Fg(color::Rgb(0xFF, 0xFF, 0xFF)); let blue = rgb(0x333EBD);
let pink = color::Fg(color::Rgb(0xD4, 0x62, 0xA6));
let magenta = color::Fg(color::Rgb(0xA4, 0x00, 0x62));
if small { vec![pink, WHITE, violet, BLACK, blue]
let width = 15;
println!(
"{red}{stripe}\n{orange}{stripe}\n{white}{stripe}\n{pink}{stripe}\n{magenta}{stripe}{reset}",
reset = color::Fg(color::Reset),
stripe = BLOCK.repeat(width)
);
} else { draw(&[red, orange, white, pink, magenta]); }
} }
pub fn multigender(small: bool) { pub fn genderqueer() -> Colors {
let blue = color::Fg(color::Rgb(0x3F, 0x47, 0xCC)); let purple = rgb(0xB899DF);
let ltblue = color::Fg(color::Rgb(0x01, 0xA4, 0xE9)); let green = rgb(0x6B8E3B);
let orange = color::Fg(color::Rgb(0xFB, 0x7F, 0x27));
if small { vec![purple, WHITE, green]
let width = 15;
println!(
"{blue}{stripe}\n{ltblue}{stripe}\n{orange}{stripe}\n{ltblue}{stripe}\n{blue}{stripe}{reset}",
reset = color::Fg(color::Reset),
stripe = BLOCK.repeat(width)
);
} else { draw(&[blue, ltblue, orange, ltblue, blue]); }
} }
pub fn nonbinary(small: bool) { pub fn gendervoid() -> Colors {
let yellow = color::Fg(color::Rgb(0xFF, 0xF4, 0x33)); let navy = rgb(0x08114A);
let white = color::Fg(color::Rgb(0xFF, 0xFF, 0xFF)); let gray = rgb(0x4A484B);
let purple = color::Fg(color::Rgb(0x9B, 0x59, 0xD0));
let black = color::Fg(color::Rgb(0x00, 0x00, 0x00));
if small { vec![navy, gray, BLACK, gray, navy]
let width = 12;
println!(
"{yellow}{stripe}\n{white}{stripe}\n{purple}{stripe}\n{black}{stripe}{reset}",
reset = color::Fg(color::Reset),
stripe = BLOCK.repeat(width)
);
} else { draw(&[yellow, white, purple, black]); }
} }
pub fn pansexual(small: bool) { pub fn lesbian() -> Colors {
let magenta = color::Fg(color::Rgb(0xFF, 0x1B, 0x8D)); let red = rgb(0xD62800);
let yellow = color::Fg(color::Rgb(0xFF, 0xDA, 0x00)); let orange = rgb(0xFF9B56);
let cyan = color::Fg(color::Rgb(0x1B, 0xB3, 0xFF)); let pink = rgb(0xD462A6);
let magenta = rgb(0xA40062);
if small { vec![red, orange, WHITE, pink, magenta]
let width = 18; }
println!( pub fn multigender() -> Colors {
"{magenta}{stripe}\n{stripe}\n{yellow}{stripe}\n{stripe}\n{cyan}{stripe}\n{stripe}{reset}", let blue = rgb(0x3F47CC);
reset = color::Fg(color::Reset), let ltblue = rgb(0x01A4E9);
stripe = BLOCK.repeat(width) let orange = rgb(0xFB7F27);
);
} else { draw(&[magenta, yellow, cyan]); } vec![blue, ltblue, orange, ltblue, blue]
}
pub fn nonbinary() -> Colors {
let yellow = rgb(0xFFF433);
let purple = rgb(0x9B59D0);
vec![yellow, WHITE, purple, BLACK]
}
pub fn pansexual() -> Colors {
let magenta = rgb(0xFF1B8D);
let yellow = rgb(0xFFDA00);
let cyan = rgb(0x1BB3FF);
vec![magenta, yellow, cyan]
} }

View file

@ -2,65 +2,123 @@ use std::process::exit;
use pico_args::Arguments; use pico_args::Arguments;
mod color;
mod complex;
mod draw; mod draw;
mod flag; mod flag;
mod variant;
use crate::color::Colors;
static VERSION: &str = env!("CARGO_PKG_VERSION");
fn main() { fn main() {
let mut args = Arguments::from_env(); let mut args = Arguments::from_env();
let help = args.contains(["-h", "--help"]); // handle help flag
if help { if args.contains(["-h", "--help"]) {
help_text(); help_text();
return; return;
} }
let list = args.contains(["-l", "--list"]); // handle list flag
if list { if args.contains(["-l", "--list"]) {
list_text(); list_text();
return; return;
} }
// handle version flag
if args.contains("--version") {
println!("pride v{VERSION}");
return;
}
// get small flag
let small = args.contains(["-s", "--small"]); let small = args.contains(["-s", "--small"]);
let subcommand = args.subcommand().unwrap(); let subcommand = args.subcommand().unwrap();
match subcommand.as_deref() { let colors: Colors = match subcommand.as_deref() {
Some("pride") | Some("pride" | "gay")
Some("gay") => flag::pride(small), => {
let variant = args.subcommand().unwrap_or(None);
match variant.as_deref() {
Some("8-color" | "gilbert-baker" | "sex-and-magic")
=> variant::gilbert_baker(),
Some("philadelphia")
=> variant::philadelphia(),
// Some("progress")
// => complex::progress(),
_
=> flag::pride()
}
},
Some("trans") | Some("transgender" | "trans")
Some("transgender") => flag::transgender(small), => flag::transgender(),
Some("aro") | Some("agender")
Some("aromantic") => flag::aromantic(small), => flag::agender(),
Some("ace") | Some("aromantic" | "aro")
Some("asexual") => flag::asexual(small), => flag::aromantic(),
Some("bigender") => flag::bigender(small), Some("asexual" | "ace")
=> flag::asexual(),
Some("bi") | // Some("aroace" | "aromantic-asexual")
Some("bisexual") => flag::bisexual(small), // => complex::aroace(),
Some("gendervoid") => flag::gendervoid(small), Some("bigender")
=> flag::bigender(),
Some("lesbian") => flag::lesbian(small), Some("bisexual" | "bi")
=> flag::bisexual(),
Some("multigender") => flag::multigender(small), // Some("demiromantic")
// => flag::demiromantic(),
Some("nb") | // Some("demisexual")
Some("nonbinary") => flag::nonbinary(small), // => flag::demisexual(),
Some("pan") | Some("genderfluid")
Some("pansexual") => flag::pansexual(small), => flag::genderfluid(),
Some("genderqueer")
=> flag::genderqueer(),
Some("gendervoid")
=> flag::gendervoid(),
Some("intersex")
=> complex::intersex(),
Some("lesbian")
=> flag::lesbian(),
Some("multigender")
=> flag::multigender(),
Some("nonbinary" | "nb")
=> flag::nonbinary(),
Some("pansexual" | "pan")
=> flag::pansexual(),
// Some("poly" | "polyamorous" | "polyamory")
// => complex::polyamorous(),
_ => { help_text(); exit(1) } _ => { help_text(); exit(1) }
} };
if small { draw::small(colors); }
else { draw::full(colors); }
} }
fn help_text() { fn help_text() {
println!("pride v{}", env!("CARGO_PKG_VERSION")); println!("pride v{VERSION}");
println!("Valerie Wolfe <sleeplessval@gmail.com>"); println!("Valerie Wolfe <sleeplessval@gmail.com>");
println!("Show pride flags in the terminal.\n"); println!("Show pride flags in the terminal.\n");
@ -71,6 +129,7 @@ fn help_text() {
println!("flags:"); println!("flags:");
println!(" -h, --help Shows this help text"); println!(" -h, --help Shows this help text");
println!(" --version Show version information");
println!(" -l, --list Prints a list of printable flags"); println!(" -l, --list Prints a list of printable flags");
println!(" -s, --small Prints a small version without holding"); println!(" -s, --small Prints a small version without holding");
@ -81,17 +140,24 @@ fn help_text() {
fn list_text() { fn list_text() {
println!("pride v{}", env!("CARGO_PKG_VERSION")); println!("pride v{}", env!("CARGO_PKG_VERSION"));
println!("\nFlag list:"); println!("\nFlag list:");
println!(" agender agender pride flag");
println!(" aro, aromantic aromantic pride flag"); println!(" aro, aromantic aromantic pride flag");
println!(" ace, asexual asexual pride flag"); println!(" ace, asexual asexual pride flag");
// println!(" aroace aromantic/asexual pride flag");
println!(" bigender bigender pride flag"); println!(" bigender bigender pride flag");
println!(" bi, bisexual bisexual pride flag"); println!(" bi, bisexual bisexual pride flag");
// println!(" demiromantic demiromantic pride flag");
// println!(" demisexual demisexual pride flag");
println!(" gay, pride six-color rainbow flag"); println!(" gay, pride six-color rainbow flag");
println!(" genderfluid genderfluid pride flag");
println!(" genderqueer genderqueer pride flag");
println!(" gendervoid gendervoid pride flag"); println!(" gendervoid gendervoid pride flag");
// println!(" intersex intersex pride flag");
println!(" lesbian lesbian pride flag"); println!(" lesbian lesbian pride flag");
println!(" multigender multigender pride flag"); println!(" multigender multigender pride flag");
println!(" nb, nonbinary nonbinary pride flag"); println!(" nb, nonbinary nonbinary pride flag");
println!(" pan, pansexual pansexual pride flag"); println!(" pan, pansexual pansexual pride flag");
// println!(" progress progress arrow flag"); // println!(" poly, polyamorous polyamorous pride flag");
println!(" trans, transgender transgender pride flag"); println!(" trans, transgender transgender pride flag");
} }

29
src/variant.rs Normal file
View file

@ -0,0 +1,29 @@
use crate::{
color::*,
flag
};
pub fn gilbert_baker() -> Colors {
let pink = rgb(0xFF69B4); // sex
let red = rgb(0xFF0000); // life
let orange = rgb(0xFF8F00); // healing
let yellow = rgb(0xFFFF00); // sunlight
let green = rgb(0x008F00); // nature
let cyan = rgb(0x00C0C0); // magic
let indigo = rgb(0x3E0099); // serenity
let purple = rgb(0x8F008F); // spirit
vec![pink, red, orange, yellow, green, cyan, indigo, purple]
}
pub fn philadelphia() -> Colors {
let brown = rgb(0x784F17);
let mut output = flag::pride();
output.insert(0, BLACK);
output.insert(1, brown);
output
}