summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/pagelist/helper.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/pagelist/helper.php')
-rw-r--r--platform/www/lib/plugins/pagelist/helper.php448
1 files changed, 448 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/pagelist/helper.php b/platform/www/lib/plugins/pagelist/helper.php
new file mode 100644
index 0000000..4ed425b
--- /dev/null
+++ b/platform/www/lib/plugins/pagelist/helper.php
@@ -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 = '&nbsp;';
+ $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: