1
1
mirror of https://github.com/wez/wezterm.git synced 2024-09-20 03:09:06 +03:00

avoid invalidating line seqno when applying hyperlinks

Return the the appropriate seqno from the original line
This commit is contained in:
Wez Furlong 2022-06-03 08:38:24 -07:00
parent 35f14ec34c
commit ead3d4a188
2 changed files with 38 additions and 13 deletions

View File

@ -13,7 +13,7 @@ use std::ops::Range;
use std::sync::{Arc, Mutex};
use termwiz::hyperlink::Rule;
use termwiz::input::KeyboardEncoding;
use termwiz::surface::{Line, SequenceNo, SEQ_ZERO};
use termwiz::surface::{Line, SequenceNo};
use url::Url;
use wezterm_term::color::ColorPalette;
use wezterm_term::{
@ -175,7 +175,8 @@ impl LogicalLine {
}
pub fn apply_hyperlink_rules(&mut self, rules: &[Rule]) {
self.logical.invalidate_implicit_hyperlinks(SEQ_ZERO);
let seq = self.logical.current_seqno();
self.logical.invalidate_implicit_hyperlinks(seq);
self.logical.scan_and_create_hyperlinks(rules);
if !self.logical.has_hyperlink() {
return;
@ -186,11 +187,12 @@ impl LogicalLine {
let num_phys = self.physical_lines.len();
for (idx, phys) in self.physical_lines.iter_mut().enumerate() {
let len = phys.cells().len();
let remainder = line.split_off(len, SEQ_ZERO);
let seq = seq.max(phys.current_seqno());
let remainder = line.split_off(len, seq);
*phys = line;
line = remainder;
let wrapped = idx == num_phys - 1;
phys.set_last_cell_was_wrapped(wrapped, SEQ_ZERO);
phys.set_last_cell_was_wrapped(wrapped, seq);
}
}
}
@ -293,8 +295,9 @@ pub trait Pane: Downcast {
if prior.logical.last_cell_was_wrapped()
&& prior.logical.cells().len() <= MAX_LOGICAL_LINE_LEN
{
prior.logical.set_last_cell_was_wrapped(false, SEQ_ZERO);
prior.logical.append_line(line.clone(), SEQ_ZERO);
let seqno = prior.logical.current_seqno().max(line.current_seqno());
prior.logical.set_last_cell_was_wrapped(false, seqno);
prior.logical.append_line(line.clone(), seqno);
prior.physical_lines.push(line);
} else {
let logical = line.clone();
@ -448,6 +451,7 @@ impl_downcast!(Pane);
mod test {
use super::*;
use k9::snapshot;
use termwiz::surface::SEQ_ZERO;
struct FakePane {
lines: Vec<Line>,
@ -535,10 +539,23 @@ mod test {
}
#[test]
fn logical_lines() {
let text = "Hello there this is a long line.\nlogical line two\nanother long line here\nlogical line four\nlogical line five\ncap it off with another long line";
fn hyperlink_rule_apply_preserves_seqno() {
let text = "Hello https://example.com\nwoot";
let lines = physical_lines_from_text(text, 5);
let pane = FakePane { lines };
let (_first, lines) = pane.get_lines_with_hyperlinks_applied(
0..2,
&[Rule {
regex: regex::Regex::new("example").unwrap(),
format: "$0".to_string(),
}],
);
let seqs: Vec<_> = lines.iter().map(|line| line.current_seqno()).collect();
k9::assert_equal!(seqs, vec![1, 1]);
}
fn physical_lines_from_text(text: &str, width: usize) -> Vec<Line> {
let mut physical_lines = vec![];
let width = 20;
for logical in text.split('\n') {
let chunks = logical
.chars()
@ -548,13 +565,21 @@ mod test {
.collect::<Vec<String>>();
let n_chunks = chunks.len();
for (idx, chunk) in chunks.into_iter().enumerate() {
let mut line = Line::from_text(&chunk, &Default::default(), SEQ_ZERO, None);
let mut line = Line::from_text(&chunk, &Default::default(), 1, None);
if idx < n_chunks - 1 {
line.set_last_cell_was_wrapped(true, SEQ_ZERO);
line.set_last_cell_was_wrapped(true, 1);
}
physical_lines.push(line);
}
}
physical_lines
}
#[test]
fn logical_lines() {
let text = "Hello there this is a long line.\nlogical line two\nanother long line here\nlogical line four\nlogical line five\ncap it off with another long line";
let width = 20;
let physical_lines = physical_lines_from_text(text, width);
fn text_from_lines(lines: &[Line]) -> Vec<String> {
lines.iter().map(|l| l.as_str()).collect::<Vec<_>>()

View File

@ -138,7 +138,7 @@ pub struct Rule {
)
)]
#[dynamic(into = "RegexWrap", try_from = "RegexWrap")]
regex: Regex,
pub regex: Regex,
/// The format string that defines how to transform the matched
/// text into a URL. For example, a format string of `$0` expands
/// to the entire matched text, whereas `mailto:$0` expands to
@ -149,7 +149,7 @@ pub struct Rule {
/// with the highest numbered capture first. This avoids issues
/// with ambiguous replacement of `$11` vs `$1` in the case of
/// more complex regexes.
format: String,
pub format: String,
}
struct RegexWrap(Regex);