diff options
Diffstat (limited to 'build')
-rw-r--r-- | build/generate-emoji.go | 65 |
1 files changed, 51 insertions, 14 deletions
diff --git a/build/generate-emoji.go b/build/generate-emoji.go index 6b1b6643cc..00d60acacc 100644 --- a/build/generate-emoji.go +++ b/build/generate-emoji.go @@ -19,6 +19,7 @@ import ( "sort" "strconv" "strings" + "unicode/utf8" ) const ( @@ -39,6 +40,7 @@ type Emoji struct { Description string `json:"description,omitempty"` Aliases []string `json:"aliases"` UnicodeVersion string `json:"unicode_version,omitempty"` + SkinTones bool `json:"skin_tones,omitempty"` } // Don't include some fields in JSON @@ -47,6 +49,7 @@ func (e Emoji) MarshalJSON() ([]byte, error) { x := emoji(e) x.UnicodeVersion = "" x.Description = "" + x.SkinTones = false return json.Marshal(x) } @@ -75,6 +78,7 @@ var replacer = strings.NewReplacer( ", Description:", ", ", ", Aliases:", ", ", ", UnicodeVersion:", ", ", + ", SkinTones:", ", ", ) var emojiRE = regexp.MustCompile(`\{Emoji:"([^"]*)"`) @@ -102,18 +106,20 @@ func generate() ([]byte, error) { return nil, err } - var re = regexp.MustCompile(`keycap|registered|copyright`) - tmp := data[:0] + var skinTones = make(map[string]string) - // filter out emoji that require greater than max unicode version + skinTones["\U0001f3fb"] = "Light Skin Tone" + skinTones["\U0001f3fc"] = "Medium-Light Skin Tone" + skinTones["\U0001f3fd"] = "Medium Skin Tone" + skinTones["\U0001f3fe"] = "Medium-Dark Skin Tone" + skinTones["\U0001f3ff"] = "Dark Skin Tone" + + var tmp Gemoji + + //filter out emoji that require greater than max unicode version for i := range data { val, _ := strconv.ParseFloat(data[i].UnicodeVersion, 64) if int(val) <= maxUnicodeVersion { - // remove these keycaps for now they really complicate matching since - // they include normal letters in them - if re.MatchString(data[i].Description) { - continue - } tmp = append(tmp, data[i]) } } @@ -123,7 +129,6 @@ func generate() ([]byte, error) { return data[i].Aliases[0] < data[j].Aliases[0] }) - aliasPairs := make([]string, 0) aliasMap := make(map[string]int, len(data)) for i, e := range data { @@ -135,7 +140,6 @@ func generate() ([]byte, error) { continue } aliasMap[a] = i - aliasPairs = append(aliasPairs, ":"+a+":", e.Emoji) } } @@ -149,6 +153,43 @@ func generate() ([]byte, error) { data[i].Aliases = append(data[i].Aliases, "laugh") } + // write a JSON file to use with tribute (write before adding skin tones since we can't support them there yet) + file, _ := json.Marshal(data) + _ = ioutil.WriteFile("assets/emoji.json", file, 0644) + + // Add skin tones to emoji that support it + var ( + s []string + newEmoji string + newDescription string + newData Emoji + ) + + for i := range data { + if data[i].SkinTones { + for k, v := range skinTones { + s = strings.Split(data[i].Emoji, "") + + if utf8.RuneCountInString(data[i].Emoji) == 1 { + s = append(s, k) + } else { + // insert into slice after first element because all emoji that support skin tones + // have that modifer placed at this spot + s = append(s, "") + copy(s[2:], s[1:]) + s[1] = k + } + + newEmoji = strings.Join(s, "") + newDescription = data[i].Description + ": " + v + newAlias := data[i].Aliases[0] + "_" + strings.ReplaceAll(v, " ", "_") + + newData = Emoji{newEmoji, newDescription, []string{newAlias}, "12.0", false} + data = append(data, newData) + } + } + } + // add header str := replacer.Replace(fmt.Sprintf(hdr, gemojiURL, data)) @@ -162,10 +203,6 @@ func generate() ([]byte, error) { return "{" + strconv.QuoteToASCII(s) }) - // write a JSON file to use with tribute - file, _ := json.Marshal(data) - _ = ioutil.WriteFile("assets/emoji.json", file, 0644) - // format return format.Source([]byte(str)) } |