use gilt::cells::cell_len;
use gilt::prelude::*;
fn main() {
let mut console = Console::new();
console.rule(Some("Unicode Cell Width Demo"));
console.print_text("Demonstrating advanced Unicode width handling\n");
console.rule(Some("Basic Characters"));
let basics = [
("A", "ASCII letter", 1),
("Γ±", "Latin accented", 1),
("δΈ", "CJK character", 2),
("γ", "Japanese hiragana", 2),
("ν", "Korean hangul", 2),
];
for (text, desc, expected) in &basics {
let actual = cell_len(text);
let status = if actual == *expected {
"[green]β[/green]"
} else {
"[red]β[/red]"
};
console.print_text(&format!(
"{} {:6} {:20} expected={}, actual={}",
status, text, desc, expected, actual
));
}
console.rule(Some("Emoji"));
let emojis = [
("π©", "Single emoji", 2),
("π", "Smiley", 2),
("π", "Rocket", 2),
("β€οΈ", "Heart with VS16", 2),
("Β©οΈ", "Copyright with VS16", 2),
];
for (text, desc, expected) in &emojis {
let actual = cell_len(text);
let status = if actual == *expected {
"[green]β[/green]"
} else {
"[red]β[/red]"
};
console.print_text(&format!(
"{} {:6} {:25} expected={}, actual={}",
status, text, desc, expected, actual
));
}
console.rule(Some("ZWJ Sequences (Family Emojis)"));
let zwj = [
("π¨βπ©βπ§βπ¦", "Family (ZWJ)", 2),
("π¨ββοΈ", "Man doctor", 2),
("π©βπ", "Woman astronaut", 2),
("π³οΈβπ", "Rainbow flag", 2),
];
for (text, desc, expected) in &zwj {
let actual = cell_len(text);
let status = if actual == *expected {
"[green]β[/green]"
} else {
"[red]β[/red]"
};
console.print_text(&format!(
"{} {:10} {:25} expected={}, actual={}",
status, text, desc, expected, actual
));
}
console.rule(Some("Regional Indicators (Flags)"));
let flags = [
("πΊπΈ", "US flag", 2),
("π¬π§", "UK flag", 2),
("π―π΅", "Japan flag", 2),
("π©πͺ", "Germany flag", 2),
("π«π·", "France flag", 2),
];
for (text, desc, expected) in &flags {
let actual = cell_len(text);
let status = if actual == *expected {
"[green]β[/green]"
} else {
"[red]β[/red]"
};
console.print_text(&format!(
"{} {:6} {:20} expected={}, actual={}",
status, text, desc, expected, actual
));
}
console.rule(Some("Box Drawing (Tree Guides)"));
let guides = [
("β ", "Tree guide (thin)", 4),
("βββ ", "Tree fork (thin)", 4),
("βββ ", "Tree end (thin)", 4),
("β ", "Tree guide (bold)", 4),
("β£ββ ", "Tree fork (bold)", 4),
("βββ ", "Tree end (bold)", 4),
];
for (text, desc, expected) in &guides {
let actual = cell_len(text);
let status = if actual == *expected {
"[green]β[/green]"
} else {
"[red]β[/red]"
};
console.print_text(&format!(
"{} {:10} {:25} expected={}, actual={}",
status, text, desc, expected, actual
));
}
console.rule(Some("Combined Unicode Text"));
let text = "aπ¨βπ©βπ§βπ¦πΊπΈπ©";
console.print_text(&format!("Text: {}", text));
console.print_text(&format!("Total width: {} cells", cell_len(text)));
console.print_text("(ASCII + ZWJ family + Flag + Emoji)");
console.rule(Some("Practical: Mixed Content Table"));
let mut table = Table::new(&["Content", "Type", "Width"]);
table.add_row(&["Hello", "ASCII", "5"]);
table.add_row(&["π©", "Emoji", "2"]);
table.add_row(&["π¨βπ©βπ§βπ¦", "ZWJ Family", "2"]);
table.add_row(&["πΊπΈ", "Flag", "2"]);
table.add_row(&["δΈ", "CJK", "2"]);
console.print(&table);
console.line(1);
console.print_text("[green]β[/green] Unicode width demo complete!");
}