refactor: using data-driven map to refactor modifier diff

This commit is contained in:
Qiumix 2026-06-11 02:30:49 +08:00
parent 07a5deb109
commit 814b766cce

View file

@ -117,10 +117,27 @@ where
/// Apply the diff between two `Modifier` sets by emitting SGR codes. /// Apply the diff between two `Modifier` sets by emitting SGR codes.
fn write_modifier_diff(w: &mut impl Write, from: Modifier, to: Modifier) -> io::Result<()> { fn write_modifier_diff(w: &mut impl Write, from: Modifier, to: Modifier) -> io::Result<()> {
let removed = from - to; let removed = from - to;
if removed.contains(Modifier::REVERSED) { let added = to - from;
write!(w, "{}", SetSgr::NoReverse)?;
// Process removed styles
let removed_styles = [
(Modifier::REVERSED, SetSgr::NoReverse),
(Modifier::ITALIC, SetSgr::NoItalic),
(Modifier::UNDERLINED, SetSgr::NoUnderline),
(Modifier::CROSSED_OUT, SetSgr::NotCrossedOut),
(Modifier::HIDDEN, SetSgr::NoHidden),
];
for (modifier, sgr) in removed_styles {
if removed.contains(modifier) {
write!(w, "{}", sgr)?;
}
} }
if removed.contains(Modifier::SLOW_BLINK) || removed.contains(Modifier::RAPID_BLINK) {
write!(w, "{}", SetSgr::NoBlink)?;
}
// Process intensity (Bold / Dim) status transitions
let reset_intensity = removed.contains(Modifier::BOLD) || removed.contains(Modifier::DIM); let reset_intensity = removed.contains(Modifier::BOLD) || removed.contains(Modifier::DIM);
if reset_intensity { if reset_intensity {
// Bold and Dim are both reset by applying the Normal intensity // Bold and Dim are both reset by applying the Normal intensity
@ -131,55 +148,32 @@ fn write_modifier_diff(w: &mut impl Write, from: Modifier, to: Modifier) -> io::
if to.contains(Modifier::DIM) { if to.contains(Modifier::DIM) {
write!(w, "{}", SetSgr::Dim)?; write!(w, "{}", SetSgr::Dim)?;
} }
if to.contains(Modifier::BOLD) { if to.contains(Modifier::BOLD) {
write!(w, "{}", SetSgr::Bold)?; write!(w, "{}", SetSgr::Bold)?;
} }
} else {
if added.contains(Modifier::BOLD) {
write!(w, "{}", SetSgr::Bold)?;
}
if added.contains(Modifier::DIM) {
write!(w, "{}", SetSgr::Dim)?;
}
} }
if removed.contains(Modifier::ITALIC) { // Process added styles
write!(w, "{}", SetSgr::NoItalic)?; let added_styles = [
} (Modifier::REVERSED, SetSgr::Reverse),
if removed.contains(Modifier::UNDERLINED) { (Modifier::ITALIC, SetSgr::Italic),
write!(w, "{}", SetSgr::NoUnderline)?; (Modifier::UNDERLINED, SetSgr::Underlined),
} (Modifier::CROSSED_OUT, SetSgr::CrossedOut),
if removed.contains(Modifier::CROSSED_OUT) { (Modifier::HIDDEN, SetSgr::Hidden),
write!(w, "{}", SetSgr::NotCrossedOut)?; (Modifier::SLOW_BLINK, SetSgr::SlowBlink),
} (Modifier::RAPID_BLINK, SetSgr::RapidBlink),
if removed.contains(Modifier::HIDDEN) { ];
write!(w, "{}", SetSgr::NoHidden)?; for (modifier, sgr) in added_styles {
} if added.contains(modifier) {
if removed.contains(Modifier::SLOW_BLINK) || removed.contains(Modifier::RAPID_BLINK) { write!(w, "{}", sgr)?;
write!(w, "{}", SetSgr::NoBlink)?; }
}
let added = to - from;
if added.contains(Modifier::REVERSED) {
write!(w, "{}", SetSgr::Reverse)?;
}
if added.contains(Modifier::BOLD) && !reset_intensity {
write!(w, "{}", SetSgr::Bold)?;
}
if added.contains(Modifier::ITALIC) {
write!(w, "{}", SetSgr::Italic)?;
}
if added.contains(Modifier::UNDERLINED) {
write!(w, "{}", SetSgr::Underlined)?;
}
if added.contains(Modifier::DIM) && !reset_intensity {
write!(w, "{}", SetSgr::Dim)?;
}
if added.contains(Modifier::CROSSED_OUT) {
write!(w, "{}", SetSgr::CrossedOut)?;
}
if added.contains(Modifier::HIDDEN) {
write!(w, "{}", SetSgr::Hidden)?;
}
if added.contains(Modifier::SLOW_BLINK) {
write!(w, "{}", SetSgr::SlowBlink)?;
}
if added.contains(Modifier::RAPID_BLINK) {
write!(w, "{}", SetSgr::RapidBlink)?;
} }
Ok(()) Ok(())