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