-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathEmojiConverter.elm
148 lines (126 loc) · 2.8 KB
/
EmojiConverter.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
module EmojiConverter exposing (emojiToText, supportedEmojis, textToEmoji)
import Dict
import List.Extra
import Regex
type alias Key =
String
textToEmoji : Key -> String -> String
textToEmoji key text =
convert supportedLetters (rotateEmojis key) splitEveryCharacter text
emojiToText : Key -> String -> String
emojiToText key emojis =
convert (rotateEmojis key) supportedLetters splitEveryEmoji emojis
splitEveryCharacter : String -> List String
splitEveryCharacter =
String.split ""
splitEveryEmoji : String -> List String
splitEveryEmoji str =
-- due to JavaScript issues with splitting and unicode, we maually split the string.
Regex.fromString "([\\uD800-\\uDBFF][\\uDC00-\\uDFFF])"
|> Maybe.withDefault Regex.never
|> Regex.find
|> (\matcher ->
matcher str
|> List.map .match
)
convert : List String -> List String -> (String -> List String) -> String -> String
convert orderedKeys orderedValues splitter string =
let
lookupTable =
List.Extra.zip orderedKeys orderedValues
|> Dict.fromList
getValueOrReturnKey key =
lookupTable
|> Dict.get key
|> Maybe.withDefault key
in
string
|> splitter
|> List.map getValueOrReturnKey
|> String.join ""
rotateEmojis : Key -> List String
rotateEmojis key =
supportedEmojis
|> List.Extra.elemIndex key
-- if the key can't be found, default to the first emoji listed.
|> Maybe.withDefault 0
|> (\a -> List.Extra.splitAt a supportedEmojis)
|> (\( head, tail ) -> [ tail, head ])
|> List.concat
supportedLetters : List String
supportedLetters =
[ -- lowercase letters
List.range 97 122
-- uppercase letters
, List.range 65 90
-- numbers
, List.range 48 57
]
|> List.concat
|> List.map Char.fromCode
|> List.map String.fromChar
supportedEmojis : List String
supportedEmojis =
[ "😁"
, "😂"
, "😃"
, "😄"
, "😅"
, "😆"
, "😉"
, "😊"
, "😋"
, "😌"
, "😍"
, "😏"
, "😒"
, "😓"
, "😔"
, "😖"
, "😘"
, "😚"
, "😜"
, "😝"
, "😞"
, "😠"
, "😡"
, "😢"
, "😣"
, "😤"
, "😥"
, "😨"
, "😩"
, "😪"
, "😫"
, "😭"
, "😰"
, "😱"
, "😲"
, "😳"
, "😵"
, "😷"
, "😸"
, "😹"
, "😺"
, "😻"
, "😼"
, "😽"
, "😾"
, "😿"
, "🙀"
, "🙅"
, "🙆"
, "🙇"
, "🙈"
, "🙉"
, "🙊"
, "🙋"
, "🙌"
, "🙍"
, "🙎"
, "🙏"
, "🚑"
, "🚒"
, "🚓"
, "🚕"
]