2004-08-22 09:42:12 +00:00
|
|
|
<?php
|
2004-09-02 23:28:24 +00:00
|
|
|
/**
|
|
|
|
|
* Special handling for category description pages
|
|
|
|
|
* Modelled after ImagePage.php
|
|
|
|
|
*
|
2004-09-03 23:00:01 +00:00
|
|
|
*/
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-12-03 10:57:19 +00:00
|
|
|
if( !defined( 'MEDIAWIKI' ) )
|
2006-06-07 04:15:58 +00:00
|
|
|
die( 1 );
|
2004-08-22 09:42:12 +00:00
|
|
|
|
2004-09-02 23:28:24 +00:00
|
|
|
/**
|
|
|
|
|
*/
|
2004-08-22 09:42:12 +00:00
|
|
|
class CategoryPage extends Article {
|
|
|
|
|
function view() {
|
2007-01-17 05:01:54 +00:00
|
|
|
global $wgRequest, $wgUser;
|
|
|
|
|
|
|
|
|
|
$diff = $wgRequest->getVal( 'diff' );
|
|
|
|
|
$diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
|
|
|
|
|
|
|
|
|
|
if ( isset( $diff ) && $diffOnly )
|
|
|
|
|
return Article::view();
|
|
|
|
|
|
2005-04-25 11:09:21 +00:00
|
|
|
if(!wfRunHooks('CategoryPageView', array(&$this))) return;
|
|
|
|
|
|
2004-08-22 09:42:12 +00:00
|
|
|
if ( NS_CATEGORY == $this->mTitle->getNamespace() ) {
|
|
|
|
|
$this->openShowCategory();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Article::view();
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-08-22 09:42:12 +00:00
|
|
|
# If the article we've just shown is in the "Image" namespace,
|
|
|
|
|
# follow it with the history list and link list for the image
|
|
|
|
|
# it describes.
|
|
|
|
|
|
|
|
|
|
if ( NS_CATEGORY == $this->mTitle->getNamespace() ) {
|
|
|
|
|
$this->closeShowCategory();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2007-10-09 19:15:35 +00:00
|
|
|
/**
|
|
|
|
|
* This page should not be cached if 'from' or 'until' has been used
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
|
|
|
|
function isFileCacheable() {
|
|
|
|
|
global $wgRequest;
|
|
|
|
|
|
|
|
|
|
return ( ! Article::isFileCacheable()
|
|
|
|
|
|| $wgRequest->getVal( 'from' )
|
|
|
|
|
|| $wgRequest->getVal( 'until' )
|
|
|
|
|
) ? false : true;
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-02 23:28:24 +00:00
|
|
|
function openShowCategory() {
|
2004-08-22 09:42:12 +00:00
|
|
|
# For overloading
|
|
|
|
|
}
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-09-02 23:28:24 +00:00
|
|
|
function closeShowCategory() {
|
2004-12-21 03:26:43 +00:00
|
|
|
global $wgOut, $wgRequest;
|
|
|
|
|
$from = $wgRequest->getVal( 'from' );
|
|
|
|
|
$until = $wgRequest->getVal( 'until' );
|
2006-08-24 17:03:39 +00:00
|
|
|
|
|
|
|
|
$viewer = new CategoryViewer( $this->mTitle, $from, $until );
|
|
|
|
|
$wgOut->addHTML( $viewer->getHTML() );
|
2004-08-22 09:42:12 +00:00
|
|
|
}
|
2006-08-24 17:03:39 +00:00
|
|
|
}
|
2004-08-22 09:42:12 +00:00
|
|
|
|
2006-08-24 17:03:39 +00:00
|
|
|
class CategoryViewer {
|
|
|
|
|
var $title, $limit, $from, $until,
|
2008-04-14 07:45:50 +00:00
|
|
|
$articles, $articles_start_char,
|
2006-08-24 17:03:39 +00:00
|
|
|
$children, $children_start_char,
|
2006-11-08 07:12:03 +00:00
|
|
|
$showGallery, $gallery,
|
|
|
|
|
$skin;
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
/** Category object for this page */
|
|
|
|
|
private $cat;
|
2006-08-24 17:03:39 +00:00
|
|
|
|
2006-08-25 07:33:55 +00:00
|
|
|
function __construct( $title, $from = '', $until = '' ) {
|
2006-08-24 17:03:39 +00:00
|
|
|
global $wgCategoryPagingLimit;
|
|
|
|
|
$this->title = $title;
|
|
|
|
|
$this->from = $from;
|
|
|
|
|
$this->until = $until;
|
|
|
|
|
$this->limit = $wgCategoryPagingLimit;
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
$this->cat = Category::newFromName( $title->getDBKey() );
|
2006-08-24 17:03:39 +00:00
|
|
|
}
|
2008-04-14 07:45:50 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
/**
|
|
|
|
|
* Format the category data list.
|
|
|
|
|
*
|
|
|
|
|
* @param string $from -- return only sort keys from this item on
|
|
|
|
|
* @param string $until -- don't return keys after this point.
|
|
|
|
|
* @return string HTML output
|
2006-04-20 20:43:38 +00:00
|
|
|
* @private
|
2004-12-21 03:26:43 +00:00
|
|
|
*/
|
2006-08-24 17:03:39 +00:00
|
|
|
function getHTML() {
|
|
|
|
|
global $wgOut, $wgCategoryMagicGallery, $wgCategoryPagingLimit;
|
|
|
|
|
wfProfileIn( __METHOD__ );
|
|
|
|
|
|
|
|
|
|
$this->showGallery = $wgCategoryMagicGallery && !$wgOut->mNoGallery;
|
|
|
|
|
|
|
|
|
|
$this->clearCategoryState();
|
|
|
|
|
$this->doCategoryQuery();
|
|
|
|
|
$this->finaliseCategoryState();
|
|
|
|
|
|
|
|
|
|
$r = $this->getCategoryTop() .
|
|
|
|
|
$this->getSubcategorySection() .
|
|
|
|
|
$this->getPagesSection() .
|
|
|
|
|
$this->getImageSection() .
|
|
|
|
|
$this->getCategoryBottom();
|
|
|
|
|
|
2007-07-16 15:15:26 +00:00
|
|
|
// Give a proper message if category is empty
|
|
|
|
|
if ( $r == '' ) {
|
|
|
|
|
$r = wfMsgExt( 'category-empty', array( 'parse' ) );
|
|
|
|
|
}
|
|
|
|
|
|
2006-08-24 17:03:39 +00:00
|
|
|
wfProfileOut( __METHOD__ );
|
|
|
|
|
return $r;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function clearCategoryState() {
|
|
|
|
|
$this->articles = array();
|
|
|
|
|
$this->articles_start_char = array();
|
|
|
|
|
$this->children = array();
|
|
|
|
|
$this->children_start_char = array();
|
|
|
|
|
if( $this->showGallery ) {
|
|
|
|
|
$this->gallery = new ImageGallery();
|
2007-08-22 13:40:22 +00:00
|
|
|
$this->gallery->setHideBadImages();
|
2006-08-24 17:03:39 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2006-11-08 07:12:03 +00:00
|
|
|
function getSkin() {
|
|
|
|
|
if ( !$this->skin ) {
|
|
|
|
|
global $wgUser;
|
|
|
|
|
$this->skin = $wgUser->getSkin();
|
|
|
|
|
}
|
|
|
|
|
return $this->skin;
|
|
|
|
|
}
|
|
|
|
|
|
2006-08-24 17:03:39 +00:00
|
|
|
/**
|
|
|
|
|
* Add a subcategory to the internal lists
|
|
|
|
|
*/
|
|
|
|
|
function addSubcategory( $title, $sortkey, $pageLength ) {
|
|
|
|
|
global $wgContLang;
|
|
|
|
|
// Subcategory; strip the 'Category' namespace from the link text.
|
2008-04-14 07:45:50 +00:00
|
|
|
$this->children[] = $this->getSkin()->makeKnownLinkObj(
|
2006-08-24 17:03:39 +00:00
|
|
|
$title, $wgContLang->convertHtml( $title->getText() ) );
|
|
|
|
|
|
2006-09-02 11:45:30 +00:00
|
|
|
$this->children_start_char[] = $this->getSubcategorySortChar( $title, $sortkey );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get the character to be used for sorting subcategories.
|
|
|
|
|
* If there's a link from Category:A to Category:B, the sortkey of the resulting
|
|
|
|
|
* entry in the categorylinks table is Category:A, not A, which it SHOULD be.
|
|
|
|
|
* Workaround: If sortkey == "Category:".$title, than use $title for sorting,
|
|
|
|
|
* else use sortkey...
|
|
|
|
|
*/
|
|
|
|
|
function getSubcategorySortChar( $title, $sortkey ) {
|
|
|
|
|
global $wgContLang;
|
2008-04-14 07:45:50 +00:00
|
|
|
|
2006-08-24 17:03:39 +00:00
|
|
|
if( $title->getPrefixedText() == $sortkey ) {
|
2006-08-25 07:33:55 +00:00
|
|
|
$firstChar = $wgContLang->firstChar( $title->getDBkey() );
|
2006-08-24 17:03:39 +00:00
|
|
|
} else {
|
2006-08-25 07:33:55 +00:00
|
|
|
$firstChar = $wgContLang->firstChar( $sortkey );
|
2006-08-24 17:03:39 +00:00
|
|
|
}
|
2008-04-14 07:45:50 +00:00
|
|
|
|
2006-09-02 11:45:30 +00:00
|
|
|
return $wgContLang->convert( $firstChar );
|
2006-08-24 17:03:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Add a page in the image namespace
|
|
|
|
|
*/
|
2007-05-30 21:02:32 +00:00
|
|
|
function addImage( Title $title, $sortkey, $pageLength, $isRedirect = false ) {
|
2006-08-24 17:03:39 +00:00
|
|
|
if ( $this->showGallery ) {
|
2008-04-09 12:09:15 +00:00
|
|
|
$image = wfLocalFile( $title );
|
2006-08-24 17:03:39 +00:00
|
|
|
if( $this->flip ) {
|
|
|
|
|
$this->gallery->insert( $image );
|
|
|
|
|
} else {
|
|
|
|
|
$this->gallery->add( $image );
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2007-05-14 03:23:02 +00:00
|
|
|
$this->addPage( $title, $sortkey, $pageLength, $isRedirect );
|
2006-08-24 17:03:39 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Add a miscellaneous page
|
|
|
|
|
*/
|
2007-05-14 03:23:02 +00:00
|
|
|
function addPage( $title, $sortkey, $pageLength, $isRedirect = false ) {
|
2006-08-24 17:03:39 +00:00
|
|
|
global $wgContLang;
|
2007-07-10 12:25:06 +00:00
|
|
|
$this->articles[] = $isRedirect
|
|
|
|
|
? '<span class="redirect-in-category">' . $this->getSkin()->makeKnownLinkObj( $title ) . '</span>'
|
|
|
|
|
: $this->getSkin()->makeSizeLinkObj( $pageLength, $title );
|
2006-08-24 17:03:39 +00:00
|
|
|
$this->articles_start_char[] = $wgContLang->convert( $wgContLang->firstChar( $sortkey ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function finaliseCategoryState() {
|
|
|
|
|
if( $this->flip ) {
|
|
|
|
|
$this->children = array_reverse( $this->children );
|
|
|
|
|
$this->children_start_char = array_reverse( $this->children_start_char );
|
|
|
|
|
$this->articles = array_reverse( $this->articles );
|
|
|
|
|
$this->articles_start_char = array_reverse( $this->articles_start_char );
|
2004-09-30 21:36:12 +00:00
|
|
|
}
|
2006-08-24 17:03:39 +00:00
|
|
|
}
|
2004-09-30 21:36:12 +00:00
|
|
|
|
2006-08-24 17:03:39 +00:00
|
|
|
function doCategoryQuery() {
|
2007-01-22 23:50:42 +00:00
|
|
|
$dbr = wfGetDB( DB_SLAVE );
|
2006-08-24 17:03:39 +00:00
|
|
|
if( $this->from != '' ) {
|
|
|
|
|
$pageCondition = 'cl_sortkey >= ' . $dbr->addQuotes( $this->from );
|
|
|
|
|
$this->flip = false;
|
|
|
|
|
} elseif( $this->until != '' ) {
|
|
|
|
|
$pageCondition = 'cl_sortkey < ' . $dbr->addQuotes( $this->until );
|
|
|
|
|
$this->flip = true;
|
2004-12-21 03:26:43 +00:00
|
|
|
} else {
|
2005-08-02 13:35:19 +00:00
|
|
|
$pageCondition = '1 = 1';
|
2006-08-24 17:03:39 +00:00
|
|
|
$this->flip = false;
|
2004-12-21 03:26:43 +00:00
|
|
|
}
|
|
|
|
|
$res = $dbr->select(
|
|
|
|
|
array( 'page', 'categorylinks' ),
|
2007-05-14 03:23:02 +00:00
|
|
|
array( 'page_title', 'page_namespace', 'page_len', 'page_is_redirect', 'cl_sortkey' ),
|
2004-12-21 03:26:43 +00:00
|
|
|
array( $pageCondition,
|
|
|
|
|
'cl_from = page_id',
|
2008-01-14 09:13:04 +00:00
|
|
|
'cl_to' => $this->title->getDBkey()),
|
2005-03-14 07:42:38 +00:00
|
|
|
#'page_is_redirect' => 0),
|
2004-12-21 03:26:43 +00:00
|
|
|
#+ $pageCondition,
|
2006-08-24 17:03:39 +00:00
|
|
|
__METHOD__,
|
|
|
|
|
array( 'ORDER BY' => $this->flip ? 'cl_sortkey DESC' : 'cl_sortkey',
|
2008-04-14 07:45:50 +00:00
|
|
|
'USE INDEX' => 'cl_sortkey',
|
2006-08-24 17:03:39 +00:00
|
|
|
'LIMIT' => $this->limit + 1 ) );
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
$count = 0;
|
2006-08-24 17:03:39 +00:00
|
|
|
$this->nextPage = null;
|
2004-12-21 03:26:43 +00:00
|
|
|
while( $x = $dbr->fetchObject ( $res ) ) {
|
2006-08-24 17:03:39 +00:00
|
|
|
if( ++$count > $this->limit ) {
|
2004-12-21 03:26:43 +00:00
|
|
|
// We've reached the one extra which shows that there are
|
|
|
|
|
// additional pages to be had. Stop here...
|
2006-08-24 17:03:39 +00:00
|
|
|
$this->nextPage = $x->cl_sortkey;
|
2004-12-21 03:26:43 +00:00
|
|
|
break;
|
|
|
|
|
}
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
$title = Title::makeTitle( $x->page_namespace, $x->page_title );
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
if( $title->getNamespace() == NS_CATEGORY ) {
|
2006-08-24 17:03:39 +00:00
|
|
|
$this->addSubcategory( $title, $x->cl_sortkey, $x->page_len );
|
2007-05-30 21:02:32 +00:00
|
|
|
} elseif( $this->showGallery && $title->getNamespace() == NS_IMAGE ) {
|
2007-05-14 03:38:42 +00:00
|
|
|
$this->addImage( $title, $x->cl_sortkey, $x->page_len, $x->page_is_redirect );
|
2004-09-30 21:36:12 +00:00
|
|
|
} else {
|
2007-05-14 03:38:42 +00:00
|
|
|
$this->addPage( $title, $x->cl_sortkey, $x->page_len, $x->page_is_redirect );
|
2004-11-18 23:41:46 +00:00
|
|
|
}
|
|
|
|
|
}
|
2004-12-21 03:26:43 +00:00
|
|
|
$dbr->freeResult( $res );
|
2006-08-24 17:03:39 +00:00
|
|
|
}
|
2004-11-18 23:41:46 +00:00
|
|
|
|
2006-08-24 17:03:39 +00:00
|
|
|
function getCategoryTop() {
|
2007-07-16 15:15:26 +00:00
|
|
|
$r = '';
|
2006-08-24 17:03:39 +00:00
|
|
|
if( $this->until != '' ) {
|
|
|
|
|
$r .= $this->pagingLinks( $this->title, $this->nextPage, $this->until, $this->limit );
|
|
|
|
|
} elseif( $this->nextPage != '' || $this->from != '' ) {
|
|
|
|
|
$r .= $this->pagingLinks( $this->title, $this->from, $this->nextPage, $this->limit );
|
2004-12-21 03:26:43 +00:00
|
|
|
}
|
2007-07-16 15:15:26 +00:00
|
|
|
return $r == ''
|
|
|
|
|
? $r
|
|
|
|
|
: "<br style=\"clear:both;\"/>\n" . $r;
|
2006-08-24 17:03:39 +00:00
|
|
|
}
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2006-08-24 17:03:39 +00:00
|
|
|
function getSubcategorySection() {
|
2004-11-18 23:41:46 +00:00
|
|
|
# Don't show subcategories section if there are none.
|
2006-08-24 17:03:39 +00:00
|
|
|
$r = '';
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
$rescnt = count( $this->children );
|
|
|
|
|
$dbcnt = $this->cat->getSubcatCount();
|
|
|
|
|
$countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'subcat' );
|
|
|
|
|
if( $rescnt > 0 ) {
|
2004-11-18 23:41:46 +00:00
|
|
|
# Showing subcategories
|
2006-10-16 06:24:56 +00:00
|
|
|
$r .= "<div id=\"mw-subcategories\">\n";
|
2004-11-18 23:41:46 +00:00
|
|
|
$r .= '<h2>' . wfMsg( 'subcategories' ) . "</h2>\n";
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
$r .= $countmsg;
|
2006-08-24 17:03:39 +00:00
|
|
|
$r .= $this->formatList( $this->children, $this->children_start_char );
|
2006-10-16 00:10:57 +00:00
|
|
|
$r .= "\n</div>";
|
2004-12-21 03:26:43 +00:00
|
|
|
}
|
2006-08-24 17:03:39 +00:00
|
|
|
return $r;
|
|
|
|
|
}
|
2004-11-18 23:41:46 +00:00
|
|
|
|
2006-08-24 17:03:39 +00:00
|
|
|
function getPagesSection() {
|
|
|
|
|
$ti = htmlspecialchars( $this->title->getText() );
|
2007-02-22 15:01:45 +00:00
|
|
|
# Don't show articles section if there are none.
|
|
|
|
|
$r = '';
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
|
|
|
|
|
# FIXME, here and in the other two sections: we don't need to bother
|
|
|
|
|
# with this rigamarole if the entire category contents fit on one page
|
|
|
|
|
# and have already been retrieved. We can just use $rescnt in that
|
|
|
|
|
# case and save a query and some logic.
|
|
|
|
|
$dbcnt = $this->cat->getPageCount() - $this->cat->getSubcatCount()
|
|
|
|
|
- $this->cat->getFileCount();
|
|
|
|
|
$rescnt = count( $this->articles );
|
|
|
|
|
$countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'article' );
|
|
|
|
|
|
|
|
|
|
if( $rescnt > 0 ) {
|
2007-02-22 15:01:45 +00:00
|
|
|
$r = "<div id=\"mw-pages\">\n";
|
|
|
|
|
$r .= '<h2>' . wfMsg( 'category_header', $ti ) . "</h2>\n";
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
$r .= $countmsg;
|
2007-02-22 15:01:45 +00:00
|
|
|
$r .= $this->formatList( $this->articles, $this->articles_start_char );
|
|
|
|
|
$r .= "\n</div>";
|
|
|
|
|
}
|
2006-08-24 17:03:39 +00:00
|
|
|
return $r;
|
|
|
|
|
}
|
2004-11-18 23:41:46 +00:00
|
|
|
|
2006-08-24 17:03:39 +00:00
|
|
|
function getImageSection() {
|
|
|
|
|
if( $this->showGallery && ! $this->gallery->isEmpty() ) {
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
$dbcnt = $this->cat->getFileCount();
|
|
|
|
|
$rescnt = $this->gallery->count();
|
|
|
|
|
$countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'file' );
|
|
|
|
|
|
2006-11-12 03:16:31 +00:00
|
|
|
return "<div id=\"mw-category-media\">\n" .
|
|
|
|
|
'<h2>' . wfMsg( 'category-media-header', htmlspecialchars($this->title->getText()) ) . "</h2>\n" .
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
$countmsg . $this->gallery->toHTML() . "\n</div>";
|
2006-08-24 17:03:39 +00:00
|
|
|
} else {
|
|
|
|
|
return '';
|
2004-11-18 23:41:46 +00:00
|
|
|
}
|
2006-08-24 17:03:39 +00:00
|
|
|
}
|
2004-11-18 23:41:46 +00:00
|
|
|
|
2006-08-24 17:03:39 +00:00
|
|
|
function getCategoryBottom() {
|
|
|
|
|
if( $this->until != '' ) {
|
|
|
|
|
return $this->pagingLinks( $this->title, $this->nextPage, $this->until, $this->limit );
|
|
|
|
|
} elseif( $this->nextPage != '' || $this->from != '' ) {
|
|
|
|
|
return $this->pagingLinks( $this->title, $this->from, $this->nextPage, $this->limit );
|
|
|
|
|
} else {
|
|
|
|
|
return '';
|
2006-01-22 23:10:56 +00:00
|
|
|
}
|
2004-12-21 03:26:43 +00:00
|
|
|
}
|
2004-11-18 23:41:46 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
/**
|
|
|
|
|
* Format a list of articles chunked by letter, either as a
|
|
|
|
|
* bullet list or a columnar format, depending on the length.
|
|
|
|
|
*
|
|
|
|
|
* @param array $articles
|
|
|
|
|
* @param array $articles_start_char
|
|
|
|
|
* @param int $cutoff
|
|
|
|
|
* @return string
|
2006-04-20 20:43:38 +00:00
|
|
|
* @private
|
2004-12-21 03:26:43 +00:00
|
|
|
*/
|
|
|
|
|
function formatList( $articles, $articles_start_char, $cutoff = 6 ) {
|
|
|
|
|
if ( count ( $articles ) > $cutoff ) {
|
|
|
|
|
return $this->columnList( $articles, $articles_start_char );
|
|
|
|
|
} elseif ( count($articles) > 0) {
|
|
|
|
|
// for short lists of articles in categories.
|
|
|
|
|
return $this->shortList( $articles, $articles_start_char );
|
|
|
|
|
}
|
|
|
|
|
return '';
|
|
|
|
|
}
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
/**
|
|
|
|
|
* Format a list of articles chunked by letter in a three-column
|
|
|
|
|
* list, ordered vertically.
|
|
|
|
|
*
|
|
|
|
|
* @param array $articles
|
|
|
|
|
* @param array $articles_start_char
|
|
|
|
|
* @return string
|
2006-04-20 20:43:38 +00:00
|
|
|
* @private
|
2004-12-21 03:26:43 +00:00
|
|
|
*/
|
|
|
|
|
function columnList( $articles, $articles_start_char ) {
|
|
|
|
|
// divide list into three equal chunks
|
|
|
|
|
$chunk = (int) (count ( $articles ) / 3);
|
|
|
|
|
|
|
|
|
|
// get and display header
|
|
|
|
|
$r = '<table width="100%"><tr valign="top">';
|
|
|
|
|
|
2005-08-02 13:35:19 +00:00
|
|
|
$prev_start_char = 'none';
|
2004-12-21 03:26:43 +00:00
|
|
|
|
|
|
|
|
// loop through the chunks
|
|
|
|
|
for($startChunk = 0, $endChunk = $chunk, $chunkIndex = 0;
|
|
|
|
|
$chunkIndex < 3;
|
|
|
|
|
$chunkIndex++, $startChunk = $endChunk, $endChunk += $chunk + 1)
|
|
|
|
|
{
|
2005-02-03 08:44:59 +00:00
|
|
|
$r .= "<td>\n";
|
|
|
|
|
$atColumnTop = true;
|
2004-11-18 18:57:51 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
// output all articles in category
|
|
|
|
|
for ($index = $startChunk ;
|
|
|
|
|
$index < $endChunk && $index < count($articles);
|
|
|
|
|
$index++ )
|
2004-11-18 23:41:46 +00:00
|
|
|
{
|
2004-12-31 15:01:20 +00:00
|
|
|
// check for change of starting letter or begining of chunk
|
2004-12-21 03:26:43 +00:00
|
|
|
if ( ($index == $startChunk) ||
|
|
|
|
|
($articles_start_char[$index] != $articles_start_char[$index - 1]) )
|
2004-11-18 23:41:46 +00:00
|
|
|
|
|
|
|
|
{
|
2005-02-03 08:44:59 +00:00
|
|
|
if( $atColumnTop ) {
|
|
|
|
|
$atColumnTop = false;
|
|
|
|
|
} else {
|
|
|
|
|
$r .= "</ul>\n";
|
|
|
|
|
}
|
2004-12-21 03:26:43 +00:00
|
|
|
$cont_msg = "";
|
2004-12-31 15:01:20 +00:00
|
|
|
if ( $articles_start_char[$index] == $prev_start_char )
|
2007-07-13 08:41:25 +00:00
|
|
|
$cont_msg = ' ' . wfMsgHtml( 'listingcontinuesabbrev' );
|
2005-12-05 08:19:52 +00:00
|
|
|
$r .= "<h3>" . htmlspecialchars( $articles_start_char[$index] ) . "$cont_msg</h3>\n<ul>";
|
2004-12-21 03:26:43 +00:00
|
|
|
$prev_start_char = $articles_start_char[$index];
|
2004-11-18 23:41:46 +00:00
|
|
|
}
|
|
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
$r .= "<li>{$articles[$index]}</li>";
|
2004-11-18 23:41:46 +00:00
|
|
|
}
|
2005-02-03 08:44:59 +00:00
|
|
|
if( !$atColumnTop ) {
|
|
|
|
|
$r .= "</ul>\n";
|
|
|
|
|
}
|
|
|
|
|
$r .= "</td>\n";
|
2004-11-18 23:41:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2004-12-21 03:26:43 +00:00
|
|
|
$r .= '</tr></table>';
|
|
|
|
|
return $r;
|
|
|
|
|
}
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
/**
|
|
|
|
|
* Format a list of articles chunked by letter in a bullet list.
|
|
|
|
|
* @param array $articles
|
|
|
|
|
* @param array $articles_start_char
|
|
|
|
|
* @return string
|
2006-04-20 20:43:38 +00:00
|
|
|
* @private
|
2004-12-21 03:26:43 +00:00
|
|
|
*/
|
|
|
|
|
function shortList( $articles, $articles_start_char ) {
|
2005-12-05 08:19:52 +00:00
|
|
|
$r = '<h3>' . htmlspecialchars( $articles_start_char[0] ) . "</h3>\n";
|
2004-12-21 03:26:43 +00:00
|
|
|
$r .= '<ul><li>'.$articles[0].'</li>';
|
|
|
|
|
for ($index = 1; $index < count($articles); $index++ )
|
|
|
|
|
{
|
|
|
|
|
if ($articles_start_char[$index] != $articles_start_char[$index - 1])
|
|
|
|
|
{
|
2005-12-05 08:19:52 +00:00
|
|
|
$r .= "</ul><h3>" . htmlspecialchars( $articles_start_char[$index] ) . "</h3>\n<ul>";
|
2004-12-21 03:26:43 +00:00
|
|
|
}
|
2004-09-30 21:36:12 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
$r .= "<li>{$articles[$index]}</li>";
|
2004-09-30 21:36:12 +00:00
|
|
|
}
|
2004-12-21 03:26:43 +00:00
|
|
|
$r .= '</ul>';
|
|
|
|
|
return $r;
|
|
|
|
|
}
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
/**
|
|
|
|
|
* @param Title $title
|
|
|
|
|
* @param string $first
|
|
|
|
|
* @param string $last
|
|
|
|
|
* @param int $limit
|
|
|
|
|
* @param array $query - additional query options to pass
|
|
|
|
|
* @return string
|
2006-04-20 20:43:38 +00:00
|
|
|
* @private
|
2004-12-21 03:26:43 +00:00
|
|
|
*/
|
|
|
|
|
function pagingLinks( $title, $first, $last, $limit, $query = array() ) {
|
2007-10-09 19:15:35 +00:00
|
|
|
global $wgLang;
|
2007-01-22 23:50:42 +00:00
|
|
|
$sk = $this->getSkin();
|
2004-12-21 03:26:43 +00:00
|
|
|
$limitText = $wgLang->formatNum( $limit );
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
$prevLink = htmlspecialchars( wfMsg( 'prevn', $limitText ) );
|
|
|
|
|
if( $first != '' ) {
|
2006-11-08 07:12:03 +00:00
|
|
|
$prevLink = $sk->makeLinkObj( $title, $prevLink,
|
2004-12-21 03:26:43 +00:00
|
|
|
wfArrayToCGI( $query + array( 'until' => $first ) ) );
|
|
|
|
|
}
|
|
|
|
|
$nextLink = htmlspecialchars( wfMsg( 'nextn', $limitText ) );
|
|
|
|
|
if( $last != '' ) {
|
2006-11-08 07:12:03 +00:00
|
|
|
$nextLink = $sk->makeLinkObj( $title, $nextLink,
|
2004-12-21 03:26:43 +00:00
|
|
|
wfArrayToCGI( $query + array( 'from' => $last ) ) );
|
|
|
|
|
}
|
2005-08-02 13:35:19 +00:00
|
|
|
|
2004-12-21 03:26:43 +00:00
|
|
|
return "($prevLink) ($nextLink)";
|
2004-11-18 23:41:46 +00:00
|
|
|
}
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* What to do if the category table conflicts with the number of results
|
|
|
|
|
* returned? This function says what. It works the same whether the
|
|
|
|
|
* things being counted are articles, subcategories, or files.
|
|
|
|
|
*
|
|
|
|
|
* Note for grepping: uses the messages category-article-count,
|
|
|
|
|
* category-article-count-limited, category-subcat-count,
|
|
|
|
|
* category-subcat-count-limited, category-file-count,
|
|
|
|
|
* category-file-count-limited.
|
|
|
|
|
*
|
|
|
|
|
* @param int $rescnt The number of items returned by our database query.
|
|
|
|
|
* @param int $dbcnt The number of items according to the category table.
|
|
|
|
|
* @param string $type 'subcat', 'article', or 'file'
|
|
|
|
|
* @return string A message giving the number of items, to output to HTML.
|
|
|
|
|
*/
|
|
|
|
|
private function getCountMessage( $rescnt, $dbcnt, $type ) {
|
2008-03-20 02:01:55 +00:00
|
|
|
global $wgLang;
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
# There are three cases:
|
|
|
|
|
# 1) The category table figure seems sane. It might be wrong, but
|
|
|
|
|
# we can't do anything about it if we don't recalculate it on ev-
|
|
|
|
|
# ery category view.
|
|
|
|
|
# 2) The category table figure isn't sane, like it's smaller than the
|
|
|
|
|
# number of actual results, *but* the number of results is less
|
|
|
|
|
# than $this->limit and there's no offset. In this case we still
|
|
|
|
|
# know the right figure.
|
|
|
|
|
# 3) We have no idea.
|
|
|
|
|
$totalrescnt = count( $this->articles ) + count( $this->children ) +
|
2008-03-19 23:45:18 +00:00
|
|
|
($this->showGallery ? $this->gallery->count() : 0);
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
if($dbcnt == $rescnt || (($totalrescnt == $this->limit || $this->from
|
|
|
|
|
|| $this->until) && $dbcnt > $rescnt)){
|
|
|
|
|
# Case 1: seems sane.
|
|
|
|
|
$totalcnt = $dbcnt;
|
|
|
|
|
} elseif($totalrescnt < $this->limit && !$this->from && !$this->until){
|
|
|
|
|
# Case 2: not sane, but salvageable.
|
|
|
|
|
$totalcnt = $rescnt;
|
|
|
|
|
} else {
|
|
|
|
|
# Case 3: hopeless. Don't give a total count at all.
|
2008-03-20 02:01:55 +00:00
|
|
|
return wfMsgExt("category-$type-count-limited", 'parse',
|
|
|
|
|
$wgLang->formatNum( $rescnt ) );
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
}
|
2008-03-20 02:01:55 +00:00
|
|
|
return wfMsgExt( "category-$type-count", 'parse', $rescnt,
|
|
|
|
|
$wgLang->formatNum( $totalcnt ) );
|
This is a schema change. It's only a table creation, but the table must be created on Wikimedia servers before this revision goes live. The maintenance script populateCategory.php should be run when convenient. If it's not run, there's only one substantial case where display will be harmed: the page of a category with more than 200 net pages added since the patch goes live will give an erroneously low count. In other cases category pages will just be better-worded, and it will recognize the count in the table is bogus.
* Adds Category and CategoryList classes to represent categories themselves.
* Adds a category table, giving each category a name, ID, and counts of all members, subcats only, and files.
* Adds a maintenance script to populate the category table efficiently. This script is careful to wait for slaves and should be safe to run on a live database. The maintenance script's includes file is called by update.php.
* Until the category table is populated, the patch handles weird category table rows gracefully. It detects whether they're obviously impossible, and if so, it outputs appropriate messages.
2008-03-18 00:17:28 +00:00
|
|
|
}
|
2004-08-22 09:42:12 +00:00
|
|
|
}
|