]> git.donarmstrong.com Git - roundcube.git/blobdiff - plugins/emoticons/emoticons.php
Imported Upstream version 0.5
[roundcube.git] / plugins / emoticons / emoticons.php
index be736b6255c85f888ead0304ac7382d06bc5c9b5..95f5ecf39b7635ecf3ed42efea22d411510f2da3 100644 (file)
@@ -5,35 +5,73 @@
  *
  * Sample plugin to replace emoticons in plain text message body with real icons
  *
- * @version 1.0.1
+ * @version 1.3
  * @author Thomas Bruederli
+ * @author Aleksander Machniak
  * @website http://roundcube.net
  */
 class emoticons extends rcube_plugin
 {
-  public $task = 'mail';
-  private $map;
+    public $task = 'mail';
 
-  function init()
-  {
-    $this->task = 'mail';
-    $this->add_hook('message_part_after', array($this, 'replace'));
-  
-    $this->map = array(
-      ':)'  => html::img(array('src' => './program/js/tiny_mce/plugins/emotions/img/smiley-smile.gif', 'alt' => ':)')),
-      ':-)' => html::img(array('src' => './program/js/tiny_mce/plugins/emotions/img/smiley-smile.gif', 'alt' => ':-)')),
-      ':('  => html::img(array('src' => './program/js/tiny_mce/plugins/emotions/img/smiley-cry.gif', 'alt' => ':(')),
-      ':-(' => html::img(array('src' => './program/js/tiny_mce/plugins/emotions/img/smiley-cry.gif', 'alt' => ':-(')),
-    );
-  }
+    function init()
+    {
+        $this->add_hook('message_part_after', array($this, 'replace'));
+    }
 
-  function replace($args)
-  {
-    if ($args['type'] == 'plain')
-      return array('body' => strtr($args['body'], $this->map));
-  
-    return null;
-  }
+    function replace($args)
+    {
+        // This is a lookbehind assertion which will exclude html entities
+        // E.g. situation when ";)" in "")" shouldn't be replaced by the icon
+        // It's so long because of assertion format restrictions
+        $entity = '(?<!&'
+            . '[a-zA-Z0-9]{2}' . '|' . '#[0-9]{2}' . '|'
+            . '[a-zA-Z0-9]{3}' . '|' . '#[0-9]{3}' . '|'
+            . '[a-zA-Z0-9]{4}' . '|' . '#[0-9]{4}' . '|'
+            . '[a-zA-Z0-9]{5}' . '|'
+            . '[a-zA-Z0-9]{6}' . '|'
+            . '[a-zA-Z0-9]{7}'
+            . ')';
 
-}
+        // map of emoticon replacements
+        $map = array(
+            '/:\)/'             => $this->img_tag('smiley-smile.gif',       ':)'    ),
+            '/:-\)/'            => $this->img_tag('smiley-smile.gif',       ':-)'   ),
+            '/(?<!mailto):D/'   => $this->img_tag('smiley-laughing.gif',    ':D'    ),
+            '/:-D/'             => $this->img_tag('smiley-laughing.gif',    ':-D'   ),
+            '/:\(/'             => $this->img_tag('smiley-frown.gif',       ':('    ),
+            '/:-\(/'            => $this->img_tag('smiley-frown.gif',       ':-('   ),
+            '/'.$entity.';\)/'  => $this->img_tag('smiley-wink.gif',        ';)'    ),
+            '/'.$entity.';-\)/' => $this->img_tag('smiley-wink.gif',        ';-)'   ),
+            '/8\)/'             => $this->img_tag('smiley-cool.gif',        '8)'    ),
+            '/8-\)/'            => $this->img_tag('smiley-cool.gif',        '8-)'   ),
+            '/(?<!mailto):O/i'  => $this->img_tag('smiley-surprised.gif',   ':O'    ),
+            '/(?<!mailto):-O/i' => $this->img_tag('smiley-surprised.gif',   ':-O'   ),
+            '/(?<!mailto):P/i'  => $this->img_tag('smiley-tongue-out.gif',  ':P'    ),
+            '/(?<!mailto):-P/i' => $this->img_tag('smiley-tongue-out.gif',  ':-P'   ),
+            '/(?<!mailto):@/i'  => $this->img_tag('smiley-yell.gif',        ':@'    ),
+            '/(?<!mailto):-@/i' => $this->img_tag('smiley-yell.gif',        ':-@'   ),
+            '/O:\)/i'           => $this->img_tag('smiley-innocent.gif',    'O:)'   ),
+            '/O:-\)/i'          => $this->img_tag('smiley-innocent.gif',    'O:-)'  ),
+            '/(?<!mailto):$/'   => $this->img_tag('smiley-embarassed.gif',  ':$'    ),
+            '/(?<!mailto):-$/'  => $this->img_tag('smiley-embarassed.gif',  ':-$'   ),
+            '/(?<!mailto):\*/i'  => $this->img_tag('smiley-kiss.gif',       ':*'    ),
+            '/(?<!mailto):-\*/i' => $this->img_tag('smiley-kiss.gif',       ':-*'   ),
+            '/(?<!mailto):S/i'  => $this->img_tag('smiley-undecided.gif',   ':S'    ),
+            '/(?<!mailto):-S/i' => $this->img_tag('smiley-undecided.gif',   ':-S'   ),
+        );
+
+        if ($args['type'] == 'plain') {
+            $args['body'] = preg_replace(
+                array_keys($map), array_values($map), $args['body']);
+        }
 
+        return $args;
+    }
+
+    private function img_tag($ico, $title)
+    { 
+        $path = './program/js/tiny_mce/plugins/emotions/img/';
+        return html::img(array('src' => $path.$ico, 'title' => $title));
+    }
+}