Compare commits
	
		
			4 Commits
		
	
	
		
			035bd21466
			...
			165d946e0d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					165d946e0d | ||
| 
						 | 
					d9150c302f | ||
| 
						 | 
					46e4030f46 | ||
| 
						 | 
					9c756f3550 | 
							
								
								
									
										59
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								src/main.rs
									
									
									
									
									
								
							@@ -12,6 +12,8 @@ use iced::{
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use std::fs::{File, OpenOptions};
 | 
				
			||||||
 | 
					use std::io::{BufWriter, Write};
 | 
				
			||||||
use std::{env, fs, path::PathBuf};
 | 
					use std::{env, fs, path::PathBuf};
 | 
				
			||||||
use texts::*;
 | 
					use texts::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -35,7 +37,7 @@ fn main() -> iced::Result {
 | 
				
			|||||||
                    if let Ok(f) = bible::get(
 | 
					                    if let Ok(f) = bible::get(
 | 
				
			||||||
                        query,
 | 
					                        query,
 | 
				
			||||||
                        second_query,
 | 
					                        second_query,
 | 
				
			||||||
                        vec![&bible],
 | 
					                        &bible,
 | 
				
			||||||
                    ) {
 | 
					                    ) {
 | 
				
			||||||
                        println!("{}", f);
 | 
					                        println!("{}", f);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -69,6 +71,7 @@ enum Message {
 | 
				
			|||||||
    SetErrorMessage(usize, String),
 | 
					    SetErrorMessage(usize, String),
 | 
				
			||||||
    RecievedEvent(Event),
 | 
					    RecievedEvent(Event),
 | 
				
			||||||
    NoteInput(usize, text_editor::Action),
 | 
					    NoteInput(usize, text_editor::Action),
 | 
				
			||||||
 | 
					    Save,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Message {
 | 
					impl Message {
 | 
				
			||||||
@@ -197,10 +200,45 @@ impl State {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        // match normal messages
 | 
					        // match normal messages
 | 
				
			||||||
        match msg {
 | 
					        match msg {
 | 
				
			||||||
 | 
					            Message::Save => {
 | 
				
			||||||
 | 
					                let opt = OpenOptions::new()
 | 
				
			||||||
 | 
					                    // create if doesn't already exist
 | 
				
			||||||
 | 
					                    .create(true)
 | 
				
			||||||
 | 
					                    .append(false)
 | 
				
			||||||
 | 
					                    // clear existing file
 | 
				
			||||||
 | 
					                    .truncate(true)
 | 
				
			||||||
 | 
					                    .write(true)
 | 
				
			||||||
 | 
					                    .open("save.md")
 | 
				
			||||||
 | 
					                    ;
 | 
				
			||||||
 | 
					                match opt {
 | 
				
			||||||
 | 
					                    Ok(file) => {
 | 
				
			||||||
 | 
					                        let mut buffer = BufWriter::new(file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        // the toml heading at the top of md files
 | 
				
			||||||
 | 
					                        let _ = buffer.write_all("---\n---\n".as_bytes());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        for col in &self.states {
 | 
				
			||||||
 | 
					                            // separate each col with hr
 | 
				
			||||||
 | 
					                            let _ = buffer.write_all("\n---\n".as_bytes());
 | 
				
			||||||
 | 
					                            if let Some(scripture) = &col.scripture_body {
 | 
				
			||||||
 | 
					                                // code block for scripture
 | 
				
			||||||
 | 
					                                let _ = buffer.write_all("```\n".as_bytes());
 | 
				
			||||||
 | 
					                                let _ = buffer.write_all(parse(scripture).as_bytes());
 | 
				
			||||||
 | 
					                                let _ = buffer.write_all("```\n".as_bytes());
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            let _ = buffer.write_all(&col.notes.text().as_bytes());
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        let _ = buffer.flush();
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    Err(err) => {
 | 
				
			||||||
 | 
					                        eprintln!("{err}");
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
            Message::NoteInput(i, action) => {
 | 
					            Message::NoteInput(i, action) => {
 | 
				
			||||||
                let notes = &mut self.states[i].notes;
 | 
					                let notes = &mut self.states[i].notes;
 | 
				
			||||||
                notes.perform(action);
 | 
					                notes.perform(action);
 | 
				
			||||||
            }
 | 
					            },
 | 
				
			||||||
            Message::CycleTheme => {
 | 
					            Message::CycleTheme => {
 | 
				
			||||||
                let len = self.themes.len();
 | 
					                let len = self.themes.len();
 | 
				
			||||||
                let i = &mut self.theme_idx;
 | 
					                let i = &mut self.theme_idx;
 | 
				
			||||||
@@ -295,7 +333,7 @@ impl State {
 | 
				
			|||||||
                if let (Some(book), Some(chap_and_ver), Some(bible)) =
 | 
					                if let (Some(book), Some(chap_and_ver), Some(bible)) =
 | 
				
			||||||
                    (book, location, &self.states[i].bible_selected)
 | 
					                    (book, location, &self.states[i].bible_selected)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    self.states[i].scripture_body = match bible::get(book, chap_and_ver, vec![bible]) {
 | 
					                    self.states[i].scripture_body = match bible::get(book, chap_and_ver, bible) {
 | 
				
			||||||
                        Ok(s) => {
 | 
					                        Ok(s) => {
 | 
				
			||||||
                            Some(s)
 | 
					                            Some(s)
 | 
				
			||||||
                        },
 | 
					                        },
 | 
				
			||||||
@@ -344,10 +382,17 @@ impl State {
 | 
				
			|||||||
    fn view(&self) -> Element<Message> {
 | 
					    fn view(&self) -> Element<Message> {
 | 
				
			||||||
        // Header bar, static, doesn't scroll
 | 
					        // Header bar, static, doesn't scroll
 | 
				
			||||||
        column![
 | 
					        column![
 | 
				
			||||||
            button("Cycle Themes")
 | 
					            row![
 | 
				
			||||||
                .on_press(Message::CycleTheme)
 | 
					                button("Cycle Themes")
 | 
				
			||||||
                .style(button::secondary),
 | 
					                    .on_press(Message::CycleTheme)
 | 
				
			||||||
        scrollable(
 | 
					                    .style(button::secondary)
 | 
				
			||||||
 | 
					                    ,
 | 
				
			||||||
 | 
					                button("Save")
 | 
				
			||||||
 | 
					                    .on_press(Message::Save)
 | 
				
			||||||
 | 
					                    .style(button::secondary)
 | 
				
			||||||
 | 
					                    ,
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					       scrollable(
 | 
				
			||||||
            row![
 | 
					            row![
 | 
				
			||||||
                row((0..self.states.len()).map(|col_index| {
 | 
					                row((0..self.states.len()).map(|col_index| {
 | 
				
			||||||
                    column![
 | 
					                    column![
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -102,19 +102,9 @@ pub fn search_for_word(word: &str, from_files: &Bible) -> Vec<String> {
 | 
				
			|||||||
    found
 | 
					    found
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result<String, String> {
 | 
					fn parse_book(book: &str) -> Result<(usize, &str), String> {
 | 
				
			||||||
    // expecting query to be in format:
 | 
					    // Go thru the list of books and see which
 | 
				
			||||||
    // Gen 1:2
 | 
					    // match the passed book str
 | 
				
			||||||
    // Gen 1:2-5
 | 
					 | 
				
			||||||
    // Gen 1
 | 
					 | 
				
			||||||
    // The book name needs to be just long enough to be unique
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let mut splits = chap_and_ver.split(':');
 | 
					 | 
				
			||||||
    let chapter = splits.next();
 | 
					 | 
				
			||||||
    let verse = splits.next();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // ###########################################
 | 
					 | 
				
			||||||
    // Figure out what book they are talking about
 | 
					 | 
				
			||||||
    let res = BOOKS_IN_ORDER
 | 
					    let res = BOOKS_IN_ORDER
 | 
				
			||||||
        .iter()
 | 
					        .iter()
 | 
				
			||||||
        .enumerate()
 | 
					        .enumerate()
 | 
				
			||||||
@@ -129,7 +119,9 @@ pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result<String
 | 
				
			|||||||
        .collect::<Vec<(usize, &&str)>>();
 | 
					        .collect::<Vec<(usize, &&str)>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let (book_idx, book_name) = match res.len() {
 | 
					    let (book_idx, book_name) = match res.len() {
 | 
				
			||||||
 | 
					        // there is one option for what book it is
 | 
				
			||||||
        1 => res[0],
 | 
					        1 => res[0],
 | 
				
			||||||
 | 
					        // there are >1 options for what book it is
 | 
				
			||||||
        2.. => {
 | 
					        2.. => {
 | 
				
			||||||
            eprintln!("Err: Ambigious input '{book}', could be any of:");
 | 
					            eprintln!("Err: Ambigious input '{book}', could be any of:");
 | 
				
			||||||
            for (_, i) in &res {
 | 
					            for (_, i) in &res {
 | 
				
			||||||
@@ -142,34 +134,51 @@ pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result<String
 | 
				
			|||||||
            return Err(format!("'{book}' is not a book"));
 | 
					            return Err(format!("'{book}' is not a book"));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    Ok((book_idx, book_name))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Select the book in each Bible
 | 
					fn parse_chapter<'a>(chapter_num: &str, book: &'a Book) -> Result<&'a Chapter, String> {
 | 
				
			||||||
    let books = bibles
 | 
					    let chapter = if let Ok(idx) = chapter_num.parse::<usize>() {
 | 
				
			||||||
        .iter()
 | 
					        if let Some(chapter) = book.get_chapter_by_index(idx) {
 | 
				
			||||||
        // Book are 1 indexed in the xml spec
 | 
					            chapter
 | 
				
			||||||
        .map(|bible| (bible, bible.get_book_by_index(book_idx + 1)))
 | 
					 | 
				
			||||||
        .filter(|(_,e)| e.is_some())
 | 
					 | 
				
			||||||
        .map(|(bible,book)| (*bible,book.unwrap()))
 | 
					 | 
				
			||||||
        .collect::<Vec<(&Bible,&Book)>>();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Select the chapter in each Bible
 | 
					 | 
				
			||||||
    let chapters = if let Some(chapter) = chapter {
 | 
					 | 
				
			||||||
        if let Ok(ch_num) = chapter.parse::<usize>() {
 | 
					 | 
				
			||||||
            books
 | 
					 | 
				
			||||||
                .iter()
 | 
					 | 
				
			||||||
                .map(|(bible,book)| (bible, book, book.get_chapter_by_index(ch_num)))
 | 
					 | 
				
			||||||
                .filter(|(_,_,book)| book.is_some())
 | 
					 | 
				
			||||||
                .map(|(bible,book,chapter)| (*bible,*book,chapter.unwrap()))
 | 
					 | 
				
			||||||
                .collect::<Vec<(&Bible, &Book, &Chapter)>>()
 | 
					 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            return Err(format!("Chapter number could not be parsed from {chapter}"));
 | 
					            return Err(format!("Chapter {idx} doesn't exist in book {}", BOOKS_IN_ORDER[book.number-1]));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        return Err(format!("A chapter was not passed"));
 | 
					        return Err(format!("Chapter number could not be parsed from {chapter_num}"));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    Ok(chapter)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn get(book: &str, chap_and_ver: &str, bible: &Bible) -> Result<String, String> {
 | 
				
			||||||
 | 
					    // expecting query to be in format:
 | 
				
			||||||
 | 
					    // Gen 1:2
 | 
				
			||||||
 | 
					    // Gen 1:2-5
 | 
				
			||||||
 | 
					    // Gen 1
 | 
				
			||||||
 | 
					    // The book name needs to be just long enough to be unique
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut splits = chap_and_ver.split(':');
 | 
				
			||||||
 | 
					    let chapter_num = splits.next();
 | 
				
			||||||
 | 
					    let verse_num = splits.next();
 | 
				
			||||||
 | 
					    // ###########################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Figure out what book they are talking about
 | 
				
			||||||
 | 
					    let (book_idx, book_name) = parse_book(book)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let book = match bible.get_book_by_index(book_idx+1) {
 | 
				
			||||||
 | 
					        Some(s) => s,
 | 
				
			||||||
 | 
					        None => return Err(format!("Selected Bible {} doesn't contain book {book_name}", bible.translation_name)),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Figure out what chapter they are talking about
 | 
				
			||||||
 | 
					    let chapter = if let Some(ch) = chapter_num {
 | 
				
			||||||
 | 
					        parse_chapter(ch, book)?
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        return Err("No chapter number was passed".to_string());
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get the verse in each Bible
 | 
					    // Get the verse in each Bible
 | 
				
			||||||
    match verse {
 | 
					    match verse_num {
 | 
				
			||||||
        Some(verse) => {
 | 
					        Some(verse) => {
 | 
				
			||||||
            let mut splits = verse.split("-");
 | 
					            let mut splits = verse.split("-");
 | 
				
			||||||
            let start = splits.next();
 | 
					            let start = splits.next();
 | 
				
			||||||
@@ -180,14 +189,15 @@ pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result<String
 | 
				
			|||||||
                (Some(sn), Some(en)) => {
 | 
					                (Some(sn), Some(en)) => {
 | 
				
			||||||
                    if let (Ok(start), Ok(end)) = (sn.parse::<usize>(), en.parse::<usize>()) {
 | 
					                    if let (Ok(start), Ok(end)) = (sn.parse::<usize>(), en.parse::<usize>()) {
 | 
				
			||||||
                        let mut buf = String::new();
 | 
					                        let mut buf = String::new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        let translation = &bible.translation_name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        buf += &format!("{style_bold}[{translation}] {style_underline}{book_name}:{start}-{end}{style_reset}:\n");
 | 
				
			||||||
                        for num in start..=end {
 | 
					                        for num in start..=end {
 | 
				
			||||||
                            for (bible, _book, chapter) in &chapters {
 | 
					                            if let Some(verse) = chapter.get_verse_by_index(num) {
 | 
				
			||||||
                                if let Some(verse) = chapter.get_verse_by_index(num) {
 | 
					                                buf += &format!(
 | 
				
			||||||
                                    buf += &format!(
 | 
					                                    "{}: {verse}\n", verse.number
 | 
				
			||||||
                                        "{style_bold}[{}] {style_underline}{book_name} {}:{}{style_reset}: {verse}\n",
 | 
					                                );
 | 
				
			||||||
                                        bible.translation_name, chapter.number, verse.number
 | 
					 | 
				
			||||||
                                    );
 | 
					 | 
				
			||||||
                                }
 | 
					 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        return Ok(buf);
 | 
					                        return Ok(buf);
 | 
				
			||||||
@@ -198,13 +208,11 @@ pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result<String
 | 
				
			|||||||
                (Some(ver_num), None) => {
 | 
					                (Some(ver_num), None) => {
 | 
				
			||||||
                    if let Ok(num) = ver_num.parse::<usize>() {
 | 
					                    if let Ok(num) = ver_num.parse::<usize>() {
 | 
				
			||||||
                        let mut buf = String::new();
 | 
					                        let mut buf = String::new();
 | 
				
			||||||
                        for (bible, _book, chapter) in chapters {
 | 
					                        if let Some(verse) = chapter.get_verse_by_index(num) {
 | 
				
			||||||
                            if let Some(verse) = chapter.get_verse_by_index(num) {
 | 
					                            buf += &format!(
 | 
				
			||||||
                                buf += &format!(
 | 
					                                "{style_bold}[{}] {style_underline}{book_name} {}:{}{style_reset}:\n{verse}\n",
 | 
				
			||||||
                                    "{style_bold}[{}] {style_underline}{book_name} {}:{}{style_reset}: {verse}\n",
 | 
					                                bible.translation_name, chapter.number, verse.number
 | 
				
			||||||
                                    bible.translation_name, chapter.number, verse.number
 | 
					                            );
 | 
				
			||||||
                                );
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        return Ok(buf);
 | 
					                        return Ok(buf);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -219,13 +227,11 @@ pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result<String
 | 
				
			|||||||
        None => {
 | 
					        None => {
 | 
				
			||||||
            // only chapter
 | 
					            // only chapter
 | 
				
			||||||
            let mut buf = String::new();
 | 
					            let mut buf = String::new();
 | 
				
			||||||
            for (bible, _, chapter) in chapters {
 | 
					            buf += &format!(
 | 
				
			||||||
                buf += &format!(
 | 
					                "{style_bold}[{}] {style_underline}{book_name} {}{style_reset}:\n",
 | 
				
			||||||
                    "{style_bold}[{}] {style_underline}{book_name} {}{style_reset}:\n",
 | 
					                bible.translation_name, chapter.number
 | 
				
			||||||
                    bible.translation_name, chapter.number
 | 
					            );
 | 
				
			||||||
                );
 | 
					            buf += &format!("{}", chapter);
 | 
				
			||||||
                buf += &format!("{}", chapter);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return Ok(buf);
 | 
					            return Ok(buf);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -286,6 +292,7 @@ struct Testament {
 | 
				
			|||||||
#[derive(Deserialize)]
 | 
					#[derive(Deserialize)]
 | 
				
			||||||
struct Book {
 | 
					struct Book {
 | 
				
			||||||
    #[serde(rename = "@number")]
 | 
					    #[serde(rename = "@number")]
 | 
				
			||||||
 | 
					    /// Genesis is book 1
 | 
				
			||||||
    number: usize,
 | 
					    number: usize,
 | 
				
			||||||
    #[serde(rename = "chapter")]
 | 
					    #[serde(rename = "chapter")]
 | 
				
			||||||
    chapters: Vec<Chapter>,
 | 
					    chapters: Vec<Chapter>,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user