From b9dde01dc95363121a310d91a1c1248f6ed4bebd Mon Sep 17 00:00:00 2001 From: Tristan Hume Date: Mon, 13 Jun 2016 11:41:23 -0400 Subject: [PATCH] Split theme set into separate thing --- benches/highlighting.rs | 3 +- examples/syncat.rs | 3 +- src/lib.rs | 1 + src/package_set.rs | 74 +--------------------------- src/theme/highlighter.rs | 3 +- src/theme_set.rs | 101 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 110 insertions(+), 75 deletions(-) create mode 100644 src/theme_set.rs diff --git a/benches/highlighting.rs b/benches/highlighting.rs index 7c81707b..f4f0c3a0 100644 --- a/benches/highlighting.rs +++ b/benches/highlighting.rs @@ -5,6 +5,7 @@ extern crate syntect; use test::Bencher; use syntect::package_set::PackageSet; +use syntect::theme_set::ThemeSet; use syntect::scope::ScopeStack; use syntect::parser::*; use syntect::theme::highlighter::*; @@ -15,7 +16,7 @@ use std::io::Read; fn highlight_file(b: &mut Bencher, path_s: &str) { let ps = PackageSet::load_from_folder("testdata/Packages").unwrap(); - let highlighter = Highlighter::new(PackageSet::get_theme("testdata/spacegray/base16-ocean.\ + let highlighter = Highlighter::new(ThemeSet::get_theme("testdata/spacegray/base16-ocean.\ dark.tmTheme") .unwrap()); let path = Path::new(path_s); diff --git a/examples/syncat.rs b/examples/syncat.rs index 43ddc4e2..068e3c8c 100644 --- a/examples/syncat.rs +++ b/examples/syncat.rs @@ -1,6 +1,7 @@ extern crate syntect; use syntect::scope::ScopeStack; use syntect::package_set::PackageSet; +use syntect::theme_set::ThemeSet; use syntect::parser::*; use syntect::theme::highlighter::*; use syntect::theme::style::*; @@ -13,7 +14,7 @@ use std::fs::File; fn main() { let ps = PackageSet::load_defaults_nonewlines(); - let highlighter = Highlighter::new(PackageSet::get_theme("testdata/spacegray/base16-ocean.\ + let highlighter = Highlighter::new(ThemeSet::get_theme("testdata/spacegray/base16-ocean.\ dark.tmTheme") .unwrap()); diff --git a/src/lib.rs b/src/lib.rs index da331455..40144a97 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,6 +13,7 @@ extern crate flate2; pub mod syntax_definition; pub mod yaml_load; pub mod package_set; +pub mod theme_set; pub mod scope; pub mod parser; pub mod theme; diff --git a/src/package_set.rs b/src/package_set.rs index 8b59be3e..23e06507 100644 --- a/src/package_set.rs +++ b/src/package_set.rs @@ -1,11 +1,9 @@ use syntax_definition::*; use scope::*; use yaml_load::*; -use theme::theme::{Theme, ParseThemeError}; -use theme::settings::*; -use std::path::{Path, PathBuf}; -use std::io::{Error as IoError, BufReader}; +use std::path::{Path}; +use std::io::{Error as IoError}; use walkdir::WalkDir; use std::io::{self, Read}; use std::fs::File; @@ -33,14 +31,6 @@ pub enum PackageError { WalkDir(walkdir::Error), Io(io::Error), ParseSyntax(ParseSyntaxError), - ParseTheme(ParseThemeError), - ReadSettings(SettingsError), -} - -impl From for PackageError { - fn from(error: SettingsError) -> PackageError { - PackageError::ReadSettings(error) - } } impl From for PackageError { @@ -49,12 +39,6 @@ impl From for PackageError { } } -impl From for PackageError { - fn from(error: ParseThemeError) -> PackageError { - PackageError::ParseTheme(error) - } -} - impl From for PackageError { fn from(error: ParseSyntaxError) -> PackageError { PackageError::ParseSyntax(error) @@ -90,18 +74,6 @@ impl PackageSet { Ok(ps) } - /// Returns all the themes found in a folder, good for enumerating before loading one with get_theme - pub fn discover_themes>(folder: P) -> Result, PackageError> { - let mut themes = Vec::new(); - for entry in WalkDir::new(folder) { - let entry = try!(entry.map_err(|e| PackageError::WalkDir(e))); - if entry.path().extension().map(|e| e == "tmTheme").unwrap_or(false) { - themes.push(entry.path().to_owned()); - } - } - Ok(themes) - } - /// Loads all the .sublime-syntax files in a folder into this package set. /// It does not link the syntaxes, in case you want to serialize this package set. /// @@ -223,20 +195,6 @@ impl PackageSet { self.link_context(syntax, mut_ref.deref_mut()); } } - - fn read_file(path: &Path) -> Result, PackageError> { - let reader = try!(File::open(path)); - Ok(BufReader::new(reader)) - } - - fn read_plist(path: &Path) -> Result { - Ok(try!(read_plist(try!(Self::read_file(path))))) - } - - /// Loads a theme given a path to a .tmTheme file - pub fn get_theme>(path: P) -> Result { - Ok(try!(Theme::parse_settings(try!(Self::read_plist(path.as_ref()))))) - } } #[cfg(test)] @@ -258,32 +216,4 @@ mod tests { let count = context_iter(main_context.clone()).count(); assert_eq!(count, 91); } - #[test] - fn can_parse_common_themes() { - use package_set::PackageSet; - use theme::style::Color; - let theme_paths = PackageSet::discover_themes("testdata/themes.tmbundle").unwrap(); - for theme_path in theme_paths.iter() { - println!("{:?}", theme_path); - PackageSet::get_theme(theme_path).unwrap(); - } - - let theme = PackageSet::get_theme("testdata/themes.tmbundle/Themes/Amy.tmTheme").unwrap(); - assert_eq!(theme.name.unwrap(), "Amy"); - assert_eq!(theme.settings.selection.unwrap(), - Color { - r: 0x80, - g: 0x00, - b: 0x00, - a: 0x80, - }); - assert_eq!(theme.scopes[0].style.foreground.unwrap(), - Color { - r: 0x40, - g: 0x40, - b: 0x80, - a: 0xFF, - }); - // assert!(false); - } } diff --git a/src/theme/highlighter.rs b/src/theme/highlighter.rs index 87aba832..9264ea4b 100644 --- a/src/theme/highlighter.rs +++ b/src/theme/highlighter.rs @@ -136,6 +136,7 @@ impl Highlighter { #[cfg(test)] mod tests { use package_set::PackageSet; + use theme_set::ThemeSet; use scope::ScopeStack; use parser::*; use theme::highlighter::*; @@ -148,7 +149,7 @@ mod tests { let syntax = ps.find_syntax_by_name("Ruby on Rails").unwrap(); ParseState::new(syntax) }; - let highlighter = Highlighter::new(PackageSet::get_theme("testdata/themes.\ + let highlighter = Highlighter::new(ThemeSet::get_theme("testdata/themes.\ tmbundle/Themes/Amy.tmTheme") .unwrap()); diff --git a/src/theme_set.rs b/src/theme_set.rs new file mode 100644 index 00000000..2c7a4a02 --- /dev/null +++ b/src/theme_set.rs @@ -0,0 +1,101 @@ +use theme::theme::{Theme, ParseThemeError}; +use theme::settings::*; +use std::collections::BTreeMap; +use std::path::{Path, PathBuf}; +use std::io::{Error as IoError, BufReader}; +use walkdir::WalkDir; +use std::io::{self}; +use std::fs::File; +use walkdir; + +#[derive(Debug, RustcEncodable, RustcDecodable)] +pub struct ThemeSet { + themes: BTreeMap, +} + +#[derive(Debug)] +pub enum ThemeSetError { + WalkDir(walkdir::Error), + Io(io::Error), + ParseTheme(ParseThemeError), + ReadSettings(SettingsError), +} + +impl From for ThemeSetError { + fn from(error: SettingsError) -> ThemeSetError { + ThemeSetError::ReadSettings(error) + } +} + +impl From for ThemeSetError { + fn from(error: IoError) -> ThemeSetError { + ThemeSetError::Io(error) + } +} + +impl From for ThemeSetError { + fn from(error: ParseThemeError) -> ThemeSetError { + ThemeSetError::ParseTheme(error) + } +} + +impl ThemeSet { + /// Returns all the themes found in a folder, good for enumerating before loading one with get_theme + pub fn discover_theme_paths>(folder: P) -> Result, ThemeSetError> { + let mut themes = Vec::new(); + for entry in WalkDir::new(folder) { + let entry = try!(entry.map_err(|e| ThemeSetError::WalkDir(e))); + if entry.path().extension().map(|e| e == "tmTheme").unwrap_or(false) { + themes.push(entry.path().to_owned()); + } + } + Ok(themes) + } + + fn read_file(path: &Path) -> Result, ThemeSetError> { + let reader = try!(File::open(path)); + Ok(BufReader::new(reader)) + } + + fn read_plist(path: &Path) -> Result { + Ok(try!(read_plist(try!(Self::read_file(path))))) + } + + /// Loads a theme given a path to a .tmTheme file + pub fn get_theme>(path: P) -> Result { + Ok(try!(Theme::parse_settings(try!(Self::read_plist(path.as_ref()))))) + } +} + + +#[cfg(test)] +mod tests { + #[test] + fn can_parse_common_themes() { + use theme_set::ThemeSet; + use theme::style::Color; + let theme_paths = ThemeSet::discover_theme_paths("testdata/themes.tmbundle").unwrap(); + for theme_path in theme_paths.iter() { + println!("{:?}", theme_path); + ThemeSet::get_theme(theme_path).unwrap(); + } + + let theme = ThemeSet::get_theme("testdata/themes.tmbundle/Themes/Amy.tmTheme").unwrap(); + assert_eq!(theme.name.unwrap(), "Amy"); + assert_eq!(theme.settings.selection.unwrap(), + Color { + r: 0x80, + g: 0x00, + b: 0x00, + a: 0x80, + }); + assert_eq!(theme.scopes[0].style.foreground.unwrap(), + Color { + r: 0x40, + g: 0x40, + b: 0x80, + a: 0xFF, + }); + // assert!(false); + } +}