xref: /template/writr/tpl_functions.php (revision 197e9867391e0c8b5cec425edb190637157f7556)
1dccf9898SAnika Henke<?php
2dccf9898SAnika Henke/**
3dccf9898SAnika Henke * Template Functions
4dccf9898SAnika Henke *
5dccf9898SAnika Henke * This file provides template specific custom functions that are
6dccf9898SAnika Henke * not provided by the DokuWiki core.
7dccf9898SAnika Henke * It is common practice to start each function with an underscore
8dccf9898SAnika Henke * to make sure it won't interfere with future core functions.
9dccf9898SAnika Henke */
10dccf9898SAnika Henke
11dccf9898SAnika Henke// must be run from within DokuWiki
12dccf9898SAnika Henkeif (!defined('DOKU_INC')) die();
13ec13a77cSLouis Ouellet
14ec13a77cSLouis Ouellet/**
15a5bfa42cSLouis Ouellet * Generate the HTML for the Site-Branding Area
16ec13a77cSLouis Ouellet *
17ec13a77cSLouis Ouellet * @return string
18ec13a77cSLouis Ouellet */
19a5bfa42cSLouis Ouelletif (!function_exists('tpl_getSiteBranding')) {
20a5bfa42cSLouis Ouellet    function tpl_getSiteBranding()
21ec13a77cSLouis Ouellet    {
22a5bfa42cSLouis Ouellet        // Retrieve the global variables
23ec13a77cSLouis Ouellet        global $ID,$conf;
24ec13a77cSLouis Ouellet
25a5bfa42cSLouis Ouellet        // Initialize the return value
26ec13a77cSLouis Ouellet        $return = '';
27a5bfa42cSLouis Ouellet
289b92d44aSLouis Ouellet        // Initialize the site branding configurations
29ec13a77cSLouis Ouellet        $logoSize = array();
30ec13a77cSLouis Ouellet        $logoImages = array();
31ec13a77cSLouis Ouellet        if(tpl_getConf('doLogoChangesByNamespace')){
32ec13a77cSLouis Ouellet            $namespace = "";
33ec13a77cSLouis Ouellet            $namespaces = array();
34ec13a77cSLouis Ouellet            foreach(explode(':',getNS($ID)) as $ns){
35ec13a77cSLouis Ouellet                $namespace .= "$ns:";
36ec13a77cSLouis Ouellet                $namespaces[] = $namespace;
37ec13a77cSLouis Ouellet            }
38ec13a77cSLouis Ouellet            foreach(array_reverse($namespaces)  as $namespace){
39ec13a77cSLouis Ouellet                $logoImages[] = ":".trim($namespace,":").":logo.png";
40ec13a77cSLouis Ouellet            }
41ec13a77cSLouis Ouellet        }
42ec13a77cSLouis Ouellet        $logoImages[] = ':logo.png';
43ec13a77cSLouis Ouellet        $logoImages[] = ':wiki:logo.png';
44ec13a77cSLouis Ouellet        $logoImages[] = 'images/logo.png';
45ec13a77cSLouis Ouellet        $logo = tpl_getMediaFile($logoImages, false, $logoSize);
46633ba5c6SLouis Ouellet        $link = wl();
47633ba5c6SLouis Ouellet        if(tpl_getConf('doLogoLinkChangesByNamespace')){
4857925973SLouis Ouellet            $link = str_replace(['/_media','logo.png'],['',$conf['start']],$logo);
49633ba5c6SLouis Ouellet        }
50a5bfa42cSLouis Ouellet        $title = $conf['title'];
51a5bfa42cSLouis Ouellet        if(tpl_getConf('doTitleChangesByNamespace')){
52a5bfa42cSLouis Ouellet            $nstitle = tpl_include_page('nstitle', 0, 1);
53a5bfa42cSLouis Ouellet            if ($nstitle) {
5422de1cfbSLouis Ouellet                $title = str_replace(['<p>','</p>',"\n"],'',$nstitle);
55a5bfa42cSLouis Ouellet            }
56a5bfa42cSLouis Ouellet        }
57a5bfa42cSLouis Ouellet        $tagline = $conf['tagline'];
58a5bfa42cSLouis Ouellet        if(tpl_getConf('doTaglineChangesByNamespace')){
59a5bfa42cSLouis Ouellet            $nstagline = tpl_include_page('nstagline', 0, 1);
60a5bfa42cSLouis Ouellet            if ($nstagline) {
6122de1cfbSLouis Ouellet                $tagline = str_replace(['<p>','</p>',"\n"],'',$nstagline);
62a5bfa42cSLouis Ouellet            }
63a5bfa42cSLouis Ouellet        }
649b92d44aSLouis Ouellet
659b92d44aSLouis Ouellet        // Initialize the logo
663974649aSLouis Ouellet        $return .= '<a class="site-logo" href="'.$link.'" title="'.$title.'" rel="home" accesskey="h">';
673974649aSLouis Ouellet        $return .= '<img src="'.$logo.'" '.$logoSize[3].' class="no-grav header-image" />';
689b92d44aSLouis Ouellet        $return .= '</a>';
699b92d44aSLouis Ouellet
709b92d44aSLouis Ouellet        // Initialize the site branding
71a5bfa42cSLouis Ouellet        $return .= '<div class="site-branding">';
723974649aSLouis Ouellet        $return .= '<h1 class="site-title"><a href="'.$link.'" rel="home" accesskey="h" title="'.$title.'">'.$title.'</a></h1>';
73a5bfa42cSLouis Ouellet        if($tagline){
74a5bfa42cSLouis Ouellet            $return .= '<h2 class="site-description">'.$tagline.'</h2>';
75a5bfa42cSLouis Ouellet        }
76a5bfa42cSLouis Ouellet        $return .= '</div>';
77a5bfa42cSLouis Ouellet
78ec13a77cSLouis Ouellet        return $return;
79ec13a77cSLouis Ouellet    }
80ec13a77cSLouis Ouellet}
81df5bf7f3SLouis Ouellet
82df5bf7f3SLouis Ouellet/**
83df5bf7f3SLouis Ouellet * Generate the gravatar URL for a given email
84df5bf7f3SLouis Ouellet *
85df5bf7f3SLouis Ouellet * @return string
86df5bf7f3SLouis Ouellet */
87df5bf7f3SLouis Ouelletif (!function_exists('tpl_getGravatarURL')) {
88df5bf7f3SLouis Ouellet    function tpl_getGravatarURL($email, $size = 96)
89df5bf7f3SLouis Ouellet    {
90*197e9867Shanzlik        global $conf;
91*197e9867Shanzlik        $email = trim(strtolower((string)$email));
92*197e9867Shanzlik        $tplName = basename(__DIR__);
93*197e9867Shanzlik        $variant = function_exists('tpl_getConf') ? tpl_getConf('profile_pic_variant') : 'white';
94*197e9867Shanzlik
95*197e9867Shanzlik        if ($variant === 'black') {
96*197e9867Shanzlik            $fallback = DOKU_BASE.'lib/tpl/'.$tplName.'/images/profile_pic_black.png';
97*197e9867Shanzlik        } else {
98*197e9867Shanzlik            $fallback = DOKU_BASE.'lib/tpl/'.$tplName.'/images/profile_pic_white.png';
99df5bf7f3SLouis Ouellet        }
100df5bf7f3SLouis Ouellet
101*197e9867Shanzlik        if (empty($email)) {
102*197e9867Shanzlik            return $fallback;
103*197e9867Shanzlik        }
104*197e9867Shanzlik
105*197e9867Shanzlik        $hash = md5(strtolower(trim($email)));
106*197e9867Shanzlik        $testUrl = 'https://www.gravatar.com/avatar/'.$hash.'?s='.$size.'&d=404';
107*197e9867Shanzlik        $headers = @get_headers($testUrl);
108*197e9867Shanzlik        if ($headers && isset($headers[0]) && strpos($headers[0], '200') !== false) {
109*197e9867Shanzlik            return 'https://www.gravatar.com/avatar/'.$hash.'?s='.$size;
110*197e9867Shanzlik        }
111*197e9867Shanzlik        return $fallback;
112*197e9867Shanzlik    }
113*197e9867Shanzlik}
114df5bf7f3SLouis Ouellet
115df5bf7f3SLouis Ouellet/**
116df5bf7f3SLouis Ouellet * Generate the HTML for a menu
117df5bf7f3SLouis Ouellet *
118df5bf7f3SLouis Ouellet * @return string
119df5bf7f3SLouis Ouellet */
120df5bf7f3SLouis Ouelletif (!function_exists('tpl_getMenu')) {
121df5bf7f3SLouis Ouellet    function tpl_getMenu($menu)
122df5bf7f3SLouis Ouellet    {
123df5bf7f3SLouis Ouellet        switch($menu){
124df5bf7f3SLouis Ouellet            case 'usermenu':
125df5bf7f3SLouis Ouellet                return tpl_getUserMenu();
126df5bf7f3SLouis Ouellet                break;
1277311aa0dSLouis Ouellet            case 'sidebarmenu':
1287311aa0dSLouis Ouellet                return tpl_getSidebarMenu();
1297311aa0dSLouis Ouellet                break;
130df5bf7f3SLouis Ouellet        }
131df5bf7f3SLouis Ouellet    }
132df5bf7f3SLouis Ouellet}
133df5bf7f3SLouis Ouellet
134df5bf7f3SLouis Ouellet/**
135df5bf7f3SLouis Ouellet * Generate the HTML for the user menu
136df5bf7f3SLouis Ouellet *
137df5bf7f3SLouis Ouellet * @return string
138df5bf7f3SLouis Ouellet */
139df5bf7f3SLouis Ouelletif (!function_exists('tpl_getUserMenu')) {
140df5bf7f3SLouis Ouellet    function tpl_getUserMenu()
141df5bf7f3SLouis Ouellet    {
142df5bf7f3SLouis Ouellet        global $lang,$ID,$conf,$INFO;
143df5bf7f3SLouis Ouellet
144df5bf7f3SLouis Ouellet        $return = '';
145df5bf7f3SLouis Ouellet
146df5bf7f3SLouis Ouellet        $items = (new \dokuwiki\Menu\UserMenu())->getItems();
147df5bf7f3SLouis Ouellet
148df5bf7f3SLouis Ouellet        if(isset($INFO['userinfo'])){
149df086b5dSLouis Ouellet            $return .= '<div class="tools-menus">';
150df5bf7f3SLouis Ouellet                $return .= '<div class="dropdown user-tools">';
15136603110SLouis Ouellet                    $return .= '<a href="'.wl($ID).'" class="dropdown-toggle" title="'.$lang['user_tools'].'" data-target="#" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">';
152df5bf7f3SLouis Ouellet                        $return .= '<i class="bi bi-person"></i>'.$INFO['userinfo']['name'];
153df5bf7f3SLouis Ouellet                    $return .= '</a>';
154df5bf7f3SLouis Ouellet                    $return .= '<ul class="dropdown-menu" role="menu">';
155df5bf7f3SLouis Ouellet                        $return .= '<li>';
156df5bf7f3SLouis Ouellet                            $return .= '<p class="avatar">';
157df5bf7f3SLouis Ouellet                                $return .= '<img alt="'.$INFO['userinfo']['name'].'" src="'.tpl_getGravatarURL($INFO['userinfo']['mail']).'" />';
158df5bf7f3SLouis Ouellet                            $return .= '</p>';
159df5bf7f3SLouis Ouellet                        $return .= '</li>';
160df5bf7f3SLouis Ouellet                        foreach($items as $item) {
161df5bf7f3SLouis Ouellet                            $return .= '<li>'
162df5bf7f3SLouis Ouellet                                .'<a href="'.$item->getLink().'" class="action '.strtolower($item->getType()).'" rel="nofollow" title="'.$item->getTitle().'">'
163df5bf7f3SLouis Ouellet                                .'<i></i> '
164df5bf7f3SLouis Ouellet                                .$item->getLabel()
165df5bf7f3SLouis Ouellet                                .'</a></li>';
166df5bf7f3SLouis Ouellet                        }
167df5bf7f3SLouis Ouellet                    $return .= '</ul>';
168df5bf7f3SLouis Ouellet                $return .= '</div>';
169df086b5dSLouis Ouellet                if(tpl_getConf('enableStarredBookmark')){
170df086b5dSLouis Ouellet                    if (!plugin_isdisabled('sqlite')) {
171df086b5dSLouis Ouellet                        if (!plugin_isdisabled('starred')) {
172df086b5dSLouis Ouellet                            $return .= '<div class="dropdown bookmarks">';
173df086b5dSLouis Ouellet                                $return .= '<a href="#" class="dropdown-toggle starred" title="'.tpl_getLang('Bookmarks').'" data-target="#" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">';
174df086b5dSLouis Ouellet                                    $return .= '<i class="bi bi-star"></i>'.tpl_getLang('Bookmarks');
175df086b5dSLouis Ouellet                                $return .= '</a>';
176df086b5dSLouis Ouellet                                $return .= '<ul class="dropdown-menu" role="menu">';
177df086b5dSLouis Ouellet                                $instructions = p_get_instructions('{{starred>min}}');
1784cc54253SLouis Ouellet                                if(count($instructions) > 0) {
179df086b5dSLouis Ouellet                                    $render = p_render('xhtml',$instructions, $info);
180df086b5dSLouis Ouellet                                    // Sanitize the output
181df086b5dSLouis Ouellet                                    $render = preg_replace('/<div class="plugin_starred">/', '', $render);
182df086b5dSLouis Ouellet                                    $render = preg_replace('/<\/div>/', '', $render);
183df086b5dSLouis Ouellet                                    $render = preg_replace('/<div class="li">/', '', $render);
184df086b5dSLouis Ouellet                                    $render = preg_replace('/<\/div>/', '', $render);
185df086b5dSLouis Ouellet                                    $render = preg_replace('/<ul>/', '', $render);
186df086b5dSLouis Ouellet                                    $render = preg_replace('/<\/ul>/', '', $render);
187df086b5dSLouis Ouellet                                    $render = preg_replace('/<li class="level1">/', '<li>', $render);
188df086b5dSLouis Ouellet                                    $return .= $render;
189df086b5dSLouis Ouellet                                }
190df086b5dSLouis Ouellet                                $return .= '</ul>';
191df086b5dSLouis Ouellet                            $return .= '</div>';
192df086b5dSLouis Ouellet                        }
193df086b5dSLouis Ouellet                    }
194df086b5dSLouis Ouellet                }
195df086b5dSLouis Ouellet            $return .= '</div>';
196df5bf7f3SLouis Ouellet        } else {
197df5bf7f3SLouis Ouellet            $return .= '<div class="inline user-tools">';
198df5bf7f3SLouis Ouellet            foreach($items as $item) {
199df5bf7f3SLouis Ouellet                $return .= '<a href="'.$item->getLink().'" class="action '.strtolower($item->getType()).'" rel="nofollow" title="'.$item->getTitle().'">'
200df5bf7f3SLouis Ouellet                    .'<i></i> '
201df5bf7f3SLouis Ouellet                    .$item->getLabel()
202df5bf7f3SLouis Ouellet                    .'</a>';
203df5bf7f3SLouis Ouellet            }
204df5bf7f3SLouis Ouellet            $return .= '</div>';
205df5bf7f3SLouis Ouellet        }
206df5bf7f3SLouis Ouellet
207df5bf7f3SLouis Ouellet        return $return;
208df5bf7f3SLouis Ouellet    }
209df5bf7f3SLouis Ouellet}
2107311aa0dSLouis Ouellet
2117311aa0dSLouis Ouellet/**
2127311aa0dSLouis Ouellet * Generate the HTML for the sidebar menus
2137311aa0dSLouis Ouellet *
2147311aa0dSLouis Ouellet * @return string
2157311aa0dSLouis Ouellet */
2167311aa0dSLouis Ouelletif (!function_exists('tpl_getSidebarMenu')) {
2177311aa0dSLouis Ouellet    function tpl_getSidebarMenu()
2187311aa0dSLouis Ouellet    {
2197311aa0dSLouis Ouellet        global $lang,$ID,$conf,$INFO;
2207311aa0dSLouis Ouellet
2217311aa0dSLouis Ouellet        $userItems = (new \dokuwiki\Menu\UserMenu())->getItems();
2227311aa0dSLouis Ouellet
2237311aa0dSLouis Ouellet        $return = '';
2247311aa0dSLouis Ouellet        $return .= '<div id="writr__sidebar__tools">';
2257311aa0dSLouis Ouellet
2267311aa0dSLouis Ouellet        if(isset($INFO['userinfo'])){
2277311aa0dSLouis Ouellet            $return .= '<div class="user-tools">';
2287311aa0dSLouis Ouellet                $return .= '<a href="'.wl($ID).'" class="" title="'.$lang['user_tools'].'" data-target="#user-tools-menu" data-toggle="collapse" role="button" aria-haspopup="true" aria-expanded="false">';
2297311aa0dSLouis Ouellet                    $return .= '<img alt="'.$INFO['userinfo']['name'].'" src="'.tpl_getGravatarURL($INFO['userinfo']['mail'], 32).'" />';
2307311aa0dSLouis Ouellet                    $return .= '<span>'.$INFO['userinfo']['name'].'</span>';
2317311aa0dSLouis Ouellet                $return .= '</a>';
2327311aa0dSLouis Ouellet                $return .= '<div id="user-tools-menu" class="collapsed">';
2337311aa0dSLouis Ouellet                    $return .= '<ul class="menu" role="menu">';
2347311aa0dSLouis Ouellet                        foreach($userItems as $item) {
2357311aa0dSLouis Ouellet                            $return .= '<li>'
2367311aa0dSLouis Ouellet                                .'<a href="'.$item->getLink().'" class="action '.strtolower($item->getType()).'" rel="nofollow" title="'.$item->getTitle().'">'
2377311aa0dSLouis Ouellet                                .'<i></i> '
2387311aa0dSLouis Ouellet                                .$item->getLabel()
2397311aa0dSLouis Ouellet                                .'</a></li>';
2407311aa0dSLouis Ouellet                        }
2417311aa0dSLouis Ouellet                    $return .= '</ul>';
2427311aa0dSLouis Ouellet                $return .= '</div>';
2437311aa0dSLouis Ouellet            $return .= '</div>';
2447311aa0dSLouis Ouellet        } else {
2457311aa0dSLouis Ouellet            $return .= '<div class="user-tools">';
2467311aa0dSLouis Ouellet            foreach($userItems as $item) {
2477311aa0dSLouis Ouellet                $return .= '<a href="'.$item->getLink().'" class="action '.strtolower($item->getType()).'" rel="nofollow" title="'.$item->getTitle().'">'
2487311aa0dSLouis Ouellet                    .'<i></i> '
2497311aa0dSLouis Ouellet                    .$item->getLabel()
2507311aa0dSLouis Ouellet                    .'</a>';
2517311aa0dSLouis Ouellet            }
2527311aa0dSLouis Ouellet            $return .= '</div>';
2537311aa0dSLouis Ouellet        }
2547311aa0dSLouis Ouellet
2557311aa0dSLouis Ouellet        $return .= '</div>';
2567311aa0dSLouis Ouellet
2577311aa0dSLouis Ouellet        return $return;
2587311aa0dSLouis Ouellet    }
2597311aa0dSLouis Ouellet}
260