unicode: change cell to wide when grapheme width changes

This commit is contained in:
Jacob Sandlund
2025-11-24 04:47:23 -05:00
parent b9ab2b8c4f
commit 6afdf3400e
5 changed files with 371 additions and 53 deletions

View File

@@ -13,6 +13,10 @@ pub const Properties = packed struct {
/// becomes a 2-em dash).
width: u2 = 0,
/// Whether the code point does not contribute to the width of a grapheme
/// cluster (not used for single code point cells).
width_zero_in_grapheme: bool = false,
/// Grapheme break property.
grapheme_break: uucode.x.types.GraphemeBreakNoControl = .other,
@@ -23,6 +27,7 @@ pub const Properties = packed struct {
// Needed for lut.Generator
pub fn eql(a: Properties, b: Properties) bool {
return a.width == b.width and
a.width_zero_in_grapheme == b.width_zero_in_grapheme and
a.grapheme_break == b.grapheme_break and
a.emoji_vs_text == b.emoji_vs_text and
a.emoji_vs_emoji == b.emoji_vs_emoji;
@@ -36,12 +41,14 @@ pub const Properties = packed struct {
try writer.print(
\\.{{
\\ .width= {},
\\ .width_zero_in_grapheme= {},
\\ .grapheme_break= .{s},
\\ .emoji_vs_text= {},
\\ .emoji_vs_emoji= {},
\\}}
, .{
self.width,
self.width_zero_in_grapheme,
@tagName(self.grapheme_break),
self.emoji_vs_text,
self.emoji_vs_emoji,

View File

@@ -8,6 +8,7 @@ const Properties = @import("props.zig").Properties;
pub fn get(cp: u21) Properties {
if (cp > uucode.config.max_code_point) return .{
.width = 1,
.width_zero_in_grapheme = true,
.grapheme_break = .other,
.emoji_vs_text = false,
.emoji_vs_emoji = false,
@@ -15,6 +16,7 @@ pub fn get(cp: u21) Properties {
return .{
.width = uucode.get(.width, cp),
.width_zero_in_grapheme = uucode.get(.wcwidth_zero_in_grapheme, cp),
.grapheme_break = uucode.get(.grapheme_break_no_control, cp),
.emoji_vs_text = uucode.get(.is_emoji_vs_text, cp),
.emoji_vs_emoji = uucode.get(.is_emoji_vs_emoji, cp),