Major restructuring of theme/syntax handling

pull/875/head
sharkdp 4 years ago committed by David Peter
parent b1b8addf7e
commit 06b7be7ee9

@ -29,7 +29,7 @@ fn main() {
theme: "1337".into(),
..Default::default()
};
let assets = HighlightingAssets::new();
let assets = HighlightingAssets::from_binary();
Controller::new(&config, &assets).run().expect("no errors");
}

@ -1,15 +1,12 @@
use std::borrow::Cow;
use std::collections::BTreeMap;
use std::fs::{self, File};
use std::io::BufReader;
use std::path::{Path, PathBuf};
use std::path::Path;
use syntect::dumps::{dump_to_file, from_binary, from_reader};
use syntect::highlighting::{Theme, ThemeSet};
use syntect::parsing::{SyntaxReference, SyntaxSet, SyntaxSetBuilder};
use crate::dirs::PROJECT_DIRS;
use crate::errors::*;
use crate::inputfile::{InputFile, InputFileReader};
use crate::syntax_mapping::SyntaxMapping;
@ -23,13 +20,7 @@ pub struct HighlightingAssets {
}
impl HighlightingAssets {
pub fn new() -> Self {
Self::from_cache().unwrap_or_else(|_| Self::from_binary())
}
pub fn from_files(dir: Option<&Path>, start_empty: bool) -> Result<Self> {
let source_dir = dir.unwrap_or_else(|| PROJECT_DIRS.config_dir());
pub fn from_files(source_dir: &Path, start_empty: bool) -> Result<Self> {
let mut theme_set = if start_empty {
ThemeSet {
themes: BTreeMap::new(),
@ -72,12 +63,11 @@ impl HighlightingAssets {
})
}
fn from_cache() -> Result<Self> {
let theme_set_path = theme_set_path();
let syntax_set_file = File::open(&syntax_set_path()).chain_err(|| {
pub fn from_cache(theme_set_path: &Path, syntax_set_path: &Path) -> Result<Self> {
let syntax_set_file = File::open(syntax_set_path).chain_err(|| {
format!(
"Could not load cached syntax set '{}'",
syntax_set_path().to_string_lossy()
syntax_set_path.to_string_lossy()
)
})?;
let syntax_set: SyntaxSet = from_reader(BufReader::new(syntax_set_file))
@ -106,7 +96,7 @@ impl HighlightingAssets {
from_binary(include_bytes!("../assets/themes.bin"))
}
fn from_binary() -> Self {
pub fn from_binary() -> Self {
let syntax_set = Self::get_integrated_syntaxset();
let theme_set = Self::get_integrated_themeset();
@ -116,8 +106,7 @@ impl HighlightingAssets {
}
}
pub fn save(&self, dir: Option<&Path>) -> Result<()> {
let target_dir = dir.unwrap_or_else(|| PROJECT_DIRS.cache_dir());
pub fn save(&self, target_dir: &Path) -> Result<()> {
let _ = fs::create_dir_all(target_dir);
let theme_set_path = target_dir.join("themes.bin");
let syntax_set_path = target_dir.join("syntaxes.bin");
@ -203,30 +192,4 @@ impl HighlightingAssets {
syntax.unwrap_or_else(|| self.syntax_set.find_syntax_plain_text())
}
}
fn theme_set_path() -> PathBuf {
PROJECT_DIRS.cache_dir().join("themes.bin")
}
fn syntax_set_path() -> PathBuf {
PROJECT_DIRS.cache_dir().join("syntaxes.bin")
}
pub fn config_dir() -> Cow<'static, str> {
PROJECT_DIRS.config_dir().to_string_lossy()
}
pub fn cache_dir() -> Cow<'static, str> {
PROJECT_DIRS.cache_dir().to_string_lossy()
}
pub fn clear_assets() {
print!("Clearing theme set cache ... ");
fs::remove_file(theme_set_path()).ok();
println!("okay");
print!("Clearing syntax set cache ... ");
fs::remove_file(syntax_set_path()).ok();
println!("okay");
}
}

@ -0,0 +1,37 @@
use std::borrow::Cow;
use std::fs;
use std::path::PathBuf;
use crate::directories::PROJECT_DIRS;
use bat::assets::HighlightingAssets;
fn theme_set_path() -> PathBuf {
PROJECT_DIRS.cache_dir().join("themes.bin")
}
fn syntax_set_path() -> PathBuf {
PROJECT_DIRS.cache_dir().join("syntaxes.bin")
}
pub fn config_dir() -> Cow<'static, str> {
PROJECT_DIRS.config_dir().to_string_lossy()
}
pub fn cache_dir() -> Cow<'static, str> {
PROJECT_DIRS.cache_dir().to_string_lossy()
}
pub fn clear_assets() {
print!("Clearing theme set cache ... ");
fs::remove_file(theme_set_path()).ok();
println!("okay");
print!("Clearing syntax set cache ... ");
fs::remove_file(syntax_set_path()).ok();
println!("okay");
}
pub fn assets_from_cache_or_binary() -> HighlightingAssets {
HighlightingAssets::from_cache(&theme_set_path(), &syntax_set_path()).unwrap_or(HighlightingAssets::from_binary())
}

@ -5,7 +5,7 @@ use std::path::PathBuf;
use shell_words;
use bat::dirs::PROJECT_DIRS;
use crate::directories::PROJECT_DIRS;
pub fn config_file() -> PathBuf {
env::var("BAT_CONFIG_PATH")

@ -1,7 +1,9 @@
use crate::dirs_rs;
use std::env;
use std::path::{Path, PathBuf};
use dirs;
use lazy_static::lazy_static;
/// Wrapper for 'dirs' that treats MacOS more like Linux, by following the XDG specification.
/// This means that the `XDG_CACHE_HOME` and `XDG_CONFIG_HOME` environment variables are
/// checked first. The fallback directories are `~/.cache/bat` and `~/.config/bat`, respectively.
@ -18,10 +20,10 @@ impl BatProjectDirs {
let config_dir_op = env::var_os("XDG_CONFIG_HOME")
.map(PathBuf::from)
.filter(|p| p.is_absolute())
.or_else(|| dirs_rs::home_dir().map(|d| d.join(".config")));
.or_else(|| dirs::home_dir().map(|d| d.join(".config")));
#[cfg(not(target_os = "macos"))]
let config_dir_op = dirs_rs::config_dir();
let config_dir_op = dirs::config_dir();
let config_dir = config_dir_op.map(|d| d.join("bat"))?;
@ -42,10 +44,10 @@ impl BatProjectDirs {
let cache_dir_op = env::var_os("XDG_CACHE_HOME")
.map(PathBuf::from)
.filter(|p| p.is_absolute())
.or_else(|| dirs_rs::home_dir().map(|d| d.join(".cache")));
.or_else(|| dirs::home_dir().map(|d| d.join(".cache")));
#[cfg(not(target_os = "macos"))]
let cache_dir_op = dirs_rs::cache_dir();
let cache_dir_op = dirs::cache_dir();
cache_dir_op.map(|d| d.join("bat"))
}

@ -4,9 +4,13 @@
#[macro_use]
extern crate clap;
extern crate dirs as dirs_rs;
mod app;
mod clap_app;
mod config;
mod directories;
mod assets;
use std::collections::HashSet;
use std::ffi::OsStr;
@ -19,10 +23,12 @@ use ansi_term::Colour::Green;
use ansi_term::Style;
use crate::{app::App, config::config_file};
use directories::PROJECT_DIRS;
use assets::{cache_dir, clear_assets, config_dir, assets_from_cache_or_binary};
use bat::controller::Controller;
use bat::{
assets::{cache_dir, clear_assets, config_dir, HighlightingAssets},
assets::HighlightingAssets,
errors::*,
inputfile::InputFile,
style::{OutputComponent, OutputComponents},
@ -31,8 +37,8 @@ use bat::{
fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
if matches.is_present("build") {
let source_dir = matches.value_of("source").map(Path::new);
let target_dir = matches.value_of("target").map(Path::new);
let source_dir = matches.value_of("source").map(Path::new).unwrap_or_else(|| PROJECT_DIRS.config_dir());
let target_dir = matches.value_of("target").map(Path::new).unwrap_or_else(|| PROJECT_DIRS.cache_dir());
let blank = matches.is_present("blank");
@ -46,7 +52,7 @@ fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
}
pub fn list_languages(config: &Config) -> Result<()> {
let assets = HighlightingAssets::new();
let assets = assets_from_cache_or_binary();
let mut languages = assets
.syntax_set
.syntaxes()
@ -109,7 +115,7 @@ pub fn list_languages(config: &Config) -> Result<()> {
}
pub fn list_themes(cfg: &Config) -> Result<()> {
let assets = HighlightingAssets::new();
let assets = assets_from_cache_or_binary();
let themes = &assets.theme_set.themes;
let mut config = cfg.clone();
let mut style = HashSet::new();
@ -141,7 +147,7 @@ pub fn list_themes(cfg: &Config) -> Result<()> {
}
fn run_controller(config: &Config) -> Result<bool> {
let assets = HighlightingAssets::new();
let assets = assets_from_cache_or_binary();
let controller = Controller::new(&config, &assets);
controller.run()
}

@ -4,9 +4,6 @@
#[macro_use]
extern crate error_chain;
#[macro_use]
extern crate lazy_static;
extern crate ansi_term;
extern crate atty;
extern crate console;
@ -22,7 +19,6 @@ pub mod assets;
pub mod controller;
mod decorations;
mod diff;
pub mod dirs;
pub mod inputfile;
mod less;
pub mod line_range;

@ -6,20 +6,22 @@ pub struct LineRange {
pub upper: usize,
}
impl LineRange {
pub fn from(range_raw: &str) -> Result<LineRange> {
LineRange::parse_range(range_raw)
}
pub fn new() -> LineRange {
impl Default for LineRange {
fn default() -> LineRange {
LineRange {
lower: usize::min_value(),
upper: usize::max_value(),
}
}
}
impl LineRange {
pub fn from(range_raw: &str) -> Result<LineRange> {
LineRange::parse_range(range_raw)
}
pub fn parse_range(range_raw: &str) -> Result<LineRange> {
let mut new_range = LineRange::new();
let mut new_range = LineRange::default();
if range_raw.bytes().nth(0).ok_or("Empty line range")? == b':' {
new_range.upper = range_raw[1..].parse()?;
@ -103,12 +105,18 @@ pub enum RangeCheckResult {
AfterLastRange,
}
#[derive(Debug, Clone, Default)]
#[derive(Debug, Clone)]
pub struct LineRanges {
ranges: Vec<LineRange>,
largest_upper_bound: usize,
}
impl Default for LineRanges {
fn default() -> Self {
LineRanges::from(vec![LineRange { lower: 0, upper: 0 }])
}
}
impl LineRanges {
pub fn from(ranges: Vec<LineRange>) -> LineRanges {
let largest_upper_bound = ranges

@ -19,7 +19,7 @@ fn no_duplicate_extensions() {
"sass",
];
let assets = HighlightingAssets::new();
let assets = HighlightingAssets::from_binary();
let mut extensions = HashSet::new();

@ -18,7 +18,7 @@ struct SyntaxDetectionTest {
impl SyntaxDetectionTest {
fn new() -> Self {
SyntaxDetectionTest {
assets: HighlightingAssets::new(),
assets: HighlightingAssets::from_binary(),
syntax_mapping: SyntaxMapping::new(),
temp_dir: TempDir::new("bat_syntax_detection_tests")
.expect("creation of temporary directory"),

Loading…
Cancel
Save