diff options
author | qkzk <qu3nt1n@gmail.com> | 2023-10-03 22:05:24 +0200 |
---|---|---|
committer | qkzk <qu3nt1n@gmail.com> | 2023-10-03 22:05:24 +0200 |
commit | 8756a0d61d636d7b00aeafa82c45cb9a3cda67ba (patch) | |
tree | ebbdaeb3bcd0e9a397d7ae713f19b090ee4759c2 | |
parent | 2fe1d7d8efc2fefbc560151777131efad6772c25 (diff) |
preview epub. Requires pandocv0.1.22-dev-ebook
-rw-r--r-- | Cargo.lock | 140 | ||||
-rw-r--r-- | development.md | 1 | ||||
-rw-r--r-- | src/preview.rs | 31 | ||||
-rw-r--r-- | src/term_manager.rs | 6 |
4 files changed, 119 insertions, 59 deletions
@@ -19,21 +19,20 @@ dependencies = [ [[package]] name = "aes" -version = "0.7.5" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", "cpufeatures", - "opaque-debug", ] [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" dependencies = [ "memchr", ] @@ -94,7 +93,7 @@ checksum = "b84f9ebcc6c1f5b8cb160f6990096a5c127f423fcb6e1ccc46c370cbdfb75dfc" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -248,11 +247,12 @@ dependencies = [ [[package]] name = "cipher" -version = "0.3.0" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "generic-array", + "crypto-common", + "inout", ] [[package]] @@ -295,7 +295,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -500,7 +500,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn", + "syn 1.0.109", ] [[package]] @@ -517,7 +517,7 @@ checksum = "086c685979a698443656e5cf7856c95c642295a38599f12fb1ff76fb28d19892" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -541,7 +541,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.9.3", - "syn", + "syn 1.0.109", ] [[package]] @@ -552,7 +552,7 @@ checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ "darling_core", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -573,7 +573,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -586,7 +586,7 @@ dependencies = [ "derive_builder_core", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -598,7 +598,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -963,7 +963,7 @@ checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1164,6 +1164,15 @@ dependencies = [ ] [[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] name = "instant" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1376,9 +1385,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memmap2" @@ -1577,12 +1586,6 @@ dependencies = [ ] [[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] name = "ordered-float" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1687,9 +1690,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1762,7 +1765,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1785,9 +1788,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.51" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1803,9 +1806,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.23" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1925,13 +1928,25 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-automata" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.5", ] [[package]] @@ -1941,6 +1956,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] name = "remove_dir_all" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2099,7 +2120,7 @@ checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2314,7 +2335,7 @@ dependencies = [ "quote", "serde", "serde_derive", - "syn", + "syn 1.0.109", ] [[package]] @@ -2330,7 +2351,7 @@ dependencies = [ "serde_derive", "serde_json", "sha1 0.6.1", - "syn", + "syn 1.0.109", ] [[package]] @@ -2382,7 +2403,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 1.0.109", ] [[package]] @@ -2403,6 +2424,17 @@ dependencies = [ ] [[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] name = "syntect" version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2416,7 +2448,7 @@ dependencies = [ "once_cell", "onig", "plist", - "regex-syntax", + "regex-syntax 0.6.28", "serde", "serde_derive", "serde_json", @@ -2496,22 +2528,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -2597,7 +2629,7 @@ dependencies = [ "proc-macro2", "quote", "standback", - "syn", + "syn 1.0.109", ] [[package]] @@ -2663,7 +2695,7 @@ checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2886,7 +2918,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -2908,7 +2940,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3232,9 +3264,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.4" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" [[package]] name = "yaml-rust" @@ -3247,9 +3279,9 @@ dependencies = [ [[package]] name = "zip" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0445d0fbc924bb93539b4316c11afb121ea39296f99a3c4c9edad09e3658cdef" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ "aes", "byteorder", diff --git a/development.md b/development.md index 33d79e4..5a73d7e 100644 --- a/development.md +++ b/development.md @@ -537,6 +537,7 @@ New view: Tree ! Toggle with 't', fold with 'z'. Navigate normally. - [x] remove doublons from shortcut (Ctrl+g) "goto mode" - [x] FIX: scrolling isn't smooth anymore - [x] InputSimple is responsible of its help lines +- [x] Preview epub. Requires pandoc. - [ ] while second window is opened, if the selection is below half screen, it's not shown anymore. Scroll to second element if needed diff --git a/src/preview.rs b/src/preview.rs index 2db36c8..db9b690 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -55,6 +55,7 @@ pub enum Preview { pub enum TextKind { HELP, LOG, + EPUB, #[default] TEXTFILE, } @@ -109,6 +110,9 @@ impl Preview { e if is_ext_doc(e) && is_program_in_path(PANDOC) => { Ok(Self::doc(&file_info.path).context("Preview: Couldn't parse doc")?) } + e if is_ext_epub(e) && is_program_in_path(PANDOC) => { + Ok(Self::epub(&file_info.path).context("Preview: Couldn't parse epub")?) + } e => match Self::preview_syntaxed(e, &file_info.path) { Some(syntaxed_preview) => Ok(syntaxed_preview), None => Self::preview_text_or_binary(file_info), @@ -203,6 +207,12 @@ impl Preview { Self::ColoredText(ColoredText::new(output)) } + pub fn epub(path: &Path) -> Result<Self> { + Ok(Self::Text( + TextContent::epub(path).context("Couldn't read epub")?, + )) + } + /// Empty preview, holding nothing. pub fn new_empty() -> Self { Self::Empty @@ -256,7 +266,7 @@ impl TextContent { const SIZE_LIMIT: usize = 1048576; fn help(help: &str) -> Self { - let content: Vec<String> = help.split('\n').map(|s| s.to_owned()).collect(); + let content: Vec<String> = help.lines().map(|line| line.to_owned()).collect(); Self { kind: TextKind::HELP, length: content.len(), @@ -272,6 +282,21 @@ impl TextContent { } } + fn epub(path: &Path) -> Option<Self> { + let path_str = path.to_str()?; + let output = execute_and_capture_output_without_check( + PANDOC, + &["-s", "-t", "plain", "--", path_str], + ) + .ok()?; + let content: Vec<String> = output.lines().map(|line| line.to_owned()).collect(); + Some(Self { + kind: TextKind::EPUB, + length: content.len(), + content, + }) + } + fn from_file(path: &Path) -> Result<Self> { let content = read_nb_lines(path, Self::SIZE_LIMIT)?; Ok(Self { @@ -1049,6 +1074,10 @@ fn is_ext_doc(ext: &str) -> bool { matches!(ext, "doc" | "docx" | "odt" | "sxw") } +fn is_ext_epub(ext: &str) -> bool { + ext == "epub" +} + fn catch_unwind_silent<F: FnOnce() -> R + panic::UnwindSafe, R>(f: F) -> std::thread::Result<R> { let prev_hook = panic::take_hook(); panic::set_hook(Box::new(|_| {})); diff --git a/src/term_manager.rs b/src/term_manager.rs index 95df8d2..d0f269e 100644 --- a/src/term_manager.rs +++ b/src/term_manager.rs @@ -264,13 +264,11 @@ impl<'a> WinMain<'a> { fn default_preview_first_line(&self, tab: &Tab) -> Vec<String> { match tab.path_content.selected() { Some(fileinfo) => { - let mut strings = vec![ - " Preview ".to_owned(), - format!(" {} ", fileinfo.path.to_string_lossy()), - ]; + let mut strings = vec![" Preview ".to_owned()]; if !tab.preview.is_empty() { strings.push(format!(" {} / {} ", tab.window.bottom, tab.preview.len())); }; + strings.push(format!(" {} ", fileinfo.path.to_string_lossy())); strings } None => vec!["".to_owned()], |