bat/src/preprocessor.rs

35 lines
1.0 KiB
Rust
Raw Normal View History

use console::AnsiCodeIterator;
/// Expand tabs like an ANSI-enabled expand(1).
pub fn expand(line: &str, width: usize, mut cursor: usize) -> String {
let mut buffer = String::with_capacity(line.len() * 2);
for chunk in AnsiCodeIterator::new(line) {
match chunk {
(text, true) => buffer.push_str(text),
(mut text, false) => {
while let Some(index) = text.find('\t') {
// Add previous text.
if index > 0 {
cursor += index;
buffer.push_str(&text[0..index]);
}
// Add tab.
let spaces = width - (cursor % width);
cursor += spaces;
buffer.push_str(&*" ".repeat(spaces));
// Next.
text = &text[index + 1..text.len()];
}
cursor += text.len();
buffer.push_str(text);
}
}
}
buffer
}