xref: /plugin/tagsections/helper.php (revision 93ba2e64c50cd7da246cfcf959d76080038d2907)
1<?php
2/**
3 * DokuWiki Plugin tagsections (Helper Component)
4 * Based up on the tagfilter helper component
5 *
6 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
7 * @author  lisps
8 */
9
10// must be run within Dokuwiki
11if (!defined('DOKU_INC')) die();
12
13if (!defined('DOKU_LF')) define('DOKU_LF', "\n");
14if (!defined('DOKU_TAB')) define('DOKU_TAB', "\t");
15
16require_once(DOKU_INC.'inc/indexer.php');
17
18class helper_plugin_tagsections extends DokuWiki_Plugin {
19
20	protected $Htag;
21
22    function __construct() {
23		if (plugin_isdisabled('tag') || (!$this->Htag = plugin_load('helper', 'tag'))) {
24			msg('tag plugin is required by tagsections plugin, but missing', -1);
25			return false;
26		}
27	}
28
29	function getMethods() {
30		$result = array();
31		$result[] = array(
32	                'name'   => 'getTagsByRegExp',
33	                'desc'   => 'returns tags for given Regular Expression',
34					'params' => array(
35			                    'tags (required)' => 'string',
36			                    'namespace (optional)' => 'string',),
37	                'return' => array('tags' => 'array'),
38		);
39		$result[] = array(
40	                'name'   => 'getTagsByNamespace',
41	                'desc'   => 'returns tags for given namespace',
42					'params' => array(
43			                    'namespace' => 'string',),
44	                'return' => array('tags' => 'array'),
45		);
46		$result[] = array(
47	                'name'   => 'getTagsBySiteID',
48	                'desc'   => 'returns tags for given siteID',
49					'params' => array(
50			                    'siteID' => 'string',),
51	                'return' => array('tags' => 'array'),
52		);
53
54		return $result;
55	}
56
57	/**
58     * Search index for tags using preg_match
59     * @param tags
60     * @param $ns
61     * return tags
62     */
63	function getTagsByRegExp($tag_expr = null, $ns = '',$acl_safe = false){
64		$Htag = $this->Htag;
65		if(!$Htag) return false;
66		$tags = array_map('trim', idx_getIndex('subject','_w'));
67		$tag_label_r = array();
68		foreach($tags  as  $tag){
69			if( (is_null($tag_expr) || @preg_match('/^'.$tag_expr.'$/i',$tag)) && $this->_checkTagInNamespace($tag,$ns,$acl_safe)){
70				//$label =stristr($tag,':');
71				$label = strrchr($tag,':');
72				$label = $label !=''?$label:$tag;
73				$tag_label_r[$tag] = ucwords(trim(str_replace('_',' ',trim($label,':'))));
74			}
75		}
76		asort($tag_label_r);
77		return $tag_label_r;
78	}
79
80	/*
81	 * Return all tags for a defined namespace
82	 * @param namespace
83	 * @param acl_safe
84	 * @return tags for namespace
85	 */
86	function getTagsByNamespace($ns = '',$acl_safe = true){
87        return array_keys($this->getTagsByRegExp(null, $ns, $acl_safe));
88	}
89
90	/*
91	 * Return all tags for a defined site
92	 * @param siteID
93	 * @return tags for site
94	 */
95	function getTagsBySiteID($siteID){
96		$meta = p_get_metadata($siteID,'subject');
97		if($meta === NULL) $meta=array();
98		return $meta;
99	}
100
101	function _tagCompare ($tag1,$tag2){
102		return $tag1==$tag2;
103	}
104	private function _checkTagInNamespace($tag,$ns,$acl_safe=true){
105		$Htag = $this->Htag;
106		if(!$Htag) return false;
107		if($ns == '') return true;
108		$indexer = idx_get_indexer();
109		$pages = $indexer->lookupKey('subject', $tag, array($this, '_tagCompare'));
110		foreach($page_r as $page){
111			if($Htag->_isVisible($page,$ns)) {
112				if (!$acl_safe) return true;
113				$perm = auth_quickaclcheck($page);
114				if (!$perm < AUTH_READ) {
115					return true;
116                }
117			}
118
119		}
120		return false;
121    }
122
123
124    /**
125     * Categorysize Tags by the first part before a ':'
126     * @param array $tags Array of tags
127     * <pre>
128     * array('category1:tag1','category1:tag2','category2:tag1','category2:tag2')
129     * </pre>
130     * @returns array multidimensional array
131     * <pre>
132     * [category1] => 'category1:tag1'
133     *             => 'category1:tag2'
134     * [category2] => 'category2:tag1'
135     *             => 'category2:tag2'
136     * </pre>
137     */
138    public function categorysizeTags($tags)
139    {
140        $catTags = array();
141        if ( empty($tags) ) return array();
142        foreach($tags as $nsTag){
143            list($category, $tag) = explode(':', $nsTag, 2);
144            if ( empty($tag) ) {
145                $tag = $category;
146                $category = '';
147            }
148
149            $catTags[$category][$tag]++;
150        }
151        ksort($catTags);
152        return $catTags;
153    }
154}
155