summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/tag/action.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/tag/action.php')
-rw-r--r--platform/www/lib/plugins/tag/action.php138
1 files changed, 138 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/tag/action.php b/platform/www/lib/plugins/tag/action.php
new file mode 100644
index 0000000..d008628
--- /dev/null
+++ b/platform/www/lib/plugins/tag/action.php
@@ -0,0 +1,138 @@
+<?php
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+
+/**
+ * Action part of the tag plugin, handles tag display and index updates
+ */
+class action_plugin_tag extends DokuWiki_Action_Plugin {
+
+ /**
+ * register the eventhandlers
+ *
+ * @param Doku_Event_Handler $contr
+ */
+ function register(Doku_Event_Handler $contr) {
+ $contr->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, '_handle_act', array());
+ $contr->register_hook('TPL_ACT_UNKNOWN', 'BEFORE', $this, '_handle_tpl_act', array());
+ $contr->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, '_handle_keywords', array());
+ if($this->getConf('toolbar_icon')) $contr->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'insert_toolbar_button', array ());
+ $contr->register_hook('INDEXER_VERSION_GET', 'BEFORE', $this, '_indexer_version', array());
+ $contr->register_hook('INDEXER_PAGE_ADD', 'BEFORE', $this, '_indexer_index_tags', array());
+ }
+
+ /**
+ * Add a version string to the index so it is rebuilt
+ * whenever the stored data format changes.
+ */
+ function _indexer_version(Doku_Event $event, $param) {
+ global $conf;
+ $event->data['plugin_tag'] = '0.2.deaccent='.$conf['deaccent'];
+ }
+
+ /**
+ * Add all data of the subject metadata to the metadata index.
+ */
+ function _indexer_index_tags(Doku_Event $event, $param) {
+ /* @var helper_plugin_tag $helper */
+ if ($helper = $this->loadHelper('tag')) {
+ // make sure the tags are cleaned and no duplicate tags are added to the index
+ $tags = p_get_metadata($event->data['page'], 'subject');
+ if (!is_array($tags)) {
+ $event->data['metadata']['subject'] = array();
+ } else {
+ $event->data['metadata']['subject'] = $helper->_cleanTagList($tags);
+ }
+ }
+ }
+
+ /**
+ * catch tag action
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ */
+ function _handle_act(Doku_Event $event, $param) {
+ if($event->data != 'showtag') return;
+ $event->preventDefault();
+ }
+
+ /**
+ * Display the tag page
+ *
+ * @param Doku_Event $event The TPL_ACT_UNKNOWN event
+ * @param array $param optional parameters (unused)
+ */
+ function _handle_tpl_act(Doku_Event $event, $param) {
+ global $lang;
+
+ if($event->data != 'showtag') return;
+ $event->preventDefault();
+
+ $tagns = $this->getConf('namespace');
+ $flags = explode(',', str_replace(" ", "", $this->getConf('pagelist_flags')));
+
+ $tag = trim(str_replace($this->getConf('namespace').':', '', $_REQUEST['tag']));
+ $ns = trim($_REQUEST['ns']);
+
+ /* @var helper_plugin_tag $helper */
+ if ($helper = $this->loadHelper('tag')) $pages = $helper->getTopic($ns, '', $tag);
+
+ if(!empty($pages)) {
+
+ // let Pagelist Plugin do the work for us
+ if ((!$pagelist = $this->loadHelper('pagelist'))) {
+ return false;
+ }
+
+ /* @var helper_plugin_pagelist $pagelist */
+ $pagelist->setFlags($flags);
+ $pagelist->startList();
+ foreach ($pages as $page) {
+ $pagelist->addPage($page);
+ }
+
+ print '<h1>TAG: ' . hsc(str_replace('_', ' ', $_REQUEST['tag'])) . '</h1>' . DOKU_LF;
+ print '<div class="level1">' . DOKU_LF;
+ print $pagelist->finishList();
+ print '</div>' . DOKU_LF;
+
+ } else {
+ print '<div class="level1"><p>' . $lang['nothingfound'] . '</p></div>';
+ }
+ }
+
+ /**
+ * Inserts the tag toolbar button
+ */
+ function insert_toolbar_button(Doku_Event $event, $param) {
+ $event->data[] = array(
+ 'type' => 'format',
+ 'title' => $this->getLang('toolbar_icon'),
+ 'icon' => '../../plugins/tag/images/tag-toolbar.png',
+ 'open' => '{{tag>',
+ 'close' => '}}'
+ );
+ }
+
+ /**
+ * Prevent displaying underscores instead of blanks inside the page keywords
+ */
+ function _handle_keywords(Doku_Event $event) {
+ global $ID;
+
+ // Fetch tags for the page; stop proceeding when no tags specified
+ $tags = p_get_metadata($ID, 'subject', METADATA_DONT_RENDER);
+ if(is_null($tags)) true;
+
+ // Replace underscores with blanks
+ foreach($event->data['meta'] as &$meta) {
+ if($meta['name'] == 'keywords') {
+ $meta['content'] = str_replace('_', ' ', $meta['content']);
+ }
+ }
+ }
+}
+
+// vim:ts=4:sw=4:et: