1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
package multibase
import (
"strconv"
"strings"
"unicode/utf8"
)
var base256emojiTable = [256]rune{
// Curated list, this is just a list of things that *somwhat* are related to our comunity
'๐', '๐ช', 'โ', '๐ฐ', '๐', // Space
'๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', // Moon
'๐', '๐', '๐', // Our Home, for now (earth)
'๐', // Dragon!!!
'โ', // Our Garden, for now (sol)
'๐ป', '๐ฅ', '๐พ', '๐ฟ', // Computer
// The rest is completed from https://home.unicode.org/emoji/emoji-frequency/ at the time of creation (december 2021) (the data is from 2019), most used first until we reach 256.
// We exclude modifier based emojies (such as flags) as they are bigger than one single codepoint.
// Some other emojies were removed adhoc for various reasons.
'๐', 'โค', '๐', '๐คฃ', '๐', '๐', '๐', '๐ญ', '๐', '๐',
'๐
', '๐', '๐', '๐ฅ', '๐ฅฐ', '๐', '๐', '๐', '๐ข', '๐ค',
'๐', '๐', '๐ช', '๐', 'โบ', '๐', '๐ค', '๐', '๐', '๐',
'๐', '๐น', '๐คฆ', '๐', '๐', 'โ', 'โจ', '๐คท', '๐ฑ', '๐',
'๐ธ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐คฉ',
'๐', '๐', '๐ค', '๐', '๐ฏ', '๐', '๐', '๐ถ', '๐', '๐คญ',
'โฃ', '๐', '๐', '๐', '๐ช', '๐', '๐ฅ', '๐', '๐', '๐ฉ',
'๐ก', '๐คช', '๐', '๐ฅณ', '๐ฅ', '๐คค', '๐', '๐', '๐ณ', 'โ',
'๐', '๐', '๐ด', '๐', '๐ฌ', '๐', '๐', '๐ท', '๐ป', '๐',
'โญ', 'โ
', '๐ฅบ', '๐', '๐', '๐ค', '๐ฆ', 'โ', '๐ฃ', '๐',
'๐', 'โน', '๐', '๐', '๐ ', 'โ', '๐', '๐บ', '๐', '๐ป',
'๐', '๐', '๐', '๐', '๐น', '๐ฃ', '๐ซ', '๐', '๐', '๐ต',
'๐ค', '๐', '๐ด', '๐ค', '๐ผ', '๐ซ', 'โฝ', '๐ค', 'โ', '๐',
'๐คซ', '๐', '๐ฎ', '๐', '๐ป', '๐', '๐ถ', '๐', '๐ฒ', '๐ฟ',
'๐งก', '๐', 'โก', '๐', '๐', 'โ', 'โ', '๐', '๐ฐ', '๐คจ',
'๐ถ', '๐ค', '๐ถ', '๐ฐ', '๐', '๐ข', '๐ค', '๐', '๐จ', '๐จ',
'๐คฌ', 'โ', '๐', '๐บ', '๐ค', '๐', '๐', '๐ฑ', '๐', '๐ถ',
'๐ฅด', 'โถ', 'โก', 'โ', '๐', '๐ธ', 'โฌ', '๐จ', '๐', '๐ฆ',
'๐ท', '๐บ', 'โ ', '๐
', '๐', '๐ต', '๐', '๐คฒ', '๐ค ', '๐คง',
'๐', '๐ต', '๐
', '๐ง', '๐พ', '๐', '๐', '๐ค', '๐', '๐คฏ',
'๐ท', 'โ', '๐ง', '๐ฏ', '๐', '๐', '๐ค', '๐', '๐', 'โ',
'๐ด', '๐ฃ', '๐ธ', '๐', '๐', '๐ฅ', '๐คข', '๐
', '๐ก', '๐ฉ',
'๐', '๐ธ', '๐ป', '๐ค', '๐คฎ', '๐ผ', '๐ฅต', '๐ฉ', '๐', '๐',
'๐ผ', '๐', '๐ฃ', '๐ฅ',
}
var base256emojiReverseTable map[rune]byte
func init() {
base256emojiReverseTable = make(map[rune]byte, len(base256emojiTable))
for i, v := range base256emojiTable {
base256emojiReverseTable[v] = byte(i)
}
}
func base256emojiEncode(in []byte) string {
var l int
for _, v := range in {
l += utf8.RuneLen(base256emojiTable[v])
}
var out strings.Builder
out.Grow(l)
for _, v := range in {
out.WriteRune(base256emojiTable[v])
}
return out.String()
}
type base256emojiCorruptInputError struct {
index int
char rune
}
func (e base256emojiCorruptInputError) Error() string {
return "illegal base256emoji data at input byte " + strconv.FormatInt(int64(e.index), 10) + ", char: '" + string(e.char) + "'"
}
func (e base256emojiCorruptInputError) String() string {
return e.Error()
}
func base256emojiDecode(in string) ([]byte, error) {
out := make([]byte, utf8.RuneCountInString(in))
var stri int
for i := 0; len(in) > 0; i++ {
r, n := utf8.DecodeRuneInString(in)
in = in[n:]
var ok bool
out[i], ok = base256emojiReverseTable[r]
if !ok {
return nil, base256emojiCorruptInputError{stri, r}
}
stri += n
}
return out, nil
}
|