Re: [PATCH v3] Implement graphemewidth
[Thread Prev] | [Thread Next]
- Subject: Re: [PATCH v3] Implement graphemewidth
- From: Ori Bernstein <ori@xxxxxxxxxxxxxx>
- Reply-to: myrddin-dev@xxxxxxxxxxxxxx
- Date: Sun, 29 Oct 2017 19:46:28 -0700
- To: myrddin-dev@xxxxxxxxxxxxxx
- Cc: "S. Gilles" <sgilles@xxxxxxxxxxxx>
LGTM. applied. On Sun, 29 Oct 2017 00:51:25 -0400, "S. Gilles" <sgilles@xxxxxxxxxxxx> wrote: > --- > Since v2: > > - I'd somehow got it into my head that the arrays in chartype.myr > were inversion lists. This, of course, isn't true. Therefore, > drop the duplicate binary search and just use findc. > > As a side note, I have no idea how to tell git "Please treat > lib/std/test/utf.myr as a UTF-8 text file and don't do that binary > thing". I thought --no-binary would do it, but it omits the file > entirely. The functionality should be there, since > lib/std/test/chartype.myr is handled sanely, but I don't know how > to force it. It's just a couple tests for std.strcellwidth() to > check that I used strstep correctly. > --- > lib/std/chartype.myr | 470 ++++++++++++++++++++++++++++++++++++++++++++++ > lib/std/fmt.myr | 10 +- > lib/std/test/chartype.myr | 18 ++ > lib/std/test/fmt.myr | 4 + > lib/std/test/utf.myr | Bin 0 -> 1305 bytes > lib/std/utf.myr | 29 +++ > 6 files changed, 522 insertions(+), 9 deletions(-) > create mode 100644 lib/std/test/utf.myr > > diff --git a/lib/std/chartype.myr b/lib/std/chartype.myr > index dd31e200..bf01d9ae 100644 > --- a/lib/std/chartype.myr > +++ b/lib/std/chartype.myr > @@ -26,6 +26,8 @@ pkg std = > const totitle : (c : char -> char) > > generic charval : (c : char, base : int -> @a::(integral,numeric)) > + > + const cellwidth : (c : char -> int) > ;; > > extern const put : (fmt : byte[:], args : ... -> size) > @@ -1061,6 +1063,445 @@ const rtotitle1 = [ > 0x01f3, 499 /* dz Dz */ > ] > > +/* > + * Generated by > + * > + * uniset cat:Me,Mn,Cf | \ > + * sed -r 's/^([0-9a-f]+)[.][.]([0-9a-f]+)$/\t0x\1, 0x\2,/' |\ > + * sed -r 's/^([0-9a-f]+)$/\t0x\1, 0x\1,/' > + */ > +const width0 = [ > + 0xad, 0xad, > + 0x300, 0x36f, > + 0x483, 0x489, > + 0x591, 0x5bd, > + 0x5bf, 0x5bf, > + 0x5c1, 0x5c2, > + 0x5c4, 0x5c5, > + 0x5c7, 0x5c7, > + 0x600, 0x605, > + 0x610, 0x61a, > + 0x61c, 0x61c, > + 0x64b, 0x65f, > + 0x670, 0x670, > + 0x6d6, 0x6dd, > + 0x6df, 0x6e4, > + 0x6e7, 0x6e8, > + 0x6ea, 0x6ed, > + 0x70f, 0x70f, > + 0x711, 0x711, > + 0x730, 0x74a, > + 0x7a6, 0x7b0, > + 0x7eb, 0x7f3, > + 0x816, 0x819, > + 0x81b, 0x823, > + 0x825, 0x827, > + 0x829, 0x82d, > + 0x859, 0x85b, > + 0x8d4, 0x902, > + 0x93a, 0x93a, > + 0x93c, 0x93c, > + 0x941, 0x948, > + 0x94d, 0x94d, > + 0x951, 0x957, > + 0x962, 0x963, > + 0x981, 0x981, > + 0x9bc, 0x9bc, > + 0x9c1, 0x9c4, > + 0x9cd, 0x9cd, > + 0x9e2, 0x9e3, > + 0xa01, 0xa02, > + 0xa3c, 0xa3c, > + 0xa41, 0xa42, > + 0xa47, 0xa48, > + 0xa4b, 0xa4d, > + 0xa51, 0xa51, > + 0xa70, 0xa71, > + 0xa75, 0xa75, > + 0xa81, 0xa82, > + 0xabc, 0xabc, > + 0xac1, 0xac5, > + 0xac7, 0xac8, > + 0xacd, 0xacd, > + 0xae2, 0xae3, > + 0xafa, 0xaff, > + 0xb01, 0xb01, > + 0xb3c, 0xb3c, > + 0xb3f, 0xb3f, > + 0xb41, 0xb44, > + 0xb4d, 0xb4d, > + 0xb56, 0xb56, > + 0xb62, 0xb63, > + 0xb82, 0xb82, > + 0xbc0, 0xbc0, > + 0xbcd, 0xbcd, > + 0xc00, 0xc00, > + 0xc3e, 0xc40, > + 0xc46, 0xc48, > + 0xc4a, 0xc4d, > + 0xc55, 0xc56, > + 0xc62, 0xc63, > + 0xc81, 0xc81, > + 0xcbc, 0xcbc, > + 0xcbf, 0xcbf, > + 0xcc6, 0xcc6, > + 0xccc, 0xccd, > + 0xce2, 0xce3, > + 0xd00, 0xd01, > + 0xd3b, 0xd3c, > + 0xd41, 0xd44, > + 0xd4d, 0xd4d, > + 0xd62, 0xd63, > + 0xdca, 0xdca, > + 0xdd2, 0xdd4, > + 0xdd6, 0xdd6, > + 0xe31, 0xe31, > + 0xe34, 0xe3a, > + 0xe47, 0xe4e, > + 0xeb1, 0xeb1, > + 0xeb4, 0xeb9, > + 0xebb, 0xebc, > + 0xec8, 0xecd, > + 0xf18, 0xf19, > + 0xf35, 0xf35, > + 0xf37, 0xf37, > + 0xf39, 0xf39, > + 0xf71, 0xf7e, > + 0xf80, 0xf84, > + 0xf86, 0xf87, > + 0xf8d, 0xf97, > + 0xf99, 0xfbc, > + 0xfc6, 0xfc6, > + 0x102d, 0x1030, > + 0x1032, 0x1037, > + 0x1039, 0x103a, > + 0x103d, 0x103e, > + 0x1058, 0x1059, > + 0x105e, 0x1060, > + 0x1071, 0x1074, > + 0x1082, 0x1082, > + 0x1085, 0x1086, > + 0x108d, 0x108d, > + 0x109d, 0x109d, > + 0x135d, 0x135f, > + 0x1712, 0x1714, > + 0x1732, 0x1734, > + 0x1752, 0x1753, > + 0x1772, 0x1773, > + 0x17b4, 0x17b5, > + 0x17b7, 0x17bd, > + 0x17c6, 0x17c6, > + 0x17c9, 0x17d3, > + 0x17dd, 0x17dd, > + 0x180b, 0x180e, > + 0x1885, 0x1886, > + 0x18a9, 0x18a9, > + 0x1920, 0x1922, > + 0x1927, 0x1928, > + 0x1932, 0x1932, > + 0x1939, 0x193b, > + 0x1a17, 0x1a18, > + 0x1a1b, 0x1a1b, > + 0x1a56, 0x1a56, > + 0x1a58, 0x1a5e, > + 0x1a60, 0x1a60, > + 0x1a62, 0x1a62, > + 0x1a65, 0x1a6c, > + 0x1a73, 0x1a7c, > + 0x1a7f, 0x1a7f, > + 0x1ab0, 0x1abe, > + 0x1b00, 0x1b03, > + 0x1b34, 0x1b34, > + 0x1b36, 0x1b3a, > + 0x1b3c, 0x1b3c, > + 0x1b42, 0x1b42, > + 0x1b6b, 0x1b73, > + 0x1b80, 0x1b81, > + 0x1ba2, 0x1ba5, > + 0x1ba8, 0x1ba9, > + 0x1bab, 0x1bad, > + 0x1be6, 0x1be6, > + 0x1be8, 0x1be9, > + 0x1bed, 0x1bed, > + 0x1bef, 0x1bf1, > + 0x1c2c, 0x1c33, > + 0x1c36, 0x1c37, > + 0x1cd0, 0x1cd2, > + 0x1cd4, 0x1ce0, > + 0x1ce2, 0x1ce8, > + 0x1ced, 0x1ced, > + 0x1cf4, 0x1cf4, > + 0x1cf8, 0x1cf9, > + 0x1dc0, 0x1df9, > + 0x1dfb, 0x1dff, > + 0x200b, 0x200f, > + 0x202a, 0x202e, > + 0x2060, 0x2064, > + 0x2066, 0x206f, > + 0x20d0, 0x20f0, > + 0x2cef, 0x2cf1, > + 0x2d7f, 0x2d7f, > + 0x2de0, 0x2dff, > + 0x302a, 0x302d, > + 0x3099, 0x309a, > + 0xa66f, 0xa672, > + 0xa674, 0xa67d, > + 0xa69e, 0xa69f, > + 0xa6f0, 0xa6f1, > + 0xa802, 0xa802, > + 0xa806, 0xa806, > + 0xa80b, 0xa80b, > + 0xa825, 0xa826, > + 0xa8c4, 0xa8c5, > + 0xa8e0, 0xa8f1, > + 0xa926, 0xa92d, > + 0xa947, 0xa951, > + 0xa980, 0xa982, > + 0xa9b3, 0xa9b3, > + 0xa9b6, 0xa9b9, > + 0xa9bc, 0xa9bc, > + 0xa9e5, 0xa9e5, > + 0xaa29, 0xaa2e, > + 0xaa31, 0xaa32, > + 0xaa35, 0xaa36, > + 0xaa43, 0xaa43, > + 0xaa4c, 0xaa4c, > + 0xaa7c, 0xaa7c, > + 0xaab0, 0xaab0, > + 0xaab2, 0xaab4, > + 0xaab7, 0xaab8, > + 0xaabe, 0xaabf, > + 0xaac1, 0xaac1, > + 0xaaec, 0xaaed, > + 0xaaf6, 0xaaf6, > + 0xabe5, 0xabe5, > + 0xabe8, 0xabe8, > + 0xabed, 0xabed, > + 0xfb1e, 0xfb1e, > + 0xfe00, 0xfe0f, > + 0xfe20, 0xfe2f, > + 0xfeff, 0xfeff, > + 0xfff9, 0xfffb, > + 0x101fd, 0x101fd, > + 0x102e0, 0x102e0, > + 0x10376, 0x1037a, > + 0x10a01, 0x10a03, > + 0x10a05, 0x10a06, > + 0x10a0c, 0x10a0f, > + 0x10a38, 0x10a3a, > + 0x10a3f, 0x10a3f, > + 0x10ae5, 0x10ae6, > + 0x11001, 0x11001, > + 0x11038, 0x11046, > + 0x1107f, 0x11081, > + 0x110b3, 0x110b6, > + 0x110b9, 0x110ba, > + 0x110bd, 0x110bd, > + 0x11100, 0x11102, > + 0x11127, 0x1112b, > + 0x1112d, 0x11134, > + 0x11173, 0x11173, > + 0x11180, 0x11181, > + 0x111b6, 0x111be, > + 0x111ca, 0x111cc, > + 0x1122f, 0x11231, > + 0x11234, 0x11234, > + 0x11236, 0x11237, > + 0x1123e, 0x1123e, > + 0x112df, 0x112df, > + 0x112e3, 0x112ea, > + 0x11300, 0x11301, > + 0x1133c, 0x1133c, > + 0x11340, 0x11340, > + 0x11366, 0x1136c, > + 0x11370, 0x11374, > + 0x11438, 0x1143f, > + 0x11442, 0x11444, > + 0x11446, 0x11446, > + 0x114b3, 0x114b8, > + 0x114ba, 0x114ba, > + 0x114bf, 0x114c0, > + 0x114c2, 0x114c3, > + 0x115b2, 0x115b5, > + 0x115bc, 0x115bd, > + 0x115bf, 0x115c0, > + 0x115dc, 0x115dd, > + 0x11633, 0x1163a, > + 0x1163d, 0x1163d, > + 0x1163f, 0x11640, > + 0x116ab, 0x116ab, > + 0x116ad, 0x116ad, > + 0x116b0, 0x116b5, > + 0x116b7, 0x116b7, > + 0x1171d, 0x1171f, > + 0x11722, 0x11725, > + 0x11727, 0x1172b, > + 0x11a01, 0x11a06, > + 0x11a09, 0x11a0a, > + 0x11a33, 0x11a38, > + 0x11a3b, 0x11a3e, > + 0x11a47, 0x11a47, > + 0x11a51, 0x11a56, > + 0x11a59, 0x11a5b, > + 0x11a8a, 0x11a96, > + 0x11a98, 0x11a99, > + 0x11c30, 0x11c36, > + 0x11c38, 0x11c3d, > + 0x11c3f, 0x11c3f, > + 0x11c92, 0x11ca7, > + 0x11caa, 0x11cb0, > + 0x11cb2, 0x11cb3, > + 0x11cb5, 0x11cb6, > + 0x11d31, 0x11d36, > + 0x11d3a, 0x11d3a, > + 0x11d3c, 0x11d3d, > + 0x11d3f, 0x11d45, > + 0x11d47, 0x11d47, > + 0x16af0, 0x16af4, > + 0x16b30, 0x16b36, > + 0x16f8f, 0x16f92, > + 0x1bc9d, 0x1bc9e, > + 0x1bca0, 0x1bca3, > + 0x1d167, 0x1d169, > + 0x1d173, 0x1d182, > + 0x1d185, 0x1d18b, > + 0x1d1aa, 0x1d1ad, > + 0x1d242, 0x1d244, > + 0x1da00, 0x1da36, > + 0x1da3b, 0x1da6c, > + 0x1da75, 0x1da75, > + 0x1da84, 0x1da84, > + 0x1da9b, 0x1da9f, > + 0x1daa1, 0x1daaf, > + 0x1e000, 0x1e006, > + 0x1e008, 0x1e018, > + 0x1e01b, 0x1e021, > + 0x1e023, 0x1e024, > + 0x1e026, 0x1e02a, > + 0x1e8d0, 0x1e8d6, > + 0x1e944, 0x1e94a, > + 0xe0001, 0xe0001, > + 0xe0020, 0xe007f, > + 0xe0100, 0xe01ef, > +] > + > +/* > + * Generated by > + * > + * uniset eaw:W,F - cat:Me,Mn,Cf | \ > + * sed -r 's/^([0-9a-f]+)[.][.]([0-9a-f]+)$/\t0x\1, 0x\2,/' | \ > + * sed -r 's/^([0-9a-f]+)$/\t0x\1, 0x\1,/' > + */ > +const width2 = [ > + 0x1100, 0x115f, > + 0x231a, 0x231b, > + 0x2329, 0x232a, > + 0x23e9, 0x23ec, > + 0x23f0, 0x23f0, > + 0x23f3, 0x23f3, > + 0x25fd, 0x25fe, > + 0x2614, 0x2615, > + 0x2648, 0x2653, > + 0x267f, 0x267f, > + 0x2693, 0x2693, > + 0x26a1, 0x26a1, > + 0x26aa, 0x26ab, > + 0x26bd, 0x26be, > + 0x26c4, 0x26c5, > + 0x26ce, 0x26ce, > + 0x26d4, 0x26d4, > + 0x26ea, 0x26ea, > + 0x26f2, 0x26f3, > + 0x26f5, 0x26f5, > + 0x26fa, 0x26fa, > + 0x26fd, 0x26fd, > + 0x2705, 0x2705, > + 0x270a, 0x270b, > + 0x2728, 0x2728, > + 0x274c, 0x274c, > + 0x274e, 0x274e, > + 0x2753, 0x2755, > + 0x2757, 0x2757, > + 0x2795, 0x2797, > + 0x27b0, 0x27b0, > + 0x27bf, 0x27bf, > + 0x2b1b, 0x2b1c, > + 0x2b50, 0x2b50, > + 0x2b55, 0x2b55, > + 0x2e80, 0x2e99, > + 0x2e9b, 0x2ef3, > + 0x2f00, 0x2fd5, > + 0x2ff0, 0x2ffb, > + 0x3000, 0x3029, > + 0x302e, 0x303e, > + 0x3041, 0x3096, > + 0x309b, 0x30ff, > + 0x3105, 0x312e, > + 0x3131, 0x318e, > + 0x3190, 0x31ba, > + 0x31c0, 0x31e3, > + 0x31f0, 0x321e, > + 0x3220, 0x3247, > + 0x3250, 0x32fe, > + 0x3300, 0x4dbf, > + 0x4e00, 0xa48c, > + 0xa490, 0xa4c6, > + 0xa960, 0xa97c, > + 0xac00, 0xd7a3, > + 0xf900, 0xfaff, > + 0xfe10, 0xfe19, > + 0xfe30, 0xfe52, > + 0xfe54, 0xfe66, > + 0xfe68, 0xfe6b, > + 0xff01, 0xff60, > + 0xffe0, 0xffe6, > + 0x16fe0, 0x16fe1, > + 0x17000, 0x187ec, > + 0x18800, 0x18af2, > + 0x1b000, 0x1b11e, > + 0x1b170, 0x1b2fb, > + 0x1f004, 0x1f004, > + 0x1f0cf, 0x1f0cf, > + 0x1f18e, 0x1f18e, > + 0x1f191, 0x1f19a, > + 0x1f200, 0x1f202, > + 0x1f210, 0x1f23b, > + 0x1f240, 0x1f248, > + 0x1f250, 0x1f251, > + 0x1f260, 0x1f265, > + 0x1f300, 0x1f320, > + 0x1f32d, 0x1f335, > + 0x1f337, 0x1f37c, > + 0x1f37e, 0x1f393, > + 0x1f3a0, 0x1f3ca, > + 0x1f3cf, 0x1f3d3, > + 0x1f3e0, 0x1f3f0, > + 0x1f3f4, 0x1f3f4, > + 0x1f3f8, 0x1f43e, > + 0x1f440, 0x1f440, > + 0x1f442, 0x1f4fc, > + 0x1f4ff, 0x1f53d, > + 0x1f54b, 0x1f54e, > + 0x1f550, 0x1f567, > + 0x1f57a, 0x1f57a, > + 0x1f595, 0x1f596, > + 0x1f5a4, 0x1f5a4, > + 0x1f5fb, 0x1f64f, > + 0x1f680, 0x1f6c5, > + 0x1f6cc, 0x1f6cc, > + 0x1f6d0, 0x1f6d2, > + 0x1f6eb, 0x1f6ec, > + 0x1f6f4, 0x1f6f8, > + 0x1f910, 0x1f93e, > + 0x1f940, 0x1f94c, > + 0x1f950, 0x1f96b, > + 0x1f980, 0x1f997, > + 0x1f9c0, 0x1f9c0, > + 0x1f9d0, 0x1f9e6, > + 0x20000, 0x2fffd, > + 0x30000, 0x3fffd, > +] > + > const findc = {c, t, n, nelt, ret > var p, m > > @@ -1245,3 +1686,32 @@ generic charval = {c, base -> @a::(numeric,integral) > ;; > -> v > } > + > +const cellwidth = { c : char > + var l > + /* > + * Follows the general idea described at > + * http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c > + */ > + if c == 0 > + -> 0 > + ;; > + > + if c == -1 || c < 0x20 || (c >= 0x7f && c <= 0x9f) > + -> -1 > + ;; > + > + if findc(c, width0[:], width0.len/2, 2, &l) > + if (c >= l[0] && c <= l[1]) > + -> 0 > + ;; > + ;; > + > + if findc(c, width2[:], width2.len/2, 2, &l) > + if (c >= l[0] && c <= l[1]) > + -> 2 > + ;; > + ;; > + > + -> 1 > +} > diff --git a/lib/std/fmt.myr b/lib/std/fmt.myr > index 08b814db..1f542d31 100644 > --- a/lib/std/fmt.myr > +++ b/lib/std/fmt.myr > @@ -553,7 +553,7 @@ const strfmt = {sb, str, params > ;; > ;; > else > - for i = 0; i < w - graphemewidth(str); i++ > + for i = 0; i < w - strcellwidth(str); i++ > sbputc(sb, p) > ;; > sbputs(sb, str) > @@ -564,14 +564,6 @@ const isprint = {b > -> b >= (' ' : byte) && b < ('~' : byte) > } > > -/* > -Hah. like we're going to put in the work to actually > -count graphemes. > -*/ > -const graphemewidth = {str > - -> str.len > -} > - > const digitchars = [ > '0','1','2','3','4', > '5','6','7','8','9', > diff --git a/lib/std/test/chartype.myr b/lib/std/test/chartype.myr > index d0df1d2b..30426e67 100644 > --- a/lib/std/test/chartype.myr > +++ b/lib/std/test/chartype.myr > @@ -20,4 +20,22 @@ const main = { > std.assert(!std.isalnum('!'), "! should not be isalnum\n") > std.assert(!std.isspace('@'), "@ should not be isspace\n") > std.assert(!std.isblank('@'), "@ should not be isblank\n") > + > + std.assert(std.cellwidth(std.Badchar) == -1, "Badchar should have width -1\n") > + std.assert(std.cellwidth((0 : char)) == 0, "U+0000 should have width 0\n") > + std.assert(std.cellwidth('') == -1, "^E should have width -1\n") > + std.assert(std.cellwidth('a') == 1, "'a' should have width 1\n") > + std.assert(std.cellwidth('ê') == 1, "'ê' should have width 1\n") > + std.assert(std.cellwidth('̀') == 0, "U+300 should have width 0\n") > + std.assert(std.cellwidth('ϼ') == 1, "ϼ should have width 1\n") > + std.assert(std.cellwidth('Ї') == 1, "Ї should have width 1\n") > + std.assert(std.cellwidth('⊲') == 1, "⊲ should have width 1\n") > + std.assert(std.cellwidth(' ') == 2, "U+3000 should have width 2\n") > + std.assert(std.cellwidth('ギ') == 2, "ギ should have width 2\n") > + std.assert(std.cellwidth('匌') == 2, "匌 should have width 2\n") > + std.assert(std.cellwidth('') == 0, "U+00AD should have width 0\n") > + std.assert(std.cellwidth('ࠠ') == 0, "U+820 should have width 0\n") > + std.assert(std.cellwidth('־') == 1, "U+5BE should have width 1\n") > + std.assert(std.cellwidth('ֿ') == 0, "U+5BF should have width 0\n") > + std.assert(std.cellwidth('׀') == 1, "U+5C0 should have width 1\n") > } > diff --git a/lib/std/test/fmt.myr b/lib/std/test/fmt.myr > index 5d0cfa83..c1a17acc 100644 > --- a/lib/std/test/fmt.myr > +++ b/lib/std/test/fmt.myr > @@ -56,6 +56,10 @@ const builtins = { > check("\\n\\r\\xff", "{e}", "\n\r\xff") > check("{}barbaz", "{{}}bar{}", "baz") > check("{barbaz}", "{{bar{}}}", "baz") > + check(" Tlön", "{w=10}", "Tlön") > + check(" háček", "{w=10}", "háček") > + check("_____即是多多即", "{w=15,p=_}", "即是多多即") > + check(" τῶν ῾Ελλήνων", "{w=15}", "τῶν ῾Ελλήνων") > check("abcd", "{}", "abcd") > check("123", "{}", 123) > check("7b", "{x}", 123) > diff --git a/lib/std/test/utf.myr b/lib/std/test/utf.myr > new file mode 100644 > index 0000000000000000000000000000000000000000..4ac25d79704f0b359a279cd83f8f42069fb90743 > GIT binary patch > literal 1305 > zcma)+F>ljQ5XV{LPjSlBR*;f{KnxkG45)w@V9nw<4z=po@a!r=2q|uo7N}8M3sK3T > zR3OwP6i5oBB_s@0BnBG0AK_t9iOnB@a~w6OdXh8vy?gJ@zyF=@<V8&cP0w+hpemXU > z1zu7h1&_Gc^c39Ti!ggPJvRqa(_9Rr61=8~M4t#uO(%jV%S9=t&rihjs+#3Vd=gSA > zxN;uiMWQPAVBiEb51C;=CLW)RAcc&JEXLsNL1t-H(TOU9FwYZS&_$v}r^uhnhU^&@ > z8@(g^tRRSrt^u#)Ku`-=Ns+Lc0#6pk(CKeDRj1;Zq1a`X*eE38WArwAZ+_N#^<MYz > z-C-jnUS$!_21aln{8|oSNfr#fV>Akmw%~X91wQqVb&19LFKP^C{%8x4r$lCUr!k{` > z-By(gw|E^#R}+YIA3GO0u>Eb?S$9@w=PNjsej_+kXy+3+rGCRPXs6|rgZt3e3JaXU > zd@@`tc6Pe26H#1<9BlU^9Iv=v+_u|wo49`iw}EE+*mOI%A0!fqp$rZ`OD6r0NU|&m > zkxGA`l}?&_p7G&i_w%2%re~O*(e;e&q*u1R@^^1(e<*|<V+!548L2_-Hm$t`YVT3| > zfZBCx@8Dr4uxe{)h2EM)?YFe{8bd?L<TbV=SyV(VQq;Ff``}yVs&7>{(O7QbvQ)(z > t3ytTma4GHj)>G5BDnIb>BnUE$;0BG=_rtRB2f!>FbCB{XDPSItxqlrZ1D5~* > > literal 0 > HcmV?d00001 > > diff --git a/lib/std/utf.myr b/lib/std/utf.myr > index 6c655a33..439254ca 100644 > --- a/lib/std/utf.myr > +++ b/lib/std/utf.myr > @@ -1,3 +1,5 @@ > +use "extremum" > +use "chartype" > use "die" > use "types" > > @@ -12,6 +14,7 @@ pkg std = > const decode : (buf : byte[:] -> char) > const strstep : (str : byte[:] -> (char, byte[:])) > > + const strcellwidth : (str : byte[:] -> size) > ;; > > const charlen = {c > @@ -101,3 +104,29 @@ const strstep = {str > > -> ((chr : char), str[len:]) > } > + > +const strcellwidth = {str > + var s : byte[:] = str > + var c : char = Badchar > + var n : size = 0 > + > + while s.len > 0 > + (c, s) = strstep(s) > + if c == Badchar > + /* Something will probably be printed as U+FFFD */ > + n++ > + elif c < 0x20 > + /* Control characters take 0 cells */ > + elif c < 0x7f > + /* Bog standard ASCII takes 1 cell */ > + n++ > + elif c == 0x7f > + /* DEL is like a control character */ > + else > + /* It's not ASCII, so ask chartype what to do */ > + n += (abs(cellwidth(c)) : size) > + ;; > + ;; > + > + -> n > +} > -- > 2.14.3 > > -- Ori Bernstein
Re: [PATCH] Implement graphemewidth | Ori Bernstein <ori@xxxxxxxxxxxxxx> |
[PATCH v3] Implement graphemewidth | "S. Gilles" <sgilles@xxxxxxxxxxxx> |
- Prev by Date: [PATCH v3] Implement graphemewidth
- Next by Date: Libtermdraw: Terminfo support has landed.
- Previous by thread: [PATCH v3] Implement graphemewidth
- Next by thread: [PATCH 0/4] Fixes to allow using terminfo for colors on st
- Index(es):