text_align/
text_align.rs

1/// Naive version (does not account for Unicode display widths)
2///
3/// Uses `chars().count()` to center content,
4/// which fails for emoji and CJK characters in terminal environments.
5pub fn print_naive_centered_box(content: &str) {
6    let total_width = 120;
7    let content_width = total_width - 2; // borders
8
9    let naive_pad = (content_width - content.chars().count()) / 2;
10
11    println!();
12    println!("┏{}┓", "━".repeat(content_width));
13    println!("┃{:width$}┃", "", width = content_width);
14    println!("┃{:pad$}{}{:pad$}┃", "", content, "", pad = naive_pad);
15    println!("┃{:width$}┃", "", width = content_width);
16    println!("┗{}┛", "━".repeat(content_width));
17}
18
19/// Fixed version using `runefix_core` for proper Unicode width support.
20///
21/// Uses `.width()` to handle fullwidth CJK and emoji correctly.
22#[rustfmt::skip]
23pub fn print_fixed_centered_box(content: &str) {
24    use runefix_core::RuneDisplayWidth;
25
26    let total_width = 120;
27    let content_width = total_width - 2;
28
29    let width = content.width();
30    let left_pad = (content_width - width) / 2;
31    let right_pad = content_width - width - left_pad;
32
33    println!();
34    println!("┏{}┓", "━".repeat(content_width));
35    println!("┃{:width$}┃", "", width = content_width);
36    println!("┃{:left$}{}{:right$}┃", "", content, "", left = left_pad, right = right_pad);
37    println!("┃{:width$}┃", "", width = content_width);
38    println!("┗{}┛", "━".repeat(content_width));
39}
40
41#[rustfmt::skip]
42fn main() {
43    // ASCII only – looks the same
44    print_naive_centered_box("[NAIVE] Lorem ipsum dolor sit amet consectetur adipisicing elit.");
45    print_fixed_centered_box("[FIXED] Lorem ipsum dolor sit amet consectetur adipisicing elit.");
46
47    // Emoji – misaligned vs fixed
48    print_naive_centered_box("[NAIVE] National Language: 🇨🇳 🇯🇵 🇰🇷 🇫🇷 🇩🇪 🇪🇸 🇷🇺 🇬🇧 🇸🇬 🇦🇺 🇨🇦 🇺🇸");
49    print_fixed_centered_box("[FIXED] National Language: 🇨🇳 🇯🇵 🇰🇷 🇫🇷 🇩🇪 🇪🇸 🇷🇺 🇬🇧 🇸🇬 🇦🇺 🇨🇦 🇺🇸");
50
51    // CJK text – broken vs aligned
52    print_naive_centered_box("[NAIVE]《诗》「字」方正于九州,「かな」散らす桜の韻,「한글」물결처럼 퍼지네~");
53    print_fixed_centered_box("[FIXED]《诗》「字」方正于九州,「かな」散らす桜の韻,「한글」물결처럼 퍼지네~");
54}