use unicode_bidi::BidiInfo;
use unicode_normalization::UnicodeNormalization;
pub fn contains_rtl(text: &str) -> bool {
text.chars().any(|c| {
matches!(c,
'\u{0590}'..='\u{05FF}' | '\u{0600}'..='\u{06FF}' | '\u{0700}'..='\u{074F}' | '\u{0750}'..='\u{077F}' | '\u{0780}'..='\u{07BF}' | '\u{07C0}'..='\u{07FF}' | '\u{0800}'..='\u{083F}' | '\u{0840}'..='\u{085F}' | '\u{08A0}'..='\u{08FF}' | '\u{FB50}'..='\u{FDFF}' | '\u{FE70}'..='\u{FEFF}' )
})
}
pub fn reorder_bidi(text: &str) -> String {
if !contains_rtl(text) {
return text.to_string();
}
let bidi_info = BidiInfo::new(text, None);
let mut result = String::new();
for para in &bidi_info.paragraphs {
let line = para.range.clone();
let reordered = bidi_info.reorder_line(para, line);
result.push_str(&reordered);
}
result.nfkc().collect()
}