summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorxxanqw <[email protected]>2025-11-29 23:42:12 +0200
committerxxanqw <[email protected]>2025-11-29 23:42:12 +0200
commit517df2bb0006b16d24f8b9b25020a793354ab294 (patch)
tree491762de06c736d1ea61b1a682e1a1442feba41e /src/main.rs
parentd2c07879d69d4c6cbe9de7df38cd9add2aa2fb5c (diff)
downloadmikusays-c-517df2bb0006b16d24f8b9b25020a793354ab294.tar.gz
mikusays-c-517df2bb0006b16d24f8b9b25020a793354ab294.zip
Enable ANSI support on Windows and fallback to crossterm colors if necessary
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs65
1 files changed, 50 insertions, 15 deletions
diff --git a/src/main.rs b/src/main.rs
index 023f7f3..49ac18d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,5 +1,11 @@
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 std::error::Error;
use std::str::FromStr;
use unicode_width::UnicodeWidthStr;
@@ -428,22 +434,51 @@ fn draw_miku_says(
let mut colored_line = String::new();
colored_line.push_str(&horizontal_padding);
- 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);
- }
- }
+ // 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();
- println!("{}", colored_line);
+ 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);
} 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);