Extension:Hierachy of categories

From MediaWiki.org
Jump to: navigation, search
MediaWiki extensions manual - list
Crystal Clear action run.png
Hierachy of categories

Release status: experimental

Implementation Special page
Description Shows dynamically the category structure
License No license specified
Download #Source

Check usage (experimental)

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://www.mediawiki.org/wiki/Extension: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');
}
Personal tools
Namespaces

Variants
Actions
Navigation
Support
Download
Development
Communication
Print/export
Toolbox