From 19d7c1eab58d9f02e41f831eda121ef587487858 Mon Sep 17 00:00:00 2001 From: Miquel Sabaté Solà Date: Fri, 16 Jan 2026 15:25:16 +0100 Subject: Display related words on the 'words show' command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This includes comparative/superlative/adverbial forms for adjectives, and alternative forms because of gender or otherwise. Signed-off-by: Miquel Sabaté Solà --- crates/cli/src/words.rs | 87 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) (limited to 'crates/cli/src/words.rs') diff --git a/crates/cli/src/words.rs b/crates/cli/src/words.rs index 9ed16d3..181ea81 100644 --- a/crates/cli/src/words.rs +++ b/crates/cli/src/words.rs @@ -2,7 +2,10 @@ use crate::inflection::print_full_inflection_for; use crate::locale::current_locale; use inquire::{Confirm, Editor, Select, Text}; -use mihi::{Category, Gender, Language, Word}; +use mihi::{ + adverb, comparative, joint_related_words, select_related_words, superlative, Category, Gender, + Language, RelationKind, Word, +}; use std::vec::IntoIter; static NEW_MESSAGE: &str = "New word"; @@ -628,6 +631,43 @@ fn show_info(word: Word) -> Result<(), String> { } }; + // Show relationships with other words. + + let related = select_related_words(&word)?; + + if matches!(word.category, Category::Adjective) { + print!( + "Comparative: {} || ", + comparative(&word, &related[RelationKind::Comparative as usize - 1]) + ); + print!( + "Superlative: {} || ", + superlative(&word, &related[RelationKind::Superlative as usize - 1]) + ); + println!( + "Adverb: {}", + adverb(&word, &related[RelationKind::Adverb as usize - 1]) + ); + } + + let alternatives = &related[RelationKind::Alternative as usize - 1]; + match alternatives.len() { + 0 => {} + 1 => println!("Alternative: {}", joint_related_words(&alternatives)), + _ => println!("Alternatives: {}", joint_related_words(&alternatives)), + } + let gendered = &related[RelationKind::Gendered as usize - 1]; + let g = if matches!(word.gender, Gender::Masculine) { + "Feminine" + } else { + "Masculine" + }; + match gendered.len() { + 0 => {} + 1 => println!("{g} alternative: {}", joint_related_words(&gendered)), + _ => println!("{g} alternatives: {}", joint_related_words(&gendered)), + } + // Show translation if available. let locale = current_locale(); if let Some(translation) = word.translation.get(locale.to_code()) { @@ -759,3 +799,48 @@ pub fn run(args: Vec) { } } } + +#[cfg(test)] +mod tests { + use super::*; + + // Returns a string with the format "{comparative form}-{superlative + // form}-{adverbial form}-{alternatives}-{gendered alternatives}". + fn related_for(enunciated: &str) -> String { + let word = mihi::find_by(enunciated).unwrap(); + let related = select_related_words(&word).unwrap(); + let alternatives = &related[RelationKind::Alternative as usize - 1]; + let gendered = &related[RelationKind::Gendered as usize - 1]; + + let first = if matches!(word.category, Category::Adjective) { + format!( + "{}-{}-{}", + comparative(&word, &related[RelationKind::Comparative as usize - 1]), + superlative(&word, &related[RelationKind::Superlative as usize - 1]), + adverb(&word, &related[RelationKind::Adverb as usize - 1]) + ) + } else { + "--".to_string() + }; + + format!( + "{}-{}-{}", + first, + mihi::joint_related_words(&alternatives), + mihi::joint_related_words(&gendered) + ) + } + + #[test] + fn related() { + assert_eq!( + related_for("parvus, parva, parvum"), + "minor, minus-minimus, minima, minimum-parvē--" + ); + assert_eq!( + related_for("versō, versāre, versāvī, versātum"), + "---vorsō, vorsāre, vorsāvī, vorsātum-" + ); + assert_eq!(related_for("victor, victōris"), "----victrīx, victrīcis"); + } +} -- cgit v1.2.3