extern crate alloc;
use alloc::vec::Vec;
use super::Segment;
pub fn parse_segments< 'a >( text : &'a str ) -> Vec< Segment< 'a > >
{
if text.is_empty()
{
return Vec::new();
}
let mut segments = Vec::new();
let mut chars = text.char_indices().peekable();
let mut text_start : Option< usize > = None;
while let Some( ( idx, ch ) ) = chars.next()
{
if ch == '\x1b'
{
if let Some( &( _, '[' ) ) = chars.peek()
{
if let Some( start ) = text_start.take()
{
segments.push( Segment::Text( &text[ start..idx ] ) );
}
let ansi_start = idx;
chars.next();
let mut ansi_end = idx + 2; while let Some( &( end_idx, c ) ) = chars.peek()
{
ansi_end = end_idx + c.len_utf8();
chars.next();
if c.is_ascii_alphabetic()
{
break;
}
}
segments.push( Segment::Ansi( &text[ ansi_start..ansi_end ] ) );
}
else
{
if text_start.is_none()
{
text_start = Some( idx );
}
}
}
else
{
if text_start.is_none()
{
text_start = Some( idx );
}
}
}
if let Some( start ) = text_start
{
segments.push( Segment::Text( &text[ start.. ] ) );
}
segments
}