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(
25 codepoints: &HashSet<u32>,
26 min_pct: f32,
27 ext_min_pct: Option<f32>,
28) -> Vec<&'static str> {
29 let active_codepoints = codepoints
30 .iter()
31 .filter(|cp| !CONTROL_CHARS.contains(cp))
32 .collect::<HashSet<_>>();
33 let mut subsets = vec![];
34 for (subset, subset_codepoints) in SUBSETS.iter() {
35 let mut subset_codepoints = subset_codepoints.iter().collect::<HashSet<_>>();
36 if subset == &"Khmer" {
37 subset_codepoints.retain(|cp| !LATIN.contains(cp));
39 }
40 let target_pct = if subset.ends_with("-ext") {
41 ext_min_pct.unwrap_or(min_pct)
42 } else {
43 min_pct
44 };
45
46 let overlap = active_codepoints.intersection(&subset_codepoints).count() as f32;
47 if 100.0 * overlap / subset_codepoints.len() as f32 >= target_pct {
48 subsets.push(*subset);
49 }
50 }
51 subsets
52}
53
54pub fn subsets_for_codepoint(codepoint: u32) -> impl Iterator<Item = &'static str> {
56 SUBSETS
57 .iter()
58 .filter_map(move |(subset, subset_codepoints)| {
59 if subset_codepoints.contains(&codepoint) {
60 Some(*subset)
61 } else {
62 None
63 }
64 })
65}