Jump to content

Extension talk:Cumulus

Add topic
From mediawiki.org
Latest comment: 14 years ago by Kabanoff
  • Categories are recovered by a sub-version of Extension:NiceCategoryList2 extension

No flash error

[edit]
  • I followed the instructions on the page, but it doesn't seem to work for me: http://www.coreboot.org/User:Stepan -- the second cumulus tag on the page prints a message "This will be shown to users with no Flash or Javascript.", and the first one has an empty tag cloud. Any ideas?
    • It is because the SWFObject is now incompatible - if you use the swfobject.js from the wordpress package, then you should be Ok - it worked for me! Turbo Dragon 12:32, 29 September 2009 (UTC)Reply
      • No, sorry, no luck with any version of SWFObject. I don't think this is the problem. Meanwhile I can't get any output from the plugin at all anymore, but I do get this in the logs:
 [08-Apr-2010 23:27:16] PHP Warning:  Parameter 3 to CumulusWiki::hookCumulus() expected to be a reference, value given in /srv/www/vhosts/www.coreboot.org/includes/parser/Parser.php on line 3243
  • Ha, found it:
--- cumulus.php.orig    2010-04-08 23:12:49.000000000 +0200
+++ cumulus.php 2010-04-09 00:06:11.000000000 +0200
@@ -167,7 +167,7 @@
      *                 in $this->settings.
      *     $parser     Parser handle.
      */
-    public function hookCumulus($category, $argv, &$parser) {
+    public function hookCumulus( $category, $argv, $parser, $frame ) {
         // Get any user-specified parameters, and save them in $this->settings.
         $this->settings = array_merge($this->settings, $argv);

This fixes Cumulus for my MediaWiki version (1.15.3 by now). It does not fix the issue of several <cumulus> instances on the same page causing a a "No Flash" error, but that's not critical since I only used it for testing...

base

[edit]

You must replace Category:Base_Category by the top category of the tree

My version for no sub-category

[edit]

Hi - I had trouble with this in my wiki which has few categories. The main problem seemed to be that only sub-categories were being added, and that I don't have a main "root" category...

So I used the tagcloud extension code to make the extension show all of the categories. Also in the code are some filename fixes as the original assumed that /extension was a link to the extensions folder - this should probably use system-wide mw constants though... Turbo Dragon 13:47, 29 September 2009 (UTC)Reply

<?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.
        foreach ($argv as $key => $value)
            $this->settings[$key] = $value;

        $MIN_SIZE = 77;
        $INCREASE_FACTOR = 100;

        global $wgScript;
        $dbr = &wfGetDB(DB_SLAVE);
        extract($dbr->tableNames('categorylinks'));

        $cloud_style = @$params['style'];
        $cloud_classes = preg_split( '/\s+/', @$params['class'] );
        array_unshift( $cloud_classes, "tagcloud" );
        $link_style = $params['linkstyle'];
        $link_classes = preg_split( '/\s+/', @$params['linkclass'] );
        $min_count_input = getBoxExtensionOption($input, "min_count");
        $min_size_input = getBoxExtensionOption($input, "min_size");
        $increase_factor_input = getBoxExtensionOption($input, "increase_factor");
        if ($min_size_input != null) {
                $MIN_SIZE = $min_size_input;
        }
        if ($increase_factor_input != null) {
                $INCREASE_FACTOR = $increase_factor_input;
        }
        if ($min_count_input == null) {
                $min_count_input = 0;
        }

        $excluded_input = getBoxExtensionOption($input, "exclude");

        $exclude_condition = "";
        if (strlen($excluded_input) > 0) {
                $excluded_categories = explode(",", $excluded_input);
                if (count($excluded_categories) > 0) {
                        $exclude_condition = " WHERE cl_to NOT IN (";
                        for ($i = 0; $i < count($excluded_categories); $i++) {
                                $exclude_condition = $exclude_condition . "'" . trim($excluded_categories[$i]) . "'";
                                if ($i < count($excluded_categories) - 1) {
                                        $exclude_condition = $exclude_condition . ",";
                                }
                        }
                        $exclude_condition = $exclude_condition . ")";
                }
        }

        // Get the database handle, and get all the category links for
        // this category.
        $dbr =& wfGetDB(DB_SLAVE);

        $sql = "SELECT cl_to as title, COUNT(*) as count FROM $categorylinks  " . $exclude_condition . " GROUP BY cl_to HAVING count >= $min_count_input ORDER BY cl_to ASC";

        $res = $dbr->query($sql);
        $count = $dbr->numRows($res);

        $tagList = "";

        $min = 1000000;
        $max = -1;


        // find biggest and smallest categories
        for ($i = 0; $i < $count; $i++) {
                $obj = $dbr->fetchObject($res);
                $tags[$i][0] = $obj->title;
                $tags[$i][1] = $obj->count;
                if ($obj->count < $min) {
                        $min = $obj->count;
                }
                if ($obj->count > $max) {
                        $max = $obj->count;
                }
        }

        // Now - go through the categories and put them into the list

        for ($i = 0; $i < $count; $i++) {
                $textSize = $MIN_SIZE + ($INCREASE_FACTOR * ($tags[$i][1])) / ($max);
                $title = Title::makeTitle( NS_CATEGORY, $tags[$i][0] );

                //if( $style != '' && $style{-1} != ';' ) $style .= ';';
                //$style .= "font-size: {$textSize}%;";
                $style = $textSize/10;

                //$output .=  "<a href='" . $title->getLocalURL() . "' style='".$style."' color='".$this->settings['color']."' hicolor='".$this->settings['hicolor']."'>" . $title->getText() . "</a>";
                $output .=  "<a href='" . $title->getLocalURL() . "' style='".$style."' color='".$this->settings['color']."' hicolor='".$this->settings['hicolor']."'>" . $title->getText() . "</a>";

                //$currentRow = "<a class=\"" . implode( ' ', $link_classes ) . "\" style=\"{$style}\" href=\"" . $title->getLocalURL() . "\">" . $title->getText() . "</a>&nbsp; ";
        }

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




        <div id=\"flashcontent\"></div>

        <script type=\"text/javascript\">
                var so = new SWFObject(\"/mediawiki/extensions/cumulus/tagcloud.swf\", \"tagcloud\", \"250\", \"250\", \"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;
    }

}

Extension don't work properly

[edit]

It does not work properly for me, I have the same message: "This will be shown to users with no Flash or Javascript." (see pic.). I have read a manual, used various combinations of installation and the distribution kit, but it has not helped me.

Extension don't work properly

My version of system:

  • MediaWiki: 1.15.0
  • PHP: 5.2.8 (apache2handler)
  • MySQL: 5.1.30-community-log

Your extension is very useful, I'd like to use it in my wiki. Thanks. Kabanoff 13:34, 10 December 2009 (UTC)Reply

version of swfobjet

[edit]

API of swfobject changed with versions 2.0 and upper. You MUST use version 1.5 max to make this extension work, which can be found here [1]

JP Ayanidès, 11:15, 12 March 2010 (UTC)

still does not work.

It depends on your relative path

[edit]

On Ubuntu (10.04 server), I got the same problem. If you have the Alias /mediawiki /var/lib/mediawiki active in your /etc/mediawiki/apache.conf, you could change some lines in the cumulus.php, so that the extensions can be found. See the fragment in the example on this discussion page (section: #My version for no sub-category). Check the paths for swfobject.js and tagcloud.swf in this sample and compare it with yours:

        $output="
        <script type=\"text/javascript\" src=\"/mediawiki/extensions/cumulus/swfobject.js\"></script>
 
        <div id=\"flashcontent\"></div>
 
        <script type=\"text/javascript\">
                var so = new SWFObject(\"/mediawiki/extensions/cumulus/tagcloud.swf\", \"tagcloud\", \"250\", \"250\", \"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>



I hope it helps...