Extension:Cumulus

From MediaWiki.org
Jump to navigation Jump to search
MediaWiki extensions manualManual:Extensions
Crystal Clear action run.svg
Cumulus

Release status:Extension status beta

ImplementationTemplate:Extension#type Tag
DescriptionTemplate:Extension#description WP-Cumulus flash tag-cloud port to mediawiki
Author(s)Template:Extension#username Luc (Lebdtalk)
LicenseTemplate:Extension#license No license specified
Download see installation instruction

Translate the Cumulus extension if it is available at translatewiki.net

Check usage and version matrix.



What can this extension do?[edit]

This extension is ported from WP-Cumulus[1] . Categories are recovered by a sub-version of Extension:NiceCategoryList2 extension

Usage[edit]

<cumulus style="12" color="0x242424" hicolor="0x966600">Category:Base_Category</cumulus>



Installation[edit]

To install this extension, add the following to LocalSettings.php:

#add configuration parameters here
#setup user rights here
require_once("$IP/extensions/cumulus/cumulus.php");

You must have in the cumulus directory

  • swfobject.js [2]
  • tagcloud.swf [3]
  • cumulus.php (see below)

Code : cumulus.php[edit]

<?php
 

 
if (!defined('MEDIAWIKI')) die();
 
$wgExtensionFunctions[] = 'wfCumulusWiki';
$wgExtensionCredits['parserhook'][] = array(
  'name' =>        'CumulusWiki',
  'author' =>      'Luc',
  'url' =>         'http://www.mediawiki.org/w/index.php?title=Extension:Cumulus',
  'description' => 'WP-Cumulus Port to mediawiki',
);
 
 
/*
 * Sets a parser hook for <cumulus></cumulus>.
 */
function wfCumulusWiki() {
    new CumulusWiki();
}
 
 
/*
 * Simple class to hold category's title, links list,
 * and categories list., taken from NiceCategoryList extension
 */
class CumulusWiki_Links {
 
    private $title;
    private $articles = array();
    private $categories = array();
    private $subcats = array();
 
    public function __construct($title) {
        $this->title = $title;
    }
 
 
    public function addCategory($title, $links) {
        $this->subcats[] = $title;
        if ($links)
                $this->categories[] = $links;
    }
 
 
    public function addArticle($title) {
        $this->articles[] = $title;
    }
 
 
    /*
     * Get the title of this category.
     */
    public function getTitle() {
        return $this->title;
    }
 
 
    /*
     * Get the titles of the sub-categories of this category.
     */
    public function getCatTitles() {
        return $this->subcats;
    }
 
 
    /*
     * Get the titles of the articles in this category.
     */
    public function getArtTitles() {
        return $this->articles;
    }
 
 
    /*
     * Get the link records of the sub-categories of this category,
     * if we have them.
     * Returns an array of CumulusWiki_Links objects.
     */
    public function getCategories() {
        return $this->categories;
    }
 
 
    /*
     * Return true iff we have link records for the sub-categories
     * of this category.
     */
    public function hasCatLinks() {
        return count($this->categories) > 0;
    }
 
 
    /*
     * Title comparison function
     */
    private function titleCmp($a, $b) {
        return $a->getText() > $b->getText();
    }
 
    /*
     * CumulusWiki_Links comparison function
     */
    private function categoryCmp($a, $b) {
        return self::titleCmp($a->title, $b->title);
    }
 
    /*
     * Sort links and categories alphabetically.
     */
    public function sort() {
        usort($this->articles, array(&$this, "titleCmp"));
        usort($this->categories, array(&$this, "categoryCmp"));
    }
 
}
 
 
class CumulusWiki {
 
    ////////////////////////////////////////////////////////////////////////
    // Configuration
    ////////////////////////////////////////////////////////////////////////
 
    /*
     * Default settings for the category list.
     */
    private $settings = array(
        'maxdepth'  => 32,           // Sanity stop level.
        'style'     => 12,     // No du style WP-Cumulus
        'showcats'  => 1,            // Non-0 to display sub-cat links in a category.
        'showarts'  => 1,            // Non-0 to display article links in a category.
        'headings'  => 'head',       // Show category headings as headings.
        'headstart' => 1,            // Heading level to start at.
        'sort'      => 0,            // Non-0 to sort the list alphabetically;
		'color'		=>'0x242424',
		'hicolor'	=>'0x996600'
		
                                    
    );
 
 
    ////////////////////////////////////////////////////////////////////////
    // Constructor
    ////////////////////////////////////////////////////////////////////////
 
    /*
     * Setup Nice Category List extension.
     * Sets a parser hook for <ncl></ncl>.
     */
    public function __construct() {
            global $wgParser;
            $wgParser->setHook('cumulus', array(&$this, 'hookCumulus'));
    }
 
 
    ////////////////////////////////////////////////////////////////////////
    // Hook
    ////////////////////////////////////////////////////////////////////////
 
