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