Extension talk:Cumulus
Add topic- Categories are recovered by a sub-version of Extension:NiceCategoryList2 extension
- What does that mean? Is Extension:NiceCategoryList2 a requirement?
- No - you don't need to install that to get it working Turbo Dragon 12:32, 29 September 2009 (UTC)
- What does that mean? Is Extension:NiceCategoryList2 a requirement?
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)
- 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:
- 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)
[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)
<?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> ";
}
$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.
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)
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...