use super::*;
pub(crate) fn split_rich_text(text: &str) -> Vec<(Option<String>, String)> {
let mut runs: Vec<(Option<String>, String)> = Vec::new();
let mut current: String = String::new();
let mut current_style: Option<String> = None;
let mut characters: Peekable<Chars<'_>> = text.chars().peekable();
while let Some(character) = characters.next() {
if character != '{' {
if current_style.is_none() {
current.push(character);
}
continue;
}
let mut name: String = String::new();
let mut found_bar: bool = false;
for next in characters.by_ref() {
if next == '|' {
found_bar = true;
break;
}
if next == '}' {
break;
}
name.push(next);
}
if !found_bar {
current.push('{');
current.push_str(&name);
continue;
}
let mut content: String = String::new();
let mut depth: usize = 1usize;
for next in characters.by_ref() {
if next == '{' {
depth += 1;
} else if next == '}' {
depth -= 1;
if depth == 0 {
break;
}
}
content.push(next);
}
if !current.is_empty() {
runs.push((current_style.clone(), take(&mut current)));
}
if current_style.is_none() {
current_style = Some(name);
}
current.push_str(&content);
}
if !current.is_empty() {
runs.push((current_style, current));
}
runs
}
pub(crate) fn font_size_of(font: &str) -> f64 {
let parts: SplitWhitespace<'_> = font.split_whitespace();
for part in parts {
if part.ends_with("px")
&& let Ok(size) = part[..part.len() - 2].parse::<f64>()
{
return size;
}
}
12.0
}
pub(crate) fn approximate_metrics(text: &str, size: f64) -> TextMetrics {
let width: f64 = text.chars().count() as f64 * size * 0.6;
TextMetrics {
width,
height: size * 1.2,
ascent: size * 0.8,
descent: size * 0.2,
line_height: size * 1.2,
}
}