Hierachy of categories
From Meta, a Wikimedia project coordination wiki
This extension gives an overview about the root, currently 4 levels of sub and the incorrectly (cycles creating) categorized items. In addition the number of associated pages are given.
[edit] Source
copy the following to extensions/Hierachy.php and extensions/SpecialHOC.php respectively
moreover, add the following to lines to your LocalSettings.php:
require_once("extensions/SpecialHOC.php"); include("extensions/Hierachy.php");
[edit] Hierachy.php
<?php
/*
* @author Christoph Sawade
* @date 20.12.2006
*/
// no error reporting
error_reporting( 0 );
class Hierachy {
var $db;
function __construct() {
$db = &wfGetDB(DB_SLAVE);
}
function getNumberOfSubpages( $category ) {
$query = 'SELECT count(*) FROM categorylinks WHERE cl_to = "' . $category . '"';
$result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n");
while ($row = mysql_fetch_array($result))
$res[] = $row[0];
return $res[0];
}
function getCategories() {
$query = 'SELECT DISTINCT cl_to FROM categorylinks;';
$result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n");
while ($row = mysql_fetch_array($result))
$res[] = $row[0];
return $res;
}
function getSubCategories( $category ) {
// namespace 14 = category
$query = 'SELECT page_title FROM categorylinks JOIN page on cl_from = page_id WHERE page_namespace=14 AND cl_to = "' . $category . '"';
$result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n");
while ($row = mysql_fetch_array($result)) {
$res[] = $row[0];
}
return $res;
}
function getAllSubCategories() {
// namespace 14 = category
$query = 'SELECT page_title FROM categorylinks JOIN page on cl_from = page_id WHERE page_namespace=14';
$result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n");
while ($row = mysql_fetch_array($result)) {
$res[] = $row[0];
}
return $res;
}
function getParentCategories( $category ) {
// namespace 14 = category
$query = 'SELECT cl_to FROM categorylinks JOIN page on cl_from = page_id WHERE page_namespace=14 AND page_title = "' . $category . '"';
$result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n");
while ($row = mysql_fetch_array($result)) {
$res[] = $row[0];
}
return $res;
}
function getAllParentCategories() {
// namespace 14 = category
$query = 'SELECT cl_to FROM categorylinks JOIN page on cl_from = page_id WHERE page_namespace=14';
$result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n");
while ($row = mysql_fetch_array($result)) {
$res[] = $row[0];
}
return $res;
}
function getRootCategories() {
return array_diff($this->getCategories(), $this->getAllSubCategories());
}
}
[edit] SpecialHOC.php
<?php
/*
* @author Christoph Sawade
*/
/* Log:
*
* 04.01.2007 1.0.2
* - remove underscores
* - extend credit
*
* 26.12.2006 1.0.1
* - recursive category building
* - memorize items with higer level (avoid cycles), mark wrong categorized items
* - legend
*
* 20.12.2006 1.0.0
* - first version
*/
if (!defined('MEDIAWIKI')) die();
$wgExtensionFunctions[] = "HOC";
$wgExtensionCredits['specialpage'][] = array(
'name' => 'Hierachy of Categories',
'description' => 'shows dynamically the category structure',
'url' => 'http://meta.wikimedia.org/wiki/Hierachy_of_categories',
'author' => 'Christoph Sawade',
'version' => '1.0.1'
);
function HOC() {
global $IP, $wgMessageCache;
require_once( "$IP/includes/SpecialPage.php" );
require_once( "Hierachy.php" );
class HOC extends SpecialPage {
function HOC() {
SpecialPage::SpecialPage( 'HOC' );
$this->includable( true );
}
function execute() {
global $wgOut, $wgRequest, $wgUser;
$color = array("-1" => "#FF0000", "#7777FF", "#55AA55", "#77CC77","#BBFFBB", "#FFFFFF");
$coldef = array("-1" => "incorrectly categorized",
"Root Category",
"Subcategory Level 1",
"Subcategory Level 2",
"Subcategory Level 3",
"Subcategory Level 4");
$this->setHeaders();
$wgOut->setPagetitle('Hierachy of Categories');
$out = $question;
$Hrch = new Hierachy();
$root = $Hrch->getRootCategories();
// categories
$out .= '<table border = "0"><tr align="left">';
// rootcategories
foreach ($root as $item) {
$subcat[$item] = $this->getList($item, 0);
$out .= $this->getBoxText($item, $color[0], $subcat[$item][0][article], $subcat[$item][0][subcategories]);
}
$out .= '</tr>';
// subcategories
$change = true;
$i = 0;
while ($change) {
$i++;
$change = false;
$out .= '<tr align="left">';
foreach($root as $r) {
$item = $subcat[$r][$i];
if (isset($item)) {
$change = true;
$out .= $this->getBoxText($item[name], $color[$item[level]], $item[article],$item[subcategories]);
} else $out .= '<td width="10%" />';
}
$out .= '</tr>';
}
$out .= '</table>';
// legend
$out .= '<table border="0">';
foreach ($color as $key => $c)
$out .= '<tr align="left"><td width = "20px" height = "20px" bgcolor="'.$c.'"></td>
<td>' . $coldef[$key] . '</td></tr>';
$out .= '</table>';
$wgOut->addHTML($out);
}
function getBoxText($cat, $color, $art, $subcat) {
$info = '<th width="10%" bgcolor="' . $color . '"><a href="/w/Category:' . $cat . '" style="color: #000000;">' . str_replace('_', ' ', $cat) . '</a><font size="-5">';
if ($art != -1)
$info .= '<br />Articles: ' . $art;
if ($subcat != -1)
$info .= '<br />Subcategories: ' . $subcat;
return $info . '</font></th>';
}
function getList($cat, $level, $err = array()) {
$Hrch = new Hierachy();
$sc = $Hrch->getSubCategories($cat);
$list[] = array("name" => $cat, "level" => $level, "article" => $Hrch->getNumberOfSubpages($cat) - count($sc), "subcategories" => count($sc));
foreach ($sc as $item) {
if (in_array($item, $err))
$list[] = array("name" => $item, "level" => "-1", "article" => -1, "subcategories" => -1);
else $list = array_merge($list, $this->getList($item, $level + 1, array_merge($err, array($item))));
}
return $list;
}
}
SpecialPage::addPage( new HOC );
$wgMessageCache->addMessage('hoc' ,'Hierachy of Categories');
}

