xref: /template/mikio/mikio.php (revision 95372bff35b14565058a7a3b05c85cf2f77e0e78)
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
643a385f2cSJames 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
1073a385f2cSJames 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
1203a385f2cSJames 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
1263a385f2cSJames 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) {
1533a385f2cSJames 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
220*95372bffSJames Collins
221*95372bffSJames Collins    // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing
222*95372bffSJames Collins
223*95372bffSJames Collins
224a8eebd82SJames Collins    /**
225ab45ba71SJames Collins     * Retreive and parse theme configuration options
226c165b184SJames Collins     *
2279cff245bSJames Collins     * @param   string $key     The configuration key to retreive.
2289cff245bSJames Collins     * @param   mixed  $default If key doesn't exist, return this value.
229ab45ba71SJames Collins     * @return  mixed           parsed value of configuration
230c165b184SJames Collins     */
231*95372bffSJames Collins    public function getConf(string $key, $default = false)
23210b40067Snomadjimbob    {
233c165b184SJames Collins        $value = tpl_getConf($key, $default);
234c165b184SJames Collins
2353a385f2cSJames Collins        $data = [
2363a385f2cSJames Collins            ['keys' => ['navbarDWMenuType'],                'type' => 'choice',
2373a385f2cSJames Collins                'values' => ['both', 'icons', 'text']
2383a385f2cSJames Collins            ],
2393a385f2cSJames Collins            ['keys' => ['navbarDWMenuCombine'],             'type' => 'choice',
2403a385f2cSJames Collins                'values' => ['combine', 'seperate', 'dropdown']
2413a385f2cSJames Collins            ],
2423a385f2cSJames Collins            ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'],
2433a385f2cSJames Collins                'type' => 'choice',
2443a385f2cSJames Collins                'values' => ['none', 'custom', 'search', 'dokuwiki'],
2453a385f2cSJames Collins                'default' => [
2463a385f2cSJames Collins                    'navbarPosLeft' => 'none',
2473a385f2cSJames Collins                    'navbarPosMiddle' => 'search',
2483a385f2cSJames Collins                    'navbarPosRight' => 'dokuwiki'
2493a385f2cSJames Collins                ]
2503a385f2cSJames Collins            ],
2513a385f2cSJames Collins            ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink',
2523a385f2cSJames Collins                'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile',
2533a385f2cSJames Collins                'navbarItemShowAdmin'
2543a385f2cSJames Collins            ],
2553a385f2cSJames Collins                'type' => 'choice',
2563a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2573a385f2cSJames Collins            ],
2583a385f2cSJames Collins            ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'],
2593a385f2cSJames Collins                'type' => 'choice',
2603a385f2cSJames Collins                'values' => ['always', 'never']
2613a385f2cSJames Collins            ],
2623a385f2cSJames Collins            ['keys' => ['searchButton'],                    'type' => 'choice',
2633a385f2cSJames Collins                'values' => ['icon', 'text']
2643a385f2cSJames Collins            ],
2653a385f2cSJames Collins            ['keys' => ['breadcrumbPosition', 'youareherePosition'],
2663a385f2cSJames Collins                'type' => 'choice',
2673a385f2cSJames Collins                'values' => ['top', 'hero', 'page', 'none']
2683a385f2cSJames Collins            ],
2693a385f2cSJames Collins            ['keys' => ['youarehereHome'],                  'type' => 'choice',
2703a385f2cSJames Collins                'values' => ['page title', 'home', 'icon', 'none']
2713a385f2cSJames Collins            ],
2723a385f2cSJames Collins            ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'],
2733a385f2cSJames Collins                'type' => 'choice',
2743a385f2cSJames Collins                'values' => ['none', 'logged in user', 'search', 'content', 'tags'],
2753a385f2cSJames Collins                'default' => [
2763a385f2cSJames Collins                    'sidebarLeftRow1' => 'logged in user',
2773a385f2cSJames Collins                    'sidebarLeftRow2' => 'search',
2783a385f2cSJames Collins                    'sidebarLeftRow3' => 'content'
2793a385f2cSJames Collins                ]
2803a385f2cSJames Collins            ],
2813a385f2cSJames Collins            ['keys' => ['pageToolsFloating', 'pageToolsFooter'],
2823a385f2cSJames Collins                'type' => 'choice',
2833a385f2cSJames Collins                'values' => ['always', 'none', 'page editors']
2843a385f2cSJames Collins            ],
2853a385f2cSJames Collins            ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink',
2863a385f2cSJames Collins                'pageToolsShowTop'
2873a385f2cSJames Collins            ],
2883a385f2cSJames Collins                'type' => 'choice',
2893a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2903a385f2cSJames Collins            ],
2913a385f2cSJames Collins            ['keys' => ['showNotifications'],               'type' => 'choice',
2923a385f2cSJames Collins                'values' => ['admin', 'always', 'none']
2933a385f2cSJames Collins            ],
2943a385f2cSJames Collins            ['keys' => ['licenseType'],                     'type' => 'choice',
2953a385f2cSJames Collins                'values' => ['badge', 'button', 'none']
2963a385f2cSJames Collins            ],
2973a385f2cSJames Collins            ['keys' => ['navbarUseTitleIcon'],              'type' => 'bool'],
2983a385f2cSJames Collins            ['keys' => ['navbarUseTitleText'],              'type' => 'bool'],
2993a385f2cSJames Collins            ['keys' => ['navbarUseTaglineText'],            'type' => 'bool'],
3003a385f2cSJames Collins            ['keys' => ['navbarShowSub'],                   'type' => 'bool'],
3013a385f2cSJames Collins            ['keys' => ['heroTitle'],                       'type' => 'bool'],
3023a385f2cSJames Collins            ['keys' => ['heroImagePropagation'],            'type' => 'bool'],
3033a385f2cSJames Collins            ['keys' => ['breadcrumbPrefix'],                'type' => 'bool'],
3043a385f2cSJames Collins            ['keys' => ['breadcrumbSep'],                   'type' => 'bool'],
3053a385f2cSJames Collins            ['keys' => ['youareherePrefix'],                'type' => 'bool'],
3063a385f2cSJames Collins            ['keys' => ['youarehereSep'],                   'type' => 'bool'],
3073a385f2cSJames Collins            ['keys' => ['sidebarShowLeft'],                 'type' => 'bool'],
3083a385f2cSJames Collins            ['keys' => ['sidebarShowRight'],                'type' => 'bool'],
3093a385f2cSJames Collins            ['keys' => ['tocFull'],                         'type' => 'bool'],
3103a385f2cSJames Collins            ['keys' => ['footerSearch'],                    'type' => 'bool'],
3113a385f2cSJames Collins            ['keys' => ['licenseImageOnly'],                'type' => 'bool'],
3123a385f2cSJames Collins            ['keys' => ['includePageUseACL'],               'type' => 'bool'],
3133a385f2cSJames Collins            ['keys' => ['includePagePropagate'],            'type' => 'bool'],
3143a385f2cSJames Collins            ['keys' => ['youarehereHideHome'],              'type' => 'bool'],
3153a385f2cSJames Collins            ['keys' => ['tagsConsolidate'],                 'type' => 'bool'],
3163a385f2cSJames Collins            ['keys' => ['footerInPage'],                    'type' => 'bool'],
3173a385f2cSJames Collins            ['keys' => ['sidebarMobileDefaultCollapse'],    'type' => 'bool'],
3183a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowLeft'],           'type' => 'bool'],
3193a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowRight'],          'type' => 'bool'],
3203a385f2cSJames Collins            ['keys' => ['searchUseTypeahead'],              'type' => 'bool'],
3213a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
3223a385f2cSJames Collins
3233a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
3243a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
3253a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
3263a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
3273a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
3283a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
3293a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
3303a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
3313a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
3323a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
3333a385f2cSJames Collins
3343a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
3353a385f2cSJames Collins        ];
3363a385f2cSJames Collins
3373a385f2cSJames Collins        foreach ($data as $row) {
3383a385f2cSJames Collins            // does not check case....
3393a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
340*95372bffSJames Collins                if (array_key_exists('type', $row) === true) {
3413a385f2cSJames Collins                    switch ($row['type']) {
3423a385f2cSJames Collins                        case 'bool':
3433a385f2cSJames Collins                            return (bool) $value;
3443a385f2cSJames Collins                        case 'int':
3453a385f2cSJames Collins                            return (int) $value;
3463a385f2cSJames Collins                        case 'string':
3473a385f2cSJames Collins                            return $value;
3483a385f2cSJames Collins                        case 'less':
34929118ed7SJames Collins                            $value = (bool) $value;
350a8df40efSJames Collins                            $lessAvailable = true;
351a8df40efSJames Collins
352a8df40efSJames Collins                            // check for less library
353a8df40efSJames Collins                            $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
3549cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
355a8df40efSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3569cff245bSJames Collins                            }
3579cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
358a8df40efSJames Collins                                $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3599cff245bSJames Collins                            }
3609cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
3619cff245bSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] .
3629cff245bSJames Collins                                    '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3639cff245bSJames Collins                            }
3649cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
365a8df40efSJames Collins                                $lessAvailable = false;
366a8df40efSJames Collins                            }
367a8df40efSJames Collins
368a8df40efSJames Collins                            // check for ctype extensions
3699cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
370a8df40efSJames Collins                                $lessAvailable = false;
371a8df40efSJames Collins                            }
372a8df40efSJames Collins
3739cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
374a8df40efSJames Collins                                $this->lessIgnored = true;
37529118ed7SJames Collins                                $value = false;
37629118ed7SJames Collins                            }
3773a385f2cSJames Collins
3783a385f2cSJames Collins                            return $value;
3799cff245bSJames Collins                    }//end switch
3803a385f2cSJames Collins                }//end if
3813a385f2cSJames Collins
3823a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
3833a385f2cSJames Collins                    return $value;
3843a385f2cSJames Collins                }
3853a385f2cSJames Collins
3863a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
3873a385f2cSJames Collins                    if (is_array($row['default']) === true) {
3883a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
3893a385f2cSJames Collins                            return $row['default'][$key];
3903a385f2cSJames Collins                        }
3913a385f2cSJames Collins                    } else {
3923a385f2cSJames Collins                        return $row['default'];
3933a385f2cSJames Collins                    }
3943a385f2cSJames Collins                }
3953a385f2cSJames Collins
3963a385f2cSJames Collins                return reset($row['values']);
3973a385f2cSJames Collins            }//end if
3983a385f2cSJames Collins        }//end foreach
399c165b184SJames Collins
400c165b184SJames Collins        return $value;
401c165b184SJames Collins    }
402c165b184SJames Collins
403c165b184SJames Collins
404*95372bffSJames Collins    // phpcs:enable
405*95372bffSJames Collins
406*95372bffSJames Collins
407c165b184SJames Collins    /**
408a8eebd82SJames Collins     * Check if a page exist in directory or namespace
409c165b184SJames Collins     *
4109cff245bSJames Collins     * @param   string $page Page/namespace to search.
411a8eebd82SJames Collins     * @return  boolean      if page exists
412c165b184SJames Collins     */
4139cff245bSJames Collins    public function pageExists(string $page)
41410b40067Snomadjimbob    {
415ab45ba71SJames Collins        ob_start();
416a8eebd82SJames Collins        tpl_includeFile($page . '.html');
417ab45ba71SJames Collins        $html = ob_get_contents();
418ab45ba71SJames Collins        ob_end_clean();
419a8eebd82SJames Collins
4203a385f2cSJames Collins        if (empty($html) === false) {
4219cff245bSJames Collins            return true;
4229cff245bSJames Collins        }
423a8eebd82SJames Collins
424a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
425a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
426a8eebd82SJames Collins
4279cff245bSJames Collins        if ($propagate === true) {
4289cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4299cff245bSJames Collins                return true;
4309cff245bSJames Collins            }
4319cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4329cff245bSJames Collins            return true;
433ab45ba71SJames Collins        }
434ab45ba71SJames Collins
4359cff245bSJames Collins        return false;
436ab45ba71SJames Collins    }
437ab45ba71SJames Collins
438a8eebd82SJames Collins
439c165b184SJames Collins    /**
440a8eebd82SJames Collins     * Print or return page from directory or namespace
4412b4583abSJames Collins     *
4429cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4439cff245bSJames Collins     * @param   boolean $print        Print content.
4449cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4459cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
446ab45ba71SJames Collins     * @return  string                contents of page found
4472b4583abSJames Collins     */
4489cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4492b4583abSJames Collins    {
450a8eebd82SJames Collins        ob_start();
451a8eebd82SJames Collins        tpl_includeFile($page . '.html');
452a8eebd82SJames Collins        $html = ob_get_contents();
453a8eebd82SJames Collins        ob_end_clean();
454a8eebd82SJames Collins
4553a385f2cSJames Collins        if (empty($html) === true) {
456a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
457a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
458ab45ba71SJames Collins            $html = '';
4592b4583abSJames Collins
460ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
461ab45ba71SJames Collins        }
4622b4583abSJames Collins
4633a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
464ab45ba71SJames Collins            $html = $this->parseContent($html);
465ab45ba71SJames Collins        }
4662b4583abSJames Collins
4673a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
4689cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
4699cff245bSJames Collins        }
4702b4583abSJames Collins
4719cff245bSJames Collins        if ($print === true) {
4729cff245bSJames Collins            echo $html;
4739cff245bSJames Collins        }
474ab45ba71SJames Collins        return $html;
4752b4583abSJames Collins    }
4762b4583abSJames Collins
477a8eebd82SJames Collins
478a8eebd82SJames Collins    /**
479a8eebd82SJames Collins     * Print or return logged in user information
480a8eebd82SJames Collins     *
4819cff245bSJames Collins     * @param   boolean $print Print content.
482a8eebd82SJames Collins     * @return  string         user information
483a8eebd82SJames Collins     */
4849cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
48510b40067Snomadjimbob    {
486a8eebd82SJames Collins        $html = '';
487a8eebd82SJames Collins
4889cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
489a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
490a8eebd82SJames Collins            ob_start();
491a8eebd82SJames Collins            tpl_userinfo();
492a8eebd82SJames Collins            $html .= ob_get_contents();
493a8eebd82SJames Collins            ob_end_clean();
494a8eebd82SJames Collins            $html .= '</div>';
4952b4583abSJames Collins        }
496a8eebd82SJames Collins
4979cff245bSJames Collins        if ($print === true) {
4989cff245bSJames Collins            echo $html;
4999cff245bSJames Collins        }
500a8eebd82SJames Collins        return $html;
5012b4583abSJames Collins    }
5022b4583abSJames Collins
5032b4583abSJames Collins
504a8eebd82SJames Collins    /**
505a8eebd82SJames Collins     * Print or return DokuWiki Menu
506a8eebd82SJames Collins     *
5079cff245bSJames Collins     * @param   boolean $print Print content.
508a8eebd82SJames Collins     * @return  string         contents of the menu
509a8eebd82SJames Collins     */
5109cff245bSJames Collins    public function includeDWMenu(bool $print = true)
51110b40067Snomadjimbob    {
5122b4583abSJames Collins        global $lang;
5132b4583abSJames Collins        global $USERINFO;
514c165b184SJames Collins
5159cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
516a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5172b4583abSJames Collins
518ab45ba71SJames Collins        $pageToolsMenu = [];
519ab45ba71SJames Collins        $siteToolsMenu = [];
520ab45ba71SJames Collins        $userToolsMenu = [];
521c165b184SJames Collins
522ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
523ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
524ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5252b4583abSJames Collins
5262b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5272b4583abSJames Collins        foreach ($items as $item) {
5289cff245bSJames Collins            if ($item->getType() !== 'top') {
529ab45ba71SJames Collins                $itemHtml = '';
5302b4583abSJames Collins
531905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5329cff245bSJames Collins                if (
5333a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5343a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5353a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5369cff245bSJames Collins                ) {
5379cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5389cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5399cff245bSJames Collins                    if ($showIcons === true) {
5409cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5419cff245bSJames Collins                    }
5429cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5439cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5449cff245bSJames Collins                    }
545ab45ba71SJames Collins                    $itemHtml .= '</a>';
546ab45ba71SJames Collins
547ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5482b4583abSJames Collins                }
5499cff245bSJames Collins            }//end if
5509cff245bSJames Collins        }//end foreach
5512b4583abSJames Collins
552ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
553ab45ba71SJames Collins        foreach ($items as $item) {
554ab45ba71SJames Collins            $itemHtml = '';
5552b4583abSJames Collins
556905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5579cff245bSJames Collins            if (
5583a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5593a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5603a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5619cff245bSJames Collins            ) {
5629cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5639cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5649cff245bSJames Collins                if ($showIcons === true) {
5659cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5669cff245bSJames Collins                }
5679cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5689cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5699cff245bSJames Collins                }
570ab45ba71SJames Collins                $itemHtml .= '</a>';
5712b4583abSJames Collins
572ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
5732b4583abSJames Collins            }
5749cff245bSJames Collins        }//end foreach
5752b4583abSJames Collins
576ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
577ab45ba71SJames Collins        foreach ($items as $item) {
578ab45ba71SJames Collins            $itemHtml = '';
579ab45ba71SJames Collins
580905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5819cff245bSJames Collins            if (
5823a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5833a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5843a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5859cff245bSJames Collins            ) {
5869cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
5879cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5889cff245bSJames Collins                if ($showIcons === true) {
5899cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5909cff245bSJames Collins                }
5919cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5929cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5939cff245bSJames Collins                }
594ab45ba71SJames Collins                $itemHtml .= '</a>';
595ab45ba71SJames Collins
596ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
597ab45ba71SJames Collins            }
5989cff245bSJames Collins        }//end foreach
599ab45ba71SJames Collins
600ab45ba71SJames Collins
601ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
602ab45ba71SJames Collins            case 'dropdown':
603ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6049cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6059cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6069cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6079cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6089cff245bSJames Collins                '</span>') . '</a>';
609a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
610ab45ba71SJames Collins
611ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
612ab45ba71SJames Collins                    $html .= $item;
613ab45ba71SJames Collins                }
614ab45ba71SJames Collins
615ab45ba71SJames Collins                $html .= '</div>';
616ab45ba71SJames Collins                $html .= '</li>';
617ab45ba71SJames Collins
618a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6199cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6209cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6219cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6229cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6239cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
624a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
625ab45ba71SJames Collins
626ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
627ab45ba71SJames Collins                    $html .= $item;
628ab45ba71SJames Collins                }
629ab45ba71SJames Collins
630ab45ba71SJames Collins                $html .= '</div>';
631ab45ba71SJames Collins                $html .= '</li>';
632ab45ba71SJames Collins
633a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6349cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6359cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6369cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6379cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6389cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
639a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
640ab45ba71SJames Collins
641ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
642ab45ba71SJames Collins                    $html .= $item;
643ab45ba71SJames Collins                }
644ab45ba71SJames Collins
645ab45ba71SJames Collins                $html .= '</div>';
646ab45ba71SJames Collins                $html .= '</li>';
647ab45ba71SJames Collins
648ab45ba71SJames Collins                break;
649ab45ba71SJames Collins
650ab45ba71SJames Collins            case 'combine':
651ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6529cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6539cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6549cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6559cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
656a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
657ab45ba71SJames Collins
658ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
659ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
660ab45ba71SJames Collins                    $html .= $item;
661ab45ba71SJames Collins                }
662ab45ba71SJames Collins
663ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
664ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
665ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
666ab45ba71SJames Collins                    $html .= $item;
667ab45ba71SJames Collins                }
668ab45ba71SJames Collins
669ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
670ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
671ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
672ab45ba71SJames Collins                    $html .= $item;
673ab45ba71SJames Collins                }
674ab45ba71SJames Collins
675ab45ba71SJames Collins                $html .= '</div>';
676ab45ba71SJames Collins                $html .= '</li>';
677ab45ba71SJames Collins                break;
678ab45ba71SJames Collins
679ab45ba71SJames Collins            default:    // seperate
680ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
681a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
682ab45ba71SJames Collins                }
683ab45ba71SJames Collins
684ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
685a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
686a8eebd82SJames Collins                }
687a8eebd82SJames Collins
688a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
689a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
690ab45ba71SJames Collins                }
691ab45ba71SJames Collins
692ab45ba71SJames Collins                break;
6939cff245bSJames Collins        }//end switch
694ab45ba71SJames Collins
695ab45ba71SJames Collins        $html .= '</ul>';
696ab45ba71SJames Collins
6979cff245bSJames Collins        if ($print === true) {
6989cff245bSJames Collins            echo $html;
6999cff245bSJames Collins        }
700a8eebd82SJames Collins        return $html;
701a8eebd82SJames Collins    }
702a8eebd82SJames Collins
703a8eebd82SJames Collins
704a8eebd82SJames Collins    /**
705a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
706a8eebd82SJames Collins     *
7079cff245bSJames Collins     * @param string $str String to generate nav.
708a8eebd82SJames Collins     * @return string     nav elements generated
709a8eebd82SJames Collins     */
7109cff245bSJames Collins    public function stringToNav(string $str)
71110b40067Snomadjimbob    {
712a8eebd82SJames Collins        $html = '';
713a8eebd82SJames Collins
7143a385f2cSJames Collins        if (empty($str) === false) {
715a8eebd82SJames Collins            $items = explode(';', $str);
716a8eebd82SJames Collins            if (count($items) > 0) {
717a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
718a8eebd82SJames Collins                foreach ($items as $item) {
719a8eebd82SJames Collins                    $parts = explode('|', $item);
720a8eebd82SJames Collins                    if ($parts > 1) {
7219cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7229cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7239cff245bSJames Collins                            '</a></li>';
724a8eebd82SJames Collins                    }
725a8eebd82SJames Collins                }
726a8eebd82SJames Collins                $html .= '</ul>';
727a8eebd82SJames Collins            }
7282b4583abSJames Collins        }
7292b4583abSJames Collins
730ab45ba71SJames Collins        return $html;
7312b4583abSJames Collins    }
7322b4583abSJames Collins
733a8eebd82SJames Collins    /**
734ab45ba71SJames Collins     * print or return the main navbar
7352b4583abSJames Collins     *
7369cff245bSJames Collins     * @param boolean $print   Print the navbar.
7379cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
738ab45ba71SJames Collins     * @return string          generated content
7392b4583abSJames Collins     */
7409cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
74110b40067Snomadjimbob    {
742b39ad16dSJames Collins        global $conf, $USERINFO;
743d3d7d2b7SJames Collins
744d3d7d2b7SJames Collins        $homeUrl = wl();
745d3d7d2b7SJames Collins
7469cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
747d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
7483a385f2cSJames Collins            if (empty($p) === false) {
7499cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
750d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
751d3d7d2b7SJames Collins                }
752d3d7d2b7SJames Collins            }
753b39ad16dSJames Collins        } else {
7549cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
755b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
756b39ad16dSJames Collins                if (strlen($url) > 0) {
757b39ad16dSJames Collins                    $homeUrl = $url;
758d3d7d2b7SJames Collins                }
759b39ad16dSJames Collins            } else {
760b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
761b39ad16dSJames Collins                if (strlen($url) > 0) {
762b39ad16dSJames Collins                    $homeUrl = $url;
763b39ad16dSJames Collins                }
764b39ad16dSJames Collins            }
765b39ad16dSJames Collins        }
766d3d7d2b7SJames Collins
767ab45ba71SJames Collins        $html = '';
76847161538SJames Collins
7699cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
7709cff245bSJames Collins            '">';
771f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
772d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
7739cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
774ab45ba71SJames Collins            // Brand image
7759cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
7769cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
7779cff245bSJames Collins                ;
7783a385f2cSJames Collins                if (empty($logo) === false) {
779f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
780f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
781f0241fc4SJames Collins                    $styles = '';
782f0241fc4SJames Collins
783f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
7849cff245bSJames Collins                        if (ctype_digit($width) === true) {
785f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
7869cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
787f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
7889cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
7897a92c19bSJames Collins                            $styles .= 'max-width:none;';
790f0241fc4SJames Collins                        }
791f0241fc4SJames Collins
7929cff245bSJames Collins                        if (ctype_digit($height) === true) {
793f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
7949cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
795f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
7969cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
7977a92c19bSJames Collins                            $styles .= 'max-height:none;';
798f0241fc4SJames Collins                        }
799f0241fc4SJames Collins
800f0241fc4SJames Collins                        if (strlen($styles) > 0) {
801f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
802f0241fc4SJames Collins                        }
8039cff245bSJames Collins                    }//end if
804f0241fc4SJames Collins
805f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8069cff245bSJames Collins                }//end if
8079cff245bSJames Collins            }//end if
808ab45ba71SJames Collins
809ab45ba71SJames Collins            // Brand title
8109cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
811ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
812a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8139cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
814a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
815ab45ba71SJames Collins                }
816ab45ba71SJames Collins                $html .= '</div>';
817ab45ba71SJames Collins            }
8189cff245bSJames Collins        }//end if
819ab45ba71SJames Collins        $html .= '</a>';
820660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
821ab45ba71SJames Collins
822ab45ba71SJames Collins        // Menus
823ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
824ab45ba71SJames Collins
8259cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8269cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8279cff245bSJames Collins        ];
828a8eebd82SJames Collins        foreach ($menus as $menuType) {
829a8eebd82SJames Collins            switch ($menuType) {
830a8eebd82SJames Collins                case 'custom':
831a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
832a8eebd82SJames Collins                    break;
833a8eebd82SJames Collins                case 'search':
834ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
835ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
836ab45ba71SJames Collins                    $html .= '</div>';
837a8eebd82SJames Collins                    break;
838a8eebd82SJames Collins                case 'dokuwiki':
8399cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
840a8eebd82SJames Collins                    break;
841a8eebd82SJames Collins            }
842a8eebd82SJames Collins        }
843ab45ba71SJames Collins
844ab45ba71SJames Collins        $html .= '</div>';
845f8039bf2SJames Collins        $html .= '</div>';
846ab45ba71SJames Collins        $html .= '</nav>';
847ab45ba71SJames Collins
848a8eebd82SJames Collins        // Sub Navbar
8499cff245bSJames Collins        if ($showSub === true) {
8509cff245bSJames Collins            $sub = $this->includePage('submenu', false);
8513a385f2cSJames Collins            if (empty($sub) === false) {
8529cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
8539cff245bSJames Collins            }
854ab45ba71SJames Collins        }
855ab45ba71SJames Collins
8569cff245bSJames Collins        if ($print === true) {
8579cff245bSJames Collins            echo $html;
8589cff245bSJames Collins        }
859ab45ba71SJames Collins        return $html;
860ab45ba71SJames Collins    }
861ab45ba71SJames Collins
862ab45ba71SJames Collins
863a8eebd82SJames Collins    /**
864a8eebd82SJames Collins     * Is there a sidebar
865a8eebd82SJames Collins     *
8669cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
867a8eebd82SJames Collins     * @return  boolean        if sidebar exists
868a8eebd82SJames Collins     */
8699cff245bSJames Collins    public function sidebarExists(string $prefix = '')
87010b40067Snomadjimbob    {
871a8eebd82SJames Collins        global $conf;
872a8eebd82SJames Collins
8733a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
8749cff245bSJames Collins            $prefix = '';
8759cff245bSJames Collins        }
876a8eebd82SJames Collins
877a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
878a8eebd82SJames Collins    }
879a8eebd82SJames Collins
880a8eebd82SJames Collins
881a8eebd82SJames Collins    /**
882ab45ba71SJames Collins     * Print or return the sidebar content
883ab45ba71SJames Collins     *
8849cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
8859cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
8869cff245bSJames Collins     * @param   boolean $parse  Parse the content.
887ab45ba71SJames Collins     * @return  string          generated content
888ab45ba71SJames Collins     */
8899cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
89010b40067Snomadjimbob    {
891ab45ba71SJames Collins        global $conf, $ID;
892ab45ba71SJames Collins
893ab45ba71SJames Collins        $html = '';
894ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
895ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
896ab45ba71SJames Collins
8973a385f2cSJames Collins        if (empty($confPrefix) === true) {
8989cff245bSJames Collins            $confPrefix = 'Left';
8999cff245bSJames Collins        }
9003a385f2cSJames Collins        if (strcasecmp($prefix, 'Left') === 0) {
9019cff245bSJames Collins            $prefix = '';
9029cff245bSJames Collins        }
903ab45ba71SJames Collins
9043a385f2cSJames Collins        empty($sidebarPage = $conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
905ab45ba71SJames Collins
9069cff245bSJames Collins        if (
9079cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9089cff245bSJames Collins            p_get_metadata($ID, 'nosidebar', false) === false
9099cff245bSJames Collins        ) {
9109cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9113a385f2cSJames Collins            if (empty($content) === false) {
9129cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9139cff245bSJames Collins            }
914ab45ba71SJames Collins
9153a385f2cSJames Collins            if (empty($prefix) === true) {
9169cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9179cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9189cff245bSJames Collins                ];
919ab45ba71SJames Collins
920a8eebd82SJames Collins                foreach ($rows as $row) {
921a8eebd82SJames Collins                    switch ($row) {
922a8eebd82SJames Collins                        case 'search':
9239cff245bSJames Collins                            $html .= $this->includeSearch(false);
924a8eebd82SJames Collins                            break;
925a8eebd82SJames Collins                        case 'logged in user':
9269cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
927a8eebd82SJames Collins                            break;
928a8eebd82SJames Collins                        case 'content':
9299cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9303a385f2cSJames Collins                            if (empty($content) === false) {
9319cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9329cff245bSJames Collins                            }
933a8eebd82SJames Collins                            break;
934a8eebd82SJames Collins                        case 'tags':
935a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
936a8eebd82SJames Collins                    }
937a8eebd82SJames Collins                }
938a8eebd82SJames Collins            } else {
9399cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
9403a385f2cSJames Collins                if (empty($content) === false) {
9419cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9429cff245bSJames Collins                }
9439cff245bSJames Collins            }//end if
9449cff245bSJames Collins
9459cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
9463a385f2cSJames Collins            if (empty($content) === false) {
9479cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
9489cff245bSJames Collins            }
9499cff245bSJames Collins        }//end if
9509cff245bSJames Collins
9513a385f2cSJames Collins        if (empty($html) === true) {
9523a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
9539cff245bSJames Collins                $html = '&nbsp;';
9549cff245bSJames Collins            }
9559cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
9569cff245bSJames Collins                $html = '&nbsp;';
9579cff245bSJames Collins            }
958a8eebd82SJames Collins        }
959ab45ba71SJames Collins
9603a385f2cSJames Collins        if (empty($html) === false) {
9613a385f2cSJames Collins            empty($html = '<aside class="mikio-sidebar mikio-sidebar-' . ($prefix) === true ? 'left' : $prefix) .
9629cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
9639cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
9649cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
9659cff245bSJames Collins                $html . '</div></aside>';
966ab45ba71SJames Collins        }
967ab45ba71SJames Collins
9689cff245bSJames Collins        if ($parse === true) {
9699cff245bSJames Collins            $html = $this->includeIcons($html);
9703a04a100SJames Collins        }
9719cff245bSJames Collins        if ($print === true) {
9729cff245bSJames Collins            echo $html;
973ab45ba71SJames Collins        }
974ab45ba71SJames Collins        return $html;
975ab45ba71SJames Collins    }
976ab45ba71SJames Collins
977ab45ba71SJames Collins
978a8eebd82SJames Collins    /**
979ab45ba71SJames Collins     * Print or return the page tools content
980ab45ba71SJames Collins     *
9819cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
9829cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
983ab45ba71SJames Collins     * @return  string             generated content
984ab45ba71SJames Collins     */
9859cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
98610b40067Snomadjimbob    {
9871293ce10SJames Collins        global $USERINFO;
9881293ce10SJames Collins
9899cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
990ab45ba71SJames Collins        $html = '';
991ab45ba71SJames Collins
9929cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
993b9c0582bSJames Collins        $html .= '<ul class="tools">';
994ab45ba71SJames Collins
995ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
996ab45ba71SJames Collins        foreach ($items as $item) {
9979cff245bSJames Collins            $classes = [];
9983fd763a0SJames Collins            $classes[] = $item->getType();
9993fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10003fd763a0SJames Collins
10019cff245bSJames Collins            if (empty($attr['class']) === false) {
10023fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1003ab45ba71SJames Collins            }
1004ab45ba71SJames Collins
10053fd763a0SJames Collins            $classes = array_unique($classes);
10063fd763a0SJames Collins
10071293ce10SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()));
10089cff245bSJames Collins            if (
10093a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10103a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10113a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10129cff245bSJames Collins            ) {
10133fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10149cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10159cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10169cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10173fd763a0SJames Collins                $html .= '</li>';
10183fd763a0SJames Collins            }
10199cff245bSJames Collins        }//end foreach
10203fd763a0SJames Collins
10213fd763a0SJames Collins        $html .= '</ul>';
1022ab45ba71SJames Collins        $html .= '</nav>';
1023ab45ba71SJames Collins
10249cff245bSJames Collins        if ($print === true) {
10259cff245bSJames Collins            echo $html;
10269cff245bSJames Collins        }
1027ab45ba71SJames Collins        return $html;
1028ab45ba71SJames Collins    }
1029ab45ba71SJames Collins
1030ab45ba71SJames Collins
1031a8eebd82SJames Collins    /**
1032a8eebd82SJames Collins     * Print or return the search bar
1033a8eebd82SJames Collins     *
10349cff245bSJames Collins     * @param   boolean $print Print content.
1035a8eebd82SJames Collins     * @return  string         contents of the search bar
1036a8eebd82SJames Collins     */
10379cff245bSJames Collins    public function includeSearch(bool $print = true)
103810b40067Snomadjimbob    {
10399cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1040ab45ba71SJames Collins        $html = '';
1041ab45ba71SJames Collins
10429cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
10439cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1044a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1045a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1046c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
10479cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1048c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1049c1cb9f15SChris MacMackin        }
10509cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
10513a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1052a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
10533a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1054a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1055ab45ba71SJames Collins        } else {
1056ab45ba71SJames Collins            $html .= $lang['btn_search'];
1057ab45ba71SJames Collins        }
1058ab45ba71SJames Collins        $html .= '</button>';
1059ab45ba71SJames Collins        $html .= '</form>';
1060ab45ba71SJames Collins
10619cff245bSJames Collins        if ($print === true) {
10629cff245bSJames Collins            echo $html;
10639cff245bSJames Collins        }
1064ab45ba71SJames Collins        return $html;
1065ab45ba71SJames Collins    }
1066ab45ba71SJames Collins
1067ab45ba71SJames Collins
1068a8eebd82SJames Collins    /**
1069a8eebd82SJames Collins     * Print or return content
1070a8eebd82SJames Collins     *
10719cff245bSJames Collins     * @param   boolean $print Print content.
1072a8eebd82SJames Collins     * @return  string         contents
1073a8eebd82SJames Collins     */
10749cff245bSJames Collins    public function includeContent(bool $print = true)
107510b40067Snomadjimbob    {
1076ab45ba71SJames Collins        ob_start();
10779cff245bSJames Collins        tpl_content(false);
1078ab45ba71SJames Collins        $html = ob_get_contents();
1079ab45ba71SJames Collins        ob_end_clean();
1080ab45ba71SJames Collins
1081ab45ba71SJames Collins        $html = $this->includeIcons($html);
1082ab45ba71SJames Collins        $html = $this->parseContent($html);
1083ab45ba71SJames Collins
1084ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1085ab45ba71SJames Collins
10869cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
10879cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
10889cff245bSJames Collins        }
1089a8eebd82SJames Collins
1090a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1091a8eebd82SJames Collins
10929cff245bSJames Collins        if ($print === true) {
10939cff245bSJames Collins            echo $html;
10949cff245bSJames Collins        }
1095ab45ba71SJames Collins        return $html;
1096ab45ba71SJames Collins    }
1097ab45ba71SJames Collins
1098a8eebd82SJames Collins    /**
1099ab45ba71SJames Collins     * Print or return footer
1100ab45ba71SJames Collins     *
11019cff245bSJames Collins     * @param   boolean $print Print footer.
11029cff245bSJames Collins     * @return  string         HTML string containing footer
1103ab45ba71SJames Collins     */
11049cff245bSJames Collins    public function includeFooter(bool $print = true)
110510b40067Snomadjimbob    {
1106ab45ba71SJames Collins        global $ACT;
1107ab45ba71SJames Collins
1108ab45ba71SJames Collins        $html = '';
1109ab45ba71SJames Collins
1110ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11119cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11129cff245bSJames Collins        $html .= $this->includePage('footer', false);
1113ab45ba71SJames Collins
1114a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1115ab45ba71SJames Collins
11169cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1117ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11189cff245bSJames Collins            $html .= $this->includeSearch(false);
1119ab45ba71SJames Collins            $html .= '</div>';
1120ab45ba71SJames Collins        }
1121ab45ba71SJames Collins
1122a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11239cff245bSJames Collins        if (
11243a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
11253a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11269cff245bSJames Collins        ) {
11279cff245bSJames Collins            $html .= $this->includePageTools(false);
11289cff245bSJames Collins        }
1129ab45ba71SJames Collins
11309cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11319cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1132ab45ba71SJames Collins
1133ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11349cff245bSJames Collins        if ($licenseType !== 'none') {
11359cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1136ab45ba71SJames Collins        }
1137ab45ba71SJames Collins
1138ab45ba71SJames Collins        $html .= '</footer>';
1139ab45ba71SJames Collins
11409cff245bSJames Collins        if ($print === true) {
11419cff245bSJames Collins            echo $html;
11429cff245bSJames Collins        }
1143ab45ba71SJames Collins        return $html;
1144ab45ba71SJames Collins    }
1145ab45ba71SJames Collins
1146ab45ba71SJames Collins
1147a8eebd82SJames Collins    /**
1148ab45ba71SJames Collins     * Print or return breadcrumb trail
1149ab45ba71SJames Collins     *
11509cff245bSJames Collins     * @param   boolean $print Print out trail.
11519cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
11529cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1153ab45ba71SJames Collins     */
11549cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
115510b40067Snomadjimbob    {
1156a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1157a8eebd82SJames Collins
11583a385f2cSJames Collins        if (
11593a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
1160*95372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
11613a385f2cSJames Collins        ) {
11629cff245bSJames Collins            return '';
11639cff245bSJames Collins        }
1164ab45ba71SJames Collins
1165ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1166f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
11673a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
1168*95372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
11699cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1170ab45ba71SJames Collins                    ob_start();
117175adba86SJames Collins                    tpl_breadcrumbs();
1172ab45ba71SJames Collins                    $html .= ob_get_contents();
1173ab45ba71SJames Collins                    ob_end_clean();
1174ab45ba71SJames Collins                } else {
1175ab45ba71SJames Collins                    $sep = '•';
1176ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1177ab45ba71SJames Collins
11789cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1179ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
11809cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1181ab45ba71SJames Collins
11829cff245bSJames Collins                        if ($img !== false) {
1183ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1184ab45ba71SJames Collins                        }
118547161538SJames Collins                    }
118647161538SJames Collins
11879cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1188ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
11899cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1190ab45ba71SJames Collins
11919cff245bSJames Collins                        if ($img !== false) {
1192ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1193ab45ba71SJames Collins                        }
1194ab45ba71SJames Collins                    }
1195ab45ba71SJames Collins
1196ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1197ab45ba71SJames Collins
1198ab45ba71SJames Collins                    $html .= '<ul>';
11993a385f2cSJames Collins                    if (empty($prefix) === false) {
12009cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12019cff245bSJames Collins                    }
1202ab45ba71SJames Collins
1203ab45ba71SJames Collins                    $last = count($crumbs);
1204ab45ba71SJames Collins                    $i    = 0;
1205ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1206ab45ba71SJames Collins                        $i++;
1207*95372bffSJames Collins                        if ($i !== 1) {
1208ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
1209*95372bffSJames Collins                        }
12109cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12119cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1212ab45ba71SJames Collins                        $html .= '</li>';
1213ab45ba71SJames Collins                    }
1214ab45ba71SJames Collins
1215ab45ba71SJames Collins                    $html .= '</ul>';
12169cff245bSJames Collins                }//end if
12179cff245bSJames Collins            }//end if
12189cff245bSJames Collins        }//end if
12193d11a778SJames Collins
12203d11a778SJames Collins        $html .= '</div>';
12213d11a778SJames Collins        $html .= '</div>';
12223d11a778SJames Collins
12239cff245bSJames Collins        if ($parse === true) {
12249cff245bSJames Collins            $html = $this->includeIcons($html);
12259cff245bSJames Collins        }
12269cff245bSJames Collins        if ($print === true) {
12279cff245bSJames Collins            echo $html;
12289cff245bSJames Collins        }
12293d11a778SJames Collins        return $html;
12303d11a778SJames Collins    }
12313d11a778SJames Collins
12323d11a778SJames Collins    /**
12333d11a778SJames Collins     * Print or return you are here trail
12343d11a778SJames Collins     *
12359cff245bSJames Collins     * @param   boolean $print Print out trail.
12369cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12379cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12383d11a778SJames Collins     */
12399cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12403d11a778SJames Collins    {
12413d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
12423d11a778SJames Collins
12433a385f2cSJames Collins        if (
12443a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
1245*95372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
12463a385f2cSJames Collins        ) {
12479cff245bSJames Collins            return '';
12489cff245bSJames Collins        }
12493d11a778SJames Collins
12503d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
12513d11a778SJames Collins        $html .= '<div class="mikio-container">';
12523a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
1253*95372bffSJames Collins            if ($conf['youarehere'] !== 0) {
12549cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
1255*95372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1256ab45ba71SJames Collins                    ob_start();
125775adba86SJames Collins                    tpl_youarehere();
1258ab45ba71SJames Collins                    $html .= ob_get_contents();
1259ab45ba71SJames Collins                    ob_end_clean();
1260*95372bffSJames Collins                    $html .= '</div>';
1261ab45ba71SJames Collins                } else {
1262ab45ba71SJames Collins                    $sep = ' » ';
1263ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1264ab45ba71SJames Collins
12659cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
12663d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
12679cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1268ab45ba71SJames Collins
12699cff245bSJames Collins                        if ($img !== false) {
1270ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1271ab45ba71SJames Collins                        }
127275adba86SJames Collins                    }
127375adba86SJames Collins
12749cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
12753d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
12769cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1277ab45ba71SJames Collins
12789cff245bSJames Collins                        if ($img !== false) {
1279ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
128075adba86SJames Collins                        }
128147161538SJames Collins                    }
128247161538SJames Collins
1283ab45ba71SJames Collins                    $html .= '<ul>';
12843a385f2cSJames Collins                    if (empty($prefix) === false) {
12859cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12869cff245bSJames Collins                    }
12879cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1288ab45ba71SJames Collins
1289ab45ba71SJames Collins                    $parts = explode(':', $ID);
1290ab45ba71SJames Collins                    $count = count($parts);
1291ab45ba71SJames Collins
1292ab45ba71SJames Collins                    $part = '';
12939cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1294ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1295ab45ba71SJames Collins                        $page = $part;
12969cff245bSJames Collins                        if ($page === $conf['start']) {
12979cff245bSJames Collins                            continue;
12989cff245bSJames Collins                        }
1299ab45ba71SJames Collins
1300ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
13019cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1302ab45ba71SJames Collins                    }
1303ab45ba71SJames Collins
1304ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
13059cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1306ab45ba71SJames Collins                        $page = $part . $parts[$i];
13079cff245bSJames Collins                        if ($page !== $conf['start']) {
1308ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
13099cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1310ab45ba71SJames Collins                        }
1311ab45ba71SJames Collins                    }
1312ab45ba71SJames Collins
1313ab45ba71SJames Collins                    $html .= '</ul>';
13149cff245bSJames Collins                }//end if
13159cff245bSJames Collins            }//end if
1316ab45ba71SJames Collins
13173d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13189cff245bSJames Collins            if ($showLast !== 0) {
1319a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13209cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1321a8eebd82SJames Collins                    $count = count($matches[0]);
1322a8eebd82SJames Collins                    $list = '';
1323a8eebd82SJames Collins
1324a8eebd82SJames Collins                    // Show Home
1325a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1326a8eebd82SJames Collins
1327a8eebd82SJames Collins                    $list .= '<li>...</li>';
13289cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1329a8eebd82SJames Collins                        $list .= $matches[0][$i];
1330a8eebd82SJames Collins                    }
1331a8eebd82SJames Collins
1332a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1333a8eebd82SJames Collins                }
1334a8eebd82SJames Collins            }
1335a8eebd82SJames Collins
13363d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1337a8eebd82SJames Collins                case 'none':
1338a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1339a8eebd82SJames Collins                    break;
1340a8eebd82SJames Collins                case 'home':
1341a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1342a8eebd82SJames Collins                    break;
1343a8eebd82SJames Collins                case 'icon':
13449cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
13459cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1346a8eebd82SJames Collins                    break;
1347a8eebd82SJames Collins            }
1348a8eebd82SJames Collins        } else {
1349a8eebd82SJames Collins            $html .= '&#8810; ';
13509cff245bSJames Collins            if (isset($_GET['page']) === true) {
13519cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1352a8eebd82SJames Collins            }
13534057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
13549cff245bSJames Collins        }//end if
13559cff245bSJames Collins
13569cff245bSJames Collins        $html .= '</div>';
13579cff245bSJames Collins        $html .= '</div>';
13589cff245bSJames Collins
13599cff245bSJames Collins        if ($parse === true) {
13609cff245bSJames Collins            $html = $this->includeIcons($html);
1361a8eebd82SJames Collins        }
13629cff245bSJames Collins        if ($print === true) {
13639cff245bSJames Collins            echo $html;
13649cff245bSJames Collins        }
1365ab45ba71SJames Collins        return $html;
1366ab45ba71SJames Collins    }
1367ab45ba71SJames Collins
13681785fc73SJames Collins    /**
13691785fc73SJames Collins     * Get Page Title
13709cff245bSJames Collins     *
13719cff245bSJames Collins     * @return string page title
13721785fc73SJames Collins     */
137310b40067Snomadjimbob    public function parsePageTitle()
137410b40067Snomadjimbob    {
13752060e56cSJames Collins        global $ID;
13762060e56cSJames Collins
13772060e56cSJames Collins        $title = p_get_first_heading($ID);
13789cff245bSJames Collins        if (strlen($title) <= 0) {
13799cff245bSJames Collins            $title = tpl_pagetitle(null, true);
13809cff245bSJames Collins        }
13811785fc73SJames Collins        $title = $this->includeIcons($title);
13821785fc73SJames Collins
13831785fc73SJames Collins        return $title;
13841785fc73SJames Collins    }
13851785fc73SJames Collins
1386ab45ba71SJames Collins
138775adba86SJames Collins    /**
1388a8eebd82SJames Collins     * Print or return hero block
138975adba86SJames Collins     *
13909cff245bSJames Collins     * @param   boolean $print Print content.
1391a8eebd82SJames Collins     * @return  string         contents of hero
139275adba86SJames Collins     */
13939cff245bSJames Collins    public function includeHero(bool $print = true)
139410b40067Snomadjimbob    {
1395a8eebd82SJames Collins        $html = '';
139647161538SJames Collins
13979cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1398a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1399f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1400a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
14013a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
14029cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
14039cff245bSJames Collins            }
14043a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
14059cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
14069cff245bSJames Collins            }
1407ab45ba71SJames Collins
1408a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
14091785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1410a8eebd82SJames Collins            $html .= '</h1>';
1411a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1412a8eebd82SJames Collins            $html .= '</div>';
141347161538SJames Collins
14149cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1415a8eebd82SJames Collins            $hero_image_resize_class = '';
14163a385f2cSJames Collins            if (empty($hero_image) === false) {
1417a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1418a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
141947161538SJames Collins            }
1420a8eebd82SJames Collins
14219cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14229cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1423a8eebd82SJames Collins
1424a8eebd82SJames Collins            $html .= '</div>';
1425f8039bf2SJames Collins            $html .= '</div>';
14269cff245bSJames Collins        }//end if
14279cff245bSJames Collins
14289cff245bSJames Collins        if ($print === true) {
14299cff245bSJames Collins            echo $html;
143075adba86SJames Collins        }
1431a8eebd82SJames Collins
1432a8eebd82SJames Collins        return $html;
143375adba86SJames Collins    }
143475adba86SJames Collins
143575adba86SJames Collins
143675adba86SJames Collins    /**
1437a8eebd82SJames Collins     * Print or return out TOC
143875adba86SJames Collins     *
14399cff245bSJames Collins     * @param   boolean $print Print TOC.
14409cff245bSJames Collins     * @param   boolean $parse Parse icons.
1441a8eebd82SJames Collins     * @return  string         contents of TOC
144275adba86SJames Collins     */
14439cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
144410b40067Snomadjimbob    {
1445ab45ba71SJames Collins        $html = '';
14462b4583abSJames Collins
1447ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1448ab45ba71SJames Collins
14493a385f2cSJames Collins        if (empty($tocHtml) === false) {
1450ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1451a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1452ab45ba71SJames Collins
1453ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1454ab45ba71SJames Collins            $html .= $tocHtml;
1455ab45ba71SJames Collins            $html .= '</div>';
14562b4583abSJames Collins        }
14572b4583abSJames Collins
14589cff245bSJames Collins        if ($parse === true) {
14599cff245bSJames Collins            $html = $this->includeIcons($html);
14609cff245bSJames Collins        }
14619cff245bSJames Collins
14629cff245bSJames Collins        if ($print === true) {
1463ab45ba71SJames Collins            echo $html;
1464ab45ba71SJames Collins        }
1465ab45ba71SJames Collins
14669cff245bSJames Collins        return $html;
14679cff245bSJames Collins    }
14689cff245bSJames Collins
1469ab45ba71SJames Collins
1470a8eebd82SJames Collins    /**
1471ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1472ab45ba71SJames Collins     *
14739cff245bSJames Collins     * @param   string $str Content to parse.
1474ab45ba71SJames Collins     * @return  string      parsed string
1475ab45ba71SJames Collins     */
14769cff245bSJames Collins    public function includeIcons(string $str)
147710b40067Snomadjimbob    {
1478ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1479ab45ba71SJames Collins
1480ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
14813a385f2cSJames Collins        if (empty($iconTag) === true) {
14829cff245bSJames Collins            return $str;
14839cff245bSJames Collins        }
1484ab45ba71SJames Collins
14859cff245bSJames Collins        if (
14869cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
14873a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
14889cff245bSJames Collins        ) {
1489a2005a27SJames Collins            $content = $str;
1490a2005a27SJames Collins            $preview = null;
1491a2005a27SJames Collins
14923a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
14939cff245bSJames Collins                $html = new \simple_html_dom();
1494a2005a27SJames Collins                $html->stripRNAttrValues = false;
1495a2005a27SJames Collins                $html->load($str, true, false);
1496a2005a27SJames Collins
1497a2005a27SJames Collins                $preview = $html->find('div.preview');
14989cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1499a2005a27SJames Collins                    $content = $preview[0]->innertext;
1500a2005a27SJames Collins                }
1501a2005a27SJames Collins            }
1502a2005a27SJames Collins
15031785fc73SJames Collins            $page_regex = '/(.*)/';
15049cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
15051785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
15061785fc73SJames Collins            }
15071785fc73SJames Collins
15081785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1509a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1510a2005a27SJames Collins
151110b40067Snomadjimbob                return preg_replace_callback(
151210b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1513ab45ba71SJames Collins                    function ($matches) {
1514ab45ba71SJames Collins                        global $MIKIO_ICONS;
1515ab45ba71SJames Collins
1516ab45ba71SJames Collins                        $s = $matches[0];
1517ab45ba71SJames Collins
1518ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1519ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1520ab45ba71SJames Collins
1521ab45ba71SJames Collins                            if (count($matches) > 1) {
1522ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1523ab45ba71SJames Collins
1524ab45ba71SJames Collins                                if (count($e) > 1) {
1525ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15269cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1527ab45ba71SJames Collins                                            $icon = $iconItem;
1528ab45ba71SJames Collins
1529ab45ba71SJames Collins                                            $s = $icon['insert'];
1530ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
15313a385f2cSJames Collins                                                if (count(empty($e) < $i || $e[$i]) === true) {
15329cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1533ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1534ab45ba71SJames Collins                                                    }
1535ab45ba71SJames Collins                                                } else {
1536ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1537ab45ba71SJames Collins                                                }
1538ab45ba71SJames Collins                                            }
1539ab45ba71SJames Collins
1540ab45ba71SJames Collins                                            $dir = '';
15419cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
15429cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
15439cff245bSJames Collins                                            }
1544ab45ba71SJames Collins
1545ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1546ab45ba71SJames Collins
1547ab45ba71SJames Collins                                            break;
15489cff245bSJames Collins                                        }//end if
15499cff245bSJames Collins                                    }//end foreach
1550ab45ba71SJames Collins                                } else {
1551ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
15529cff245bSJames Collins                                }//end if
15539cff245bSJames Collins                            }//end if
15549cff245bSJames Collins                        }//end if
155575adba86SJames Collins
1556ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
15579cff245bSJames Collins                        if ($count === 0) {
1558ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1559ab45ba71SJames Collins                        }
1560ab45ba71SJames Collins
1561ab45ba71SJames Collins                        return $s;
1562ab45ba71SJames Collins                    },
156310b40067Snomadjimbob                    $icons[0]
156410b40067Snomadjimbob                );
1565a2005a27SJames Collins            }, $content);
1566a2005a27SJames Collins
15673a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15689cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1569a2005a27SJames Collins                    $preview[0]->innertext = $content;
1570a2005a27SJames Collins                }
1571a2005a27SJames Collins
1572a2005a27SJames Collins                $str = $html->save();
1573a2005a27SJames Collins                $html->clear();
1574a2005a27SJames Collins                unset($html);
1575a2005a27SJames Collins            } else {
1576a2005a27SJames Collins                $str = $content;
1577a2005a27SJames Collins            }
15789cff245bSJames Collins        }//end if
1579ab45ba71SJames Collins
1580ab45ba71SJames Collins        return $str;
1581ab45ba71SJames Collins    }
158247161538SJames Collins
1583c165b184SJames Collins    /**
1584a8eebd82SJames Collins     * Parse HTML for theme
1585c165b184SJames Collins     *
15869cff245bSJames Collins     * @param   string $content HTML content to parse.
1587a8eebd82SJames Collins     * @return  string          Parsed content
1588c165b184SJames Collins     */
15899cff245bSJames Collins    public function parseContent(string $content)
159010b40067Snomadjimbob    {
1591ab45ba71SJames Collins        global $INPUT, $ACT;
1592ab45ba71SJames Collins
1593a8eebd82SJames Collins        // Add Mikio Section titles
15943a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
15959cff245bSJames Collins            $admin_sections = [
1596ab45ba71SJames Collins                // Section      Insert Before                 Icon
15979cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
15989cff245bSJames Collins                'search'        => ['searchButton',            ''],
15999cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
16009cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
16019cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
16029cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
16039cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
16049cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
16059cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
16069cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
16079cff245bSJames Collins                'license'       => ['licenseType',             ''],
16089cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
16099cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
16109cff245bSJames Collins            ];
1611ab45ba71SJames Collins
1612ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1613ab45ba71SJames Collins                $search = $items[0];
1614ab45ba71SJames Collins                $icon   = $items[1];
1615ab45ba71SJames Collins
161610b40067Snomadjimbob                $content = preg_replace(
1617adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16189cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16199cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16209cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16219cff245bSJames Collins                        $search . '</span>',
162210b40067Snomadjimbob                    $content
162310b40067Snomadjimbob                );
1624ab45ba71SJames Collins            }
16259cff245bSJames Collins        }//end if
1626ab45ba71SJames Collins
16273a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1628a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1629a8eebd82SJames Collins        }
1630ab45ba71SJames Collins
1631a8eebd82SJames Collins        // Page Revisions - Table Fix
16329cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
16339cff245bSJames Collins            $content = preg_replace(
16349cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
16359cff245bSJames Collins                '<span>$1</span>',
16369cff245bSJames Collins                $content
16379cff245bSJames Collins            );
1638a8eebd82SJames Collins        }
1639ab45ba71SJames Collins
16409cff245bSJames Collins        $html = new \simple_html_dom();
1641bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1642c165b184SJames Collins        $html->load($content, true, false);
1643c165b184SJames Collins
16449cff245bSJames Collins        if ($html === false) {
16459cff245bSJames Collins            return $content;
16469cff245bSJames Collins        }
1647ab45ba71SJames Collins
1648ab45ba71SJames Collins        /* Buttons */
1649ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1650ab45ba71SJames Collins            $c = explode(' ', $node->class);
16519cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
16529cff245bSJames Collins                $c[] = 'mikio-button';
16539cff245bSJames Collins            }
1654ab45ba71SJames Collins            $node->class = implode(' ', $c);
1655c165b184SJames Collins        }
1656c165b184SJames Collins
1657ab45ba71SJames Collins
1658ab45ba71SJames Collins        /* Buttons - Primary */
1659ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1660ab45ba71SJames Collins            $c = explode(' ', $node->class);
16619cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
16629cff245bSJames Collins                $c[] = 'mikio-primary';
16639cff245bSJames Collins            }
1664ab45ba71SJames Collins            $node->class = implode(' ', $c);
1665ab45ba71SJames Collins        }
1666ab45ba71SJames Collins
1667a8eebd82SJames Collins        /* Hide page title if hero is enabled */
16689cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
16691785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
167047161538SJames Collins
167147161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
16729cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1673a8eebd82SJames Collins                    // $elm->innertext = '';
1674a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1675a8eebd82SJames Collins
167647161538SJames Collins                    break;
167747161538SJames Collins                }
167847161538SJames Collins            }
167947161538SJames Collins        }
1680c165b184SJames Collins
1681a8eebd82SJames Collins        /* Hero subtitle */
16822b4583abSJames Collins        foreach ($html->find('p') as $elm) {
16832b4583abSJames Collins            $i = stripos($elm->innertext, '~~hero-subtitle');
16842b4583abSJames Collins            if ($i !== false) {
16859cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
16862b4583abSJames Collins                if ($j !== false) {
16879cff245bSJames Collins                    if ($j > ($i + 16)) {
16889cff245bSJames Collins                        $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16));
1689a8eebd82SJames Collins                        $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1690a8eebd82SJames Collins
1691a8eebd82SJames Collins                        // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2);
1692a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext);
16932b4583abSJames Collins                    }
16942b4583abSJames Collins
16952b4583abSJames Collins                    break;
16962b4583abSJames Collins                }
16972b4583abSJames Collins            }
16982b4583abSJames Collins        }
16992b4583abSJames Collins
1700a8eebd82SJames Collins        /* Hero image */
1701a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1702a8eebd82SJames Collins            $image = '';
1703a8eebd82SJames Collins            preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches);
1704a8eebd82SJames Collins            if (count($matches) > 0) {
1705a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1706a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1707a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1708a8eebd82SJames Collins                } else {
1709a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1710a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1711a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1712a8eebd82SJames Collins                    } else {
1713a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
17149cff245bSJames Collins                        if (stripos($image, ':') === false) {
17159cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1716a8eebd82SJames Collins                            $i = stripos($image, '?');
17179cff245bSJames Collins                            if ($i !== false) {
1718a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1719c165b184SJames Collins                            }
1720c165b184SJames Collins
1721a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1722ab45ba71SJames Collins                        }
1723ab45ba71SJames Collins                    }
1724ab45ba71SJames Collins                }
1725ab45ba71SJames Collins
1726a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1727a8eebd82SJames Collins
1728a8eebd82SJames Collins                $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext);
17299cff245bSJames Collins            }//end if
17309cff245bSJames Collins        }//end foreach
1731ab45ba71SJames Collins
17329cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
17339cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1734a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1735a8eebd82SJames Collins            $i = stripos($elm->innertext, '~~hero-colors');
1736a8eebd82SJames Collins            if ($i !== false) {
17379cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
1738a8eebd82SJames Collins                if ($j !== false) {
17399cff245bSJames Collins                    if ($j > ($i + 14)) {
17409cff245bSJames Collins                        $color = substr($elm->innertext, ($i + 14), ($j - $i - 14));
1741a8eebd82SJames Collins                        $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')';
1742ab45ba71SJames Collins
1743a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext);
1744ab45ba71SJames Collins                    }
1745ab45ba71SJames Collins
1746a8eebd82SJames Collins                    break;
1747ab45ba71SJames Collins                }
1748ab45ba71SJames Collins            }
1749ab45ba71SJames Collins        }
1750ab45ba71SJames Collins
175196ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
175296ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
175396ec8e1eSJames Collins            $i = stripos($elm->innertext, '~~hide-parts');
175496ec8e1eSJames Collins            if ($i !== false) {
17559cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
175696ec8e1eSJames Collins                if ($j !== false) {
17579cff245bSJames Collins                    if ($j > ($i + 13)) {
17589cff245bSJames Collins                        $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13)));
175996ec8e1eSJames Collins                        $script = '';
176096ec8e1eSJames Collins
176196ec8e1eSJames Collins                        foreach ($parts as $part) {
176296ec8e1eSJames Collins                            // $part = trim($part);
176396ec8e1eSJames Collins                            if (strlen($part) > 0) {
176496ec8e1eSJames Collins                                $script .= 'mikio.hidePart(\'' . $part . '\');';
176596ec8e1eSJames Collins                            }
176696ec8e1eSJames Collins                        }
176796ec8e1eSJames Collins
176896ec8e1eSJames Collins                        if (strlen($script) > 0) {
176996ec8e1eSJames Collins                            $this->footerScript['hide-parts'] = $script;
177096ec8e1eSJames Collins                        }
177196ec8e1eSJames Collins
177296ec8e1eSJames Collins                        $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext);
177396ec8e1eSJames Collins                    }
177496ec8e1eSJames Collins
177596ec8e1eSJames Collins                    break;
17769cff245bSJames Collins                }//end if
17779cff245bSJames Collins            }//end if
17789cff245bSJames Collins        }//end foreach
177996ec8e1eSJames Collins
178096ec8e1eSJames Collins
1781a8eebd82SJames Collins        /* Page Tags (tag plugin) */
17829cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1783a8eebd82SJames Collins            $tags = '';
1784a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1785a8eebd82SJames Collins                $tags .= $elm->outertext;
1786a8eebd82SJames Collins            }
1787a8eebd82SJames Collins
1788a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1789a8eebd82SJames Collins                $elm->innertext = '';
1790a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1791a8eebd82SJames Collins            }
1792a8eebd82SJames Collins
17933a385f2cSJames Collins            if (empty($tags) === false) {
1794a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1795a8eebd82SJames Collins            }
1796ab45ba71SJames Collins        }
1797ab45ba71SJames Collins
1798ab45ba71SJames Collins        // Configuration Manager
17993a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1800ab45ba71SJames Collins            // Additional save buttons
1801ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1802ab45ba71SJames Collins                $saveButtons = '';
1803ab45ba71SJames Collins
1804ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1805ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1806a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1807ab45ba71SJames Collins                    $elm->outertext = '';
1808ab45ba71SJames Collins                }
1809ab45ba71SJames Collins
1810ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1811ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1812ab45ba71SJames Collins                }
1813ab45ba71SJames Collins            }
1814ab45ba71SJames Collins        }
1815ab45ba71SJames Collins
1816ab45ba71SJames Collins        $content = $html->save();
1817c165b184SJames Collins        $html->clear();
1818c165b184SJames Collins        unset($html);
1819c165b184SJames Collins
1820c165b184SJames Collins        return $content;
1821c165b184SJames Collins    }
18222b4583abSJames Collins
18232b4583abSJames Collins
1824a8eebd82SJames Collins    /**
1825a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
1826a8eebd82SJames Collins     *
18279cff245bSJames Collins     * @param   string $str String to parse.
18289cff245bSJames Collins     * @return  string      parsed URI
1829a8eebd82SJames Collins     */
18309cff245bSJames Collins    public function getLink(string $str)
183110b40067Snomadjimbob    {
18322b4583abSJames Collins        $i = strpos($str, '://');
18339cff245bSJames Collins        if ($i !== false) {
18349cff245bSJames Collins            return $str;
18359cff245bSJames Collins        }
18362b4583abSJames Collins
18372b4583abSJames Collins        return wl($str);
18382b4583abSJames Collins    }
1839ab45ba71SJames Collins
1840ab45ba71SJames Collins
1841a8eebd82SJames Collins    /**
1842a8eebd82SJames Collins     * Check if the user can edit current namespace/page
1843a8eebd82SJames Collins     *
1844a8eebd82SJames Collins     * @return  boolean  user can edit
1845a8eebd82SJames Collins     */
184610b40067Snomadjimbob    public function userCanEdit()
184710b40067Snomadjimbob    {
1848ab45ba71SJames Collins        global $INFO;
1849ab45ba71SJames Collins        global $ID;
1850ab45ba71SJames Collins
1851ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
18529cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
18539cff245bSJames Collins            return true;
18549cff245bSJames Collins        }
18559cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
18569cff245bSJames Collins            return true;
18579cff245bSJames Collins        }
1858a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
18599cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
18609cff245bSJames Collins            return true;
18619cff245bSJames Collins        }
18629cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
18639cff245bSJames Collins            return true;
18649cff245bSJames Collins        }
1865ab45ba71SJames Collins
1866ab45ba71SJames Collins        return false;
1867c165b184SJames Collins    }
186847161538SJames Collins
186947161538SJames Collins
1870a8eebd82SJames Collins    /**
1871a8eebd82SJames Collins     * Search for and return the uri of a media file
1872a8eebd82SJames Collins     *
18739cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
18749cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
18759cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
18769cff245bSJames Collins     * @return string                  URI of the found media file
1877a8eebd82SJames Collins     */
18789cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
187910b40067Snomadjimbob    {
1880ab45ba71SJames Collins        global $INFO;
1881a8eebd82SJames Collins
18829cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
1883ab45ba71SJames Collins
18849cff245bSJames Collins        if ($searchCurrentNS === true) {
18859cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
18869cff245bSJames Collins        }
18879cff245bSJames Collins        if ($propagate === true) {
1888ab45ba71SJames Collins            $prefix[] = ':';
1889ab45ba71SJames Collins            $prefix[] = ':wiki:';
1890a8eebd82SJames Collins        }
1891ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
18923a385f2cSJames Collins        if (empty($theme) === false) {
18939cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
18949cff245bSJames Collins        }
1895ab45ba71SJames Collins        $prefix[] = 'images/';
1896ab45ba71SJames Collins
18979cff245bSJames Collins        $search = [];
1898ab45ba71SJames Collins        foreach ($prefix as $pitem) {
1899ab45ba71SJames Collins            foreach ($ext as $eitem) {
1900ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
1901ab45ba71SJames Collins            }
1902ab45ba71SJames Collins        }
1903ab45ba71SJames Collins
1904ab45ba71SJames Collins        $img = '';
1905ab45ba71SJames Collins        $file = '';
1906ab45ba71SJames Collins        $url = '';
1907ab45ba71SJames Collins        $ismedia = false;
1908ab45ba71SJames Collins        $found = false;
1909ab45ba71SJames Collins
1910ab45ba71SJames Collins        foreach ($search as $img) {
19113a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
1912ab45ba71SJames Collins                $file    = mediaFN($img);
1913ab45ba71SJames Collins                $ismedia = true;
1914ab45ba71SJames Collins            } else {
1915ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
1916ab45ba71SJames Collins                $ismedia = false;
1917ab45ba71SJames Collins            }
1918ab45ba71SJames Collins
19199cff245bSJames Collins            if (file_exists($file) === true) {
1920ab45ba71SJames Collins                $found = true;
1921ab45ba71SJames Collins                break;
1922ab45ba71SJames Collins            }
1923ab45ba71SJames Collins        }
1924ab45ba71SJames Collins
19259cff245bSJames Collins        if ($found === false) {
19269cff245bSJames Collins            return false;
19279cff245bSJames Collins        }
1928ab45ba71SJames Collins
19299cff245bSJames Collins        if ($ismedia === true) {
1930ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
1931ab45ba71SJames Collins        } else {
1932ab45ba71SJames Collins            $url = tpl_basedir() . $img;
1933ab45ba71SJames Collins        }
1934ab45ba71SJames Collins
1935ab45ba71SJames Collins        return $url;
1936ab45ba71SJames Collins    }
1937ab45ba71SJames Collins
1938a8eebd82SJames Collins
1939a8eebd82SJames Collins    /**
1940ab45ba71SJames Collins     * Print or return the page title
1941ab45ba71SJames Collins     *
19429cff245bSJames Collins     * @param string $page Page id or empty string for current page.
1943ab45ba71SJames Collins     * @return string      generated content
1944ab45ba71SJames Collins     */
19459cff245bSJames Collins    public function getPageTitle(string $page = '')
194610b40067Snomadjimbob    {
1947ab45ba71SJames Collins        global $ID, $conf;
1948ab45ba71SJames Collins
1949ab45ba71SJames Collins        $html = '';
1950ab45ba71SJames Collins
19513a385f2cSJames Collins        if (empty($page) === true) {
19529cff245bSJames Collins            $page = $ID;
19539cff245bSJames Collins        }
1954ab45ba71SJames Collins
1955ab45ba71SJames Collins        $html = p_get_first_heading($page);
1956ab45ba71SJames Collins        $html = strip_tags($html);
1957ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
1958ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
1959ab45ba71SJames Collins        $html = trim($html);
1960ab45ba71SJames Collins
1961ab45ba71SJames Collins        return $html;
1962ab45ba71SJames Collins    }
1963a8eebd82SJames Collins
1964a8eebd82SJames Collins
1965a8eebd82SJames Collins    /**
1966a8eebd82SJames Collins     * Return inline theme icon
1967a8eebd82SJames Collins     *
19689cff245bSJames Collins     * @param   string $type Icon to retreive.
19699cff245bSJames Collins     * @return  string       HTML icon content
1970a8eebd82SJames Collins     */
19719cff245bSJames Collins    public function mikioInlineIcon(string $type)
197210b40067Snomadjimbob    {
1973a8eebd82SJames Collins        switch ($type) {
1974a8eebd82SJames Collins            case 'wrench':
19759cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
19769cff245bSJames 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
19779cff245bSJames 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
19789cff245bSJames 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
19799cff245bSJames 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,
19809cff245bSJames 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,
19819cff245bSJames 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>';
1982a8eebd82SJames Collins            case 'file':
19839cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
19849cff245bSJames 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
19859cff245bSJames 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,
19869cff245bSJames 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
19879cff245bSJames Collinsl 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0"
19889cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
1989a8eebd82SJames Collins            case 'gear':
19909cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
19919cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"><path d="m 1024,640 q 0,106
19929cff245bSJames 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
19939cff245bSJames 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,
19949cff245bSJames 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
19959cff245bSJames 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
19969cff245bSJames 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,
19979cff245bSJames 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
19989cff245bSJames 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
19999cff245bSJames 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
20009cff245bSJames 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>';
2001a8eebd82SJames Collins            case 'user':
20029cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
20039cff245bSJames 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
20049cff245bSJames 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
20059cff245bSJames 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
20069cff245bSJames 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
20079cff245bSJames 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
20089cff245bSJames 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
20099cff245bSJames Collins1088,1024 z"/></g></svg>';
2010a8eebd82SJames Collins            case 'search':
20119cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
20129cff245bSJames 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
20139cff245bSJames 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
20149cff245bSJames 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
20159cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2016a8eebd82SJames Collins            case 'home':
20179cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
20189cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><g transform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015">
20199cff245bSJames 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,
20209cff245bSJames 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,
20219cff245bSJames 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,
20229cff245bSJames 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,
20239cff245bSJames Collins-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0"
20249cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
20259cff245bSJames Collins        }//end switch
2026ab45ba71SJames Collins
2027a8eebd82SJames Collins        return '';
2028a8eebd82SJames Collins    }
2029ab45ba71SJames Collins
2030a8eebd82SJames Collins    /**
2031a8eebd82SJames Collins     * Finalize theme
20329cff245bSJames Collins     *
20339cff245bSJames Collins     * @return void
2034a8eebd82SJames Collins     */
203510b40067Snomadjimbob    public function finalize()
203610b40067Snomadjimbob    {
2037a8eebd82SJames Collins    }
20381785fc73SJames Collins
20391785fc73SJames Collins    /**
20401785fc73SJames Collins     * Show Messages
20419cff245bSJames Collins     *
20429cff245bSJames Collins     * @return void
20431785fc73SJames Collins     */
204410b40067Snomadjimbob    public function showMessages()
204510b40067Snomadjimbob    {
20461785fc73SJames Collins        global $ACT;
20471785fc73SJames Collins
20489cff245bSJames Collins        if ($this->lessIgnored === true) {
20499cff245bSJames Collins            msg(
20509cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
20519cff245bSJames Collins                2,
20529cff245bSJames Collins                '',
20539cff245bSJames Collins                '',
20549cff245bSJames Collins                MSG_ADMINS_ONLY
20559cff245bSJames Collins            );
2056a8df40efSJames Collins        }
2057a8df40efSJames Collins
20581785fc73SJames Collins        $show = $this->getConf('showNotifications');
20593a385f2cSJames Collins        if (
20603a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
20613a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
20623a385f2cSJames Collins        ) {
20631785fc73SJames Collins            global $MSG, $MSG_shown;
20641785fc73SJames Collins
20659cff245bSJames Collins            if (isset($MSG) === false) {
20661785fc73SJames Collins                return;
20671785fc73SJames Collins            }
20681785fc73SJames Collins
20699cff245bSJames Collins            if (isset($MSG_shown) === false) {
20709cff245bSJames Collins                $MSG_shown = [];
2071a8df40efSJames Collins            }
20721785fc73SJames Collins
20731785fc73SJames Collins            foreach ($MSG as $msg) {
20741785fc73SJames Collins                $hash = md5($msg['msg']);
20759cff245bSJames Collins                if (isset($MSG_shown[$hash]) === true) {
20761785fc73SJames Collins                    continue;
20771785fc73SJames Collins                }
20781785fc73SJames Collins                // skip double messages
20791785fc73SJames Collins
20809cff245bSJames Collins                if (info_msg_allowed($msg) === true) {
20819cff245bSJames Collins                    echo '<div class="' . $msg['lvl'] . '">';
20829cff245bSJames Collins                    echo $msg['msg'];
20839cff245bSJames Collins                    echo '</div>';
20841785fc73SJames Collins                }
20851785fc73SJames Collins
2086a8df40efSJames Collins                $MSG_shown[$hash] = true;
20871785fc73SJames Collins            }
20881785fc73SJames Collins
20891785fc73SJames Collins            unset($GLOBALS['MSG']);
20909cff245bSJames Collins        }//end if
20911785fc73SJames Collins    }
20927ac0a6efSJames Collins
20937ac0a6efSJames Collins    /**
20947ac0a6efSJames Collins     * Dokuwiki version
20957ac0a6efSJames Collins     *
20967ac0a6efSJames Collins     * @return  string        the dw version name
20977ac0a6efSJames Collins     */
20989cff245bSJames Collins    public function dwVersion()
20999cff245bSJames Collins    {
21009cff245bSJames Collins        if (function_exists('getVersionData') === true) {
21017ac0a6efSJames Collins            $version_data = getVersionData();
21029cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
21037ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
21047ac0a6efSJames Collins                if (count($version_items) >= 2) {
21057ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
21067ac0a6efSJames Collins                }
21077ac0a6efSJames Collins            }
21087ac0a6efSJames Collins        }
21097ac0a6efSJames Collins
21107ac0a6efSJames Collins        return 'unknown';
21117ac0a6efSJames Collins    }
2112e4c4fb13SJames Collins
2113e4c4fb13SJames Collins    /**
2114e4c4fb13SJames Collins     * Dokuwiki version number
2115e4c4fb13SJames Collins     *
2116e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2117e4c4fb13SJames Collins     */
21189cff245bSJames Collins    public function dwVersionNumber()
21199cff245bSJames Collins    {
21209cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2121e4c4fb13SJames Collins            $version_data = getVersionData();
21229cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2123e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2124e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2125e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2126e4c4fb13SJames Collins                }
2127e4c4fb13SJames Collins            }
2128e4c4fb13SJames Collins        }
2129e4c4fb13SJames Collins
2130e4c4fb13SJames Collins        return 0;
2131e4c4fb13SJames Collins    }
2132a8eebd82SJames Collins}
2133ab45ba71SJames Collins
2134ab45ba71SJames Collinsglobal $TEMPLATE;
213547161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2136