use crate::{NJDNode, NJD};
use jpreprocess_core::pos::*;
use jpreprocess_window::*;
pub fn njd_set_accent_phrase(njd: &mut NJD) {
if njd.nodes.is_empty() {
return;
}
let mut iter = njd.iter_quint_mut();
while let Some(quint) = iter.next() {
let (prev, node) = match Double::from(quint) {
Double::Full(p, c) => (p, c),
_ => continue,
};
if node.get_chain_flag().is_none() {
let chain: bool = chain_flag(prev, node);
node.set_chain_flag(chain);
}
}
}
fn chain_flag(prev: &NJDNode, node: &NJDNode) -> bool {
let prev_pos = prev.get_pos();
let curr_pos = node.get_pos();
match (prev_pos, curr_pos) {
(
_,
POS::Keiyoushi(Keiyoushi::Setsubi)
| POS::Doushi(Doushi::Setsubi)
| POS::Meishi(Meishi::Setsubi(_)),
) => true,
(POS::Meishi(_), POS::Meishi(Meishi::KoyuMeishi(KoyuMeishi::Person(Person::Mei)))) => false,
(POS::Meishi(Meishi::KoyuMeishi(KoyuMeishi::Person(Person::Sei))), POS::Meishi(_)) => false,
(_, POS::Settoushi(_)) => false,
(POS::Kigou(_), _) => false,
(_, POS::Kigou(_)) => false,
(POS::Meishi(_), POS::Doushi(_)) => false,
(POS::Meishi(_), POS::Keiyoushi(_)) => false,
(POS::Meishi(_), POS::Meishi(Meishi::KeiyoudoushiGokan)) => false,
(POS::Doushi(_), POS::Doushi(Doushi::Hijiritsu)) if prev.is_renyou() => true,
(POS::Doushi(_), POS::Keiyoushi(Keiyoushi::Hijiritsu)) if prev.is_renyou() => true,
(POS::Keiyoushi(_), POS::Keiyoushi(Keiyoushi::Hijiritsu)) if prev.is_renyou() => true,
(POS::Joshi(Joshi::SetsuzokuJoshi), POS::Keiyoushi(Keiyoushi::Hijiritsu))
if matches!(prev.get_string(), "て" | "で") =>
{
true
}
(
POS::Keiyoushi(Keiyoushi::Setsubi)
| POS::Doushi(Doushi::Setsubi)
| POS::Meishi(Meishi::Setsubi(_)),
POS::Meishi(_),
) => false,
(POS::Jodoushi | POS::Joshi(_), POS::Jodoushi | POS::Joshi(_)) => true,
(POS::Jodoushi | POS::Joshi(_), _) => false,
(_, POS::Jodoushi | POS::Joshi(_)) => true,
(POS::Meishi(Meishi::FukushiKanou), _) => false,
(_, POS::Meishi(Meishi::FukushiKanou)) => false,
(POS::Fukushi(_) | POS::Setsuzokushi | POS::Rentaishi, _) => false,
(_, POS::Fukushi(_) | POS::Setsuzokushi | POS::Rentaishi) => false,
(POS::Doushi(_), POS::Keiyoushi(_) | POS::Meishi(_)) => false,
(POS::Meishi(Meishi::KeiyoudoushiGokan), POS::Meishi(_)) => false,
(POS::Keiyoushi(_), POS::Meishi(_)) => false,
(POS::Meishi(_), POS::Meishi(_)) => true,
_ => true,
}
}