shape.rs
984 B · rust · 26 lines
1/// The characters that dip below the five-row baseline.2pub const DESCENDERS: &[char] = &[3 '@', '$', '\u{00a9}', '\u{00ae}', '(', ')', '[', ']', '{', '}',4];56/// Returns whether the character dips below the baseline.7pub fn descends(c: char) -> bool {8 DESCENDERS.contains(&c)9}1011/// Cuts blank edge columns from a bitmap, collapsing an all-blank one to a single '0' column.12pub fn trim(rows: &[String]) -> Vec<String> {13 let grid: Vec<Vec<char>> = rows.iter().map(|row| row.chars().collect()).collect();14 if grid.is_empty() || grid[0].is_empty() {15 return rows.to_vec();16 }17 let width = grid[0].len();18 let lit = |col: usize| grid.iter().any(|row| row[col] == '1');19 let Some(start) = (0..width).find(|&col| lit(col)) else {20 return grid.iter().map(|_| "0".to_string()).collect();21 };22 let end = (0..width).rev().find(|&col| lit(col)).unwrap();23 grid.iter()24 .map(|row| row[start..=end].iter().collect())25 .collect()26}