xref: /template/ad-hominem/my_template.php (revision e5d0cb92018eb87a2f1045c9eec2fd84cbb2a149)
1*e5d0cb92SSascha Leib<?php
2*e5d0cb92SSascha Leib/**
3*e5d0cb92SSascha Leib * Overwriting DokuWiki template functions
4*e5d0cb92SSascha Leib *
5*e5d0cb92SSascha Leib * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6*e5d0cb92SSascha Leib * @author     Sascha Leib <sascha@leib.be>
7*e5d0cb92SSascha Leib * @author     Andreas Gohr <andi@splitbrain.org>
8*e5d0cb92SSascha Leib */
9*e5d0cb92SSascha Leib
10*e5d0cb92SSascha Leibuse dokuwiki\Extension\Event;
11*e5d0cb92SSascha Leib
12*e5d0cb92SSascha Leib/**
13*e5d0cb92SSascha Leib * Print the specific HTML meta headers
14*e5d0cb92SSascha Leib *
15*e5d0cb92SSascha Leib * Overrides the original version by modifying the headers and the way it is printed
16*e5d0cb92SSascha Leib *
17*e5d0cb92SSascha Leib * @author Sascha Leib <sascha@leib.be>
18*e5d0cb92SSascha Leib * @author Andreas Gohr <andi@splitbrain.org>
19*e5d0cb92SSascha Leib *
20*e5d0cb92SSascha Leib * @triggers TPL_METAHEADER_OUTPUT
21*e5d0cb92SSascha Leib * @param  bool $alt Should feeds and alternative format links be added?
22*e5d0cb92SSascha Leib * @return bool
23*e5d0cb92SSascha Leib */
24*e5d0cb92SSascha Leibfunction my_metaheaders($alt = true) {
25*e5d0cb92SSascha Leib    global $ID;
26*e5d0cb92SSascha Leib    global $REV;
27*e5d0cb92SSascha Leib    global $INFO;
28*e5d0cb92SSascha Leib    global $JSINFO;
29*e5d0cb92SSascha Leib    global $ACT;
30*e5d0cb92SSascha Leib    global $QUERY;
31*e5d0cb92SSascha Leib    global $lang;
32*e5d0cb92SSascha Leib    global $conf;
33*e5d0cb92SSascha Leib    global $updateVersion;
34*e5d0cb92SSascha Leib    /** @var Input $INPUT */
35*e5d0cb92SSascha Leib    global $INPUT;
36*e5d0cb92SSascha Leib
37*e5d0cb92SSascha Leib    // prepare the head array
38*e5d0cb92SSascha Leib    $head = array();
39*e5d0cb92SSascha Leib
40*e5d0cb92SSascha Leib    // prepare seed for js and css
41*e5d0cb92SSascha Leib    $tseed   = $updateVersion;
42*e5d0cb92SSascha Leib    $depends = getConfigFiles('main');
43*e5d0cb92SSascha Leib    $depends[] = DOKU_CONF."tpl/".$conf['template']."/style.ini";
44*e5d0cb92SSascha Leib    foreach($depends as $f) $tseed .= @filemtime($f);
45*e5d0cb92SSascha Leib    $tseed   = md5($tseed);
46*e5d0cb92SSascha Leib
47*e5d0cb92SSascha Leib	// Open Graph information
48*e5d0cb92SSascha Leib	$meta = p_get_metadata($ID);
49*e5d0cb92SSascha Leib	if ($meta['title'] !== null) {
50*e5d0cb92SSascha Leib		$head['meta'][] = array('property' => 'og:title', 'content' => tpl_pagetitle($ID, true));
51*e5d0cb92SSascha Leib		$head['meta'][] = array('property' => 'og:site_name ', 'content' => $conf['title']);
52*e5d0cb92SSascha Leib		$head['meta'][] = array('property' => 'og:type', 'content' => 'website');
53*e5d0cb92SSascha Leib		$head['meta'][] = array('property' => 'og:url', 'content' => wl($ID, '', true, '&'));
54*e5d0cb92SSascha Leib
55*e5d0cb92SSascha Leib		$parts = explode("\n", $meta['description']['abstract']);
56*e5d0cb92SSascha Leib		$head['meta'][] = array('property' => 'og:description', 'content' => $parts[2]);
57*e5d0cb92SSascha Leib	}
58*e5d0cb92SSascha Leib
59*e5d0cb92SSascha Leib    // the usual stuff
60*e5d0cb92SSascha Leib    $head['meta'][] = array('name'=> 'generator', 'content'=> 'DokuWiki');
61*e5d0cb92SSascha Leib    if(actionOK('search')) {
62*e5d0cb92SSascha Leib        $head['link'][] = array(
63*e5d0cb92SSascha Leib            'rel' => 'search', 'type'=> 'application/opensearchdescription+xml',
64*e5d0cb92SSascha Leib            'href'=> DOKU_BASE.'lib/exe/opensearch.php', 'title'=> $conf['title']
65*e5d0cb92SSascha Leib        );
66*e5d0cb92SSascha Leib    }
67*e5d0cb92SSascha Leib
68*e5d0cb92SSascha Leib    $head['link'][] = array('rel'=> 'start', 'href'=> DOKU_BASE);
69*e5d0cb92SSascha Leib    if(actionOK('index')) {
70*e5d0cb92SSascha Leib        $head['link'][] = array(
71*e5d0cb92SSascha Leib            'rel'  => 'contents', 'href'=> wl($ID, 'do=index', false, '&'),
72*e5d0cb92SSascha Leib            'title'=> $lang['btn_index']
73*e5d0cb92SSascha Leib        );
74*e5d0cb92SSascha Leib    }
75*e5d0cb92SSascha Leib
76*e5d0cb92SSascha Leib    if (actionOK('manifest')) {
77*e5d0cb92SSascha Leib        $head['link'][] = array('rel'=> 'manifest', 'href'=> DOKU_BASE.'lib/exe/manifest.php');
78*e5d0cb92SSascha Leib    }
79*e5d0cb92SSascha Leib
80*e5d0cb92SSascha Leib    $styleUtil = new \dokuwiki\StyleUtils();
81*e5d0cb92SSascha Leib    $styleIni = $styleUtil->cssStyleini();
82*e5d0cb92SSascha Leib    $replacements = $styleIni['replacements'];
83*e5d0cb92SSascha Leib    if (!empty($replacements['__theme_color__'])) {
84*e5d0cb92SSascha Leib        $head['meta'][] = array('name' => 'theme-color', 'content' => $replacements['__theme_color__']);
85*e5d0cb92SSascha Leib    }
86*e5d0cb92SSascha Leib
87*e5d0cb92SSascha Leib    if($alt) {
88*e5d0cb92SSascha Leib        if(actionOK('rss')) {
89*e5d0cb92SSascha Leib            $head['link'][] = array(
90*e5d0cb92SSascha Leib                'rel'  => 'alternate', 'type'=> 'application/rss+xml',
91*e5d0cb92SSascha Leib                'title'=> $lang['btn_recent'], 'href'=> DOKU_BASE.'feed.php'
92*e5d0cb92SSascha Leib            );
93*e5d0cb92SSascha Leib            $head['link'][] = array(
94*e5d0cb92SSascha Leib                'rel'  => 'alternate', 'type'=> 'application/rss+xml',
95*e5d0cb92SSascha Leib                'title'=> $lang['currentns'],
96*e5d0cb92SSascha Leib                'href' => DOKU_BASE.'feed.php?mode=list&ns='.(isset($INFO) ? $INFO['namespace'] : '')
97*e5d0cb92SSascha Leib            );
98*e5d0cb92SSascha Leib        }
99*e5d0cb92SSascha Leib        if(($ACT == 'show' || $ACT == 'search') && $INFO['writable']) {
100*e5d0cb92SSascha Leib            $head['link'][] = array(
101*e5d0cb92SSascha Leib                'rel'  => 'edit',
102*e5d0cb92SSascha Leib                'title'=> $lang['btn_edit'],
103*e5d0cb92SSascha Leib                'href' => wl($ID, 'do=edit', false, '&')
104*e5d0cb92SSascha Leib            );
105*e5d0cb92SSascha Leib        }
106*e5d0cb92SSascha Leib
107*e5d0cb92SSascha Leib        if(actionOK('rss') && $ACT == 'search') {
108*e5d0cb92SSascha Leib            $head['link'][] = array(
109*e5d0cb92SSascha Leib                'rel'  => 'alternate', 'type'=> 'application/rss+xml',
110*e5d0cb92SSascha Leib                'title'=> $lang['searchresult'],
111*e5d0cb92SSascha Leib                'href' => DOKU_BASE.'feed.php?mode=search&q='.$QUERY
112*e5d0cb92SSascha Leib            );
113*e5d0cb92SSascha Leib        }
114*e5d0cb92SSascha Leib
115*e5d0cb92SSascha Leib        if(actionOK('export_xhtml')) {
116*e5d0cb92SSascha Leib            $head['link'][] = array(
117*e5d0cb92SSascha Leib                'rel' => 'alternate', 'type'=> 'text/html', 'title'=> $lang['plainhtml'],
118*e5d0cb92SSascha Leib                'href'=> exportlink($ID, 'xhtml', '', false, '&')
119*e5d0cb92SSascha Leib            );
120*e5d0cb92SSascha Leib        }
121*e5d0cb92SSascha Leib
122*e5d0cb92SSascha Leib        if(actionOK('export_raw')) {
123*e5d0cb92SSascha Leib            $head['link'][] = array(
124*e5d0cb92SSascha Leib                'rel' => 'alternate', 'type'=> 'text/plain', 'title'=> $lang['wikimarkup'],
125*e5d0cb92SSascha Leib                'href'=> exportlink($ID, 'raw', '', false, '&')
126*e5d0cb92SSascha Leib            );
127*e5d0cb92SSascha Leib        }
128*e5d0cb92SSascha Leib    }
129*e5d0cb92SSascha Leib
130*e5d0cb92SSascha Leib    // setup robot tags apropriate for different modes
131*e5d0cb92SSascha Leib    if(($ACT == 'show' || $ACT == 'export_xhtml') && !$REV) {
132*e5d0cb92SSascha Leib        if($INFO['exists']) {
133*e5d0cb92SSascha Leib            //delay indexing:
134*e5d0cb92SSascha Leib            if((time() - $INFO['lastmod']) >= $conf['indexdelay'] && !isHiddenPage($ID) ) {
135*e5d0cb92SSascha Leib                $head['meta'][] = array('name'=> 'robots', 'content'=> 'index,follow');
136*e5d0cb92SSascha Leib            } else {
137*e5d0cb92SSascha Leib                $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,nofollow');
138*e5d0cb92SSascha Leib            }
139*e5d0cb92SSascha Leib            $canonicalUrl = wl($ID, '', true, '&');
140*e5d0cb92SSascha Leib            if ($ID == $conf['start']) {
141*e5d0cb92SSascha Leib                $canonicalUrl = DOKU_URL;
142*e5d0cb92SSascha Leib            }
143*e5d0cb92SSascha Leib            $head['link'][] = array('rel'=> 'canonical', 'href'=> $canonicalUrl);
144*e5d0cb92SSascha Leib        } else {
145*e5d0cb92SSascha Leib            $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,follow');
146*e5d0cb92SSascha Leib        }
147*e5d0cb92SSascha Leib    } elseif(defined('DOKU_MEDIADETAIL')) {
148*e5d0cb92SSascha Leib        $head['meta'][] = array('name'=> 'robots', 'content'=> 'index,follow');
149*e5d0cb92SSascha Leib    } else {
150*e5d0cb92SSascha Leib        $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,nofollow');
151*e5d0cb92SSascha Leib    }
152*e5d0cb92SSascha Leib
153*e5d0cb92SSascha Leib    // set metadata
154*e5d0cb92SSascha Leib    if($ACT == 'show' || $ACT == 'export_xhtml') {
155*e5d0cb92SSascha Leib        // keywords (explicit or implicit)
156*e5d0cb92SSascha Leib        if(!empty($INFO['meta']['subject'])) {
157*e5d0cb92SSascha Leib            $head['meta'][] = array('name'=> 'keywords', 'content'=> join(',', $INFO['meta']['subject']));
158*e5d0cb92SSascha Leib        } else {
159*e5d0cb92SSascha Leib            $head['meta'][] = array('name'=> 'keywords', 'content'=> str_replace(':', ',', $ID));
160*e5d0cb92SSascha Leib        }
161*e5d0cb92SSascha Leib    }
162*e5d0cb92SSascha Leib
163*e5d0cb92SSascha Leib    // load stylesheets
164*e5d0cb92SSascha Leib    $head['link'][] = array(
165*e5d0cb92SSascha Leib        'rel' => 'stylesheet',
166*e5d0cb92SSascha Leib        'href'=> DOKU_BASE . 'lib/exe/css.php?t='.rawurlencode($conf['template']).'&tseed='.$tseed
167*e5d0cb92SSascha Leib    );
168*e5d0cb92SSascha Leib
169*e5d0cb92SSascha Leib    $script = "var NS='".(isset($INFO)?$INFO['namespace']:'')."';\n\t\t";
170*e5d0cb92SSascha Leib    if($conf['useacl'] && $INPUT->server->str('REMOTE_USER')) {
171*e5d0cb92SSascha Leib        $script .= "var SIG=".toolbar_signature().";\n\t\t";
172*e5d0cb92SSascha Leib    }
173*e5d0cb92SSascha Leib
174*e5d0cb92SSascha Leib    if($conf['basedir']) {
175*e5d0cb92SSascha Leib        $script .= 'var BASEDIR="'.$conf['basedir']."\";\n\t\t";
176*e5d0cb92SSascha Leib    }
177*e5d0cb92SSascha Leib
178*e5d0cb92SSascha Leib    jsinfo();
179*e5d0cb92SSascha Leib    $script .= 'var JSINFO = ' . json_encode($JSINFO).';';
180*e5d0cb92SSascha Leib    $head['script'][] = array('_data'=> $script);
181*e5d0cb92SSascha Leib
182*e5d0cb92SSascha Leib    // load jquery
183*e5d0cb92SSascha Leib    $jquery = getCdnUrls();
184*e5d0cb92SSascha Leib    foreach($jquery as $src) {
185*e5d0cb92SSascha Leib        $head['script'][] = array(
186*e5d0cb92SSascha Leib            /* 'charset' => 'utf-8', -- obsolete */
187*e5d0cb92SSascha Leib            '_data' => '',
188*e5d0cb92SSascha Leib            'src' => $src,
189*e5d0cb92SSascha Leib        ) + ($conf['defer_js'] ? [ 'defer' => 'defer'] : []);
190*e5d0cb92SSascha Leib    }
191*e5d0cb92SSascha Leib
192*e5d0cb92SSascha Leib    // load our javascript dispatcher
193*e5d0cb92SSascha Leib    $head['script'][] = array(
194*e5d0cb92SSascha Leib        /* 'charset'=> 'utf-8', -- obsolete */
195*e5d0cb92SSascha Leib		'_data'=> '',
196*e5d0cb92SSascha Leib        'src' => DOKU_BASE . 'lib/exe/js.php'.'?t='.rawurlencode($conf['template']).'&tseed='.$tseed,
197*e5d0cb92SSascha Leib    ) + ($conf['defer_js'] ? [ 'defer' => 'defer'] : []);
198*e5d0cb92SSascha Leib
199*e5d0cb92SSascha Leib    // trigger event here
200*e5d0cb92SSascha Leib    Event::createAndTrigger('TPL_METAHEADER_OUTPUT', $head, '_my_metaheaders_action', true);
201*e5d0cb92SSascha Leib    return true;
202*e5d0cb92SSascha Leib}
203*e5d0cb92SSascha Leib
204*e5d0cb92SSascha Leib/**
205*e5d0cb92SSascha Leib * prints the array build by my_metaheaders
206*e5d0cb92SSascha Leib *
207*e5d0cb92SSascha Leib * Overrides the original version by adding a tab before each line for neater HTML code
208*e5d0cb92SSascha Leib *
209*e5d0cb92SSascha Leib * @author Sascha Leib <sascha@leib.be>
210*e5d0cb92SSascha Leib * @author Andreas Gohr <andi@splitbrain.org>
211*e5d0cb92SSascha Leib *
212*e5d0cb92SSascha Leib * @param array $data
213*e5d0cb92SSascha Leib */
214*e5d0cb92SSascha Leibfunction _my_metaheaders_action($data) {
215*e5d0cb92SSascha Leib    foreach($data as $tag => $inst) {
216*e5d0cb92SSascha Leib        foreach($inst as $attr) {
217*e5d0cb92SSascha Leib            if ( empty($attr) ) { continue; }
218*e5d0cb92SSascha Leib            echo "\t<", $tag, ' ', buildAttributes($attr);
219*e5d0cb92SSascha Leib            if(isset($attr['_data']) || $tag == 'script') {
220*e5d0cb92SSascha Leib                if($tag == 'script' && $attr['_data'])
221*e5d0cb92SSascha Leib                    $attr['_data'] = "/*<![CDATA[*/".
222*e5d0cb92SSascha Leib                        $attr['_data'].
223*e5d0cb92SSascha Leib                        "\n/*!]]>*/";
224*e5d0cb92SSascha Leib
225*e5d0cb92SSascha Leib                echo '>', $attr['_data'], '</', $tag, '>';
226*e5d0cb92SSascha Leib            } else {
227*e5d0cb92SSascha Leib                echo '/>';
228*e5d0cb92SSascha Leib            }
229*e5d0cb92SSascha Leib            echo "\n";
230*e5d0cb92SSascha Leib        }
231*e5d0cb92SSascha Leib    }
232*e5d0cb92SSascha Leib}
233*e5d0cb92SSascha Leib
234*e5d0cb92SSascha Leib/**
235*e5d0cb92SSascha Leib * Print the breadcrumbs trace
236*e5d0cb92SSascha Leib *
237*e5d0cb92SSascha Leib * Cleanup of the original code to create neater and more accessible HTML
238*e5d0cb92SSascha Leib *
239*e5d0cb92SSascha Leib * @author Sascha Leib <sascha@leib.be>
240*e5d0cb92SSascha Leib * @author Andreas Gohr <andi@splitbrain.org>
241*e5d0cb92SSascha Leib *
242*e5d0cb92SSascha Leib * @param string $prefix inserted before each line
243*e5d0cb92SSascha Leib *
244*e5d0cb92SSascha Leib * @return void
245*e5d0cb92SSascha Leib */
246*e5d0cb92SSascha Leibfunction my_breadcrumbs($prefix = '') {
247*e5d0cb92SSascha Leib    global $lang;
248*e5d0cb92SSascha Leib    global $conf;
249*e5d0cb92SSascha Leib
250*e5d0cb92SSascha Leib    //check if enabled
251*e5d0cb92SSascha Leib    if(!$conf['breadcrumbs']) return false;
252*e5d0cb92SSascha Leib
253*e5d0cb92SSascha Leib    $crumbs = breadcrumbs(); //setup crumb trace
254*e5d0cb92SSascha Leib
255*e5d0cb92SSascha Leib	/* begin listing */
256*e5d0cb92SSascha Leib	echo $prefix . "<nav id=\"navBreadCrumbs\">\n";
257*e5d0cb92SSascha Leib	echo $prefix . "\t<h4>" . $lang['breadcrumb'] . "</h4>\n";
258*e5d0cb92SSascha Leib	echo $prefix . "\t<ol reversed>\n";
259*e5d0cb92SSascha Leib
260*e5d0cb92SSascha Leib    $last = count($crumbs);
261*e5d0cb92SSascha Leib    $i    = 0;
262*e5d0cb92SSascha Leib    foreach($crumbs as $id => $name) {
263*e5d0cb92SSascha Leib        $i++;
264*e5d0cb92SSascha Leib		echo $prefix . "\t\t<li" . ($i == $last ? ' class="current"' : '') . '><bdi>' . tpl_link(wl($id), hsc($name), '', true) .  "</bdi></li>\n";
265*e5d0cb92SSascha Leib    }
266*e5d0cb92SSascha Leib	echo $prefix . "\t</ol>\n";
267*e5d0cb92SSascha Leib	echo $prefix . "</nav>\n";
268*e5d0cb92SSascha Leib}
269*e5d0cb92SSascha Leib
270*e5d0cb92SSascha Leib/**
271*e5d0cb92SSascha Leib * Hierarchical breadcrumbs
272*e5d0cb92SSascha Leib *
273*e5d0cb92SSascha Leib * Cleanup of the original code to create neater and more accessible HTML
274*e5d0cb92SSascha Leib *
275*e5d0cb92SSascha Leib * @author Sascha Leib <sascha@leib.be>
276*e5d0cb92SSascha Leib * @author Andreas Gohr <andi@splitbrain.org>
277*e5d0cb92SSascha Leib * @author Nigel McNie <oracle.shinoda@gmail.com>
278*e5d0cb92SSascha Leib * @author Sean Coates <sean@caedmon.net>
279*e5d0cb92SSascha Leib * @author <fredrik@averpil.com>
280*e5d0cb92SSascha Leib *
281*e5d0cb92SSascha Leib * @param  string $prefix to be added before each line
282*e5d0cb92SSascha Leib *
283*e5d0cb92SSascha Leib */
284*e5d0cb92SSascha Leibfunction my_youarehere($prefix = '') {
285*e5d0cb92SSascha Leib    global $conf;
286*e5d0cb92SSascha Leib    global $ID;
287*e5d0cb92SSascha Leib    global $lang;
288*e5d0cb92SSascha Leib
289*e5d0cb92SSascha Leib    // check if enabled
290*e5d0cb92SSascha Leib    if(!$conf['youarehere']) return false;
291*e5d0cb92SSascha Leib
292*e5d0cb92SSascha Leib    $parts = explode(':', $ID);
293*e5d0cb92SSascha Leib    $count = count($parts);
294*e5d0cb92SSascha Leib
295*e5d0cb92SSascha Leib	echo $prefix . "<nav id=\"navYouAreHere\">\n";
296*e5d0cb92SSascha Leib	echo $prefix . "\t<h4>" . $lang['youarehere'] . "</h4>\n";
297*e5d0cb92SSascha Leib	echo $prefix . "\t<ol>\n";
298*e5d0cb92SSascha Leib
299*e5d0cb92SSascha Leib    // always print the startpage
300*e5d0cb92SSascha Leib    echo $prefix . "\t\t<li class=\"home\">" . tpl_pagelink(':'.$conf['start'], null, true) . "</li>\n";
301*e5d0cb92SSascha Leib
302*e5d0cb92SSascha Leib    // print intermediate namespace links
303*e5d0cb92SSascha Leib    $part = '';
304*e5d0cb92SSascha Leib    for($i = 0; $i < $count - 1; $i++) {
305*e5d0cb92SSascha Leib        $part .= $parts[$i].':';
306*e5d0cb92SSascha Leib        $page = $part;
307*e5d0cb92SSascha Leib        if($page == $conf['start']) continue; // Skip startpage
308*e5d0cb92SSascha Leib
309*e5d0cb92SSascha Leib        // output
310*e5d0cb92SSascha Leib        echo $prefix . "\t\t<li>" . tpl_pagelink($page, null, true) . "</li>\n";
311*e5d0cb92SSascha Leib    }
312*e5d0cb92SSascha Leib
313*e5d0cb92SSascha Leib    // print current page, skipping start page, skipping for namespace index
314*e5d0cb92SSascha Leib    /* resolve_pageid('', $page, $exists);
315*e5d0cb92SSascha Leib    if ( !(isset($page) && $page == $part.$parts[$i])
316*e5d0cb92SSascha Leib		|| !($page == $conf['start']) ) {
317*e5d0cb92SSascha Leib		echo "\t\t\t\t\t<li>" . tpl_pagelink($page, null, true) . "</li>\n";
318*e5d0cb92SSascha Leib	} */
319*e5d0cb92SSascha Leib
320*e5d0cb92SSascha Leib	echo $prefix . "\t</ol>\n";
321*e5d0cb92SSascha Leib	echo $prefix . "</nav>\n";
322*e5d0cb92SSascha Leib}
323*e5d0cb92SSascha Leib
324*e5d0cb92SSascha Leib/**
325*e5d0cb92SSascha Leib * My implementation of the basic userinfo (in the global banner)
326*e5d0cb92SSascha Leib *
327*e5d0cb92SSascha Leib *
328*e5d0cb92SSascha Leib * @author Sascha Leib <sascha@leib.be>
329*e5d0cb92SSascha Leib *
330*e5d0cb92SSascha Leib * @param  string $prefix to be added before each line
331*e5d0cb92SSascha Leib *
332*e5d0cb92SSascha Leib * @return void
333*e5d0cb92SSascha Leib */
334*e5d0cb92SSascha Leibfunction my_userinfo($prefix = '') {
335*e5d0cb92SSascha Leib    global $lang;
336*e5d0cb92SSascha Leib    global $INPUT;
337*e5d0cb92SSascha Leib
338*e5d0cb92SSascha Leib	// add login/logout button:
339*e5d0cb92SSascha Leib	$items = (new \dokuwiki\Menu\UserMenu())->getItems();
340*e5d0cb92SSascha Leib	foreach($items as $it) {
341*e5d0cb92SSascha Leib		$typ = $it->getType();
342*e5d0cb92SSascha Leib		if ($typ === 'profile') {
343*e5d0cb92SSascha Leib			echo $prefix . "<li class=\"action $typ\"><span class=\"sronly\">" . $lang['loggedinas'] . ' </span>' . userlink() . "</li>\n";
344*e5d0cb92SSascha Leib		} else {
345*e5d0cb92SSascha Leib			echo $prefix . "<li class=\"action $typ\"><a href=\"" . htmlentities($it->getLink()) . '" title="' . $it->getTitle() . '">' . $it->getLabel() . "</a></li>\n";
346*e5d0cb92SSascha Leib		}
347*e5d0cb92SSascha Leib	}
348*e5d0cb92SSascha Leib
349*e5d0cb92SSascha Leib}
350*e5d0cb92SSascha Leib
351*e5d0cb92SSascha Leib/**
352*e5d0cb92SSascha Leib *Inserts a cleaner version of the TOC
353*e5d0cb92SSascha Leib *
354*e5d0cb92SSascha Leib * This is an update of the original function that renders the TOC directly.
355*e5d0cb92SSascha Leib *
356*e5d0cb92SSascha Leib * @author Sascha Leib <sascha@leib.be>
357*e5d0cb92SSascha Leib * @author Andreas Gohr <andi@splitbrain.org>
358*e5d0cb92SSascha Leib *
359*e5d0cb92SSascha Leib * @param  string $prefix to be added before each line
360*e5d0cb92SSascha Leib *
361*e5d0cb92SSascha Leib * @return void
362*e5d0cb92SSascha Leib */
363*e5d0cb92SSascha Leibfunction my_toc($prefix = '') {
364*e5d0cb92SSascha Leib    global $TOC;
365*e5d0cb92SSascha Leib    global $ACT;
366*e5d0cb92SSascha Leib    global $ID;
367*e5d0cb92SSascha Leib    global $REV;
368*e5d0cb92SSascha Leib    global $INFO;
369*e5d0cb92SSascha Leib    global $conf;
370*e5d0cb92SSascha Leib    global $lang;
371*e5d0cb92SSascha Leib    $toc = array();
372*e5d0cb92SSascha Leib
373*e5d0cb92SSascha Leib    if(is_array($TOC)) {
374*e5d0cb92SSascha Leib        // if a TOC was prepared in global scope, always use it
375*e5d0cb92SSascha Leib        $toc = $TOC;
376*e5d0cb92SSascha Leib    } elseif(($ACT == 'show' || substr($ACT, 0, 6) == 'export') && !$REV && $INFO['exists']) {
377*e5d0cb92SSascha Leib        // get TOC from metadata, render if neccessary
378*e5d0cb92SSascha Leib        $meta = p_get_metadata($ID, '', METADATA_RENDER_USING_CACHE);
379*e5d0cb92SSascha Leib        if(isset($meta['internal']['toc'])) {
380*e5d0cb92SSascha Leib            $tocok = $meta['internal']['toc'];
381*e5d0cb92SSascha Leib        } else {
382*e5d0cb92SSascha Leib            $tocok = true;
383*e5d0cb92SSascha Leib        }
384*e5d0cb92SSascha Leib        $toc = isset($meta['description']['tableofcontents']) ? $meta['description']['tableofcontents'] : null;
385*e5d0cb92SSascha Leib        if(!$tocok || !is_array($toc) || !$conf['tocminheads'] || count($toc) < $conf['tocminheads']) {
386*e5d0cb92SSascha Leib            $toc = array();
387*e5d0cb92SSascha Leib        }
388*e5d0cb92SSascha Leib    } elseif($ACT == 'admin') {
389*e5d0cb92SSascha Leib        // try to load admin plugin TOC
390*e5d0cb92SSascha Leib        /** @var $plugin AdminPlugin */
391*e5d0cb92SSascha Leib        if ($plugin = plugin_getRequestAdminPlugin()) {
392*e5d0cb92SSascha Leib            $toc = $plugin->getTOC();
393*e5d0cb92SSascha Leib            $TOC = $toc; // avoid later rebuild
394*e5d0cb92SSascha Leib        }
395*e5d0cb92SSascha Leib    }
396*e5d0cb92SSascha Leib
397*e5d0cb92SSascha Leib	/* Build the hierarchical list of headline links: */
398*e5d0cb92SSascha Leib	if (count($toc) >= intval($conf['tocminheads'])) {
399*e5d0cb92SSascha Leib		echo $prefix . "<aside id=\"toc\" class=\"toggle hide\">\n";
400*e5d0cb92SSascha Leib		echo $prefix . "\t<h3 class=\"tg_button\" title=\"" . htmlentities($lang['toc']) . '"><span>' . htmlentities($lang['toc']) . "</span></h3>\n" . $prefix . "\t<div class=\"tg_content\">";
401*e5d0cb92SSascha Leib		$level = intval("0");
402*e5d0cb92SSascha Leib		foreach($toc as $it) {
403*e5d0cb92SSascha Leib
404*e5d0cb92SSascha Leib			$nl = intval($it['level']);
405*e5d0cb92SSascha Leib			$cp = ($nl <=> $level);
406*e5d0cb92SSascha Leib
407*e5d0cb92SSascha Leib			if ($cp > 0) {
408*e5d0cb92SSascha Leib				echo "\n" . $prefix . str_repeat("\t", $level*2 + 2) . "<ol>\n";
409*e5d0cb92SSascha Leib			} else if ($cp < 0) {
410*e5d0cb92SSascha Leib				echo "\n" . $prefix . str_repeat("\t", $level*2) . "</ol></li>\n";
411*e5d0cb92SSascha Leib			} else {
412*e5d0cb92SSascha Leib				echo "</li>\n";
413*e5d0cb92SSascha Leib			}
414*e5d0cb92SSascha Leib
415*e5d0cb92SSascha Leib			echo $prefix . str_repeat("\t", $nl*2 + 1) . "<li><a href=\"#" . $it['hid'] . '">' . htmlentities($it['title']) . "</a>";
416*e5d0cb92SSascha Leib			$level = $nl;
417*e5d0cb92SSascha Leib		}
418*e5d0cb92SSascha Leib
419*e5d0cb92SSascha Leib		for ($i = $level-1; $i > 0; $i--) {
420*e5d0cb92SSascha Leib			echo "</li>\n" . $prefix . str_repeat("\t", $i*2 + 1) . "</ol>";
421*e5d0cb92SSascha Leib		}
422*e5d0cb92SSascha Leib
423*e5d0cb92SSascha Leib		echo "</li>\n" . $prefix . "\t\t</ol>\n" . $prefix . "\t</div>\n" . $prefix . "</aside>\n";
424*e5d0cb92SSascha Leib	}
425*e5d0cb92SSascha Leib}
426*e5d0cb92SSascha Leib
427*e5d0cb92SSascha Leib/**
428*e5d0cb92SSascha Leib * Print last change date
429*e5d0cb92SSascha Leib *
430*e5d0cb92SSascha Leib * @author Sascha Leib <sascha@leib.be>
431*e5d0cb92SSascha Leib *
432*e5d0cb92SSascha Leib * @param  string $prefix to be added before each line
433*e5d0cb92SSascha Leib *
434*e5d0cb92SSascha Leib * @return void
435*e5d0cb92SSascha Leib */
436*e5d0cb92SSascha Leibfunction my_lastchange($prefix = '') {
437*e5d0cb92SSascha Leib
438*e5d0cb92SSascha Leib    global $lang;
439*e5d0cb92SSascha Leib    global $INFO;
440*e5d0cb92SSascha Leib
441*e5d0cb92SSascha Leib	$format = '%Y-%m-%dT%T%z';	/* e.g. 2021-21-05T16:45:12+02:00 */
442*e5d0cb92SSascha Leib
443*e5d0cb92SSascha Leib	$date = $INFO['lastmod'];
444*e5d0cb92SSascha Leib
445*e5d0cb92SSascha Leib	echo $prefix . '<bdi>' . $lang['lastmod'] . "</bdi>\n";
446*e5d0cb92SSascha Leib	echo $prefix . '<time datetime="' . strftime($format, $date) . '">' . dformat($date) . "</time>\n";
447*e5d0cb92SSascha Leib
448*e5d0cb92SSascha Leib	/* user name for last change (is this really interesting to the visitor?) */
449*e5d0cb92SSascha Leib	/* echo $prefix .'<span class="editorname" tabindex="0">' . $lang['by'] . ' <bdi>' . editorinfo($INFO['editor']) . "</bdi></span>\n"; */
450*e5d0cb92SSascha Leib}
451*e5d0cb92SSascha Leib
452*e5d0cb92SSascha Leib/**
453*e5d0cb92SSascha Leib * Returns a description list of the metatags of the current image
454*e5d0cb92SSascha Leib *
455*e5d0cb92SSascha Leib * @return string html of description list
456*e5d0cb92SSascha Leib */
457*e5d0cb92SSascha Leibfunction my_img_meta($prefix = '') {
458*e5d0cb92SSascha Leib    global $lang;
459*e5d0cb92SSascha Leib
460*e5d0cb92SSascha Leib	$format = '%Y-%m-%dT%T%z';	/* e.g. 2021-21-05T16:45:12+02:00 */
461*e5d0cb92SSascha Leib
462*e5d0cb92SSascha Leib    $tags = tpl_get_img_meta();
463*e5d0cb92SSascha Leib
464*e5d0cb92SSascha Leib    foreach($tags as $tag) {
465*e5d0cb92SSascha Leib        $label = $lang[$tag['langkey']];
466*e5d0cb92SSascha Leib        if(!$label) $label = $tag['langkey'] . ':';
467*e5d0cb92SSascha Leib
468*e5d0cb92SSascha Leib        echo $prefix . '<tr><th>'.$label.'</th><td>';
469*e5d0cb92SSascha Leib        if ($tag['type'] == 'date') {
470*e5d0cb92SSascha Leib            echo '<time datetime="' . strftime($format, $tag['value']) . '">' . dformat($tag['value']) . '</time>';
471*e5d0cb92SSascha Leib        } else {
472*e5d0cb92SSascha Leib            echo hsc($tag['value']);
473*e5d0cb92SSascha Leib        }
474*e5d0cb92SSascha Leib        echo "</td></tr>\n";
475*e5d0cb92SSascha Leib    }
476*e5d0cb92SSascha Leib}
477*e5d0cb92SSascha Leib
478*e5d0cb92SSascha Leib/**
479*e5d0cb92SSascha Leib * Creates the Site logo image link
480*e5d0cb92SSascha Leib *
481*e5d0cb92SSascha Leib */
482*e5d0cb92SSascha Leibfunction my_sitelogo() {
483*e5d0cb92SSascha Leib    global $conf;
484*e5d0cb92SSascha Leib
485*e5d0cb92SSascha Leib	// get logo either out of the template images folder or data/media folder
486*e5d0cb92SSascha Leib	$logoSize = array();
487*e5d0cb92SSascha Leib	$logo = tpl_getMediaFile(array(':logo.svg', ':wiki:logo.svg', ':logo.png', ':wiki:logo.png', 'images/sitelogo.svg'), false, $logoSize);
488*e5d0cb92SSascha Leib	tpl_link( wl(),
489*e5d0cb92SSascha Leib		'<img src="'.$logo.'" ' . $logoSize[3] . ' alt="' . htmlentities($conf['title']) . '" />', 'accesskey="h" title="[H]" class="logo"');
490*e5d0cb92SSascha Leib}
491*e5d0cb92SSascha Leib
492*e5d0cb92SSascha Leib/**
493*e5d0cb92SSascha Leib * Creates the various favicon and similar links:
494*e5d0cb92SSascha Leib *
495*e5d0cb92SSascha Leib * @param  string $color overwrite the theme color.
496*e5d0cb92SSascha Leib *
497*e5d0cb92SSascha Leib * @return null
498*e5d0cb92SSascha Leib */
499*e5d0cb92SSascha Leibfunction my_favicons($color = null) {
500*e5d0cb92SSascha Leib
501*e5d0cb92SSascha Leib	$logoSize = array();
502*e5d0cb92SSascha Leib
503*e5d0cb92SSascha Leib	// Theme color:
504*e5d0cb92SSascha Leib	if ($color == null) {
505*e5d0cb92SSascha Leib
506*e5d0cb92SSascha Leib		/* get the style config */
507*e5d0cb92SSascha Leib		$styleUtil = new \dokuwiki\StyleUtils();
508*e5d0cb92SSascha Leib		$styleIni = $styleUtil->cssStyleini();
509*e5d0cb92SSascha Leib		$replacements = $styleIni['replacements'];
510*e5d0cb92SSascha Leib		$color = $replacements['__theme_color__x'];
511*e5d0cb92SSascha Leib
512*e5d0cb92SSascha Leib		if ($color== null) { $color = '#2b73b7'; }
513*e5d0cb92SSascha Leib	}
514*e5d0cb92SSascha Leib	echo "\t<meta name=\"theme-color\" content=\"" . $color . "\" />\n";
515*e5d0cb92SSascha Leib
516*e5d0cb92SSascha Leib	// get the favicon:
517*e5d0cb92SSascha Leib	$link = tpl_getMediaFile(array(':favicon.ico', ':favicon.png', ':favicon.svg', ':wiki:favicon.ico', ':wiki:favicon.png', ':wiki:favicon.svg'), false, $logoSize);
518*e5d0cb92SSascha Leib	echo "\t<link rel=\"icon\" href=\"" . $link . "\" />\n";
519*e5d0cb92SSascha Leib
520*e5d0cb92SSascha Leib	// Apple Touch Icon
521*e5d0cb92SSascha Leib	$logoSize = array();
522*e5d0cb92SSascha Leib	$link = tpl_getMediaFile(array(':apple-touch-icon.png', ':wiki:apple-touch-icon.png', 'images/apple-touch-icon.png'), false, $logoSize);
523*e5d0cb92SSascha Leib	echo "\t<link rel=\"apple-touch-icon\" href=\"" . $link . "\" />\n";
524*e5d0cb92SSascha Leib
525*e5d0cb92SSascha Leib}