Skip to content

Commit

Permalink
Merge pull request #30 from kyokomi/feature/compatibility
Browse files Browse the repository at this point in the history
Fix compatible with gemoji codemap
  • Loading branch information
kyokomi authored Feb 2, 2019
2 parents 3e8ba3a + 28a598f commit bc10b9e
Show file tree
Hide file tree
Showing 4 changed files with 701 additions and 2 deletions.
52 changes: 52 additions & 0 deletions cmd/generateEmojiCodeMap/emoji_v5.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package main

import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
)

const emojoV5DBJsonURL = "https://raw.githubusercontent.com/CodeFreezr/emojo/master/db/v5/emoji-v5.json"

// Emojo json parse struct
type Emojo struct {
No int `json:"No"`
Emoji string `json:"Emoji"`
Category string `json:"Category"`
SubCategory string `json:"SubCategory"`
Unicode string `json:"Unicode"`
Name string `json:"Name"`
Tags string `json:"Tags"`
Shortcode string `json:"Shortcode"`
}

func createEmojoCodeMap() (map[string]string, error) {
res, err := http.Get(emojoV5DBJsonURL)
if err != nil {
return nil, err
}
defer res.Body.Close()

emojiFile, err := ioutil.ReadAll(res.Body)
if err != nil {
return nil, err
}

var gs []Emojo
if err := json.Unmarshal(emojiFile, &gs); err != nil {
return nil, err
}

emojiCodeMap := make(map[string]string)
for _, gemoji := range gs {
shortCode := strings.Replace(gemoji.Shortcode, ":", "", 2)
if len(shortCode) == 0 {
continue
}
emojiCodeMap[shortCode] = fmt.Sprintf("%+q", gemoji.Emoji)
}

return emojiCodeMap, nil
}
45 changes: 45 additions & 0 deletions cmd/generateEmojiCodeMap/gemoji.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package main

import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)

const gemojiDBJsonURL = "https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json"

// GemojiEmoji gemoji json parse struct
type GemojiEmoji struct {
Aliases []string `json:"aliases"`
Description string `json:"description"`
Emoji string `json:"emoji"`
Tags []string `json:"tags"`
}

func createGemojiCodeMap() (map[string]string, error) {
res, err := http.Get(gemojiDBJsonURL)
if err != nil {
return nil, err
}
defer res.Body.Close()

emojiFile, err := ioutil.ReadAll(res.Body)
if err != nil {
return nil, err
}

var gs []GemojiEmoji
if err := json.Unmarshal(emojiFile, &gs); err != nil {
return nil, err
}

emojiCodeMap := make(map[string]string)
for _, gemoji := range gs {
for _, a := range gemoji.Aliases {
emojiCodeMap[a] = fmt.Sprintf("%+q", gemoji.Emoji)
}
}

return emojiCodeMap, nil
}
103 changes: 103 additions & 0 deletions cmd/generateEmojiCodeMap/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package main

import (
"bytes"
"flag"
"fmt"
"go/format"
"log"
"os"
"text/template"
)

var pkgName string
var fileName string

func init() {
log.SetFlags(log.Llongfile)

flag.StringVar(&pkgName, "pkg", "main", "output package")
flag.StringVar(&fileName, "o", "emoji_codemap.go", "output file")
flag.Parse()
}

// TemplateData emoji_codemap.go template
type TemplateData struct {
PkgName string
CodeMap map[string]string
}

const templateMapCode = `
package {{.PkgName}}
// NOTE: THIS FILE WAS PRODUCED BY THE
// EMOJICODEMAP CODE GENERATION TOOL (github.com/kyokomi/emoji/cmd/generateEmojiCodeMap)
// DO NOT EDIT
// Mapping from character to concrete escape code.
var emojiCodeMap = map[string]string{
{{range $key, $val := .CodeMap}}":{{$key}}:": {{$val}},
{{end}}
}
`

func createCodeMap() (map[string]string, error) {
gemojiCodeMap, err := createGemojiCodeMap()
if err != nil {
return nil, err
}

emojoCodeMap, err := createEmojoCodeMap()
if err != nil {
return nil, err
}
for k, v := range emojoCodeMap {
gemojiCodeMap[k] = v
}

return gemojiCodeMap, nil
}

func createCodeMapSource(pkgName string, emojiCodeMap map[string]string) ([]byte, error) {
// Template GenerateSource

var buf bytes.Buffer
t := template.Must(template.New("template").Parse(templateMapCode))
if err := t.Execute(&buf, TemplateData{PkgName: pkgName, CodeMap: emojiCodeMap}); err != nil {
return nil, err
}

// gofmt

bts, err := format.Source(buf.Bytes())
if err != nil {
fmt.Printf(string(buf.Bytes()))
return nil, fmt.Errorf("gofmt: %s", err)
}

return bts, nil
}

func main() {
codeMap, err := createCodeMap()
if err != nil {
log.Fatalln(err)
}

codeMapSource, err := createCodeMapSource(pkgName, codeMap)
if err != nil {
log.Fatalln(err)
}

os.Remove(fileName)

file, err := os.Create(fileName)
if err != nil {
log.Fatalln(err)
}
defer file.Close()

if _, err := file.Write(codeMapSource); err != nil {
log.Fatalln(err)
}
}
Loading

0 comments on commit bc10b9e

Please sign in to comment.