Completed
Push — master ( e1f722...feafa4 )
by Irfaq
03:11 queued 44s
created

Emojify::emojiToWordReplace()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
dl 0
loc 8
ccs 5
cts 5
cp 1
rs 9.4285
cc 2
eloc 4
nc 2
nop 3
crap 2
1
<?php
2
3
namespace Telegram\Bot\Helpers;
4
5
use Telegram\Bot\Exceptions\TelegramEmojiMapFileNotFoundException;
6
7
class Emojify
8
{
9
    /**
10
     * @var Emojify The reference to *Singleton* instance of this class
11
     */
12
    private static $instance;
13
14
    /**
15
     * The path to the file containing the emoji map.
16
     *
17
     * @var string
18
     */
19
    const DEFAULT_EMOJI_MAP_FILE = '/../Storage/emoji.json';
20
21
    /**
22
     * The path to the file containing the emoji map.
23
     *
24
     * @var string
25
     */
26
    protected $emojiMapFile;
27
28
    /**
29
     * The array mapping words to emoji.
30
     *
31
     * @var array
32
     */
33
    protected $emojiMap;
34
35
    /**
36
     * The array mapping emoji back to words.
37
     *
38
     * @var array
39
     */
40
    protected $wordMap;
41
42
    /**
43
     * Protected Emojify constructor to prevent creating a new instance of the
44
     * *Singleton* via the `new` operator from outside of this class.
45
     *
46
     * @throws TelegramEmojiMapFileNotFoundException
47
     */
48 12
    protected function __construct()
49
    {
50 12
        $this->setupEmojiMaps();
51 12
    }
52
53
    /**
54
     * Returns the *Singleton* instance of this class.
55
     *
56
     * @return Emojify The *Singleton* instance.
57
     */
58 22
    public static function getInstance()
59
    {
60 22
        if (null === static::$instance) {
0 ignored issues
show
Bug introduced by
Since $instance is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $instance to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
61 12
            static::$instance = new static();
0 ignored issues
show
Bug introduced by
Since $instance is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $instance to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
62 12
        }
63
64 22
        return static::$instance;
0 ignored issues
show
Bug introduced by
Since $instance is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $instance to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
65
    }
66
67
    /**
68
     * Set File Path to Emoji Map File.
69
     *
70
     * @param string $emojiMapFile
71
     *
72
     * @return Emojify
73
     */
74 2
    public function setEmojiMapFile($emojiMapFile)
75
    {
76 2
        $this->emojiMapFile = $emojiMapFile;
77 2
        $this->setupEmojiMaps();
78
79
        return $this;
80
    }
81
82
    /**
83
     * Translate Word to Emoji
84
     *
85
     * @param $text
86
     *
87
     * @return mixed
88
     */
89 8
    public function toEmoji($text)
90
    {
91 8
        return $this->replace($text, $this->emojiMap);
92
    }
93
94
    /**
95
     * Alias of toEmoji()
96
     *
97
     * @param $text
98
     *
99
     * @return mixed
100
     */
101 8
    public static function text($text)
102
    {
103 8
        return self::getInstance()->toEmoji($text);
104
    }
105
106
    /**
107
     * Translate Emoji to Word
108
     *
109
     * @param $text
110
     *
111
     * @return mixed
112
     */
113 12
    public function toWord($text)
114
    {
115 12
        return $this->replace($text, $this->wordMap, true);
116
    }
117
118
    /**
119
     * Alias of toWord()
120
     *
121
     * @param $text
122
     *
123
     * @return mixed
124
     */
125 12
    public static function translate($text)
126
    {
127 12
        return self::getInstance()->toWord($text);
128
    }
129
130
    /**
131
     * Replace
132
     *
133
     * @param        $line
134
     * @param        $replace
135
     * @param bool   $toWord
136
     * @param string $delimiter
137
     *
138
     * @return mixed
139
     */
140 18
    protected function replace($line, $replace, $toWord = false, $delimiter = ':')
141
    {
142 18
        if ($toWord) {
143 12
            return $this->emojiToWordReplace($line, $replace, $delimiter);
144
        }
145
146 8
        return $this->wordToEmojiReplace($line, $replace, $delimiter);
147
    }
148
149
    /**
150
     * Finds words enclosed by the delimiter and converts them to the
151
     * appropriate emoji character.
152
     *
153
     * @param $line
154
     * @param $replace
155
     * @param $delimiter
156
     *
157
     * @return mixed
158
     */
159 8
    protected function wordToEmojiReplace($line, $replace, $delimiter)
160
    {
161 8
        $pattern = '/' . preg_quote($delimiter, '/') . '([^' . preg_quote($delimiter, '/') .']*)' . preg_quote($delimiter, '/') . '/';
162 8
        $line = preg_replace_callback($pattern, function ($matches) use ($replace) {
163 2
            if (array_key_exists($matches[1], $replace)) {
164 2
                return $replace[$matches[1]];
165
            }
166
            return $matches[1];
167 8
        }, $line);
168
169 8
        return $line;
170
    }
171
172
    /**
173
     * Finds emojis and replaces them with text enclosed by the delimiter
174
     *
175
     * @param $line
176
     * @param $replace
177
     * @param $delimiter
178
     *
179
     * @return mixed
180
     */
181 12
    protected function emojiToWordReplace($line, $replace, $delimiter)
182
    {
183 12
        foreach ($replace as $key => $value) {
184 12
            $line = str_replace($key, $delimiter.$value.$delimiter, $line);
185 12
        }
186
187 12
        return $line;
188
    }
189
190
    /**
191
     * Get Emoji Map Array.
192
     *
193
     * @return array
194
     * @throws TelegramEmojiMapFileNotFoundException
195
     */
196 14
    protected function getEmojiMap()
197
    {
198 14
        if (!isset($this->emojiMapFile)) {
199 12
            $this->emojiMapFile = realpath(__DIR__.self::DEFAULT_EMOJI_MAP_FILE);
200 12
        }
201
202 14
        if (!file_exists($this->emojiMapFile)) {
203 2
            throw new TelegramEmojiMapFileNotFoundException();
204
        }
205
206 12
        return json_decode(file_get_contents($this->emojiMapFile), true);
207
    }
208
209
    /**
210
     * Setup Emoji Maps.
211
     *
212
     * @throws TelegramEmojiMapFileNotFoundException
213
     */
214 14
    protected function setupEmojiMaps()
215
    {
216 14
        $this->emojiMap = $this->getEmojiMap();
217 12
        $this->wordMap = array_flip($this->emojiMap);
218 12
    }
219
220
    /**
221
     * Private clone method to prevent cloning of the instance of the
222
     * *Singleton* instance.
223
     *
224
     * @return void
225
     */
226
    private function __clone()
227
    {
228
    }
229
230
    /**
231
     * Private unserialize method to prevent unserializing of the *Singleton*
232
     * instance.
233
     *
234
     * @return void
235
     */
236
    private function __wakeup()
237
    {
238
    }
239
}
240