diff --git a/crates/anstyle-roff/src/lib.rs b/crates/anstyle-roff/src/lib.rs index ea88cdf8..59e87bbf 100644 --- a/crates/anstyle-roff/src/lib.rs +++ b/crates/anstyle-roff/src/lib.rs @@ -38,11 +38,25 @@ mod control_requests { /// ``` pub fn to_roff(styled_text: &str) -> Roff { let mut doc = Roff::new(); + let mut previous_fg_color = None; + let mut previous_bg_color = None; for styled in styled_str::styled_stream(styled_text) { - set_color( - (&styled.style.get_fg_color(), &styled.style.get_bg_color()), - &mut doc, - ); + if previous_fg_color != styled.style.get_fg_color() { + add_color_to_roff( + &mut doc, + control_requests::FOREGROUND, + &styled.style.get_fg_color(), + ); + previous_fg_color = styled.style.get_fg_color(); + } + if previous_bg_color != styled.style.get_bg_color() { + add_color_to_roff( + &mut doc, + control_requests::BACKGROUND, + &styled.style.get_bg_color(), + ); + previous_bg_color = styled.style.get_bg_color(); + } set_effects_and_text(&styled, &mut doc); } doc @@ -93,13 +107,6 @@ fn is_bright(fg_color: &Color) -> bool { } } -type ColorSet<'a> = (&'a Option, &'a Option); - -fn set_color(colors: ColorSet<'_>, doc: &mut Roff) { - add_color_to_roff(doc, control_requests::FOREGROUND, colors.0); - add_color_to_roff(doc, control_requests::BACKGROUND, colors.1); -} - fn add_color_to_roff(doc: &mut Roff, control_request: &str, color: &Option) { match color { Some(Color::Rgb(c)) => { diff --git a/crates/anstyle-roff/tests/roffs/bold.roff b/crates/anstyle-roff/tests/roffs/bold.roff index 7db69f45..448da3e8 100644 --- a/crates/anstyle-roff/tests/roffs/bold.roff +++ b/crates/anstyle-roff/tests/roffs/bold.roff @@ -1,3 +1 @@ -.gcolor default -.fcolor default \fBtest\fR diff --git a/crates/anstyle-roff/tests/roffs/italic.roff b/crates/anstyle-roff/tests/roffs/italic.roff index e6c05801..02815a7e 100644 --- a/crates/anstyle-roff/tests/roffs/italic.roff +++ b/crates/anstyle-roff/tests/roffs/italic.roff @@ -1,3 +1 @@ -.gcolor default -.fcolor default \fItest\fR