From 77d0b7659ca23881f3a867de10bf8fa7bbecfd41 Mon Sep 17 00:00:00 2001 From: xxanqw Date: Sun, 30 Nov 2025 00:22:20 +0200 Subject: Refactor color detection and ANSI handling for improved platform compatibility --- src/main.rs | 92 +++++++++++++++++++++++-------------------------------------- 1 file changed, 34 insertions(+), 58 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index 49ac18d..c50f37c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,9 @@ use clap::{Parser, ValueEnum}; -use crossterm::terminal::size; -#[cfg(windows)] -use crossterm::style::{SetForegroundColor, ResetColor, Print}; -#[cfg(windows)] use crossterm::QueueableCommand; -#[cfg(windows)] -use std::io::stdout; +use crossterm::style::{Print, ResetColor, SetForegroundColor}; +use crossterm::terminal::size; use std::error::Error; +use std::io::{Write, stdout}; use std::str::FromStr; use unicode_width::UnicodeWidthStr; @@ -431,59 +428,38 @@ fn draw_miku_says( // Apply coloring to Miku art lines if color_config.mode != ColorMode::NoColor && !color_config.color_cache.is_empty() { - let mut colored_line = String::new(); - colored_line.push_str(&horizontal_padding); - - // If on Windows and ANSI wasn't enabled, fallback to crossterm color APIs - #[cfg(windows)] - { - if !color::enable_windows_ansi() { - let mut stdout = stdout(); - stdout.queue(Print(horizontal_padding.clone())).ok(); - - for c in line.chars() { - if c.is_whitespace() { - stdout.queue(Print(c)).ok(); - } else if color_index < color_config.color_cache.len() { - let color = &color_config.color_cache[color_index]; - let ct_color = color::to_crossterm_color(color); - stdout.queue(SetForegroundColor(ct_color)).ok(); - stdout.queue(Print(c)).ok(); - stdout.queue(ResetColor).ok(); - color_index += 1; - } else { - stdout.queue(Print(c)).ok(); - } - } - - stdout.queue(Print("\n")).ok(); - stdout.flush().ok(); - // Skip the ANSI branch below - continue; - } - } - - for c in line.chars() { - if c.is_whitespace() { - colored_line.push(c); - } else if color_index < color_config.color_cache.len() { - let color = &color_config.color_cache[color_index]; - let ansi_code = color.to_ansi_fg(color_config.mode); - colored_line.push_str(&ansi_code); - colored_line.push(c); - colored_line.push_str("\x1b[0m"); // Reset - color_index += 1; - } else { - colored_line.push(c); - } - } - - println!("{}", colored_line); + // Use crossterm queueing to color characters so it's platform-agnostic + let mut stdout = stdout(); + stdout.queue(Print(horizontal_padding.clone())).ok(); + + for c in line.chars() { + if c.is_whitespace() { + stdout.queue(Print(c)).ok(); + } else if color_index < color_config.color_cache.len() { + let color = &color_config.color_cache[color_index]; + let ct_color = color::to_crossterm_color(color); + stdout.queue(SetForegroundColor(ct_color)).ok(); + stdout.queue(Print(c)).ok(); + stdout.queue(ResetColor).ok(); + color_index += 1; + } else { + stdout.queue(Print(c)).ok(); + } + } + + stdout.queue(Print("\n")).ok(); + stdout.flush().ok(); + continue; } else if let Some(single_color) = &color_config.single_color { - // Apply single solid color - let ansi_code = single_color.to_ansi_fg(color_config.mode); - let reset_code = "\x1b[0m"; - println!("{}{}{}{}", horizontal_padding, ansi_code, line, reset_code); + // Apply single solid color using crossterm + let mut stdout = stdout(); + let ct_color = color::to_crossterm_color(single_color); + stdout.queue(Print(horizontal_padding.clone())).ok(); + stdout.queue(SetForegroundColor(ct_color)).ok(); + stdout.queue(Print(line)).ok(); + stdout.queue(ResetColor).ok(); + stdout.queue(Print("\n")).ok(); + stdout.flush().ok(); } else { // No coloring println!("{}{}", horizontal_padding, line); -- cgit v1.3-2-g0d8e