]> OzVa Git service - gn-parser/commitdiff
Fixed subtract overflow bugs main
authorMax Value <greenwoodw50@gmail.com>
Sun, 18 May 2025 14:19:43 +0000 (15:19 +0100)
committerMax Value <greenwoodw50@gmail.com>
Sun, 18 May 2025 14:19:43 +0000 (15:19 +0100)
~ fixed name list inline render bug

Cargo.toml
src/parser.rs
src/types/contents.rs
src/types/heading.rs
src/types/image.rs
src/types/reference_list.rs
src/types/reference_list/name_list.rs

index 9aa00a2ad073dac41a6eb6d9028aac0fbb3c42c8..5785fa7e4eed4f3ab2c1891848a80cfe42a7f072 100644 (file)
@@ -7,5 +7,5 @@ edition = "2021"
 
 [dependencies]
 chrono = "0.4.41"
-regex = "1"
+regex = "1.11"
 serde_json = "1"
index 7780d8aa2610e0b03f94b6c809189f68019b3732..fc6ccaf66920f2088c8aa5fe38e1b30302ef7b70 100644 (file)
@@ -121,8 +121,8 @@ pub fn parse_body (string: String, metadata: Metadata, reference_list: Option<Re
 
                                // match images
                                ('!', '[', ..) => {
-                                       let re = Regex::new(r"!\[(?<caption>[\d\w (\\\[)]*)\]\[(?<path>[\d\w\.\/]*)\]").unwrap();
-                                       match re.captures_at(line, 0) {
+                                       let re = Regex::new(r"^!\[(?<caption>[\d\w (\\\[)]*)\]\[(?<path>[\d\w\./]*)\]").unwrap();
+                                       match re.captures(line) {
                                                Some(captures) => {
                                                        let caption = captures.name("caption").unwrap().as_str().to_string();
                                                        let path = captures.name("path").unwrap().as_str().to_string();
index 31c025a0d477bb89b5cb656253e9ae3854f22969..bcbfb71b543e80ac9997d8ad44b5f03dd59dad70 100644 (file)
@@ -33,7 +33,7 @@ impl Renderable for Contents {
 
                                        let plaintext = element.render_plaintext();
                                        let anchor: String = plaintext.to_lowercase().split_whitespace().map(|s| s.chars().chain(['-'])).flatten().collect();
-                                       let anchor = &anchor[..anchor.len()-1];
+                                       let anchor = &anchor[..anchor.len().saturating_sub(1)];
                                        let counter_text = counters[..element.level]
                                                .iter()
                                                .map(|s| s .to_string()
index b12b056580ead34a451a7c66fb4bc574a40b3f22..664b0d51eb514862d6d8c98247c16527203a9966 100644 (file)
@@ -24,7 +24,7 @@ impl Renderable for Heading {
        fn render_html (&self) -> String {
                let text = parse_inline_html(self.text.trim());
                let anchor: String = text.to_lowercase().split_whitespace().map(|s| s.chars().chain(['-'])).flatten().collect();
-               let anchor = &anchor[..anchor.len()-1];
+               let anchor = &anchor[..anchor.len().saturating_sub(1)];
                let section = match self.level {
                        1 => "h2",
                        2 => "h3",
index 9929aa4ba66af046b8a5fb2ac732058cf3c9bd84..390d12f971b13efe74785e114636dcd704a93c99 100644 (file)
@@ -27,7 +27,7 @@ impl Renderable for Image {
                        path = self.path,
                        caption = self.caption,
                        count = self.count,
-                       anchor = &anchor[..anchor.len()-1])
+                       anchor = &anchor[..anchor.len().saturating_sub(1)])
        }
        fn render_gemtext(&self) -> String {
                format!("\
index 0d6a3e8c79f356fafb7418def900b2e2ebbc9383..86c687ba056ad2992578207cbb3a083ebcc9191d 100644 (file)
@@ -26,7 +26,9 @@ impl ReferenceList {
                                        if &string[mat.start()-2..mat.start()-1] == "\\" {false}
                                        else {true}
                                },
-                               None => false
+                               None => {
+                                       false
+                               }
                        } {
                                let new_reference = Reference {
                                        id: capture.name("id").map_or(
@@ -85,7 +87,7 @@ impl ReferenceList {
                let mut new_string = string.to_string();
                let re = Regex::new(r"\[[\d\w]+\]").unwrap();
                for mat in re.find_iter(&string).collect::<Vec<_>>().iter().rev() {
-                       if !(&string[mat.start()-1..mat.start()] == "\\") {
+                       if !(&string[mat.start().saturating_sub(1)..mat.start()] == "\\") {
                                let inline_id = &string[mat.start()+1..mat.end()-1].trim();
                                for reference in &self.list {
                                        if &reference.id == inline_id {
index 119c4d8e0c359b9cfe6087fdb4d26f7dcb0f1e27..00c9a6b8de7c0a70c87486eece763d7ff243cc6f 100644 (file)
@@ -18,21 +18,25 @@ impl NameList {
        pub fn render_full(&self) -> String {
                let mut names: Vec<String> = Vec::new();
                for name in self.string.split(" and ") {
-                       if &name[0..1] == "{" {
+                       if !name.is_empty() && &name[0..1] == "{" {
                                // the case for dealing with organisations
                                names.push(String::from(&name[1..name.len()-1]));
                        } else {
                                // the case for dealing with people with an indeterminate
                                // amount of names
-                               let last_name = name.split_whitespace().last().unwrap();
-                               let mut full_name = String::from(last_name) + ", ";
-                               name.split_whitespace()
-                               .filter(|n| n != &last_name)
-                               .for_each(|n| {
-                                       let initial = format!("{}. ", &n[0..1]);
-                                       full_name.push_str(&initial)
-                               });
-                               names.push(full_name);
+                               match name.split_whitespace().last() {
+                                       Some(last_name) => {
+                                               let mut full_name = String::from(last_name) + ", ";
+                                               name.split_whitespace()
+                                               .filter(|n| n != &last_name)
+                                               .for_each(|n| {
+                                                       let initial = format!("{}. ", &n[0..1]);
+                                                       full_name.push_str(&initial)
+                                               });
+                                               names.push(full_name);
+                                       }
+                                       None => ()
+                               }
                        }
                }
                let mut all_names = String::new();
@@ -51,24 +55,25 @@ impl NameList {
        pub fn render_inline(&self) -> String {
                let mut names: Vec<&str> = Vec::new();
                for name in self.string.split(" and ") {
-                       if &name[0..1] == "{" {
+                       if !name.is_empty() && &name[0..1] == "{" {
                                // the case for dealing with organisations
                                names.push(&name[1..name.len()-1]);
                        } else {
-                               let last_name = name.split_whitespace().last().unwrap();
-                               names.push(last_name);
+                               match name.split_whitespace().last() {
+                                       Some(last_name) => {names.push(last_name)}
+                                       None => ()
+                               }
+
                        }
                }
-               let mut all_names = String::new();
                names.sort_by(|a, b| a.cmp(b));
 
                // et al. if more than 3
-               if names.len() > 3 {
-                       names = names[0..4].to_vec();
-                       names.push("et al.");
+               match names.len() {
+                       0 => {String::new()}
+                       1 => {names[0].to_string()}
+                       2 => {format!("{} & {}", names[0], names[1])}
+                       _ => {format!("{} et al.", names[0])}
                }
-
-               for name in names {all_names.push_str(&name)};
-               all_names
        }
 }