diff --git a/Cargo.lock b/Cargo.lock index e5b2ef9..27a9b7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -54,7 +54,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bibliographix" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1145,7 +1145,7 @@ version = "0.23.0" dependencies = [ "asciimath-rs 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bibliographix 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bibliographix 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "charred 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "colored 1.9.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1588,7 +1588,7 @@ dependencies = [ "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" "checksum base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" -"checksum bibliographix 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba3bc8793948a3de7d106d5f855afb085b998585c5f407ae59cd5489d3ed97c8" +"checksum bibliographix 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4d80a9410af7ce9fa988e4ea1944a84ab9b00ffadb9f380120b0bc18996fad4b" "checksum bincode 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" "checksum bumpalo 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" diff --git a/Cargo.toml b/Cargo.toml index d062611..99f3f7f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ path = "src/main.rs" [dependencies] charred = "0.3.3" asciimath-rs = "0.5.7" -bibliographix = "0.2.0" +bibliographix = "0.3.0" crossbeam-utils = "0.7.2" structopt = "0.3.14" minify = "1.1.1" diff --git a/src/references/bibliography.rs b/src/references/bibliography.rs index 8b13789..1109984 100644 --- a/src/references/bibliography.rs +++ b/src/references/bibliography.rs @@ -1 +1,82 @@ +use crate::elements::Inline; +use crate::elements::{BoldText, ItalicText, Line, List, ListItem, PlainText, TextLine}; +use bibliographix::bibliography::bib_types::article::Article; +use bibliographix::bibliography::bib_types::BibliographyType; +use bibliographix::bibliography::bibliography_entry::{ + BibliographyEntry, BibliographyEntryReference, +}; +use std::sync::MutexGuard; +macro_rules! plain_text { + ($e:expr) => { + Inline::Plain(PlainText { value: $e }) + }; +} + +macro_rules! bold_text { + ($e:expr) => { + Inline::Bold(BoldText { + value: vec![Inline::Plain(PlainText { value: $e })], + }) + }; +} + +macro_rules! italic_text { + ($e:expr) => { + Inline::Italic(ItalicText { + value: vec![Inline::Plain(PlainText { value: $e })], + }) + }; +} + +fn create_bib_list(entries: Vec) -> List { + let mut list = List::new(); + + for entry in entries { + list.add_item(get_item_for_entry(entry)); + } + + list +} + +fn get_item_for_entry(entry: BibliographyEntryReference) -> ListItem { + let entry = entry.lock().unwrap(); + + match &entry.bib_type { + BibliographyType::Article(a) => get_item_for_article(&*entry, a), + _ => unimplemented!(), + } +} + +/// Returns the formatted article bib entry +fn get_item_for_article(entry: &BibliographyEntry, a: &Article) -> ListItem { + let mut text = TextLine::new(); + text.subtext.push(bold_text!(entry.key().clone())); + text.subtext + .push(plain_text!(format!(": {}.", a.author.clone()))); + text.subtext + .push(plain_text!(format!("\"{}\"", a.title.clone()).to_string())); + text.subtext.push(plain_text!("In: ".to_string())); + text.subtext.push(italic_text!(a.journal.clone())); + + if let Some(volume) = a.volume.clone() { + text.subtext + .push(italic_text!(format!(", {}", volume).to_string())) + } + if let Some(number) = a.number.clone() { + text.subtext + .push(plain_text!(format!(", Number: {}", number))); + } + text.subtext + .push(plain_text!(format!(", {}", a.date.format("%d.%m.%y")))); + + if let Some(pages) = a.pages.clone() { + text.subtext + .push(plain_text!(format!(", Pages: {}", pages).to_string())); + } + if let Some(url) = a.url.clone() { + text.subtext + .push(plain_text!(format!("URL: {}", url).to_string())); + } + ListItem::new(Line::Text(text), 0, true) +}