diff options
author | JJ | 2023-06-17 21:56:58 +0000 |
---|---|---|
committer | JJ | 2023-06-17 21:56:58 +0000 |
commit | 6aeacb7abca05bac190d093cbefc3a88c46052b6 (patch) | |
tree | 10aacf4927f9456b9f18b290d81b17203ce7c00b /src/display.rs | |
parent | 4d7f63203724d246d5b58a50a57b6e7d42ab7951 (diff) |
split lib.rs functionality into separate modules
Diffstat (limited to 'src/display.rs')
-rw-r--r-- | src/display.rs | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/display.rs b/src/display.rs new file mode 100644 index 0000000..3c372d2 --- /dev/null +++ b/src/display.rs @@ -0,0 +1,67 @@ +#![allow(unused_variables)] + +use crate::state::*; +use parse_wiki_text::*; + +// i really miss static blocks +const skippable_headers: &[&str; 15] = + &["Synonyms", "Antonyms", "Hyponyms", "Anagrams", "Translations", + "Pronunciation", "Declension", "Inflection", "Descendants", + "Derived terms", "Related terms", "See also", "Further reading", + "References", "Alternative forms"]; + +// now we do somewhat inefficient string manipulation +// but it's fine because we're working with MUCH smaller strings lol +pub fn display(definition: String, state: &State) { + let definition = Configuration::default().parse(&definition); + + // impl display on that shit then + // definition.display(&state.lang); + + // this is really quite terrible code + if !display_language(&definition, &state.lang) { + display_language(&definition, ""); + } +} + +// no overloading?? O_O +// matching on an enum of structs SUCKS +// functions as parameters is too hard +pub fn display_language(definition: &Output, lang: &str) -> bool { + let mut inside_heading = false; + let mut correct_language = false; + let mut skipping_heading = false; + for (i, node) in definition.nodes.iter().enumerate() { + + if let Node::Heading { nodes, level, .. } = node + && let Some(Node::Text { value, .. }) = nodes.get(0) { + if inside_heading { + if *level == 2 { + inside_heading = false; + } else if skippable_headers.contains(value) { + skipping_heading = true; + } else { + if skipping_heading && !skippable_headers.contains(value) { + skipping_heading = false; + } + print!("\n{}\n", node); + } + } else if *level == 2 && *value == lang { + inside_heading = true; + correct_language = true; + print!("{}", node); + } + } else if inside_heading && !skipping_heading { + if let Node::OrderedList { .. } | Node::UnorderedList { .. } | Node::DefinitionList { .. } = node { + print!("{}", format!("{}", node).trim()); + } else { + print!("{}", node); + } + } + } + if correct_language { + println!(); + } + return correct_language; +} + |