From f6ee8fcd2e6f070347badeb7f1805159be6a1664 Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Sun, 9 Apr 2023 09:44:31 +0100 Subject: [PATCH] stash --- Cargo.lock | 10 +- Cargo.toml | 4 +- atuin-syntect/Cargo.toml | 15 +++ .../src}/default_nonewlines.packdump | Bin .../syntax/mod.rs => atuin-syntect/src/lib.rs | 118 +++++++++++++++++- atuin-syntect/src/style.rs | 61 +++++++++ src/command/client/search.rs | 1 - src/command/client/search/history_list.rs | 100 ++++++--------- src/command/client/search/interactive.rs | 63 ++-------- .../client/search/syntax/default.themedump | Bin 5035 -> 0 bytes .../search/syntax/default_newlines.packdump | Bin 44254 -> 0 bytes 11 files changed, 252 insertions(+), 120 deletions(-) create mode 100644 atuin-syntect/Cargo.toml rename {src/command/client/search/syntax => atuin-syntect/src}/default_nonewlines.packdump (100%) rename src/command/client/search/syntax/mod.rs => atuin-syntect/src/lib.rs (63%) create mode 100644 atuin-syntect/src/style.rs delete mode 100644 src/command/client/search/syntax/default.themedump delete mode 100644 src/command/client/search/syntax/default_newlines.packdump diff --git a/Cargo.lock b/Cargo.lock index fee7519d..022be060 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -82,6 +82,7 @@ dependencies = [ "atuin-client", "atuin-common", "atuin-server", + "atuin-syntect", "base64 0.20.0", "bitflags", "cassowary", @@ -105,7 +106,6 @@ dependencies = [ "semver", "serde", "serde_json", - "syntect", "tiny-bip39", "tokio", "tracing-subscriber", @@ -189,6 +189,14 @@ dependencies = [ "whoami", ] +[[package]] +name = "atuin-syntect" +version = "14.0.0" +dependencies = [ + "once_cell", + "syntect", +] + [[package]] name = "autocfg" version = "1.1.0" diff --git a/Cargo.toml b/Cargo.toml index a7818561..588f1de3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ buildflags = ["--release"] atuin = { path = "/usr/bin/atuin" } [workspace] -members = ["./atuin-client", "./atuin-server", "./atuin-common"] +members = ["./atuin-client", "./atuin-server", "./atuin-common", "./atuin-syntect"] [features] # TODO(conradludgate) @@ -47,6 +47,7 @@ server = ["atuin-server", "tracing-subscriber"] atuin-server = { path = "atuin-server", version = "14.0.0", optional = true } atuin-client = { path = "atuin-client", version = "14.0.0", optional = true, default-features = false } atuin-common = { path = "atuin-common", version = "14.0.0" } +atuin-syntect = { path = "atuin-syntect", version = "14.0.0" } log = "0.4" env_logger = "0.10.0" @@ -74,7 +75,6 @@ tiny-bip39 = "1" futures-util = "0.3" fuzzy-matcher = "0.3.7" colored = "2.0.0" -syntect = { version = "5.0.0", default-features = false, features = ["dump-load", "parsing", "regex-fancy"] } # ratatui bitflags = "1.3" diff --git a/atuin-syntect/Cargo.toml b/atuin-syntect/Cargo.toml new file mode 100644 index 00000000..0b08b4f4 --- /dev/null +++ b/atuin-syntect/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "atuin-syntect" +version = "14.0.0" +authors = ["Ellie Huxtable "] +edition = "2018" +license = "MIT" +description = "common library for atuin" +homepage = "https://atuin.sh" +repository = "https://github.com/ellie/atuin" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +syntect = { version = "5.0.0", default-features = false, features = ["dump-load", "parsing", "regex-fancy"] } +once_cell = "1" diff --git a/src/command/client/search/syntax/default_nonewlines.packdump b/atuin-syntect/src/default_nonewlines.packdump similarity index 100% rename from src/command/client/search/syntax/default_nonewlines.packdump rename to atuin-syntect/src/default_nonewlines.packdump diff --git a/src/command/client/search/syntax/mod.rs b/atuin-syntect/src/lib.rs similarity index 63% rename from src/command/client/search/syntax/mod.rs rename to atuin-syntect/src/lib.rs index dcdb76c1..d9bf090e 100644 --- a/src/command/client/search/syntax/mod.rs +++ b/atuin-syntect/src/lib.rs @@ -1,6 +1,120 @@ -use syntect::parsing::{ParseScopeError, Scope}; +use once_cell::sync::OnceCell; +use syntect::{ + dumps::from_uncompressed_data, + parsing::{ + BasicScopeStackOp, ParseScopeError, Scope, ScopeStack, ScopeStackOp, SyntaxReference, + SyntaxSet, + }, +}; -use crate::ratatui::style::{Color, Style}; +mod style; +pub use style::*; + +impl Theme { + // this is a manual/simpler implementation of + // syntect::highlight::HighlightIterator + // to use a custom theme using `ratatui::Style`. + // This is so we don't have to care about RGB and can instead use + // terminal colours + pub fn highlight(&self, h: &str, parsed: &ParsedSyntax, draw: &mut dyn FnMut(&str, Style)) { + let mut stack = ScopeStack::default(); + let mut styles: Vec<(f64, Style)> = vec![]; + for (line, parsed_line) in h.lines().zip(parsed) { + draw("", Style::default()); + + let mut last = 0; + for &(index, ref op) in parsed_line { + let style = styles.last().copied().unwrap_or_default().1; + stack + .apply_with_hook(op, |op, stack| { + highlight_hook(&op, stack, &self.rules, &mut styles); + }) + .unwrap(); + + draw(&line[last..index], style); + last = index; + } + let style = styles.last().copied().unwrap_or_default().1; + draw(&line[last..], style); + } + } +} + +#[allow(clippy::cast_possible_truncation)] +fn highlight_hook( + op: &BasicScopeStackOp, + stack: &[Scope], + rules: &[ThemeRule], + styles: &mut Vec<(f64, Style)>, +) { + match op { + BasicScopeStackOp::Push(scope) => { + let mut scored_style = styles + .last() + .copied() + .unwrap_or_else(|| (-1.0, Style::default())); + + for rule in rules.iter().filter(|a| a.scope.is_prefix_of(*scope)) { + let single_score = + f64::from(rule.scope.len()) * f64::from(3 * ((stack.len() - 1) as u32)).exp2(); + + if single_score > scored_style.0 { + scored_style.0 = single_score; + scored_style.1 = rule.style; + } + } + + styles.push(scored_style); + } + BasicScopeStackOp::Pop => { + styles.pop(); + } + } +} + +pub fn get_syntax() -> ShellSyntax<'static> { + static SYNTAX: OnceCell = OnceCell::new(); + let syntax = SYNTAX.get_or_init(|| { + from_uncompressed_data(include_bytes!("default_nonewlines.packdump")).unwrap() + }); + ShellSyntax { + syntax, + sh: syntax.find_syntax_by_extension("sh").unwrap(), + fish: syntax.find_syntax_by_extension("fish").unwrap(), + nu: syntax.find_syntax_by_extension("nu").unwrap(), + } +} + +#[derive(Clone, Copy)] +pub struct ShellSyntax<'s> { + syntax: &'s SyntaxSet, + sh: &'s SyntaxReference, + fish: &'s SyntaxReference, + nu: &'s SyntaxReference, +} +pub type ParsedSyntax = Vec>; + +impl ShellSyntax<'_> { + pub fn parse_shell(self, h: &str) -> ParsedSyntax { + let mut sh = syntect::parsing::ParseState::new(self.sh); + let mut fish = syntect::parsing::ParseState::new(self.fish); + let mut nu = syntect::parsing::ParseState::new(self.nu); + + let mut lines = vec![]; + for line in h.lines() { + if let Ok(line) = sh.parse_line(line, self.syntax) { + lines.push(line); + } else if let Ok(line) = fish.parse_line(line, self.syntax) { + lines.push(line); + } else if let Ok(line) = nu.parse_line(line, self.syntax) { + lines.push(line); + } else { + lines.push(Vec::new()); + } + } + lines + } +} pub struct Theme { pub rules: Vec, diff --git a/atuin-syntect/src/style.rs b/atuin-syntect/src/style.rs new file mode 100644 index 00000000..5e23534e --- /dev/null +++ b/atuin-syntect/src/style.rs @@ -0,0 +1,61 @@ +//! `style` contains the primitives used to control how your user interface will look. + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Color { + Black, + Red, + Green, + Yellow, + Blue, + Magenta, + Cyan, + Gray, + DarkGray, + LightRed, + LightGreen, + LightYellow, + LightBlue, + LightMagenta, + LightCyan, + White, + Rgb(u8, u8, u8), +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub struct Style { + pub fg: Option, + pub bg: Option, +} + +impl Style { + /// Changes the foreground color. + /// + /// ## Examples + /// + /// ```rust + /// # use ratatui::style::{Color, Style}; + /// let style = Style::default().fg(Color::Blue); + /// let diff = Style::default().fg(Color::Red); + /// assert_eq!(style.patch(diff), Style::default().fg(Color::Red)); + /// ``` + pub fn fg(mut self, color: Color) -> Style { + self.fg = Some(color); + self + } + + /// Changes the background color. + /// + /// ## Examples + /// + /// ```rust + /// # use ratatui::style::{Color, Style}; + /// let style = Style::default().bg(Color::Blue); + /// let diff = Style::default().bg(Color::Red); + /// assert_eq!(style.patch(diff), Style::default().bg(Color::Red)); + /// ``` + pub fn bg(mut self, color: Color) -> Style { + self.bg = Some(color); + self + } +} diff --git a/src/command/client/search.rs b/src/command/client/search.rs index 419147df..f125b8bf 100644 --- a/src/command/client/search.rs +++ b/src/command/client/search.rs @@ -16,7 +16,6 @@ mod duration; mod engines; mod history_list; mod interactive; -mod syntax; pub use duration::{format_duration, format_duration_into}; #[allow(clippy::struct_excessive_bools)] diff --git a/src/command/client/search/history_list.rs b/src/command/client/search/history_list.rs index d1ecaf16..c99cc3f5 100644 --- a/src/command/client/search/history_list.rs +++ b/src/command/client/search/history_list.rs @@ -7,13 +7,9 @@ use crate::ratatui::{ widgets::{Block, StatefulWidget, Widget}, }; use atuin_client::history::History; -use syntect::parsing::{BasicScopeStackOp, Scope, ScopeStack}; +use atuin_syntect::{ParsedSyntax, Theme}; -use super::{ - format_duration, - interactive::ParsedSyntax, - syntax::{Theme, ThemeRule}, -}; +use super::format_duration; pub struct HistoryList<'a> { history: &'a [History], @@ -176,39 +172,22 @@ impl DrawState<'_> { let selected = self.y as usize + self.state.offset == self.state.selected; let with_select = move |style: Style| { if selected { - style.bg(theme.selection).add_modifier(Modifier::BOLD) + style + .bg(map_color(theme.selection)) + .add_modifier(Modifier::BOLD) } else { style } }; if let Some(parsed) = parsed { - // this is a manual/simpler implementation of - // syntect::highlight::HighlightIterator - // to use a custom theme using `ratatui::Style`. - // This is so we don't have to care about RGB and can instead use - // terminal colours - - let mut stack = ScopeStack::default(); - let mut styles: Vec<(f64, Style)> = vec![]; - for (line, parsed_line) in h.command.lines().zip(parsed) { - self.x += 1; - - let mut last = 0; - for &(index, ref op) in parsed_line { - let style = styles.last().copied().unwrap_or_default().1; - stack - .apply_with_hook(op, |op, stack| { - highlight_hook(&op, stack, &theme.rules, &mut styles); - }) - .unwrap(); - - self.draw(&line[last..index], with_select(style)); - last = index; + theme.highlight(&h.command, parsed, &mut |t, style| { + if t.is_empty() { + self.x += 1; + } else { + self.draw(t, with_select(map_style(style))); } - let style = styles.last().copied().unwrap_or_default().1; - self.draw(&line[last..], with_select(style)); - } + }); } else { let style = with_select(Style::default()); for section in h.command.split_ascii_whitespace() { @@ -231,34 +210,33 @@ impl DrawState<'_> { } } -#[allow(clippy::cast_possible_truncation)] -fn highlight_hook( - op: &BasicScopeStackOp, - stack: &[Scope], - rules: &[ThemeRule], - styles: &mut Vec<(f64, Style)>, -) { - match op { - BasicScopeStackOp::Push(scope) => { - let mut scored_style = styles - .last() - .copied() - .unwrap_or_else(|| (-1.0, Style::default())); - - for rule in rules.iter().filter(|a| a.scope.is_prefix_of(*scope)) { - let single_score = - f64::from(rule.scope.len()) * f64::from(3 * ((stack.len() - 1) as u32)).exp2(); - - if single_score > scored_style.0 { - scored_style.0 = single_score; - scored_style.1 = rule.style; - } - } - - styles.push(scored_style); - } - BasicScopeStackOp::Pop => { - styles.pop(); - } +fn map_color(c: atuin_syntect::Color) -> Color { + match c { + atuin_syntect::Color::Black => Color::Black, + atuin_syntect::Color::Red => Color::Red, + atuin_syntect::Color::Green => Color::Green, + atuin_syntect::Color::Yellow => Color::Yellow, + atuin_syntect::Color::Blue => Color::Blue, + atuin_syntect::Color::Magenta => Color::Magenta, + atuin_syntect::Color::Cyan => Color::Cyan, + atuin_syntect::Color::Gray => Color::Gray, + atuin_syntect::Color::DarkGray => Color::DarkGray, + atuin_syntect::Color::LightRed => Color::LightRed, + atuin_syntect::Color::LightGreen => Color::LightGreen, + atuin_syntect::Color::LightYellow => Color::LightYellow, + atuin_syntect::Color::LightBlue => Color::LightBlue, + atuin_syntect::Color::LightMagenta => Color::LightMagenta, + atuin_syntect::Color::LightCyan => Color::LightCyan, + atuin_syntect::Color::White => Color::White, + atuin_syntect::Color::Rgb(r, g, b) => Color::Rgb(r, g, b), + } +} + +fn map_style(c: atuin_syntect::Style) -> Style { + Style { + fg: c.fg.map(map_color), + bg: c.bg.map(map_color), + add_modifier: Modifier::empty(), + sub_modifier: Modifier::empty(), } } diff --git a/src/command/client/search/interactive.rs b/src/command/client/search/interactive.rs index 1db2ff25..e4ae5ba8 100644 --- a/src/command/client/search/interactive.rs +++ b/src/command/client/search/interactive.rs @@ -4,6 +4,7 @@ use std::{ time::Duration, }; +use atuin_syntect::{ParsedSyntax, Theme, ShellSyntax, get_syntax, get_theme}; use crossterm::{ event::{self, Event, KeyCode, KeyEvent, KeyModifiers, MouseEvent}, execute, terminal, @@ -11,11 +12,10 @@ use crossterm::{ use eyre::Result; use futures_util::FutureExt; use semver::Version; -use syntect::{ - dumps::{from_binary, from_uncompressed_data}, - highlighting::Highlighter, - parsing::{ScopeStackOp, SyntaxReference, SyntaxSet}, -}; +// use syntect::{ +// dumps::from_uncompressed_data, +// parsing::{ScopeStackOp, SyntaxReference, SyntaxSet}, +// }; use unicode_width::UnicodeWidthStr; use atuin_client::{ @@ -28,11 +28,9 @@ use super::{ cursor::Cursor, engines::{SearchEngine, SearchState}, history_list::{HistoryList, ListState, PREFIX_LENGTH}, - syntax::Theme, }; use crate::{command::client::search::engines, VERSION}; use crate::{ - command::client::search::syntax::get_theme, ratatui::{ backend::{Backend, CrosstermBackend}, layout::{Alignment, Constraint, Direction, Layout}, @@ -46,9 +44,8 @@ use crate::{ const RETURN_ORIGINAL: usize = usize::MAX; const RETURN_QUERY: usize = usize::MAX - 1; -pub type ParsedSyntax = Vec>; -struct State<'s> { +struct State { history_count: i64, update_needed: Option, results_state: ListState, @@ -61,17 +58,17 @@ struct State<'s> { // highlighting results_parsed: HashMap, theme: Theme, - syntax: ShellSyntax<'s>, + syntax: ShellSyntax<'static>, } -impl State<'_> { +impl State { async fn query_results(&mut self, db: &mut dyn Database) -> Result> { let results = self.engine.query(&self.search, db).await?; self.results_state.select(0); for h in &results { self.results_parsed .entry(h.id.clone()) - .or_insert_with(|| parse_shell(h, self.syntax)); + .or_insert_with(|| self.syntax.parse_shell(&h.command)); } Ok(results) } @@ -534,14 +531,6 @@ pub async fn history( let history_count = db.history_count().await?; - let syntax: SyntaxSet = - from_uncompressed_data(include_bytes!("syntax/default_nonewlines.packdump")).unwrap(); - // let themes: ThemeSet = from_binary(include_bytes!("syntax/default.themedump")); - // let highlighter = Highlighter::new(&themes.themes["base16-ocean.dark"]); - - // let syntax = SyntaxSet::load_defaults_nonewlines(); - // let mut themes = ThemeSet::load_defaults(); - let mut app = State { history_count, results_state: ListState::default(), @@ -563,12 +552,7 @@ pub async fn history( results_parsed: HashMap::new(), theme: get_theme().unwrap(), - syntax: ShellSyntax { - syntaxs: &syntax, - sh: syntax.find_syntax_by_extension("sh").unwrap(), - fish: syntax.find_syntax_by_extension("fish").unwrap(), - nu: syntax.find_syntax_by_extension("nu").unwrap(), - }, + syntax: get_syntax(), }; // let mut hi = HighlightLines::new(syntax, &ts.themes["base16-ocean.dark"]); @@ -638,30 +622,3 @@ pub async fn history( res } -#[derive(Clone, Copy)] -struct ShellSyntax<'s> { - syntaxs: &'s SyntaxSet, - sh: &'s SyntaxReference, - fish: &'s SyntaxReference, - nu: &'s SyntaxReference, -} - -fn parse_shell(h: &History, syntax: ShellSyntax<'_>) -> ParsedSyntax { - let mut sh = syntect::parsing::ParseState::new(syntax.sh); - let mut fish = syntect::parsing::ParseState::new(syntax.fish); - let mut nu = syntect::parsing::ParseState::new(syntax.nu); - - let mut lines = vec![]; - for line in h.command.lines() { - if let Ok(line) = sh.parse_line(line, syntax.syntaxs) { - lines.push(line); - } else if let Ok(line) = fish.parse_line(line, syntax.syntaxs) { - lines.push(line); - } else if let Ok(line) = nu.parse_line(line, syntax.syntaxs) { - lines.push(line); - } else { - lines.push(Vec::new()); - } - } - lines -} diff --git a/src/command/client/search/syntax/default.themedump b/src/command/client/search/syntax/default.themedump deleted file mode 100644 index a5ed231ae6c1ab3f1311b033b710f663ad315dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5035 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
61jm!)6h33}7z1q+I+s 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