[ Docs.rs | GitHub Pages | Rust Crate | Repository ]
Prettytty is a lightweight and flexible terminal library for Rust that has
only one low-level dependency, i.e., libc
on
Unix and windows-sys
on Windows. Its
API is clean and simple: Open a Connection
to the terminal and share it
across threads as needed. Write Command
s to Output
. Read Query
responses from Input
. Scan::read_token
takes care of low-level UTF-8 and
ANSI escape sequence decoding and Query::parse
turns token payloads into
objects. A cmd
library with 70+ built-in commands covers basic needs and
then some.
[ Docs.rs | GitHub Pages | Rust Crate | Python Package | Repository ]
🎖️ As featured on Real Python #211
🎖️ Inspired iTerm2's color preferences
Prettypretty is a Rust library with optional Python bindings that applies 2020s color science to 1970s terminals to facilitate scalable user interfaces. However, instead of progressive enhancement, it primarily relies on graceful degradation from high-resolution colors down to more limited terminal colors.
The three steps for better terminal styles are:
- Fluently declare high-resolution styles.
- Let prettypretty adjust styles to terminal capabilities and user preferences at program startup.
- Use adjusted styles at will.
Prettypretty seamlessly integrates with
prettytty for querying the terminal for
its current color theme. It then uses said color theme to produce more
accurate results when converting high resultion colors down to 256 or 16
terminal colors. The integration also is entirely optional, controlled by the
tty
feature, and fairly small, requiring about 80 lines of code for
Theme::query
.
Hence integration with another terminal library should be easy enough.
As far as colors are concerned, prettypretty comes with all the expressivity and convenience of high-resolution, floating point colors and color spaces, including the perceptually uniform Oklab, whether in Cartesian or polar form, with original or revised lightness. It further implements state-of-the-art algorithms for gamut-mapping, color interpolation, perceptual contrast, as well as its own hue- and lightness-based downsampling for optimal selection of ANSI colors.
The optional Python integration is enabled with the pyffi
feature flag and
relies on PyO3 and Maturin
for building an extension module with the same functionality. Only where the
Rust library uses trait implementations, the Python module uses dedicated
methods.
While prettytty takes care of terminal access for Rust, the Python version of
prettypretty has its own terminal abstraction, with its own Pythonic interface.
Besides the documentation, a good starting point for familiarizing yourself with prettypretty are the scripts:
-
prettypretty.progress illustrates the library's use on the example of a progress bar in less than 100 lines of Python. The finished progress bar is shown below for both light and dark themes.
-
prettypretty.plot charts colors on the chroma/hue plane of Oklab, if you don't feed it colors defaulting to your terminal's current color scheme. Here's the one for the basic theme in Apple's Terminal.app:
-
prettypretty.grid visualizes perceptual contrast and color downsampling strategies, exhaustively for the 6x6x6 RGB cube embedded in 8-bit color and selectively for 32x32 slices through the much bigger 24-bit RGB cube.
-
prettypretty.viz3d traces the boundaries of the visual gamut in 3D and saves the corresponding point cloud or mesh in PLY format. The screenshot below shows Vedo's rendering.
I wrote much of prettypretty over a two-month period in 2024. Twice. I first implemented the core color routines in Python and then I did so again in Rust. At this point, only the Rust version survives. But Python remains a tier-1 runtime target for prettypretty. Two things really helped with getting this project started. First, I had been toying with different approaches to terminal styles for a while and knew what I was looking for. Second, I benefitted tremendously from Lea Verou's and Chris Lilley's work on the Color.js library and CSS Color 4 specification. Prettypretty directly reuses Color.js' formulae for conversion between color spaces and implements several CSS Color 4 algorithms.
Copyright 2024 Robert Grimm. The code in this repository has been released as open source under the Apache 2.0 license.