use std::collections::HashMap;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::paragraph::Paragraph;
use crate::parser::Painter;
use crate::tokens::{ControlWord, Token};
pub type ColorRef = u16;
pub type ColorTable = HashMap<ColorRef, Color>;
pub type FontRef = u16;
pub type FontTable = HashMap<FontRef, Font>;
pub type StyleRef = u16;
pub type StyleSheet = HashMap<StyleRef, Style>;
#[derive(Hash, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct Style {
painter: Painter,
paragraph: Paragraph,
}
#[derive(Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct RtfHeader {
pub character_set: CharacterSet,
pub font_table: FontTable,
pub color_table: ColorTable,
pub stylesheet: StyleSheet,
}
#[derive(Hash, Default, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct Font {
pub name: String,
pub character_set: u8,
pub font_family: FontFamily,
}
#[derive(Hash, Default, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct Color {
pub red: u8,
pub green: u8,
pub blue: u8,
}
#[allow(dead_code)]
#[derive(Debug, PartialEq, Default, Clone, Hash)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub enum CharacterSet {
#[default]
Ansi,
Mac,
Pc,
Pca,
Ansicpg(u16),
}
impl CharacterSet {
pub fn from(token: &Token) -> Option<Self> {
match token {
Token::ControlSymbol((ControlWord::Ansi, _)) => Some(Self::Ansi),
_ => None,
}
}
}
#[allow(dead_code)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[derive(Debug, PartialEq, Hash, Clone, Default)]
pub enum FontFamily {
#[default]
Nil,
Roman,
Swiss,
Modern,
Script,
Decor,
Tech,
Bidi,
}
impl FontFamily {
pub fn from(string: &str) -> Option<Self> {
match string {
r"\fnil" => Some(Self::Nil),
r"\froman" => Some(Self::Roman),
r"\fswiss" => Some(Self::Swiss),
r"\fmodern" => Some(Self::Modern),
r"\fscript" => Some(Self::Script),
r"\fdecor" => Some(Self::Decor),
r"\ftech" => Some(Self::Tech),
r"\fbidi" => Some(Self::Bidi),
_ => None,
}
}
}