use ratatui::{
style::{Modifier, Style},
text::{Line, Span},
};
use super::Theme;
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum Kind {
Name,
Attr,
Str,
Num,
Lit,
Text,
Heading,
Strong,
Emphasis,
Code,
Punct,
}
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Piece {
pub kind: Kind,
pub text: String,
}
impl Piece {
pub fn new(kind: Kind, text: impl Into<String>) -> Self {
Self {
kind,
text: text.into(),
}
}
}
pub fn lines(document: &[Vec<Piece>], theme: &Theme) -> Vec<Line<'static>> {
document
.iter()
.map(|line| {
Line::from(
line.iter()
.map(|piece| {
let style = match piece.kind {
Kind::Text => Style::new(),
Kind::Heading => Style::new()
.fg(theme.syntax_key)
.add_modifier(Modifier::BOLD),
Kind::Strong => Style::new().add_modifier(Modifier::BOLD),
Kind::Emphasis => Style::new().add_modifier(Modifier::ITALIC),
Kind::Code => Style::new().fg(theme.syntax_string),
Kind::Name => Style::new().fg(theme.syntax_key),
Kind::Attr => Style::new().fg(theme.syntax_attr),
Kind::Str => Style::new().fg(theme.syntax_string),
Kind::Num => Style::new().fg(theme.syntax_number),
Kind::Lit => Style::new().fg(theme.syntax_literal),
Kind::Punct => Style::new().fg(theme.syntax_punct),
};
Span::styled(piece.text.clone(), style)
})
.collect::<Vec<_>>(),
)
})
.collect()
}