Skip to content
This repository has been archived by the owner on Feb 12, 2018. It is now read-only.

Commit

Permalink
Split theme set into separate thing
Browse files Browse the repository at this point in the history
  • Loading branch information
trishume committed Jun 13, 2016
1 parent 2a46c06 commit b9dde01
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 75 deletions.
3 changes: 2 additions & 1 deletion benches/highlighting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::*;
Expand All @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion examples/syncat.rs
Original file line number Diff line number Diff line change
@@ -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::*;
Expand All @@ -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());

Expand Down
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
74 changes: 2 additions & 72 deletions src/package_set.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -33,14 +31,6 @@ pub enum PackageError {
WalkDir(walkdir::Error),
Io(io::Error),
ParseSyntax(ParseSyntaxError),
ParseTheme(ParseThemeError),
ReadSettings(SettingsError),
}

impl From<SettingsError> for PackageError {
fn from(error: SettingsError) -> PackageError {
PackageError::ReadSettings(error)
}
}

impl From<IoError> for PackageError {
Expand All @@ -49,12 +39,6 @@ impl From<IoError> for PackageError {
}
}

impl From<ParseThemeError> for PackageError {
fn from(error: ParseThemeError) -> PackageError {
PackageError::ParseTheme(error)
}
}

impl From<ParseSyntaxError> for PackageError {
fn from(error: ParseSyntaxError) -> PackageError {
PackageError::ParseSyntax(error)
Expand Down Expand Up @@ -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<P: AsRef<Path>>(folder: P) -> Result<Vec<PathBuf>, 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.
///
Expand Down Expand Up @@ -223,20 +195,6 @@ impl PackageSet {
self.link_context(syntax, mut_ref.deref_mut());
}
}

fn read_file(path: &Path) -> Result<BufReader<File>, PackageError> {
let reader = try!(File::open(path));
Ok(BufReader::new(reader))
}

fn read_plist(path: &Path) -> Result<Settings, PackageError> {
Ok(try!(read_plist(try!(Self::read_file(path)))))
}

/// Loads a theme given a path to a .tmTheme file
pub fn get_theme<P: AsRef<Path>>(path: P) -> Result<Theme, PackageError> {
Ok(try!(Theme::parse_settings(try!(Self::read_plist(path.as_ref())))))
}
}

#[cfg(test)]
Expand All @@ -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);
}
}
3 changes: 2 additions & 1 deletion src/theme/highlighter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::*;
Expand All @@ -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());

Expand Down
101 changes: 101 additions & 0 deletions src/theme_set.rs
Original file line number Diff line number Diff line change
@@ -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<String, Theme>,
}

#[derive(Debug)]
pub enum ThemeSetError {
WalkDir(walkdir::Error),
Io(io::Error),
ParseTheme(ParseThemeError),
ReadSettings(SettingsError),
}

impl From<SettingsError> for ThemeSetError {
fn from(error: SettingsError) -> ThemeSetError {
ThemeSetError::ReadSettings(error)
}
}

impl From<IoError> for ThemeSetError {
fn from(error: IoError) -> ThemeSetError {
ThemeSetError::Io(error)
}
}

impl From<ParseThemeError> 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<P: AsRef<Path>>(folder: P) -> Result<Vec<PathBuf>, 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<BufReader<File>, ThemeSetError> {
let reader = try!(File::open(path));
Ok(BufReader::new(reader))
}

fn read_plist(path: &Path) -> Result<Settings, ThemeSetError> {
Ok(try!(read_plist(try!(Self::read_file(path)))))
}

/// Loads a theme given a path to a .tmTheme file
pub fn get_theme<P: AsRef<Path>>(path: P) -> Result<Theme, ThemeSetError> {
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);
}
}

0 comments on commit b9dde01

Please sign in to comment.