summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/matterbridge/emoji/emoji.go
diff options
context:
space:
mode:
authorWim <wim@42.be>2019-11-17 23:01:03 +0100
committerGitHub <noreply@github.com>2019-11-17 23:01:03 +0100
commit075ca9ca471a7bfaf86fd0a762ed38b8cbf4edfb (patch)
tree4b402b7c48e1d54ebdc8706a5f996aafab581a3f /vendor/github.com/matterbridge/emoji/emoji.go
parentd4253d7a55f7af862304fb65c461547055dd294a (diff)
downloadmatterbridge-msglm-075ca9ca471a7bfaf86fd0a762ed38b8cbf4edfb.tar.gz
matterbridge-msglm-075ca9ca471a7bfaf86fd0a762ed38b8cbf4edfb.tar.bz2
matterbridge-msglm-075ca9ca471a7bfaf86fd0a762ed38b8cbf4edfb.zip
Switch to new emoji library kyokomi/emoji (#948)
Diffstat (limited to 'vendor/github.com/matterbridge/emoji/emoji.go')
-rw-r--r--vendor/github.com/matterbridge/emoji/emoji.go133
1 files changed, 133 insertions, 0 deletions
diff --git a/vendor/github.com/matterbridge/emoji/emoji.go b/vendor/github.com/matterbridge/emoji/emoji.go
new file mode 100644
index 00000000..28ac848b
--- /dev/null
+++ b/vendor/github.com/matterbridge/emoji/emoji.go
@@ -0,0 +1,133 @@
+// Package emoji terminal output.
+package emoji
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "io"
+ "regexp"
+ "unicode"
+)
+
+//go:generate generateEmojiCodeMap -pkg emoji
+
+// Replace Padding character for emoji.
+const (
+ ReplacePadding = ""
+)
+
+// CodeMap gets the underlying map of emoji.
+func CodeMap() map[string]string {
+ return emojiCodeMap
+}
+
+// regular expression that matches :flag-[countrycode]:
+var flagRegexp = regexp.MustCompile(":flag-([a-z]{2}):")
+
+func emojize(x string) string {
+ str, ok := emojiCodeMap[x]
+ if ok {
+ return str + ReplacePadding
+ }
+ if match := flagRegexp.FindStringSubmatch(x); len(match) == 2 {
+ return regionalIndicator(match[1][0]) + regionalIndicator(match[1][1])
+ }
+ return x
+}
+
+// regionalIndicator maps a lowercase letter to a unicode regional indicator
+func regionalIndicator(i byte) string {
+ return string('\U0001F1E6' + rune(i) - 'a')
+}
+
+func replaseEmoji(input *bytes.Buffer) string {
+ emoji := bytes.NewBufferString(":")
+ for {
+ i, _, err := input.ReadRune()
+ if err != nil {
+ // not replase
+ return emoji.String()
+ }
+
+ if i == ':' && emoji.Len() == 1 {
+ return emoji.String() + replaseEmoji(input)
+ }
+
+ emoji.WriteRune(i)
+ switch {
+ case unicode.IsSpace(i):
+ return emoji.String()
+ case i == ':':
+ return emojize(emoji.String())
+ }
+ }
+}
+
+func compile(x string) string {
+ if x == "" {
+ return ""
+ }
+
+ input := bytes.NewBufferString(x)
+ output := bytes.NewBufferString("")
+
+ for {
+ i, _, err := input.ReadRune()
+ if err != nil {
+ break
+ }
+ switch i {
+ default:
+ output.WriteRune(i)
+ case ':':
+ output.WriteString(replaseEmoji(input))
+ }
+ }
+ return output.String()
+}
+
+// Print is fmt.Print which supports emoji
+func Print(a ...interface{}) (int, error) {
+ return fmt.Print(compile(fmt.Sprint(a...)))
+}
+
+// Println is fmt.Println which supports emoji
+func Println(a ...interface{}) (int, error) {
+ return fmt.Println(compile(fmt.Sprint(a...)))
+}
+
+// Printf is fmt.Printf which supports emoji
+func Printf(format string, a ...interface{}) (int, error) {
+ return fmt.Printf(compile(fmt.Sprintf(format, a...)))
+}
+
+// Fprint is fmt.Fprint which supports emoji
+func Fprint(w io.Writer, a ...interface{}) (int, error) {
+ return fmt.Fprint(w, compile(fmt.Sprint(a...)))
+}
+
+// Fprintln is fmt.Fprintln which supports emoji
+func Fprintln(w io.Writer, a ...interface{}) (int, error) {
+ return fmt.Fprintln(w, compile(fmt.Sprint(a...)))
+}
+
+// Fprintf is fmt.Fprintf which supports emoji
+func Fprintf(w io.Writer, format string, a ...interface{}) (int, error) {
+ return fmt.Fprint(w, compile(fmt.Sprintf(format, a...)))
+}
+
+// Sprint is fmt.Sprint which supports emoji
+func Sprint(a ...interface{}) string {
+ return compile(fmt.Sprint(a...))
+}
+
+// Sprintf is fmt.Sprintf which supports emoji
+func Sprintf(format string, a ...interface{}) string {
+ return compile(fmt.Sprintf(format, a...))
+}
+
+// Errorf is fmt.Errorf which supports emoji
+func Errorf(format string, a ...interface{}) error {
+ return errors.New(compile(Sprintf(format, a...)))
+}