wiki.techinc.nl/includes/Navigation/PrevNextNavigationRenderer.php
Daimona Eaytoy c659bc6308 Unsuppress another phan issue (part 7)
Bug: T231636
Depends-On: I2cd24e73726394e3200a570c45d5e86b6849bfa9
Depends-On: I4fa3e6aad872434ca397325ed7a83f94973661d0
Change-Id: Ie6233561de78457cae5e4e44e220feec2d1272d8
2019-09-03 17:19:21 +00:00

121 lines
3.7 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
namespace MediaWiki\Navigation;
use Html;
use MessageLocalizer;
use Title;
/**
* Helper class for generating prev/next links for paging.
* @todo Use LinkTarget instead of Title
*
* @since 1.34
*/
class PrevNextNavigationRenderer {
/**
* @var MessageLocalizer
*/
private $messageLocalizer;
/**
* @param MessageLocalizer $messageLocalizer
*/
public function __construct( MessageLocalizer $messageLocalizer ) {
$this->messageLocalizer = $messageLocalizer;
}
/**
* Generate (prev x| next x) (20|50|100...) type links for paging
*
* @param Title $title Title object to link
* @param int $offset
* @param int $limit
* @param array $query Optional URL query parameter string
* @param bool $atend Optional param for specified if this is the last page
* @return string
*/
public function buildPrevNextNavigation(
Title $title,
$offset,
$limit,
array $query = [],
$atend = false
) {
# Make 'previous' link
$prev = $this->messageLocalizer->msg( 'prevn' )->title( $title )
->numParams( $limit )->text();
if ( $offset > 0 ) {
$plink = $this->numLink( $title, max( $offset - $limit, 0 ), $limit, $query,
$prev, 'prevn-title', 'mw-prevlink' );
} else {
$plink = htmlspecialchars( $prev );
}
# Make 'next' link
$next = $this->messageLocalizer->msg( 'nextn' )->title( $title )
->numParams( $limit )->text();
if ( $atend ) {
$nlink = htmlspecialchars( $next );
} else {
$nlink = $this->numLink( $title, $offset + $limit, $limit,
$query, $next, 'nextn-title', 'mw-nextlink' );
}
# Make links to set number of items per page
$numLinks = [];
// @phan-suppress-next-next-line PhanUndeclaredMethod
// @fixme MessageLocalizer doesn't have a getLanguage() method!
$lang = $this->messageLocalizer->getLanguage();
foreach ( [ 20, 50, 100, 250, 500 ] as $num ) {
$numLinks[] = $this->numLink( $title, $offset, $num, $query,
$lang->formatNum( $num ), 'shown-title', 'mw-numlink' );
}
return $this->messageLocalizer->msg( 'viewprevnext' )->title( $title
)->rawParams( $plink, $nlink, $lang->pipeList( $numLinks ) )->escaped();
}
/**
* Helper function for buildPrevNextNavigation() that generates links
*
* @param Title $title Title object to link
* @param int $offset
* @param int $limit
* @param array $query Extra query parameters
* @param string $link Text to use for the link; will be escaped
* @param string $tooltipMsg Name of the message to use as tooltip
* @param string $class Value of the "class" attribute of the link
* @return string HTML fragment
*/
private function numLink( Title $title, $offset, $limit, array $query, $link,
$tooltipMsg, $class
) {
$query = [ 'limit' => $limit, 'offset' => $offset ] + $query;
$tooltip = $this->messageLocalizer->msg( $tooltipMsg )->title( $title )
->numParams( $limit )->text();
return Html::element( 'a', [ 'href' => $title->getLocalURL( $query ),
'title' => $tooltip, 'class' => $class ], $link );
}
}