Compare commits
No commits in common. "main" and "variant" have entirely different histories.
17 changed files with 157 additions and 1479 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,2 @@
|
|||
Cargo.lock
|
||||
/target
|
||||
/packages
|
||||
|
|
21
Cargo.toml
21
Cargo.toml
|
@ -1,26 +1,13 @@
|
|||
[package]
|
||||
name = "pride"
|
||||
version = "0.4.2"
|
||||
version = "0.1.2"
|
||||
edition = "2021"
|
||||
authors = [ "Valerie Wolfe <sleeplessval@gmail.com>" ]
|
||||
description = "Pride flags in the terminal."
|
||||
homepage = "https://git.vwolfe.io/valerie/pride"
|
||||
repository = "https://git.vwolfe.io/valerie/pride"
|
||||
license = "MIT"
|
||||
categories = [ "command-line-utilities" ]
|
||||
keywords = [ "lgbt", "pride", "cli" ]
|
||||
|
||||
[package.metadata.aur]
|
||||
name = "pride"
|
||||
source = "archive/v$pkgver.tar.gz"
|
||||
|
||||
[[bin]]
|
||||
name = "pride"
|
||||
path = "src/main.rs"
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
pico-args = "0.5.0"
|
||||
termion = "4.0.3"
|
||||
termion = "2.0.1"
|
||||
|
||||
[profile.release]
|
||||
opt-level = 's'
|
||||
|
@ -28,5 +15,5 @@ codegen-units = 1
|
|||
debug = false
|
||||
lto = true
|
||||
panic = "abort"
|
||||
strip = "symbols"
|
||||
strip = "debuginfo"
|
||||
|
||||
|
|
19
LICENSE
19
LICENSE
|
@ -1,19 +0,0 @@
|
|||
Copyright (c) 2024 Valerie Wolfe
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
59
README.md
59
README.md
|
@ -3,58 +3,15 @@
|
|||
|
||||
A Rust utility to display pride flags in the terminal.
|
||||
|
||||
A list of currently implemented flags is available on the [project wiki](https://git.vwolfe.io/valerie/pride/wiki/Flags).
|
||||
**This project is under heavy construction! It is subject to major structural and
|
||||
architectural changes. There are no issues with functionality, but I will continue
|
||||
to make major changes and refactors until the main roadmap is complete.**
|
||||
|
||||
## Dependencies
|
||||
Currently supports a variety of stripe flags.
|
||||
|
||||
Some Complex renderers utilize [Powerline's](https://github.com/ryanoasis/powerline-extra-symbols)
|
||||
slant symbols, and therefore require use of a Powerline font, such as [Fira Code](https://github.com/tonsky/FiraCode).
|
||||
## Variant Flag Branch
|
||||
|
||||
## Installation
|
||||
|
||||
### Manual Install
|
||||
|
||||
<details>
|
||||
<summary>Release Binary</summary>
|
||||
Copy the compiled binary from the <a href="https://git.vwolfe.io/valerie/pride/releases/">releases page</a>
|
||||
to a directory in <code>$PATH</code>, such as <code>/usr/bin/</code>.
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Compile from Source</summary>
|
||||
Compile using cargo with the command <code>cargo build --release</code> and
|
||||
copy the file from <code>target/release/</code> to a directory in
|
||||
<code>$PATH</code>, such as <code>/usr/bin/</code>.
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>makepkg (AUR)</summary>
|
||||
Clone the <a href="https://aur.archlinux.org/pride.git">AUR Repository</a> and
|
||||
run the command <code>makepkg --install</code>.
|
||||
</details>
|
||||
|
||||
### Package Managers
|
||||
|
||||
<details>
|
||||
<summary>Arch Linux (AUR): <code>pride</code></summary>
|
||||
Install the package from the <a href="https://aur.archlinux.org/packages/pride"><code>pride</code> AUR Package</a>
|
||||
using an AUR package manager such as <a href="https://github.com/Morganamilo/paru"><code>paru</code></a>.
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Cargo: <code>pride-term</code></summary>
|
||||
Install the package using Cargo with the command <code>cargo install pride-term</code>.
|
||||
</details>
|
||||
|
||||
### Man Page
|
||||
|
||||
<details>
|
||||
<summary>Section 6</summary>
|
||||
Copy <code>man/pride.6</code> into <code>/usr/share/man/man6/</code>.
|
||||
</details>
|
||||
|
||||
## Libraries
|
||||
|
||||
- [pico-args](https://crates.io/crates/pico-args) — argument parsing
|
||||
- [termion](https://crates.io/crates/termion) — ANSI formatting
|
||||
This branch adds flag variants. Currently, it adds two for the rainbow pride flag:
|
||||
- Gilbert Baker/Sex and Magic: original 1978 eight-color rainbow flag
|
||||
- Philadelphia: 2017 rainbow flag with black and brown stripes
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[licenses]
|
||||
allow = [ "MIT" ]
|
||||
|
||||
|
113
man/pride.6
113
man/pride.6
|
@ -1,113 +0,0 @@
|
|||
.Dd $Mdocdate$
|
||||
.Dt PRIDE 6
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm pride
|
||||
.Nd shows pride flags in the terminal
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl hlv
|
||||
.Op Fl s Op Ar size
|
||||
.Op Ar flag
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
displays pride flags in the terminal using ANSI truecolor sequences.
|
||||
.Ss OPTIONS
|
||||
.Bl -tag -width Ds
|
||||
.It Fl h , Fl -help
|
||||
Shows a brief help text.
|
||||
.It Fl l , Fl -list
|
||||
Shows a list of available pride flags.
|
||||
.It Fl s , Fl -size Op Ar size
|
||||
Scales the flag to the given size: no value or 'small' will produce the minimum size; one number sets the width; and two numbers separated by 'x' sets width and height respectively.
|
||||
.It Fl v , Fl -version
|
||||
Shows version information.
|
||||
.It Ar flag
|
||||
The name of the flag to display. Defaults to 'rainbow'.
|
||||
.El
|
||||
.Sh FLAGS
|
||||
.Bl -tag -width Ds
|
||||
.It Ic agender
|
||||
.It Ic aromantic, aro
|
||||
.It Ic aroace, aromantic-asexual
|
||||
The aromantic-asexual pride flag by @aroaesflags@tumblr.com.
|
||||
.Pp
|
||||
VARIANTS
|
||||
.Bl -tag -width Ds -compact
|
||||
.It Ic halves, side-by-side, sbs
|
||||
.El
|
||||
.It Ic bigender
|
||||
.It Ic bisexual, bi
|
||||
The bisexual pride flag designed by Michael Page in 1998.
|
||||
.It Ic demiboy
|
||||
.It Ic demigender
|
||||
.It Ic demigirl
|
||||
.It Ic demiromantic
|
||||
.It Ic demisexual
|
||||
.It Ic gay, mlm
|
||||
The gay men pride flag designed by @gayflagblog@tumblr.com in 2019.
|
||||
.It Ic genderfluid
|
||||
.It Ic gender-nonconforming, gendernonconforming, gnc
|
||||
.It Ic genderqueer
|
||||
.It Ic gendervoid
|
||||
.It Ic lesbian, wlw
|
||||
The 5-stripe lesbian pride flag designed by Emily Gwen in 2018.
|
||||
.Pp
|
||||
VARIANTS
|
||||
.Bl -tag -width Ds -compact
|
||||
.It Ic 7, 7-color, 7-stripe
|
||||
The 7-stripe lesbian pride flag designed by Emily Gwen in 2018.
|
||||
.El
|
||||
.It Ic multisexual, m-spec, mspec
|
||||
.It Ic multigender
|
||||
.It Ic neutrois
|
||||
.It Ic nonbinary, nb
|
||||
The nonbinary pride flag designed by Kyle Rowan in 2014.
|
||||
.It Ic pansexual, pan
|
||||
The pansexual pride flag designed by Jasper V circa 2010.
|
||||
.It Ic polysexual
|
||||
.It Ic progress
|
||||
The progress rainbow pride flag designed by Daniel Quasar in 2018.
|
||||
.It Ic rainbow, pride
|
||||
The 1979 6-stripe revision of Gilbert Baker's rainbow pride flag.
|
||||
.Pp
|
||||
VARIANTS
|
||||
.Bl -tag -width Ds -compact
|
||||
.It Ic 8-color, gilbert-baker, sex-and-magic
|
||||
Gilbert Baker's original 8-stripe rainbow pride flag from 1978.
|
||||
.It Ic philadelphia
|
||||
The rainbow flag designed for 2017 Philadelphia Pride.
|
||||
.It Ic progress
|
||||
.El
|
||||
.It Ic transgender, trans
|
||||
The transgender pride flag designed by Monica Helms in 1999.
|
||||
.El
|
||||
.Sh ENVIRONMENT
|
||||
.Bl -tag -width Ds
|
||||
.It PRIDE_DEFAULT
|
||||
A string containing the name of a flag to use as the default when no
|
||||
.Ar flag
|
||||
argument is provided.
|
||||
.El
|
||||
.Sh EXIT STATUS
|
||||
.Bl -tag -width Ds
|
||||
.It 1
|
||||
Unmatched
|
||||
.Ar flag
|
||||
name.
|
||||
.It 2
|
||||
Failed to parse
|
||||
.Ar size .
|
||||
.It 3
|
||||
The provided
|
||||
.Ar size
|
||||
is too small to render.
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
Create a full-width banner flag using tput:
|
||||
.Pp
|
||||
.Dl $ pride -s `tput cols`
|
||||
.Pp
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
.An Valerie Wolfe Aq Mt sleeplessval@gmail.com
|
239
sbom.xml
239
sbom.xml
|
@ -1,239 +0,0 @@
|
|||
{
|
||||
"SPDXID": "SPDXRef-DOCUMENT",
|
||||
"creationInfo": {
|
||||
"created": "2024-07-05T20:16:51.403Z",
|
||||
"creators": [
|
||||
"Tool: cargo-sbom-v0.8.4"
|
||||
]
|
||||
},
|
||||
"dataLicense": "CC0-1.0",
|
||||
"documentNamespace": "https://spdx.org/spdxdocs/pride-6150510e-b518-43f0-aa53-3e2795909cc2",
|
||||
"files": [
|
||||
{
|
||||
"SPDXID": "SPDXRef-File-pride",
|
||||
"checksums": [],
|
||||
"fileName": "pride",
|
||||
"fileTypes": [
|
||||
"BINARY"
|
||||
]
|
||||
}
|
||||
],
|
||||
"name": "pride",
|
||||
"packages": [
|
||||
{
|
||||
"SPDXID": "SPDXRef-Package-redox_syscall-0.4.1",
|
||||
"description": "A Rust library to access raw Redox system calls",
|
||||
"downloadLocation": "registry+https://github.com/rust-lang/crates.io-index",
|
||||
"externalRefs": [
|
||||
{
|
||||
"referenceCategory": "PACKAGE-MANAGER",
|
||||
"referenceLocator": "pkg:cargo/redox_syscall@0.4.1",
|
||||
"referenceType": "purl"
|
||||
}
|
||||
],
|
||||
"licenseConcluded": "MIT",
|
||||
"licenseDeclared": "MIT",
|
||||
"name": "redox_syscall",
|
||||
"versionInfo": "0.4.1"
|
||||
},
|
||||
{
|
||||
"SPDXID": "SPDXRef-Package-libredox-0.0.2",
|
||||
"description": "Redox stable ABI",
|
||||
"downloadLocation": "registry+https://github.com/rust-lang/crates.io-index",
|
||||
"externalRefs": [
|
||||
{
|
||||
"referenceCategory": "PACKAGE-MANAGER",
|
||||
"referenceLocator": "pkg:cargo/libredox@0.0.2",
|
||||
"referenceType": "purl"
|
||||
}
|
||||
],
|
||||
"licenseConcluded": "MIT",
|
||||
"licenseDeclared": "MIT",
|
||||
"name": "libredox",
|
||||
"versionInfo": "0.0.2"
|
||||
},
|
||||
{
|
||||
"SPDXID": "SPDXRef-Package-libc-0.2.155",
|
||||
"description": "Raw FFI bindings to platform libraries like libc.\n",
|
||||
"downloadLocation": "registry+https://github.com/rust-lang/crates.io-index",
|
||||
"externalRefs": [
|
||||
{
|
||||
"referenceCategory": "PACKAGE-MANAGER",
|
||||
"referenceLocator": "pkg:cargo/libc@0.2.155",
|
||||
"referenceType": "purl"
|
||||
}
|
||||
],
|
||||
"homepage": "https://github.com/rust-lang/libc",
|
||||
"licenseConcluded": "MIT OR Apache-2.0",
|
||||
"licenseDeclared": "MIT OR Apache-2.0",
|
||||
"name": "libc",
|
||||
"versionInfo": "0.2.155"
|
||||
},
|
||||
{
|
||||
"SPDXID": "SPDXRef-Package-bitflags-1.3.2",
|
||||
"description": "A macro to generate structures which behave like bitflags.\n",
|
||||
"downloadLocation": "registry+https://github.com/rust-lang/crates.io-index",
|
||||
"externalRefs": [
|
||||
{
|
||||
"referenceCategory": "PACKAGE-MANAGER",
|
||||
"referenceLocator": "pkg:cargo/bitflags@1.3.2",
|
||||
"referenceType": "purl"
|
||||
}
|
||||
],
|
||||
"homepage": "https://github.com/bitflags/bitflags",
|
||||
"licenseConcluded": "MIT OR Apache-2.0",
|
||||
"licenseDeclared": "MIT/Apache-2.0",
|
||||
"name": "bitflags",
|
||||
"versionInfo": "1.3.2"
|
||||
},
|
||||
{
|
||||
"SPDXID": "SPDXRef-Package-redox_termios-0.1.3",
|
||||
"description": "A Rust library to access Redox termios functions",
|
||||
"downloadLocation": "registry+https://github.com/rust-lang/crates.io-index",
|
||||
"externalRefs": [
|
||||
{
|
||||
"referenceCategory": "PACKAGE-MANAGER",
|
||||
"referenceLocator": "pkg:cargo/redox_termios@0.1.3",
|
||||
"referenceType": "purl"
|
||||
}
|
||||
],
|
||||
"licenseConcluded": "MIT",
|
||||
"licenseDeclared": "MIT",
|
||||
"name": "redox_termios",
|
||||
"versionInfo": "0.1.3"
|
||||
},
|
||||
{
|
||||
"SPDXID": "SPDXRef-Package-numtoa-0.1.0",
|
||||
"description": "Convert numbers into stack-allocated byte arrays",
|
||||
"downloadLocation": "registry+https://github.com/rust-lang/crates.io-index",
|
||||
"externalRefs": [
|
||||
{
|
||||
"referenceCategory": "PACKAGE-MANAGER",
|
||||
"referenceLocator": "pkg:cargo/numtoa@0.1.0",
|
||||
"referenceType": "purl"
|
||||
}
|
||||
],
|
||||
"licenseConcluded": "MIT OR Apache-2.0",
|
||||
"licenseDeclared": "MIT OR Apache-2.0",
|
||||
"name": "numtoa",
|
||||
"versionInfo": "0.1.0"
|
||||
},
|
||||
{
|
||||
"SPDXID": "SPDXRef-Package-termion-3.0.0",
|
||||
"description": "A bindless library for manipulating terminals.",
|
||||
"downloadLocation": "registry+https://github.com/rust-lang/crates.io-index",
|
||||
"externalRefs": [
|
||||
{
|
||||
"referenceCategory": "PACKAGE-MANAGER",
|
||||
"referenceLocator": "pkg:cargo/termion@3.0.0",
|
||||
"referenceType": "purl"
|
||||
}
|
||||
],
|
||||
"licenseConcluded": "MIT",
|
||||
"licenseDeclared": "MIT",
|
||||
"name": "termion",
|
||||
"versionInfo": "3.0.0"
|
||||
},
|
||||
{
|
||||
"SPDXID": "SPDXRef-Package-bitflags-2.5.0",
|
||||
"description": "A macro to generate structures which behave like bitflags.\n",
|
||||
"downloadLocation": "registry+https://github.com/rust-lang/crates.io-index",
|
||||
"externalRefs": [
|
||||
{
|
||||
"referenceCategory": "PACKAGE-MANAGER",
|
||||
"referenceLocator": "pkg:cargo/bitflags@2.5.0",
|
||||
"referenceType": "purl"
|
||||
}
|
||||
],
|
||||
"homepage": "https://github.com/bitflags/bitflags",
|
||||
"licenseConcluded": "MIT OR Apache-2.0",
|
||||
"licenseDeclared": "MIT OR Apache-2.0",
|
||||
"name": "bitflags",
|
||||
"versionInfo": "2.5.0"
|
||||
},
|
||||
{
|
||||
"SPDXID": "SPDXRef-Package-pride-0.4.1",
|
||||
"description": "Pride flags in the terminal.",
|
||||
"downloadLocation": "NONE",
|
||||
"homepage": "https://git.vwolfe.io/valerie/pride",
|
||||
"licenseConcluded": "MIT",
|
||||
"licenseDeclared": "MIT",
|
||||
"name": "pride",
|
||||
"versionInfo": "0.4.1"
|
||||
},
|
||||
{
|
||||
"SPDXID": "SPDXRef-Package-pico-args-0.5.0",
|
||||
"description": "An ultra simple CLI arguments parser.",
|
||||
"downloadLocation": "registry+https://github.com/rust-lang/crates.io-index",
|
||||
"externalRefs": [
|
||||
{
|
||||
"referenceCategory": "PACKAGE-MANAGER",
|
||||
"referenceLocator": "pkg:cargo/pico-args@0.5.0",
|
||||
"referenceType": "purl"
|
||||
}
|
||||
],
|
||||
"licenseConcluded": "MIT",
|
||||
"licenseDeclared": "MIT",
|
||||
"name": "pico-args",
|
||||
"versionInfo": "0.5.0"
|
||||
}
|
||||
],
|
||||
"relationships": [
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-numtoa-0.1.0",
|
||||
"relationshipType": "DEPENDS_ON",
|
||||
"spdxElementId": "SPDXRef-Package-termion-3.0.0"
|
||||
},
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-pico-args-0.5.0",
|
||||
"relationshipType": "DEPENDS_ON",
|
||||
"spdxElementId": "SPDXRef-Package-pride-0.4.1"
|
||||
},
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-libc-0.2.155",
|
||||
"relationshipType": "DEPENDS_ON",
|
||||
"spdxElementId": "SPDXRef-Package-termion-3.0.0"
|
||||
},
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-termion-3.0.0",
|
||||
"relationshipType": "DEPENDS_ON",
|
||||
"spdxElementId": "SPDXRef-Package-pride-0.4.1"
|
||||
},
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-bitflags-1.3.2",
|
||||
"relationshipType": "DEPENDS_ON",
|
||||
"spdxElementId": "SPDXRef-Package-redox_syscall-0.4.1"
|
||||
},
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-pride-0.4.1",
|
||||
"relationshipType": "GENERATED_FROM",
|
||||
"spdxElementId": "SPDXRef-File-pride"
|
||||
},
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-libredox-0.0.2",
|
||||
"relationshipType": "DEPENDS_ON",
|
||||
"spdxElementId": "SPDXRef-Package-termion-3.0.0"
|
||||
},
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-redox_syscall-0.4.1",
|
||||
"relationshipType": "DEPENDS_ON",
|
||||
"spdxElementId": "SPDXRef-Package-libredox-0.0.2"
|
||||
},
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-redox_termios-0.1.3",
|
||||
"relationshipType": "DEPENDS_ON",
|
||||
"spdxElementId": "SPDXRef-Package-termion-3.0.0"
|
||||
},
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-libc-0.2.155",
|
||||
"relationshipType": "DEPENDS_ON",
|
||||
"spdxElementId": "SPDXRef-Package-libredox-0.0.2"
|
||||
},
|
||||
{
|
||||
"relatedSpdxElement": "SPDXRef-Package-bitflags-2.5.0",
|
||||
"relationshipType": "DEPENDS_ON",
|
||||
"spdxElementId": "SPDXRef-Package-libredox-0.0.2"
|
||||
}
|
||||
],
|
||||
"spdxVersion": "SPDX-2.3"
|
||||
}
|
13
src/color.rs
13
src/color.rs
|
@ -1,6 +1,5 @@
|
|||
//! utility types and functions for color operations
|
||||
|
||||
use termion::color::{ Bg, Fg, Rgb, Reset };
|
||||
use termion::color::{ Fg, Rgb, Reset };
|
||||
|
||||
pub type Color = Fg<Rgb>;
|
||||
pub type Colors = Vec<Fg<Rgb>>;
|
||||
|
@ -9,20 +8,10 @@ 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 static RESET_BG: Bg<Reset> = Bg(Reset);
|
||||
|
||||
/// produces a termion foreground color from the provided integer
|
||||
pub fn rgb(hex: u32) -> Color {
|
||||
// colors should be 0xrrggbb = 0x__rrggbb; drop the most significant byte
|
||||
let [_, r, g, b] = hex.to_be_bytes();
|
||||
|
||||
Fg(Rgb(r, g, b))
|
||||
}
|
||||
|
||||
/// produces a termion background color from the provided integer
|
||||
pub fn bg(hex: u32) -> Bg<Rgb> {
|
||||
let [_, r, g, b] = hex.to_be_bytes();
|
||||
|
||||
Bg(Rgb(r, g, b))
|
||||
}
|
||||
|
||||
|
|
331
src/complex.rs
331
src/complex.rs
|
@ -1,331 +0,0 @@
|
|||
//! flags that require more complex rendering than just scaling colored stripes
|
||||
|
||||
use termion::color::{ Bg, Rgb };
|
||||
|
||||
use crate::{
|
||||
color::*,
|
||||
draw,
|
||||
error,
|
||||
flag::{ self, Flag },
|
||||
state::State,
|
||||
util::{ ansi_len, ansi_substr }
|
||||
};
|
||||
|
||||
/// vertically stacking eighths
|
||||
pub static V_EIGHTH: [char; 7] = ['▁', '▂', '▃', '▄', '▅', '▆', '▇'];
|
||||
/// horizontally stacking eighths
|
||||
pub static H_EIGHTH: [char; 7] = ['▏', '▎', '▍', '▌', '▋', '▊', '▉'];
|
||||
|
||||
/// shading by intensity
|
||||
pub static SHADING: [char; 3] = ['░', '▒', '▓'];
|
||||
|
||||
/// 2/1 slope triangle cut in
|
||||
pub static TRIANGLE_21: [char; 3] = ['', '🭬', ''];
|
||||
|
||||
/// 2/3 slope slant
|
||||
pub static SLANT_23: [char; 2] = ['🭒', '🭏'];
|
||||
|
||||
pub fn progress(state: &State) -> Flag {
|
||||
let red = bg(0xE50000);
|
||||
let orange = bg(0xFF8D00);
|
||||
let yellow = bg(0xFFEE00);
|
||||
let green = bg(0x028121);
|
||||
let blue = bg(0x004CFF);
|
||||
let purple = bg(0x770088);
|
||||
|
||||
// we need these colors in both fg & bg; just hold the integers for now
|
||||
let black: u32 = 0;
|
||||
let brown: u32 = 0x784F17;
|
||||
let ltblue: u32 = 0xEAACB8;
|
||||
let pink: u32 = 0x7ACBF5;
|
||||
let white: u32 = 0xFFFFFF;
|
||||
|
||||
let (width, height) = state.size.get(18, 6);
|
||||
if height < 6 || width < 6 { error::too_small(width, height); }
|
||||
|
||||
// create color slices and line buffer
|
||||
let stripes = [red, orange, yellow, green, blue, purple];
|
||||
let chevrons = [white, ltblue, pink, brown, black];
|
||||
let mut lines: Vec<String> = Vec::new();
|
||||
|
||||
// set up stripe index
|
||||
let mut index = 0;
|
||||
|
||||
// set up constraints
|
||||
let linecount = height - (height % 6); // largest multiple of 6 smaller than height
|
||||
let full_depth = width / 3;
|
||||
let chevron_width = if full_depth > 6 { (full_depth / 6) - 1 } else { 0 };
|
||||
let direction_thresh = linecount / 2;
|
||||
let corner = linecount % 2 == 1;
|
||||
|
||||
let thresh = linecount / 6; // stripe threshold; no bg_stripes call!
|
||||
let mut line_no = 0; // absolute line number; n is relative
|
||||
|
||||
// chevron helper
|
||||
let build_chevron = | separator: char | -> String {
|
||||
let mut output = format!(
|
||||
"{fg}{bg}{stripe}{separator}",
|
||||
fg = rgb(chevrons[0]),
|
||||
bg = bg(chevrons[1]),
|
||||
stripe = draw::BLOCK.repeat( usize::max(chevron_width as usize * 2, 1) )
|
||||
);
|
||||
let stripe = draw::BLOCK.repeat(chevron_width as usize);
|
||||
for i in 1..4 {
|
||||
output += &format!(
|
||||
"{fg}{bg}{stripe}{separator}",
|
||||
fg = rgb(chevrons[i]),
|
||||
bg = bg(chevrons[i + 1])
|
||||
);
|
||||
}
|
||||
output += &format!(
|
||||
"{fg}{stripe}",
|
||||
fg = rgb(chevrons[4])
|
||||
);
|
||||
|
||||
output
|
||||
};
|
||||
|
||||
// piecewise functions: ascent -> peak -> descent
|
||||
let mut base = build_chevron(TRIANGLE_21[0]);
|
||||
let base_length = base.len();
|
||||
let display_length = ansi_len(&base) + 1; // chevron width will always stay the same; add 1 for the last separator
|
||||
for n in 0..direction_thresh {
|
||||
// advance stripe color at stripe threshold by line number
|
||||
if line_no != 0 && line_no % thresh == 0 { index += 1; }
|
||||
|
||||
// grab our substring constraints
|
||||
let start = (direction_thresh - n) as usize - 1;
|
||||
let diff = if display_length >= start { display_length - start } else { 0 };
|
||||
|
||||
// take substring of chevron line...
|
||||
let mut line = ansi_substr(&base, start as usize, base_length);
|
||||
line += &stripes[index].to_string();
|
||||
if diff > 0 { line.push(TRIANGLE_21[0]); }
|
||||
// ... and add the colored stripe
|
||||
line += &" ".repeat(width as usize - diff);
|
||||
|
||||
lines.push(line);
|
||||
line_no += 1;
|
||||
}
|
||||
if corner {
|
||||
if line_no % thresh == 0 { index += 1; }
|
||||
|
||||
let base = build_chevron(TRIANGLE_21[1]);
|
||||
let mut line = ansi_substr(&base, 0, base_length);
|
||||
line += &format!(
|
||||
"{stripe}{separator}{line}",
|
||||
stripe = stripes[index],
|
||||
separator = TRIANGLE_21[1],
|
||||
line = " ".repeat(width as usize - display_length)
|
||||
);
|
||||
|
||||
lines.push(line);
|
||||
line_no += 1;
|
||||
}
|
||||
base = build_chevron(TRIANGLE_21[2]);
|
||||
for n in 0..direction_thresh {
|
||||
if line_no % thresh == 0 { index += 1; }
|
||||
if index > 5 { break; }
|
||||
|
||||
let start = n as usize;
|
||||
let diff = if display_length >= start { display_length - start } else { 0 };
|
||||
|
||||
let mut line = ansi_substr(&base, start, base_length);
|
||||
line += &stripes[index].to_string();
|
||||
if diff > 0 { line.push(TRIANGLE_21[2]); }
|
||||
line += &" ".repeat(width as usize - diff);
|
||||
|
||||
lines.push(line);
|
||||
line_no += 1;
|
||||
}
|
||||
|
||||
Flag::Lines(lines)
|
||||
}
|
||||
|
||||
// everything below this point is in alphabetical order
|
||||
|
||||
pub fn aroace_halves(state: &State) -> Flag {
|
||||
// pull colors from aro & ace stripe flags
|
||||
let Flag::Stripes(aro) = flag::aromantic() else { panic!() };
|
||||
let Flag::Stripes(ace) = flag::asexual() else { panic!() };
|
||||
|
||||
let (width, height) = state.size.get(60, 20);
|
||||
if height < 20 { error::too_small(width, height); }
|
||||
|
||||
let mut lines: Vec<String> = Vec::new();
|
||||
|
||||
// set up constraints
|
||||
let linecount = height - (height % 20);
|
||||
let aro_thresh = linecount / 5; // threshold for aromantic colors
|
||||
let ace_thresh = linecount / 4; // threshold for asexual colors
|
||||
let stripe = draw::BLOCK.repeat((width / 2) as usize);
|
||||
|
||||
let mut aro_index = 0;
|
||||
let mut ace_index = 0;
|
||||
for n in 0..linecount {
|
||||
// switch colors on thresholds
|
||||
if n != 0 {
|
||||
if n % aro_thresh == 0 { aro_index += 1; }
|
||||
if n % ace_thresh == 0 { ace_index += 1; }
|
||||
}
|
||||
let line = format!("{}{stripe}{}{stripe}", aro[aro_index], ace[ace_index]);
|
||||
lines.push(line);
|
||||
}
|
||||
|
||||
Flag::Lines(lines)
|
||||
}
|
||||
|
||||
|
||||
fn demi_orientation_render(middle: Bg<Rgb>, bottom: Bg<Rgb>, width: u16, height: u16) -> Vec<String> {
|
||||
let white = bg(0xFFFFFF);
|
||||
|
||||
if height < 5 { error::too_small(width, height); }
|
||||
|
||||
let stripes = vec![white, white, middle, bottom, bottom];
|
||||
|
||||
// initial stripe output buffer
|
||||
let mut lines: Vec<String> = draw::bg_stripes(stripes, width, height);
|
||||
|
||||
// assemble triangle cut-in
|
||||
let linecount = lines.len();
|
||||
let depth = linecount / 2;
|
||||
let corner = linecount % 2 == 1;
|
||||
// piecewise functions: ascending -> peak -> descending
|
||||
for n in 0..depth {
|
||||
let line = lines[n].clone();
|
||||
|
||||
let replacement = format!("{BLACK}{}{}", draw::BLOCK.repeat(n), TRIANGLE_21[0]);
|
||||
lines[n] = line.replacen(&" ".repeat(n + 1), &replacement, 1);
|
||||
}
|
||||
if corner {
|
||||
let line = lines[depth].clone();
|
||||
|
||||
let replacement = format!("{BLACK}{}{}", draw::BLOCK.repeat(depth), TRIANGLE_21[1]);
|
||||
lines[depth] = line.replacen(&" ".repeat(depth + 1), &replacement, 1);
|
||||
}
|
||||
let start = depth + (linecount % 2);
|
||||
for n in 0..depth {
|
||||
let line = lines[start + n].clone();
|
||||
|
||||
let size = depth - n - 1;
|
||||
let replacement = format!("{BLACK}{}{}", draw::BLOCK.repeat(size), TRIANGLE_21[2]);
|
||||
lines[start + n] = line.replacen(&" ".repeat(size + 1), &replacement, 1);
|
||||
}
|
||||
|
||||
lines
|
||||
}
|
||||
|
||||
pub fn demiromantic(state: &State) -> Flag {
|
||||
let green = bg(0x3DA542);
|
||||
let gray = bg(0xD2D2D2);
|
||||
|
||||
let (width, height) = state.size.get(15, 5);
|
||||
let lines = demi_orientation_render(green, gray, width, height);
|
||||
|
||||
Flag::Lines(lines)
|
||||
}
|
||||
|
||||
pub fn demisexual(state: &State) -> Flag {
|
||||
let purple = bg(0x832FA8);
|
||||
let grey = bg(0x7B868C);
|
||||
|
||||
let (width, height) = state.size.get(15, 5);
|
||||
let lines = demi_orientation_render(purple, grey, width, height);
|
||||
|
||||
Flag::Lines(lines)
|
||||
}
|
||||
|
||||
|
||||
pub fn disability() {
|
||||
let gray = bg(0x575757);
|
||||
|
||||
let green: u32 = 0x3AAD7D;
|
||||
let blue: u32 = 0x79BFE0;
|
||||
let white: u32 = 0xE8E8E8;
|
||||
let yellow: u32 = 0xEDDB76;
|
||||
let red: u32 = 0xCD7281;
|
||||
|
||||
let stripes = [red, yellow, white, blue, green];
|
||||
|
||||
// 2/3 slant stripes with gray background
|
||||
|
||||
}
|
||||
|
||||
|
||||
pub fn intersex() -> Flag {
|
||||
let yellow = bg(0xFFDA00);
|
||||
let purple = rgb(0x7A00AC);
|
||||
|
||||
let block = " ";
|
||||
let stripe = block.repeat(9);
|
||||
let part = block.repeat(4);
|
||||
|
||||
let lines = vec![
|
||||
format!("{yellow}{stripe}"),
|
||||
format!("{part}{purple}O{part}"),
|
||||
format!("{stripe}")
|
||||
];
|
||||
|
||||
Flag::Lines(lines)
|
||||
}
|
||||
|
||||
|
||||
pub fn polyamory(state: &State) -> Flag {
|
||||
let blue = rgb(0x019FE3);
|
||||
let magenta = rgb(0xE50051);
|
||||
let purple = rgb(0x340C46);
|
||||
let yellow = rgb(0xFCBF00);
|
||||
let white = bg(0xFFFFFF);
|
||||
|
||||
// special characters
|
||||
let semicircle = '\u{E0B6}';
|
||||
let separators = ['\u{E0BE}', '\u{E0BA}'];
|
||||
|
||||
let (width, height) = state.size.get(18, 6);
|
||||
if height < 6 { error::too_small(width, height); }
|
||||
|
||||
// create stripe array and line buffer
|
||||
let stripes = [magenta, purple]; // only stripes 2 and 3 need tracked
|
||||
let mut lines: Vec<String> = Vec::new();
|
||||
|
||||
// constraints
|
||||
let linecount = height - (height % 3); // largest multiple of 3 smaller than height
|
||||
let full_depth = linecount;
|
||||
let thresh = linecount / 3; // stripe & direction thresh
|
||||
let start = 2 * full_depth / 3;
|
||||
|
||||
// piecewise function: ascent -> descent
|
||||
let mut separator = separators[0];
|
||||
for n in 0..thresh {
|
||||
let size = start + n;
|
||||
|
||||
let line = format!(
|
||||
"{white}{yellow}{cutin}{blue}{separator}{stripe}",
|
||||
cutin = " ".repeat(size as usize),
|
||||
stripe = draw::BLOCK.repeat((width - (size + 1)) as usize)
|
||||
);
|
||||
|
||||
lines.push(line);
|
||||
}
|
||||
// first piece goes until the end of stripes[0]
|
||||
let mut index = 0; // stripe index
|
||||
separator = separators[1];
|
||||
for n in thresh..linecount {
|
||||
// advance index at threshold
|
||||
if n == (thresh * 2) { index = 1; }
|
||||
|
||||
let size = (2 * start) - n - 1;
|
||||
let color = stripes[index];
|
||||
|
||||
let line = format!(
|
||||
"{white}{yellow}{cutin}{color}{separator}{stripe}",
|
||||
cutin = " ".repeat(size as usize),
|
||||
stripe = draw::BLOCK.repeat((width - (size + 1)) as usize)
|
||||
);
|
||||
|
||||
lines.push(line);
|
||||
}
|
||||
|
||||
Flag::Lines(lines)
|
||||
}
|
||||
|
146
src/draw.rs
146
src/draw.rs
|
@ -1,131 +1,61 @@
|
|||
//! render handling code
|
||||
|
||||
use std::io::{
|
||||
self,
|
||||
Write
|
||||
};
|
||||
use std::io::{ self, Write };
|
||||
|
||||
use termion::{
|
||||
terminal_size,
|
||||
|
||||
clear,
|
||||
color::{ Bg, Fg, Rgb },
|
||||
cursor,
|
||||
input::TermRead,
|
||||
raw::IntoRawMode
|
||||
};
|
||||
|
||||
use crate::{
|
||||
color::{ RESET, RESET_BG },
|
||||
error,
|
||||
flag::Flag,
|
||||
state::{ Size, State }
|
||||
};
|
||||
use crate::color::{ RESET, Colors };
|
||||
use crate::flag::BLOCK;
|
||||
|
||||
pub static BLOCK: &str = "█";
|
||||
pub static UHALF: &str = "▀";
|
||||
|
||||
/// prints a provided vec of lines to stdout
|
||||
pub fn draw_full(lines: Vec<String>) {
|
||||
pub fn full(colors: Colors) {
|
||||
let mut stdout = io::stdout().into_raw_mode().unwrap();
|
||||
|
||||
// get in position for draw
|
||||
let count = lines.len() as u16;
|
||||
for _ in 0..count { write!(stdout, "\n").ok(); }
|
||||
write!(stdout, "{}", cursor::Up(count)).ok();
|
||||
|
||||
// clear screen and hide cursor
|
||||
write!(stdout, "{}{}", cursor::Hide, clear::All).ok();
|
||||
|
||||
// write lines
|
||||
let down = cursor::Down(1);
|
||||
for line in lines {
|
||||
let left = cursor::Left(line.len() as u16);
|
||||
write!(stdout, "{line}{left}{down}").ok();
|
||||
}
|
||||
|
||||
// clear formatting and flush buffer
|
||||
write!(stdout, "{RESET}{RESET_BG}").ok();
|
||||
stdout.flush().ok();
|
||||
|
||||
// hold for input
|
||||
let stdin = io::stdin();
|
||||
for _ in stdin.keys() { break; }
|
||||
|
||||
// clear and show cursor
|
||||
write!(stdout, "{}{}", clear::All, cursor::Show).ok();
|
||||
let count = colors.len();
|
||||
let (width, height) = terminal_size().unwrap();
|
||||
let thresh = height as usize / count;
|
||||
|
||||
write!(stdout, "{}{}", cursor::Hide, clear::All).ok();
|
||||
stdout.flush().ok();
|
||||
|
||||
let stripe = BLOCK.repeat(width as usize);
|
||||
|
||||
let mut index = 0;
|
||||
for n in 0..(height as usize) {
|
||||
if n != 0 && n % thresh == 0 {
|
||||
index += 1;
|
||||
if index >= count { break; }
|
||||
}
|
||||
write!(
|
||||
stdout,
|
||||
"{color}{stripe}{RESET}",
|
||||
color = colors[index]
|
||||
).ok();
|
||||
}
|
||||
stdout.flush().ok();
|
||||
|
||||
for _ in stdin.keys() { break; }
|
||||
write!(stdout, "{}{}", cursor::Show, clear::All).ok();
|
||||
stdout.flush().ok();
|
||||
}
|
||||
|
||||
pub fn draw_lines(lines: Vec<String>, state: &State) {
|
||||
match state.size {
|
||||
Size::Full => draw_full(lines),
|
||||
_ => for line in lines { println!("{line}{RESET}{RESET_BG}") }
|
||||
}
|
||||
}
|
||||
pub fn small(colors: Colors) {
|
||||
let mut stdout = io::stdout();
|
||||
|
||||
/// generates lines for foreground colors provided as a vec of strings for the draw_lines method
|
||||
pub fn fg_stripes(colors: Vec<Fg<Rgb>>, width: u16, height: u16) -> Vec<String> {
|
||||
let width = width as usize;
|
||||
let height = height as usize;
|
||||
let count = colors.len();
|
||||
|
||||
let thresh = height / count;
|
||||
let width = count * 3;
|
||||
|
||||
let stripe = BLOCK.repeat(width);
|
||||
let mut output = Vec::new();
|
||||
|
||||
// create our color index
|
||||
let mut index = 0;
|
||||
for n in 0..height {
|
||||
if n != 0 && n % thresh == 0 {
|
||||
index += 1;
|
||||
// and break if out of bounds
|
||||
if index >= count { break; }
|
||||
}
|
||||
let color = colors[index];
|
||||
output.push(format!("{color}{stripe}"));
|
||||
}
|
||||
|
||||
output
|
||||
}
|
||||
/// generates lines for background colors provided as a vec of strings for the draw_lines method
|
||||
pub fn bg_stripes(colors: Vec<Bg<Rgb>>, width: u16, height: u16) -> Vec<String> {
|
||||
let width = width as usize;
|
||||
let height = height as usize;
|
||||
let count = colors.len();
|
||||
|
||||
let thresh = height / count;
|
||||
|
||||
let stripe = " ".repeat(width);
|
||||
let mut output = Vec::new();
|
||||
|
||||
let mut index = 0;
|
||||
for n in 0..height {
|
||||
if n != 0 && n % thresh == 0 {
|
||||
index += 1;
|
||||
if index >= count { break; }
|
||||
}
|
||||
let color = colors[index];
|
||||
output.push(format!("{color}{stripe}"));
|
||||
}
|
||||
|
||||
output
|
||||
}
|
||||
|
||||
impl Flag {
|
||||
/// renders a flag to stdout
|
||||
pub fn draw(self, state: &State) {
|
||||
let lines = match self {
|
||||
Flag::Stripes(colors)
|
||||
=> {
|
||||
let count = colors.len() as u16;
|
||||
let (width, height) = state.size.get((count * 20 + 3) / 6, count);
|
||||
if height < count { error::too_small(width, height); }
|
||||
fg_stripes(colors, width, height)
|
||||
},
|
||||
Flag::Lines(lines)
|
||||
=> lines
|
||||
};
|
||||
draw_lines(lines, &state);
|
||||
for color in colors {
|
||||
println!("{color}{stripe}");
|
||||
}
|
||||
print!("{RESET}");
|
||||
stdout.flush().ok();
|
||||
}
|
||||
|
||||
|
|
24
src/error.rs
24
src/error.rs
|
@ -1,24 +0,0 @@
|
|||
use std::process::exit;
|
||||
|
||||
pub fn unmatched_flag(target: String) {
|
||||
eprintln!("pride: no flag {target}");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
pub fn size_missing() {
|
||||
eprintln!("pride: size flag requires a value");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
pub fn size_error(value: &str) {
|
||||
eprintln!("pride: size '{value}' is invalid");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
|
||||
pub fn too_small(width: u16, height: u16) {
|
||||
eprintln!("pride: this flag must be bigger than {width}x{height}");
|
||||
exit(3);
|
||||
}
|
||||
|
156
src/flag.rs
156
src/flag.rs
|
@ -1,15 +1,9 @@
|
|||
//! stripe pride flag color functions.
|
||||
//! all of these return a Vec of colors to be drawn from first to last.
|
||||
|
||||
use crate::color::*;
|
||||
|
||||
pub enum Flag {
|
||||
Stripes(Colors),
|
||||
Lines(Vec<String>)
|
||||
}
|
||||
pub static BLOCK: &str = "█";
|
||||
|
||||
|
||||
pub fn pride() -> Flag {
|
||||
pub fn pride() -> Colors {
|
||||
let red = rgb(0xE50000);
|
||||
let orange = rgb(0xFF8D00);
|
||||
let yellow = rgb(0xFFEE00);
|
||||
|
@ -17,190 +11,108 @@ pub fn pride() -> Flag {
|
|||
let blue = rgb(0x004CFF);
|
||||
let purple = rgb(0x770088);
|
||||
|
||||
Flag::Stripes(vec![red, orange, yellow, green, blue, purple])
|
||||
vec![red, orange, yellow, green, blue, purple]
|
||||
}
|
||||
|
||||
pub fn transgender() -> Colors {
|
||||
let pink = rgb(0x7ACBF5);
|
||||
let blue = rgb(0xEAACB8);
|
||||
|
||||
vec![pink, blue, WHITE, blue, pink]
|
||||
}
|
||||
|
||||
// everything below here is alphabetical
|
||||
|
||||
pub fn agender() -> Flag {
|
||||
pub fn agender() -> Colors {
|
||||
let gray = rgb(0xB9B9B9);
|
||||
let green = rgb(0xB8F483);
|
||||
|
||||
Flag::Stripes(vec![BLACK, gray, WHITE, green, WHITE, gray, BLACK])
|
||||
vec![BLACK, gray, WHITE, green, WHITE, gray, BLACK]
|
||||
}
|
||||
|
||||
pub fn aromantic() -> Flag {
|
||||
pub fn aromantic() -> Colors {
|
||||
let green = rgb(0x3BA740);
|
||||
let lime = rgb(0xA8D47A);
|
||||
let grey = rgb(0xABABAB);
|
||||
|
||||
Flag::Stripes(vec![green, lime, WHITE, grey, BLACK])
|
||||
vec![green, lime, WHITE, grey, BLACK]
|
||||
}
|
||||
|
||||
pub fn asexual() -> Flag {
|
||||
pub fn asexual() -> Colors {
|
||||
let grey = rgb(0xA4A4A4);
|
||||
let purple = rgb(0x810081);
|
||||
|
||||
Flag::Stripes(vec![BLACK, grey, WHITE, purple])
|
||||
vec![BLACK, grey, WHITE, purple]
|
||||
}
|
||||
|
||||
pub fn aroace() -> Flag {
|
||||
let orange = rgb(0xE28D00);
|
||||
let yellow = rgb(0xEBE200);
|
||||
let blue = rgb(0x67B7E8);
|
||||
let navy = rgb(0x203756);
|
||||
|
||||
Flag::Stripes(vec![orange, yellow, WHITE, blue, navy])
|
||||
}
|
||||
|
||||
|
||||
pub fn bigender() -> Flag {
|
||||
pub fn bigender() -> Colors {
|
||||
let pink = rgb(0xE676A6);
|
||||
let yellow = rgb(0xF9F04C);
|
||||
let purple = rgb(0xAB6BBB);
|
||||
let blue = rgb(0x6D96DC);
|
||||
|
||||
Flag::Stripes(vec![pink, yellow, WHITE, purple, blue])
|
||||
vec![pink, yellow, WHITE, purple, blue]
|
||||
}
|
||||
|
||||
pub fn bisexual() -> Flag {
|
||||
pub fn bisexual() -> Colors {
|
||||
let magenta = rgb(0xC42A6F);
|
||||
let purple = rgb(0x915392);
|
||||
let blue = rgb(0x1437A2);
|
||||
|
||||
Flag::Stripes(vec![magenta, magenta, purple, blue, blue])
|
||||
vec![magenta, magenta, purple, blue, blue]
|
||||
}
|
||||
|
||||
|
||||
fn demigender_base(color: Color) -> Colors {
|
||||
let grey = rgb(0x7F7F7F);
|
||||
let gray = rgb(0xC3C3C3);
|
||||
|
||||
|
||||
vec![grey, gray, color, WHITE, color, gray, grey]
|
||||
}
|
||||
|
||||
pub fn demiboy() -> Flag {
|
||||
let blue = rgb(0x7ACBF5);
|
||||
Flag::Stripes(demigender_base(blue))
|
||||
}
|
||||
|
||||
pub fn demigender() -> Flag {
|
||||
let yellow = rgb(0xFBFF74);
|
||||
Flag::Stripes(demigender_base(yellow))
|
||||
}
|
||||
|
||||
pub fn demigirl() -> Flag {
|
||||
let pink = rgb(0xEAACB8);
|
||||
Flag::Stripes(demigender_base(pink))
|
||||
}
|
||||
|
||||
|
||||
pub fn gay() -> Flag {
|
||||
let green1 = rgb(0x00906D);
|
||||
let green2 = rgb(0x00D1A7);
|
||||
let green3 = rgb(0x7EEBC1);
|
||||
let blue1 = rgb(0x6CAEE8);
|
||||
let blue2 = rgb(0x5543D3);
|
||||
let blue3 = rgb(0x461280);
|
||||
|
||||
Flag::Stripes(vec![green1, green2, green3, WHITE, blue1, blue2, blue3])
|
||||
}
|
||||
|
||||
pub fn genderfluid() -> Flag {
|
||||
pub fn genderfluid() -> Colors {
|
||||
let pink = rgb(0xFF75A2);
|
||||
let violet = rgb(0xBE18D6);
|
||||
let blue = rgb(0x333EBD);
|
||||
|
||||
Flag::Stripes(vec![pink, WHITE, violet, BLACK, blue])
|
||||
vec![pink, WHITE, violet, BLACK, blue]
|
||||
}
|
||||
|
||||
pub fn gender_nonconforming() -> Flag {
|
||||
let purple = rgb(0x50284D);
|
||||
let magenta = rgb(0x96467B);
|
||||
let blue = rgb(0x5C96F7);
|
||||
|
||||
Flag::Stripes(vec![purple, purple, magenta, blue, WHITE, blue, magenta, purple, purple])
|
||||
}
|
||||
|
||||
pub fn genderqueer() -> Flag {
|
||||
pub fn genderqueer() -> Colors {
|
||||
let purple = rgb(0xB899DF);
|
||||
let green = rgb(0x6B8E3B);
|
||||
|
||||
Flag::Stripes(vec![purple, WHITE, green])
|
||||
vec![purple, WHITE, green]
|
||||
}
|
||||
|
||||
pub fn gendervoid() -> Flag {
|
||||
pub fn gendervoid() -> Colors {
|
||||
let navy = rgb(0x08114A);
|
||||
let gray = rgb(0x4A484B);
|
||||
|
||||
Flag::Stripes(vec![navy, gray, BLACK, gray, navy])
|
||||
vec![navy, gray, BLACK, gray, navy]
|
||||
}
|
||||
|
||||
|
||||
pub fn lesbian() -> Flag {
|
||||
pub fn lesbian() -> Colors {
|
||||
let red = rgb(0xD62800);
|
||||
let orange = rgb(0xFF9B56);
|
||||
let pink = rgb(0xD462A6);
|
||||
let magenta = rgb(0xA40062);
|
||||
|
||||
Flag::Stripes(vec![red, orange, WHITE, pink, magenta])
|
||||
vec![red, orange, WHITE, pink, magenta]
|
||||
}
|
||||
|
||||
|
||||
pub fn multigender() -> Flag {
|
||||
pub fn multigender() -> Colors {
|
||||
let blue = rgb(0x3F47CC);
|
||||
let ltblue = rgb(0x01A4E9);
|
||||
let orange = rgb(0xFB7F27);
|
||||
|
||||
Flag::Stripes(vec![blue, ltblue, orange, ltblue, blue])
|
||||
vec![blue, ltblue, orange, ltblue, blue]
|
||||
}
|
||||
|
||||
pub fn multisexual() -> Flag {
|
||||
let purple = rgb(0x724DC9);
|
||||
let blue = rgb(0xA0EFFE);
|
||||
let pink = rgb(0xFF3D9B);
|
||||
|
||||
Flag::Stripes(vec![purple, WHITE, blue, pink])
|
||||
}
|
||||
|
||||
|
||||
pub fn neutrois() -> Flag {
|
||||
let green = rgb(0x2D9A1B);
|
||||
|
||||
Flag::Stripes(vec![WHITE, green, BLACK])
|
||||
}
|
||||
|
||||
pub fn nonbinary() -> Flag {
|
||||
pub fn nonbinary() -> Colors {
|
||||
let yellow = rgb(0xFFF433);
|
||||
let purple = rgb(0x9B59D0);
|
||||
|
||||
Flag::Stripes(vec![yellow, WHITE, purple, BLACK])
|
||||
vec![yellow, WHITE, purple, BLACK]
|
||||
}
|
||||
|
||||
|
||||
pub fn pansexual() -> Flag {
|
||||
pub fn pansexual() -> Colors {
|
||||
let magenta = rgb(0xFF1B8D);
|
||||
let yellow = rgb(0xFFDA00);
|
||||
let cyan = rgb(0x1BB3FF);
|
||||
|
||||
Flag::Stripes(vec![magenta, yellow, cyan])
|
||||
vec![magenta, yellow, cyan]
|
||||
}
|
||||
|
||||
pub fn polysexual() -> Flag {
|
||||
let pink = rgb(0xF61CB9);
|
||||
let green = rgb(0x07D569);
|
||||
let blue = rgb(0x1C92F6);
|
||||
|
||||
Flag::Stripes(vec![pink, green, blue])
|
||||
}
|
||||
|
||||
|
||||
pub fn transgender() -> Flag {
|
||||
let pink = rgb(0x7ACBF5);
|
||||
let blue = rgb(0xEAACB8);
|
||||
|
||||
Flag::Stripes(vec![pink, blue, WHITE, blue, pink])
|
||||
}
|
||||
|
||||
|
||||
|
|
173
src/help.rs
173
src/help.rs
|
@ -1,173 +0,0 @@
|
|||
//! help and list text
|
||||
|
||||
use std::process::exit;
|
||||
|
||||
use crate::VERSION;
|
||||
|
||||
/// displays the program's help text
|
||||
pub fn help_text() {
|
||||
println!("pride v{VERSION}
|
||||
Valerie Wolfe <sleeplessval@gmail.com>
|
||||
Display pride flags in the terminal.
|
||||
|
||||
usage: pride [flags] [name]
|
||||
|
||||
args:
|
||||
<name> The pride flag to display
|
||||
|
||||
flags:
|
||||
-h, --help Shows this help text
|
||||
--version Show version information
|
||||
-l, --list Prints a list of printable flags
|
||||
-s, --size [size] Sets the size of the output flag.
|
||||
|
||||
Use 'pride --list' to see a list of printable flags
|
||||
|
||||
~ You're loved and you matter ♥");
|
||||
}
|
||||
|
||||
/// shows a list of all flags
|
||||
pub fn list_text() {
|
||||
println!("pride v{VERSION}
|
||||
|
||||
flag list:
|
||||
agender agender pride flag
|
||||
aromantic aromantic pride flag
|
||||
aroace aromantic-asexual pride flag
|
||||
asexual asexual pride flag
|
||||
bigender bigender pride flag
|
||||
bisexual bisexual pride flag
|
||||
demiboy demiboy pride flag
|
||||
demigender demigender pride flag
|
||||
demigirl demigirl pride flag
|
||||
demiromantic demiromantic pride flag
|
||||
demisexual demisexual pride flag
|
||||
gay gay men pride flag
|
||||
genderfluid genderfluid pride flag
|
||||
gender-nonconforming gender nonconforming pride flag
|
||||
genderqueer genderqueer pride flag
|
||||
gendervoid gendervoid pride flag
|
||||
lesbian lesbian pride flag
|
||||
multigender multigender pride flag
|
||||
multisexual multisexual pride flag
|
||||
neutrois neutrois pride flag
|
||||
nonbinary nonbinary pride flag
|
||||
pansexual pansexual pride flag
|
||||
polysexual polysexual pride flag
|
||||
rainbow six-color rainbow flag
|
||||
progress progress arrow rainbow flag
|
||||
transgender transgender pride flag");
|
||||
}
|
||||
|
||||
/// handle help details by flag
|
||||
pub fn flag_help(flag: &str) {
|
||||
match flag {
|
||||
"pride" | "rainbow" | "-"
|
||||
=> {
|
||||
println!("The ubiquitous 1979 6-color rainbow pride flag, representing the larger queer community.
|
||||
|
||||
names:
|
||||
'pride', 'rainbow', '-'
|
||||
|
||||
variants:
|
||||
8-color Gilbert Baker's original 1978 flag with 8 stripes
|
||||
gilbert-baker
|
||||
sex-and-magic
|
||||
philadelphia The 2017 Philadelphia Pride flag with black and brown stripes
|
||||
progress The 2018 Progess rainbow pride flag designed by Daniel Quasar");
|
||||
},
|
||||
"progress"
|
||||
=> { println!("Daniel Quasar's 2018 Progress rainbow pride flag.\n\nnames:\n 'progress'"); }
|
||||
|
||||
"transgender" | "trans"
|
||||
=> {
|
||||
println!("The transgender pride flag designed by Monica Helms in 1999.
|
||||
|
||||
names:
|
||||
'transgender', 'trans'");
|
||||
},
|
||||
|
||||
// alphabetical below this point
|
||||
|
||||
"aromantic" | "aro"
|
||||
=> { println!("The aromantic pride flag.\n\nnames:\n 'aromantic', 'aro'"); }
|
||||
"asexual" | "ace"
|
||||
=> { println!("The asexual pride flag.\n\nnames:\n 'asexual', 'ace'"); }
|
||||
"aroace" | "aromantic-asexual"
|
||||
=> {
|
||||
println!("The aromantic-asexual pride flag designed by aroaesflags on tumblr.
|
||||
|
||||
names:
|
||||
'aroace', 'aromantic-asexual'
|
||||
|
||||
variants:
|
||||
halves The side-by-side aromantic and asexual aroace flag
|
||||
side-by-side
|
||||
sbs
|
||||
|
||||
notes:
|
||||
Side-by-side flag currently only displays in terminals 20 lines or taller.");
|
||||
},
|
||||
|
||||
"bisexual" | "bi"
|
||||
=> {
|
||||
println!("The bisexual flag designed by Michael Page in 1998.
|
||||
|
||||
names:
|
||||
'bisexual', 'bi'");
|
||||
},
|
||||
|
||||
|
||||
"gay" | "mlm"
|
||||
=> {
|
||||
println!("The 7-stripe gay men pride flag designed by @gayflagblog on tumblr in 2019.
|
||||
|
||||
names:
|
||||
'gay', 'mlm'");
|
||||
},
|
||||
|
||||
"gender-nonconforming" | "gendernonconforming" | "gnc"
|
||||
=> { println!("The gender-nonconforming pride flag.\n\nnames:\n 'gender-nonconforming', 'gendernonconforming', 'gnc'"); },
|
||||
|
||||
|
||||
"lesbian" | "wlw"
|
||||
=> {
|
||||
println!("The 5-stripe lesbian flag designed by Emily Gwen in 2018.
|
||||
|
||||
names:
|
||||
'lesbian', 'wlw'
|
||||
|
||||
variants:
|
||||
7 7-stripe flag, also designed in 2018 by Emily Gwen
|
||||
7-color
|
||||
7-stripe");
|
||||
},
|
||||
|
||||
|
||||
"nonbinary" | "nb"
|
||||
=> {
|
||||
println!("The nonbinary pride flag designed by Kyle Rowan in 2014.
|
||||
|
||||
names:
|
||||
'nonbinary', 'nb'");
|
||||
},
|
||||
|
||||
|
||||
"pansexual" | "pan"
|
||||
=> {
|
||||
println!("The pansexual pride flag designed by Jasper V around 2010
|
||||
|
||||
names:
|
||||
'pansexual', 'pan'");
|
||||
},
|
||||
|
||||
|
||||
_
|
||||
=> {
|
||||
println!("pride: no help found for {flag}!\n");
|
||||
help_text();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
172
src/main.rs
172
src/main.rs
|
@ -1,83 +1,58 @@
|
|||
//! main method module
|
||||
use std::env::var;
|
||||
use std::process::exit;
|
||||
|
||||
use pico_args::Arguments;
|
||||
|
||||
mod color;
|
||||
mod complex;
|
||||
mod draw;
|
||||
mod error;
|
||||
mod flag;
|
||||
mod help;
|
||||
mod state;
|
||||
mod util;
|
||||
mod variant;
|
||||
|
||||
use crate::{
|
||||
flag::Flag,
|
||||
state::State
|
||||
};
|
||||
use crate::color::Colors;
|
||||
|
||||
static VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||
|
||||
pub const FLAG_HELP: [&str;2] = [ "-h", "--help" ];
|
||||
pub const FLAG_LIST: [&str;2] = [ "-l", "--list" ];
|
||||
pub const FLAG_SIZE: [&str;2] = [ "-s", "--size"];
|
||||
pub const FLAG_VERSION: [&str;2] = [ "-v", "--version" ];
|
||||
|
||||
fn main() {
|
||||
// collect args
|
||||
let mut args = Arguments::from_env();
|
||||
|
||||
// handle help flag
|
||||
if args.contains(FLAG_HELP) {
|
||||
let target = args.subcommand().unwrap();
|
||||
if target.is_some() { help::flag_help(&target.unwrap()); }
|
||||
else { help::help_text(); }
|
||||
if args.contains(["-h", "--help"]) {
|
||||
help_text();
|
||||
return;
|
||||
}
|
||||
|
||||
// handle list flag
|
||||
if args.contains(FLAG_LIST) {
|
||||
help::list_text();
|
||||
if args.contains(["-l", "--list"]) {
|
||||
list_text();
|
||||
return;
|
||||
}
|
||||
|
||||
// handle version flag
|
||||
if args.contains(FLAG_VERSION) {
|
||||
if args.contains("--version") {
|
||||
println!("pride v{VERSION}");
|
||||
return;
|
||||
}
|
||||
|
||||
let state = State::new(&mut args);
|
||||
// get small flag
|
||||
let small = args.contains(["-s", "--small"]);
|
||||
|
||||
let subcommand =
|
||||
if let Ok(Some(subcommand)) = args.subcommand() { Some(subcommand) }
|
||||
else if let Ok(default) = var("PRIDE_DEFAULT") {
|
||||
if default.is_empty() { None }
|
||||
else { Some(default) }
|
||||
} else { None };
|
||||
let variant = args.subcommand().unwrap();
|
||||
let subcommand = args.subcommand().unwrap();
|
||||
|
||||
// get color vec from matched flag
|
||||
let flag: Flag = match subcommand.as_deref() {
|
||||
Some("pride" | "rainbow")
|
||||
| None
|
||||
let colors: Colors = match subcommand.as_deref() {
|
||||
Some("pride" | "gay")
|
||||
=> {
|
||||
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(&state),
|
||||
_
|
||||
=> flag::pride()
|
||||
}
|
||||
},
|
||||
|
||||
Some("progress")
|
||||
=> complex::progress(&state),
|
||||
Some("transgender" | "trans")
|
||||
=> flag::transgender(),
|
||||
|
||||
|
||||
Some("agender")
|
||||
|
@ -89,105 +64,78 @@ fn main() {
|
|||
Some("asexual" | "ace")
|
||||
=> flag::asexual(),
|
||||
|
||||
Some("aroace" | "aromantic-asexual")
|
||||
=> {
|
||||
match variant.as_deref() {
|
||||
Some("halves" | "side-by-side" | "sbs")
|
||||
=> complex::aroace_halves(&state),
|
||||
_
|
||||
=> flag::aroace()
|
||||
}
|
||||
},
|
||||
|
||||
Some("bigender")
|
||||
=> flag::bigender(),
|
||||
|
||||
Some("bisexual" | "bi")
|
||||
=> flag::bisexual(),
|
||||
|
||||
|
||||
Some("demiboy")
|
||||
=> flag::demiboy(),
|
||||
Some("demigender")
|
||||
=> flag::demigender(),
|
||||
Some("demigirl")
|
||||
=> flag::demigirl(),
|
||||
|
||||
Some("demiromantic")
|
||||
=> complex::demiromantic(&state),
|
||||
|
||||
Some("demisexual")
|
||||
=> complex::demisexual(&state),
|
||||
|
||||
// Some("disability")
|
||||
// => complex::disability();
|
||||
|
||||
|
||||
Some("gay" | "mlm")
|
||||
=> flag::gay(),
|
||||
|
||||
Some("genderfluid")
|
||||
=> flag::genderfluid(),
|
||||
|
||||
Some("gender-nonconforming" | "gnc" | "gendernonconforming")
|
||||
=> flag::gender_nonconforming(),
|
||||
|
||||
Some("genderqueer")
|
||||
=> flag::genderqueer(),
|
||||
|
||||
Some("gendervoid")
|
||||
=> flag::gendervoid(),
|
||||
|
||||
|
||||
// Some("intersex")
|
||||
// => complex::intersex(),
|
||||
|
||||
|
||||
Some("lesbian" | "wlw")
|
||||
=> {
|
||||
match variant.as_deref() {
|
||||
Some("7" | "7-color" | "7-stripe")
|
||||
=> variant::lesbian_7(),
|
||||
_
|
||||
=> flag::lesbian()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Some("multisexual" | "m-spec" | "mspec")
|
||||
=> flag::multisexual(),
|
||||
Some("lesbian")
|
||||
=> flag::lesbian(),
|
||||
|
||||
Some("multigender")
|
||||
=> flag::multigender(),
|
||||
|
||||
|
||||
Some("neutrois")
|
||||
=> flag::neutrois(),
|
||||
|
||||
Some("nonbinary" | "nb")
|
||||
=> flag::nonbinary(),
|
||||
|
||||
|
||||
Some("pansexual" | "pan")
|
||||
=> flag::pansexual(),
|
||||
|
||||
// Some("polyamory" | "polyamorous" | "poly")
|
||||
// => complex::polyamory(small),
|
||||
|
||||
Some("polysexual")
|
||||
=> flag::polysexual(),
|
||||
|
||||
|
||||
Some("transgender" | "trans")
|
||||
=> flag::transgender(),
|
||||
|
||||
|
||||
_
|
||||
=> { error::unmatched_flag(subcommand.unwrap()); panic!() }
|
||||
_ => { help_text(); exit(1) }
|
||||
};
|
||||
|
||||
// draw flag
|
||||
flag.draw(&state);
|
||||
if small { draw::small(colors); }
|
||||
else { draw::full(colors); }
|
||||
|
||||
}
|
||||
|
||||
fn help_text() {
|
||||
println!("pride v{VERSION}");
|
||||
println!("Valerie Wolfe <sleeplessval@gmail.com>");
|
||||
println!("Show pride flags in the terminal.\n");
|
||||
|
||||
println!("usage: pride [flags] <name>\n");
|
||||
|
||||
println!("args:");
|
||||
println!(" <name> The pride flag to display\n");
|
||||
|
||||
println!("flags:");
|
||||
println!(" -h, --help Shows this help text");
|
||||
println!(" --version Show version information");
|
||||
println!(" -l, --list Prints a list of printable flags");
|
||||
println!(" -s, --small Prints a small version without holding");
|
||||
|
||||
println!("\nUse 'pride --list' to see a list of printable flags");
|
||||
println!("\n~ You're loved and you matter ♥");
|
||||
}
|
||||
|
||||
fn list_text() {
|
||||
println!("pride v{}", env!("CARGO_PKG_VERSION"));
|
||||
println!("\nFlag list:");
|
||||
println!(" agender agender pride flag");
|
||||
println!(" aro, aromantic aromantic pride flag");
|
||||
println!(" ace, asexual asexual pride flag");
|
||||
println!(" bigender bigender pride flag");
|
||||
println!(" bi, bisexual bisexual pride flag");
|
||||
println!(" gay, pride six-color rainbow flag");
|
||||
println!(" genderfluid genderfluid pride flag");
|
||||
println!(" genderqueer genderqueer pride flag");
|
||||
println!(" gendervoid gendervoid pride flag");
|
||||
println!(" lesbian lesbian pride flag");
|
||||
println!(" multigender multigender pride flag");
|
||||
println!(" nb, nonbinary nonbinary pride flag");
|
||||
println!(" pan, pansexual pansexual pride flag");
|
||||
// println!(" progress progress arrow flag");
|
||||
println!(" trans, transgender transgender pride flag");
|
||||
}
|
||||
|
||||
|
|
66
src/state.rs
66
src/state.rs
|
@ -1,66 +0,0 @@
|
|||
use std::io::{ stdout, IsTerminal };
|
||||
|
||||
use pico_args::{ Arguments, Error };
|
||||
use termion::terminal_size;
|
||||
|
||||
use crate::{ FLAG_SIZE, error };
|
||||
|
||||
#[derive(PartialEq)]
|
||||
pub enum Size {
|
||||
Full,
|
||||
Small,
|
||||
Set(u16, u16),
|
||||
Wide(u16)
|
||||
}
|
||||
|
||||
impl Size {
|
||||
pub fn from(value: &str) -> Size {
|
||||
if value == "small" { return Size::Small; }
|
||||
let split: Vec<&str> = value.split('x').collect();
|
||||
let len = split.len();
|
||||
if len == 2 {
|
||||
if let (Ok(width), Ok(height)) = (str::parse::<u16>(split.get(0).unwrap()), str::parse::<u16>(split.get(1).unwrap())) {
|
||||
return Size::Set(width, height);
|
||||
}
|
||||
} else if len == 1 {
|
||||
if let Ok(width) = str::parse::<u16>(split.get(0).unwrap()) {
|
||||
return Size::Wide(width);
|
||||
}
|
||||
}
|
||||
error::size_error(value);
|
||||
panic!();
|
||||
}
|
||||
pub fn get(&self, width: u16, height: u16) -> (u16, u16) {
|
||||
match self {
|
||||
Size::Full => terminal_size().unwrap(),
|
||||
Size::Set(width, height) => (width.clone(), height.clone()),
|
||||
Size::Small => (width, height),
|
||||
Size::Wide(width) => (width.clone(), height)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct State {
|
||||
pub size: Size,
|
||||
pub is_terminal: bool,
|
||||
}
|
||||
|
||||
impl State {
|
||||
pub fn new(args: &mut Arguments) -> State {
|
||||
let is_terminal = stdout().is_terminal();
|
||||
|
||||
let size = match args.value_from_str::<[&str;2], String>(FLAG_SIZE).as_deref() {
|
||||
Ok(value) => Size::from(value),
|
||||
|
||||
Err(Error::MissingOption(_)) |
|
||||
Err(Error::MissingArgument) => if is_terminal { Size::Full } else { Size::Small },
|
||||
|
||||
Err(Error::OptionWithoutAValue(_)) => Size::Small,
|
||||
|
||||
_ => { error::size_missing(); panic!() }
|
||||
};
|
||||
|
||||
State { size, is_terminal }
|
||||
}
|
||||
}
|
||||
|
53
src/util.rs
53
src/util.rs
|
@ -1,53 +0,0 @@
|
|||
//! utility functions for working with ansi strings
|
||||
|
||||
/// gets the substring of displayed characters of an ANSI formatted string
|
||||
pub fn ansi_substr(source: &str, start: usize, end: usize) -> String {
|
||||
// init output string
|
||||
let mut output = String::new();
|
||||
|
||||
// trackers
|
||||
let mut escaped = false;
|
||||
let mut index = 0;
|
||||
for character in source.chars() {
|
||||
// escape character delimits start and end of ansi sequences
|
||||
if character == '\u{1B}' {
|
||||
escaped = true;
|
||||
output.push(character);
|
||||
}
|
||||
// push ALL escaped characters
|
||||
if escaped {
|
||||
output.push(character);
|
||||
// and unset esc on m
|
||||
if character == 'm' { escaped = false; }
|
||||
}
|
||||
// non-escaped characters must obey bounds
|
||||
else {
|
||||
if index < start {
|
||||
index += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
output.push(character);
|
||||
index += 1;
|
||||
|
||||
if index > end { break; }
|
||||
}
|
||||
}
|
||||
output
|
||||
}
|
||||
|
||||
/// gets the number of displayed characters in an ANSI formatted string
|
||||
pub fn ansi_len(source: &str) -> usize {
|
||||
let mut output = 0;
|
||||
let mut escaped = false;
|
||||
|
||||
for character in source.chars() {
|
||||
if character == '\u{1B}' { escaped = true; }
|
||||
|
||||
if !escaped { output += 1; }
|
||||
else if character == 'm' { escaped = false; }
|
||||
}
|
||||
|
||||
output
|
||||
}
|
||||
|
|
@ -1,49 +1,27 @@
|
|||
//! variant pride flags
|
||||
//! these aren't in the flag module for organizational reasons.
|
||||
|
||||
use crate::{
|
||||
color::*,
|
||||
flag::{ self, Flag }
|
||||
flag
|
||||
};
|
||||
|
||||
pub fn gilbert_baker() -> 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
|
||||
|
||||
Flag::Stripes(vec![pink, red, orange, yellow, green, cyan, indigo, purple])
|
||||
let mut output = flag::pride();
|
||||
output.insert(0, pink);
|
||||
output.insert(5, cyan);
|
||||
|
||||
output
|
||||
}
|
||||
|
||||
pub fn philadelphia() -> Flag {
|
||||
pub fn philadelphia() -> Colors {
|
||||
let brown = rgb(0x784F17);
|
||||
|
||||
let base = flag::pride();
|
||||
let mut colors = match base {
|
||||
Flag::Stripes(inner)
|
||||
=> inner,
|
||||
_
|
||||
=> panic!("impossible enum variant")
|
||||
};
|
||||
colors.insert(0, BLACK);
|
||||
colors.insert(1, brown);
|
||||
let mut output = flag::pride();
|
||||
output.insert(0, BLACK);
|
||||
output.insert(1, brown);
|
||||
|
||||
Flag::Stripes(colors)
|
||||
}
|
||||
|
||||
pub fn lesbian_7() -> Flag {
|
||||
let orange1 = rgb(0xD52D00); // gender non-conformity
|
||||
let orange2 = rgb(0xEF7627); // independence
|
||||
let orange3 = rgb(0xFF9A56); // community
|
||||
// white // unique relationships with womanhood
|
||||
let pink1 = rgb(0xD162A4); // serenity and peace
|
||||
let pink2 = rgb(0xB55690); // love and sex
|
||||
let pink3 = rgb(0xA30262); // femininity
|
||||
|
||||
Flag::Stripes(vec![orange1, orange2, orange3, WHITE, pink1, pink2, pink3])
|
||||
output
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue