1 <?php
2 /**
3  * Template Functions
4  *
5  * This file provides template specific custom functions that are
6  * not provided by the DokuWiki core.
7  * It is common practice to start each function with an underscore
8  * to make sure it won't interfere with future core functions.
9  */
10 
11 // must be run from within DokuWiki
12 if (!defined('DOKU_INC')) die();
13 
14 /**
15  * Create link/button to discussion page and back
16  *
17  * @author Anika Henke <anika@selfthinker.org>
18  */
19 function _tpl_discussion($discussionPage, $title, $backTitle, $link=0, $wrapper=0) {
20     global $ID;
21 
22     $discussPage    = str_replace('@ID@', $ID, $discussionPage);
23     $discussPageRaw = str_replace('@ID@', '', $discussionPage);
24     $isDiscussPage  = strpos($ID, $discussPageRaw) !== false;
25     $backID         = str_replace($discussPageRaw, '', $ID);
26 
27     if ($wrapper) echo "<$wrapper>";
28 
29     if ($isDiscussPage) {
30         if ($link)
31             tpl_pagelink($backID, $backTitle);
32         else
33             echo html_btn('back2article', $backID, '', array(), 'get', 0, $backTitle);
34     } else {
35         if ($link)
36             tpl_pagelink($discussPage, $title);
37         else
38             echo html_btn('discussion', $discussPage, '', array(), 'get', 0, $title);
39     }
40 
41     if ($wrapper) echo "</$wrapper>";
42 }
43 
44 /**
45  * Create link/button to user page
46  *
47  * @author Anika Henke <anika@selfthinker.org>
48  */
49 function _tpl_userpage($userPage, $title, $link=0, $wrapper=0) {
50     if (!$_SERVER['REMOTE_USER']) return;
51 
52     global $conf;
53     $userPage = str_replace('@USER@', $_SERVER['REMOTE_USER'], $userPage);
54 
55     if ($wrapper) echo "<$wrapper>";
56 
57     if ($link)
58         tpl_pagelink($userPage, $title);
59     else
60         echo html_btn('userpage', $userPage, '', array(), 'get', 0, $title);
61 
62     if ($wrapper) echo "</$wrapper>";
63 }
64 
65 /**
66  * Create link/button to register page
67  * @deprecated DW versions > 2011-02-20 can use the core function tpl_action('register')
68  *
69  * @author Anika Henke <anika@selfthinker.org>
70  */
71 function _tpl_register($link=0, $wrapper=0) {
72     global $conf;
73     global $lang;
74     global $ID;
75     $lang_register = !empty($lang['btn_register']) ? $lang['btn_register'] : $lang['register'];
76 
77     if ($_SERVER['REMOTE_USER'] || !$conf['useacl'] || !actionOK('register')) return;
78 
79     if ($wrapper) echo "<$wrapper>";
80 
81     if ($link)
82         tpl_link(wl($ID, 'do=register'), $lang_register, 'class="action register" rel="nofollow"');
83     else
84         echo html_btn('register', $ID, '', array('do'=>'register'), 'get', 0, $lang_register);
85 
86     if ($wrapper) echo "</$wrapper>";
87 }
88 
89 /**
90  * Wrapper around custom template actions
91  *
92  * @author Anika Henke <anika@selfthinker.org>
93  */
94 function _tpl_action($type, $link=0, $wrapper=0) {
95     switch ($type) {
96         case 'discussion':
97             if (tpl_getConf('discussionPage')) {
98                 _tpl_discussion(tpl_getConf('discussionPage'), tpl_getLang('discussion'), tpl_getLang('back_to_article'), $link, $wrapper);
99             }
100             break;
101         case 'userpage':
102             if (tpl_getConf('userPage')) {
103                 _tpl_userpage(tpl_getConf('userPage'), tpl_getLang('userpage'), $link, $wrapper);
104             }
105             break;
106         case 'register': // deprecated
107             _tpl_register($link, $wrapper);
108             break;
109     }
110 }
111 
112 
113 
114 /* fallbacks for things missing in older DokuWiki versions
115 ********************************************************************/
116 
117 
118 /* if newer settings exist in the core, use them, otherwise fall back to template settings */
119 
120 if (!isset($conf['tagline'])) {
121     $conf['tagline'] = tpl_getConf('tagline');
122 }
123 
124 if (!isset($conf['sidebar'])) {
125     $conf['sidebar'] = tpl_getConf('sidebarID');
126 }
127 
128 /* these $lang strings are now in the core */
129 
130 if (!isset($lang['user_tools'])) {
131     $lang['user_tools'] = tpl_getLang('user_tools');
132 }
133 if (!isset($lang['site_tools'])) {
134     $lang['site_tools'] = tpl_getLang('site_tools');
135 }
136 if (!isset($lang['page_tools'])) {
137     $lang['page_tools'] = tpl_getLang('page_tools');
138 }
139 if (!isset($lang['skip_to_content'])) {
140     $lang['skip_to_content'] = tpl_getLang('skip_to_content');
141 }
142 
143 
144 /**
145  * copied from core (available since Adora Belle)
146  */
147 if (!function_exists('tpl_getMediaFile')) {
148     function tpl_getMediaFile($search, $abs = false, &$imginfo = null) {
149         $img     = '';
150         $file    = '';
151         $ismedia = false;
152         // loop through candidates until a match was found:
153         foreach($search as $img) {
154             if(substr($img, 0, 1) == ':') {
155                 $file    = mediaFN($img);
156                 $ismedia = true;
157             } else {
158                 $file    = tpl_incdir().$img;
159                 $ismedia = false;
160             }
161 
162             if(file_exists($file)) break;
163         }
164 
165         // fetch image data if requested
166         if(!is_null($imginfo)) {
167             $imginfo = getimagesize($file);
168         }
169 
170         // build URL
171         if($ismedia) {
172             $url = ml($img, '', true, '', $abs);
173         } else {
174             $url = tpl_basedir().$img;
175             if($abs) $url = DOKU_URL.substr($url, strlen(DOKU_REL));
176         }
177 
178         return $url;
179     }
180 }
181 
182 /**
183  * copied from core (available since Angua)
184  */
185 if (!function_exists('tpl_favicon')) {
186     function tpl_favicon($types = array('favicon')) {
187 
188         $return = '';
189 
190         foreach($types as $type) {
191             switch($type) {
192                 case 'favicon':
193                     $look = array(':wiki:favicon.ico', ':favicon.ico', 'images/favicon.ico');
194                     $return .= '<link rel="shortcut icon" href="'.tpl_getMediaFile($look).'" />'.NL;
195                     break;
196                 case 'mobile':
197                     $look = array(':wiki:apple-touch-icon.png', ':apple-touch-icon.png', 'images/apple-touch-icon.png');
198                     $return .= '<link rel="apple-touch-icon" href="'.tpl_getMediaFile($look).'" />'.NL;
199                     break;
200                 case 'generic':
201                     // ideal world solution, which doesn't work in any browser yet
202                     $look = array(':wiki:favicon.svg', ':favicon.svg', 'images/favicon.svg');
203                     $return .= '<link rel="icon" href="'.tpl_getMediaFile($look).'" type="image/svg+xml" />'.NL;
204                     break;
205             }
206         }
207 
208         return $return;
209     }
210 }
211 
212 /**
213  * copied from core (available since Adora Belle)
214  */
215 if (!function_exists('tpl_includeFile')) {
216     function tpl_includeFile($file) {
217         global $config_cascade;
218         foreach(array('protected', 'local', 'default') as $config_group) {
219             if(empty($config_cascade['main'][$config_group])) continue;
220             foreach($config_cascade['main'][$config_group] as $conf_file) {
221                 $dir = dirname($conf_file);
222                 if(file_exists("$dir/$file")) {
223                     include("$dir/$file");
224                     return;
225                 }
226             }
227         }
228 
229         // still here? try the template dir
230         $file = tpl_incdir().$file;
231         if(file_exists($file)) {
232             include($file);
233         }
234     }
235 }
236 
237 /**
238  * copied from core (available since Adora Belle)
239  */
240 if (!function_exists('tpl_incdir')) {
241     function tpl_incdir() {
242         global $conf;
243         return DOKU_INC.'lib/tpl/'.$conf['template'].'/';
244     }
245 }
246