xref: /template/mikio/mikio.php (revision 3a385f2c6526f6730bd0dd79de3d7e0530ef029d)
1c165b184SJames Collins<?php
210b40067Snomadjimbob
3c165b184SJames Collins/**
4c165b184SJames Collins * DokuWiki Mikio Template
5c165b184SJames Collins *
6c165b184SJames Collins * @link    http://dokuwiki.org/template:mikio
7c165b184SJames Collins * @author  James Collins <james.collins@outlook.com.au>
8ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html)
9c165b184SJames Collins */
1010b40067Snomadjimbob
11ab45ba71SJames Collinsnamespace dokuwiki\template\mikio;
12c165b184SJames Collins
139cff245bSJames Collinsif (defined('DOKU_INC') === false) {
149cff245bSJames Collins    die();
159cff245bSJames Collins}
16c165b184SJames Collins
17ab45ba71SJames Collinsrequire_once('icons/icons.php');
18c165b184SJames Collinsrequire_once('inc/simple_html_dom.php');
19c165b184SJames Collins
2010b40067Snomadjimbobclass Template
2110b40067Snomadjimbob{
229cff245bSJames Collins    /**
239cff245bSJames Collins     * @var string Template directory path from local FS.
249cff245bSJames Collins     */
25c165b184SJames Collins    public $tplDir  = '';
269cff245bSJames Collins
279cff245bSJames Collins    /**
289cff245bSJames Collins     * @var string Template directory path from web.
299cff245bSJames Collins     */
30c165b184SJames Collins    public $baseDir = '';
319cff245bSJames Collins
329cff245bSJames Collins    /**
339cff245bSJames Collins     * @var array Array of Javascript files to include in footer.
349cff245bSJames Collins     */
359cff245bSJames Collins    public $footerScript = [];
369cff245bSJames Collins
379cff245bSJames Collins    /**
389cff245bSJames Collins     * @var boolean Ignore LESS files.
399cff245bSJames Collins     */
40a8df40efSJames Collins    public $lessIgnored = false;
41c165b184SJames Collins
42c165b184SJames Collins
43c165b184SJames Collins    /**
44c165b184SJames Collins     * Class constructor
45c165b184SJames Collins     */
4610b40067Snomadjimbob    public function __construct()
4710b40067Snomadjimbob    {
48c165b184SJames Collins        $this->tplDir  = tpl_incdir();
49c165b184SJames Collins        $this->baseDir = tpl_basedir();
50c165b184SJames Collins
519cff245bSJames Collins        $this->registerHooks();
52c165b184SJames Collins    }
53c165b184SJames Collins
54c165b184SJames Collins
55c165b184SJames Collins    /**
56ab45ba71SJames Collins     * Returns the instance of the class
5747161538SJames Collins     *
58ab45ba71SJames Collins     * @return  Template        class instance
5947161538SJames Collins     */
6047161538SJames Collins    public static function getInstance()
6147161538SJames Collins    {
6247161538SJames Collins        static $instance = null;
6347161538SJames Collins
64*3a385f2cSJames Collins        if (empty($instance) === true) {
6547161538SJames Collins            $instance = new Template();
6647161538SJames Collins        }
6747161538SJames Collins
6847161538SJames Collins        return $instance;
6947161538SJames Collins    }
7047161538SJames Collins
71ab45ba71SJames Collins
7247161538SJames Collins    /**
73ab45ba71SJames Collins     * Register the themes hooks into Dokuwiki
749cff245bSJames Collins     *
759cff245bSJames Collins     * @return void
76c165b184SJames Collins     */
779cff245bSJames Collins    private function registerHooks()
7810b40067Snomadjimbob    {
79c165b184SJames Collins        global $EVENT_HANDLER;
80c165b184SJames Collins
819cff245bSJames Collins        $events_dispatcher = [
82ab45ba71SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler'
839cff245bSJames Collins        ];
84c165b184SJames Collins
85c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
86c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
87c165b184SJames Collins        }
88c165b184SJames Collins    }
89c165b184SJames Collins
90c165b184SJames Collins
91c165b184SJames Collins    /**
92ab45ba71SJames Collins     * Meta handler hook for DokuWiki
93c165b184SJames Collins     *
949cff245bSJames Collins     * @param   \Doku_Event $event DokuWiki Event.
959cff245bSJames Collins     * @return  void
96c165b184SJames Collins     */
9710b40067Snomadjimbob    public function metaHeadersHandler(\Doku_Event $event)
9810b40067Snomadjimbob    {
99ab45ba71SJames Collins        global $MIKIO_ICONS;
100b5536b07SChris MacMackin        global $conf;
101ab45ba71SJames Collins
1029cff245bSJames Collins        $this->includePage('theme', false, true);
103a8eebd82SJames Collins
1049cff245bSJames Collins        $stylesheets    = [];
1059cff245bSJames Collins        $scripts        = [];
106c165b184SJames Collins
107*3a385f2cSJames Collins        if (empty($this->getConf('customTheme')) === false) {
1089cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) {
109a8eebd82SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less';
110a8eebd82SJames Collins            } else {
1119cff245bSJames Collins                if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) {
112ab45ba71SJames Collins                    $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css';
1132b4583abSJames Collins                }
114a8eebd82SJames Collins            }
1159cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) {
116ab45ba71SJames Collins                $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js';
117c165b184SJames Collins            }
118c165b184SJames Collins        }
119c165b184SJames Collins
120*3a385f2cSJames Collins        if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) {
1219cff245bSJames Collins            $icons = [];
122ab45ba71SJames Collins            foreach ($MIKIO_ICONS as $icon) {
1239cff245bSJames Collins                if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) {
124ab45ba71SJames Collins                    $icons[] = $icon;
125c165b184SJames Collins
126*3a385f2cSJames Collins                    if (empty($icon['css']) === false) {
1279cff245bSJames Collins                        if (strpos($icon['css'], '//') === false) {
128a8eebd82SJames Collins                            $stylesheets[] = $this->baseDir . 'icons/' . $icon['css'];
129ab45ba71SJames Collins                        } else {
130a8eebd82SJames Collins                            $stylesheets[] = $icon['css'];
131ab45ba71SJames Collins                        }
132ab45ba71SJames Collins                    }
133ab45ba71SJames Collins                }
134ab45ba71SJames Collins            }
135ab45ba71SJames Collins            $MIKIO_ICONS = $icons;
136ab45ba71SJames Collins        } else {
137ab45ba71SJames Collins            $MIKIO_ICONS = [];
138ab45ba71SJames Collins        }
139c165b184SJames Collins
1407864545bSChris MacMackin        $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js';
141ab45ba71SJames Collins        $scripts[] = $this->baseDir . 'assets/mikio.js';
142644fd9f9SJames Collins
1439cff245bSJames Collins        if ($this->getConf('useLESS') === true) {
144ab45ba71SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.less';
145644fd9f9SJames Collins        } else {
146644fd9f9SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.css';
147644fd9f9SJames Collins        }
148644fd9f9SJames Collins
149ab45ba71SJames Collins
150ab45ba71SJames Collins        $set = [];
151c165b184SJames Collins        foreach ($stylesheets as $style) {
1529cff245bSJames Collins            if (in_array($style, $set) === false) {
153*3a385f2cSJames Collins                if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) {
154ab45ba71SJames Collins                    $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style);
155ab45ba71SJames Collins                }
156ab45ba71SJames Collins
1579cff245bSJames Collins                array_unshift($event->data['link'], [
158c165b184SJames Collins                    'type' => 'text/css',
159c165b184SJames Collins                    'rel'  => 'stylesheet',
160c165b184SJames Collins                    'href' => $style
1619cff245bSJames Collins                ]);
162c165b184SJames Collins            }
163ab45ba71SJames Collins            $set[] = $style;
164ab45ba71SJames Collins        }
165c165b184SJames Collins
166ab45ba71SJames Collins        $set = [];
167c165b184SJames Collins        foreach ($scripts as $script) {
1689cff245bSJames Collins            if (in_array($script, $set) === false) {
1699cff245bSJames Collins                $script_params = [
170c165b184SJames Collins                    'type'  => 'text/javascript',
171c165b184SJames Collins                    '_data' => '',
1728395cdcbSChris MacMackin                    'src'   => $script
1739cff245bSJames Collins                ];
174c1ecb866SJames Collins
175c1ecb866SJames Collins                // equal to or greator than hogfather
176c1ecb866SJames Collins                if ($this->dwVersionNumber() >= 20200729) {
177c1ecb866SJames Collins                    // greator than hogfather - defer always on
178c1ecb866SJames Collins                    if ($this->dwVersionNumber() >= 20200729) {
179c1ecb866SJames Collins                        $script_params += ['defer' => 'defer'];
180c1ecb866SJames Collins                    } else {
181c1ecb866SJames Collins                        // hogfather - defer always on unless $conf['defer_js'] is false
1829cff245bSJames Collins                        if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) {
1838395cdcbSChris MacMackin                            $script_params += ['defer' => 'defer'];
1848395cdcbSChris MacMackin                        }
185c1ecb866SJames Collins                    }
186c1ecb866SJames Collins                }
187c1ecb866SJames Collins
1888395cdcbSChris MacMackin                $event->data['script'][] = $script_params;
1899cff245bSJames Collins            }//end if
190ab45ba71SJames Collins            $set[] = $script;
1919cff245bSJames Collins        }//end foreach
192c165b184SJames Collins    }
193c165b184SJames Collins
194c165b184SJames Collins
195c165b184SJames Collins    /**
196a8eebd82SJames Collins     * Print or return the footer meta data
197c165b184SJames Collins     *
1989cff245bSJames Collins     * @param   boolean $print Print the data to buffer.
1999cff245bSJames Collins     * @return  string         HTML footer meta data
200c165b184SJames Collins     */
2019cff245bSJames Collins    public function includeFooterMeta(bool $print = true)
20210b40067Snomadjimbob    {
203a8eebd82SJames Collins        $html = '';
204a8eebd82SJames Collins
205a8eebd82SJames Collins        if (count($this->footerScript) > 0) {
206a8eebd82SJames Collins            $html .= '<script type="text/javascript">function mikioFooterRun() {';
207a8eebd82SJames Collins            foreach ($this->footerScript as $script) {
208a8eebd82SJames Collins                $html .= $script . ';';
209a8eebd82SJames Collins            }
210a8eebd82SJames Collins            $html .= '}</script>';
211a8eebd82SJames Collins        }
212c165b184SJames Collins
213c165b184SJames Collins
2149cff245bSJames Collins        if ($print === true) {
2159cff245bSJames Collins            echo $html;
2169cff245bSJames Collins        }
217a8eebd82SJames Collins        return $html;
218a8eebd82SJames Collins    }
219a8eebd82SJames Collins
220a8eebd82SJames Collins    /**
221ab45ba71SJames Collins     * Retreive and parse theme configuration options
222c165b184SJames Collins     *
2239cff245bSJames Collins     * @param   string $key     The configuration key to retreive.
2249cff245bSJames Collins     * @param   mixed  $default If key doesn't exist, return this value.
225ab45ba71SJames Collins     * @return  mixed           parsed value of configuration
226c165b184SJames Collins     */
2279cff245bSJames Collins    public function getConf(string $key, mixed $default = false)
22810b40067Snomadjimbob    {
229c165b184SJames Collins        $value = tpl_getConf($key, $default);
230c165b184SJames Collins
231*3a385f2cSJames Collins        $data = [
232*3a385f2cSJames Collins            ['keys' => ['navbarDWMenuType'],                'type' => 'choice',
233*3a385f2cSJames Collins                'values' => ['both', 'icons', 'text']
234*3a385f2cSJames Collins            ],
235*3a385f2cSJames Collins            ['keys' => ['navbarDWMenuCombine'],             'type' => 'choice',
236*3a385f2cSJames Collins                'values' => ['combine', 'seperate', 'dropdown']
237*3a385f2cSJames Collins            ],
238*3a385f2cSJames Collins            ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'],
239*3a385f2cSJames Collins                'type' => 'choice',
240*3a385f2cSJames Collins                'values' => ['none', 'custom', 'search', 'dokuwiki'],
241*3a385f2cSJames Collins                'default' => [
242*3a385f2cSJames Collins                    'navbarPosLeft' => 'none',
243*3a385f2cSJames Collins                    'navbarPosMiddle' => 'search',
244*3a385f2cSJames Collins                    'navbarPosRight' => 'dokuwiki'
245*3a385f2cSJames Collins                ]
246*3a385f2cSJames Collins            ],
247*3a385f2cSJames Collins            ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink',
248*3a385f2cSJames Collins                'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile',
249*3a385f2cSJames Collins                'navbarItemShowAdmin'
250*3a385f2cSJames Collins            ],
251*3a385f2cSJames Collins                'type' => 'choice',
252*3a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
253*3a385f2cSJames Collins            ],
254*3a385f2cSJames Collins            ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'],
255*3a385f2cSJames Collins                'type' => 'choice',
256*3a385f2cSJames Collins                'values' => ['always', 'never']
257*3a385f2cSJames Collins            ],
258*3a385f2cSJames Collins            ['keys' => ['searchButton'],                    'type' => 'choice',
259*3a385f2cSJames Collins                'values' => ['icon', 'text']
260*3a385f2cSJames Collins            ],
261*3a385f2cSJames Collins            ['keys' => ['breadcrumbPosition', 'youareherePosition'],
262*3a385f2cSJames Collins                'type' => 'choice',
263*3a385f2cSJames Collins                'values' => ['top', 'hero', 'page', 'none']
264*3a385f2cSJames Collins            ],
265*3a385f2cSJames Collins            ['keys' => ['youarehereHome'],                  'type' => 'choice',
266*3a385f2cSJames Collins                'values' => ['page title', 'home', 'icon', 'none']
267*3a385f2cSJames Collins            ],
268*3a385f2cSJames Collins            ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'],
269*3a385f2cSJames Collins                'type' => 'choice',
270*3a385f2cSJames Collins                'values' => ['none', 'logged in user', 'search', 'content', 'tags'],
271*3a385f2cSJames Collins                'default' => [
272*3a385f2cSJames Collins                    'sidebarLeftRow1' => 'logged in user',
273*3a385f2cSJames Collins                    'sidebarLeftRow2' => 'search',
274*3a385f2cSJames Collins                    'sidebarLeftRow3' => 'content'
275*3a385f2cSJames Collins                ]
276*3a385f2cSJames Collins            ],
277*3a385f2cSJames Collins            ['keys' => ['pageToolsFloating', 'pageToolsFooter'],
278*3a385f2cSJames Collins                'type' => 'choice',
279*3a385f2cSJames Collins                'values' => ['always', 'none', 'page editors']
280*3a385f2cSJames Collins            ],
281*3a385f2cSJames Collins            ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink',
282*3a385f2cSJames Collins                'pageToolsShowTop'
283*3a385f2cSJames Collins            ],
284*3a385f2cSJames Collins                'type' => 'choice',
285*3a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
286*3a385f2cSJames Collins            ],
287*3a385f2cSJames Collins            ['keys' => ['showNotifications'],               'type' => 'choice',
288*3a385f2cSJames Collins                'values' => ['admin', 'always', 'none']
289*3a385f2cSJames Collins            ],
290*3a385f2cSJames Collins            ['keys' => ['licenseType'],                     'type' => 'choice',
291*3a385f2cSJames Collins                'values' => ['badge', 'button', 'none']
292*3a385f2cSJames Collins            ],
293*3a385f2cSJames Collins            ['keys' => ['navbarUseTitleIcon'],              'type' => 'bool'],
294*3a385f2cSJames Collins            ['keys' => ['navbarUseTitleText'],              'type' => 'bool'],
295*3a385f2cSJames Collins            ['keys' => ['navbarUseTaglineText'],            'type' => 'bool'],
296*3a385f2cSJames Collins            ['keys' => ['navbarShowSub'],                   'type' => 'bool'],
297*3a385f2cSJames Collins            ['keys' => ['heroTitle'],                       'type' => 'bool'],
298*3a385f2cSJames Collins            ['keys' => ['heroImagePropagation'],            'type' => 'bool'],
299*3a385f2cSJames Collins            ['keys' => ['breadcrumbPrefix'],                'type' => 'bool'],
300*3a385f2cSJames Collins            ['keys' => ['breadcrumbSep'],                   'type' => 'bool'],
301*3a385f2cSJames Collins            ['keys' => ['youareherePrefix'],                'type' => 'bool'],
302*3a385f2cSJames Collins            ['keys' => ['youarehereSep'],                   'type' => 'bool'],
303*3a385f2cSJames Collins            ['keys' => ['sidebarShowLeft'],                 'type' => 'bool'],
304*3a385f2cSJames Collins            ['keys' => ['sidebarShowRight'],                'type' => 'bool'],
305*3a385f2cSJames Collins            ['keys' => ['tocFull'],                         'type' => 'bool'],
306*3a385f2cSJames Collins            ['keys' => ['footerSearch'],                    'type' => 'bool'],
307*3a385f2cSJames Collins            ['keys' => ['licenseImageOnly'],                'type' => 'bool'],
308*3a385f2cSJames Collins            ['keys' => ['includePageUseACL'],               'type' => 'bool'],
309*3a385f2cSJames Collins            ['keys' => ['includePagePropagate'],            'type' => 'bool'],
310*3a385f2cSJames Collins            ['keys' => ['youarehereHideHome'],              'type' => 'bool'],
311*3a385f2cSJames Collins            ['keys' => ['tagsConsolidate'],                 'type' => 'bool'],
312*3a385f2cSJames Collins            ['keys' => ['footerInPage'],                    'type' => 'bool'],
313*3a385f2cSJames Collins            ['keys' => ['sidebarMobileDefaultCollapse'],    'type' => 'bool'],
314*3a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowLeft'],           'type' => 'bool'],
315*3a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowRight'],          'type' => 'bool'],
316*3a385f2cSJames Collins            ['keys' => ['searchUseTypeahead'],              'type' => 'bool'],
317*3a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
318*3a385f2cSJames Collins
319*3a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
320*3a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
321*3a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
322*3a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
323*3a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
324*3a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
325*3a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
326*3a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
327*3a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
328*3a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
329*3a385f2cSJames Collins
330*3a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
331*3a385f2cSJames Collins        ];
332*3a385f2cSJames Collins
333*3a385f2cSJames Collins        foreach ($data as $row) {
334*3a385f2cSJames Collins            // does not check case....
335*3a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
336*3a385f2cSJames Collins                if (array_key_exists('type', 'row') === true) {
337*3a385f2cSJames Collins                    switch ($row['type']) {
338*3a385f2cSJames Collins                        case 'bool':
339*3a385f2cSJames Collins                            return (bool) $value;
340*3a385f2cSJames Collins                        case 'int':
341*3a385f2cSJames Collins                            return (int) $value;
342*3a385f2cSJames Collins                        case 'string':
343*3a385f2cSJames Collins                            return $value;
344*3a385f2cSJames Collins                        case 'less':
34529118ed7SJames Collins                            $value = (bool) $value;
346a8df40efSJames Collins                            $lessAvailable = true;
347a8df40efSJames Collins
348a8df40efSJames Collins                            // check for less library
349a8df40efSJames Collins                            $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
3509cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
351a8df40efSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3529cff245bSJames Collins                            }
3539cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
354a8df40efSJames Collins                                $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3559cff245bSJames Collins                            }
3569cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
3579cff245bSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] .
3589cff245bSJames Collins                                    '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3599cff245bSJames Collins                            }
3609cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
361a8df40efSJames Collins                                $lessAvailable = false;
362a8df40efSJames Collins                            }
363a8df40efSJames Collins
364a8df40efSJames Collins                            // check for ctype extensions
3659cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
366a8df40efSJames Collins                                $lessAvailable = false;
367a8df40efSJames Collins                            }
368a8df40efSJames Collins
3699cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
370a8df40efSJames Collins                                $this->lessIgnored = true;
37129118ed7SJames Collins                                $value = false;
37229118ed7SJames Collins                            }
373*3a385f2cSJames Collins
374*3a385f2cSJames Collins                            return $value;
3759cff245bSJames Collins                    }//end switch
376*3a385f2cSJames Collins                }//end if
377*3a385f2cSJames Collins
378*3a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
379*3a385f2cSJames Collins                    return $value;
380*3a385f2cSJames Collins                }
381*3a385f2cSJames Collins
382*3a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
383*3a385f2cSJames Collins                    if (is_array($row['default']) === true) {
384*3a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
385*3a385f2cSJames Collins                            return $row['default'][$key];
386*3a385f2cSJames Collins                        }
387*3a385f2cSJames Collins                    } else {
388*3a385f2cSJames Collins                        return $row['default'];
389*3a385f2cSJames Collins                    }
390*3a385f2cSJames Collins                }
391*3a385f2cSJames Collins
392*3a385f2cSJames Collins                return reset($row['values']);
393*3a385f2cSJames Collins            }//end if
394*3a385f2cSJames Collins        }//end foreach
395c165b184SJames Collins
396c165b184SJames Collins        return $value;
397c165b184SJames Collins    }
398c165b184SJames Collins
399c165b184SJames Collins
400c165b184SJames Collins    /**
401a8eebd82SJames Collins     * Check if a page exist in directory or namespace
402c165b184SJames Collins     *
4039cff245bSJames Collins     * @param   string $page Page/namespace to search.
404a8eebd82SJames Collins     * @return  boolean      if page exists
405c165b184SJames Collins     */
4069cff245bSJames Collins    public function pageExists(string $page)
40710b40067Snomadjimbob    {
408ab45ba71SJames Collins        ob_start();
409a8eebd82SJames Collins        tpl_includeFile($page . '.html');
410ab45ba71SJames Collins        $html = ob_get_contents();
411ab45ba71SJames Collins        ob_end_clean();
412a8eebd82SJames Collins
413*3a385f2cSJames Collins        if (empty($html) === false) {
4149cff245bSJames Collins            return true;
4159cff245bSJames Collins        }
416a8eebd82SJames Collins
417a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
418a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
419a8eebd82SJames Collins
4209cff245bSJames Collins        if ($propagate === true) {
4219cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4229cff245bSJames Collins                return true;
4239cff245bSJames Collins            }
4249cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4259cff245bSJames Collins            return true;
426ab45ba71SJames Collins        }
427ab45ba71SJames Collins
4289cff245bSJames Collins        return false;
429ab45ba71SJames Collins    }
430ab45ba71SJames Collins
431a8eebd82SJames Collins
432c165b184SJames Collins    /**
433a8eebd82SJames Collins     * Print or return page from directory or namespace
4342b4583abSJames Collins     *
4359cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4369cff245bSJames Collins     * @param   boolean $print        Print content.
4379cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4389cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
439ab45ba71SJames Collins     * @return  string                contents of page found
4402b4583abSJames Collins     */
4419cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4422b4583abSJames Collins    {
443a8eebd82SJames Collins        ob_start();
444a8eebd82SJames Collins        tpl_includeFile($page . '.html');
445a8eebd82SJames Collins        $html = ob_get_contents();
446a8eebd82SJames Collins        ob_end_clean();
447a8eebd82SJames Collins
448*3a385f2cSJames Collins        if (empty($html) === true) {
449a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
450a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
451ab45ba71SJames Collins            $html = '';
4522b4583abSJames Collins
453ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
454ab45ba71SJames Collins        }
4552b4583abSJames Collins
456*3a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
457ab45ba71SJames Collins            $html = $this->parseContent($html);
458ab45ba71SJames Collins        }
4592b4583abSJames Collins
460*3a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
4619cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
4629cff245bSJames Collins        }
4632b4583abSJames Collins
4649cff245bSJames Collins        if ($print === true) {
4659cff245bSJames Collins            echo $html;
4669cff245bSJames Collins        }
467ab45ba71SJames Collins        return $html;
4682b4583abSJames Collins    }
4692b4583abSJames Collins
470a8eebd82SJames Collins
471a8eebd82SJames Collins    /**
472a8eebd82SJames Collins     * Print or return logged in user information
473a8eebd82SJames Collins     *
4749cff245bSJames Collins     * @param   boolean $print Print content.
475a8eebd82SJames Collins     * @return  string         user information
476a8eebd82SJames Collins     */
4779cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
47810b40067Snomadjimbob    {
479a8eebd82SJames Collins        $html = '';
480a8eebd82SJames Collins
4819cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
482a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
483a8eebd82SJames Collins            ob_start();
484a8eebd82SJames Collins            tpl_userinfo();
485a8eebd82SJames Collins            $html .= ob_get_contents();
486a8eebd82SJames Collins            ob_end_clean();
487a8eebd82SJames Collins            $html .= '</div>';
4882b4583abSJames Collins        }
489a8eebd82SJames Collins
4909cff245bSJames Collins        if ($print === true) {
4919cff245bSJames Collins            echo $html;
4929cff245bSJames Collins        }
493a8eebd82SJames Collins        return $html;
4942b4583abSJames Collins    }
4952b4583abSJames Collins
4962b4583abSJames Collins
497a8eebd82SJames Collins    /**
498a8eebd82SJames Collins     * Print or return DokuWiki Menu
499a8eebd82SJames Collins     *
5009cff245bSJames Collins     * @param   boolean $print Print content.
501a8eebd82SJames Collins     * @return  string         contents of the menu
502a8eebd82SJames Collins     */
5039cff245bSJames Collins    public function includeDWMenu(bool $print = true)
50410b40067Snomadjimbob    {
5052b4583abSJames Collins        global $lang;
5062b4583abSJames Collins        global $USERINFO;
507c165b184SJames Collins
5089cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
509a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5102b4583abSJames Collins
511ab45ba71SJames Collins        $pageToolsMenu = [];
512ab45ba71SJames Collins        $siteToolsMenu = [];
513ab45ba71SJames Collins        $userToolsMenu = [];
514c165b184SJames Collins
515ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
516ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
517ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5182b4583abSJames Collins
5192b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5202b4583abSJames Collins        foreach ($items as $item) {
5219cff245bSJames Collins            if ($item->getType() !== 'top') {
522ab45ba71SJames Collins                $itemHtml = '';
5232b4583abSJames Collins
524905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5259cff245bSJames Collins                if (
526*3a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
527*3a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
528*3a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5299cff245bSJames Collins                ) {
5309cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5319cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5329cff245bSJames Collins                    if ($showIcons === true) {
5339cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5349cff245bSJames Collins                    }
5359cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5369cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5379cff245bSJames Collins                    }
538ab45ba71SJames Collins                    $itemHtml .= '</a>';
539ab45ba71SJames Collins
540ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5412b4583abSJames Collins                }
5429cff245bSJames Collins            }//end if
5439cff245bSJames Collins        }//end foreach
5442b4583abSJames Collins
545ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
546ab45ba71SJames Collins        foreach ($items as $item) {
547ab45ba71SJames Collins            $itemHtml = '';
5482b4583abSJames Collins
549905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5509cff245bSJames Collins            if (
551*3a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
552*3a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
553*3a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5549cff245bSJames Collins            ) {
5559cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5569cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5579cff245bSJames Collins                if ($showIcons === true) {
5589cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5599cff245bSJames Collins                }
5609cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5619cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5629cff245bSJames Collins                }
563ab45ba71SJames Collins                $itemHtml .= '</a>';
5642b4583abSJames Collins
565ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
5662b4583abSJames Collins            }
5679cff245bSJames Collins        }//end foreach
5682b4583abSJames Collins
569ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
570ab45ba71SJames Collins        foreach ($items as $item) {
571ab45ba71SJames Collins            $itemHtml = '';
572ab45ba71SJames Collins
573905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5749cff245bSJames Collins            if (
575*3a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
576*3a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
577*3a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5789cff245bSJames Collins            ) {
5799cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
5809cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5819cff245bSJames Collins                if ($showIcons === true) {
5829cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5839cff245bSJames Collins                }
5849cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5859cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5869cff245bSJames Collins                }
587ab45ba71SJames Collins                $itemHtml .= '</a>';
588ab45ba71SJames Collins
589ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
590ab45ba71SJames Collins            }
5919cff245bSJames Collins        }//end foreach
592ab45ba71SJames Collins
593ab45ba71SJames Collins
594ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
595ab45ba71SJames Collins            case 'dropdown':
596ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
5979cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
5989cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
5999cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6009cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6019cff245bSJames Collins                '</span>') . '</a>';
602a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
603ab45ba71SJames Collins
604ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
605ab45ba71SJames Collins                    $html .= $item;
606ab45ba71SJames Collins                }
607ab45ba71SJames Collins
608ab45ba71SJames Collins                $html .= '</div>';
609ab45ba71SJames Collins                $html .= '</li>';
610ab45ba71SJames Collins
611a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6129cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6139cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6149cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6159cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6169cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
617a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
618ab45ba71SJames Collins
619ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
620ab45ba71SJames Collins                    $html .= $item;
621ab45ba71SJames Collins                }
622ab45ba71SJames Collins
623ab45ba71SJames Collins                $html .= '</div>';
624ab45ba71SJames Collins                $html .= '</li>';
625ab45ba71SJames Collins
626a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6279cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6289cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6299cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6309cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6319cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
632a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
633ab45ba71SJames Collins
634ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
635ab45ba71SJames Collins                    $html .= $item;
636ab45ba71SJames Collins                }
637ab45ba71SJames Collins
638ab45ba71SJames Collins                $html .= '</div>';
639ab45ba71SJames Collins                $html .= '</li>';
640ab45ba71SJames Collins
641ab45ba71SJames Collins                break;
642ab45ba71SJames Collins
643ab45ba71SJames Collins            case 'combine':
644ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6459cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6469cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6479cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6489cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
649a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
650ab45ba71SJames Collins
651ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
652ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
653ab45ba71SJames Collins                    $html .= $item;
654ab45ba71SJames Collins                }
655ab45ba71SJames Collins
656ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
657ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
658ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
659ab45ba71SJames Collins                    $html .= $item;
660ab45ba71SJames Collins                }
661ab45ba71SJames Collins
662ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
663ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
664ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
665ab45ba71SJames Collins                    $html .= $item;
666ab45ba71SJames Collins                }
667ab45ba71SJames Collins
668ab45ba71SJames Collins                $html .= '</div>';
669ab45ba71SJames Collins                $html .= '</li>';
670ab45ba71SJames Collins                break;
671ab45ba71SJames Collins
672ab45ba71SJames Collins            default:    // seperate
673ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
674a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
675ab45ba71SJames Collins                }
676ab45ba71SJames Collins
677ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
678a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
679a8eebd82SJames Collins                }
680a8eebd82SJames Collins
681a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
682a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
683ab45ba71SJames Collins                }
684ab45ba71SJames Collins
685ab45ba71SJames Collins                break;
6869cff245bSJames Collins        }//end switch
687ab45ba71SJames Collins
688ab45ba71SJames Collins        $html .= '</ul>';
689ab45ba71SJames Collins
6909cff245bSJames Collins        if ($print === true) {
6919cff245bSJames Collins            echo $html;
6929cff245bSJames Collins        }
693a8eebd82SJames Collins        return $html;
694a8eebd82SJames Collins    }
695a8eebd82SJames Collins
696a8eebd82SJames Collins
697a8eebd82SJames Collins    /**
698a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
699a8eebd82SJames Collins     *
7009cff245bSJames Collins     * @param string $str String to generate nav.
701a8eebd82SJames Collins     * @return string     nav elements generated
702a8eebd82SJames Collins     */
7039cff245bSJames Collins    public function stringToNav(string $str)
70410b40067Snomadjimbob    {
705a8eebd82SJames Collins        $html = '';
706a8eebd82SJames Collins
707*3a385f2cSJames Collins        if (empty($str) === false) {
708a8eebd82SJames Collins            $items = explode(';', $str);
709a8eebd82SJames Collins            if (count($items) > 0) {
710a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
711a8eebd82SJames Collins                foreach ($items as $item) {
712a8eebd82SJames Collins                    $parts = explode('|', $item);
713a8eebd82SJames Collins                    if ($parts > 1) {
7149cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7159cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7169cff245bSJames Collins                            '</a></li>';
717a8eebd82SJames Collins                    }
718a8eebd82SJames Collins                }
719a8eebd82SJames Collins                $html .= '</ul>';
720a8eebd82SJames Collins            }
7212b4583abSJames Collins        }
7222b4583abSJames Collins
723ab45ba71SJames Collins        return $html;
7242b4583abSJames Collins    }
7252b4583abSJames Collins
726a8eebd82SJames Collins    /**
727ab45ba71SJames Collins     * print or return the main navbar
7282b4583abSJames Collins     *
7299cff245bSJames Collins     * @param boolean $print   Print the navbar.
7309cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
731ab45ba71SJames Collins     * @return string          generated content
7322b4583abSJames Collins     */
7339cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
73410b40067Snomadjimbob    {
735b39ad16dSJames Collins        global $conf, $USERINFO;
736d3d7d2b7SJames Collins
737d3d7d2b7SJames Collins        $homeUrl = wl();
738d3d7d2b7SJames Collins
7399cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
740d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
741*3a385f2cSJames Collins            if (empty($p) === false) {
7429cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
743d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
744d3d7d2b7SJames Collins                }
745d3d7d2b7SJames Collins            }
746b39ad16dSJames Collins        } else {
7479cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
748b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
749b39ad16dSJames Collins                if (strlen($url) > 0) {
750b39ad16dSJames Collins                    $homeUrl = $url;
751d3d7d2b7SJames Collins                }
752b39ad16dSJames Collins            } else {
753b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
754b39ad16dSJames Collins                if (strlen($url) > 0) {
755b39ad16dSJames Collins                    $homeUrl = $url;
756b39ad16dSJames Collins                }
757b39ad16dSJames Collins            }
758b39ad16dSJames Collins        }
759d3d7d2b7SJames Collins
760ab45ba71SJames Collins        $html = '';
76147161538SJames Collins
7629cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
7639cff245bSJames Collins            '">';
764f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
765d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
7669cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
767ab45ba71SJames Collins            // Brand image
7689cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
7699cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
7709cff245bSJames Collins                ;
771*3a385f2cSJames Collins                if (empty($logo) === false) {
772f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
773f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
774f0241fc4SJames Collins                    $styles = '';
775f0241fc4SJames Collins
776f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
7779cff245bSJames Collins                        if (ctype_digit($width) === true) {
778f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
7799cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
780f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
7819cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
7827a92c19bSJames Collins                            $styles .= 'max-width:none;';
783f0241fc4SJames Collins                        }
784f0241fc4SJames Collins
7859cff245bSJames Collins                        if (ctype_digit($height) === true) {
786f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
7879cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
788f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
7899cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
7907a92c19bSJames Collins                            $styles .= 'max-height:none;';
791f0241fc4SJames Collins                        }
792f0241fc4SJames Collins
793f0241fc4SJames Collins                        if (strlen($styles) > 0) {
794f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
795f0241fc4SJames Collins                        }
7969cff245bSJames Collins                    }//end if
797f0241fc4SJames Collins
798f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
7999cff245bSJames Collins                }//end if
8009cff245bSJames Collins            }//end if
801ab45ba71SJames Collins
802ab45ba71SJames Collins            // Brand title
8039cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
804ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
805a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8069cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
807a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
808ab45ba71SJames Collins                }
809ab45ba71SJames Collins                $html .= '</div>';
810ab45ba71SJames Collins            }
8119cff245bSJames Collins        }//end if
812ab45ba71SJames Collins        $html .= '</a>';
813660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
814ab45ba71SJames Collins
815ab45ba71SJames Collins        // Menus
816ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
817ab45ba71SJames Collins
8189cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8199cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8209cff245bSJames Collins        ];
821a8eebd82SJames Collins        foreach ($menus as $menuType) {
822a8eebd82SJames Collins            switch ($menuType) {
823a8eebd82SJames Collins                case 'custom':
824a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
825a8eebd82SJames Collins                    break;
826a8eebd82SJames Collins                case 'search':
827ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
828ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
829ab45ba71SJames Collins                    $html .= '</div>';
830a8eebd82SJames Collins                    break;
831a8eebd82SJames Collins                case 'dokuwiki':
8329cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
833a8eebd82SJames Collins                    break;
834a8eebd82SJames Collins            }
835a8eebd82SJames Collins        }
836ab45ba71SJames Collins
837ab45ba71SJames Collins        $html .= '</div>';
838f8039bf2SJames Collins        $html .= '</div>';
839ab45ba71SJames Collins        $html .= '</nav>';
840ab45ba71SJames Collins
841a8eebd82SJames Collins        // Sub Navbar
8429cff245bSJames Collins        if ($showSub === true) {
8439cff245bSJames Collins            $sub = $this->includePage('submenu', false);
844*3a385f2cSJames Collins            if (empty($sub) === false) {
8459cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
8469cff245bSJames Collins            }
847ab45ba71SJames Collins        }
848ab45ba71SJames Collins
8499cff245bSJames Collins        if ($print === true) {
8509cff245bSJames Collins            echo $html;
8519cff245bSJames Collins        }
852ab45ba71SJames Collins        return $html;
853ab45ba71SJames Collins    }
854ab45ba71SJames Collins
855ab45ba71SJames Collins
856a8eebd82SJames Collins    /**
857a8eebd82SJames Collins     * Is there a sidebar
858a8eebd82SJames Collins     *
8599cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
860a8eebd82SJames Collins     * @return  boolean        if sidebar exists
861a8eebd82SJames Collins     */
8629cff245bSJames Collins    public function sidebarExists(string $prefix = '')
86310b40067Snomadjimbob    {
864a8eebd82SJames Collins        global $conf;
865a8eebd82SJames Collins
866*3a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
8679cff245bSJames Collins            $prefix = '';
8689cff245bSJames Collins        }
869a8eebd82SJames Collins
870a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
871a8eebd82SJames Collins    }
872a8eebd82SJames Collins
873a8eebd82SJames Collins
874a8eebd82SJames Collins    /**
875ab45ba71SJames Collins     * Print or return the sidebar content
876ab45ba71SJames Collins     *
8779cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
8789cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
8799cff245bSJames Collins     * @param   boolean $parse  Parse the content.
880ab45ba71SJames Collins     * @return  string          generated content
881ab45ba71SJames Collins     */
8829cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
88310b40067Snomadjimbob    {
884ab45ba71SJames Collins        global $conf, $ID;
885ab45ba71SJames Collins
886ab45ba71SJames Collins        $html = '';
887ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
888ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
889ab45ba71SJames Collins
890*3a385f2cSJames Collins        if (empty($confPrefix) === true) {
8919cff245bSJames Collins            $confPrefix = 'Left';
8929cff245bSJames Collins        }
893*3a385f2cSJames Collins        if (strcasecmp($prefix, 'Left') === 0) {
8949cff245bSJames Collins            $prefix = '';
8959cff245bSJames Collins        }
896ab45ba71SJames Collins
897*3a385f2cSJames Collins        empty($sidebarPage = $conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
898ab45ba71SJames Collins
8999cff245bSJames Collins        if (
9009cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9019cff245bSJames Collins            p_get_metadata($ID, 'nosidebar', false) === false
9029cff245bSJames Collins        ) {
9039cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
904*3a385f2cSJames Collins            if (empty($content) === false) {
9059cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9069cff245bSJames Collins            }
907ab45ba71SJames Collins
908*3a385f2cSJames Collins            if (empty($prefix) === true) {
9099cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9109cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9119cff245bSJames Collins                ];
912ab45ba71SJames Collins
913a8eebd82SJames Collins                foreach ($rows as $row) {
914a8eebd82SJames Collins                    switch ($row) {
915a8eebd82SJames Collins                        case 'search':
9169cff245bSJames Collins                            $html .= $this->includeSearch(false);
917a8eebd82SJames Collins                            break;
918a8eebd82SJames Collins                        case 'logged in user':
9199cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
920a8eebd82SJames Collins                            break;
921a8eebd82SJames Collins                        case 'content':
9229cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
923*3a385f2cSJames Collins                            if (empty($content) === false) {
9249cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9259cff245bSJames Collins                            }
926a8eebd82SJames Collins                            break;
927a8eebd82SJames Collins                        case 'tags':
928a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
929a8eebd82SJames Collins                    }
930a8eebd82SJames Collins                }
931a8eebd82SJames Collins            } else {
9329cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
933*3a385f2cSJames Collins                if (empty($content) === false) {
9349cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9359cff245bSJames Collins                }
9369cff245bSJames Collins            }//end if
9379cff245bSJames Collins
9389cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
939*3a385f2cSJames Collins            if (empty($content) === false) {
9409cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
9419cff245bSJames Collins            }
9429cff245bSJames Collins        }//end if
9439cff245bSJames Collins
944*3a385f2cSJames Collins        if (empty($html) === true) {
945*3a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
9469cff245bSJames Collins                $html = '&nbsp;';
9479cff245bSJames Collins            }
9489cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
9499cff245bSJames Collins                $html = '&nbsp;';
9509cff245bSJames Collins            }
951a8eebd82SJames Collins        }
952ab45ba71SJames Collins
953*3a385f2cSJames Collins        if (empty($html) === false) {
954*3a385f2cSJames Collins            empty($html = '<aside class="mikio-sidebar mikio-sidebar-' . ($prefix) === true ? 'left' : $prefix) .
9559cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
9569cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
9579cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
9589cff245bSJames Collins                $html . '</div></aside>';
959ab45ba71SJames Collins        }
960ab45ba71SJames Collins
9619cff245bSJames Collins        if ($parse === true) {
9629cff245bSJames Collins            $html = $this->includeIcons($html);
9633a04a100SJames Collins        }
9649cff245bSJames Collins        if ($print === true) {
9659cff245bSJames Collins            echo $html;
966ab45ba71SJames Collins        }
967ab45ba71SJames Collins        return $html;
968ab45ba71SJames Collins    }
969ab45ba71SJames Collins
970ab45ba71SJames Collins
971a8eebd82SJames Collins    /**
972ab45ba71SJames Collins     * Print or return the page tools content
973ab45ba71SJames Collins     *
9749cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
9759cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
976ab45ba71SJames Collins     * @return  string             generated content
977ab45ba71SJames Collins     */
9789cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
97910b40067Snomadjimbob    {
9801293ce10SJames Collins        global $USERINFO;
9811293ce10SJames Collins
9829cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
983ab45ba71SJames Collins        $html = '';
984ab45ba71SJames Collins
9859cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
986b9c0582bSJames Collins        $html .= '<ul class="tools">';
987ab45ba71SJames Collins
988ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
989ab45ba71SJames Collins        foreach ($items as $item) {
9909cff245bSJames Collins            $classes = [];
9913fd763a0SJames Collins            $classes[] = $item->getType();
9923fd763a0SJames Collins            $attr = $item->getLinkAttributes();
9933fd763a0SJames Collins
9949cff245bSJames Collins            if (empty($attr['class']) === false) {
9953fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
996ab45ba71SJames Collins            }
997ab45ba71SJames Collins
9983fd763a0SJames Collins            $classes = array_unique($classes);
9993fd763a0SJames Collins
10001293ce10SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()));
10019cff245bSJames Collins            if (
1002*3a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
1003*3a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
1004*3a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10059cff245bSJames Collins            ) {
10063fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10079cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10089cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10099cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10103fd763a0SJames Collins                $html .= '</li>';
10113fd763a0SJames Collins            }
10129cff245bSJames Collins        }//end foreach
10133fd763a0SJames Collins
10143fd763a0SJames Collins        $html .= '</ul>';
1015ab45ba71SJames Collins        $html .= '</nav>';
1016ab45ba71SJames Collins
10179cff245bSJames Collins        if ($print === true) {
10189cff245bSJames Collins            echo $html;
10199cff245bSJames Collins        }
1020ab45ba71SJames Collins        return $html;
1021ab45ba71SJames Collins    }
1022ab45ba71SJames Collins
1023ab45ba71SJames Collins
1024a8eebd82SJames Collins    /**
1025a8eebd82SJames Collins     * Print or return the search bar
1026a8eebd82SJames Collins     *
10279cff245bSJames Collins     * @param   boolean $print Print content.
1028a8eebd82SJames Collins     * @return  string         contents of the search bar
1029a8eebd82SJames Collins     */
10309cff245bSJames Collins    public function includeSearch(bool $print = true)
103110b40067Snomadjimbob    {
10329cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1033ab45ba71SJames Collins        $html = '';
1034ab45ba71SJames Collins
10359cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
10369cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1037a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1038a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1039c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
10409cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1041c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1042c1cb9f15SChris MacMackin        }
10439cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
1044*3a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1045a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
1046*3a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1047a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1048ab45ba71SJames Collins        } else {
1049ab45ba71SJames Collins            $html .= $lang['btn_search'];
1050ab45ba71SJames Collins        }
1051ab45ba71SJames Collins        $html .= '</button>';
1052ab45ba71SJames Collins        $html .= '</form>';
1053ab45ba71SJames Collins
10549cff245bSJames Collins        if ($print === true) {
10559cff245bSJames Collins            echo $html;
10569cff245bSJames Collins        }
1057ab45ba71SJames Collins        return $html;
1058ab45ba71SJames Collins    }
1059ab45ba71SJames Collins
1060ab45ba71SJames Collins
1061a8eebd82SJames Collins    /**
1062a8eebd82SJames Collins     * Print or return content
1063a8eebd82SJames Collins     *
10649cff245bSJames Collins     * @param   boolean $print Print content.
1065a8eebd82SJames Collins     * @return  string         contents
1066a8eebd82SJames Collins     */
10679cff245bSJames Collins    public function includeContent(bool $print = true)
106810b40067Snomadjimbob    {
1069ab45ba71SJames Collins        ob_start();
10709cff245bSJames Collins        tpl_content(false);
1071ab45ba71SJames Collins        $html = ob_get_contents();
1072ab45ba71SJames Collins        ob_end_clean();
1073ab45ba71SJames Collins
1074ab45ba71SJames Collins        $html = $this->includeIcons($html);
1075ab45ba71SJames Collins        $html = $this->parseContent($html);
1076ab45ba71SJames Collins
1077ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1078ab45ba71SJames Collins
10799cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
10809cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
10819cff245bSJames Collins        }
1082a8eebd82SJames Collins
1083a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1084a8eebd82SJames Collins
10859cff245bSJames Collins        if ($print === true) {
10869cff245bSJames Collins            echo $html;
10879cff245bSJames Collins        }
1088ab45ba71SJames Collins        return $html;
1089ab45ba71SJames Collins    }
1090ab45ba71SJames Collins
1091a8eebd82SJames Collins    /**
1092ab45ba71SJames Collins     * Print or return footer
1093ab45ba71SJames Collins     *
10949cff245bSJames Collins     * @param   boolean $print Print footer.
10959cff245bSJames Collins     * @return  string         HTML string containing footer
1096ab45ba71SJames Collins     */
10979cff245bSJames Collins    public function includeFooter(bool $print = true)
109810b40067Snomadjimbob    {
1099ab45ba71SJames Collins        global $ACT;
1100ab45ba71SJames Collins
1101ab45ba71SJames Collins        $html = '';
1102ab45ba71SJames Collins
1103ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11049cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11059cff245bSJames Collins        $html .= $this->includePage('footer', false);
1106ab45ba71SJames Collins
1107a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1108ab45ba71SJames Collins
11099cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1110ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11119cff245bSJames Collins            $html .= $this->includeSearch(false);
1112ab45ba71SJames Collins            $html .= '</div>';
1113ab45ba71SJames Collins        }
1114ab45ba71SJames Collins
1115a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11169cff245bSJames Collins        if (
1117*3a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
1118*3a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11199cff245bSJames Collins        ) {
11209cff245bSJames Collins            $html .= $this->includePageTools(false);
11219cff245bSJames Collins        }
1122ab45ba71SJames Collins
11239cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11249cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1125ab45ba71SJames Collins
1126ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11279cff245bSJames Collins        if ($licenseType !== 'none') {
11289cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1129ab45ba71SJames Collins        }
1130ab45ba71SJames Collins
1131ab45ba71SJames Collins        $html .= '</footer>';
1132ab45ba71SJames Collins
11339cff245bSJames Collins        if ($print === true) {
11349cff245bSJames Collins            echo $html;
11359cff245bSJames Collins        }
1136ab45ba71SJames Collins        return $html;
1137ab45ba71SJames Collins    }
1138ab45ba71SJames Collins
1139ab45ba71SJames Collins
1140a8eebd82SJames Collins    /**
1141ab45ba71SJames Collins     * Print or return breadcrumb trail
1142ab45ba71SJames Collins     *
11439cff245bSJames Collins     * @param   boolean $print Print out trail.
11449cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
11459cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1146ab45ba71SJames Collins     */
11479cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
114810b40067Snomadjimbob    {
1149a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1150a8eebd82SJames Collins
1151*3a385f2cSJames Collins        if (
1152*3a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
1153*3a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0
1154*3a385f2cSJames Collins        ) {
11559cff245bSJames Collins            return '';
11569cff245bSJames Collins        }
1157ab45ba71SJames Collins
1158ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1159f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
1160*3a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
11619cff245bSJames Collins            if ($conf['breadcrumbs'] === true) {
11629cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1163ab45ba71SJames Collins                    ob_start();
116475adba86SJames Collins                    tpl_breadcrumbs();
1165ab45ba71SJames Collins                    $html .= ob_get_contents();
1166ab45ba71SJames Collins                    ob_end_clean();
1167ab45ba71SJames Collins                } else {
1168ab45ba71SJames Collins                    $sep = '•';
1169ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1170ab45ba71SJames Collins
11719cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1172ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
11739cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1174ab45ba71SJames Collins
11759cff245bSJames Collins                        if ($img !== false) {
1176ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1177ab45ba71SJames Collins                        }
117847161538SJames Collins                    }
117947161538SJames Collins
11809cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1181ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
11829cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1183ab45ba71SJames Collins
11849cff245bSJames Collins                        if ($img !== false) {
1185ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1186ab45ba71SJames Collins                        }
1187ab45ba71SJames Collins                    }
1188ab45ba71SJames Collins
1189ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1190ab45ba71SJames Collins
1191ab45ba71SJames Collins                    $html .= '<ul>';
1192*3a385f2cSJames Collins                    if (empty($prefix) === false) {
11939cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
11949cff245bSJames Collins                    }
1195ab45ba71SJames Collins
1196ab45ba71SJames Collins                    $last = count($crumbs);
1197ab45ba71SJames Collins                    $i    = 0;
1198ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1199ab45ba71SJames Collins                        $i++;
1200ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
12019cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12029cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1203ab45ba71SJames Collins                        $html .= '</li>';
1204ab45ba71SJames Collins                    }
1205ab45ba71SJames Collins
1206ab45ba71SJames Collins                    $html .= '</ul>';
12079cff245bSJames Collins                }//end if
12089cff245bSJames Collins            }//end if
12099cff245bSJames Collins        }//end if
12103d11a778SJames Collins
12113d11a778SJames Collins        $html .= '</div>';
12123d11a778SJames Collins        $html .= '</div>';
12133d11a778SJames Collins
12149cff245bSJames Collins        if ($parse === true) {
12159cff245bSJames Collins            $html = $this->includeIcons($html);
12169cff245bSJames Collins        }
12179cff245bSJames Collins        if ($print === true) {
12189cff245bSJames Collins            echo $html;
12199cff245bSJames Collins        }
12203d11a778SJames Collins        return $html;
12213d11a778SJames Collins    }
12223d11a778SJames Collins
12233d11a778SJames Collins    /**
12243d11a778SJames Collins     * Print or return you are here trail
12253d11a778SJames Collins     *
12269cff245bSJames Collins     * @param   boolean $print Print out trail.
12279cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12289cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12293d11a778SJames Collins     */
12309cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12313d11a778SJames Collins    {
12323d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
12333d11a778SJames Collins
1234*3a385f2cSJames Collins        if (
1235*3a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
1236*3a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0
1237*3a385f2cSJames Collins        ) {
12389cff245bSJames Collins            return '';
12399cff245bSJames Collins        }
12403d11a778SJames Collins
12413d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
12423d11a778SJames Collins        $html .= '<div class="mikio-container">';
1243*3a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
12449cff245bSJames Collins            if ($conf['youarehere'] === true) {
12459cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
1246ab45ba71SJames Collins                    ob_start();
124775adba86SJames Collins                    tpl_youarehere();
1248ab45ba71SJames Collins                    $html .= ob_get_contents();
1249ab45ba71SJames Collins                    ob_end_clean();
1250ab45ba71SJames Collins                } else {
1251ab45ba71SJames Collins                    $sep = ' » ';
1252ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1253ab45ba71SJames Collins
12549cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
12553d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
12569cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1257ab45ba71SJames Collins
12589cff245bSJames Collins                        if ($img !== false) {
1259ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1260ab45ba71SJames Collins                        }
126175adba86SJames Collins                    }
126275adba86SJames Collins
12639cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
12643d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
12659cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1266ab45ba71SJames Collins
12679cff245bSJames Collins                        if ($img !== false) {
1268ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
126975adba86SJames Collins                        }
127047161538SJames Collins                    }
127147161538SJames Collins
1272ab45ba71SJames Collins                    $html .= '<ul>';
1273*3a385f2cSJames Collins                    if (empty($prefix) === false) {
12749cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12759cff245bSJames Collins                    }
12769cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1277ab45ba71SJames Collins
1278ab45ba71SJames Collins                    $parts = explode(':', $ID);
1279ab45ba71SJames Collins                    $count = count($parts);
1280ab45ba71SJames Collins
1281ab45ba71SJames Collins                    $part = '';
12829cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1283ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1284ab45ba71SJames Collins                        $page = $part;
12859cff245bSJames Collins                        if ($page === $conf['start']) {
12869cff245bSJames Collins                            continue;
12879cff245bSJames Collins                        }
1288ab45ba71SJames Collins
1289ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
12909cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1291ab45ba71SJames Collins                    }
1292ab45ba71SJames Collins
1293ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
12949cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1295ab45ba71SJames Collins                        $page = $part . $parts[$i];
12969cff245bSJames Collins                        if ($page !== $conf['start']) {
1297ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
12989cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1299ab45ba71SJames Collins                        }
1300ab45ba71SJames Collins                    }
1301ab45ba71SJames Collins
1302ab45ba71SJames Collins                    $html .= '</ul>';
13039cff245bSJames Collins                }//end if
13049cff245bSJames Collins            }//end if
1305ab45ba71SJames Collins
13063d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13079cff245bSJames Collins            if ($showLast !== 0) {
1308a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13099cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1310a8eebd82SJames Collins                    $count = count($matches[0]);
1311a8eebd82SJames Collins                    $list = '';
1312a8eebd82SJames Collins
1313a8eebd82SJames Collins                    // Show Home
1314a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1315a8eebd82SJames Collins
1316a8eebd82SJames Collins                    $list .= '<li>...</li>';
13179cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1318a8eebd82SJames Collins                        $list .= $matches[0][$i];
1319a8eebd82SJames Collins                    }
1320a8eebd82SJames Collins
1321a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1322a8eebd82SJames Collins                }
1323a8eebd82SJames Collins            }
1324a8eebd82SJames Collins
13253d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1326a8eebd82SJames Collins                case 'none':
1327a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1328a8eebd82SJames Collins                    break;
1329a8eebd82SJames Collins                case 'home':
1330a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1331a8eebd82SJames Collins                    break;
1332a8eebd82SJames Collins                case 'icon':
13339cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
13349cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1335a8eebd82SJames Collins                    break;
1336a8eebd82SJames Collins            }
1337a8eebd82SJames Collins        } else {
1338a8eebd82SJames Collins            $html .= '&#8810; ';
13399cff245bSJames Collins            if (isset($_GET['page']) === true) {
13409cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1341a8eebd82SJames Collins            }
13424057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
13439cff245bSJames Collins        }//end if
13449cff245bSJames Collins
13459cff245bSJames Collins        $html .= '</div>';
13469cff245bSJames Collins        $html .= '</div>';
13479cff245bSJames Collins
13489cff245bSJames Collins        if ($parse === true) {
13499cff245bSJames Collins            $html = $this->includeIcons($html);
1350a8eebd82SJames Collins        }
13519cff245bSJames Collins        if ($print === true) {
13529cff245bSJames Collins            echo $html;
13539cff245bSJames Collins        }
1354ab45ba71SJames Collins        return $html;
1355ab45ba71SJames Collins    }
1356ab45ba71SJames Collins
13571785fc73SJames Collins    /**
13581785fc73SJames Collins     * Get Page Title
13599cff245bSJames Collins     *
13609cff245bSJames Collins     * @return string page title
13611785fc73SJames Collins     */
136210b40067Snomadjimbob    public function parsePageTitle()
136310b40067Snomadjimbob    {
13642060e56cSJames Collins        global $ID;
13652060e56cSJames Collins
13662060e56cSJames Collins        $title = p_get_first_heading($ID);
13679cff245bSJames Collins        if (strlen($title) <= 0) {
13689cff245bSJames Collins            $title = tpl_pagetitle(null, true);
13699cff245bSJames Collins        }
13701785fc73SJames Collins        $title = $this->includeIcons($title);
13711785fc73SJames Collins
13721785fc73SJames Collins        return $title;
13731785fc73SJames Collins    }
13741785fc73SJames Collins
1375ab45ba71SJames Collins
137675adba86SJames Collins    /**
1377a8eebd82SJames Collins     * Print or return hero block
137875adba86SJames Collins     *
13799cff245bSJames Collins     * @param   boolean $print Print content.
1380a8eebd82SJames Collins     * @return  string         contents of hero
138175adba86SJames Collins     */
13829cff245bSJames Collins    public function includeHero(bool $print = true)
138310b40067Snomadjimbob    {
1384a8eebd82SJames Collins        $html = '';
138547161538SJames Collins
13869cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1387a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1388f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1389a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
1390*3a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
13919cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
13929cff245bSJames Collins            }
1393*3a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
13949cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
13959cff245bSJames Collins            }
1396ab45ba71SJames Collins
1397a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
13981785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1399a8eebd82SJames Collins            $html .= '</h1>';
1400a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1401a8eebd82SJames Collins            $html .= '</div>';
140247161538SJames Collins
14039cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1404a8eebd82SJames Collins            $hero_image_resize_class = '';
1405*3a385f2cSJames Collins            if (empty($hero_image) === false) {
1406a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1407a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
140847161538SJames Collins            }
1409a8eebd82SJames Collins
14109cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14119cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1412a8eebd82SJames Collins
1413a8eebd82SJames Collins            $html .= '</div>';
1414f8039bf2SJames Collins            $html .= '</div>';
14159cff245bSJames Collins        }//end if
14169cff245bSJames Collins
14179cff245bSJames Collins        if ($print === true) {
14189cff245bSJames Collins            echo $html;
141975adba86SJames Collins        }
1420a8eebd82SJames Collins
1421a8eebd82SJames Collins        return $html;
142275adba86SJames Collins    }
142375adba86SJames Collins
142475adba86SJames Collins
142575adba86SJames Collins    /**
1426a8eebd82SJames Collins     * Print or return out TOC
142775adba86SJames Collins     *
14289cff245bSJames Collins     * @param   boolean $print Print TOC.
14299cff245bSJames Collins     * @param   boolean $parse Parse icons.
1430a8eebd82SJames Collins     * @return  string         contents of TOC
143175adba86SJames Collins     */
14329cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
143310b40067Snomadjimbob    {
1434ab45ba71SJames Collins        $html = '';
14352b4583abSJames Collins
1436ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1437ab45ba71SJames Collins
1438*3a385f2cSJames Collins        if (empty($tocHtml) === false) {
1439ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1440a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1441ab45ba71SJames Collins
1442ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1443ab45ba71SJames Collins            $html .= $tocHtml;
1444ab45ba71SJames Collins            $html .= '</div>';
14452b4583abSJames Collins        }
14462b4583abSJames Collins
14479cff245bSJames Collins        if ($parse === true) {
14489cff245bSJames Collins            $html = $this->includeIcons($html);
14499cff245bSJames Collins        }
14509cff245bSJames Collins
14519cff245bSJames Collins        if ($print === true) {
1452ab45ba71SJames Collins            echo $html;
1453ab45ba71SJames Collins        }
1454ab45ba71SJames Collins
14559cff245bSJames Collins        return $html;
14569cff245bSJames Collins    }
14579cff245bSJames Collins
1458ab45ba71SJames Collins
1459a8eebd82SJames Collins    /**
1460ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1461ab45ba71SJames Collins     *
14629cff245bSJames Collins     * @param   string $str Content to parse.
1463ab45ba71SJames Collins     * @return  string      parsed string
1464ab45ba71SJames Collins     */
14659cff245bSJames Collins    public function includeIcons(string $str)
146610b40067Snomadjimbob    {
1467ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1468ab45ba71SJames Collins
1469ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
1470*3a385f2cSJames Collins        if (empty($iconTag) === true) {
14719cff245bSJames Collins            return $str;
14729cff245bSJames Collins        }
1473ab45ba71SJames Collins
14749cff245bSJames Collins        if (
14759cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
1476*3a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
14779cff245bSJames Collins        ) {
1478a2005a27SJames Collins            $content = $str;
1479a2005a27SJames Collins            $preview = null;
1480a2005a27SJames Collins
1481*3a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
14829cff245bSJames Collins                $html = new \simple_html_dom();
1483a2005a27SJames Collins                $html->stripRNAttrValues = false;
1484a2005a27SJames Collins                $html->load($str, true, false);
1485a2005a27SJames Collins
1486a2005a27SJames Collins                $preview = $html->find('div.preview');
14879cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1488a2005a27SJames Collins                    $content = $preview[0]->innertext;
1489a2005a27SJames Collins                }
1490a2005a27SJames Collins            }
1491a2005a27SJames Collins
14921785fc73SJames Collins            $page_regex = '/(.*)/';
14939cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
14941785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
14951785fc73SJames Collins            }
14961785fc73SJames Collins
14971785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1498a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1499a2005a27SJames Collins
150010b40067Snomadjimbob                return preg_replace_callback(
150110b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1502ab45ba71SJames Collins                    function ($matches) {
1503ab45ba71SJames Collins                        global $MIKIO_ICONS;
1504ab45ba71SJames Collins
1505ab45ba71SJames Collins                        $s = $matches[0];
1506ab45ba71SJames Collins
1507ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1508ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1509ab45ba71SJames Collins
1510ab45ba71SJames Collins                            if (count($matches) > 1) {
1511ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1512ab45ba71SJames Collins
1513ab45ba71SJames Collins                                if (count($e) > 1) {
1514ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15159cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1516ab45ba71SJames Collins                                            $icon = $iconItem;
1517ab45ba71SJames Collins
1518ab45ba71SJames Collins                                            $s = $icon['insert'];
1519ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
1520*3a385f2cSJames Collins                                                if (count(empty($e) < $i || $e[$i]) === true) {
15219cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1522ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1523ab45ba71SJames Collins                                                    }
1524ab45ba71SJames Collins                                                } else {
1525ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1526ab45ba71SJames Collins                                                }
1527ab45ba71SJames Collins                                            }
1528ab45ba71SJames Collins
1529ab45ba71SJames Collins                                            $dir = '';
15309cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
15319cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
15329cff245bSJames Collins                                            }
1533ab45ba71SJames Collins
1534ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1535ab45ba71SJames Collins
1536ab45ba71SJames Collins                                            break;
15379cff245bSJames Collins                                        }//end if
15389cff245bSJames Collins                                    }//end foreach
1539ab45ba71SJames Collins                                } else {
1540ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
15419cff245bSJames Collins                                }//end if
15429cff245bSJames Collins                            }//end if
15439cff245bSJames Collins                        }//end if
154475adba86SJames Collins
1545ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
15469cff245bSJames Collins                        if ($count === 0) {
1547ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1548ab45ba71SJames Collins                        }
1549ab45ba71SJames Collins
1550ab45ba71SJames Collins                        return $s;
1551ab45ba71SJames Collins                    },
155210b40067Snomadjimbob                    $icons[0]
155310b40067Snomadjimbob                );
1554a2005a27SJames Collins            }, $content);
1555a2005a27SJames Collins
1556*3a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15579cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1558a2005a27SJames Collins                    $preview[0]->innertext = $content;
1559a2005a27SJames Collins                }
1560a2005a27SJames Collins
1561a2005a27SJames Collins                $str = $html->save();
1562a2005a27SJames Collins                $html->clear();
1563a2005a27SJames Collins                unset($html);
1564a2005a27SJames Collins            } else {
1565a2005a27SJames Collins                $str = $content;
1566a2005a27SJames Collins            }
15679cff245bSJames Collins        }//end if
1568ab45ba71SJames Collins
1569ab45ba71SJames Collins        return $str;
1570ab45ba71SJames Collins    }
157147161538SJames Collins
1572c165b184SJames Collins    /**
1573a8eebd82SJames Collins     * Parse HTML for theme
1574c165b184SJames Collins     *
15759cff245bSJames Collins     * @param   string $content HTML content to parse.
1576a8eebd82SJames Collins     * @return  string          Parsed content
1577c165b184SJames Collins     */
15789cff245bSJames Collins    public function parseContent(string $content)
157910b40067Snomadjimbob    {
1580ab45ba71SJames Collins        global $INPUT, $ACT;
1581ab45ba71SJames Collins
1582a8eebd82SJames Collins        // Add Mikio Section titles
1583*3a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
15849cff245bSJames Collins            $admin_sections = [
1585ab45ba71SJames Collins                // Section      Insert Before                 Icon
15869cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
15879cff245bSJames Collins                'search'        => ['searchButton',            ''],
15889cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
15899cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
15909cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
15919cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
15929cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
15939cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
15949cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
15959cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
15969cff245bSJames Collins                'license'       => ['licenseType',             ''],
15979cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
15989cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
15999cff245bSJames Collins            ];
1600ab45ba71SJames Collins
1601ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1602ab45ba71SJames Collins                $search = $items[0];
1603ab45ba71SJames Collins                $icon   = $items[1];
1604ab45ba71SJames Collins
160510b40067Snomadjimbob                $content = preg_replace(
1606adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16079cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16089cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16099cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16109cff245bSJames Collins                        $search . '</span>',
161110b40067Snomadjimbob                    $content
161210b40067Snomadjimbob                );
1613ab45ba71SJames Collins            }
16149cff245bSJames Collins        }//end if
1615ab45ba71SJames Collins
1616*3a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1617a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1618a8eebd82SJames Collins        }
1619ab45ba71SJames Collins
1620a8eebd82SJames Collins        // Page Revisions - Table Fix
16219cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
16229cff245bSJames Collins            $content = preg_replace(
16239cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
16249cff245bSJames Collins                '<span>$1</span>',
16259cff245bSJames Collins                $content
16269cff245bSJames Collins            );
1627a8eebd82SJames Collins        }
1628ab45ba71SJames Collins
16299cff245bSJames Collins        $html = new \simple_html_dom();
1630bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1631c165b184SJames Collins        $html->load($content, true, false);
1632c165b184SJames Collins
16339cff245bSJames Collins        if ($html === false) {
16349cff245bSJames Collins            return $content;
16359cff245bSJames Collins        }
1636ab45ba71SJames Collins
1637ab45ba71SJames Collins        /* Buttons */
1638ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1639ab45ba71SJames Collins            $c = explode(' ', $node->class);
16409cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
16419cff245bSJames Collins                $c[] = 'mikio-button';
16429cff245bSJames Collins            }
1643ab45ba71SJames Collins            $node->class = implode(' ', $c);
1644c165b184SJames Collins        }
1645c165b184SJames Collins
1646ab45ba71SJames Collins
1647ab45ba71SJames Collins        /* Buttons - Primary */
1648ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1649ab45ba71SJames Collins            $c = explode(' ', $node->class);
16509cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
16519cff245bSJames Collins                $c[] = 'mikio-primary';
16529cff245bSJames Collins            }
1653ab45ba71SJames Collins            $node->class = implode(' ', $c);
1654ab45ba71SJames Collins        }
1655ab45ba71SJames Collins
1656a8eebd82SJames Collins        /* Hide page title if hero is enabled */
16579cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
16581785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
165947161538SJames Collins
166047161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
16619cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1662a8eebd82SJames Collins                    // $elm->innertext = '';
1663a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1664a8eebd82SJames Collins
166547161538SJames Collins                    break;
166647161538SJames Collins                }
166747161538SJames Collins            }
166847161538SJames Collins        }
1669c165b184SJames Collins
1670a8eebd82SJames Collins        /* Hero subtitle */
16712b4583abSJames Collins        foreach ($html->find('p') as $elm) {
16722b4583abSJames Collins            $i = stripos($elm->innertext, '~~hero-subtitle');
16732b4583abSJames Collins            if ($i !== false) {
16749cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
16752b4583abSJames Collins                if ($j !== false) {
16769cff245bSJames Collins                    if ($j > ($i + 16)) {
16779cff245bSJames Collins                        $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16));
1678a8eebd82SJames Collins                        $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1679a8eebd82SJames Collins
1680a8eebd82SJames Collins                        // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2);
1681a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext);
16822b4583abSJames Collins                    }
16832b4583abSJames Collins
16842b4583abSJames Collins                    break;
16852b4583abSJames Collins                }
16862b4583abSJames Collins            }
16872b4583abSJames Collins        }
16882b4583abSJames Collins
1689a8eebd82SJames Collins        /* Hero image */
1690a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1691a8eebd82SJames Collins            $image = '';
1692a8eebd82SJames Collins            preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches);
1693a8eebd82SJames Collins            if (count($matches) > 0) {
1694a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1695a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1696a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1697a8eebd82SJames Collins                } else {
1698a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1699a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1700a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1701a8eebd82SJames Collins                    } else {
1702a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
17039cff245bSJames Collins                        if (stripos($image, ':') === false) {
17049cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1705a8eebd82SJames Collins                            $i = stripos($image, '?');
17069cff245bSJames Collins                            if ($i !== false) {
1707a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1708c165b184SJames Collins                            }
1709c165b184SJames Collins
1710a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1711ab45ba71SJames Collins                        }
1712ab45ba71SJames Collins                    }
1713ab45ba71SJames Collins                }
1714ab45ba71SJames Collins
1715a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1716a8eebd82SJames Collins
1717a8eebd82SJames Collins                $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext);
17189cff245bSJames Collins            }//end if
17199cff245bSJames Collins        }//end foreach
1720ab45ba71SJames Collins
17219cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
17229cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1723a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1724a8eebd82SJames Collins            $i = stripos($elm->innertext, '~~hero-colors');
1725a8eebd82SJames Collins            if ($i !== false) {
17269cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
1727a8eebd82SJames Collins                if ($j !== false) {
17289cff245bSJames Collins                    if ($j > ($i + 14)) {
17299cff245bSJames Collins                        $color = substr($elm->innertext, ($i + 14), ($j - $i - 14));
1730a8eebd82SJames Collins                        $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')';
1731ab45ba71SJames Collins
1732a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext);
1733ab45ba71SJames Collins                    }
1734ab45ba71SJames Collins
1735a8eebd82SJames Collins                    break;
1736ab45ba71SJames Collins                }
1737ab45ba71SJames Collins            }
1738ab45ba71SJames Collins        }
1739ab45ba71SJames Collins
174096ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
174196ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
174296ec8e1eSJames Collins            $i = stripos($elm->innertext, '~~hide-parts');
174396ec8e1eSJames Collins            if ($i !== false) {
17449cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
174596ec8e1eSJames Collins                if ($j !== false) {
17469cff245bSJames Collins                    if ($j > ($i + 13)) {
17479cff245bSJames Collins                        $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13)));
174896ec8e1eSJames Collins                        $script = '';
174996ec8e1eSJames Collins
175096ec8e1eSJames Collins                        foreach ($parts as $part) {
175196ec8e1eSJames Collins                            // $part = trim($part);
175296ec8e1eSJames Collins                            if (strlen($part) > 0) {
175396ec8e1eSJames Collins                                $script .= 'mikio.hidePart(\'' . $part . '\');';
175496ec8e1eSJames Collins                            }
175596ec8e1eSJames Collins                        }
175696ec8e1eSJames Collins
175796ec8e1eSJames Collins                        if (strlen($script) > 0) {
175896ec8e1eSJames Collins                            $this->footerScript['hide-parts'] = $script;
175996ec8e1eSJames Collins                        }
176096ec8e1eSJames Collins
176196ec8e1eSJames Collins                        $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext);
176296ec8e1eSJames Collins                    }
176396ec8e1eSJames Collins
176496ec8e1eSJames Collins                    break;
17659cff245bSJames Collins                }//end if
17669cff245bSJames Collins            }//end if
17679cff245bSJames Collins        }//end foreach
176896ec8e1eSJames Collins
176996ec8e1eSJames Collins
1770a8eebd82SJames Collins        /* Page Tags (tag plugin) */
17719cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1772a8eebd82SJames Collins            $tags = '';
1773a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1774a8eebd82SJames Collins                $tags .= $elm->outertext;
1775a8eebd82SJames Collins            }
1776a8eebd82SJames Collins
1777a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1778a8eebd82SJames Collins                $elm->innertext = '';
1779a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1780a8eebd82SJames Collins            }
1781a8eebd82SJames Collins
1782*3a385f2cSJames Collins            if (empty($tags) === false) {
1783a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1784a8eebd82SJames Collins            }
1785ab45ba71SJames Collins        }
1786ab45ba71SJames Collins
1787ab45ba71SJames Collins        // Configuration Manager
1788*3a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1789ab45ba71SJames Collins            // Additional save buttons
1790ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1791ab45ba71SJames Collins                $saveButtons = '';
1792ab45ba71SJames Collins
1793ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1794ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1795a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1796ab45ba71SJames Collins                    $elm->outertext = '';
1797ab45ba71SJames Collins                }
1798ab45ba71SJames Collins
1799ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1800ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1801ab45ba71SJames Collins                }
1802ab45ba71SJames Collins            }
1803ab45ba71SJames Collins        }
1804ab45ba71SJames Collins
1805ab45ba71SJames Collins        $content = $html->save();
1806c165b184SJames Collins        $html->clear();
1807c165b184SJames Collins        unset($html);
1808c165b184SJames Collins
1809c165b184SJames Collins        return $content;
1810c165b184SJames Collins    }
18112b4583abSJames Collins
18122b4583abSJames Collins
1813a8eebd82SJames Collins    /**
1814a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
1815a8eebd82SJames Collins     *
18169cff245bSJames Collins     * @param   string $str String to parse.
18179cff245bSJames Collins     * @return  string      parsed URI
1818a8eebd82SJames Collins     */
18199cff245bSJames Collins    public function getLink(string $str)
182010b40067Snomadjimbob    {
18212b4583abSJames Collins        $i = strpos($str, '://');
18229cff245bSJames Collins        if ($i !== false) {
18239cff245bSJames Collins            return $str;
18249cff245bSJames Collins        }
18252b4583abSJames Collins
18262b4583abSJames Collins        return wl($str);
18272b4583abSJames Collins    }
1828ab45ba71SJames Collins
1829ab45ba71SJames Collins
1830a8eebd82SJames Collins    /**
1831a8eebd82SJames Collins     * Check if the user can edit current namespace/page
1832a8eebd82SJames Collins     *
1833a8eebd82SJames Collins     * @return  boolean  user can edit
1834a8eebd82SJames Collins     */
183510b40067Snomadjimbob    public function userCanEdit()
183610b40067Snomadjimbob    {
1837ab45ba71SJames Collins        global $INFO;
1838ab45ba71SJames Collins        global $ID;
1839ab45ba71SJames Collins
1840ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
18419cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
18429cff245bSJames Collins            return true;
18439cff245bSJames Collins        }
18449cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
18459cff245bSJames Collins            return true;
18469cff245bSJames Collins        }
1847a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
18489cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
18499cff245bSJames Collins            return true;
18509cff245bSJames Collins        }
18519cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
18529cff245bSJames Collins            return true;
18539cff245bSJames Collins        }
1854ab45ba71SJames Collins
1855ab45ba71SJames Collins        return false;
1856c165b184SJames Collins    }
185747161538SJames Collins
185847161538SJames Collins
1859a8eebd82SJames Collins    /**
1860a8eebd82SJames Collins     * Search for and return the uri of a media file
1861a8eebd82SJames Collins     *
18629cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
18639cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
18649cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
18659cff245bSJames Collins     * @return string                  URI of the found media file
1866a8eebd82SJames Collins     */
18679cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
186810b40067Snomadjimbob    {
1869ab45ba71SJames Collins        global $INFO;
1870a8eebd82SJames Collins
18719cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
1872ab45ba71SJames Collins
18739cff245bSJames Collins        if ($searchCurrentNS === true) {
18749cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
18759cff245bSJames Collins        }
18769cff245bSJames Collins        if ($propagate === true) {
1877ab45ba71SJames Collins            $prefix[] = ':';
1878ab45ba71SJames Collins            $prefix[] = ':wiki:';
1879a8eebd82SJames Collins        }
1880ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
1881*3a385f2cSJames Collins        if (empty($theme) === false) {
18829cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
18839cff245bSJames Collins        }
1884ab45ba71SJames Collins        $prefix[] = 'images/';
1885ab45ba71SJames Collins
18869cff245bSJames Collins        $search = [];
1887ab45ba71SJames Collins        foreach ($prefix as $pitem) {
1888ab45ba71SJames Collins            foreach ($ext as $eitem) {
1889ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
1890ab45ba71SJames Collins            }
1891ab45ba71SJames Collins        }
1892ab45ba71SJames Collins
1893ab45ba71SJames Collins        $img = '';
1894ab45ba71SJames Collins        $file = '';
1895ab45ba71SJames Collins        $url = '';
1896ab45ba71SJames Collins        $ismedia = false;
1897ab45ba71SJames Collins        $found = false;
1898ab45ba71SJames Collins
1899ab45ba71SJames Collins        foreach ($search as $img) {
1900*3a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
1901ab45ba71SJames Collins                $file    = mediaFN($img);
1902ab45ba71SJames Collins                $ismedia = true;
1903ab45ba71SJames Collins            } else {
1904ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
1905ab45ba71SJames Collins                $ismedia = false;
1906ab45ba71SJames Collins            }
1907ab45ba71SJames Collins
19089cff245bSJames Collins            if (file_exists($file) === true) {
1909ab45ba71SJames Collins                $found = true;
1910ab45ba71SJames Collins                break;
1911ab45ba71SJames Collins            }
1912ab45ba71SJames Collins        }
1913ab45ba71SJames Collins
19149cff245bSJames Collins        if ($found === false) {
19159cff245bSJames Collins            return false;
19169cff245bSJames Collins        }
1917ab45ba71SJames Collins
19189cff245bSJames Collins        if ($ismedia === true) {
1919ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
1920ab45ba71SJames Collins        } else {
1921ab45ba71SJames Collins            $url = tpl_basedir() . $img;
1922ab45ba71SJames Collins        }
1923ab45ba71SJames Collins
1924ab45ba71SJames Collins        return $url;
1925ab45ba71SJames Collins    }
1926ab45ba71SJames Collins
1927a8eebd82SJames Collins
1928a8eebd82SJames Collins    /**
1929ab45ba71SJames Collins     * Print or return the page title
1930ab45ba71SJames Collins     *
19319cff245bSJames Collins     * @param string $page Page id or empty string for current page.
1932ab45ba71SJames Collins     * @return string      generated content
1933ab45ba71SJames Collins     */
19349cff245bSJames Collins    public function getPageTitle(string $page = '')
193510b40067Snomadjimbob    {
1936ab45ba71SJames Collins        global $ID, $conf;
1937ab45ba71SJames Collins
1938ab45ba71SJames Collins        $html = '';
1939ab45ba71SJames Collins
1940*3a385f2cSJames Collins        if (empty($page) === true) {
19419cff245bSJames Collins            $page = $ID;
19429cff245bSJames Collins        }
1943ab45ba71SJames Collins
1944ab45ba71SJames Collins        $html = p_get_first_heading($page);
1945ab45ba71SJames Collins        $html = strip_tags($html);
1946ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
1947ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
1948ab45ba71SJames Collins        $html = trim($html);
1949ab45ba71SJames Collins
1950ab45ba71SJames Collins        return $html;
1951ab45ba71SJames Collins    }
1952a8eebd82SJames Collins
1953a8eebd82SJames Collins
1954a8eebd82SJames Collins    /**
1955a8eebd82SJames Collins     * Return inline theme icon
1956a8eebd82SJames Collins     *
19579cff245bSJames Collins     * @param   string $type Icon to retreive.
19589cff245bSJames Collins     * @return  string       HTML icon content
1959a8eebd82SJames Collins     */
19609cff245bSJames Collins    public function mikioInlineIcon(string $type)
196110b40067Snomadjimbob    {
1962a8eebd82SJames Collins        switch ($type) {
1963a8eebd82SJames Collins            case 'wrench':
19649cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
19659cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,53.152542,1217.0847)"><path d="m 384,64 q 0,26 -19,45 -19,19
19669cff245bSJames Collins-45,19 -26,0 -45,-19 -19,-19 -19,-45 0,-26 19,-45 19,-19 45,-19 26,0 45,19 19,19 19,45 z m 644,420 -682,-682 q -37,-37
19679cff245bSJames Collins-90,-37 -52,0 -91,37 L 59,-90 Q 21,-54 21,0 21,53 59,91 L 740,772 Q 779,674 854.5,598.5 930,523 1028,484 z m 634,435 q
19689cff245bSJames Collins0,-39 -23,-106 Q 1592,679 1474.5,595.5 1357,512 1216,512 1031,512 899.5,643.5 768,775 768,960 q 0,185 131.5,316.5 131.5,
19699cff245bSJames Collins131.5 316.5,131.5 58,0 121.5,-16.5 63.5,-16.5 107.5,-46.5 16,-11 16,-28 0,-17 -16,-28 L 1152,1120 V 896 l 193,-107 q 5,
19709cff245bSJames Collins3 79,48.5 74,45.5 135.5,81 61.5,35.5 70.5,35.5 15,0 23.5,-10 8.5,-10 8.5,-25 z"/></g></svg>';
1971a8eebd82SJames Collins            case 'file':
19729cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
19739cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991"><path d="M 128,0 H 1152 V 768
19749cff245bSJames CollinsH 736 q -40,0 -68,28 -28,28 -28,68 v 416 H 128 V 0 z m 640,896 h 299 L 768,1195 V 896 z M 1280,768 V -32 q 0,-40 -28,
19759cff245bSJames Collins-68 -28,-28 -68,-28 H 96 q -40,0 -68,28 -28,28 -28,68 v 1344 q 0,40 28,68 28,28 68,28 h 544 q 40,0 88,-20 48,-20 76,-48
19769cff245bSJames Collinsl 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0"
19779cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
1978a8eebd82SJames Collins            case 'gear':
19799cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
19809cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"><path d="m 1024,640 q 0,106
19819cff245bSJames Collins-75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 0,-106 75,-181 75,-75 181,-75 106,0 181,75 75,75 75,181 z m
19829cff245bSJames Collins512,109 V 527 q 0,-12 -8,-23 -8,-11 -20,-13 l -185,-28 q -19,-54 -39,-91 35,-50 107,-138 10,-12 10,-25 0,-13 -9,-23 -27,
19839cff245bSJames Collins-37 -99,-108 -72,-71 -94,-71 -12,0 -26,9 l -138,108 q -44,-23 -91,-38 -16,-136 -29,-186 -7,-28 -36,-28 H 657 q -14,0
19849cff245bSJames Collins-24.5,8.5 Q 622,-111 621,-98 L 593,86 q -49,16 -90,37 L 362,16 Q 352,7 337,7 323,7 312,18 186,132 147,186 q -7,10 -7,23
19859cff245bSJames Collins0,12 8,23 15,21 51,66.5 36,45.5 54,70.5 -27,50 -41,99 L 29,495 Q 16,497 8,507.5 0,518 0,531 v 222 q 0,12 8,23 8,11 19,
19869cff245bSJames Collins13 l 186,28 q 14,46 39,92 -40,57 -107,138 -10,12 -10,24 0,10 9,23 26,36 98.5,107.5 72.5,71.5 94.5,71.5 13,0 26,-10 l
19879cff245bSJames Collins138,-107 q 44,23 91,38 16,136 29,186 7,28 36,28 h 222 q 14,0 24.5,-8.5 Q 914,1391 915,1378 l 28,-184 q 49,-16 90,-37 l
19889cff245bSJames Collins142,107 q 9,9 24,9 13,0 25,-10 129,-119 165,-170 7,-8 7,-22 0,-12 -8,-23 -15,-21 -51,-66.5 -36,-45.5 -54,-70.5 26,-50
19899cff245bSJames Collins41,-98 l 183,-28 q 13,-2 21,-12.5 8,-10.5 8,-23.5 z" id="path3029" inkscape:connector-curvature="0" /></g></svg>';
1990a8eebd82SJames Collins            case 'user':
19919cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
19929cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M 1408,131 Q 1408,11 1335,-58.5
19939cff245bSJames Collins1262,-128 1141,-128 H 267 Q 146,-128 73,-58.5 0,11 0,131 0,184 3.5,234.5 7,285 17.5,343.5 28,402 44,452 q 16,50 43,97.5
19949cff245bSJames Collins27,47.5 62,81 35,33.5 85.5,53.5 50.5,20 111.5,20 9,0 42,-21.5 33,-21.5 74.5,-48 41.5,-26.5 108,-48 Q 637,565 704,565 q
19959cff245bSJames Collins67,0 133.5,21.5 66.5,21.5 108,48 41.5,26.5 74.5,48 33,21.5 42,21.5 61,0 111.5,-20 50.5,-20 85.5,-53.5 35,-33.5 62,-81
19969cff245bSJames Collins27,-47.5 43,-97.5 16,-50 26.5,-108.5 10.5,-58.5 14,-109 Q 1408,184 1408,131 z m -320,893 Q 1088,865 975.5,752.5 863,640
19979cff245bSJames Collins704,640 545,640 432.5,752.5 320,865 320,1024 320,1183 432.5,1295.5 545,1408 704,1408 863,1408 975.5,1295.5 1088,1183
19989cff245bSJames Collins1088,1024 z"/></g></svg>';
1999a8eebd82SJames Collins            case 'search':
20009cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
20019cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M27 24.57l-5.647-5.648a8.895 8.895 0 0 0 1.522-4.984C22.875 9.01
20029cff245bSJames Collins18.867 5 13.938 5 9.01 5 5 9.01 5 13.938c0 4.929 4.01 8.938 8.938 8.938a8.887 8.887 0 0 0 4.984-1.522L24.568 27 27
20039cff245bSJames Collins24.57zm-13.062-4.445a6.194 6.194 0 0 1-6.188-6.188 6.195 6.195 0 0 1 6.188-6.188 6.195 6.195 0 0 1 6.188 6.188 6.195
20049cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2005a8eebd82SJames Collins            case 'home':
20069cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
20079cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><g transform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015">
20089cff245bSJames Collins<path d="M 1408,544 V 64 Q 1408,38 1389,19 1370,0 1344,0 H 960 V 384 H 704 V 0 H 320 q -26,0 -45,19 -19,19 -19,
20099cff245bSJames Collins45 v 480 q 0,1 0.5,3 0.5,2 0.5,3 l 575,474 575,-474 q 1,-2 1,-6 z m 223,69 -62,-74 q -8,-9 -21,-11 h -3 q -13,
20109cff245bSJames Collins0 -21,7 L 832,1112 140,535 q -12,-8 -24,-7 -13,2 -21,11 l -62,74 q -8,10 -7,23.5 1,13.5 11,21.5 l 719,
20119cff245bSJames Collins599 q 32,26 76,26 44,0 76,-26 l 244,-204 v 195 q 0,14 9,23 9,9 23,9 h 192 q 14,0 23,-9 9,-9 9,-23 V 840 l 219,
20129cff245bSJames Collins-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0"
20139cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
20149cff245bSJames Collins        }//end switch
2015ab45ba71SJames Collins
2016a8eebd82SJames Collins        return '';
2017a8eebd82SJames Collins    }
2018ab45ba71SJames Collins
2019a8eebd82SJames Collins    /**
2020a8eebd82SJames Collins     * Finalize theme
20219cff245bSJames Collins     *
20229cff245bSJames Collins     * @return void
2023a8eebd82SJames Collins     */
202410b40067Snomadjimbob    public function finalize()
202510b40067Snomadjimbob    {
2026a8eebd82SJames Collins    }
20271785fc73SJames Collins
20281785fc73SJames Collins    /**
20291785fc73SJames Collins     * Show Messages
20309cff245bSJames Collins     *
20319cff245bSJames Collins     * @return void
20321785fc73SJames Collins     */
203310b40067Snomadjimbob    public function showMessages()
203410b40067Snomadjimbob    {
20351785fc73SJames Collins        global $ACT;
20361785fc73SJames Collins
20379cff245bSJames Collins        if ($this->lessIgnored === true) {
20389cff245bSJames Collins            msg(
20399cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
20409cff245bSJames Collins                2,
20419cff245bSJames Collins                '',
20429cff245bSJames Collins                '',
20439cff245bSJames Collins                MSG_ADMINS_ONLY
20449cff245bSJames Collins            );
2045a8df40efSJames Collins        }
2046a8df40efSJames Collins
20471785fc73SJames Collins        $show = $this->getConf('showNotifications');
2048*3a385f2cSJames Collins        if (
2049*3a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
2050*3a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
2051*3a385f2cSJames Collins        ) {
20521785fc73SJames Collins            global $MSG, $MSG_shown;
20531785fc73SJames Collins
20549cff245bSJames Collins            if (isset($MSG) === false) {
20551785fc73SJames Collins                return;
20561785fc73SJames Collins            }
20571785fc73SJames Collins
20589cff245bSJames Collins            if (isset($MSG_shown) === false) {
20599cff245bSJames Collins                $MSG_shown = [];
2060a8df40efSJames Collins            }
20611785fc73SJames Collins
20621785fc73SJames Collins            foreach ($MSG as $msg) {
20631785fc73SJames Collins                $hash = md5($msg['msg']);
20649cff245bSJames Collins                if (isset($MSG_shown[$hash]) === true) {
20651785fc73SJames Collins                    continue;
20661785fc73SJames Collins                }
20671785fc73SJames Collins                // skip double messages
20681785fc73SJames Collins
20699cff245bSJames Collins                if (info_msg_allowed($msg) === true) {
20709cff245bSJames Collins                    echo '<div class="' . $msg['lvl'] . '">';
20719cff245bSJames Collins                    echo $msg['msg'];
20729cff245bSJames Collins                    echo '</div>';
20731785fc73SJames Collins                }
20741785fc73SJames Collins
2075a8df40efSJames Collins                $MSG_shown[$hash] = true;
20761785fc73SJames Collins            }
20771785fc73SJames Collins
20781785fc73SJames Collins            unset($GLOBALS['MSG']);
20799cff245bSJames Collins        }//end if
20801785fc73SJames Collins    }
20817ac0a6efSJames Collins
20827ac0a6efSJames Collins    /**
20837ac0a6efSJames Collins     * Dokuwiki version
20847ac0a6efSJames Collins     *
20857ac0a6efSJames Collins     * @return  string        the dw version name
20867ac0a6efSJames Collins     */
20879cff245bSJames Collins    public function dwVersion()
20889cff245bSJames Collins    {
20899cff245bSJames Collins        if (function_exists('getVersionData') === true) {
20907ac0a6efSJames Collins            $version_data = getVersionData();
20919cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
20927ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
20937ac0a6efSJames Collins                if (count($version_items) >= 2) {
20947ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
20957ac0a6efSJames Collins                }
20967ac0a6efSJames Collins            }
20977ac0a6efSJames Collins        }
20987ac0a6efSJames Collins
20997ac0a6efSJames Collins        return 'unknown';
21007ac0a6efSJames Collins    }
2101e4c4fb13SJames Collins
2102e4c4fb13SJames Collins    /**
2103e4c4fb13SJames Collins     * Dokuwiki version number
2104e4c4fb13SJames Collins     *
2105e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2106e4c4fb13SJames Collins     */
21079cff245bSJames Collins    public function dwVersionNumber()
21089cff245bSJames Collins    {
21099cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2110e4c4fb13SJames Collins            $version_data = getVersionData();
21119cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2112e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2113e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2114e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2115e4c4fb13SJames Collins                }
2116e4c4fb13SJames Collins            }
2117e4c4fb13SJames Collins        }
2118e4c4fb13SJames Collins
2119e4c4fb13SJames Collins        return 0;
2120e4c4fb13SJames Collins    }
2121a8eebd82SJames Collins}
2122ab45ba71SJames Collins
2123ab45ba71SJames Collinsglobal $TEMPLATE;
212447161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2125