cn_font_split/pre_subset/
plugin.rs1use 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 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
41pub fn reduce_min_plugin(
43 subsets: &mut Vec<IndexSet<u32>>,
44 _remaining_chars_set: &mut IndexSet<u32>,
45 _ctx: &mut PreSubsetContext,
46) {
47 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}