    /*
     * The hook function.  Handles <ncl></ncl>.
     *     $category   The tag's text content 
     *                 this is the name of the category we want to index.
     *     $argv       List of tag parameters; these can be any of the settings
     *                 in $this->settings.
     *     $parser     Parser handle.
     */
    public function hookCumulus($category, $argv, &$parser) {
        // Get any user-specified parameters, and save them in $this->settings.
        $this->settings = array_merge($this->settings, $argv);
 
      
        $localParser = new Parser();
	$category = $localParser->preprocess($category, $parser->mTitle, $parser->mOptions, false);
 
        // Make a Title objhect for the requested category.
	$title = Title::newFromText($category);
        if (!$title)
                return '<p>Failed to create title!</p>';
 
        // Get the database handle, and get all the category links for
        // this category.
        $dbr =& wfGetDB(DB_SLAVE);
        $catData = $this->searchCategory($dbr, $title, 0);
 
        // Generate the category listing.
        $output = $this->outputCategory($catData);
 
        

 $output="
	<script type=\"text/javascript\" src=\"/extensions/cumulus/swfobject.js\"></script>




	<div id=\"flashcontent\">This will be shown to users with no Flash or Javascript.</div>

	<script type=\"text/javascript\">
		var so = new SWFObject(\"/extensions/cumulus/tagcloud.swf\", \"tagcloud\", \"600\", \"400\", \"7\", \"#ffffff\");
		// uncomment next line to enable transparency
		so.addParam(\"wmode\", \"transparent\");
		so.addVariable(\"tcolor\", \"0x333333\");
		so.addVariable(\"mode\", \"tags\");
		so.addVariable(\"distr\", \"true\");
		so.addVariable(\"tspeed\", \"100\");
		so.addVariable(\"tagcloud\", \"<tags>$output</tags>\");
		so.write(\"flashcontent\");
	</script>



";
 
      
        $localParser = new Parser();
       
        return $output;
    }
 
 
    ////////////////////////////////////////////////////////////////////////
    // Database Access
    ////////////////////////////////////////////////////////////////////////
 
    /*
     * Get all of the direct and indirect members of a given category: ie.
     * all of the articles and categories which belong to that category
     * and its children.
     *     $dbr        The database handle
     *     $catTitle   The Title object for the category to search
     *     $depth      Our current recursion depth: starts at 0
     *     $processed  List of categories that have been searched to date
     *                 (to prevent looping)
     *
     * Returns null if this category has already been searched; otherwise,
     * a CumulusWiki_Links object for the given category, containing all
     * the sub-categories and member articles.
     */
    private function searchCategory($dbr, $catTitle, $depth, $processed = array()) {
        // Avoid endless recursion by making sure we haven't been here before.
        if (in_array($catTitle->getText(), $processed))
            return null;
        $processed[] = $catTitle->getText();
 
        // Get all of the category links for this category.
        $links = $this->getCategoryLinks($dbr, $catTitle);
 
        // Build a list of items which belong to this category.
        $cl = new CumulusWiki_Links($catTitle);
        foreach ($links as $l) {
                // Make a Title for this item.
            $title = Title::makeTitle($l->page_namespace, $l->page_title);
 
            if ($title->getNamespace() == NS_CATEGORY) {
                // This item is itself a category: recurse to find all its
                // links, unless we've hit maxdepth.
                $subLinks = null;
                if ($depth + 1 < $this->settings['maxdepth'])
                    $subLinks = $this->searchCategory($dbr, $title,
                                                      $depth + 1, $processed);
 
                // Record the subcategory name, and its links if we got any.
                $cl->addCategory($title, $subLinks);
            } else {
                // This is a regular page; just add it to the list.
                $cl->addArticle($title);
            }
        }
 
        // Sort the item lists, if requested.  (Thanks, Jej.)
        //if ($this->settings['sort'])
          //  $cl->sort();
 
        return $cl;
    }
 
 
    /*
     * Get all of the direct members of a given category.
     *     $dbr        The database handle
     *     $title      The Title object for the category to search
     *
     * Returns an array of objects, each representing one member of the named
     * caregory.  Each object contains the following fields from the database:
     *      page_title
     *      page_namespace
     *      cl_sortkey
     */
    private function getCategoryLinks($dbr, $title) {
            // Query the database.
        $res = $dbr->select(
            array('page', 'categorylinks'),
            array('page_title', 'page_namespace', 'cl_sortkey'),
            array('cl_from = page_id', 'cl_to' => $title->getDBKey()),
            '',
            array('ORDER BY' => 'cl_sortkey')
        );
        if ($res === false)
                return array();
 
        // Convert the results list into an array.
        $list = array();
        while ($x = $dbr->fetchObject($res))
                $list[] = $x;
 
        // Free the results.
        $dbr->freeResult($res);
 
        return $list;
    }
 
 
    ////////////////////////////////////////////////////////////////////////
    // Output
    ////////////////////////////////////////////////////////////////////////
 
    /*
     * Generate output for the list.
     */
    function outputCategory($category, $level = 0) {
        global $wgContLang;
 
        $output = '';
 
        // The second level and onwards has a heading.
        // The heading gets smaller as the level grows.
        if ($level > 0) {
            $title = $category->getTitle();
            $ptitle = $title->getPrefixedText();
            $title = $wgContLang->convert($title->getText());
            $link = "[[:" . $ptitle . "|'''" . $title . "''']]";

        
               $output .=  "<a href='http://".$_SERVER['SERVER_NAME']."/index.php?title=Category:$title' style='".$this->settings['style']."' color='".$this->settings['color']."' hicolor='".$this->settings['hicolor']."'>$title</a>";
          
        }
 
        
        
 
        // Recurse into each subcategory.
        $subCategories = $category->getCategories();
        foreach ($subCategories as $cat)
			{
			$cttemp=$this->outputCategory($cat, $level + 1);
            $output .= $this->outputCategory($cat, $level + 1);
			
			}

	
        return $output;
    }
 
}

See also[edit]

Demonstration[edit]

Demo