130 lines
4.6 KiB
Rust
130 lines
4.6 KiB
Rust
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
|
|
use unicode_script::Script;
|
|
|
|
use super::Fallback;
|
|
|
|
/// A platform-specific font fallback list, for Unix.
|
|
#[derive(Debug)]
|
|
pub struct PlatformFallback;
|
|
|
|
impl Fallback for PlatformFallback {
|
|
fn common_fallback(&self) -> &'static [&'static str] {
|
|
common_fallback()
|
|
}
|
|
|
|
fn forbidden_fallback(&self) -> &'static [&'static str] {
|
|
forbidden_fallback()
|
|
}
|
|
|
|
fn script_fallback(
|
|
&self,
|
|
script: unicode_script::Script,
|
|
locale: &str,
|
|
) -> &'static [&'static str] {
|
|
script_fallback(script, locale)
|
|
}
|
|
}
|
|
|
|
// Fallbacks to use after any script specific fallbacks
|
|
fn common_fallback() -> &'static [&'static str] {
|
|
//TODO: abstract style (sans/serif/monospaced)
|
|
&[
|
|
/* Sans-serif fallbacks */
|
|
"Noto Sans",
|
|
/* More sans-serif fallbacks */
|
|
"DejaVu Sans",
|
|
"FreeSans",
|
|
/* Mono fallbacks */
|
|
"Noto Sans Mono",
|
|
"DejaVu Sans Mono",
|
|
"FreeMono",
|
|
/* Symbols fallbacks */
|
|
"Noto Sans Symbols",
|
|
"Noto Sans Symbols2",
|
|
/* Emoji fallbacks*/
|
|
"Noto Color Emoji",
|
|
//TODO: Add CJK script here for doublewides?
|
|
]
|
|
}
|
|
|
|
// Fallbacks to never use
|
|
fn forbidden_fallback() -> &'static [&'static str] {
|
|
&[]
|
|
}
|
|
|
|
fn han_unification(locale: &str) -> &'static [&'static str] {
|
|
match locale {
|
|
// Japan
|
|
"ja" => &["Noto Sans CJK JP"],
|
|
// Korea
|
|
"ko" => &["Noto Sans CJK KR"],
|
|
// Hong Kong
|
|
"zh-HK" => &["Noto Sans CJK HK"],
|
|
// Taiwan
|
|
"zh-TW" => &["Noto Sans CJK TC"],
|
|
// Simplified Chinese is the default (also catches "zh-CN" for China)
|
|
_ => &["Noto Sans CJK SC"],
|
|
}
|
|
}
|
|
|
|
// Fallbacks to use per script
|
|
fn script_fallback(script: Script, locale: &str) -> &'static [&'static str] {
|
|
//TODO: abstract style (sans/serif/monospaced)
|
|
match script {
|
|
Script::Adlam => &["Noto Sans Adlam", "Noto Sans Adlam Unjoined"],
|
|
Script::Arabic => &["Noto Sans Arabic"],
|
|
Script::Armenian => &["Noto Sans Armenian"],
|
|
Script::Bengali => &["Noto Sans Bengali"],
|
|
Script::Bopomofo => han_unification(locale),
|
|
//TODO: DejaVu Sans would typically be selected for braille characters,
|
|
// but this breaks alignment when used alongside monospaced text.
|
|
// By requesting the use of FreeMono first, this issue can be avoided.
|
|
Script::Braille => &["FreeMono"],
|
|
Script::Buhid => &["Noto Sans Buhid"],
|
|
Script::Chakma => &["Noto Sans Chakma"],
|
|
Script::Cherokee => &["Noto Sans Cherokee"],
|
|
Script::Deseret => &["Noto Sans Deseret"],
|
|
Script::Devanagari => &["Noto Sans Devanagari"],
|
|
Script::Ethiopic => &["Noto Sans Ethiopic"],
|
|
Script::Georgian => &["Noto Sans Georgian"],
|
|
Script::Gothic => &["Noto Sans Gothic"],
|
|
Script::Grantha => &["Noto Sans Grantha"],
|
|
Script::Gujarati => &["Noto Sans Gujarati"],
|
|
Script::Gurmukhi => &["Noto Sans Gurmukhi"],
|
|
Script::Han => han_unification(locale),
|
|
Script::Hangul => han_unification("ko"),
|
|
Script::Hanunoo => &["Noto Sans Hanunoo"],
|
|
Script::Hebrew => &["Noto Sans Hebrew"],
|
|
Script::Hiragana => han_unification("ja"),
|
|
Script::Javanese => &["Noto Sans Javanese"],
|
|
Script::Kannada => &["Noto Sans Kannada"],
|
|
Script::Katakana => han_unification("ja"),
|
|
Script::Khmer => &["Noto Sans Khmer"],
|
|
Script::Lao => &["Noto Sans Lao"],
|
|
Script::Malayalam => &["Noto Sans Malayalam"],
|
|
Script::Mongolian => &["Noto Sans Mongolian"],
|
|
Script::Myanmar => &["Noto Sans Myanmar"],
|
|
Script::Oriya => &["Noto Sans Oriya"],
|
|
Script::Runic => &["Noto Sans Runic"],
|
|
Script::Sinhala => &["Noto Sans Sinhala"],
|
|
Script::Syriac => &["Noto Sans Syriac"],
|
|
Script::Tagalog => &["Noto Sans Tagalog"],
|
|
Script::Tagbanwa => &["Noto Sans Tagbanwa"],
|
|
Script::Tai_Le => &["Noto Sans Tai Le"],
|
|
Script::Tai_Tham => &["Noto Sans Tai Tham"],
|
|
Script::Tai_Viet => &["Noto Sans Tai Viet"],
|
|
Script::Tamil => &["Noto Sans Tamil"],
|
|
Script::Telugu => &["Noto Sans Telugu"],
|
|
Script::Thaana => &["Noto Sans Thaana"],
|
|
Script::Thai => &["Noto Sans Thai"],
|
|
//TODO: no sans script?
|
|
Script::Tibetan => &["Noto Serif Tibetan"],
|
|
Script::Tifinagh => &["Noto Sans Tifinagh"],
|
|
Script::Vai => &["Noto Sans Vai"],
|
|
//TODO: Use han_unification?
|
|
Script::Yi => &["Noto Sans Yi", "Noto Sans CJK SC"],
|
|
_ => &[],
|
|
}
|
|
}
|