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  }