cn_font_split/pre_subset/
plugin.rs

1use indexmap::IndexSet;
2
3use lang_unicodes::create_default_unicode_area;
4use log::info;
5
6use super::PreSubsetContext;
7
8pub fn language_area_plugin(
9    subsets: &mut Vec<IndexSet<u32>>,
10    remaining_chars_set: &mut IndexSet<u32>,
11    _ctx: &mut PreSubsetContext,
12) {
13    let language_area = create_default_unicode_area();
14    language_area.iter().for_each(|area| {
15        let set = IndexSet::from_iter(
16            area.iter()
17                .filter(|c| {
18                    let is_in_remain = remaining_chars_set.contains(*c);
19                    // ! 副作用,从剩余字符中删除这个字符
20                    remaining_chars_set.shift_remove(*c);
21                    is_in_remain
22                })
23                .map(|c| c.clone()),
24        );
25        if set.len() > 0 {
26            subsets.push(set);
27        }
28    });
29}
30
31pub fn add_remain_chars_plugin(
32    subsets: &mut Vec<IndexSet<u32>>,
33    remaining_chars_set: &mut IndexSet<u32>,
34    _ctx: &mut PreSubsetContext,
35) {
36    info!("{} 个剩余字符被处理", remaining_chars_set.len());
37    subsets.push(remaining_chars_set.clone());
38    remaining_chars_set.clear();
39}
40
41/// 把数量低于某个值的包,重新规划,缩减碎片分包数
42pub fn reduce_min_plugin(
43    subsets: &mut Vec<IndexSet<u32>>,
44    _remaining_chars_set: &mut IndexSet<u32>,
45    _ctx: &mut PreSubsetContext,
46) {
47    // TODO 抽取为定义
48    let min = 10;
49    let max = 100;
50    let mut cache: Vec<u32> = Vec::new();
51    subsets.retain(|x| {
52        if x.len() <= min {
53            cache.extend(x.clone());
54            return false;
55        }
56        return true;
57    });
58    let new_cache: Vec<IndexSet<u32>> = cache
59        .chunks(max)
60        .map(|x| x.iter().cloned().collect::<IndexSet<u32>>())
61        .collect();
62    subsets.extend(new_cache);
63}