forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			224 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/*
 | 
						|
 * StatusNet - the distributed open-source microblogging tool
 | 
						|
 * Copyright (C) 2010, StatusNet, Inc.
 | 
						|
 *
 | 
						|
 * This program is free software: you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU Affero General Public License as published by
 | 
						|
 * the Free Software Foundation, either version 3 of the License, or
 | 
						|
 * (at your option) any later version.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU Affero General Public License for more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU Affero General Public License
 | 
						|
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * @package ShareNoticePlugin
 | 
						|
 * @maintainer Brion Vibber <brion@status.net>
 | 
						|
 */
 | 
						|
 | 
						|
if (!defined('STATUSNET')) { exit(1); }
 | 
						|
 | 
						|
class ShareNoticePlugin extends Plugin
 | 
						|
{
 | 
						|
    public $targets = array(
 | 
						|
        array('Twitter'),
 | 
						|
        array('Facebook'),
 | 
						|
        array('StatusNet', array('baseurl' => 'http://identi.ca'))
 | 
						|
    );
 | 
						|
 | 
						|
    function onEndShowStatusNetStyles($action) {
 | 
						|
        $action->cssLink('plugins/ShareNotice/css/sharenotice.css');
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    function onStartShowNoticeItem($item)
 | 
						|
    {
 | 
						|
        $notice = $item->notice;
 | 
						|
        $out = $item->out;
 | 
						|
 | 
						|
        $out->elementStart('ul', array('class' => 'notice-share'));
 | 
						|
        foreach ($this->targets as $data) {
 | 
						|
            $type = $data[0];
 | 
						|
            $args = (count($data) > 1) ? $data[1] : array();
 | 
						|
            $target = $this->getShareTarget($type, $notice, $args);
 | 
						|
            $this->showShareTarget($out, $target);
 | 
						|
        }
 | 
						|
        $out->elementEnd('ul');
 | 
						|
    }
 | 
						|
 | 
						|
    private function getShareTarget($type, $notice, $args)
 | 
						|
    {
 | 
						|
        $class = ucfirst($type) . 'ShareTarget';
 | 
						|
 | 
						|
        return new $class($notice, $args);
 | 
						|
    }
 | 
						|
 | 
						|
    private function showShareTarget(HTMLOutputter $out, NoticeShareTarget $target)
 | 
						|
    {
 | 
						|
        $class = $target->getClass();
 | 
						|
        $text = $target->getText();
 | 
						|
        $url = $target->targetUrl();
 | 
						|
 | 
						|
        $out->elementStart('li', array('class' => 'notice-share-' . $class));
 | 
						|
        $out->elementStart('a', array(
 | 
						|
            'href' => $url,
 | 
						|
            'title' => $text,
 | 
						|
            'target' => '_blank'
 | 
						|
        ));
 | 
						|
        $out->element('span', array(), $text);
 | 
						|
        $out->elementEnd('a');
 | 
						|
        $out->elementEnd('li');
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
abstract class NoticeShareTarget
 | 
						|
{
 | 
						|
    protected $notice;
 | 
						|
 | 
						|
    public function __construct($notice)
 | 
						|
    {
 | 
						|
        $this->notice = $notice;
 | 
						|
    }
 | 
						|
 | 
						|
    public abstract function getClass();
 | 
						|
 | 
						|
    public abstract function getText();
 | 
						|
 | 
						|
    public abstract function targetUrl();
 | 
						|
}
 | 
						|
 | 
						|
abstract class GenericNoticeShareTarget extends NoticeShareTarget
 | 
						|
{
 | 
						|
    protected function maxLength()
 | 
						|
    {
 | 
						|
        return 140; // typical
 | 
						|
    }
 | 
						|
 | 
						|
    protected function statusText()
 | 
						|
    {
 | 
						|
        // TRANS: Leave this message unchanged.
 | 
						|
        $pattern = _m('"%s"');
 | 
						|
        $url = $this->notice->bestUrl();
 | 
						|
        $suffix = ' ' . $url;
 | 
						|
        $room = $this->maxLength() - mb_strlen($suffix) - (mb_strlen($pattern) - mb_strlen('%s'));
 | 
						|
 | 
						|
        $content = $this->notice->content;
 | 
						|
        if (mb_strlen($content) > $room) {
 | 
						|
            $content = mb_substr($content, 0, $room - 1) . '…';
 | 
						|
        }
 | 
						|
 | 
						|
        return sprintf($pattern, $content) . $suffix;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class TwitterShareTarget extends GenericNoticeShareTarget
 | 
						|
{
 | 
						|
    public function getClass()
 | 
						|
    {
 | 
						|
        return 'twitter';
 | 
						|
    }
 | 
						|
 | 
						|
    public function getText()
 | 
						|
    {
 | 
						|
        // TRANS: Tooltip for image to share a notice on Twitter.
 | 
						|
        return _m('Share on Twitter');
 | 
						|
    }
 | 
						|
 | 
						|
    public function targetUrl()
 | 
						|
    {
 | 
						|
        $args = array(
 | 
						|
            'status' => $this->statusText()
 | 
						|
        );
 | 
						|
        return 'http://twitter.com/home?' .
 | 
						|
                http_build_query($args, null, '&');
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class StatusNetShareTarget extends GenericNoticeShareTarget
 | 
						|
{
 | 
						|
    protected $baseurl;
 | 
						|
 | 
						|
    public function __construct($notice, $args)
 | 
						|
    {
 | 
						|
        parent::__construct($notice);
 | 
						|
        $this->baseurl = $args['baseurl'];
 | 
						|
    }
 | 
						|
 | 
						|
    public function getClass()
 | 
						|
    {
 | 
						|
        return 'statusnet';
 | 
						|
    }
 | 
						|
 | 
						|
    public function getText()
 | 
						|
    {
 | 
						|
        $host = parse_url($this->baseurl, PHP_URL_HOST);
 | 
						|
        // TRANS: Tooltip for image to share a notice on another platform (other than Twitter or Facebook).
 | 
						|
        // TRANS: %s is a host name.
 | 
						|
        return sprintf(_m('Share on %s'), $host);
 | 
						|
    }
 | 
						|
 | 
						|
    public function targetUrl()
 | 
						|
    {
 | 
						|
        $args = array(
 | 
						|
            'status_textarea' => $this->statusText()
 | 
						|
        );
 | 
						|
        return $this->baseurl . '/notice/new?' .
 | 
						|
                http_build_query($args, null, '&');
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class FacebookShareTarget extends NoticeShareTarget
 | 
						|
{
 | 
						|
    public function getClass()
 | 
						|
    {
 | 
						|
        return 'facebook';
 | 
						|
    }
 | 
						|
 | 
						|
    public function getText()
 | 
						|
    {
 | 
						|
        // TRANS: Tooltip for image to share a notice on Facebook.
 | 
						|
        return _m('Share on Facebook');
 | 
						|
    }
 | 
						|
 | 
						|
    public function targetUrl()
 | 
						|
    {
 | 
						|
        $args = array(
 | 
						|
            'u' => $this->notice->bestUrl(),
 | 
						|
            // TRANS: %s is notice content that is shared on Twitter, Facebook or another platform.
 | 
						|
            't' => sprintf(_m('"%s"'), $this->notice->content),
 | 
						|
        );
 | 
						|
        return 'http://www.facebook.com/sharer.php?' .
 | 
						|
            http_build_query($args, null, '&');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Provide plugin version information.
 | 
						|
     *
 | 
						|
     * This data is used when showing the version page.
 | 
						|
     *
 | 
						|
     * @param array &$versions array of version data arrays; see EVENTS.txt
 | 
						|
     *
 | 
						|
     * @return boolean hook value
 | 
						|
     */
 | 
						|
    function onPluginVersion(&$versions)
 | 
						|
    {
 | 
						|
        $url = 'http://status.net/wiki/Plugin:ShareNotice';
 | 
						|
 | 
						|
        $versions[] = array('name' => 'ShareNotice',
 | 
						|
            'version' => STATUSNET_VERSION,
 | 
						|
            'author' => 'Brion Vibber',
 | 
						|
            'homepage' => $url,
 | 
						|
            'rawdescription' =>
 | 
						|
            // TRANS: Plugin description.
 | 
						|
            _m('This plugin allows sharing of notices to Twitter, Facebook and other platforms.'));
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
}
 |