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 Feb 10, 2024
1 parent 9776907 commit 2680dc6
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 7 deletions.
11 changes: 7 additions & 4 deletions src/printer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -598,22 +598,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 @@ -693,7 +695,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 @@ -702,6 +704,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
40 changes: 38 additions & 2 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 @@ -67,16 +76,18 @@ struct Attributes {
strike: String,

/// The hyperlink sequence.
/// FORMAT: \x1B]8;<ID>;<HREF>\e\\
/// FORMAT: \x1B]8;{ID};{URL}\e\\
///
/// `\e\\` may be replaced with BEL `\x07`.
/// Setting both <ID> and <HREF> to an empty string represents no hyperlink.
/// Setting both {ID} and {URL} to an empty string represents no hyperlink.
hyperlink: String,
}

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 @@ -1966,7 +1966,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 2680dc6

Please sign in to comment.