diff options
Diffstat (limited to 'plugins/emoticons')
| -rw-r--r-- | plugins/emoticons/composer.json | 29 | ||||
| -rw-r--r-- | plugins/emoticons/emoticons.php | 78 | ||||
| -rw-r--r-- | plugins/emoticons/tests/Emoticons.php | 23 | 
3 files changed, 130 insertions, 0 deletions
| diff --git a/plugins/emoticons/composer.json b/plugins/emoticons/composer.json new file mode 100644 index 000000000..8e7b90ae9 --- /dev/null +++ b/plugins/emoticons/composer.json @@ -0,0 +1,29 @@ +{ +    "name": "roundcube/emoticons", +    "type": "roundcube-plugin", +    "description": "Sample plugin to replace emoticons in plain text message body with real icons.", +    "license": "GPLv3+", +    "version": "1.3", +    "authors": [ +        { +            "name": "Thomas Bruederli", +            "email": "roundcube@gmail.com", +            "role": "Lead" +        }, +        { +            "name": "Aleksander Machniak", +            "email": "alec@alec.pl", +            "role": "Developer" +        } +    ], +    "repositories": [ +        { +            "type": "composer", +            "url": "http://plugins.roundcube.net" +        } +    ], +    "require": { +        "php": ">=5.3.0", +        "roundcube/plugin-installer": ">=0.1.3" +    } +} diff --git a/plugins/emoticons/emoticons.php b/plugins/emoticons/emoticons.php new file mode 100644 index 000000000..187e83827 --- /dev/null +++ b/plugins/emoticons/emoticons.php @@ -0,0 +1,78 @@ +<?php + +/** + * Display Emoticons + * + * Sample plugin to replace emoticons in plain text message body with real icons + * + * @version @package_version@ + * @license GNU GPLv3+ + * @author Thomas Bruederli + * @author Aleksander Machniak + * @website http://roundcube.net + */ +class emoticons extends rcube_plugin +{ +    public $task = 'mail'; + +    function init() +    { +        $this->add_hook('message_part_after', array($this, 'replace')); +    } + +    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/tinymce/plugins/emoticons/img/'; +        return html::img(array('src' => $path.$ico, 'title' => $title)); +    } +} diff --git a/plugins/emoticons/tests/Emoticons.php b/plugins/emoticons/tests/Emoticons.php new file mode 100644 index 000000000..e04502285 --- /dev/null +++ b/plugins/emoticons/tests/Emoticons.php @@ -0,0 +1,23 @@ +<?php + +class Emoticons_Plugin extends PHPUnit_Framework_TestCase +{ + +    function setUp() +    { +        include_once __DIR__ . '/../emoticons.php'; +    } + +    /** +     * Plugin object construction test +     */ +    function test_constructor() +    { +        $rcube  = rcube::get_instance(); +        $plugin = new emoticons($rcube->api); + +        $this->assertInstanceOf('emoticons', $plugin); +        $this->assertInstanceOf('rcube_plugin', $plugin); +    } +} + | 
