add contents
This commit is contained in:
448
lib/plugins/pagelist/helper.php
Normal file
448
lib/plugins/pagelist/helper.php
Normal file
@@ -0,0 +1,448 @@
|
||||
<?php
|
||||
/**
|
||||
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
|
||||
* @author Esther Brunner <wikidesign@gmail.com>
|
||||
* @author Gina Häußge <osd@foosel.net>
|
||||
*/
|
||||
|
||||
class helper_plugin_pagelist extends DokuWiki_Plugin {
|
||||
|
||||
/* public */
|
||||
|
||||
var $page = NULL; // associative array for page to list
|
||||
// must contain a value to key 'id'
|
||||
// can contain: 'title', 'date', 'user', 'desc', 'comments',
|
||||
// 'tags', 'status' and 'priority'
|
||||
|
||||
var $style = ''; // table style: 'default', 'table', 'list'
|
||||
var $showheader = false; // show a heading line
|
||||
var $column = array(); // which columns to show
|
||||
var $header = array(); // language strings for table headers
|
||||
var $sort = false; // alphabetical sort of pages by pagename
|
||||
var $rsort = false; // reverse alphabetical sort of pages by pagename
|
||||
|
||||
var $plugins = array(); // array of plugins to extend the pagelist
|
||||
var $discussion = NULL; // discussion class object
|
||||
var $tag = NULL; // tag class object
|
||||
|
||||
var $doc = ''; // the final output XHTML string
|
||||
|
||||
/* private */
|
||||
|
||||
var $_meta = NULL; // metadata array for page
|
||||
|
||||
/**
|
||||
* Constructor gets default preferences
|
||||
*
|
||||
* These can be overriden by plugins using this class
|
||||
*/
|
||||
function __construct() {
|
||||
$this->style = $this->getConf('style');
|
||||
$this->showheader = $this->getConf('showheader');
|
||||
$this->showfirsthl = $this->getConf('showfirsthl');
|
||||
$this->sort = $this->getConf('sort');
|
||||
$this->rsort = $this->getConf('rsort');
|
||||
|
||||
$this->column = array(
|
||||
'page' => true,
|
||||
'date' => $this->getConf('showdate'),
|
||||
'user' => $this->getConf('showuser'),
|
||||
'desc' => $this->getConf('showdesc'),
|
||||
'comments' => $this->getConf('showcomments'),
|
||||
'linkbacks'=> $this->getConf('showlinkbacks'),
|
||||
'tags' => $this->getConf('showtags'),
|
||||
'image' => $this->getConf('showimage'),
|
||||
'diff' => $this->getConf('showdiff'),
|
||||
);
|
||||
|
||||
$this->plugins = array(
|
||||
'discussion' => 'comments',
|
||||
'linkback' => 'linkbacks',
|
||||
'tag' => 'tags',
|
||||
'pageimage' => 'image',
|
||||
);
|
||||
}
|
||||
|
||||
function getMethods() {
|
||||
$result = array();
|
||||
$result[] = array(
|
||||
'name' => 'addColumn',
|
||||
'desc' => 'adds an extra column for plugin data',
|
||||
'params' => array(
|
||||
'plugin name' => 'string',
|
||||
'column key' => 'string'),
|
||||
);
|
||||
$result[] = array(
|
||||
'name' => 'setFlags',
|
||||
'desc' => 'overrides standard values for showfooter and firstseconly settings',
|
||||
'params' => array('flags' => 'array'),
|
||||
'return' => array('success' => 'boolean'),
|
||||
);
|
||||
$result[] = array(
|
||||
'name' => 'startList',
|
||||
'desc' => 'prepares the table header for the page list',
|
||||
);
|
||||
$result[] = array(
|
||||
'name' => 'addPage',
|
||||
'desc' => 'adds a page to the list',
|
||||
'params' => array("page attributes, 'id' required, others optional" => 'array'),
|
||||
);
|
||||
$result[] = array(
|
||||
'name' => 'finishList',
|
||||
'desc' => 'returns the XHTML output',
|
||||
'return' => array('xhtml' => 'string'),
|
||||
);
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an extra column for plugins
|
||||
*/
|
||||
function addColumn($plugin, $col) {
|
||||
$this->plugins[$plugin] = $col;
|
||||
$this->column[$col] = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Overrides standard values for style, showheader and show(column) settings
|
||||
*/
|
||||
function setFlags($flags) {
|
||||
if (!is_array($flags)) return false;
|
||||
|
||||
$columns = array('date', 'user', 'desc', 'comments', 'linkbacks', 'tags', 'image', 'diff');
|
||||
foreach ($flags as $flag) {
|
||||
switch ($flag) {
|
||||
case 'default':
|
||||
$this->style = 'default';
|
||||
break;
|
||||
case 'table':
|
||||
$this->style = 'table';
|
||||
break;
|
||||
case 'list':
|
||||
$this->style = 'list';
|
||||
break;
|
||||
case 'simplelist':
|
||||
$this->style = 'simplelist'; // Displays pagenames only, no other information
|
||||
break;
|
||||
case 'header':
|
||||
$this->showheader = true;
|
||||
break;
|
||||
case 'noheader':
|
||||
$this->showheader = false;
|
||||
break;
|
||||
case 'firsthl':
|
||||
$this->showfirsthl = true;
|
||||
break;
|
||||
case 'nofirsthl':
|
||||
$this->showfirsthl = false;
|
||||
break;
|
||||
case 'sort':
|
||||
$this->sort = true;
|
||||
$this->rsort = false;
|
||||
break;
|
||||
case 'rsort':
|
||||
$this->sort = false;
|
||||
$this->rsort = true;
|
||||
break;
|
||||
case 'nosort':
|
||||
$this->sort = false;
|
||||
$this->rsort = false;
|
||||
break;
|
||||
case 'showdiff':
|
||||
$flag = 'diff';
|
||||
break;
|
||||
}
|
||||
|
||||
if (substr($flag, 0, 2) == 'no') {
|
||||
$value = false;
|
||||
$flag = substr($flag, 2);
|
||||
} else {
|
||||
$value = true;
|
||||
}
|
||||
|
||||
if (in_array($flag, $columns)) $this->column[$flag] = $value;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the list header
|
||||
*/
|
||||
function startList($callerClass=NULL) {
|
||||
|
||||
// table style
|
||||
switch ($this->style) {
|
||||
case 'table':
|
||||
$class = 'inline';
|
||||
break;
|
||||
case 'list':
|
||||
$class = 'ul';
|
||||
break;
|
||||
case 'simplelist':
|
||||
$class = false;
|
||||
break;
|
||||
default:
|
||||
$class = 'pagelist';
|
||||
}
|
||||
|
||||
if($class) {
|
||||
if ($callerClass) {
|
||||
$class .= ' '.$callerClass;
|
||||
}
|
||||
$this->doc = '<div class="table">'.DOKU_LF.'<table class="'.$class.'">'.DOKU_LF;
|
||||
} else {
|
||||
// Simplelist is enabled; Skip header and firsthl
|
||||
$this->showheader = false;
|
||||
$this->showfirsthl = false;
|
||||
//$this->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF;
|
||||
$this->doc = '<ul>';
|
||||
}
|
||||
|
||||
$this->page = NULL;
|
||||
|
||||
// check if some plugins are available - if yes, load them!
|
||||
foreach ($this->plugins as $plug => $col) {
|
||||
if (!$this->column[$col]) continue;
|
||||
if (plugin_isdisabled($plug) || (!$this->$plug = plugin_load('helper', $plug)))
|
||||
$this->column[$col] = false;
|
||||
}
|
||||
|
||||
// header row
|
||||
if ($this->showheader) {
|
||||
$this->doc .= DOKU_TAB.'<tr>'.DOKU_LF.DOKU_TAB.DOKU_TAB;
|
||||
$columns = array('page', 'date', 'user', 'desc', 'diff');
|
||||
if ($this->column['image']) {
|
||||
if (!$this->header['image']) $this->header['image'] = hsc($this->pageimage->th());
|
||||
$this->doc .= '<th class="images">'.$this->header['image'].'</th>';
|
||||
}
|
||||
foreach ($columns as $col) {
|
||||
if ($this->column[$col]) {
|
||||
if (!$this->header[$col]) $this->header[$col] = hsc($this->getLang($col));
|
||||
$this->doc .= '<th class="'.$col.'">'.$this->header[$col].'</th>';
|
||||
}
|
||||
}
|
||||
foreach ($this->plugins as $plug => $col) {
|
||||
if ($this->column[$col] && $col != 'image') {
|
||||
if (!$this->header[$col]) $this->header[$col] = hsc($this->$plug->th());
|
||||
$this->doc .= '<th class="'.$col.'">'.$this->header[$col].'</th>';
|
||||
}
|
||||
}
|
||||
$this->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a list row
|
||||
*/
|
||||
function addPage($page) {
|
||||
|
||||
$id = $page['id'];
|
||||
if (!$id) return false;
|
||||
$this->page = $page;
|
||||
$this->_meta = NULL;
|
||||
|
||||
if($this->style != 'simplelist') {
|
||||
// priority and draft
|
||||
if (!isset($this->page['draft'])) {
|
||||
$this->page['draft'] = ($this->_getMeta('type') == 'draft');
|
||||
}
|
||||
$class = '';
|
||||
if (isset($this->page['priority'])) $class .= 'priority'.$this->page['priority']. ' ';
|
||||
if ($this->page['draft']) $class .= 'draft ';
|
||||
if ($this->page['class']) $class .= $this->page['class'];
|
||||
if(!empty($class)) $class = ' class="' . $class . '"';
|
||||
|
||||
$this->doc .= DOKU_TAB.'<tr'.$class.'>'.DOKU_LF;
|
||||
if ($this->column['image']) $this->_pluginCell('pageimage','image',$id);
|
||||
$this->_pageCell($id);
|
||||
if ($this->column['date']) $this->_dateCell();
|
||||
if ($this->column['user']) $this->_userCell();
|
||||
if ($this->column['desc']) $this->_descCell();
|
||||
if ($this->column['diff']) $this->_diffCell($id);
|
||||
foreach ($this->plugins as $plug => $col) {
|
||||
if ($this->column[$col] && $col != 'image') $this->_pluginCell($plug, $col, $id);
|
||||
}
|
||||
|
||||
$this->doc .= DOKU_TAB.'</tr>'.DOKU_LF;
|
||||
} else {
|
||||
$class = '';
|
||||
// simplelist is enabled; just output pagename
|
||||
$this->doc .= DOKU_TAB . '<li>' . DOKU_LF;
|
||||
if(page_exists($id)) $class = 'wikilink1';
|
||||
else $class = 'wikilink2';
|
||||
|
||||
if (!$this->page['title']) $this->page['title'] = str_replace('_', ' ', noNS($id));
|
||||
$title = hsc($this->page['title']);
|
||||
|
||||
$content = '<a href="'.wl($id).'" class="'.$class.'" title="'.$id.'">'.$title.'</a>';
|
||||
$this->doc .= $content;
|
||||
$this->doc .= DOKU_TAB . '</li>' . DOKU_LF;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the list footer
|
||||
*/
|
||||
function finishList() {
|
||||
if($this->style != 'simplelist') {
|
||||
if (!isset($this->page)) $this->doc = '';
|
||||
else $this->doc .= '</table>'.DOKU_LF.'</div>'.DOKU_LF;
|
||||
} else {
|
||||
$this->doc .= '</ul>' . DOKU_LF;
|
||||
}
|
||||
|
||||
// reset defaults
|
||||
$this->__construct();
|
||||
|
||||
return $this->doc;
|
||||
}
|
||||
|
||||
/* ---------- Private Methods ---------- */
|
||||
|
||||
/**
|
||||
* Page title / link to page
|
||||
*/
|
||||
function _pageCell($id) {
|
||||
|
||||
// check for page existence
|
||||
if (!isset($this->page['exists'])) {
|
||||
if (!isset($this->page['file'])) $this->page['file'] = wikiFN($id);
|
||||
$this->page['exists'] = @file_exists($this->page['file']);
|
||||
}
|
||||
if ($this->page['exists']) $class = 'wikilink1';
|
||||
else $class = 'wikilink2';
|
||||
|
||||
// handle image and text titles
|
||||
if ($this->page['titleimage']) {
|
||||
$title = '<img src="'.ml($this->page['titleimage']).'" class="media"';
|
||||
if ($this->page['title']) $title .= ' title="'.hsc($this->page['title']).'"'.
|
||||
' alt="'.hsc($this->page['title']).'"';
|
||||
$title .= ' />';
|
||||
} else {
|
||||
if($this->showfirsthl) {
|
||||
$this->page['title'] = $this->_getMeta('title');
|
||||
} else {
|
||||
$this->page['title'] = $id;
|
||||
}
|
||||
|
||||
if (!$this->page['title']) $this->page['title'] = str_replace('_', ' ', noNS($id));
|
||||
$title = hsc($this->page['title']);
|
||||
}
|
||||
|
||||
// produce output
|
||||
$content = '<a href="'.wl($id).($this->page['section'] ? '#'.$this->page['section'] : '').
|
||||
'" class="'.$class.'" title="'.$id.'">'.$title.'</a>';
|
||||
if ($this->style == 'list') $content = '<ul><li>'.$content.'</li></ul>';
|
||||
return $this->_printCell('page', $content);
|
||||
}
|
||||
|
||||
/**
|
||||
* Date - creation or last modification date if not set otherwise
|
||||
*/
|
||||
function _dateCell() {
|
||||
global $conf;
|
||||
|
||||
if($this->column['date'] == 2) {
|
||||
$this->page['date'] = $this->_getMeta(array('date', 'modified'));
|
||||
} elseif(!$this->page['date'] && $this->page['exists']) {
|
||||
$this->page['date'] = $this->_getMeta(array('date', 'created'));
|
||||
}
|
||||
|
||||
if ((!$this->page['date']) || (!$this->page['exists'])) {
|
||||
return $this->_printCell('date', '');
|
||||
} else {
|
||||
return $this->_printCell('date', dformat($this->page['date'], $conf['dformat']));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* User - page creator or contributors if not set otherwise
|
||||
*/
|
||||
function _userCell() {
|
||||
if (!array_key_exists('user', $this->page)) {
|
||||
if ($this->column['user'] == 2) {
|
||||
$users = $this->_getMeta('contributor');
|
||||
if (is_array($users)) $this->page['user'] = join(', ', $users);
|
||||
} else {
|
||||
$this->page['user'] = $this->_getMeta('creator');
|
||||
}
|
||||
}
|
||||
return $this->_printCell('user', hsc($this->page['user']));
|
||||
}
|
||||
|
||||
/**
|
||||
* Description - (truncated) auto abstract if not set otherwise
|
||||
*/
|
||||
function _descCell() {
|
||||
if (array_key_exists('desc', $this->page)) {
|
||||
$desc = $this->page['desc'];
|
||||
} elseif (strlen($this->page['description']) > 0) {
|
||||
// This condition will become true, when a page-description is given
|
||||
// inside the syntax-block
|
||||
$desc = $this->page['description'];
|
||||
} else {
|
||||
$desc = $this->_getMeta(array('description', 'abstract'));
|
||||
}
|
||||
|
||||
$max = $this->column['desc'];
|
||||
if (($max > 1) && (utf8_strlen($desc) > $max)) $desc = utf8_substr($desc, 0, $max).'…';
|
||||
return $this->_printCell('desc', hsc($desc));
|
||||
}
|
||||
|
||||
/**
|
||||
* Diff icon / link to diff page
|
||||
*/
|
||||
function _diffCell($id) {
|
||||
// check for page existence
|
||||
if (!isset($this->page['exists'])) {
|
||||
if (!isset($this->page['file'])) $this->page['file'] = wikiFN($id);
|
||||
$this->page['exists'] = @file_exists($this->page['file']);
|
||||
}
|
||||
|
||||
// produce output
|
||||
$url_params = array();
|
||||
$url_params ['do'] = 'diff';
|
||||
$content = '<a href="'.wl($id, $url_params).($this->page['section'] ? '#'.$this->page['section'] : '').'" class="diff_link">
|
||||
<img src="/lib/images/diff.png" width="15" height="11" title="'.hsc($this->getLang('diff_title')).'" alt="'.hsc($this->getLang('diff_alt')).'"/>
|
||||
</a>';
|
||||
return $this->_printCell('page', $content);
|
||||
}
|
||||
|
||||
/**
|
||||
* Plugins - respective plugins must be installed!
|
||||
*/
|
||||
function _pluginCell($plug, $col, $id) {
|
||||
if (!isset($this->page[$col])) $this->page[$col] = $this->$plug->td($id);
|
||||
return $this->_printCell($col, $this->page[$col]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Produce XHTML cell output
|
||||
*/
|
||||
function _printCell($class, $content) {
|
||||
if (!$content) {
|
||||
$content = ' ';
|
||||
$empty = true;
|
||||
} else {
|
||||
$empty = false;
|
||||
}
|
||||
$this->doc .= DOKU_TAB.DOKU_TAB.'<td class="'.$class.'">'.$content.'</td>'.DOKU_LF;
|
||||
return (!$empty);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get default value for an unset element
|
||||
*/
|
||||
function _getMeta($key) {
|
||||
if (!$this->page['exists']) return false;
|
||||
if (!isset($this->_meta)) $this->_meta = p_get_metadata($this->page['id'], '', METADATA_RENDER_USING_CACHE);
|
||||
if (is_array($key)) return $this->_meta[$key[0]][$key[1]];
|
||||
else return $this->_meta[$key];
|
||||
}
|
||||
|
||||
}
|
||||
// vim:ts=4:sw=4:et:
|
Reference in New Issue
Block a user