include!(concat!(env!("OUT_DIR"), "/sigmas_and_xis_generated.rs"));
use crate::font_metrics_data::CharacterMetrics;
use crate::namespace::KeyMap;
use crate::types::Mode;
use crate::unicode::supported_codepoint;
use crate::{KatexContext, ParseError};
use phf::phf_map;
pub type FontSizeIndex = usize;
pub use crate::font_metrics_data::CharacterMetrics as CharacterMetric;
pub type MetricMap = KeyMap<u32, CharacterMetric>;
pub const EXTRA_CHARACTER_MAP: phf::Map<char, char> = phf_map! {
'\u{c5}' => 'A',
'\u{d0}' => 'D',
'\u{de}' => 'o',
'\u{e5}' => 'a',
'\u{f0}' => 'd',
'\u{fe}' => 'o',
'\u{410}' => 'A',
'\u{411}' => 'B',
'\u{412}' => 'B',
'\u{413}' => 'F',
'\u{414}' => 'A',
'\u{415}' => 'E',
'\u{416}' => 'K',
'\u{417}' => '3',
'\u{418}' => 'N',
'\u{419}' => 'N',
'\u{41a}' => 'K',
'\u{41b}' => 'N',
'\u{41c}' => 'M',
'\u{41d}' => 'H',
'\u{41e}' => 'O',
'\u{41f}' => 'N',
'\u{420}' => 'P',
'\u{421}' => 'C',
'\u{422}' => 'T',
'\u{423}' => 'y',
'\u{424}' => 'O',
'\u{425}' => 'X',
'\u{426}' => 'U',
'\u{427}' => 'h',
'\u{428}' => 'W',
'\u{429}' => 'W',
'\u{42a}' => 'B',
'\u{42b}' => 'X',
'\u{42c}' => 'B',
'\u{42d}' => '3',
'\u{42e}' => 'X',
'\u{42f}' => 'R',
'\u{430}' => 'a',
'\u{431}' => 'b',
'\u{432}' => 'a',
'\u{433}' => 'r',
'\u{434}' => 'y',
'\u{435}' => 'e',
'\u{436}' => 'm',
'\u{437}' => 'e',
'\u{438}' => 'n',
'\u{439}' => 'n',
'\u{43a}' => 'n',
'\u{43b}' => 'n',
'\u{43c}' => 'm',
'\u{43d}' => 'n',
'\u{43e}' => 'o',
'\u{43f}' => 'n',
'\u{440}' => 'p',
'\u{441}' => 'c',
'\u{442}' => 'o',
'\u{443}' => 'y',
'\u{444}' => 'b',
'\u{445}' => 'x',
'\u{446}' => 'n',
'\u{447}' => 'n',
'\u{448}' => 'w',
'\u{449}' => 'w',
'\u{44a}' => 'a',
'\u{44b}' => 'm',
'\u{44c}' => 'a',
'\u{44d}' => 'e',
'\u{44e}' => 'm',
'\u{44f}' => 'r',
};
pub fn get_character_metrics<'a>(
ctx: &'a KatexContext,
character: char,
font: &str,
mode: Mode,
) -> Result<Option<&'a CharacterMetrics>, ParseError> {
let mut ch = character as u32;
if let Some(metrics) = ctx.font_metrics.get_metric(font, ch)? {
return Ok(Some(metrics));
}
if let Some(&replacement_char) = EXTRA_CHARACTER_MAP.get(&character) {
ch = replacement_char as u32;
if let Some(metrics) = ctx.font_metrics.get_metric(font, ch)? {
return Ok(Some(metrics));
}
}
if mode == Mode::Text && supported_codepoint(ch) {
if let Some(metrics) = ctx.font_metrics.get_metric(font, 77)? {
return Ok(Some(metrics));
}
}
Ok(None)
}