use yew::html::Scope; use yew::prelude::*; use lazy_static::lazy_static; use maplit::hashmap; use std::collections::BTreeSet; use std::collections::HashMap; #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] enum Падеж { Именительный, Родительный, Дательный, Винительный, Творительный, Предложный, } impl Падеж { const ВСЕ: [Self; 6] = [ Self::Именительный, Self::Родительный, Self::Дательный, Self::Винительный, Self::Творительный, Self::Предложный, ]; fn вопрос(&self) -> &str { use Падеж::*; match self { Именительный => "кто? Что?", Родительный => "кого? Чего?", Дательный => "кому? Чему?", Винительный => "кого? Что?", Творительный => "кем? Чем?", Предложный => "ком? Чём?", } } } lazy_static! { static ref ПО_ПРЕДЛОГУ: HashMap<&'static str, BTreeSet<Падеж>> = { use Падеж::*; hashmap! { "без" => BTreeSet::from([Родительный]), "близ" => BTreeSet::from([Родительный]), "в" => BTreeSet::from([Винительный, Предложный]), "вместо" => BTreeSet::from([Родительный]), "вне" => BTreeSet::from([Родительный]), "внутри" => BTreeSet::from([Родительный]), "возле" => BTreeSet::from([Родительный]), "вокруг" => BTreeSet::from([Родительный]), "вроде" => BTreeSet::from([Родительный]), "для" => BTreeSet::from([Родительный]), "до" => BTreeSet::from([Родительный]), "за" => BTreeSet::from([Винительный, Творительный]), "из" => BTreeSet::from([Родительный]), "из-за" => BTreeSet::from([Родительный]), "из-под" => BTreeSet::from([Родительный]), "к" => BTreeSet::from([Дательный]), "кроме" => BTreeSet::from([Родительный]), "между" => BTreeSet::from([Творительный, Родительный]), "на" => BTreeSet::from([Винительный, Предложный]), "над" => BTreeSet::from([Творительный]), "нет" => BTreeSet::from([Родительный]), "о" => BTreeSet::from([Винительный, Предложный]), "около" => BTreeSet::from([Родительный]), "от" => BTreeSet::from([Родительный]), "перед" => BTreeSet::from([Творительный]), "по" => BTreeSet::from([Винительный, Дательный, Предложный]), "под" => BTreeSet::from([Винительный, Творительный]), "после" => BTreeSet::from([Родительный]), "при" => BTreeSet::from([Предложный]), "про" => BTreeSet::from([Винительный]), "ради" => BTreeSet::from([Родительный]), "с" => BTreeSet::from([Родительный, Винительный, Творительный]), "сквозь" => BTreeSet::from([Винительный]), "среди" => BTreeSet::from([Родительный]), "у" => BTreeSet::from([Родительный]), "через" => BTreeSet::from([Винительный]), } }; static ref ПО_ПАДЕЖУ: HashMap<Падеж, BTreeSet<&'static str>> = { let mut m = hashmap!(); for c in Падеж::ВСЕ { let mut предлоги: BTreeSet<&'static str> = BTreeSet::new(); for (k, v) in &*ПО_ПРЕДЛОГУ { if v.contains(&c) { предлоги.insert(k); } } m.insert(c, предлоги); } m }; static ref ПАДЕЖИ: BTreeSet<Падеж> = BTreeSet::from(Падеж::ВСЕ); static ref ПРЕДЛОГИ: BTreeSet<&'static str> = { let mut s: BTreeSet<&'static str> = BTreeSet::new(); for п in ПО_ПРЕДЛОГУ.keys() { s.insert(п); } s }; } fn исключение(предлог: &str, падеж: Падеж) -> Option { use Падеж::*; match (предлог, падеж) { ("в", Винительный) => Some(html! {"Во что? В кого?"}), ("о", Винительный) => Some(html! { <>
{"О кого? Обо что?"}
{"Редко используется. Например:"}
{"Между чего?"}
{"Редко используется. Только в идиомах и старой литературе:"}
{"... показывает с какими падежами употребляются предлоги в русском языке."}