aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorxxanqw <[email protected]>2025-11-30 00:22:20 +0200
committerxxanqw <[email protected]>2025-11-30 00:22:20 +0200
commit77d0b7659ca23881f3a867de10bf8fa7bbecfd41 (patch)
tree2d47a1126943cea0585a3642851eb0a7f93a85df /src/main.rs
parent915614c799060535347753593c084e81a69e5749 (diff)
downloadmikusays-c-77d0b7659ca23881f3a867de10bf8fa7bbecfd41.tar.gz
mikusays-c-77d0b7659ca23881f3a867de10bf8fa7bbecfd41.zip
Refactor color detection and ANSI handling for improved platform compatibility
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs88
1 files changed, 32 insertions, 56 deletions
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;
- }
- }
+ // 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() {
- 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);
- }
- }
+ 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();
+ }
+ }
- println!("{}", colored_line);
+ 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);