Skip to content

Commit

Permalink
Remove hyperlink when wrapping lines
Browse files Browse the repository at this point in the history
  • Loading branch information
eth-p committed Apr 18, 2023
1 parent 6e37b75 commit 782098a
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 5 deletions.
11 changes: 7 additions & 4 deletions src/printer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -537,22 +537,24 @@ impl<'a> Printer for InteractivePrinter<'a> {
match chunk {
// Regular text.
EscapeSequence::Text(text) => {
let text = &*self.preprocess(text, &mut cursor_total);
let text = self.preprocess(text, &mut cursor_total);
let text_trimmed = text.trim_end_matches(|c| c == '\r' || c == '\n');

write!(
handle,
"{}",
"{}{}",
as_terminal_escaped(
style,
&format!("{}{}", self.ansi_style, text_trimmed),
true_color,
colored_output,
italics,
background_color
)
),
self.ansi_style.to_reset_sequence(),
)?;

// Pad the rest of the line.
if text.len() != text_trimmed.len() {
if let Some(background_color) = background_color {
let ansi_style = Style {
Expand Down Expand Up @@ -632,7 +634,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
// It wraps.
write!(
handle,
"{}\n{}",
"{}{}\n{}",
as_terminal_escaped(
style,
&format!("{}{}", self.ansi_style, line_buf),
Expand All @@ -641,6 +643,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
self.config.use_italic_text,
background_color
),
self.ansi_style.to_reset_sequence(),
panel_wrap.clone().unwrap()
)?;

Expand Down
36 changes: 36 additions & 0 deletions src/vscreen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ impl AnsiStyle {
}
}
}

pub fn to_reset_sequence(&mut self) -> String {
match &mut self.attributes {
Some(a) => a.to_reset_sequence(),
None => String::new(),
}
}
}

impl Display for AnsiStyle {
Expand All @@ -35,6 +42,8 @@ impl Display for AnsiStyle {
}

struct Attributes {
has_sgr_sequences: bool,

foreground: String,
background: String,
underlined: String,
Expand Down Expand Up @@ -77,6 +86,8 @@ struct Attributes {
impl Attributes {
pub fn new() -> Self {
Attributes {
has_sgr_sequences: false,

foreground: "".to_owned(),
background: "".to_owned(),
underlined: "".to_owned(),
Expand Down Expand Up @@ -135,6 +146,8 @@ impl Attributes {
}

fn sgr_reset(&mut self) {
self.has_sgr_sequences = false;

self.foreground.clear();
self.background.clear();
self.underlined.clear();
Expand All @@ -152,6 +165,7 @@ impl Attributes {
.map(|p| p.parse::<u16>())
.map(|p| p.unwrap_or(0)); // Treat errors as 0.

self.has_sgr_sequences = true;
while let Some(p) = iter.next() {
match p {
0 => self.sgr_reset(),
Expand Down Expand Up @@ -214,6 +228,28 @@ impl Attributes {
_ => format!("\x1B[{}m", color),
}
}

/// Gets an ANSI escape sequence to reset all the known attributes.
pub fn to_reset_sequence(&self) -> String {
let mut buf = String::with_capacity(17);

// TODO: Enable me in a later pull request.
// if self.has_sgr_sequences {
// buf.push_str("\x1B[m");
// }

if !self.hyperlink.is_empty() {
buf.push_str("\x1B]8;;\x1B\\"); // Disable hyperlink.
}

// TODO: Enable me in a later pull request.
// if !self.charset.is_empty() {
// // https://espterm.github.io/docs/VT100%20escape%20codes.html
// buf.push_str("\x1B(B\x1B)B"); // setusg0 and setusg1
// }

buf
}
}

impl Display for Attributes {
Expand Down
2 changes: 1 addition & 1 deletion tests/integration_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1796,7 +1796,7 @@ fn ansi_hyperlink_emitted_when_wrapped() {
.write_stdin("\x1B]8;;http://example.com/\x1B\\Hyperlinks..........Wrap across lines.\n")
.assert()
.success()
.stdout("\x1B]8;;http://example.com/\x1B\\\x1B]8;;http://example.com/\x1B\\Hyperlinks..........\n\x1B]8;;http://example.com/\x1B\\Wrap across lines.\n")
.stdout("\x1B]8;;http://example.com/\x1B\\\x1B]8;;http://example.com/\x1B\\Hyperlinks..........\x1B]8;;\x1B\\\n\x1B]8;;http://example.com/\x1B\\Wrap across lines.\n")
// FIXME: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ should not be emitted twice.
.stderr("");
}
Expand Down

0 comments on commit 782098a

Please sign in to comment.