mirror of
https://github.com/sharkdp/bat
synced 2024-11-16 21:25:56 +00:00
Extract syntax finding to assets module
This commit is contained in:
parent
882931a77b
commit
247dfbee83
@ -6,7 +6,10 @@ use std::io;
|
|||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use syntect::dumps::{dump_to_file, from_binary, from_reader};
|
use syntect::dumps::{dump_to_file, from_binary, from_reader};
|
||||||
use syntect::highlighting::{Theme, ThemeSet};
|
use syntect::highlighting::{Theme, ThemeSet};
|
||||||
use syntect::parsing::SyntaxSet;
|
use syntect::parsing::{SyntaxDefinition, SyntaxSet};
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
use std::os::unix::fs::FileTypeExt;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref PROJECT_DIRS: ProjectDirs = ProjectDirs::from("", "", crate_name!());
|
static ref PROJECT_DIRS: ProjectDirs = ProjectDirs::from("", "", crate_name!());
|
||||||
@ -124,6 +127,34 @@ impl HighlightingAssets {
|
|||||||
)
|
)
|
||||||
})?)
|
})?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_syntax(
|
||||||
|
&self,
|
||||||
|
language: Option<&str>,
|
||||||
|
filename: Option<&str>,
|
||||||
|
) -> Result<&SyntaxDefinition> {
|
||||||
|
let syntax = match (language, filename) {
|
||||||
|
(Some(language), _) => self.syntax_set.find_syntax_by_token(language),
|
||||||
|
(None, Some(filename)) => {
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
let may_read_from_file = true;
|
||||||
|
|
||||||
|
// Do not peek at the file (to determine the syntax) if it is a FIFO because they can
|
||||||
|
// only be read once.
|
||||||
|
#[cfg(unix)]
|
||||||
|
let may_read_from_file = !fs::metadata(filename)?.file_type().is_fifo();
|
||||||
|
|
||||||
|
if may_read_from_file {
|
||||||
|
self.syntax_set.find_syntax_for_file(filename)?
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(None, None) => None,
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(syntax.unwrap_or_else(|| self.syntax_set.find_syntax_plain_text()))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn theme_set_path() -> PathBuf {
|
pub fn theme_set_path() -> PathBuf {
|
||||||
|
34
src/main.rs
34
src/main.rs
@ -30,17 +30,14 @@ use std::io::{self, BufRead, BufReader, Write};
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::{self, Child, Command, Stdio};
|
use std::process::{self, Child, Command, Stdio};
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
use std::os::unix::fs::FileTypeExt;
|
|
||||||
|
|
||||||
use ansi_term::Colour::{Fixed, Green, Red, White, Yellow};
|
use ansi_term::Colour::{Fixed, Green, Red, White, Yellow};
|
||||||
use ansi_term::Style;
|
use ansi_term::Style;
|
||||||
|
|
||||||
use syntect::easy::HighlightLines;
|
use syntect::easy::HighlightLines;
|
||||||
use syntect::highlighting::Theme;
|
use syntect::highlighting::Theme;
|
||||||
use syntect::parsing::SyntaxSet;
|
use syntect::parsing::SyntaxDefinition;
|
||||||
|
|
||||||
use app::{App, Config};
|
use app::App;
|
||||||
use assets::{config_dir, syntax_set_path, theme_set_path, HighlightingAssets};
|
use assets::{config_dir, syntax_set_path, theme_set_path, HighlightingAssets};
|
||||||
use diff::get_git_diff;
|
use diff::get_git_diff;
|
||||||
use printer::Printer;
|
use printer::Printer;
|
||||||
@ -124,9 +121,8 @@ impl Colors {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn print_file(
|
fn print_file(
|
||||||
config: &Config,
|
|
||||||
theme: &Theme,
|
theme: &Theme,
|
||||||
syntax_set: &SyntaxSet,
|
syntax: &SyntaxDefinition,
|
||||||
printer: &mut Printer,
|
printer: &mut Printer,
|
||||||
filename: Option<&str>,
|
filename: Option<&str>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
@ -137,27 +133,6 @@ fn print_file(
|
|||||||
Some(filename) => Box::new(BufReader::new(File::open(filename)?)),
|
Some(filename) => Box::new(BufReader::new(File::open(filename)?)),
|
||||||
};
|
};
|
||||||
|
|
||||||
let syntax = match (config.language, filename) {
|
|
||||||
(Some(language), _) => syntax_set.find_syntax_by_token(language),
|
|
||||||
(None, Some(filename)) => {
|
|
||||||
#[cfg(not(unix))]
|
|
||||||
let may_read_from_file = true;
|
|
||||||
|
|
||||||
// Do not peek at the file (to determine the syntax) if it is a FIFO because they can
|
|
||||||
// only be read once.
|
|
||||||
#[cfg(unix)]
|
|
||||||
let may_read_from_file = !fs::metadata(filename)?.file_type().is_fifo();
|
|
||||||
|
|
||||||
if may_read_from_file {
|
|
||||||
syntax_set.find_syntax_for_file(filename)?
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(None, None) => None,
|
|
||||||
};
|
|
||||||
|
|
||||||
let syntax = syntax.unwrap_or_else(|| syntax_set.find_syntax_plain_text());
|
|
||||||
let mut highlighter = HighlightLines::new(syntax, theme);
|
let mut highlighter = HighlightLines::new(syntax, theme);
|
||||||
|
|
||||||
printer.print_header(filename)?;
|
printer.print_header(filename)?;
|
||||||
@ -274,8 +249,9 @@ fn run() -> Result<()> {
|
|||||||
|
|
||||||
for file in &config.files {
|
for file in &config.files {
|
||||||
printer.line_changes = file.and_then(|filename| get_git_diff(filename));
|
printer.line_changes = file.and_then(|filename| get_git_diff(filename));
|
||||||
|
let syntax = assets.get_syntax(config.language, *file)?;
|
||||||
|
|
||||||
print_file(&config, theme, &assets.syntax_set, &mut printer, *file)?;
|
print_file(theme, &syntax, &mut printer, *file)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user