@ -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 ) )
}