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..2e32cff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,11 @@ use terminal_size::terminal_size; use hexyl::{Base, BorderStyle, CharacterTable, Endianness, Input, PrinterBuilder}; +use hexyl::{ + COLOR_ASCII_OTHER, COLOR_ASCII_PRINTABLE, COLOR_ASCII_WHITESPACE, COLOR_NONASCII, COLOR_NULL, + COLOR_RESET, +}; + #[cfg(test)] mod tests; @@ -179,6 +184,10 @@ struct Opt { conflicts_with("panels") )] terminal_width: Option, + + /// Print a table showing how different types of bytes are colored. + #[arg(long)] + print_color_table: bool, } #[derive(Clone, Debug, Default, ValueEnum)] @@ -231,6 +240,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 { @@ -416,10 +429,9 @@ fn run() -> Result<()> { let character_table = opt.character_table; - let stdout = io::stdout(); - let mut stdout_lock = BufWriter::new(stdout.lock()); + let mut stdout = BufWriter::new(io::stdout().lock()); - let mut printer = PrinterBuilder::new(&mut stdout_lock) + let mut printer = PrinterBuilder::new(&mut stdout) .show_color(show_color) .show_char_panel(show_char_panel) .show_position_panel(show_position_panel) @@ -475,6 +487,42 @@ impl From for u64 { } } +fn print_color_table() -> io::Result<()> { + let mut stdout = BufWriter::new(io::stdout().lock()); + + writeln!(stdout, "hexyl color reference:\n")?; + + // NULL bytes + stdout.write_all(COLOR_NULL)?; + writeln!(stdout, "⋄ NULL bytes (0x00)")?; + stdout.write_all(COLOR_RESET)?; + + // ASCII printable + stdout.write_all(COLOR_ASCII_PRINTABLE)?; + writeln!(stdout, "a ASCII printable characters (0x20 - 0x7E)")?; + stdout.write_all(COLOR_RESET)?; + + // ASCII whitespace + stdout.write_all(COLOR_ASCII_WHITESPACE)?; + writeln!(stdout, "_ ASCII whitespace (0x09 - 0x0D, 0x20)")?; + stdout.write_all(COLOR_RESET)?; + + // ASCII other + stdout.write_all(COLOR_ASCII_OTHER)?; + writeln!( + stdout, + "• ASCII control characters (except NULL and whitespace)" + )?; + stdout.write_all(COLOR_RESET)?; + + // Non-ASCII + stdout.write_all(COLOR_NONASCII)?; + writeln!(stdout, "× Non-ASCII bytes (0x80 - 0xFF)")?; + stdout.write_all(COLOR_RESET)?; + + Ok(()) +} + #[derive(Clone, Copy, Debug, Default, Hash, Eq, Ord, PartialEq, PartialOrd)] pub struct PositiveI64(i64);