Hierachy of categories

From Meta, a Wikimedia project coordination wiki

Jump to: navigation, search


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');
}