1 <?php
2 /**
3  * DokuWiki Template Masa Functions
4  *
5  * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
6  * @author  Michael Klier <chi@chimeric.de>, Kirill Bezrukov <kirbez@mail.ru>
7  */
8 
9 if(!defined('DOKU_LF')) define('DOKU_LF',"\n");
10 
11 // load sidebar contents
12 $sbl   = explode(',',tpl_getConf('left_sidebar_content'));
13 $sbpos = tpl_getConf('sidebar');
14 
15 // set notoc option and toolbar regarding the sitebar setup
16 $notoc = (in_array('toc',$sbl)) ? true : false;
17 $toolb = (in_array('toolbox',$sbl)) ? true : false;
18 
19 /**
20  * Prints the action menu
21  *
22  * @author Kirill Bezrukov <kirbez@mail.ru>
23  */
24 function tpl_actionmenu() {
25     global $lang;
26     global $conf;
27 
28 		include_once (dirname(__FILE__) . '/lang/en/lang.php');
29 		@include_once (dirname(__FILE__) . '/lang/' . $conf['lang'] . '/lang.php');
30 
31     $am_order   = explode(',', tpl_getConf('actionmenu_order'));
32     $am_content = explode(',', tpl_getConf('actionmenu_content'));
33 
34     // process contents by given order
35 
36     print '<select name="actionmenu" class="edit" onchange=
37     			"if ((this.selectedIndex != 0) &&
38        					(this.options[this.selectedIndex].disabled == false)) {
39             				location.href = this.options[this.selectedIndex].value;
40       			}
41           this.selectedIndex = 0;" >';
42     print '  <option value="show">'.$lang['caption'].'</option>';
43 
44     // process contents by given order
45     foreach($am_order as $am) {
46         if(in_array($am,$am_content) || $am == '---') {
47             $key = array_search($am,$am_content);
48             unset($am_content[$key]);
49             tpl_actionmenu_dispatch($am);
50         }
51     }
52 
53     // check for left content not specified by order
54     if(is_array($am_content) && !empty($am_content) > 0) {
55         foreach($am_content as $am) {
56             tpl_actionmenu_dispatch($am);
57         }
58     }
59 
60     print '</select>';
61 }
62 
63 
64 /**
65  * Dispatches the given sidebar type to return the right content
66  *
67  * @author Michael Klier <chi@chimeric.de>
68  */
69 function tpl_actionmenu_dispatch($am) {
70     global $lang;
71     global $conf;
72 
73 		include_once (dirname(__FILE__) . '/lang/en/lang.php');
74 		@include_once (dirname(__FILE__) . '/lang/' . $conf['lang'] . '/lang.php');
75 
76 
77     switch($am) {
78        case 'export_raw':
79             print '   <option value="?do=export_raw">'.$lang['export_raw'].'</option>';
80             break;
81        case 'export_html':
82             print '   <option value="?do=export_html">'.$lang['export_html'].'</option>';
83             break;
84        case 'export_htmlbody':
85             print '   <option value="?do=export_htmlbody">'.$lang['export_htmlbody'].'</option>';
86             break;
87        case 'export_odt':
88             print '   <option value="?do=export_odt">'.$lang['export_odt'].'</option>';
89             break;
90        case 'backlink':
91             print '   <option value="?do=backlink">'.$lang['backlink'].'</option>';
92             break;
93        case 'pagemove':
94             print '   <option value="?do=admin&page=pagemove">'.$lang['pagemove'].'</option>';
95             break;
96        case 'config':
97             print '   <option value="?do=admin&page=config">'.$lang['config'].'</option>';
98             break;
99        case 'purge':
100             print '   <option value="?purge=true">'.$lang['purge'].'</option>';
101             break;
102        case '---':
103             print '   <option value="show" disabled="disabled" class="disabled">------------------------</option>';
104             break;
105        default:
106             print '   <option value="?do='.$am.'">'.$am.'</option>';
107             break;
108     }
109 
110 }
111 
112 /**
113  * Prints the sidebars
114  *
115  * @author Kirill Bezrukov <kirbez@mail.ru>
116  */
117 function tpl_sidebar() {
118 
119     $sb_order   = explode(',', tpl_getConf('left_sidebar_order'));
120     $sb_content = explode(',', tpl_getConf('left_sidebar_content'));
121 
122     // process contents by given order
123     foreach($sb_order as $sb) {
124         if(in_array($sb,$sb_content)) {
125             $key = array_search($sb,$sb_content);
126             unset($sb_content[$key]);
127             tpl_sidebar_dispatch($sb,$pos);
128         }
129     }
130 
131     // check for left content not specified by order
132     if(is_array($sb_content) && !empty($sb_content) > 0) {
133         foreach($sb_content as $sb) {
134             tpl_sidebar_dispatch($sb,$pos);
135         }
136     }
137 }
138 
139 
140 /**
141  * Dispatches the given sidebar type to return the right content
142  *
143  * @author Michael Klier <chi@chimeric.de>
144  */
145 function tpl_sidebar_dispatch($sb,$pos) {
146     global $lang;
147     global $conf;
148     global $ID;
149     global $REV;
150     global $INFO;
151 
152     $svID  = $ID;   // save current ID
153     $svREV = $REV;  // save current REV
154 
155     $pname   = tpl_getConf('pagename');
156 
157     switch($sb) {
158 
159         case 'main':
160             $main_sb = $pname;
161             if(@file_exists(wikiFN($main_sb)) && auth_quickaclcheck($main_sb) >= AUTH_READ) {
162                 print '<div class="main_sidebar sidebar_box">' . DOKU_LF;
163                 print p_sidebar_xhtml($main_sb,$pos) . DOKU_LF;
164                 print '</div>' . DOKU_LF;
165             }
166             break;
167 
168         case 'namespace':
169             $user_ns  = tpl_getConf('user_sidebar_namespace');
170             $group_ns = tpl_getConf('group_sidebar_namespace');
171             if(!preg_match("/^".$user_ns.":.*?$|^".$group_ns.":.*?$/", $svID)) { // skip group/user sidebars and current ID
172                 $ns_sb = _getNsSb($svID);
173                 if($ns_sb && auth_quickaclcheck($ns_sb) >= AUTH_READ) {
174                     print '<div class="namespace_sidebar sidebar_box">' . DOKU_LF;
175                     print p_sidebar_xhtml($ns_sb,$pos) . DOKU_LF;
176                     print '</div>' . DOKU_LF;
177                 }
178             }
179             break;
180 
181         case 'user':
182             $user_ns = tpl_getConf('user_sidebar_namespace');
183             if(isset($INFO['userinfo']['name'])) {
184                 $user = $_SERVER['REMOTE_USER'];
185                 $user_sb = $user_ns . ':' . $user . ':' . $pname;
186                 if(@file_exists(wikiFN($user_sb))) {
187                     print '<div class="user_sidebar sidebar_box">' . DOKU_LF;
188                     print p_sidebar_xhtml($user_sb,$pos) . DOKU_LF;
189                     print '</div>';
190                 }
191                 // check for namespace sidebars in user namespace too
192                 if(preg_match('/'.$user_ns.':'.$user.':.*/', $svID)) {
193                     $ns_sb = _getNsSb($svID);
194                     if($ns_sb && $ns_sb != $user_sb && auth_quickaclcheck($ns_sb) >= AUTH_READ) {
195                         print '<div class="namespace_sidebar sidebar_box">' . DOKU_LF;
196                         print p_sidebar_xhtml($ns_sb,$pos) . DOKU_LF;
197                         print '</div>' . DOKU_LF;
198                     }
199                 }
200 
201             }
202             break;
203 
204         case 'group':
205             $group_ns = tpl_getConf('group_sidebar_namespace');
206             if(isset($INFO['userinfo']['name'], $INFO['userinfo']['grps'])) {
207                 foreach($INFO['userinfo']['grps'] as $grp) {
208                     $group_sb = $group_ns.':'.$grp.':'.$pname;
209                     if(@file_exists(wikiFN($group_sb)) && auth_quickaclcheck(cleanID($group_sb)) >= AUTH_READ) {
210                         print '<div class="group_sidebar sidebar_box">' . DOKU_LF;
211                         print p_sidebar_xhtml($group_sb,$pos) . DOKU_LF;
212                         print '</div>' . DOKU_LF;
213                     }
214                 }
215             }
216             break;
217 
218         case 'index':
219             print '<div class="index_sidebar sidebar_box">' . DOKU_LF;
220             print '  ' . p_index_xhtml($svID,$pos) . DOKU_LF;
221             print '</div>' . DOKU_LF;
222             break;
223 
224         case 'toc':
225             if(auth_quickaclcheck($svID) >= AUTH_READ) {
226                 $instructions = p_cached_instructions(wikiFN($svID));
227                 if(!empty($instructions)) {
228                     // FIXME - there's another way - read your todo list
229                     foreach($instructions as $instruction) {
230                         // ~~NOTOC~~ is set - do nothing
231                         if($instruction[0] == 'notoc') return;
232                     }
233                 }
234                 @require_once(DOKU_INC.'inc/parser/xhtml.php');
235                 // replace ids to keep XHTML compliance
236                 $meta = p_get_metadata($svID,'description tableofcontents');
237                 if(!empty($meta)) {
238                     $toc = preg_replace('/id="(.*?)"/', 'id="sb__' . $pos . '__\1"', Doku_Renderer_xhtml::render_TOC($meta));
239                     if(!empty($toc)) {
240                         print '<div class="toc_sidebar sidebar_box">' . DOKU_LF;
241                         print ($toc);
242                         print '</div>' . DOKU_LF;
243                     }
244                 }
245             }
246             break;
247 
248         case 'toolbox':
249             $actions = array('admin', 'edit', 'history', 'recent', 'backlink', 'subscription', 'index', 'login', 'profile');
250 
251             print '<div class="toolbox_sidebar sidebar_box">' . DOKU_LF;
252             print '  <div class="level1">' . DOKU_LF;
253             print '    <ul>' . DOKU_LF;
254 
255             foreach($actions as $action) {
256                 if(!actionOK($action)) continue;
257                 // start output buffering
258                 ob_start();
259                 print '     <li><div class="li">';
260                 if(tpl_actionlink($action)) {
261                     print '     </div></li>' . DOKU_LF;
262                     ob_end_flush();
263                 } else {
264                     ob_end_clean();
265                 }
266             }
267 
268             print '    </ul>' . DOKU_LF;
269             print '  </div>' . DOKU_LF;
270             print '</div>' . DOKU_LF;
271             break;
272 
273         case 'trace':
274             print '<div class="trace_sidebar sidebar_box">' . DOKU_LF;
275             print '  <h1>'.$lang['breadcrumb'].'</h1>' . DOKU_LF;
276             print '  <div class="breadcrumbs">' . DOKU_LF;
277             ($conf['youarehere'] != 1) ? tpl_breadcrumbs() : tpl_youarehere();
278             print '  </div>' . DOKU_LF;
279             print '</div>' . DOKU_LF;
280             break;
281 
282         case 'extra':
283             print '<div class="extra_sidebar sidebar_box">' . DOKU_LF;
284             @include(dirname(__FILE__).'/' . $pos .'_sidebar.html');
285             print '</div>' . DOKU_LF;
286             break;
287 
288         default:
289             // check for user defined sidebars
290             if(@file_exists(DOKU_TPLINC.'sidebars/'.$sb.'/sidebar.php')) {
291                 print '<div class="'.$sb.'_sidebar sidebar_box">' . DOKU_LF;
292                 @require_once(DOKU_TPLINC.'sidebars/'.$sb.'/sidebar.php');
293                 print '</div>' . DOKU_LF;
294             }
295             break;
296     }
297 
298     // restore ID and REV
299     $ID  = $svID;
300     $REV = $svREV;
301 }
302 
303 /**
304  * Removes the TOC of the sidebar pages and
305  * shows a edit button if the user has enough rights
306  *
307  * TODO sidebar caching
308  *
309  * @author Michael Klier <chi@chimeric.de>
310  */
311 function p_sidebar_xhtml($sb,$pos) {
312     $data = p_wiki_xhtml($sb,'',false);
313     if(auth_quickaclcheck($sb) >= AUTH_EDIT) {
314         $data .= '<div class="secedit">'.html_btn('secedit',$sb,'',array('do'=>'edit','rev'=>'','post')).'</div>';
315     }
316     // strip TOC
317     $data = preg_replace('/<div class="toc">.*?(<\/div>\n<\/div>)/s', '', $data);
318     // replace headline ids for XHTML compliance
319     $data = preg_replace('/(<h.*?><a.*?id=")(.*?)(">.*?<\/a><\/h.*?>)/','\1sb_'.$pos.'_\2\3', $data);
320     return ($data);
321 }
322 
323 /**
324  * Renders the Index
325  *
326  * copy of html_index located in /inc/html.php
327  *
328  * TODO update to new AJAX index possible?
329  *
330  * @author Andreas Gohr <andi@splitbrain.org>
331  * @author Michael Klier <chi@chimeric.de>
332  */
333 function p_index_xhtml($ns,$pos) {
334   require_once(DOKU_INC.'inc/search.php');
335   global $conf;
336   global $ID;
337   $dir = $conf['datadir'];
338   $ns  = cleanID($ns);
339   #fixme use appropriate function
340   if(empty($ns)){
341     $ns = dirname(str_replace(':','/',$ID));
342     if($ns == '.') $ns ='';
343   }
344   $ns  = utf8_encodeFN(str_replace(':','/',$ns));
345 
346   // extract only the headline
347   preg_match('/<h1>.*?<\/h1>/', p_locale_xhtml('index'), $match);
348   print preg_replace('#<h1(.*?id=")(.*?)(".*?)h1>#', '<h1\1sidebar_'.$pos.'_\2\3h1>', $match[0]);
349 
350   $data = array();
351   search($data,$conf['datadir'],'search_index',array('ns' => $ns));
352   print html_buildlist($data,'idx','_html_list_index','html_li_index');
353 }
354 
355 /**
356  * Index item formatter
357  *
358  * User function for html_buildlist()
359  *
360  * @author Andreas Gohr <andi@splitbrain.org>
361  * @author Michael Klier <chi@chimeric.de>
362  */
363 function _html_list_index($item){
364   global $ID;
365   global $conf;
366   $ret = '';
367   $base = ':'.$item['id'];
368   $base = substr($base,strrpos($base,':')+1);
369   if($item['type']=='d'){
370     if(@file_exists(wikiFN($item['id'].':'.$conf['start']))) {
371       $ret .= '<a href="'.wl($item['id'].':'.$conf['start']).'" class="idx_dir">';
372       $ret .= $base;
373       $ret .= '</a>';
374     } else {
375       $ret .= '<a href="'.wl($ID,'idx='.$item['id']).'" class="idx_dir">';
376       $ret .= $base;
377       $ret .= '</a>';
378     }
379   }else{
380     $ret .= html_wikilink(':'.$item['id']);
381   }
382   return $ret;
383 }
384 
385 /**
386  * searches for namespace sidebars
387  *
388  * @author Michael Klier <chi@chimeric.de>
389  */
390 function _getNsSb($id) {
391     $pname = tpl_getConf('pagename');
392     $ns_sb = '';
393     $path  = explode(':', $id);
394     $found = false;
395 
396     while(count($path) > 0) {
397         $ns_sb = implode(':', $path).':'.$pname;
398         if(@file_exists(wikiFN($ns_sb))) return $ns_sb;
399         array_pop($path);
400     }
401 
402     // nothing found
403     return false;
404 }
405 
406 //Setup vim: ts=4 sw=4:
407 ?>