1
// Copyright 2020 The Gitea Authors. All rights reserved.
2
// Copyright 2015 Kenneth Shaw
3
// SPDX-License-Identifier: MIT
23
"code.gitea.io/gitea/modules/json"
27
gemojiURL = "https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json"
28
maxUnicodeVersion = 15
31
var flagOut = flag.String("o", "modules/emoji/emoji_data.go", "out")
33
// Gemoji is a set of emoji data.
36
// Emoji represents a single emoji and associated data.
38
Emoji string `json:"emoji"`
39
Description string `json:"description,omitempty"`
40
Aliases []string `json:"aliases"`
41
UnicodeVersion string `json:"unicode_version,omitempty"`
42
SkinTones bool `json:"skin_tones,omitempty"`
45
// Don't include some fields in JSON
46
func (e Emoji) MarshalJSON() ([]byte, error) {
52
return json.Marshal(x)
61
buf, err := generate()
63
log.Fatalf("generate err: %v", err)
67
err = os.WriteFile(*flagOut, buf, 0o644)
69
log.Fatalf("WriteFile err: %v", err)
73
var replacer = strings.NewReplacer(
74
"main.Gemoji", "Gemoji",
77
", Description:", ", ",
79
", UnicodeVersion:", ", ",
83
var emojiRE = regexp.MustCompile(`\{Emoji:"([^"]*)"`)
85
func generate() ([]byte, error) {
89
res, err := http.Get(gemojiURL)
93
defer res.Body.Close()
96
body, err := io.ReadAll(res.Body)
103
err = json.Unmarshal(body, &data)
108
skinTones := make(map[string]string)
110
skinTones["\U0001f3fb"] = "Light Skin Tone"
111
skinTones["\U0001f3fc"] = "Medium-Light Skin Tone"
112
skinTones["\U0001f3fd"] = "Medium Skin Tone"
113
skinTones["\U0001f3fe"] = "Medium-Dark Skin Tone"
114
skinTones["\U0001f3ff"] = "Dark Skin Tone"
118
// filter out emoji that require greater than max unicode version
119
for i := range data {
120
val, _ := strconv.ParseFloat(data[i].UnicodeVersion, 64)
121
if int(val) <= maxUnicodeVersion {
122
tmp = append(tmp, data[i])
127
sort.Slice(data, func(i, j int) bool {
128
return data[i].Aliases[0] < data[j].Aliases[0]
131
aliasMap := make(map[string]int, len(data))
133
for i, e := range data {
134
if e.Emoji == "" || len(e.Aliases) == 0 {
137
for _, a := range e.Aliases {
145
// gitea customizations
146
i, ok := aliasMap["tada"]
148
data[i].Aliases = append(data[i].Aliases, "hooray")
150
i, ok = aliasMap["laughing"]
152
data[i].Aliases = append(data[i].Aliases, "laugh")
155
// write a JSON file to use with tribute (write before adding skin tones since we can't support them there yet)
156
file, _ := json.Marshal(data)
157
_ = os.WriteFile("assets/emoji.json", file, 0o644)
159
// Add skin tones to emoji that support it
163
newDescription string
167
for i := range data {
168
if data[i].SkinTones {
169
for k, v := range skinTones {
170
s = strings.Split(data[i].Emoji, "")
172
if utf8.RuneCountInString(data[i].Emoji) == 1 {
175
// insert into slice after first element because all emoji that support skin tones
176
// have that modifier placed at this spot
182
newEmoji = strings.Join(s, "")
183
newDescription = data[i].Description + ": " + v
184
newAlias := data[i].Aliases[0] + "_" + strings.ReplaceAll(v, " ", "_")
186
newData = Emoji{newEmoji, newDescription, []string{newAlias}, "12.0", false}
187
data = append(data, newData)
192
sort.Slice(data, func(i, j int) bool {
193
return data[i].Aliases[0] < data[j].Aliases[0]
197
str := replacer.Replace(fmt.Sprintf(hdr, gemojiURL, data))
199
// change the format of the unicode string
200
str = emojiRE.ReplaceAllStringFunc(str, func(s string) string {
202
s, err = strconv.Unquote(s[len("{Emoji:"):])
206
return "{" + strconv.QuoteToASCII(s)
210
return format.Source([]byte(str))
214
// Copyright 2020 The Gitea Authors. All rights reserved.
215
// SPDX-License-Identifier: MIT
220
// Code generated by build/generate-emoji.go. DO NOT EDIT.