added rudementary page turning. Updated description. Previous pages unavailable, next goal in mind.

This commit is contained in:
Daniel 2023-11-18 16:07:44 +00:00
parent bdb41ccbd2
commit 7e29e89a78
3 changed files with 137 additions and 71 deletions

1
Dracula_bookmark Normal file
View File

@ -0,0 +1 @@
10

View File

@ -1,8 +1,76 @@
# Bibliofile
### A TUI-based ebook reader that hopefully doesn't suck!
### A TUI-based ebook reader inspired by NCurses-era programs!
A long long time ago, I was in college. I frequently bought the ebook versions of my textbooks, but to my dismay...most ebook readers sucked. The user interface was complicated, dark mode was unavailable for most readers until I neared graduation, dark mode usually looked terrible even if it was available, etc. I hope to change that. What better dark mode that running it on the TUI? What better way to make a simple UI than to design one myself that *I* like?
Bibliofile is a simplified epub reader with automatic bookmarking!
This is very much a personal project. Rust isn't exactly used for big companies besides Mozilla just yet, and progress is slow-going due to my personal and work commitments. Still, when it is done, I will attempt to release it on several popular repositories such as Flatpack so that others can use it.
Instructions:
Feel free to check up on progress on my blog, www.whoisthisjoker.com. I post there periodically to talk about what direction I want the project to go.
- installation
- use
- feedback
## installation
At the moment, Bibliofile is a work-in-progress, so it is not part of any package manager, and no binaries are available at the moment. However to run this while in alpha, you can follow the Instructions down below.
### 1
Install Rust. The full Instructions on how to do this are here: https://www.rust-lang.org/tools/install
The easiest way of installing Rust is with the following command:
```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
### 2
Clone the repository to the directory of your choice
```git
git clone https://git.whoisthisjoker.com/daniel/bibliofile
```
### 3
cd into the directory *bibliofile*. Compile the program. This is best done with cargo.
```rust
cargo build
```
The executable will be in target/debug.
Please keep in mind, at this point in development compilation success is not guaranteed.
## running
Running the program is simple, as at this point there is not many features. Simply run
```bibliofile [booknamehere.epub]```
There will be buttons at the bottom of each page that allow you to turn pages. Simply press "last" or "next" to turn the page.
## disclamers
This program is in alpha, and I am trying to get base functionality working. It will be lacking features, and can currently only read epub files. Mobi and PDF are not supported.
## license
Bibliofile: A TUI epub reader inspired by DOS-era programs
Copyright (C) 2023 Daniel Redd joes
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.

View File

@ -4,7 +4,7 @@ Language: Rustc 1.71.0
ide: CLion
Operating system: POP_OS
Purpose: TUI-based ereader and library manager for Linux terminal environments.
Last edited: 11/14/23
Last edited: 11/18/23
*/
mod html_module;
@ -15,7 +15,9 @@ use epub::doc::EpubDoc; //library for navigating epubs
use std::*;
use std::i32;
use std::path::Path;
use std::fs::File;
use std::io::prelude::*;
use std::str;
/*
This function will determine if Bibliofile has been opened before. If it has not, it will create a library folder under /opt/bibliofile.
@ -24,6 +26,9 @@ Function: library_Exists
param: none
Return Type: void
*/
//temporarily commented out until I implement the library functionality
/*
fn library_exists(){
@ -36,6 +41,10 @@ fn library_exists(){
}
}
*/
/*
initial function. Reads the ebook passed by argument, and checks if library directory exists in Linux.
@ -68,28 +77,23 @@ Return type: none
*/
fn screen_func(epub_file: &str){
let mut page_num = 1;
let mut siv = cursive::default();
let textinfo = get_init_text(epub_file, &page_num, "next");
let text = textinfo.0;
let title = textinfo.1;
page_num = textinfo.2;
// Creates the cursive root - required for every application.
let mut siv = cursive::default();
siv.add_global_callback('q', |s| s.quit());
siv.add_global_callback('d', move |s| { get_text(s); });
let text = "Welcome to Bibliofile! Press begin to read your book.";
// Creates a dialog with a single "Quit" button
siv.add_layer(Dialog::around(TextView::new(text))
.title(title + " page: " + &page_num.to_string())
.scrollable()
.scroll_x(true),
.title("Bibliofile")
.button("begin", |s| {get_text(s);}),
);
// Starts the event loop.
siv.run();
}
@ -102,73 +106,66 @@ params: Cursive session
Returns type: void
*/
fn get_text(s: &mut Cursive) {
//removes old layer, builds new one
s.pop_layer();
let args: Vec<String> = env::args().collect();
let filename = &args[1];
let doc = EpubDoc::new(filename);
let mut doc = doc.unwrap();
let page_num = 1;
let mut usize_num = page_num as usize;
usize_num = usize_num + 1;
//gets page number/bookmark
let title = doc.mdata("title");
s.add_global_callback('d', move |s| { get_text(s); });
doc.set_current_page(usize_num);
let content = doc.get_current_str();
let str_content = content.unwrap();
let text = html_module::main(str_content.0);
let bookmark_file_name = title.clone().unwrap() + "_bookmark";
//refreshed screen layout
s.add_layer(Dialog::around(TextView::new(text))
.title(title.unwrap() + " page: " + &usize_num.to_string())
.scrollable()
.scroll_x(true),
//if bookmark for file exists, continue to open. If not, create the file and try again.
if Path::exists(bookmark_file_name.as_ref()){
let bookmark = fs::read_to_string(bookmark_file_name.clone()).expect("no file found! You kidding me?");
let mut page_num: usize = bookmark
.trim()
.parse()
.expect("not a number");// converts from string to usize
let usize_num = page_num as usize; //set_current_page must be usize, not int. This line converts.
doc.set_current_page(usize_num);
let content = doc.get_current_str();
let str_content = content.unwrap();
let text = html_module::main(str_content.0);
page_num = page_num + 1;
//let mut bookmark_write = File::open(bookmark_file_name).expect("could not write to file.");
let page_string = page_num.to_string();
//bookmark_write.write_all(page_string.as_bytes()).expect("oops, couldn't write.");
fs::write(bookmark_file_name, page_string.as_bytes()).expect("Unable to write file");
//refreshed screen layout
s.add_layer(Dialog::around(TextView::new(text))
.title(title.unwrap() + " page: " + &usize_num.to_string())
.button("last", |s| {get_text(s);})
.button("quit", |s| s.quit())
.button("next", |s| {get_text(s);})
.scrollable()
.scroll_x(true),
);
}
else{
fs::write(bookmark_file_name, "1").expect("Unable to write file");
get_text(s);
}
}
/*
Function called
*/
fn get_init_text(epub_file: &str, mut page_num: &i32, direction: &str) -> (String, String, i32){
let doc = EpubDoc::new(&epub_file);
assert!(doc.is_ok());
let mut doc = doc.unwrap();
let mut usize_num = *page_num as usize;
return if direction == "next" {
usize_num = usize_num + 1;
let title = doc.mdata("title");
doc.set_current_page(usize_num);
let content = doc.get_current_str();
let str_content = content.unwrap();
let text = html_module::main(str_content.0);
(text, title.unwrap(), usize_num as i32)
} else if direction == "last" {
usize_num = usize_num - 1;
let title = doc.mdata("title");
doc.set_current_page(usize_num);
let content = doc.get_current_str();
let str_content = content.unwrap();
let text = html_module::main(str_content.0);
(text, title.unwrap(), usize_num as i32)
} else {
let title = doc.mdata("title");
doc.set_current_page(usize_num);
let content = doc.get_current_str();
let str_content = content.unwrap();
let text = html_module::main(str_content.0);
(text, title.unwrap(), usize_num as i32)
}
}