*/
protected $maxPageLength = 70;
+ /**
+ * Maximum number of pages in a hierarchical ("top level") list.
+ *
+ * Traversal of the entire page list by spidering the top levels is thought
+ * to require O(N^3) DB CPU time where N is the number of pages on the wiki.
+ * See bug 56840. If this limit is exceeded, the behaviour becomes like a
+ * simple alphabetic pager.
+ */
+ protected $maxTopLevelPages = 50000;
+
/**
* Determines, which message describes the input field 'nsfrom'.
*
* @param string $par becomes "FOO" when called like Special:Allpages/FOO (default NULL)
*/
function execute( $par ) {
- global $wgContLang;
$request = $this->getRequest();
$out = $this->getOutput();
$namespace = $request->getInt( 'namespace' );
$hideredirects = $request->getBool( 'hideredirects', false );
- $namespaces = $wgContLang->getNamespaces();
+ $namespaces = $this->getContext()->getLanguage()->getNamespaces();
$out->setPageTitle(
( $namespace > 0 && in_array( $namespace, array_keys( $namespaces ) ) ) ?
$out .= Xml::closeElement( 'fieldset' );
$out .= Xml::closeElement( 'form' );
$out .= Xml::closeElement( 'div' );
+
return $out;
}
$lines = $wgMemc->get( $key );
$count = $dbr->estimateRowCount( 'page', '*', $where, __METHOD__ );
+
+ // Don't show a hierarchical list if the number of pages is very large,
+ // since generating it will cause a lot of scanning
+ if ( $count > $this->maxTopLevelPages ) {
+ $this->showChunk( $namespace, $from, $to, $hideredirects );
+ return;
+ }
+
$maxPerSubpage = intval( $count / $this->maxLineCount );
$maxPerSubpage = max( $maxPerSubpage, $this->maxPerPage );
} else {
$output->addHTML( $this->namespaceForm( $namespace, $from, $to, $hideredirects ) );
}
+
return;
}
* @return string
*/
function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideRedirects = false ) {
+ // Use content language since page titles are considered to use content language
global $wgContLang;
- $inpointf = htmlspecialchars( str_replace( '_', ' ', $inpoint ) );
- $outpointf = htmlspecialchars( str_replace( '_', ' ', $outpoint ) );
+
+ $inpointf = str_replace( '_', ' ', $inpoint );
+ $outpointf = str_replace( '_', ' ', $outpoint );
+
// Don't let the length runaway
$inpointf = $wgContLang->truncate( $inpointf, $this->maxPageLength );
$outpointf = $wgContLang->truncate( $outpointf, $this->maxPageLength );
- $queryParams = array (
+ $queryParams = array(
'from' => $inpoint,
'to' => $outpoint,
);
- if( $namespace ) {
+ if ( $namespace ) {
$queryParams['namespace'] = $namespace;
}
if ( $hideRedirects ) {
$queryParams['hideredirects'] = 1;
}
- $link = htmlspecialchars(
- $this->getTitle()->getLocalURL( $queryParams ) );
+ $url = $this->getTitle()->getLocalURL( $queryParams );
+ $inlink = Html::element( 'a', array( 'href' => $url ), $inpointf );
+ $outlink = Html::element( 'a', array( 'href' => $url ), $outpointf );
$out = $this->msg( 'alphaindexline' )->rawParams(
- "<a href=\"$link\">$inpointf</a></td><td>",
- "</td><td><a href=\"$link\">$outpointf</a>"
+ "$inlink</td><td>",
+ "</td><td>$outlink"
)->escaped();
+
return '<tr><td class="mw-allpages-alphaindexline">' . $out . '</td></tr>';
}
/**
- * @param $namespace Integer (Default NS_MAIN)
+ * @param int $namespace Namespace (Default NS_MAIN)
* @param string $from list all pages from this name (default FALSE)
* @param string $to list all pages to this name (default FALSE)
* @param bool $hideredirects dont show redirects (default FALSE)
*/
function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $hideredirects = false ) {
- global $wgContLang;
$output = $this->getOutput();
$fromList = $this->getNamespaceKeyAndText( $namespace, $from );
$toList = $this->getNamespaceKeyAndText( $namespace, $to );
- $namespaces = $wgContLang->getNamespaces();
+ $namespaces = $this->getContext()->getLanguage()->getNamespaces();
$n = 0;
if ( !$fromList || !$toList ) {
)
);
}
-
}
/**