Monster commit: native version

This commit is contained in:
2026-01-30 15:03:49 +01:00
parent 22ee5f97e6
commit 2731eea037
35 changed files with 1491 additions and 366 deletions

View File

@@ -1,6 +1,7 @@
use ratatui::style::{Color, Modifier, Style};
use ratatui::style::{Modifier, Style};
use crate::model::{SourceSpan, WordCompile, WORDS};
use crate::theme::syntax;
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum TokenKind {
@@ -24,61 +25,34 @@ pub enum TokenKind {
impl TokenKind {
pub fn style(self) -> Style {
match self {
TokenKind::Emit => Style::default()
.fg(Color::Rgb(255, 255, 255))
.bg(Color::Rgb(140, 50, 50))
.add_modifier(Modifier::BOLD),
TokenKind::Number => Style::default()
.fg(Color::Rgb(255, 200, 120))
.bg(Color::Rgb(60, 40, 15)),
TokenKind::String => Style::default()
.fg(Color::Rgb(150, 230, 150))
.bg(Color::Rgb(20, 55, 20)),
TokenKind::Comment => Style::default()
.fg(Color::Rgb(100, 100, 100))
.bg(Color::Rgb(18, 18, 18)),
TokenKind::Keyword => Style::default()
.fg(Color::Rgb(230, 130, 230))
.bg(Color::Rgb(55, 25, 55)),
TokenKind::StackOp => Style::default()
.fg(Color::Rgb(130, 190, 240))
.bg(Color::Rgb(20, 40, 70)),
TokenKind::Operator => Style::default()
.fg(Color::Rgb(220, 220, 140))
.bg(Color::Rgb(45, 45, 20)),
TokenKind::Sound => Style::default()
.fg(Color::Rgb(100, 240, 220))
.bg(Color::Rgb(15, 60, 55)),
TokenKind::Param => Style::default()
.fg(Color::Rgb(190, 160, 240))
.bg(Color::Rgb(45, 30, 70)),
TokenKind::Context => Style::default()
.fg(Color::Rgb(240, 190, 120))
.bg(Color::Rgb(60, 45, 20)),
TokenKind::Note => Style::default()
.fg(Color::Rgb(120, 220, 170))
.bg(Color::Rgb(20, 55, 40)),
TokenKind::Interval => Style::default()
.fg(Color::Rgb(170, 220, 120))
.bg(Color::Rgb(35, 55, 20)),
TokenKind::Variable => Style::default()
.fg(Color::Rgb(220, 150, 190))
.bg(Color::Rgb(60, 30, 50)),
TokenKind::Vary => Style::default()
.fg(Color::Rgb(230, 230, 100))
.bg(Color::Rgb(55, 55, 15)),
TokenKind::Generator => Style::default()
.fg(Color::Rgb(100, 220, 180))
.bg(Color::Rgb(15, 55, 45)),
TokenKind::Default => Style::default()
.fg(Color::Rgb(160, 160, 160))
.bg(Color::Rgb(25, 25, 25)),
let (fg, bg) = match self {
TokenKind::Emit => syntax::EMIT,
TokenKind::Number => syntax::NUMBER,
TokenKind::String => syntax::STRING,
TokenKind::Comment => syntax::COMMENT,
TokenKind::Keyword => syntax::KEYWORD,
TokenKind::StackOp => syntax::STACK_OP,
TokenKind::Operator => syntax::OPERATOR,
TokenKind::Sound => syntax::SOUND,
TokenKind::Param => syntax::PARAM,
TokenKind::Context => syntax::CONTEXT,
TokenKind::Note => syntax::NOTE,
TokenKind::Interval => syntax::INTERVAL,
TokenKind::Variable => syntax::VARIABLE,
TokenKind::Vary => syntax::VARY,
TokenKind::Generator => syntax::GENERATOR,
TokenKind::Default => syntax::DEFAULT,
};
let style = Style::default().fg(fg).bg(bg);
if matches!(self, TokenKind::Emit) {
style.add_modifier(Modifier::BOLD)
} else {
style
}
}
pub fn gap_style() -> Style {
Style::default().bg(Color::Rgb(25, 25, 25))
Style::default().bg(syntax::GAP_BG)
}
}
@@ -231,9 +205,6 @@ pub fn highlight_line_with_runtime(
let tokens = tokenize_line(line);
let mut result = Vec::new();
let mut last_end = 0;
let executed_bg = Color::Rgb(40, 35, 50);
let selected_bg = Color::Rgb(80, 60, 20);
let gap_style = TokenKind::gap_style();
for token in tokens {
@@ -253,9 +224,9 @@ pub fn highlight_line_with_runtime(
style = style.add_modifier(Modifier::UNDERLINED);
}
if is_selected {
style = style.bg(selected_bg).add_modifier(Modifier::BOLD);
style = style.bg(syntax::SELECTED_BG).add_modifier(Modifier::BOLD);
} else if is_executed {
style = style.bg(executed_bg);
style = style.bg(syntax::EXECUTED_BG);
}
result.push((style, line[token.start..token.end].to_string()));