1 <?php
2 /**
3  * Breadcrumb (Deluxe) Plugin: a replacement for the internal breadcumb
4  *
5  * @license  GPL 2 (http://www.gnu.org/licenses/gpl.html)
6  * @author   Bjoern Ellebrecht <dokuwiki.development@c0de8.com>
7  *
8  * @noinspection PhpUnused,
9  *               PhpMissingParamTypeInspection, PhpMissingReturnTypeInspection
10  */
11 
12 // must be run within Dokuwiki
13 use dokuwiki\File\PageResolver;
14 
15 if(!defined('DOKU_INC')) {
16     die();
17 }
18 
19 class syntax_plugin_breadcrumbdeluxe extends DokuWiki_Syntax_Plugin
20 {
21     final public function getType(): string
22     {
23         return 'substition';
24     }
25 
26     final public function getPType(): string {
27         return 'normal';
28     }
29 
30     final public function getSort(): string {
31         return 1;
32     }
33 
34     final public function handle($match, $state, $pos, Doku_Handler $handler): bool
35     {
36         return true;
37     }
38 
39     final public function render($format, Doku_Renderer $renderer, $data): void
40     {
41     }
42 
43     /**
44      * Hierarchical breadcrumbs (Deluxe))  {copied from original dokuwiki and modified}
45      *
46      * This code was suggested as replacement for the usual breadcrumbs.
47      * It only makes sense with a deep site structure.
48      *
49      * @param ?string $separator Separator between entries
50      * @param bool $return return or print
51      * @return bool|string
52      */
53     final public function tpl_youarehere(?string $separator = null, bool $return = false) {
54         global $conf;
55         global $ID;
56         global $lang;
57 
58         // check if enabled
59         if ($this->isBreadcrumbDisabled()) {
60             return false;
61         }
62 
63         // set default
64         if ($separator === null) {
65             $separator = ' ยป ';
66         }
67 
68         $out = '';
69 
70         $parts = explode(':', $ID);
71         $count = count($parts);
72 
73         // display label (you are here) for breadcrumb
74         $out .= '<span class="bchead">' . $lang['youarehere'] . ' </span>';
75 
76         // always print the startpage
77         $out .= '<span class="home">' . tpl_pagelink(':' . ucfirst($conf['start']), null, true) . '</span>';
78 
79         // print intermediate namespace links
80         $part = '';
81         for ($i = 0; $i < $count - 1; $i++) {
82             $part .= $parts[$i] . ':';
83             $page = $part;
84             if ($page == $conf['start']) continue; // Skip startpage
85 
86             // output
87             $out .= $separator . tpl_pagelink($page, p_get_first_heading($parts[$i]), true);
88         }
89 
90         // print current page, skipping start page, skipping for namespace index
91         if (isset($page)) {
92             $page = (new PageResolver('root'))->resolveId($page);
93             if ($page == $part . $parts[$i]) {
94                 if ($return) return $out;
95                 echo $out;
96                 return true;
97             }
98         }
99         $page = $part . $parts[$i];
100         if ($page == $conf['start']) {
101             if ($return) return $out;
102             echo $out;
103             return true;
104         }
105 
106         $out .= $separator;
107         $out .= tpl_pagelink($page, p_get_first_heading($page), true);
108 
109         if ($return) {
110             return $out;
111         }
112 
113         echo $out;
114 
115         return (bool)$out;
116     }
117 
118     private function isBreadcrumbDisabled(): bool
119     {
120         global $conf;
121 
122         return (bool) !$conf['youarehere'];
123     }
124 }
125