use crate::fonts::FontSelector;
use crate::{Effect, OwningVecIter};
#[allow(unused)]
use crate::{Text, TextDisplay};
mod plain;
#[cfg(feature = "markdown")]
mod markdown;
#[cfg(feature = "markdown")]
pub use markdown::{Error as MarkdownError, Markdown};
pub trait FormattableText: std::cmp::PartialEq + 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];
}
impl<F: FormattableText + ?Sized> FormattableText for &F {
type FontTokenIter<'a>
= F::FontTokenIter<'a>
where
Self: 'a;
fn as_str(&self) -> &str {
F::as_str(self)
}
fn font_tokens<'a>(&'a self, dpem: f32) -> Self::FontTokenIter<'a> {
F::font_tokens(self, dpem)
}
fn effect_tokens(&self) -> &[Effect] {
F::effect_tokens(self)
}
}
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> PartialEq for &'t dyn FormattableTextDyn {
fn eq(&self, _: &Self) -> bool {
false
}
}
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)
}
}
impl Clone for Box<dyn FormattableTextDyn> {
fn clone(&self) -> Self {
(**self).clone_boxed()
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct FontToken {
pub start: u32,
pub dpem: f32,
pub font: FontSelector,
}