gnu-social/plugins/ShareNotice/ShareNoticePlugin.php
Diogo Cordeiro 46f98b3142 [VersionBump] 1.19.0, fairly late
The core plugins whose version was attached to GS's were reseted to 2.0.0.

2.0.0 was chosen as reset version for plugins because it is higher than
  the one that was set by inheriting GS version. Furthermore, it's a
  major change from prior plugin versioning system thus it also makes
  semantic sense.

Justification for version bump:

== GS ==
9a4ab31f26 1.19.0
c13b935201 1.18.3
c13b935201 1.18.2
18fc39d2cf 1.18.1
c083a8bcc2 1.18.0
e8783d46d0 1.17.1
d9a42550ff 1.17.0
1536d3ef29 1.16.0
c03ed457a6 1.15.0
d2e6519bad 1.14.2
fe411e8138 1.14.1
b17e0b4169 1.14.0
daa5f87fd4 1.13.0
d75b5d2f4a 1.11.7
f6dbf66983 1.11.6
6cf674f8f8 1.11.5
7845a09b34 1.11.4
e4d432295d 1.11.3
339204f1ee 1.11.2
a4e679a118 1.11.1
7967db6ff5 1.11.0
bc030da320 1.10.1
9cc7df51d6 1.10.0
bf7f17474d 1.9.2
8a07edec5f 1.9.1
0042971d74 1.9.0
6b5450b7e6 1.8.0
5dcc98d1c6 1.7.0
e6667db0cd 1.6.0
3290227b50 1.5.0
a59c439b46 1.4.0
496ab8c920 1.3.10
986030060b 1.3.9
1d529c021a 1.3.8
f89c052cf8 1.3.7
38f2ecefac 1.3.6
e473937cb9 1.3.5
9a39ebe66f 1.3.4
ddc3cecfc0 1.3.3
2b43d484eb 1.3.2
e8e487187e 1.3.1

== Plugins ==
XMPP plugin
e0887220b0 bump patch
e186ad57d0 bump patch

OStatus
e186ad57d0 bump patch

Nodeinfo
ceae66a30f bump minor
586fb5a517 bump major
195296846e bump minor
2019-06-07 15:02:08 +01:00

229 lines
6.3 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
{
const PLUGIN_VERSION = '2.0.0';
public $targets = array(
array('Twitter'),
array('Facebook'),
array('StatusNet', array('baseurl' => 'http://identi.ca'))
);
public function onEndShowStylesheets(Action $action) {
$action->cssLink($this->path('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: %s is notice content that is shared on Twitter, Facebook or another platform.
$pattern = _m('"%s"');
$url = $this->notice->getUrl();
$suffix = ' ' . $url;
$room = $this->maxLength() - mb_strlen($suffix) - (mb_strlen($pattern) - mb_strlen('%s'));
$content = $this->notice->content;
// TRANS: Truncation symbol.
$truncation_symbol = _m('…');
$truncation_symbol_length = mb_strlen($truncation_symbol);
if (mb_strlen($content) > $room) {
$content = mb_substr($content, 0, $room - $truncation_symbol_length) . $truncation_symbol;
}
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->getUrl(),
// 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(array &$versions)
{
$url = 'https://git.gnu.io/gnu/gnu-social/tree/master/plugins/ShareNotice';
$versions[] = array('name' => 'ShareNotice',
'version' => self::PLUGIN_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;
}
}