]> git.mxchange.org Git - friendica.git/blob - include/Smilies.php
Merge pull request #3284 from annando/issue-3278
[friendica.git] / include / Smilies.php
1 <?php
2
3 /**
4  * @file include/Smilies.php
5  * @brief This file contains the Smilies class which contains functions to handle smiles
6  */
7
8 /**
9  * This class contains functions to handle smiles
10  */
11
12 class Smilies {
13
14         /**
15          * @brief Function to list all smilies
16          * 
17          * Get an array of all smilies, both internal and from addons.
18          * 
19          * @return array
20          *      'texts' => smilie shortcut
21          *      'icons' => icon in html
22          * 
23          * @hook smilie ('texts' => smilies texts array, 'icons' => smilies html array)
24          */
25         public static function get_list() {
26
27                 $texts =  array(
28                         '&lt;3',
29                         '&lt;/3',
30                         '&lt;\\3',
31                         ':-)',
32                         ';-)',
33                         ':-(',
34                         ':-P',
35                         ':-p',
36                         ':-"',
37                         ':-&quot;',
38                         ':-x',
39                         ':-X',
40                         ':-D',
41                         '8-|',
42                         '8-O',
43                         ':-O',
44                         '\\o/',
45                         'o.O',
46                         'O.o',
47                         'o_O',
48                         'O_o',
49                         ":'(",
50                         ":-!",
51                         ":-/",
52                         ":-[",
53                         "8-)",
54                         ':beer',
55                         ':homebrew',
56                         ':coffee',
57                         ':facepalm',
58                         ':like',
59                         ':dislike',
60                         '~friendica',
61                         'red#',
62                         'red#matrix'
63
64                 );
65
66                 $icons = array(
67                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-heart.gif" alt="&lt;3" title="&lt;3" />',
68                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-brokenheart.gif" alt="&lt;/3" title="&lt;/3" />',
69                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-brokenheart.gif" alt="&lt;\\3" title="&lt;\\3" />',
70                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-smile.gif" alt=":-)" title=":-)" />',
71                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-wink.gif" alt=";-)" title=";-)" />',
72                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-frown.gif" alt=":-(" title=":-(" />',
73                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-tongue-out.gif" alt=":-P" title=":-P" />',
74                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-tongue-out.gif" alt=":-p" title=":-P" />',
75                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-kiss.gif" alt=":-\" title=":-\" />',
76                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-kiss.gif" alt=":-\" title=":-\" />',
77                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-kiss.gif" alt=":-x" title=":-x" />',
78                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-kiss.gif" alt=":-X" title=":-X" />',
79                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-laughing.gif" alt=":-D" title=":-D"  />',
80                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-surprised.gif" alt="8-|" title="8-|" />',
81                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-surprised.gif" alt="8-O" title="8-O" />',
82                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-surprised.gif" alt=":-O" title="8-O" />',
83                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-thumbsup.gif" alt="\\o/" title="\\o/" />',
84                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-Oo.gif" alt="o.O" title="o.O" />',
85                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-Oo.gif" alt="O.o" title="O.o" />',
86                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-Oo.gif" alt="o_O" title="o_O" />',
87                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-Oo.gif" alt="O_o" title="O_o" />',
88                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-cry.gif" alt=":\'(" title=":\'("/>',
89                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-foot-in-mouth.gif" alt=":-!" title=":-!" />',
90                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-undecided.gif" alt=":-/" title=":-/" />',
91                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-embarassed.gif" alt=":-[" title=":-[" />',
92                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-cool.gif" alt="8-)" title="8-)" />',
93                 '<img class="smiley" src="' . app::get_baseurl() . '/images/beer_mug.gif" alt=":beer" title=":beer" />',
94                 '<img class="smiley" src="' . app::get_baseurl() . '/images/beer_mug.gif" alt=":homebrew" title=":homebrew" />',
95                 '<img class="smiley" src="' . app::get_baseurl() . '/images/coffee.gif" alt=":coffee" title=":coffee" />',
96                 '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-facepalm.gif" alt=":facepalm" title=":facepalm" />',
97                 '<img class="smiley" src="' . app::get_baseurl() . '/images/like.gif" alt=":like" title=":like" />',
98                 '<img class="smiley" src="' . app::get_baseurl() . '/images/dislike.gif" alt=":dislike" title=":dislike" />',
99                 '<a href="http://friendica.com">~friendica <img class="smiley" src="' . app::get_baseurl() . '/images/friendica-16.png" alt="~friendica" title="~friendica" /></a>',
100                 '<a href="http://redmatrix.me/">red<img class="smiley" src="' . app::get_baseurl() . '/images/rm-16.png" alt="red#" title="red#" />matrix</a>',
101                 '<a href="http://redmatrix.me/">red<img class="smiley" src="' . app::get_baseurl() . '/images/rm-16.png" alt="red#matrix" title="red#matrix" />matrix</a>'
102                 );
103
104                 $params = array('texts' => $texts, 'icons' => $icons);
105                 call_hooks('smilie', $params);
106
107                 return $params;
108
109         }
110
111         /**
112          * @brief Replaces text emoticons with graphical images
113          *
114          * It is expected that this function will be called using HTML text.
115          * We will escape text between HTML pre and code blocks from being
116          * processed.
117          *
118          * At a higher level, the bbcode [nosmile] tag can be used to prevent this
119          * function from being executed by the prepare_text() routine when preparing
120          * bbcode source for HTML display
121          *
122          * @param string $s
123          * @param boolean $sample
124          * 
125          * @return string HML Output of the Smilie
126          */
127         public static function replace($s, $sample = false) {
128                 if(intval(get_config('system','no_smilies'))
129                         || (local_user() && intval(get_pconfig(local_user(),'system','no_smilies'))))
130                         return $s;
131
132                 $s = preg_replace_callback('/<pre>(.*?)<\/pre>/ism','self::encode',$s);
133                 $s = preg_replace_callback('/<code>(.*?)<\/code>/ism','self::encode',$s);
134
135                 $params = self::get_list();
136                 $params['string'] = $s;
137
138                 if($sample) {
139                         $s = '<div class="smiley-sample">';
140                         for($x = 0; $x < count($params['texts']); $x ++) {
141                                 $s .= '<dl><dt>' . $params['texts'][$x] . '</dt><dd>' . $params['icons'][$x] . '</dd></dl>';
142                         }
143                 }
144                 else {
145                         $params['string'] = preg_replace_callback('/&lt;(3+)/','self::preg_heart',$params['string']);
146                         $s = str_replace($params['texts'],$params['icons'],$params['string']);
147                 }
148
149                 $s = preg_replace_callback('/<pre>(.*?)<\/pre>/ism','self::decode',$s);
150                 $s = preg_replace_callback('/<code>(.*?)<\/code>/ism','self::decode',$s);
151
152                 return $s;
153         }
154
155         private function encode($m) {
156                 return(str_replace($m[1],base64url_encode($m[1]),$m[0]));
157         }
158
159         private function decode($m) {
160                 return(str_replace($m[1],base64url_decode($m[1]),$m[0]));
161         }
162
163
164         /**
165          * @brief expand <3333 to the correct number of hearts
166          *
167          * @param string $x
168          * @return string HTML Output
169          * 
170          * @todo: Rework because it doesn't work correctly
171          */
172         private function preg_heart($x) {
173                 if(strlen($x[1]) == 1)
174                         return $x[0];
175                 $t = '';
176                 for($cnt = 0; $cnt < strlen($x[1]); $cnt ++)
177                         $t .= '<img class="smiley" src="' . app::get_baseurl() . '/images/smiley-heart.gif" alt="&lt;3" />';
178                 $r =  str_replace($x[0],$t,$x[0]);
179                 return $r;
180         }
181
182 }