From 551c69ed56c4ea36e325df9b7f6204dadbee8d39 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 4 Jun 2015 00:50:08 +0200 Subject: [PATCH] Extend Networkpublic and Public actions from SitestreamAction --- actions/networkpublic.php | 6 +- actions/public.php | 165 ++++++---------------------------- lib/sitestreamaction.php | 185 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 212 insertions(+), 144 deletions(-) create mode 100644 lib/sitestreamaction.php diff --git a/actions/networkpublic.php b/actions/networkpublic.php index 7baa313bee..6f1124a9d8 100644 --- a/actions/networkpublic.php +++ b/actions/networkpublic.php @@ -2,7 +2,7 @@ if (!defined('GNUSOCIAL')) { exit(1); } -class NetworkpublicAction extends PublicAction +class NetworkpublicAction extends SitestreamAction { protected function streamPrepare() { @@ -30,9 +30,7 @@ class NetworkpublicAction extends PublicAction function extraHead() { - // the PublicAction has some XRDS stuff that might be unique to the non-network public feed - // FIXME: Solve this with a call that doesn't rely on parent:: and is unique for each class. - ManagedAction::extraHead(); + parent::extraHead(); } function showSections() diff --git a/actions/public.php b/actions/public.php index 06ee75b8d1..7cae3cfd15 100644 --- a/actions/public.php +++ b/actions/public.php @@ -29,10 +29,6 @@ if (!defined('GNUSOCIAL')) { exit(1); } -// Farther than any human will go - -define('MAX_PUBLIC_PAGE', 100); - /** * Action for displaying the public stream * @@ -45,52 +41,8 @@ define('MAX_PUBLIC_PAGE', 100); * @see PublicrssAction * @see PublicxrdsAction */ -class PublicAction extends ManagedAction +class PublicAction extends SitestreamAction { - /** - * page of the stream we're on; default = 1 - */ - - var $page = null; - var $notice; - - protected $stream = null; - - function isReadOnly($args) - { - return true; - } - - protected function doPreparation() - { - $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; - - if ($this->page > MAX_PUBLIC_PAGE) { - // TRANS: Client error displayed when requesting a public timeline page beyond the page limit. - // TRANS: %s is the page limit. - $this->clientError(sprintf(_('Beyond the page limit (%s).'), MAX_PUBLIC_PAGE)); - } - - common_set_returnto($this->selfUrl()); - - $this->streamPrepare(); - - $this->notice = $this->stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, - NOTICES_PER_PAGE + 1); - - if (!$this->notice) { - // TRANS: Server error displayed when a public timeline cannot be retrieved. - $this->serverError(_('Could not retrieve public timeline.')); - } - - if ($this->page > 1 && $this->notice->N == 0){ - // TRANS: Client error when page not found (404). - $this->clientError(_('No such page.'), 404); - } - - return true; - } - protected function streamPrepare() { if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) { @@ -137,80 +89,6 @@ class PublicAction extends ManagedAction } } - /** - * Output elements for RSS and Atom feeds - * - * @return void - */ - function getFeeds() - { - return array(new Feed(Feed::JSON, - common_local_url('ApiTimelinePublic', - array('format' => 'as')), - // TRANS: Link description for public timeline feed. - _('Public Timeline Feed (Activity Streams JSON)')), - new Feed(Feed::RSS1, common_local_url('publicrss'), - // TRANS: Link description for public timeline feed. - _('Public Timeline Feed (RSS 1.0)')), - new Feed(Feed::RSS2, - common_local_url('ApiTimelinePublic', - array('format' => 'rss')), - // TRANS: Link description for public timeline feed. - _('Public Timeline Feed (RSS 2.0)')), - new Feed(Feed::ATOM, - common_local_url('ApiTimelinePublic', - array('format' => 'atom')), - // TRANS: Link description for public timeline feed. - _('Public Timeline Feed (Atom)'))); - } - - function showEmptyList() - { - // TRANS: Text displayed for public feed when there are no public notices. - $message = _('This is the public timeline for %%site.name%% but no one has posted anything yet.') . ' '; - - if (common_logged_in()) { - // TRANS: Additional text displayed for public feed when there are no public notices for a logged in user. - $message .= _('Be the first to post!'); - } - else { - if (! (common_config('site','closed') || common_config('site','inviteonly'))) { - // TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user. - $message .= _('Why not [register an account](%%action.register%%) and be the first to post!'); - } - } - - $this->elementStart('div', 'guide'); - $this->raw(common_markup_to_html($message)); - $this->elementEnd('div'); - } - - /** - * Fill the content area - * - * Shows a list of the notices in the public stream, with some pagination - * controls. - * - * @return void - */ - function showContent() - { - if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) { - $nl = new PrimaryNoticeList($this->notice, $this, array('show_n'=>NOTICES_PER_PAGE)); - } else { - $nl = new ThreadedNoticeList($this->notice, $this, $this->scoped); - } - - $cnt = $nl->show(); - - if ($cnt == 0) { - $this->showEmptyList(); - } - - $this->pagination($this->page > 1, $cnt > NOTICES_PER_PAGE, - $this->page, $this->action); - } - function showSections() { // Show invite button, as long as site isn't closed, and @@ -239,23 +117,30 @@ class PublicAction extends ManagedAction $feat->show(); } - function showAnonymousMessage() + /** + * Output elements for RSS and Atom feeds + * + * @return void + */ + function getFeeds() { - if (! (common_config('site','closed') || common_config('site','inviteonly'))) { - // TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices. - // TRANS: This message contains Markdown links. Please mind the formatting. - $m = _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' . - 'based on the Free Software [StatusNet](http://status.net/) tool. ' . - '[Join now](%%action.register%%) to share notices about yourself with friends, family, and colleagues! ' . - '([Read more](%%doc.help%%))'); - } else { - // TRANS: Message for not logged in users at a closed site trying to view the public feed of notices. - // TRANS: This message contains Markdown links. Please mind the formatting. - $m = _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' . - 'based on the Free Software [StatusNet](http://status.net/) tool.'); - } - $this->elementStart('div', array('id' => 'anon_notice')); - $this->raw(common_markup_to_html($m)); - $this->elementEnd('div'); + return array(new Feed(Feed::JSON, + common_local_url('ApiTimelinePublic', + array('format' => 'as')), + // TRANS: Link description for public timeline feed. + _('Public Timeline Feed (Activity Streams JSON)')), + new Feed(Feed::RSS1, common_local_url('publicrss'), + // TRANS: Link description for public timeline feed. + _('Public Timeline Feed (RSS 1.0)')), + new Feed(Feed::RSS2, + common_local_url('ApiTimelinePublic', + array('format' => 'rss')), + // TRANS: Link description for public timeline feed. + _('Public Timeline Feed (RSS 2.0)')), + new Feed(Feed::ATOM, + common_local_url('ApiTimelinePublic', + array('format' => 'atom')), + // TRANS: Link description for public timeline feed. + _('Public Timeline Feed (Atom)'))); } } diff --git a/lib/sitestreamaction.php b/lib/sitestreamaction.php new file mode 100644 index 0000000000..aa1c2e1b0a --- /dev/null +++ b/lib/sitestreamaction.php @@ -0,0 +1,185 @@ +page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; + + if ($this->page > MAX_PUBLIC_PAGE) { + // TRANS: Client error displayed when requesting a public timeline page beyond the page limit. + // TRANS: %s is the page limit. + $this->clientError(sprintf(_('Beyond the page limit (%s).'), MAX_PUBLIC_PAGE)); + } + + common_set_returnto($this->selfUrl()); + + $this->streamPrepare(); + + $this->notice = $this->stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, + NOTICES_PER_PAGE + 1); + + if (!$this->notice) { + // TRANS: Server error displayed when a public timeline cannot be retrieved. + $this->serverError(_('Could not retrieve public timeline.')); + } + + if ($this->page > 1 && $this->notice->N == 0){ + // TRANS: Client error when page not found (404). + $this->clientError(_('No such page.'), 404); + } + + return true; + } + + /** + * Title of the page + * + * @return page title, including page number if over 1 + */ + function title() + { + if ($this->page > 1) { + // TRANS: Title for all public timeline pages but the first. + // TRANS: %d is the page number. + return sprintf(_('Public timeline, page %d'), $this->page); + } else { + // TRANS: Title for the first public timeline page. + return _('Public timeline'); + } + } + + function extraHead() + { + parent::extraHead(); + $this->element('meta', array('http-equiv' => 'X-XRDS-Location', + 'content' => common_local_url('publicxrds'))); + + $rsd = common_local_url('rsd'); + + // RSD, http://tales.phrasewise.com/rfc/rsd + + $this->element('link', array('rel' => 'EditURI', + 'type' => 'application/rsd+xml', + 'href' => $rsd)); + + if ($this->page != 1) { + $this->element('link', array('rel' => 'canonical', + 'href' => common_local_url('public'))); + } + } + + /** + * Output elements for RSS and Atom feeds + * + * @return void + */ + function getFeeds() + { + return array(new Feed(Feed::JSON, + common_local_url('ApiTimelinePublic', + array('format' => 'as')), + // TRANS: Link description for public timeline feed. + _('Public Timeline Feed (Activity Streams JSON)')), + new Feed(Feed::RSS1, common_local_url('publicrss'), + // TRANS: Link description for public timeline feed. + _('Public Timeline Feed (RSS 1.0)')), + new Feed(Feed::RSS2, + common_local_url('ApiTimelinePublic', + array('format' => 'rss')), + // TRANS: Link description for public timeline feed. + _('Public Timeline Feed (RSS 2.0)')), + new Feed(Feed::ATOM, + common_local_url('ApiTimelinePublic', + array('format' => 'atom')), + // TRANS: Link description for public timeline feed. + _('Public Timeline Feed (Atom)'))); + } + + function showEmptyList() + { + // TRANS: Text displayed for public feed when there are no public notices. + $message = _('This is the public timeline for %%site.name%% but no one has posted anything yet.') . ' '; + + if (common_logged_in()) { + // TRANS: Additional text displayed for public feed when there are no public notices for a logged in user. + $message .= _('Be the first to post!'); + } + else { + if (! (common_config('site','closed') || common_config('site','inviteonly'))) { + // TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user. + $message .= _('Why not [register an account](%%action.register%%) and be the first to post!'); + } + } + + $this->elementStart('div', 'guide'); + $this->raw(common_markup_to_html($message)); + $this->elementEnd('div'); + } + + /** + * Fill the content area + * + * Shows a list of the notices in the public stream, with some pagination + * controls. + * + * @return void + */ + function showContent() + { + if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) { + $nl = new PrimaryNoticeList($this->notice, $this, array('show_n'=>NOTICES_PER_PAGE)); + } else { + $nl = new ThreadedNoticeList($this->notice, $this, $this->scoped); + } + + $cnt = $nl->show(); + + if ($cnt == 0) { + $this->showEmptyList(); + } + + $this->pagination($this->page > 1, $cnt > NOTICES_PER_PAGE, + $this->page, $this->action); + } + + function showAnonymousMessage() + { + if (! (common_config('site','closed') || common_config('site','inviteonly'))) { + // TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices. + // TRANS: This message contains Markdown links. Please mind the formatting. + $m = _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' . + 'based on the Free Software [StatusNet](http://status.net/) tool. ' . + '[Join now](%%action.register%%) to share notices about yourself with friends, family, and colleagues! ' . + '([Read more](%%doc.help%%))'); + } else { + // TRANS: Message for not logged in users at a closed site trying to view the public feed of notices. + // TRANS: This message contains Markdown links. Please mind the formatting. + $m = _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' . + 'based on the Free Software [StatusNet](http://status.net/) tool.'); + } + $this->elementStart('div', array('id' => 'anon_notice')); + $this->raw(common_markup_to_html($m)); + $this->elementEnd('div'); + } +}