google_fonts_subsets/
lib.rs1use std::collections::HashSet;
13
14include!(concat!(env!("OUT_DIR"), "/subsets.rs"));
15
16const CONTROL_CHARS: [u32; 4] = [0x0000, 0x000D, 0x0020, 0x00A0];
17
18pub fn subsets_in_font(
19 codepoints: &HashSet<u32>,
20 min_pct: f32,
21 ext_min_pct: Option<f32>,
22) -> Vec<&'static str> {
23 let active_codepoints = codepoints
24 .iter()
25 .filter(|cp| !CONTROL_CHARS.contains(cp))
26 .collect::<HashSet<_>>();
27 let mut subsets = vec![];
28 for (subset, subset_codepoints) in SUBSETS.iter() {
29 let mut subset_codepoints = subset_codepoints.iter().collect::<HashSet<_>>();
30 if subset == &"Khmer" {
31 subset_codepoints.retain(|cp| !LATIN.contains(cp));
33 }
34 let target_pct = if subset.ends_with("-ext") {
35 ext_min_pct.unwrap_or(min_pct)
36 } else {
37 min_pct
38 };
39
40 let overlap = active_codepoints.intersection(&subset_codepoints).count() as f32;
41 if 100.0 * overlap / subset_codepoints.len() as f32 >= target_pct {
42 subsets.push(*subset);
43 }
44 }
45 subsets
46}