summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs1
-rw-r--r--src/preview.rs56
-rw-r--r--src/textview.rs33
3 files changed, 51 insertions, 39 deletions
diff --git a/src/main.rs b/src/main.rs
index 77a9e47..1823428 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -30,6 +30,7 @@ extern crate strum_macros;
#[macro_use]
extern crate derivative;
extern crate nix;
+extern crate strip_ansi_escapes;
extern crate osstrtools;
extern crate pathbuftools;
diff --git a/src/preview.rs b/src/preview.rs
index 1770ac4..2f1eebf 100644
--- a/src/preview.rs
+++ b/src/preview.rs
@@ -222,14 +222,6 @@ fn find_previewer(file: &File, g_mode: bool) -> HResult<ExtPreviewer> {
let path = crate::paths::previewers_path()?;
let ext = file.path.extension()?;
- // Special case to highlight text files that aren't text/plain
- if file.is_text() {
- let mut previewer = PathBuf::from(&path);
- previewer.push("definitions/");
- previewer.push("text");
- return Ok(ExtPreviewer::Text(previewer));
- }
-
// Try to find a graphical previewer first
if g_mode {
let g_previewer = path.read_dir()?
@@ -250,10 +242,22 @@ fn find_previewer(file: &File, g_mode: bool) -> HResult<ExtPreviewer> {
// Look for previewers matching the file extension
let previewer = path.read_dir()?
- .find(|previewer| previewer.as_ref()
+ .find(|previewer| previewer.as_ref()
.and_then(|p| Ok(p.file_name() == ext ))
.unwrap_or(false))
- .map(|p| p.map(|p| p.path()));
+ .map(|p| p.map(|p| p.path()));
+ match previewer {
+ Some(Ok(p)) => return Ok(ExtPreviewer::Text(p)),
+ _ => {
+ // Special case to highlight text files that aren't text/*
+ if file.is_text() {
+ let mut previewer = PathBuf::from(&path);
+ previewer.push("definitions/");
+ previewer.push("text");
+ return Ok(ExtPreviewer::Text(previewer));
+ }
+ }
+ }
Ok(ExtPreviewer::Text(previewer??))
}
@@ -415,24 +419,24 @@ impl Previewer {
&stale,
&animator)?);
}
- _ => {}
+ _ => {
+ let preview = Previewer::preview_external(&file,
+ &core,
+ &stale,
+ &animator);
+ if preview.is_ok() {
+ return Ok(preview?);
+ }
+ }
}
}
- let preview = Previewer::preview_external(&file,
- &core,
- &stale,
- &animator);
- if preview.is_ok() {
- return Ok(preview?);
- }
- else {
- let mut blank = TextView::new_blank(&core);
- blank.set_coordinates(&coordinates).log();
- blank.refresh().log();
- blank.animate_slide_up(Some(&animator)).log();
- return Ok(PreviewWidget::TextView(blank))
- }
+ let mut blank = TextView::new_blank(&core);
+ blank.set_coordinates(&coordinates).log();
+ blank.refresh().log();
+ blank.animate_slide_up(Some(&animator)).log();
+ return Ok(PreviewWidget::TextView(blank))
+
})))
}
@@ -551,8 +555,8 @@ impl Previewer {
match previewer {
ExtPreviewer::Text(previewer) => {
+ if stale.is_stale()? { return Previewer::preview_failed(&file) }
let lines = Previewer::run_external(previewer, file, stale);
-
if stale.is_stale()? { return Previewer::preview_failed(&file) }
let mut textview = TextView {
diff --git a/src/textview.rs b/src/textview.rs
index fa8a475..cd9a815 100644
--- a/src/textview.rs
+++ b/src/textview.rs
@@ -1,11 +1,14 @@
use std::io::{BufRead, BufReader};
+use strip_ansi_escapes::strip;
+
use crate::files::File;
use crate::term::sized_string_u;
use crate::widget::{Widget, WidgetCore};
-use crate::fail::HResult;
+use crate::fail::{HResult, HError};
use crate::dirty::Dirtyable;
+
#[derive(Debug, PartialEq)]
pub struct TextView {
pub lines: Vec<String>,
@@ -26,12 +29,14 @@ impl TextView {
pub fn new_from_file(core: &WidgetCore, file: &File) -> HResult<TextView> {
let file = std::fs::File::open(&file.path)?;
let file = std::io::BufReader::new(file);
- let lines = file.lines().map(|line|
- Ok(line?
- .replace("\t", " ")))
- .filter_map(|l: HResult<String>| l.ok())
- .collect();
-
+ let lines = file.lines()
+ .map(|line| line
+ .and_then(|l| strip(l))
+ .map_err(HError::from)
+ .and_then(|s| std::str::from_utf8(&s)
+ .map(|s| s.to_string())
+ .map_err(HError::from)))
+ .collect::<HResult<_>>()?;
Ok(TextView {
lines: lines,
core: core.clone(),
@@ -39,6 +44,7 @@ impl TextView {
offset: 0,
})
}
+
pub fn new_from_file_limit_lines(core: &WidgetCore,
file: &File,
num: usize) -> HResult<TextView> {
@@ -46,12 +52,13 @@ impl TextView {
let file = BufReader::new(file);
let lines = file.lines()
.take(num)
- .map(|line|
- Ok(line?
- .replace("\t", " ")))
- .filter_map(|l: HResult<String>| l.ok())
- .collect();
-
+ .map(|line| line
+ .and_then(|l| strip(l))
+ .map_err(HError::from)
+ .and_then(|s| std::str::from_utf8(&s)
+ .map(|s| s.to_string())
+ .map_err(HError::from)))
+ .collect::<HResult<_>>()?;
Ok(TextView {
lines: lines,
core: core.clone(),