use crate::fonts::FontId;
#[allow(unused)]
use crate::Text; use crate::{Effect, OwningVecIter};
mod plain;
#[cfg(feature = "markdown")]
mod markdown;
#[cfg(feature = "markdown")]
pub use markdown::{Error as MarkdownError, Markdown};
pub trait FormattableText: std::fmt::Debug {
type FontTokenIter<'a>: Iterator<Item = FontToken>
where
Self: 'a;
#[inline]
fn str_len(&self) -> usize {
self.as_str().len()
}
fn as_str(&self) -> &str;
fn font_tokens<'a>(&'a self, dpem: f32) -> Self::FontTokenIter<'a>;
fn effect_tokens(&self) -> &[Effect<()>];
}
pub trait FormattableTextDyn: std::fmt::Debug {
fn clone_boxed(&self) -> Box<dyn FormattableTextDyn>;
fn str_len(&self) -> usize;
fn as_str(&self) -> &str;
fn font_tokens(&self, dpem: f32) -> OwningVecIter<FontToken>;
fn effect_tokens(&self) -> &[Effect<()>];
}
impl<F: FormattableText + Clone + 'static> FormattableTextDyn for F {
fn clone_boxed(&self) -> Box<dyn FormattableTextDyn> {
Box::new(self.clone())
}
fn str_len(&self) -> usize {
FormattableText::str_len(self)
}
fn as_str(&self) -> &str {
FormattableText::as_str(self)
}
fn font_tokens(&self, dpem: f32) -> OwningVecIter<FontToken> {
let iter = FormattableText::font_tokens(self, dpem);
OwningVecIter::new(iter.collect())
}
fn effect_tokens(&self) -> &[Effect<()>] {
FormattableText::effect_tokens(self)
}
}
impl<'t> FormattableText for &'t dyn FormattableTextDyn {
type FontTokenIter<'a> = OwningVecIter<FontToken>
where
Self: 'a,;
#[inline]
fn str_len(&self) -> usize {
FormattableTextDyn::str_len(*self)
}
#[inline]
fn as_str(&self) -> &str {
FormattableTextDyn::as_str(*self)
}
#[inline]
fn font_tokens(&self, dpem: f32) -> OwningVecIter<FontToken> {
FormattableTextDyn::font_tokens(*self, dpem)
}
fn effect_tokens(&self) -> &[Effect<()>] {
FormattableTextDyn::effect_tokens(*self)
}
}
pub trait EditableText: FormattableText {
fn set_string(&mut self, string: String);
fn swap_string(&mut self, string: &mut String) {
let mut temp = self.as_str().to_string();
std::mem::swap(&mut temp, string);
self.set_string(temp);
}
fn insert_char(&mut self, index: usize, c: char);
fn replace_range(&mut self, range: std::ops::Range<usize>, replace_with: &str);
}
impl Clone for Box<dyn FormattableTextDyn> {
fn clone(&self) -> Self {
(**self).clone_boxed()
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct FontToken {
pub start: u32,
pub font_id: FontId,
pub dpem: f32,
}