in codex-rs/tui/src/wrapping.rs [783:877]
fn mixed_url_wrap_ranges(
text: &str,
initial_width: usize,
subsequent_width: usize,
) -> Vec<Range<usize>> {
let leading_space_width = text.chars().take_while(|ch| *ch == ' ').count();
let mut words = Vec::new();
let mut cursor = 0usize;
for word in WordSeparator::AsciiSpace.find_words(text) {
let word_start = cursor;
let word_end = word_start + word.word.len();
let trailing_space_end = word_end + word.whitespace.len();
if !word.word.is_empty() {
words.push(MixedUrlWord {
range: word_start..word_end,
is_url: is_url_like_token(word.word),
});
}
cursor = trailing_space_end;
}
let mut lines = Vec::new();
let mut line_start = None;
let mut line_end = 0usize;
let mut line_width = 0usize;
let mut line_limit = initial_width.max(1);
for word in words {
let mut pending = split_mixed_url_word(text, word, line_limit);
let mut pending_idx = 0usize;
while let Some(piece) = pending.get(pending_idx).cloned() {
let empty_line_prefix_width = if line_start.is_none() && lines.is_empty() {
leading_space_width
} else {
0
};
let empty_line_piece_limit = line_limit.saturating_sub(empty_line_prefix_width).max(1);
if line_start.is_none() && !piece.is_url && piece.width(text) > empty_line_piece_limit {
pending.splice(
pending_idx..=pending_idx,
split_mixed_url_word(text, piece, empty_line_piece_limit),
);
continue;
}
let piece_width = piece.width(text);
let inter_word_space = line_start
.map(|_| text[line_end..piece.range.start].len())
.unwrap_or(0);
let fits = if line_start.is_none() {
piece.is_url
|| empty_line_prefix_width + piece_width <= line_limit
|| empty_line_prefix_width >= line_limit
} else {
line_width + inter_word_space + piece_width <= line_limit
};
if fits {
if line_start.is_none() {
let is_first_output_line = lines.is_empty();
let start = if is_first_output_line {
0
} else {
piece.range.start
};
line_start = Some(start);
line_width = if is_first_output_line {
leading_space_width + piece_width
} else {
piece_width
};
} else {
line_width += inter_word_space + piece_width;
}
line_end = piece.range.end;
pending_idx += 1;
continue;
}
if let Some(start) = line_start.take() {
lines.push(start..line_end);
}
line_end = 0;
line_width = 0;
line_limit = subsequent_width.max(1);
}
}
if let Some(start) = line_start {
lines.push(start..line_end);
}
lines
}