mirror of
https://github.com/sharkdp/hexyl.git
synced 2026-10-30 09:05:54 +00:00
Prerender color strings for better performance
This commit is contained in:
1 parent
c49aa079b4
commit
794e1935e3
2 files changed
+34
-15
No files matched your search
@@ -18,6 +18,7 @@ const_format = "0.2"
|
|||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
terminal_size = "0.2"
|
terminal_size = "0.2"
|
||||||
|
once_cell = "1.16.0"
|
||||||
|
|
||||||
[dependencies.clap]
|
[dependencies.clap]
|
||||||
version = "3"
|
version = "3"
|
||||||
|
|||||||
+33
-15
@@ -2,10 +2,13 @@ pub(crate) mod input;
|
|||||||
|
|
||||||
pub use input::*;
|
pub use input::*;
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::io::{self, BufReader, Read, Write};
|
use std::io::{self, BufReader, Read, Write};
|
||||||
|
|
||||||
use anstyle::{AnsiColor, Reset};
|
use anstyle::{AnsiColor, Reset};
|
||||||
|
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
|
|
||||||
const COLOR_NULL: AnsiColor = AnsiColor::BrightBlack;
|
const COLOR_NULL: AnsiColor = AnsiColor::BrightBlack;
|
||||||
const COLOR_OFFSET: AnsiColor = AnsiColor::BrightBlack;
|
const COLOR_OFFSET: AnsiColor = AnsiColor::BrightBlack;
|
||||||
const COLOR_ASCII_PRINTABLE: AnsiColor = AnsiColor::Cyan;
|
const COLOR_ASCII_PRINTABLE: AnsiColor = AnsiColor::Cyan;
|
||||||
@@ -13,6 +16,25 @@ const COLOR_ASCII_WHITESPACE: AnsiColor = AnsiColor::Green;
|
|||||||
const COLOR_ASCII_OTHER: AnsiColor = AnsiColor::Magenta;
|
const COLOR_ASCII_OTHER: AnsiColor = AnsiColor::Magenta;
|
||||||
const COLOR_NONASCII: AnsiColor = AnsiColor::Yellow;
|
const COLOR_NONASCII: AnsiColor = AnsiColor::Yellow;
|
||||||
|
|
||||||
|
static COLORS: Lazy<HashMap<AnsiColor, String>> = Lazy::new(|| {
|
||||||
|
let mut m = HashMap::new();
|
||||||
|
for &col in [
|
||||||
|
COLOR_NULL,
|
||||||
|
COLOR_OFFSET,
|
||||||
|
COLOR_ASCII_PRINTABLE,
|
||||||
|
COLOR_ASCII_WHITESPACE,
|
||||||
|
COLOR_ASCII_OTHER,
|
||||||
|
COLOR_NONASCII,
|
||||||
|
]
|
||||||
|
.iter()
|
||||||
|
{
|
||||||
|
m.insert(col, col.render_fg().to_string());
|
||||||
|
}
|
||||||
|
m
|
||||||
|
});
|
||||||
|
|
||||||
|
static RESET: Lazy<String> = Lazy::new(|| Reset.render().to_string());
|
||||||
|
|
||||||
pub enum ByteCategory {
|
pub enum ByteCategory {
|
||||||
Null,
|
Null,
|
||||||
AsciiPrintable,
|
AsciiPrintable,
|
||||||
@@ -254,9 +276,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
|
|||||||
.collect(),
|
.collect(),
|
||||||
byte_hex_panel_g: (0u8..=u8::MAX).map(|i| format!("{:02x}", i)).collect(),
|
byte_hex_panel_g: (0u8..=u8::MAX).map(|i| format!("{:02x}", i)).collect(),
|
||||||
byte_char_panel_g: (0u8..=u8::MAX)
|
byte_char_panel_g: (0u8..=u8::MAX)
|
||||||
.map(|i| {
|
.map(|i| format!("{}", Byte(i).as_char()))
|
||||||
format!("{}", Byte(i).as_char())
|
|
||||||
})
|
|
||||||
.collect(),
|
.collect(),
|
||||||
squeezer: if use_squeeze {
|
squeezer: if use_squeeze {
|
||||||
Squeezer::Ignore
|
Squeezer::Ignore
|
||||||
@@ -331,7 +351,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
|
|||||||
.as_bytes(),
|
.as_bytes(),
|
||||||
)?;
|
)?;
|
||||||
if self.show_color {
|
if self.show_color {
|
||||||
self.writer.write_all(COLOR_OFFSET.render_fg().to_string().as_bytes())?;
|
self.writer.write_all(COLORS[&COLOR_OFFSET].as_bytes())?;
|
||||||
}
|
}
|
||||||
if self.show_position_panel {
|
if self.show_position_panel {
|
||||||
match self.squeezer {
|
match self.squeezer {
|
||||||
@@ -339,8 +359,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
|
|||||||
self.writer
|
self.writer
|
||||||
.write_all(self.byte_char_panel_g[b'*' as usize].as_bytes())?;
|
.write_all(self.byte_char_panel_g[b'*' as usize].as_bytes())?;
|
||||||
if self.show_color {
|
if self.show_color {
|
||||||
self.writer
|
self.writer.write_all(RESET.as_bytes())?;
|
||||||
.write_all(Reset.render().to_string().as_bytes())?;
|
|
||||||
}
|
}
|
||||||
self.writer.write_all(b" ")?;
|
self.writer.write_all(b" ")?;
|
||||||
}
|
}
|
||||||
@@ -355,8 +374,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
|
|||||||
.write_all(self.byte_hex_panel_g[byte as usize].as_bytes())?;
|
.write_all(self.byte_hex_panel_g[byte as usize].as_bytes())?;
|
||||||
}
|
}
|
||||||
if self.show_color {
|
if self.show_color {
|
||||||
self.writer
|
self.writer.write_all(RESET.as_bytes())?;
|
||||||
.write_all(Reset.render().to_string().as_bytes())?;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -376,7 +394,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
|
|||||||
Squeezer::Ignore | Squeezer::Disabled => {
|
Squeezer::Ignore | Squeezer::Disabled => {
|
||||||
if let Some(&b) = self.line_buf.get(i as usize) {
|
if let Some(&b) = self.line_buf.get(i as usize) {
|
||||||
if self.show_color && self.curr_color != Some(*Byte(b).color()) {
|
if self.show_color && self.curr_color != Some(*Byte(b).color()) {
|
||||||
self.writer.write_all(Byte(b).color().render_fg().to_string().as_bytes())?;
|
self.writer.write_all(COLORS[Byte(b).color()].as_bytes())?;
|
||||||
self.curr_color = Some(*Byte(b).color());
|
self.curr_color = Some(*Byte(b).color());
|
||||||
}
|
}
|
||||||
self.writer
|
self.writer
|
||||||
@@ -388,7 +406,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
|
|||||||
}
|
}
|
||||||
if i == 8 * self.panels - 1 {
|
if i == 8 * self.panels - 1 {
|
||||||
if self.show_color {
|
if self.show_color {
|
||||||
self.writer.write_all(Reset.render().to_string().as_bytes())?;
|
self.writer.write_all(RESET.as_bytes())?;
|
||||||
self.curr_color = None;
|
self.curr_color = None;
|
||||||
}
|
}
|
||||||
self.writer.write_all(
|
self.writer.write_all(
|
||||||
@@ -399,7 +417,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
|
|||||||
)?;
|
)?;
|
||||||
} else if i % 8 == 7 {
|
} else if i % 8 == 7 {
|
||||||
if self.show_color {
|
if self.show_color {
|
||||||
self.writer.write_all(Reset.render().to_string().as_bytes())?;
|
self.writer.write_all(RESET.as_bytes())?;
|
||||||
self.curr_color = None;
|
self.curr_color = None;
|
||||||
}
|
}
|
||||||
self.writer.write_all(
|
self.writer.write_all(
|
||||||
@@ -425,12 +443,12 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
|
|||||||
Squeezer::Print => {
|
Squeezer::Print => {
|
||||||
if !self.show_position_panel && i == 0 {
|
if !self.show_position_panel && i == 0 {
|
||||||
if self.show_color {
|
if self.show_color {
|
||||||
self.writer.write_all(COLOR_OFFSET.render_fg().to_string().as_bytes())?;
|
self.writer.write_all(COLORS[&COLOR_OFFSET].as_bytes())?;
|
||||||
}
|
}
|
||||||
self.writer
|
self.writer
|
||||||
.write_all(self.byte_char_panel_g[b'*' as usize].as_bytes())?;
|
.write_all(self.byte_char_panel_g[b'*' as usize].as_bytes())?;
|
||||||
if self.show_color {
|
if self.show_color {
|
||||||
self.writer.write_all(Reset.render().to_string().as_bytes())?;
|
self.writer.write_all(RESET.as_bytes())?;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.writer.write_all(b" ")?;
|
self.writer.write_all(b" ")?;
|
||||||
@@ -441,7 +459,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
|
|||||||
Squeezer::Ignore | Squeezer::Disabled => {
|
Squeezer::Ignore | Squeezer::Disabled => {
|
||||||
self.writer.write_all(b" ")?;
|
self.writer.write_all(b" ")?;
|
||||||
if self.show_color && self.curr_color != Some(*Byte(b).color()) {
|
if self.show_color && self.curr_color != Some(*Byte(b).color()) {
|
||||||
self.writer.write_all(Byte(b).color().render_fg().to_string().as_bytes())?;
|
self.writer.write_all(COLORS[Byte(b).color()].as_bytes())?;
|
||||||
self.curr_color = Some(*Byte(b).color());
|
self.curr_color = Some(*Byte(b).color());
|
||||||
}
|
}
|
||||||
self.writer
|
self.writer
|
||||||
@@ -452,7 +470,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
|
|||||||
if i % 8 == 7 {
|
if i % 8 == 7 {
|
||||||
if self.show_color {
|
if self.show_color {
|
||||||
self.curr_color = None;
|
self.curr_color = None;
|
||||||
self.writer.write_all(Reset.render().to_string().as_bytes())?;
|
self.writer.write_all(RESET.as_bytes())?;
|
||||||
}
|
}
|
||||||
self.writer.write_all(b" ")?;
|
self.writer.write_all(b" ")?;
|
||||||
// byte is last in last panel
|
// byte is last in last panel
|
||||||
|
|||||||
Reference in new issue
Block a user