From 568f38ae7733ac3580fa6d300ac6c51452d7c8e9 Mon Sep 17 00:00:00 2001 From: Taylan Sahin Date: Fri, 13 Dec 2024 00:11:15 +0000 Subject: [PATCH] =?UTF-8?q?PR=20#229=20=E2=80=A2=20Add=20option=20to=20pri?= =?UTF-8?q?nt=20color=20table?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 7 ++++++- src/main.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bf2ea9..892586d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,14 @@ -# unreleased +# unreleased + +## Features + +* New `--print-color-table` option, see #229 (@sahinfalcon) ## Bugfixes - Throw an error when try to view a directory, see #234 (@Integral-Tech) + # v0.15.0 ## Features diff --git a/src/main.rs b/src/main.rs index 4c257bb..431e05a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,8 @@ use terminal_size::terminal_size; use hexyl::{Base, BorderStyle, CharacterTable, Endianness, Input, PrinterBuilder}; +use hexyl::{COLOR_NULL, COLOR_RESET, COLOR_ASCII_PRINTABLE, COLOR_ASCII_WHITESPACE, COLOR_ASCII_OTHER, COLOR_NONASCII}; + #[cfg(test)] mod tests; @@ -179,6 +181,10 @@ struct Opt { conflicts_with("panels") )] terminal_width: Option, + + /// Print a table showing how different types of bytes are colored. + #[arg(short('t'), long)] + print_color_table: bool, } #[derive(Clone, Debug, Default, ValueEnum)] @@ -231,6 +237,10 @@ impl From for u8 { fn run() -> Result<()> { let opt = Opt::parse(); + if opt.print_color_table { + return print_color_table().map_err(|e| anyhow!(e)); + } + let stdin = io::stdin(); let mut reader = match opt.file { @@ -475,6 +485,40 @@ impl From for u64 { } } +fn print_color_table() -> io::Result<()> { + let stdout = io::stdout(); + let mut stdout_lock = BufWriter::new(stdout.lock()); + + writeln!(stdout_lock, "hexyl color reference:\n")?; + + // NULL bytes + stdout_lock.write_all(COLOR_NULL)?; + writeln!(stdout_lock, "⋄ NULL bytes (0x00)")?; + stdout_lock.write_all(COLOR_RESET)?; + + // ASCII printable + stdout_lock.write_all(COLOR_ASCII_PRINTABLE)?; + writeln!(stdout_lock, "a ASCII printable characters (0x20 - 0x7E)")?; + stdout_lock.write_all(COLOR_RESET)?; + + // ASCII whitespace + stdout_lock.write_all(COLOR_ASCII_WHITESPACE)?; + writeln!(stdout_lock, "_ ASCII whitespace (0x09 - 0x0D, 0x20)")?; + stdout_lock.write_all(COLOR_RESET)?; + + // ASCII other + stdout_lock.write_all(COLOR_ASCII_OTHER)?; + writeln!(stdout_lock, "• ASCII control characters (except NULL and whitespace)")?; + stdout_lock.write_all(COLOR_RESET)?; + + // Non-ASCII + stdout_lock.write_all(COLOR_NONASCII)?; + writeln!(stdout_lock, "× Non-ASCII bytes (0x80 - 0xFF)")?; + stdout_lock.write_all(COLOR_RESET)?; + + Ok(()) +} + #[derive(Clone, Copy, Debug, Default, Hash, Eq, Ord, PartialEq, PartialOrd)] pub struct PositiveI64(i64);