github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/misc/logos/unicode.go (about) 1 package logos 2 3 func isCombining(r rune) bool { 4 return inTable(r, combining) 5 } 6 7 // ---------------------------------------- 8 // from https://github.com/mattn/go-runewidth 9 // runewidth doesn't expose whether a character is combining or not. 10 // TODO might as well fork both runewidth and tcell. 11 12 var combining = table{ 13 {0x0300, 0x036F}, 14 {0x0483, 0x0489}, 15 {0x07EB, 0x07F3}, 16 {0x0C00, 0x0C00}, 17 {0x0C04, 0x0C04}, 18 {0x0D00, 0x0D01}, 19 {0x135D, 0x135F}, 20 {0x1A7F, 0x1A7F}, 21 {0x1AB0, 0x1AC0}, 22 {0x1B6B, 0x1B73}, 23 {0x1DC0, 0x1DF9}, 24 {0x1DFB, 0x1DFF}, 25 {0x20D0, 0x20F0}, 26 {0x2CEF, 0x2CF1}, 27 {0x2DE0, 0x2DFF}, 28 {0x3099, 0x309A}, 29 {0xA66F, 0xA672}, 30 {0xA674, 0xA67D}, 31 {0xA69E, 0xA69F}, 32 {0xA6F0, 0xA6F1}, 33 {0xA8E0, 0xA8F1}, 34 {0xFE20, 0xFE2F}, 35 {0x101FD, 0x101FD}, 36 {0x10376, 0x1037A}, 37 {0x10EAB, 0x10EAC}, 38 {0x10F46, 0x10F50}, 39 {0x11300, 0x11301}, 40 {0x1133B, 0x1133C}, 41 {0x11366, 0x1136C}, 42 {0x11370, 0x11374}, 43 {0x16AF0, 0x16AF4}, 44 {0x1D165, 0x1D169}, 45 {0x1D16D, 0x1D172}, 46 {0x1D17B, 0x1D182}, 47 {0x1D185, 0x1D18B}, 48 {0x1D1AA, 0x1D1AD}, 49 {0x1D242, 0x1D244}, 50 {0x1E000, 0x1E006}, 51 {0x1E008, 0x1E018}, 52 {0x1E01B, 0x1E021}, 53 {0x1E023, 0x1E024}, 54 {0x1E026, 0x1E02A}, 55 {0x1E8D0, 0x1E8D6}, 56 } 57 58 type interval struct { 59 first rune 60 last rune 61 } 62 63 type table []interval 64 65 func inTable(r rune, t table) bool { 66 if r < t[0].first { 67 return false 68 } 69 70 bot := 0 71 top := len(t) - 1 72 for top >= bot { 73 mid := (bot + top) >> 1 74 75 switch { 76 case t[mid].last < r: 77 bot = mid + 1 78 case t[mid].first > r: 79 top = mid - 1 80 default: 81 return true 82 } 83 } 84 85 return false 86 }