use std::collections::HashMap;
use crate::font::{Font, FontMap};
pub struct Converter {
font_mappings: HashMap<Font, FontMap>,
}
impl Converter {
pub fn new(fonts: &[Font]) -> Self {
let mut font_mappings = HashMap::new();
for font in fonts {
font_mappings.insert(*font, font.characters());
}
Self { font_mappings }
}
pub fn convert(&self, source: &[char], font: Font) -> String {
let mapping = self
.font_mappings
.get(&font)
.expect("Unexpected font specified");
source
.iter()
.map(|original| {
if let Some(converted) = mapping.get(original) {
converted
} else {
original
}
})
.collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
fn setup_converter() -> Converter {
Converter::new(&[
Font::Bold,
Font::Italic,
Font::BoldItalic,
Font::Sans,
Font::BoldSans,
Font::ItalicSans,
Font::BoldItalicSans,
Font::Script,
Font::BoldScript,
Font::Fraktur,
Font::BoldFraktur,
Font::Monospace,
Font::Blackboard,
])
}
#[test]
fn skip_non_target_chars() {
let converter = setup_converter();
let source = "ernct_jahmlsz ใwgdqi-uxfpvobyk"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"๐๐ซ๐ง๐๐ญ_๐ฃ๐๐ก๐ฆ๐ฅ๐ฌ๐ณ ใ๐ฐ๐ ๐๐ช๐ข-๐ฎ๐ฑ๐๐ฉ๐ฏ๐จ๐๐ฒ๐ค",
converter.convert(&source, Font::Bold)
);
}
#[test]
fn bold() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"๐๐๐ฒ๐ฆ๐๐๐๐๐๐ง๐๐๐๐ก๐๐จ๐๐ค๐๐๐๐ฎ๐๐๐๐ฌ๐๐๐๐๐๐๐ฃ๐ณ๐๐๐ญ๐๐๐๐
๐๐๐ ๐๐ฉ๐๐๐ฑ๐ข๐๐๐ซ๐๐ช๐๐ฅ๐๐ฐ๐๐๐ฏ",
converter.convert(&source, Font::Bold)
);
}
#[test]
fn italic() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"8๐๐ฆ๐๐๐๐ฟ๐3๐๐ผ๐๐โ๐๐๐๐๐พ๐บ๐๐ข๐9๐ป๐ ๐๐๐ถ675๐๐ง๐ต๐ธ๐ก๐ด๐๐ท๐น๐๐
๐๐๐๐๐๐ฅ๐๐ฝ๐๐0๐4๐1๐ค2๐๐ฃ",
converter.convert(&source, Font::Italic)
);
}
#[test]
fn bold_italic() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"8๐พ๐๐๐ฟ๐๐ณ๐ฝ3๐๐ฐ๐ต๐ผ๐๐ถ๐๐ธ๐๐ฒ๐ฎ๐๐๐9๐ฏ๐๐๐บ๐ช675๐๐๐ฉ๐ฌ๐๐จ๐ป๐ซ๐ญ๐ด๐น๐๐ท๐๐๐๐๐๐ฑ๐๐0๐4๐1๐2๐
๐",
converter.convert(&source, Font::BoldItalic)
);
}
#[test]
fn sans() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"๐ช๐ถ๐๐๐ท๐ป๐ซ๐ต๐ฅ๐๐จ๐ญ๐ด๐๐ฎ๐๐ฐ๐๐ช๐ฆ๐ฟ๐๐ธ๐ซ๐ง๐๐น๐ฒ๐ข๐จ๐ฉ๐ง๐๐๐ก๐ค๐๐ ๐ณ๐ฃ๐ฅ๐ฌ๐ฑ๐๐ฏ๐๐พ๐บ๐๐๐ฉ๐ผ๐๐ข๐๐ฆ๐
๐ฃ๐๐ค๐ฝ๐",
converter.convert(&source, Font::Sans)
);
}
#[test]
fn bold_sans() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"๐ด๐ช๐๐บ๐ซ๐ฏ๐๐ฉ๐ฏ๐ป๐๐ก๐จ๐ต๐ข๐ผ๐ค๐ธ๐๐๐ณ๐๐ฌ๐ต๐๐๐ญ๐ฆ๐๐ฒ๐ณ๐ฑ๐ท๐๐๐๐๐๐ง๐๐๐ ๐ฅ๐ด๐ฃ๐ฝ๐ฒ๐ฎ๐
๐ถ๐๐ฐ๐ฟ๐ฌ๐พ๐ฐ๐น๐ญ๐๐ฎ๐ฑ๐",
converter.convert(&source, Font::BoldSans)
);
}
#[test]
fn italic_sans() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"๐ด๐๐บ๐ฎ๐๐ฃ๐๐๐ฏ๐ฏ๐๐๐๐ฉ๐๐ฐ๐๐ฌ๐๐๐ง๐ถ๐ ๐ต๐๐ด๐ก๐๐๐ฒ๐ณ๐ฑ๐ซ๐ป๐๐๐ต๐๐๐๐๐๐๐จ๐๐ฑ๐ฆ๐ข๐น๐ช๐๐ค๐ณ๐ฌ๐ฒ๐ฐ๐ญ๐ญ๐ธ๐ฎ๐ฅ๐ท",
converter.convert(&source, Font::ItalicSans)
);
}
#[test]
fn bold_italic_sans() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"๐ด๐๐ฎ๐ข๐๐๐๐๐ฏ๐ฃ๐๐๐๐๐๐ค๐๐ ๐๐๐๐ช๐๐ต๐๐จ๐๐๐พ๐ฒ๐ณ๐ฑ๐๐ฏ๐ฝ๐๐ฉ๐ผ๐๐ฟ๐๐๐๐๐๐ฅ๐๐๐ญ๐๐
๐๐ง๐ฌ๐ฆ๐ฐ๐ก๐ญ๐ฌ๐ฎ๐๐ซ",
converter.convert(&source, Font::BoldItalicSans)
);
}
#[test]
fn script() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"8๐ฒ๐๐๐ณ๐ทโ๐ฑ3๐โ๐ฉ๐ฐ๐ฝ๐ชโด๐ฌ๐๐ฆ๐ข๐ป๐๐ด9โ๐๐ต๐ฎ๐675๐ฟ๐โฌโฐ๐๐๐ฏ๐โฑโณโโ๐ซ๐
โฏ๐ถ๐๐พ๐ฅ๐ธ๐0๐4๐1๐2๐น๐",
converter.convert(&source, Font::Script)
);
}
#[test]
fn bold_script() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"8๐ฆ๐๐ถ๐ง๐ซ๐๐ฅ3๐ท๐๐๐ค๐ฑ๐๐ธ๐ ๐ด๐๐๐ฏ๐พ๐จ9๐๐ผ๐ฉ๐ข๐675๐ณ๐๐๐๐ฝ๐๐ฃ๐๐๐๐ก๐ฐ๐๐น๐ฎ๐ช๐๐ฒ๐๐ฌ๐ป0๐บ4๐ต1๐2๐ญ๐ฟ",
converter.convert(&source, Font::BoldScript)
);
}
#[test]
fn fraktur() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"8๐๐ถ๐ช๐๐๐๐3๐ซโ๐๐๐ฅ๐๐ฌ๐๐จ๐๐๐ฃ๐ฒ๐9โ๐ฐโจ๐โญ675๐ง๐ท๐
๐๐ฑ๐๐๐๐๐โ๐ค๐๐ญ๐ข๐๐ต๐ฆ๐๐ ๐ฏ0๐ฎ4๐ฉ1๐ด2๐ก๐ณ",
converter.convert(&source, Font::Fraktur)
);
}
#[test]
fn bold_fraktur() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"8๐๐๐๐๐๐ท๐3๐๐ด๐น๐๐๐บ๐๐ผ๐๐ถ๐ฒ๐๐๐9๐ณ๐๐
๐พ๐ฎ675๐๐๐ญ๐ฐ๐๐ฌ๐ฟ๐ฏ๐ฑ๐ธ๐ฝ๐๐ป๐๐๐๐๐๐ต๐๐0๐4๐1๐2๐๐",
converter.convert(&source, Font::BoldFraktur)
);
}
#[test]
fn monospace() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"๐พ๐๐ข๐๐๐๐ป๐
๐น๐๐ธ๐ฝ๐๐๐พ๐๐๐๐บ๐ถ๐๐๐๐ฟ๐ท๐๐๐๐ฒ๐ผ๐ฝ๐ป๐๐ฃ๐ฑ๐ด๐๐ฐ๐๐ณ๐ต๐ผ๐๐๐ฟ๐๐๐๐ก๐๐น๐๐๐ถ๐๐บ๐๐ท๐ ๐ธ๐๐",
converter.convert(&source, Font::Monospace)
);
}
#[test]
fn blackboard() {
let converter = setup_converter();
let source = "8WymXbLV3nINUhOoQkKGfuY9HsZSC675jzBEtATDFMRgPpeaxiJcr0q4l1w2dv"
.chars()
.collect::<Vec<_>>();
assert_eq!(
"๐ ๐๐ช๐๐๐๐๐๐๐๐โ๐๐๐๐ โ๐๐๐พ๐๐ฆ๐๐กโ๐คโค๐โ๐๐๐๐๐ซ๐น๐ผ๐ฅ๐ธ๐๐ป๐ฝ๐โ๐โ๐ก๐๐๐ฉ๐๐๐๐ฃ๐๐ข๐๐๐๐จ๐๐๐ง",
converter.convert(&source, Font::Blackboard)
);
}
}