use ratatui::{
style::{Color, Modifier, Style},
text::{Line, Span},
};
use super::geometry::LineNumberGutter;
pub(super) fn diff_ln_span(
pair: (Option<usize>, Option<usize>),
gutter: &LineNumberGutter,
) -> Span<'static> {
let w = gutter.col_width;
let content = match pair.1 {
Some(v) => format!(" {v:>w$} "),
None => " ".repeat(gutter.total_width),
};
Span::styled(
content,
Style::default()
.fg(Color::DarkGray)
.add_modifier(Modifier::DIM),
)
}
pub(super) fn file_ln_span(line_number: usize, gutter: &LineNumberGutter) -> Span<'static> {
Span::styled(
format!(" {line_number:>w$} ", w = gutter.col_width),
Style::default()
.fg(Color::DarkGray)
.add_modifier(Modifier::DIM),
)
}
pub(super) fn add_line_number_gutters(
lines: Vec<Line<'static>>,
first_gutter: Span<'static>,
gutter: &LineNumberGutter,
) -> Vec<Line<'static>> {
lines
.into_iter()
.enumerate()
.map(|(i, line)| {
let ln = if i == 0 {
first_gutter.clone()
} else {
gutter.blank_span()
};
insert_gutter_span(line, ln, Span::raw(" "))
})
.collect()
}
pub(super) fn insert_blank_gutter(line: Line<'static>, gutter: &LineNumberGutter) -> Line<'static> {
insert_gutter_span(line, gutter.blank_span(), Span::raw(""))
}
pub(super) fn insert_blank_gutter_at(
line: Line<'static>,
gutter: &LineNumberGutter,
split_at: usize,
) -> Line<'static> {
let mut spans = line.spans;
if spans.is_empty() {
return Line::from(vec![gutter.blank_span()]);
}
let first = spans.remove(0);
let text = first.content.as_ref();
let (head, tail) = text.split_at(split_at.min(text.len()));
let head_span = Span::styled(head.to_string(), first.style);
let tail_span = Span::styled(tail.to_string(), first.style);
let mut new_spans = Vec::with_capacity(spans.len() + 3);
new_spans.push(head_span);
new_spans.push(gutter.blank_span());
new_spans.push(tail_span);
new_spans.extend(spans);
Line::from(new_spans)
}
fn insert_gutter_span(
line: Line<'static>,
gutter_span: Span<'static>,
bar_fallback: Span<'static>,
) -> Line<'static> {
let mut spans = line.spans;
let bar = if spans.is_empty() {
bar_fallback
} else {
spans.remove(0)
};
let mut new_spans = Vec::with_capacity(spans.len() + 2);
new_spans.push(bar);
new_spans.push(gutter_span);
new_spans.extend(spans);
Line::from(new_spans)
}