xref: /template/mikio/mikio.php (revision 5491511452ea8fcececc1c578ad5112f7e36c94c)
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
424f8225e4SJames Collins    /**
434f8225e4SJames Collins     * @var string Notifications from included pages.
444f8225e4SJames Collins     */
454f8225e4SJames Collins    private $includedPageNotifications = '';
464f8225e4SJames Collins
47c165b184SJames Collins
48c165b184SJames Collins    /**
49c165b184SJames Collins     * Class constructor
50c165b184SJames Collins     */
5110b40067Snomadjimbob    public function __construct()
5210b40067Snomadjimbob    {
53c165b184SJames Collins        $this->tplDir  = tpl_incdir();
54c165b184SJames Collins        $this->baseDir = tpl_basedir();
55c165b184SJames Collins
569cff245bSJames Collins        $this->registerHooks();
57c165b184SJames Collins    }
58c165b184SJames Collins
59c165b184SJames Collins    /**
60ab45ba71SJames Collins     * Returns the instance of the class
6147161538SJames Collins     *
62ab45ba71SJames Collins     * @return  Template        class instance
6347161538SJames Collins     */
6447161538SJames Collins    public static function getInstance()
6547161538SJames Collins    {
6647161538SJames Collins        static $instance = null;
6747161538SJames Collins
683a385f2cSJames Collins        if (empty($instance) === true) {
6947161538SJames Collins            $instance = new Template();
7047161538SJames Collins        }
7147161538SJames Collins
7247161538SJames Collins        return $instance;
7347161538SJames Collins    }
7447161538SJames Collins
75ab45ba71SJames Collins
7647161538SJames Collins    /**
77ab45ba71SJames Collins     * Register the themes hooks into Dokuwiki
789cff245bSJames Collins     *
799cff245bSJames Collins     * @return void
80c165b184SJames Collins     */
819cff245bSJames Collins    private function registerHooks()
8210b40067Snomadjimbob    {
83c165b184SJames Collins        global $EVENT_HANDLER;
84c165b184SJames Collins
859cff245bSJames Collins        $events_dispatcher = [
86ab45ba71SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler'
879cff245bSJames Collins        ];
88c165b184SJames Collins
89c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
90c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
91c165b184SJames Collins        }
92c165b184SJames Collins    }
93c165b184SJames Collins
94c165b184SJames Collins
95c165b184SJames Collins    /**
96ab45ba71SJames Collins     * Meta handler hook for DokuWiki
97c165b184SJames Collins     *
989cff245bSJames Collins     * @param   \Doku_Event $event DokuWiki Event.
999cff245bSJames Collins     * @return  void
100c165b184SJames Collins     */
10110b40067Snomadjimbob    public function metaHeadersHandler(\Doku_Event $event)
10210b40067Snomadjimbob    {
103ab45ba71SJames Collins        global $MIKIO_ICONS;
104b5536b07SChris MacMackin        global $conf;
105ab45ba71SJames Collins
106ad182e6dSnomadjimbob        global $MIKIO_TEMPLATE;
107ad182e6dSnomadjimbob        $MIKIO_TEMPLATE = '123';
108ad182e6dSnomadjimbob
1099cff245bSJames Collins        $this->includePage('theme', false, true);
110a8eebd82SJames Collins
1119cff245bSJames Collins        $stylesheets    = [];
1129cff245bSJames Collins        $scripts        = [];
113c165b184SJames Collins
1143a385f2cSJames Collins        if (empty($this->getConf('customTheme')) === false) {
1159cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) {
116a8eebd82SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less';
117a8eebd82SJames Collins            } else {
1189cff245bSJames Collins                if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) {
119ab45ba71SJames Collins                    $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css';
1202b4583abSJames Collins                }
121a8eebd82SJames Collins            }
1229cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) {
123ab45ba71SJames Collins                $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js';
124c165b184SJames Collins            }
125c165b184SJames Collins        }
126c165b184SJames Collins
1273a385f2cSJames Collins        if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) {
1289cff245bSJames Collins            $icons = [];
129ab45ba71SJames Collins            foreach ($MIKIO_ICONS as $icon) {
1309cff245bSJames Collins                if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) {
131ab45ba71SJames Collins                    $icons[] = $icon;
132c165b184SJames Collins
1333a385f2cSJames Collins                    if (empty($icon['css']) === false) {
1349cff245bSJames Collins                        if (strpos($icon['css'], '//') === false) {
135a8eebd82SJames Collins                            $stylesheets[] = $this->baseDir . 'icons/' . $icon['css'];
136ab45ba71SJames Collins                        } else {
137a8eebd82SJames Collins                            $stylesheets[] = $icon['css'];
138ab45ba71SJames Collins                        }
139ab45ba71SJames Collins                    }
140ab45ba71SJames Collins                }
141ab45ba71SJames Collins            }
142ab45ba71SJames Collins            $MIKIO_ICONS = $icons;
143ab45ba71SJames Collins        } else {
144ab45ba71SJames Collins            $MIKIO_ICONS = [];
145ab45ba71SJames Collins        }
146c165b184SJames Collins
1477864545bSChris MacMackin        $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js';
148ab45ba71SJames Collins        $scripts[] = $this->baseDir . 'assets/mikio.js';
149644fd9f9SJames Collins
1509cff245bSJames Collins        if ($this->getConf('useLESS') === true) {
151ab45ba71SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.less';
152644fd9f9SJames Collins        } else {
153644fd9f9SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.css';
154644fd9f9SJames Collins        }
155644fd9f9SJames Collins
156ad182e6dSnomadjimbob        /* MikioPlugin Support */
1579ffe9161Snomadjimbob        if (plugin_load('action', 'mikioplugin') !== null) {
158ad182e6dSnomadjimbob            if ($this->getConf('useLESS') === true) {
159ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.less';
160ad182e6dSnomadjimbob            } else {
161ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.css';
162ad182e6dSnomadjimbob            }
163ad182e6dSnomadjimbob        }
164ab45ba71SJames Collins
165ab45ba71SJames Collins        $set = [];
166c165b184SJames Collins        foreach ($stylesheets as $style) {
1679cff245bSJames Collins            if (in_array($style, $set) === false) {
1683a385f2cSJames Collins                if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) {
169ab45ba71SJames Collins                    $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style);
170ab45ba71SJames Collins                }
171ab45ba71SJames Collins
1729cff245bSJames Collins                array_unshift($event->data['link'], [
173c165b184SJames Collins                    'type' => 'text/css',
174c165b184SJames Collins                    'rel'  => 'stylesheet',
175c165b184SJames Collins                    'href' => $style
1769cff245bSJames Collins                ]);
177c165b184SJames Collins            }
178ab45ba71SJames Collins            $set[] = $style;
179ab45ba71SJames Collins        }
180c165b184SJames Collins
181ab45ba71SJames Collins        $set = [];
182c165b184SJames Collins        foreach ($scripts as $script) {
1839cff245bSJames Collins            if (in_array($script, $set) === false) {
1849cff245bSJames Collins                $script_params = [
185c165b184SJames Collins                    'type'  => 'text/javascript',
186c165b184SJames Collins                    '_data' => '',
1878395cdcbSChris MacMackin                    'src'   => $script
1889cff245bSJames Collins                ];
189c1ecb866SJames Collins
190c1ecb866SJames Collins                // equal to or greator than hogfather
191c1ecb866SJames Collins                if ($this->dwVersionNumber() >= 20200729) {
192c1ecb866SJames Collins                    // greator than hogfather - defer always on
193c1ecb866SJames Collins                    if ($this->dwVersionNumber() >= 20200729) {
194c1ecb866SJames Collins                        $script_params += ['defer' => 'defer'];
195c1ecb866SJames Collins                    } else {
196c1ecb866SJames Collins                        // hogfather - defer always on unless $conf['defer_js'] is false
1979cff245bSJames Collins                        if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) {
1988395cdcbSChris MacMackin                            $script_params += ['defer' => 'defer'];
1998395cdcbSChris MacMackin                        }
200c1ecb866SJames Collins                    }
201c1ecb866SJames Collins                }
202c1ecb866SJames Collins
2038395cdcbSChris MacMackin                $event->data['script'][] = $script_params;
2049cff245bSJames Collins            }//end if
205ab45ba71SJames Collins            $set[] = $script;
2069cff245bSJames Collins        }//end foreach
207c165b184SJames Collins    }
208c165b184SJames Collins
209c165b184SJames Collins
210c165b184SJames Collins    /**
211a8eebd82SJames Collins     * Print or return the footer meta data
212c165b184SJames Collins     *
2139cff245bSJames Collins     * @param   boolean $print Print the data to buffer.
2149cff245bSJames Collins     * @return  string         HTML footer meta data
215c165b184SJames Collins     */
2169cff245bSJames Collins    public function includeFooterMeta(bool $print = true)
21710b40067Snomadjimbob    {
218a8eebd82SJames Collins        $html = '';
219a8eebd82SJames Collins
220a8eebd82SJames Collins        if (count($this->footerScript) > 0) {
221a8eebd82SJames Collins            $html .= '<script type="text/javascript">function mikioFooterRun() {';
222a8eebd82SJames Collins            foreach ($this->footerScript as $script) {
223a8eebd82SJames Collins                $html .= $script . ';';
224a8eebd82SJames Collins            }
225a8eebd82SJames Collins            $html .= '}</script>';
226a8eebd82SJames Collins        }
227c165b184SJames Collins
228c165b184SJames Collins
2299cff245bSJames Collins        if ($print === true) {
2309cff245bSJames Collins            echo $html;
2319cff245bSJames Collins        }
232a8eebd82SJames Collins        return $html;
233a8eebd82SJames Collins    }
234a8eebd82SJames Collins
23595372bffSJames Collins
23695372bffSJames Collins    // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing
23795372bffSJames Collins
23895372bffSJames Collins
239a8eebd82SJames Collins    /**
240ab45ba71SJames Collins     * Retreive and parse theme configuration options
241c165b184SJames Collins     *
2429cff245bSJames Collins     * @param   string $key     The configuration key to retreive.
2439cff245bSJames Collins     * @param   mixed  $default If key doesn't exist, return this value.
244ab45ba71SJames Collins     * @return  mixed           parsed value of configuration
245c165b184SJames Collins     */
24695372bffSJames Collins    public function getConf(string $key, $default = false)
24710b40067Snomadjimbob    {
248c165b184SJames Collins        $value = tpl_getConf($key, $default);
249c165b184SJames Collins
2503a385f2cSJames Collins        $data = [
2513a385f2cSJames Collins            ['keys' => ['navbarDWMenuType'],                'type' => 'choice',
2523a385f2cSJames Collins                'values' => ['both', 'icons', 'text']
2533a385f2cSJames Collins            ],
2543a385f2cSJames Collins            ['keys' => ['navbarDWMenuCombine'],             'type' => 'choice',
2553a385f2cSJames Collins                'values' => ['combine', 'seperate', 'dropdown']
2563a385f2cSJames Collins            ],
2573a385f2cSJames Collins            ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'],
2583a385f2cSJames Collins                'type' => 'choice',
2593a385f2cSJames Collins                'values' => ['none', 'custom', 'search', 'dokuwiki'],
2603a385f2cSJames Collins                'default' => [
2613a385f2cSJames Collins                    'navbarPosLeft' => 'none',
2623a385f2cSJames Collins                    'navbarPosMiddle' => 'search',
2633a385f2cSJames Collins                    'navbarPosRight' => 'dokuwiki'
2643a385f2cSJames Collins                ]
2653a385f2cSJames Collins            ],
2663a385f2cSJames Collins            ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink',
2673a385f2cSJames Collins                'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile',
2683a385f2cSJames Collins                'navbarItemShowAdmin'
2693a385f2cSJames Collins            ],
2703a385f2cSJames Collins                'type' => 'choice',
2713a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2723a385f2cSJames Collins            ],
2733a385f2cSJames Collins            ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'],
2743a385f2cSJames Collins                'type' => 'choice',
2753a385f2cSJames Collins                'values' => ['always', 'never']
2763a385f2cSJames Collins            ],
2773a385f2cSJames Collins            ['keys' => ['searchButton'],                    'type' => 'choice',
2783a385f2cSJames Collins                'values' => ['icon', 'text']
2793a385f2cSJames Collins            ],
2803a385f2cSJames Collins            ['keys' => ['breadcrumbPosition', 'youareherePosition'],
2813a385f2cSJames Collins                'type' => 'choice',
2823a385f2cSJames Collins                'values' => ['top', 'hero', 'page', 'none']
2833a385f2cSJames Collins            ],
2843a385f2cSJames Collins            ['keys' => ['youarehereHome'],                  'type' => 'choice',
2853a385f2cSJames Collins                'values' => ['page title', 'home', 'icon', 'none']
2863a385f2cSJames Collins            ],
2873a385f2cSJames Collins            ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'],
2883a385f2cSJames Collins                'type' => 'choice',
2893a385f2cSJames Collins                'values' => ['none', 'logged in user', 'search', 'content', 'tags'],
2903a385f2cSJames Collins                'default' => [
2913a385f2cSJames Collins                    'sidebarLeftRow1' => 'logged in user',
2923a385f2cSJames Collins                    'sidebarLeftRow2' => 'search',
2933a385f2cSJames Collins                    'sidebarLeftRow3' => 'content'
2943a385f2cSJames Collins                ]
2953a385f2cSJames Collins            ],
2963a385f2cSJames Collins            ['keys' => ['pageToolsFloating', 'pageToolsFooter'],
2973a385f2cSJames Collins                'type' => 'choice',
2983a385f2cSJames Collins                'values' => ['always', 'none', 'page editors']
2993a385f2cSJames Collins            ],
3003a385f2cSJames Collins            ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink',
3013a385f2cSJames Collins                'pageToolsShowTop'
3023a385f2cSJames Collins            ],
3033a385f2cSJames Collins                'type' => 'choice',
3043a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
3053a385f2cSJames Collins            ],
3063a385f2cSJames Collins            ['keys' => ['showNotifications'],               'type' => 'choice',
3073a385f2cSJames Collins                'values' => ['admin', 'always', 'none']
3083a385f2cSJames Collins            ],
3093a385f2cSJames Collins            ['keys' => ['licenseType'],                     'type' => 'choice',
3103a385f2cSJames Collins                'values' => ['badge', 'button', 'none']
3113a385f2cSJames Collins            ],
3123a385f2cSJames Collins            ['keys' => ['navbarUseTitleIcon'],              'type' => 'bool'],
3133a385f2cSJames Collins            ['keys' => ['navbarUseTitleText'],              'type' => 'bool'],
3143a385f2cSJames Collins            ['keys' => ['navbarUseTaglineText'],            'type' => 'bool'],
3153a385f2cSJames Collins            ['keys' => ['navbarShowSub'],                   'type' => 'bool'],
3163a385f2cSJames Collins            ['keys' => ['heroTitle'],                       'type' => 'bool'],
3173a385f2cSJames Collins            ['keys' => ['heroImagePropagation'],            'type' => 'bool'],
3183a385f2cSJames Collins            ['keys' => ['breadcrumbPrefix'],                'type' => 'bool'],
3193a385f2cSJames Collins            ['keys' => ['breadcrumbSep'],                   'type' => 'bool'],
3203a385f2cSJames Collins            ['keys' => ['youareherePrefix'],                'type' => 'bool'],
3213a385f2cSJames Collins            ['keys' => ['youarehereSep'],                   'type' => 'bool'],
3223a385f2cSJames Collins            ['keys' => ['sidebarShowLeft'],                 'type' => 'bool'],
3233a385f2cSJames Collins            ['keys' => ['sidebarShowRight'],                'type' => 'bool'],
3243a385f2cSJames Collins            ['keys' => ['tocFull'],                         'type' => 'bool'],
3253a385f2cSJames Collins            ['keys' => ['footerSearch'],                    'type' => 'bool'],
3263a385f2cSJames Collins            ['keys' => ['licenseImageOnly'],                'type' => 'bool'],
3273a385f2cSJames Collins            ['keys' => ['includePageUseACL'],               'type' => 'bool'],
3283a385f2cSJames Collins            ['keys' => ['includePagePropagate'],            'type' => 'bool'],
3293a385f2cSJames Collins            ['keys' => ['youarehereHideHome'],              'type' => 'bool'],
3303a385f2cSJames Collins            ['keys' => ['tagsConsolidate'],                 'type' => 'bool'],
3313a385f2cSJames Collins            ['keys' => ['footerInPage'],                    'type' => 'bool'],
3323a385f2cSJames Collins            ['keys' => ['sidebarMobileDefaultCollapse'],    'type' => 'bool'],
3333a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowLeft'],           'type' => 'bool'],
3343a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowRight'],          'type' => 'bool'],
3353a385f2cSJames Collins            ['keys' => ['searchUseTypeahead'],              'type' => 'bool'],
33612030b10SJames Collins            ['keys' => ['showLightDark'],                   'type' => 'bool'],
33734d5f19aSJames Collins            ['keys' => ['autoLightDark'],                   'type' => 'bool'],
3383a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
3393a385f2cSJames Collins
3403a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
3413a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
3423a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
3433a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
3443a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
3453a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
3463a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
3473a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
3483a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
3493a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
3503a385f2cSJames Collins
3513a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
3523a385f2cSJames Collins        ];
3533a385f2cSJames Collins
3543a385f2cSJames Collins        foreach ($data as $row) {
3553a385f2cSJames Collins            // does not check case....
3563a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
35795372bffSJames Collins                if (array_key_exists('type', $row) === true) {
3583a385f2cSJames Collins                    switch ($row['type']) {
3593a385f2cSJames Collins                        case 'bool':
3603a385f2cSJames Collins                            return (bool) $value;
3613a385f2cSJames Collins                        case 'int':
3623a385f2cSJames Collins                            return (int) $value;
3633a385f2cSJames Collins                        case 'string':
3643a385f2cSJames Collins                            return $value;
3653a385f2cSJames Collins                        case 'less':
36629118ed7SJames Collins                            $value = (bool) $value;
367a8df40efSJames Collins                            $lessAvailable = false;
368c963c68cSJames Collins
369c963c68cSJames Collins                            // search for less library
370c963c68cSJames Collins                            $path = '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
371c963c68cSJames Collins                            if (($lessAvailable = file_exists('.' . $path)) !== true) {
372c963c68cSJames Collins                                for ($i = 0; $i < 6; $i++) {
373c963c68cSJames Collins                                    if (($lessAvailable = file_exists($_SERVER['DOCUMENT_ROOT'] . $path)) === true) {
374c963c68cSJames Collins                                        break;
375a8df40efSJames Collins                                    }
376a8df40efSJames Collins
377c963c68cSJames Collins                                    $path = '/..' . $path;
378c963c68cSJames Collins                                }
379c963c68cSJames Collins
380c963c68cSJames Collins                                if ($lessAvailable !== true) {
381c963c68cSJames Collins                                    $path = '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
382c963c68cSJames Collins                                    for ($i = 0; $i < 6; $i++) {
383*54915114SJames Collins                                        if (
384*54915114SJames Collins                                            ($lessAvailable = file_exists(
385*54915114SJames Collins                                                $_SERVER['DOCUMENT_ROOT'] . $path
386*54915114SJames Collins                                            )) === true
387*54915114SJames Collins                                        ) {
388c963c68cSJames Collins                                            break;
389c963c68cSJames Collins                                        }
390c963c68cSJames Collins
391c963c68cSJames Collins                                        $path = '/..' . $path;
392c963c68cSJames Collins                                    }
393c963c68cSJames Collins                                }
394c963c68cSJames Collins                            }//end if
395c963c68cSJames Collins
396a8df40efSJames Collins                            // check for ctype extensions
3979cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
398a8df40efSJames Collins                                $lessAvailable = false;
399a8df40efSJames Collins                            }
400a8df40efSJames Collins
4019cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
402a8df40efSJames Collins                                $this->lessIgnored = true;
40329118ed7SJames Collins                                $value = false;
40429118ed7SJames Collins                            }
4053a385f2cSJames Collins
4063a385f2cSJames Collins                            return $value;
4079cff245bSJames Collins                    }//end switch
4083a385f2cSJames Collins                }//end if
4093a385f2cSJames Collins
4103a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
4113a385f2cSJames Collins                    return $value;
4123a385f2cSJames Collins                }
4133a385f2cSJames Collins
4143a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
4153a385f2cSJames Collins                    if (is_array($row['default']) === true) {
4163a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
4173a385f2cSJames Collins                            return $row['default'][$key];
4183a385f2cSJames Collins                        }
4193a385f2cSJames Collins                    } else {
4203a385f2cSJames Collins                        return $row['default'];
4213a385f2cSJames Collins                    }
4223a385f2cSJames Collins                }
4233a385f2cSJames Collins
4243a385f2cSJames Collins                return reset($row['values']);
4253a385f2cSJames Collins            }//end if
4263a385f2cSJames Collins        }//end foreach
427c165b184SJames Collins
428c165b184SJames Collins        return $value;
429c165b184SJames Collins    }
430c165b184SJames Collins
431c165b184SJames Collins
43295372bffSJames Collins    // phpcs:enable
43395372bffSJames Collins
43495372bffSJames Collins
435c165b184SJames Collins    /**
436a8eebd82SJames Collins     * Check if a page exist in directory or namespace
437c165b184SJames Collins     *
4389cff245bSJames Collins     * @param   string $page Page/namespace to search.
439a8eebd82SJames Collins     * @return  boolean      if page exists
440c165b184SJames Collins     */
4419cff245bSJames Collins    public function pageExists(string $page)
44210b40067Snomadjimbob    {
443ab45ba71SJames Collins        ob_start();
444a8eebd82SJames Collins        tpl_includeFile($page . '.html');
445ab45ba71SJames Collins        $html = ob_get_contents();
446ab45ba71SJames Collins        ob_end_clean();
447a8eebd82SJames Collins
4483a385f2cSJames Collins        if (empty($html) === false) {
4499cff245bSJames Collins            return true;
4509cff245bSJames Collins        }
451a8eebd82SJames Collins
452a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
453a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
454a8eebd82SJames Collins
4559cff245bSJames Collins        if ($propagate === true) {
4569cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4579cff245bSJames Collins                return true;
4589cff245bSJames Collins            }
4599cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4609cff245bSJames Collins            return true;
461ab45ba71SJames Collins        }
462ab45ba71SJames Collins
4639cff245bSJames Collins        return false;
464ab45ba71SJames Collins    }
465ab45ba71SJames Collins
466a8eebd82SJames Collins
467c165b184SJames Collins    /**
468a8eebd82SJames Collins     * Print or return page from directory or namespace
4692b4583abSJames Collins     *
4709cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4719cff245bSJames Collins     * @param   boolean $print        Print content.
4729cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4739cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
474ab45ba71SJames Collins     * @return  string                contents of page found
4752b4583abSJames Collins     */
4769cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4772b4583abSJames Collins    {
478a8eebd82SJames Collins        ob_start();
479a8eebd82SJames Collins        tpl_includeFile($page . '.html');
480a8eebd82SJames Collins        $html = ob_get_contents();
481a8eebd82SJames Collins        ob_end_clean();
482a8eebd82SJames Collins
4833a385f2cSJames Collins        if (empty($html) === true) {
4844f8225e4SJames Collins            global $MSG;
4854f8225e4SJames Collins
486a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
487a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
488ab45ba71SJames Collins            $html = '';
4892b4583abSJames Collins
4904f8225e4SJames Collins            ob_start();
491ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
4924f8225e4SJames Collins            $this->includedPageNotifications .= ob_get_contents();
4934f8225e4SJames Collins            ob_end_clean();
494ab45ba71SJames Collins        }
4952b4583abSJames Collins
4963a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
497ab45ba71SJames Collins            $html = $this->parseContent($html);
498ab45ba71SJames Collins        }
4992b4583abSJames Collins
5003a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
5019cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
5029cff245bSJames Collins        }
5032b4583abSJames Collins
5049cff245bSJames Collins        if ($print === true) {
5059cff245bSJames Collins            echo $html;
5069cff245bSJames Collins        }
507ab45ba71SJames Collins        return $html;
5082b4583abSJames Collins    }
5092b4583abSJames Collins
510a8eebd82SJames Collins
511a8eebd82SJames Collins    /**
512a8eebd82SJames Collins     * Print or return logged in user information
513a8eebd82SJames Collins     *
5149cff245bSJames Collins     * @param   boolean $print Print content.
515a8eebd82SJames Collins     * @return  string         user information
516a8eebd82SJames Collins     */
5179cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
51810b40067Snomadjimbob    {
519a8eebd82SJames Collins        $html = '';
520a8eebd82SJames Collins
5219cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
522a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
523a8eebd82SJames Collins            ob_start();
524a8eebd82SJames Collins            tpl_userinfo();
525a8eebd82SJames Collins            $html .= ob_get_contents();
526a8eebd82SJames Collins            ob_end_clean();
527a8eebd82SJames Collins            $html .= '</div>';
5282b4583abSJames Collins        }
529a8eebd82SJames Collins
5309cff245bSJames Collins        if ($print === true) {
5319cff245bSJames Collins            echo $html;
5329cff245bSJames Collins        }
533a8eebd82SJames Collins        return $html;
5342b4583abSJames Collins    }
5352b4583abSJames Collins
5362b4583abSJames Collins
537a8eebd82SJames Collins    /**
538a8eebd82SJames Collins     * Print or return DokuWiki Menu
539a8eebd82SJames Collins     *
5409cff245bSJames Collins     * @param   boolean $print Print content.
541a8eebd82SJames Collins     * @return  string         contents of the menu
542a8eebd82SJames Collins     */
5439cff245bSJames Collins    public function includeDWMenu(bool $print = true)
54410b40067Snomadjimbob    {
5452b4583abSJames Collins        global $lang;
5462b4583abSJames Collins        global $USERINFO;
547c165b184SJames Collins
5489cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
549a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5502b4583abSJames Collins
551ab45ba71SJames Collins        $pageToolsMenu = [];
552ab45ba71SJames Collins        $siteToolsMenu = [];
553ab45ba71SJames Collins        $userToolsMenu = [];
554c165b184SJames Collins
555ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
556ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
557ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5582b4583abSJames Collins
5592b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5602b4583abSJames Collins        foreach ($items as $item) {
5619cff245bSJames Collins            if ($item->getType() !== 'top') {
562ab45ba71SJames Collins                $itemHtml = '';
5632b4583abSJames Collins
564905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5659cff245bSJames Collins                if (
5663a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5673a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5683a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5699cff245bSJames Collins                ) {
5709cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5719cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5729cff245bSJames Collins                    if ($showIcons === true) {
5739cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5749cff245bSJames Collins                    }
5759cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5769cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5779cff245bSJames Collins                    }
578ab45ba71SJames Collins                    $itemHtml .= '</a>';
579ab45ba71SJames Collins
580ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5812b4583abSJames Collins                }
5829cff245bSJames Collins            }//end if
5839cff245bSJames Collins        }//end foreach
5842b4583abSJames Collins
585ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
586ab45ba71SJames Collins        foreach ($items as $item) {
587ab45ba71SJames Collins            $itemHtml = '';
5882b4583abSJames Collins
589905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5909cff245bSJames Collins            if (
5913a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5923a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5933a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5949cff245bSJames Collins            ) {
5959cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5969cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5979cff245bSJames Collins                if ($showIcons === true) {
5989cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5999cff245bSJames Collins                }
6009cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6019cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6029cff245bSJames Collins                }
603ab45ba71SJames Collins                $itemHtml .= '</a>';
6042b4583abSJames Collins
605ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
6062b4583abSJames Collins            }
6079cff245bSJames Collins        }//end foreach
6082b4583abSJames Collins
609ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
610ab45ba71SJames Collins        foreach ($items as $item) {
611ab45ba71SJames Collins            $itemHtml = '';
612ab45ba71SJames Collins
613905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
6149cff245bSJames Collins            if (
6153a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
6163a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
6173a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
6189cff245bSJames Collins            ) {
6199cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
6209cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
6219cff245bSJames Collins                if ($showIcons === true) {
6229cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6239cff245bSJames Collins                }
6249cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6259cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6269cff245bSJames Collins                }
627ab45ba71SJames Collins                $itemHtml .= '</a>';
628ab45ba71SJames Collins
629ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
630ab45ba71SJames Collins            }
6319cff245bSJames Collins        }//end foreach
632ab45ba71SJames Collins
633ab45ba71SJames Collins
634ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
635ab45ba71SJames Collins            case 'dropdown':
636ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6379cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6389cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6399cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6409cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6419cff245bSJames Collins                '</span>') . '</a>';
642a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
643ab45ba71SJames Collins
644ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
645ab45ba71SJames Collins                    $html .= $item;
646ab45ba71SJames Collins                }
647ab45ba71SJames Collins
648ab45ba71SJames Collins                $html .= '</div>';
649ab45ba71SJames Collins                $html .= '</li>';
650ab45ba71SJames Collins
651a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6529cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6539cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6549cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6559cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6569cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
657a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
658ab45ba71SJames Collins
659ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
660ab45ba71SJames Collins                    $html .= $item;
661ab45ba71SJames Collins                }
662ab45ba71SJames Collins
663ab45ba71SJames Collins                $html .= '</div>';
664ab45ba71SJames Collins                $html .= '</li>';
665ab45ba71SJames Collins
666a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6679cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6689cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6699cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6709cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6719cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
672a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
673ab45ba71SJames Collins
674ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
675ab45ba71SJames Collins                    $html .= $item;
676ab45ba71SJames Collins                }
677ab45ba71SJames Collins
678ab45ba71SJames Collins                $html .= '</div>';
679ab45ba71SJames Collins                $html .= '</li>';
680ab45ba71SJames Collins
681ab45ba71SJames Collins                break;
682ab45ba71SJames Collins
683ab45ba71SJames Collins            case 'combine':
684ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6859cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6869cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6879cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6889cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
689a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
690ab45ba71SJames Collins
691ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
692ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
693ab45ba71SJames Collins                    $html .= $item;
694ab45ba71SJames Collins                }
695ab45ba71SJames Collins
696ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
697ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
698ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
699ab45ba71SJames Collins                    $html .= $item;
700ab45ba71SJames Collins                }
701ab45ba71SJames Collins
702ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
703ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
704ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
705ab45ba71SJames Collins                    $html .= $item;
706ab45ba71SJames Collins                }
707ab45ba71SJames Collins
708ab45ba71SJames Collins                $html .= '</div>';
709ab45ba71SJames Collins                $html .= '</li>';
710ab45ba71SJames Collins                break;
711ab45ba71SJames Collins
712ab45ba71SJames Collins            default:    // seperate
713ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
714a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
715ab45ba71SJames Collins                }
716ab45ba71SJames Collins
717ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
718a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
719a8eebd82SJames Collins                }
720a8eebd82SJames Collins
721a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
722a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
723ab45ba71SJames Collins                }
724ab45ba71SJames Collins
725ab45ba71SJames Collins                break;
7269cff245bSJames Collins        }//end switch
727ab45ba71SJames Collins
7283a3ece10SJames Collins        $translation = plugin_load('helper', 'translation');
7293a3ece10SJames Collins        if ($translation !== null) {
7303a3ece10SJames Collins            $html .= '<li id="mikio__translate" class="mikio-nav-dropdown">';
7313a3ece10SJames Collins            $html .= '<a id="mikio_dropdown_translate" class="nav-link dropdown-toggle" href="#" role="button"
7323a3ece10SJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
7333a3ece10SJames Collins                $this->mikioInlineIcon('language') .
7343a3ece10SJames Collins                 '</a>';
7353a3ece10SJames Collins            $html .= '<div class="mikio-dropdown closed">';
7363a3ece10SJames Collins
7373a3ece10SJames Collins                $html .= $translation->showTranslations();
7383a3ece10SJames Collins
7393a3ece10SJames Collins            $html .= '</div>';
7403a3ece10SJames Collins            $html .= '</li>';
7413a3ece10SJames Collins        }
7423a3ece10SJames Collins
74312030b10SJames Collins        if ($this->getConf('showLightDark') === true) {
744d0fba6d1SJames Collins            $autoLightDark = $this->getConf('autoLightDark');
7459e41d878SJames Collins            $html .= '<li class="mikio-darklight">
7469e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' .
747d0fba6d1SJames Collins            ($autoLightDark === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') .
7489e41d878SJames Collins            $this->mikioInlineIcon('sun', 'mikio-darklight-light') .
7499e41d878SJames Collins            $this->mikioInlineIcon('moon', 'mikio-darklight-dark') .
7509e41d878SJames Collins            '</a></li>';
75112030b10SJames Collins        }
75212030b10SJames Collins
753ab45ba71SJames Collins        $html .= '</ul>';
754ab45ba71SJames Collins
7559cff245bSJames Collins        if ($print === true) {
7569cff245bSJames Collins            echo $html;
7579cff245bSJames Collins        }
758a8eebd82SJames Collins        return $html;
759a8eebd82SJames Collins    }
760a8eebd82SJames Collins
761a8eebd82SJames Collins
762a8eebd82SJames Collins    /**
763a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
764a8eebd82SJames Collins     *
7659cff245bSJames Collins     * @param string $str String to generate nav.
766a8eebd82SJames Collins     * @return string     nav elements generated
767a8eebd82SJames Collins     */
7689cff245bSJames Collins    public function stringToNav(string $str)
76910b40067Snomadjimbob    {
770a8eebd82SJames Collins        $html = '';
771a8eebd82SJames Collins
7723a385f2cSJames Collins        if (empty($str) === false) {
773a8eebd82SJames Collins            $items = explode(';', $str);
774a8eebd82SJames Collins            if (count($items) > 0) {
775a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
776a8eebd82SJames Collins                foreach ($items as $item) {
777a8eebd82SJames Collins                    $parts = explode('|', $item);
778a8eebd82SJames Collins                    if ($parts > 1) {
7799cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7809cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7819cff245bSJames Collins                            '</a></li>';
782a8eebd82SJames Collins                    }
783a8eebd82SJames Collins                }
784a8eebd82SJames Collins                $html .= '</ul>';
785a8eebd82SJames Collins            }
7862b4583abSJames Collins        }
7872b4583abSJames Collins
788ab45ba71SJames Collins        return $html;
7892b4583abSJames Collins    }
7902b4583abSJames Collins
791a8eebd82SJames Collins    /**
792ab45ba71SJames Collins     * print or return the main navbar
7932b4583abSJames Collins     *
7949cff245bSJames Collins     * @param boolean $print   Print the navbar.
7959cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
796ab45ba71SJames Collins     * @return string          generated content
7972b4583abSJames Collins     */
7989cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
79910b40067Snomadjimbob    {
800b39ad16dSJames Collins        global $conf, $USERINFO;
801d3d7d2b7SJames Collins
802d3d7d2b7SJames Collins        $homeUrl = wl();
803d3d7d2b7SJames Collins
8049cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
805d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
8063a385f2cSJames Collins            if (empty($p) === false) {
8079cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
808d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
809d3d7d2b7SJames Collins                }
810d3d7d2b7SJames Collins            }
811b39ad16dSJames Collins        } else {
8129cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
813b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
814b39ad16dSJames Collins                if (strlen($url) > 0) {
815b39ad16dSJames Collins                    $homeUrl = $url;
816d3d7d2b7SJames Collins                }
817b39ad16dSJames Collins            } else {
818b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
819b39ad16dSJames Collins                if (strlen($url) > 0) {
820b39ad16dSJames Collins                    $homeUrl = $url;
821b39ad16dSJames Collins                }
822b39ad16dSJames Collins            }
823b39ad16dSJames Collins        }
824d3d7d2b7SJames Collins
825ab45ba71SJames Collins        $html = '';
82647161538SJames Collins
8279cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
8289cff245bSJames Collins            '">';
829f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
830d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
8319cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
832ab45ba71SJames Collins            // Brand image
8339cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
8349cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
8359cff245bSJames Collins                ;
8363a385f2cSJames Collins                if (empty($logo) === false) {
837f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
838f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
839f0241fc4SJames Collins                    $styles = '';
840f0241fc4SJames Collins
841f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
8429cff245bSJames Collins                        if (ctype_digit($width) === true) {
843f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
8449cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
845f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
8469cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
8477a92c19bSJames Collins                            $styles .= 'max-width:none;';
848f0241fc4SJames Collins                        }
849f0241fc4SJames Collins
8509cff245bSJames Collins                        if (ctype_digit($height) === true) {
851f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8529cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
853f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8549cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8557a92c19bSJames Collins                            $styles .= 'max-height:none;';
856f0241fc4SJames Collins                        }
857f0241fc4SJames Collins
858f0241fc4SJames Collins                        if (strlen($styles) > 0) {
859f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
860f0241fc4SJames Collins                        }
8619cff245bSJames Collins                    }//end if
862f0241fc4SJames Collins
863f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8649cff245bSJames Collins                }//end if
8659cff245bSJames Collins            }//end if
866ab45ba71SJames Collins
867ab45ba71SJames Collins            // Brand title
8689cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
869ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
870a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8719cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
872a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
873ab45ba71SJames Collins                }
874ab45ba71SJames Collins                $html .= '</div>';
875ab45ba71SJames Collins            }
8769cff245bSJames Collins        }//end if
877ab45ba71SJames Collins        $html .= '</a>';
878660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
879ab45ba71SJames Collins
880ab45ba71SJames Collins        // Menus
881ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
882ab45ba71SJames Collins
8839cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8849cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8859cff245bSJames Collins        ];
886a8eebd82SJames Collins        foreach ($menus as $menuType) {
887a8eebd82SJames Collins            switch ($menuType) {
888a8eebd82SJames Collins                case 'custom':
889a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
890a8eebd82SJames Collins                    break;
891a8eebd82SJames Collins                case 'search':
892ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
893ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
894ab45ba71SJames Collins                    $html .= '</div>';
895a8eebd82SJames Collins                    break;
896a8eebd82SJames Collins                case 'dokuwiki':
8979cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
898a8eebd82SJames Collins                    break;
899a8eebd82SJames Collins            }
900a8eebd82SJames Collins        }
901ab45ba71SJames Collins
902ab45ba71SJames Collins        $html .= '</div>';
903f8039bf2SJames Collins        $html .= '</div>';
904ab45ba71SJames Collins        $html .= '</nav>';
905ab45ba71SJames Collins
906a8eebd82SJames Collins        // Sub Navbar
9079cff245bSJames Collins        if ($showSub === true) {
9089cff245bSJames Collins            $sub = $this->includePage('submenu', false);
9093a385f2cSJames Collins            if (empty($sub) === false) {
9109cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
9119cff245bSJames Collins            }
912ab45ba71SJames Collins        }
913ab45ba71SJames Collins
9149cff245bSJames Collins        if ($print === true) {
9159cff245bSJames Collins            echo $html;
9169cff245bSJames Collins        }
917ab45ba71SJames Collins        return $html;
918ab45ba71SJames Collins    }
919ab45ba71SJames Collins
920ab45ba71SJames Collins
921a8eebd82SJames Collins    /**
922a8eebd82SJames Collins     * Is there a sidebar
923a8eebd82SJames Collins     *
9249cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
925a8eebd82SJames Collins     * @return  boolean        if sidebar exists
926a8eebd82SJames Collins     */
9279cff245bSJames Collins    public function sidebarExists(string $prefix = '')
92810b40067Snomadjimbob    {
929a8eebd82SJames Collins        global $conf;
930a8eebd82SJames Collins
9313a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9329cff245bSJames Collins            $prefix = '';
9339cff245bSJames Collins        }
934a8eebd82SJames Collins
935a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
936a8eebd82SJames Collins    }
937a8eebd82SJames Collins
938a8eebd82SJames Collins
939a8eebd82SJames Collins    /**
940ab45ba71SJames Collins     * Print or return the sidebar content
941ab45ba71SJames Collins     *
9429cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
9439cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
9449cff245bSJames Collins     * @param   boolean $parse  Parse the content.
945ab45ba71SJames Collins     * @return  string          generated content
946ab45ba71SJames Collins     */
9479cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
94810b40067Snomadjimbob    {
949ab45ba71SJames Collins        global $conf, $ID;
950ab45ba71SJames Collins
951ab45ba71SJames Collins        $html = '';
952ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
953ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
954ab45ba71SJames Collins
9553a385f2cSJames Collins        if (empty($confPrefix) === true) {
9569cff245bSJames Collins            $confPrefix = 'Left';
9579cff245bSJames Collins        }
9581cdedf28SJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9599cff245bSJames Collins            $prefix = '';
9609cff245bSJames Collins        }
961ab45ba71SJames Collins
9621cdedf28SJames Collins        $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
963ab45ba71SJames Collins
9649cff245bSJames Collins        if (
9659cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9661cdedf28SJames Collins            p_get_metadata($ID, 'nosidebar', false) === null
9679cff245bSJames Collins        ) {
9689cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9693a385f2cSJames Collins            if (empty($content) === false) {
9709cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9719cff245bSJames Collins            }
972ab45ba71SJames Collins
9733a385f2cSJames Collins            if (empty($prefix) === true) {
9749cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9759cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9769cff245bSJames Collins                ];
977ab45ba71SJames Collins
978a8eebd82SJames Collins                foreach ($rows as $row) {
979a8eebd82SJames Collins                    switch ($row) {
980a8eebd82SJames Collins                        case 'search':
9819cff245bSJames Collins                            $html .= $this->includeSearch(false);
982a8eebd82SJames Collins                            break;
983a8eebd82SJames Collins                        case 'logged in user':
9849cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
985a8eebd82SJames Collins                            break;
986a8eebd82SJames Collins                        case 'content':
9879cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9883a385f2cSJames Collins                            if (empty($content) === false) {
9899cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9909cff245bSJames Collins                            }
991a8eebd82SJames Collins                            break;
992a8eebd82SJames Collins                        case 'tags':
993a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
994a8eebd82SJames Collins                    }
995a8eebd82SJames Collins                }
996a8eebd82SJames Collins            } else {
9979cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
9983a385f2cSJames Collins                if (empty($content) === false) {
9999cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
10009cff245bSJames Collins                }
10019cff245bSJames Collins            }//end if
10029cff245bSJames Collins
10039cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
10043a385f2cSJames Collins            if (empty($content) === false) {
10059cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
10069cff245bSJames Collins            }
10079cff245bSJames Collins        }//end if
10089cff245bSJames Collins
10093a385f2cSJames Collins        if (empty($html) === true) {
10103a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
10119cff245bSJames Collins                $html = '&nbsp;';
10129cff245bSJames Collins            }
10139cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
10149cff245bSJames Collins                $html = '&nbsp;';
10159cff245bSJames Collins            }
1016a8eebd82SJames Collins        }
1017ab45ba71SJames Collins
10183a385f2cSJames Collins        if (empty($html) === false) {
10191cdedf28SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) .
10209cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
10219cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
10229cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
10239cff245bSJames Collins                $html . '</div></aside>';
1024ab45ba71SJames Collins        }
1025ab45ba71SJames Collins
10269cff245bSJames Collins        if ($parse === true) {
10279cff245bSJames Collins            $html = $this->includeIcons($html);
10283a04a100SJames Collins        }
10299cff245bSJames Collins        if ($print === true) {
10309cff245bSJames Collins            echo $html;
1031ab45ba71SJames Collins        }
10324f8225e4SJames Collins
1033ab45ba71SJames Collins        return $html;
1034ab45ba71SJames Collins    }
1035ab45ba71SJames Collins
1036ab45ba71SJames Collins
1037a8eebd82SJames Collins    /**
1038ab45ba71SJames Collins     * Print or return the page tools content
1039ab45ba71SJames Collins     *
10409cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
10419cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
1042ab45ba71SJames Collins     * @return  string             generated content
1043ab45ba71SJames Collins     */
10449cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
104510b40067Snomadjimbob    {
10461293ce10SJames Collins        global $USERINFO;
10471293ce10SJames Collins
10489cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
1049ab45ba71SJames Collins        $html = '';
1050ab45ba71SJames Collins
10519cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
1052b9c0582bSJames Collins        $html .= '<ul class="tools">';
1053ab45ba71SJames Collins
1054ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1055ab45ba71SJames Collins        foreach ($items as $item) {
10569cff245bSJames Collins            $classes = [];
10573fd763a0SJames Collins            $classes[] = $item->getType();
10583fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10593fd763a0SJames Collins
10609cff245bSJames Collins            if (empty($attr['class']) === false) {
10613fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1062ab45ba71SJames Collins            }
1063ab45ba71SJames Collins
10643fd763a0SJames Collins            $classes = array_unique($classes);
10653fd763a0SJames Collins
1066f02b8ab5SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()), 'always');
10679cff245bSJames Collins            if (
10683a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10693a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10703a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10719cff245bSJames Collins            ) {
10723fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10739cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10749cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10759cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10763fd763a0SJames Collins                $html .= '</li>';
10773fd763a0SJames Collins            }
10789cff245bSJames Collins        }//end foreach
10793fd763a0SJames Collins
10803fd763a0SJames Collins        $html .= '</ul>';
1081ab45ba71SJames Collins        $html .= '</nav>';
1082ab45ba71SJames Collins
10839cff245bSJames Collins        if ($print === true) {
10849cff245bSJames Collins            echo $html;
10859cff245bSJames Collins        }
1086ab45ba71SJames Collins        return $html;
1087ab45ba71SJames Collins    }
1088ab45ba71SJames Collins
1089ab45ba71SJames Collins
1090a8eebd82SJames Collins    /**
1091a8eebd82SJames Collins     * Print or return the search bar
1092a8eebd82SJames Collins     *
10939cff245bSJames Collins     * @param   boolean $print Print content.
1094a8eebd82SJames Collins     * @return  string         contents of the search bar
1095a8eebd82SJames Collins     */
10969cff245bSJames Collins    public function includeSearch(bool $print = true)
109710b40067Snomadjimbob    {
10989cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1099ab45ba71SJames Collins        $html = '';
1100ab45ba71SJames Collins
11019cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
11029cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1103a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1104a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1105c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
11069cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1107c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1108c1cb9f15SChris MacMackin        }
11099cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
11103a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1111a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
11123a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1113a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1114ab45ba71SJames Collins        } else {
1115ab45ba71SJames Collins            $html .= $lang['btn_search'];
1116ab45ba71SJames Collins        }
1117ab45ba71SJames Collins        $html .= '</button>';
1118ab45ba71SJames Collins        $html .= '</form>';
1119ab45ba71SJames Collins
11209cff245bSJames Collins        if ($print === true) {
11219cff245bSJames Collins            echo $html;
11229cff245bSJames Collins        }
1123ab45ba71SJames Collins        return $html;
1124ab45ba71SJames Collins    }
1125ab45ba71SJames Collins
1126ab45ba71SJames Collins
1127a8eebd82SJames Collins    /**
1128a8eebd82SJames Collins     * Print or return content
1129a8eebd82SJames Collins     *
11309cff245bSJames Collins     * @param   boolean $print Print content.
1131a8eebd82SJames Collins     * @return  string         contents
1132a8eebd82SJames Collins     */
11339cff245bSJames Collins    public function includeContent(bool $print = true)
113410b40067Snomadjimbob    {
1135ab45ba71SJames Collins        ob_start();
11369cff245bSJames Collins        tpl_content(false);
1137ab45ba71SJames Collins        $html = ob_get_contents();
1138ab45ba71SJames Collins        ob_end_clean();
1139ab45ba71SJames Collins
1140ab45ba71SJames Collins        $html = $this->includeIcons($html);
1141ab45ba71SJames Collins        $html = $this->parseContent($html);
1142ab45ba71SJames Collins
1143ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1144ab45ba71SJames Collins
11459cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
11469cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
11479cff245bSJames Collins        }
1148a8eebd82SJames Collins
1149a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1150a8eebd82SJames Collins
11519cff245bSJames Collins        if ($print === true) {
11529cff245bSJames Collins            echo $html;
11539cff245bSJames Collins        }
1154ab45ba71SJames Collins        return $html;
1155ab45ba71SJames Collins    }
1156ab45ba71SJames Collins
1157a8eebd82SJames Collins    /**
1158ab45ba71SJames Collins     * Print or return footer
1159ab45ba71SJames Collins     *
11609cff245bSJames Collins     * @param   boolean $print Print footer.
11619cff245bSJames Collins     * @return  string         HTML string containing footer
1162ab45ba71SJames Collins     */
11639cff245bSJames Collins    public function includeFooter(bool $print = true)
116410b40067Snomadjimbob    {
1165ab45ba71SJames Collins        global $ACT;
1166ab45ba71SJames Collins
1167ab45ba71SJames Collins        $html = '';
1168ab45ba71SJames Collins
1169ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11709cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11719cff245bSJames Collins        $html .= $this->includePage('footer', false);
1172ab45ba71SJames Collins
1173a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1174ab45ba71SJames Collins
11759cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1176ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11779cff245bSJames Collins            $html .= $this->includeSearch(false);
1178ab45ba71SJames Collins            $html .= '</div>';
1179ab45ba71SJames Collins        }
1180ab45ba71SJames Collins
1181a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11829cff245bSJames Collins        if (
11833a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
11843a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11859cff245bSJames Collins        ) {
11869cff245bSJames Collins            $html .= $this->includePageTools(false);
11879cff245bSJames Collins        }
1188ab45ba71SJames Collins
11899cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11909cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1191ab45ba71SJames Collins
1192ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11939cff245bSJames Collins        if ($licenseType !== 'none') {
11949cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1195ab45ba71SJames Collins        }
1196ab45ba71SJames Collins
1197ab45ba71SJames Collins        $html .= '</footer>';
1198ab45ba71SJames Collins
11999cff245bSJames Collins        if ($print === true) {
12009cff245bSJames Collins            echo $html;
12019cff245bSJames Collins        }
1202ab45ba71SJames Collins        return $html;
1203ab45ba71SJames Collins    }
1204ab45ba71SJames Collins
1205ab45ba71SJames Collins
1206a8eebd82SJames Collins    /**
1207ab45ba71SJames Collins     * Print or return breadcrumb trail
1208ab45ba71SJames Collins     *
12099cff245bSJames Collins     * @param   boolean $print Print out trail.
12109cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12119cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1212ab45ba71SJames Collins     */
12139cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
121410b40067Snomadjimbob    {
1215a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1216a8eebd82SJames Collins
12173a385f2cSJames Collins        if (
12183a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
121995372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
12203a385f2cSJames Collins        ) {
12219cff245bSJames Collins            return '';
12229cff245bSJames Collins        }
1223ab45ba71SJames Collins
1224ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1225f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
12263a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
122795372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
12289cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1229ab45ba71SJames Collins                    ob_start();
123075adba86SJames Collins                    tpl_breadcrumbs();
1231ab45ba71SJames Collins                    $html .= ob_get_contents();
1232ab45ba71SJames Collins                    ob_end_clean();
1233ab45ba71SJames Collins                } else {
1234ab45ba71SJames Collins                    $sep = '•';
1235ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1236ab45ba71SJames Collins
12379cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1238ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
12399cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1240ab45ba71SJames Collins
12419cff245bSJames Collins                        if ($img !== false) {
1242ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1243ab45ba71SJames Collins                        }
124447161538SJames Collins                    }
124547161538SJames Collins
12469cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1247ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
12489cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1249ab45ba71SJames Collins
12509cff245bSJames Collins                        if ($img !== false) {
1251ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1252ab45ba71SJames Collins                        }
1253ab45ba71SJames Collins                    }
1254ab45ba71SJames Collins
1255ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1256ab45ba71SJames Collins
1257ab45ba71SJames Collins                    $html .= '<ul>';
12583a385f2cSJames Collins                    if (empty($prefix) === false) {
12599cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12609cff245bSJames Collins                    }
1261ab45ba71SJames Collins
1262ab45ba71SJames Collins                    $last = count($crumbs);
1263ab45ba71SJames Collins                    $i    = 0;
1264ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1265ab45ba71SJames Collins                        $i++;
126695372bffSJames Collins                        if ($i !== 1) {
1267ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
126895372bffSJames Collins                        }
12699cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12709cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1271ab45ba71SJames Collins                        $html .= '</li>';
1272ab45ba71SJames Collins                    }
1273ab45ba71SJames Collins
1274ab45ba71SJames Collins                    $html .= '</ul>';
12759cff245bSJames Collins                }//end if
12769cff245bSJames Collins            }//end if
12779cff245bSJames Collins        }//end if
12783d11a778SJames Collins
12793d11a778SJames Collins        $html .= '</div>';
12803d11a778SJames Collins        $html .= '</div>';
12813d11a778SJames Collins
12829cff245bSJames Collins        if ($parse === true) {
12839cff245bSJames Collins            $html = $this->includeIcons($html);
12849cff245bSJames Collins        }
12859cff245bSJames Collins        if ($print === true) {
12869cff245bSJames Collins            echo $html;
12879cff245bSJames Collins        }
12883d11a778SJames Collins        return $html;
12893d11a778SJames Collins    }
12903d11a778SJames Collins
12913d11a778SJames Collins    /**
12923d11a778SJames Collins     * Print or return you are here trail
12933d11a778SJames Collins     *
12949cff245bSJames Collins     * @param   boolean $print Print out trail.
12959cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12969cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12973d11a778SJames Collins     */
12989cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12993d11a778SJames Collins    {
13003d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
13013d11a778SJames Collins
13023a385f2cSJames Collins        if (
13033a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
130495372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
13053a385f2cSJames Collins        ) {
13069cff245bSJames Collins            return '';
13079cff245bSJames Collins        }
13083d11a778SJames Collins
13093d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
13103d11a778SJames Collins        $html .= '<div class="mikio-container">';
13113a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
131295372bffSJames Collins            if ($conf['youarehere'] !== 0) {
13139cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
131495372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1315ab45ba71SJames Collins                    ob_start();
131675adba86SJames Collins                    tpl_youarehere();
1317ab45ba71SJames Collins                    $html .= ob_get_contents();
1318ab45ba71SJames Collins                    ob_end_clean();
131995372bffSJames Collins                    $html .= '</div>';
1320ab45ba71SJames Collins                } else {
1321ab45ba71SJames Collins                    $sep = ' » ';
1322ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1323ab45ba71SJames Collins
13249cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
13253d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
13269cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1327ab45ba71SJames Collins
13289cff245bSJames Collins                        if ($img !== false) {
1329ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1330ab45ba71SJames Collins                        }
133175adba86SJames Collins                    }
133275adba86SJames Collins
13339cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
13343d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
13359cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1336ab45ba71SJames Collins
13379cff245bSJames Collins                        if ($img !== false) {
1338ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
133975adba86SJames Collins                        }
134047161538SJames Collins                    }
134147161538SJames Collins
1342ab45ba71SJames Collins                    $html .= '<ul>';
13433a385f2cSJames Collins                    if (empty($prefix) === false) {
13449cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
13459cff245bSJames Collins                    }
13469cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1347ab45ba71SJames Collins
1348ab45ba71SJames Collins                    $parts = explode(':', $ID);
1349ab45ba71SJames Collins                    $count = count($parts);
1350ab45ba71SJames Collins
1351ab45ba71SJames Collins                    $part = '';
13529cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1353ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1354ab45ba71SJames Collins                        $page = $part;
13559cff245bSJames Collins                        if ($page === $conf['start']) {
13569cff245bSJames Collins                            continue;
13579cff245bSJames Collins                        }
1358ab45ba71SJames Collins
1359ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
13609cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1361ab45ba71SJames Collins                    }
1362ab45ba71SJames Collins
1363ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
13649cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1365ab45ba71SJames Collins                        $page = $part . $parts[$i];
13669cff245bSJames Collins                        if ($page !== $conf['start']) {
1367ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
13689cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1369ab45ba71SJames Collins                        }
1370ab45ba71SJames Collins                    }
1371ab45ba71SJames Collins
1372ab45ba71SJames Collins                    $html .= '</ul>';
13739cff245bSJames Collins                }//end if
13749cff245bSJames Collins            }//end if
1375ab45ba71SJames Collins
13763d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13779cff245bSJames Collins            if ($showLast !== 0) {
1378a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13799cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1380a8eebd82SJames Collins                    $count = count($matches[0]);
1381a8eebd82SJames Collins                    $list = '';
1382a8eebd82SJames Collins
1383a8eebd82SJames Collins                    // Show Home
1384a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1385a8eebd82SJames Collins
1386a8eebd82SJames Collins                    $list .= '<li>...</li>';
13879cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1388a8eebd82SJames Collins                        $list .= $matches[0][$i];
1389a8eebd82SJames Collins                    }
1390a8eebd82SJames Collins
1391a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1392a8eebd82SJames Collins                }
1393a8eebd82SJames Collins            }
1394a8eebd82SJames Collins
13953d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1396a8eebd82SJames Collins                case 'none':
1397a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1398a8eebd82SJames Collins                    break;
1399a8eebd82SJames Collins                case 'home':
1400a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1401a8eebd82SJames Collins                    break;
1402a8eebd82SJames Collins                case 'icon':
14039cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
14049cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1405a8eebd82SJames Collins                    break;
1406a8eebd82SJames Collins            }
1407a8eebd82SJames Collins        } else {
1408a8eebd82SJames Collins            $html .= '&#8810; ';
14099cff245bSJames Collins            if (isset($_GET['page']) === true) {
14109cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1411a8eebd82SJames Collins            }
14124057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
14139cff245bSJames Collins        }//end if
14149cff245bSJames Collins
14159cff245bSJames Collins        $html .= '</div>';
14169cff245bSJames Collins        $html .= '</div>';
14179cff245bSJames Collins
14189cff245bSJames Collins        if ($parse === true) {
14199cff245bSJames Collins            $html = $this->includeIcons($html);
1420a8eebd82SJames Collins        }
14219cff245bSJames Collins        if ($print === true) {
14229cff245bSJames Collins            echo $html;
14239cff245bSJames Collins        }
1424ab45ba71SJames Collins        return $html;
1425ab45ba71SJames Collins    }
1426ab45ba71SJames Collins
14271785fc73SJames Collins    /**
14281785fc73SJames Collins     * Get Page Title
14299cff245bSJames Collins     *
14309cff245bSJames Collins     * @return string page title
14311785fc73SJames Collins     */
143210b40067Snomadjimbob    public function parsePageTitle()
143310b40067Snomadjimbob    {
14342060e56cSJames Collins        global $ID;
14352060e56cSJames Collins
14362060e56cSJames Collins        $title = p_get_first_heading($ID);
14379cff245bSJames Collins        if (strlen($title) <= 0) {
14389cff245bSJames Collins            $title = tpl_pagetitle(null, true);
14399cff245bSJames Collins        }
14401785fc73SJames Collins        $title = $this->includeIcons($title);
14411785fc73SJames Collins
14421785fc73SJames Collins        return $title;
14431785fc73SJames Collins    }
14441785fc73SJames Collins
1445ab45ba71SJames Collins
144675adba86SJames Collins    /**
1447a8eebd82SJames Collins     * Print or return hero block
144875adba86SJames Collins     *
14499cff245bSJames Collins     * @param   boolean $print Print content.
1450a8eebd82SJames Collins     * @return  string         contents of hero
145175adba86SJames Collins     */
14529cff245bSJames Collins    public function includeHero(bool $print = true)
145310b40067Snomadjimbob    {
1454a8eebd82SJames Collins        $html = '';
145547161538SJames Collins
14569cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1457a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1458f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1459a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
14603a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
14619cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
14629cff245bSJames Collins            }
14633a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
14649cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
14659cff245bSJames Collins            }
1466ab45ba71SJames Collins
1467a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
14681785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1469a8eebd82SJames Collins            $html .= '</h1>';
1470a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1471a8eebd82SJames Collins            $html .= '</div>';
147247161538SJames Collins
14739cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1474a8eebd82SJames Collins            $hero_image_resize_class = '';
14753a385f2cSJames Collins            if (empty($hero_image) === false) {
1476a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1477a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
147847161538SJames Collins            }
1479a8eebd82SJames Collins
14809cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14819cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1482a8eebd82SJames Collins
1483a8eebd82SJames Collins            $html .= '</div>';
1484f8039bf2SJames Collins            $html .= '</div>';
14859cff245bSJames Collins        }//end if
14869cff245bSJames Collins
14879cff245bSJames Collins        if ($print === true) {
14889cff245bSJames Collins            echo $html;
148975adba86SJames Collins        }
1490a8eebd82SJames Collins
1491a8eebd82SJames Collins        return $html;
149275adba86SJames Collins    }
149375adba86SJames Collins
149475adba86SJames Collins
149575adba86SJames Collins    /**
1496a8eebd82SJames Collins     * Print or return out TOC
149775adba86SJames Collins     *
14989cff245bSJames Collins     * @param   boolean $print Print TOC.
14999cff245bSJames Collins     * @param   boolean $parse Parse icons.
1500a8eebd82SJames Collins     * @return  string         contents of TOC
150175adba86SJames Collins     */
15029cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
150310b40067Snomadjimbob    {
1504ab45ba71SJames Collins        $html = '';
15052b4583abSJames Collins
1506ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1507ab45ba71SJames Collins
15083a385f2cSJames Collins        if (empty($tocHtml) === false) {
1509f65a4e5eSJames Collins            $tocHtml = preg_replace(
1510f65a4e5eSJames Collins                '/(<h3.+?toggle.+?>)(.+?)<\/h3>/',
1511f65a4e5eSJames Collins                '$1' .
1512f65a4e5eSJames Collins                $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' .
1513f65a4e5eSJames Collins                $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>',
1514f65a4e5eSJames Collins                $tocHtml
1515f65a4e5eSJames Collins            );
1516ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1517a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1518ab45ba71SJames Collins
1519ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1520ab45ba71SJames Collins            $html .= $tocHtml;
1521ab45ba71SJames Collins            $html .= '</div>';
15222b4583abSJames Collins        }
15232b4583abSJames Collins
15249cff245bSJames Collins        if ($parse === true) {
15259cff245bSJames Collins            $html = $this->includeIcons($html);
15269cff245bSJames Collins        }
15279cff245bSJames Collins
15289cff245bSJames Collins        if ($print === true) {
1529ab45ba71SJames Collins            echo $html;
1530ab45ba71SJames Collins        }
1531ab45ba71SJames Collins
15329cff245bSJames Collins        return $html;
15339cff245bSJames Collins    }
15349cff245bSJames Collins
1535ab45ba71SJames Collins
1536a8eebd82SJames Collins    /**
1537ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1538ab45ba71SJames Collins     *
15399cff245bSJames Collins     * @param   string $str Content to parse.
1540ab45ba71SJames Collins     * @return  string      parsed string
1541ab45ba71SJames Collins     */
15429cff245bSJames Collins    public function includeIcons(string $str)
154310b40067Snomadjimbob    {
1544ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1545ab45ba71SJames Collins
1546ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
15473a385f2cSJames Collins        if (empty($iconTag) === true) {
15489cff245bSJames Collins            return $str;
15499cff245bSJames Collins        }
1550ab45ba71SJames Collins
15519cff245bSJames Collins        if (
15529cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
15533a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
15549cff245bSJames Collins        ) {
1555a2005a27SJames Collins            $content = $str;
1556a2005a27SJames Collins            $preview = null;
1557a2005a27SJames Collins
15583a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15599cff245bSJames Collins                $html = new \simple_html_dom();
1560a2005a27SJames Collins                $html->stripRNAttrValues = false;
1561a2005a27SJames Collins                $html->load($str, true, false);
1562a2005a27SJames Collins
1563a2005a27SJames Collins                $preview = $html->find('div.preview');
15649cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1565a2005a27SJames Collins                    $content = $preview[0]->innertext;
1566a2005a27SJames Collins                }
1567a2005a27SJames Collins            }
1568a2005a27SJames Collins
15691785fc73SJames Collins            $page_regex = '/(.*)/';
15709cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
15711785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
15721785fc73SJames Collins            }
15731785fc73SJames Collins
15741785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1575a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1576a2005a27SJames Collins
157710b40067Snomadjimbob                return preg_replace_callback(
157810b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1579ab45ba71SJames Collins                    function ($matches) {
1580ab45ba71SJames Collins                        global $MIKIO_ICONS;
1581ab45ba71SJames Collins
1582ab45ba71SJames Collins                        $s = $matches[0];
1583ab45ba71SJames Collins
1584ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1585ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1586ab45ba71SJames Collins
1587ab45ba71SJames Collins                            if (count($matches) > 1) {
1588ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1589ab45ba71SJames Collins
1590ab45ba71SJames Collins                                if (count($e) > 1) {
1591ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15929cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1593ab45ba71SJames Collins                                            $icon = $iconItem;
1594ab45ba71SJames Collins
1595ab45ba71SJames Collins                                            $s = $icon['insert'];
1596ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
15971cdedf28SJames Collins                                                if (count($e) < $i || empty($e[$i]) === true) {
15989cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1599ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1600ab45ba71SJames Collins                                                    }
1601ab45ba71SJames Collins                                                } else {
1602ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1603ab45ba71SJames Collins                                                }
1604ab45ba71SJames Collins                                            }
1605ab45ba71SJames Collins
1606ab45ba71SJames Collins                                            $dir = '';
16079cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
16089cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
16099cff245bSJames Collins                                            }
1610ab45ba71SJames Collins
1611ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1612ab45ba71SJames Collins
1613ab45ba71SJames Collins                                            break;
16149cff245bSJames Collins                                        }//end if
16159cff245bSJames Collins                                    }//end foreach
1616ab45ba71SJames Collins                                } else {
1617ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
16189cff245bSJames Collins                                }//end if
16199cff245bSJames Collins                            }//end if
16209cff245bSJames Collins                        }//end if
162175adba86SJames Collins
1622ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
16239cff245bSJames Collins                        if ($count === 0) {
1624ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1625ab45ba71SJames Collins                        }
1626ab45ba71SJames Collins
1627ab45ba71SJames Collins                        return $s;
1628ab45ba71SJames Collins                    },
162910b40067Snomadjimbob                    $icons[0]
163010b40067Snomadjimbob                );
1631a2005a27SJames Collins            }, $content);
1632a2005a27SJames Collins
16333a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
16349cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1635a2005a27SJames Collins                    $preview[0]->innertext = $content;
1636a2005a27SJames Collins                }
1637a2005a27SJames Collins
1638a2005a27SJames Collins                $str = $html->save();
1639a2005a27SJames Collins                $html->clear();
1640a2005a27SJames Collins                unset($html);
1641a2005a27SJames Collins            } else {
1642a2005a27SJames Collins                $str = $content;
1643a2005a27SJames Collins            }
16449cff245bSJames Collins        }//end if
1645ab45ba71SJames Collins
1646ab45ba71SJames Collins        return $str;
1647ab45ba71SJames Collins    }
164847161538SJames Collins
1649c165b184SJames Collins    /**
1650a8eebd82SJames Collins     * Parse HTML for theme
1651c165b184SJames Collins     *
16529cff245bSJames Collins     * @param   string $content HTML content to parse.
1653a8eebd82SJames Collins     * @return  string          Parsed content
1654c165b184SJames Collins     */
16559cff245bSJames Collins    public function parseContent(string $content)
165610b40067Snomadjimbob    {
1657ab45ba71SJames Collins        global $INPUT, $ACT;
1658ab45ba71SJames Collins
1659a8eebd82SJames Collins        // Add Mikio Section titles
16603a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
16619cff245bSJames Collins            $admin_sections = [
1662ab45ba71SJames Collins                // Section      Insert Before                 Icon
16639cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
16649cff245bSJames Collins                'search'        => ['searchButton',            ''],
16659cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
16669cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
16679cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
16689cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
16699cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
16709cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
16719cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
16729cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
16739cff245bSJames Collins                'license'       => ['licenseType',             ''],
16749cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
16759cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
16769cff245bSJames Collins            ];
1677ab45ba71SJames Collins
1678ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1679ab45ba71SJames Collins                $search = $items[0];
1680ab45ba71SJames Collins                $icon   = $items[1];
1681ab45ba71SJames Collins
168210b40067Snomadjimbob                $content = preg_replace(
1683adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16849cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16859cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16869cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16879cff245bSJames Collins                        $search . '</span>',
168810b40067Snomadjimbob                    $content
168910b40067Snomadjimbob                );
1690ab45ba71SJames Collins            }
1691bb5a3dd1SJames Collins        } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) {
1692ad182e6dSnomadjimbob            $mikioPluginMissing = true;
1693ad182e6dSnomadjimbob            /* Hide plugin fields if not installed */
16949ffe9161Snomadjimbob            if (plugin_load('action', 'mikioplugin') !== null) {
1695ad182e6dSnomadjimbob                $mikioPluginMissing = false;
1696ad182e6dSnomadjimbob            }
1697ad182e6dSnomadjimbob
1698cee81679SJames Collins            $style_headers = [
1699f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__text_'],
1700f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__code_'],
1701f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__control_'],
1702f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__topheader_'],
1703f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__navbar_'],
1704f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'],
1705f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__tag_background_color_'],
1706f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'],
1707f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__hero_'],
1708f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__sidebar_'],
1709f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__content_'],
1710f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__toc_'],
1711f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__pagetools_'],
1712f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__footer_'],
1713f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__table_'],
1714f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__dropdown_'],
1715f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__section_edit_'],
1716f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__tree_'],
1717f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__tab_'],
1718ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2',
17199ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17209ffe9161Snomadjimbob                ],
1721ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing],
1722ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_',
17239ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17249ffe9161Snomadjimbob                ],
1725ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing],
1726ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing],
1727ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing],
1728ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing],
1729ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing],
1730ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing],
1731ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing],
1732ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing],
1733ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing],
1734ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing],
1735ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing],
1736cee81679SJames Collins                ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'],
1737f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__darkmode_text_'],
1738f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__darkmode_code_'],
1739f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__darkmode_control_'],
1740f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'],
1741f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'],
1742f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'],
1743f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'],
1744f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'],
1745f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'],
1746f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'],
1747f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__darkmode_content_'],
1748f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'],
1749f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'],
1750f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'],
1751f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__darkmode_table_'],
1752f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'],
1753f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'],
1754f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'],
1755f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'],
1756ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2',
17579ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17589ffe9161Snomadjimbob                ],
1759ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_',
17609ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17619ffe9161Snomadjimbob                ],
1762ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_',
17639ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17649ffe9161Snomadjimbob                ],
1765ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_',
17669ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17679ffe9161Snomadjimbob                ],
1768ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_',
17699ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17709ffe9161Snomadjimbob                ],
1771ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_',
17729ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17739ffe9161Snomadjimbob                ],
1774ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_',
17759ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17769ffe9161Snomadjimbob                ],
1777ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_',
17789ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17799ffe9161Snomadjimbob                ],
1780ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_',
17819ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17829ffe9161Snomadjimbob                ],
1783ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_',
17849ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17859ffe9161Snomadjimbob                ],
1786ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_',
17879ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17889ffe9161Snomadjimbob                ],
1789ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing],
1790ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_',
17919ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17929ffe9161Snomadjimbob                ],
1793ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing],
1794cee81679SJames Collins            ];
1795cee81679SJames Collins
1796cee81679SJames Collins            foreach ($style_headers as $header) {
1797cee81679SJames Collins                if (array_key_exists('heading', $header) === false) {
1798cee81679SJames Collins                    $header['heading'] = 'h3';
1799cee81679SJames Collins                }
1800cee81679SJames Collins
1801ad182e6dSnomadjimbob                if (array_key_exists('hidden', $header) === false) {
1802ad182e6dSnomadjimbob                    $header['hidden'] = false;
1803ad182e6dSnomadjimbob                }
1804ad182e6dSnomadjimbob
18051244e3ceSJames Collins                $content = preg_replace(
1806f65a4e5eSJames Collins                    '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s',
18079ffe9161Snomadjimbob                    '</tbody></table><' . $header['heading'] . ' style="display:' .
18089ffe9161Snomadjimbob                    ($header['hidden'] === true ? 'none' : 'block') . '">' .
18099ffe9161Snomadjimbob                    $header['title'] . '</' . $header['heading'] . '>
1810ad182e6dSnomadjimbob                    <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1',
18111244e3ceSJames Collins                    $content,
18121244e3ceSJames Collins                    1
18131244e3ceSJames Collins                );
1814cee81679SJames Collins            }
1815f65a4e5eSJames Collins
1816dea1f088SJames Collins            $content = preg_replace_callback('/<input type="color"[^>]*>/', function ($match) {
1817dea1f088SJames Collins                // Get the ID of the <input type="color"> element
1818dea1f088SJames Collins                preg_match('/id="([^"]*)"/', $match[0], $matches);
1819dea1f088SJames Collins
1820dea1f088SJames Collins                // Replace type with text and remove the id attribute
18212c87ab0dSJames Collins                $replacement = preg_replace(
18222c87ab0dSJames Collins                    ['/type="color"/', '/id="([^"]*)"/'],
18232c87ab0dSJames Collins                    ['type="text" class="mikio-color-text-input"', 'for="$1"'],
18242c87ab0dSJames Collins                    $match[0]
18252c87ab0dSJames Collins                );
1826dea1f088SJames Collins
1827dea1f088SJames Collins                return '<div class="mikio-color-picker">' . $replacement . $match[0] . '</div>';
1828dea1f088SJames Collins            }, $content);
1829bb5a3dd1SJames Collins        }//end if
1830ab45ba71SJames Collins
18313a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1832a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1833a8eebd82SJames Collins        }
1834ab45ba71SJames Collins
1835a8eebd82SJames Collins        // Page Revisions - Table Fix
18369cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
18379cff245bSJames Collins            $content = preg_replace(
18389cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
18399cff245bSJames Collins                '<span>$1</span>',
18409cff245bSJames Collins                $content
18419cff245bSJames Collins            );
1842a8eebd82SJames Collins        }
1843ab45ba71SJames Collins
18449cff245bSJames Collins        $html = new \simple_html_dom();
1845bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1846c165b184SJames Collins        $html->load($content, true, false);
1847c165b184SJames Collins
18489cff245bSJames Collins        if ($html === false) {
18499cff245bSJames Collins            return $content;
18509cff245bSJames Collins        }
1851ab45ba71SJames Collins
1852ab45ba71SJames Collins        /* Buttons */
1853ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1854ab45ba71SJames Collins            $c = explode(' ', $node->class);
18559cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
18569cff245bSJames Collins                $c[] = 'mikio-button';
18579cff245bSJames Collins            }
1858ab45ba71SJames Collins            $node->class = implode(' ', $c);
1859c165b184SJames Collins        }
1860c165b184SJames Collins
1861ab45ba71SJames Collins
1862ab45ba71SJames Collins        /* Buttons - Primary */
1863ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1864ab45ba71SJames Collins            $c = explode(' ', $node->class);
18659cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
18669cff245bSJames Collins                $c[] = 'mikio-primary';
18679cff245bSJames Collins            }
1868ab45ba71SJames Collins            $node->class = implode(' ', $c);
1869ab45ba71SJames Collins        }
1870ab45ba71SJames Collins
1871a8eebd82SJames Collins        /* Hide page title if hero is enabled */
18729cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
18731785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
187447161538SJames Collins
187547161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
18769cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1877a8eebd82SJames Collins                    // $elm->innertext = '';
1878a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1879a8eebd82SJames Collins
188047161538SJames Collins                    break;
188147161538SJames Collins                }
188247161538SJames Collins            }
188347161538SJames Collins        }
1884c165b184SJames Collins
1885a8eebd82SJames Collins        /* Hero subtitle */
18862b4583abSJames Collins        foreach ($html->find('p') as $elm) {
1887d0d6c450SJames Collins            if (preg_match('/[~-]~hero-subtitle (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1888d0d6c450SJames Collins                $subtitle = $matches[1];
1889a8eebd82SJames Collins                $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1890a8eebd82SJames Collins
1891d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-subtitle (.+?)~[~-]/ui', '', $elm->innertext);
18922b4583abSJames Collins                break;
18932b4583abSJames Collins            }
18942b4583abSJames Collins        }
18952b4583abSJames Collins
1896a8eebd82SJames Collins        /* Hero image */
1897a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1898a8eebd82SJames Collins            $image = '';
1899d0d6c450SJames Collins            preg_match('/[~-]~hero-image (.+?)~[~-](?!.?")/ui', $elm->innertext, $matches);
1900a8eebd82SJames Collins            if (count($matches) > 0) {
1901a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1902a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1903a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1904a8eebd82SJames Collins                } else {
1905a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1906a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1907a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1908a8eebd82SJames Collins                    } else {
1909a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
19109cff245bSJames Collins                        if (stripos($image, ':') === false) {
19119cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1912a8eebd82SJames Collins                            $i = stripos($image, '?');
19139cff245bSJames Collins                            if ($i !== false) {
1914a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1915c165b184SJames Collins                            }
1916c165b184SJames Collins
1917a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1918ab45ba71SJames Collins                        }
1919ab45ba71SJames Collins                    }
1920ab45ba71SJames Collins                }
1921ab45ba71SJames Collins
1922a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1923a8eebd82SJames Collins
1924d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-image (.+?)~[~-].*/ui', '', $elm->innertext);
19259cff245bSJames Collins            }//end if
19269cff245bSJames Collins        }//end foreach
1927ab45ba71SJames Collins
19289cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
19299cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1930a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1931d0d6c450SJames Collins            if (preg_match('/[~-]~hero-colors (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1932d0d6c450SJames Collins                $subtitle = $matches[1];
1933d0d6c450SJames Collins                $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $subtitle . '\')';
1934ab45ba71SJames Collins
1935d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-colors (.+?)~[~-]/ui', '', $elm->innertext);
1936a8eebd82SJames Collins                break;
1937ab45ba71SJames Collins            }
1938ab45ba71SJames Collins        }
1939ab45ba71SJames Collins
194096ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
194196ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
19423a44a74aSJames Collins            if (preg_match('/[~-]~hide-parts (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1943d0d6c450SJames Collins                $parts = explode(' ', $matches[1]);
194496ec8e1eSJames Collins                $script = '';
194596ec8e1eSJames Collins
194696ec8e1eSJames Collins                foreach ($parts as $part) {
194796ec8e1eSJames Collins                    if (strlen($part) > 0) {
194896ec8e1eSJames Collins                        $script .= 'mikio.hidePart(\'' . $part . '\');';
194996ec8e1eSJames Collins                    }
195096ec8e1eSJames Collins                }
195196ec8e1eSJames Collins
195296ec8e1eSJames Collins                if (strlen($script) > 0) {
195396ec8e1eSJames Collins                    $this->footerScript['hide-parts'] = $script;
195496ec8e1eSJames Collins                }
195596ec8e1eSJames Collins
19563a44a74aSJames Collins                $elm->innertext = preg_replace('/[~-]~hide-parts (.+?)~[~-]/ui', '', $elm->innertext);
195796ec8e1eSJames Collins                break;
1958d0d6c450SJames Collins            }
19599cff245bSJames Collins        }//end foreach
196096ec8e1eSJames Collins
196196ec8e1eSJames Collins
1962a8eebd82SJames Collins        /* Page Tags (tag plugin) */
19639cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1964a8eebd82SJames Collins            $tags = '';
1965a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1966a8eebd82SJames Collins                $tags .= $elm->outertext;
1967a8eebd82SJames Collins            }
1968a8eebd82SJames Collins
1969a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1970a8eebd82SJames Collins                $elm->innertext = '';
1971a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1972a8eebd82SJames Collins            }
1973a8eebd82SJames Collins
19743a385f2cSJames Collins            if (empty($tags) === false) {
1975a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1976a8eebd82SJames Collins            }
1977ab45ba71SJames Collins        }
1978ab45ba71SJames Collins
1979ab45ba71SJames Collins        // Configuration Manager
19803a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1981ab45ba71SJames Collins            // Additional save buttons
1982ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1983ab45ba71SJames Collins                $saveButtons = '';
1984ab45ba71SJames Collins
1985ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1986ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1987a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1988ab45ba71SJames Collins                    $elm->outertext = '';
1989ab45ba71SJames Collins                }
1990ab45ba71SJames Collins
1991ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1992ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1993ab45ba71SJames Collins                }
1994ab45ba71SJames Collins            }
1995ab45ba71SJames Collins        }
1996ab45ba71SJames Collins
1997ab45ba71SJames Collins        $content = $html->save();
1998c165b184SJames Collins        $html->clear();
1999c165b184SJames Collins        unset($html);
2000c165b184SJames Collins
2001c165b184SJames Collins        return $content;
2002c165b184SJames Collins    }
20032b4583abSJames Collins
20042b4583abSJames Collins
2005a8eebd82SJames Collins    /**
2006a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
2007a8eebd82SJames Collins     *
20089cff245bSJames Collins     * @param   string $str String to parse.
20099cff245bSJames Collins     * @return  string      parsed URI
2010a8eebd82SJames Collins     */
20119cff245bSJames Collins    public function getLink(string $str)
201210b40067Snomadjimbob    {
20132b4583abSJames Collins        $i = strpos($str, '://');
20149cff245bSJames Collins        if ($i !== false) {
20159cff245bSJames Collins            return $str;
20169cff245bSJames Collins        }
20172b4583abSJames Collins
20182b4583abSJames Collins        return wl($str);
20192b4583abSJames Collins    }
2020ab45ba71SJames Collins
2021ab45ba71SJames Collins
2022a8eebd82SJames Collins    /**
2023a8eebd82SJames Collins     * Check if the user can edit current namespace/page
2024a8eebd82SJames Collins     *
2025a8eebd82SJames Collins     * @return  boolean  user can edit
2026a8eebd82SJames Collins     */
202710b40067Snomadjimbob    public function userCanEdit()
202810b40067Snomadjimbob    {
2029ab45ba71SJames Collins        global $INFO;
2030ab45ba71SJames Collins        global $ID;
2031ab45ba71SJames Collins
2032ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
20339cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
20349cff245bSJames Collins            return true;
20359cff245bSJames Collins        }
20369cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
20379cff245bSJames Collins            return true;
20389cff245bSJames Collins        }
2039a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
20409cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
20419cff245bSJames Collins            return true;
20429cff245bSJames Collins        }
20439cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
20449cff245bSJames Collins            return true;
20459cff245bSJames Collins        }
2046ab45ba71SJames Collins
2047ab45ba71SJames Collins        return false;
2048c165b184SJames Collins    }
204947161538SJames Collins
205047161538SJames Collins
2051a8eebd82SJames Collins    /**
2052a8eebd82SJames Collins     * Search for and return the uri of a media file
2053a8eebd82SJames Collins     *
20549cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
20559cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
20569cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
20579cff245bSJames Collins     * @return string                  URI of the found media file
2058a8eebd82SJames Collins     */
20599cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
206010b40067Snomadjimbob    {
2061ab45ba71SJames Collins        global $INFO;
2062a8eebd82SJames Collins
20639cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
2064ab45ba71SJames Collins
20659cff245bSJames Collins        if ($searchCurrentNS === true) {
20669cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
20679cff245bSJames Collins        }
20689cff245bSJames Collins        if ($propagate === true) {
2069ab45ba71SJames Collins            $prefix[] = ':';
2070ab45ba71SJames Collins            $prefix[] = ':wiki:';
2071a8eebd82SJames Collins        }
2072ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
20733a385f2cSJames Collins        if (empty($theme) === false) {
20749cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
20759cff245bSJames Collins        }
2076ab45ba71SJames Collins        $prefix[] = 'images/';
2077ab45ba71SJames Collins
20789cff245bSJames Collins        $search = [];
2079ab45ba71SJames Collins        foreach ($prefix as $pitem) {
2080ab45ba71SJames Collins            foreach ($ext as $eitem) {
2081ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
2082ab45ba71SJames Collins            }
2083ab45ba71SJames Collins        }
2084ab45ba71SJames Collins
2085ab45ba71SJames Collins        $img = '';
2086ab45ba71SJames Collins        $file = '';
2087ab45ba71SJames Collins        $url = '';
2088ab45ba71SJames Collins        $ismedia = false;
2089ab45ba71SJames Collins        $found = false;
2090ab45ba71SJames Collins
2091ab45ba71SJames Collins        foreach ($search as $img) {
20923a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
2093ab45ba71SJames Collins                $file    = mediaFN($img);
2094ab45ba71SJames Collins                $ismedia = true;
2095ab45ba71SJames Collins            } else {
2096ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
2097ab45ba71SJames Collins                $ismedia = false;
2098ab45ba71SJames Collins            }
2099ab45ba71SJames Collins
21009cff245bSJames Collins            if (file_exists($file) === true) {
2101ab45ba71SJames Collins                $found = true;
2102ab45ba71SJames Collins                break;
2103ab45ba71SJames Collins            }
2104ab45ba71SJames Collins        }
2105ab45ba71SJames Collins
21069cff245bSJames Collins        if ($found === false) {
21079cff245bSJames Collins            return false;
21089cff245bSJames Collins        }
2109ab45ba71SJames Collins
21109cff245bSJames Collins        if ($ismedia === true) {
2111ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
2112ab45ba71SJames Collins        } else {
2113ab45ba71SJames Collins            $url = tpl_basedir() . $img;
2114ab45ba71SJames Collins        }
2115ab45ba71SJames Collins
2116ab45ba71SJames Collins        return $url;
2117ab45ba71SJames Collins    }
2118ab45ba71SJames Collins
2119a8eebd82SJames Collins
2120a8eebd82SJames Collins    /**
2121ab45ba71SJames Collins     * Print or return the page title
2122ab45ba71SJames Collins     *
21239cff245bSJames Collins     * @param string $page Page id or empty string for current page.
2124ab45ba71SJames Collins     * @return string      generated content
2125ab45ba71SJames Collins     */
21269cff245bSJames Collins    public function getPageTitle(string $page = '')
212710b40067Snomadjimbob    {
2128ab45ba71SJames Collins        global $ID, $conf;
2129ab45ba71SJames Collins
2130ab45ba71SJames Collins        $html = '';
2131ab45ba71SJames Collins
21323a385f2cSJames Collins        if (empty($page) === true) {
21339cff245bSJames Collins            $page = $ID;
21349cff245bSJames Collins        }
2135ab45ba71SJames Collins
2136ab45ba71SJames Collins        $html = p_get_first_heading($page);
2137ab45ba71SJames Collins        $html = strip_tags($html);
2138ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
2139ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
2140ab45ba71SJames Collins        $html = trim($html);
2141ab45ba71SJames Collins
2142ab45ba71SJames Collins        return $html;
2143ab45ba71SJames Collins    }
2144a8eebd82SJames Collins
2145a8eebd82SJames Collins
2146a8eebd82SJames Collins    /**
2147a8eebd82SJames Collins     * Return inline theme icon
2148a8eebd82SJames Collins     *
21499cff245bSJames Collins     * @param   string $type  Icon to retreive.
21509e41d878SJames Collins     * @param   string $class Classname to insert.
21519cff245bSJames Collins     * @return  string        HTML icon content
2152a8eebd82SJames Collins     */
21539e41d878SJames Collins    public function mikioInlineIcon(string $type, string $class = "")
215410b40067Snomadjimbob    {
21559e41d878SJames Collins        if (is_array($class) === true) {
21569e41d878SJames Collins            $class = explode(' ', $class);
21579e41d878SJames Collins        }
21589e41d878SJames Collins
21599e41d878SJames Collins        if (strlen($class) > 0) {
21609e41d878SJames Collins            $class = ' ' . $class;
21619e41d878SJames Collins        }
21629e41d878SJames Collins
2163a8eebd82SJames Collins        switch ($type) {
2164a8eebd82SJames Collins            case 'wrench':
2165906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792
2166906e1a13SJames Collins1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,53.152542,1217.0847)"><path d="m 384,64 q 0,26 -19,45 -19,
2167906e1a13SJames Collins19 -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,
2168906e1a13SJames Collins-37 -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,
2169906e1a13SJames Collins435 q 0,-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
2170906e1a13SJames Collins131.5,131.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,
2171906e1a13SJames Collins-107 q 5,3 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>';
2172a8eebd82SJames Collins            case 'file':
2173906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2174906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991">
2175906e1a13SJames Collins<path d="M 128,0 H 1152 V 768 H 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
2176906e1a13SJames Collins1280,768 V -32 q 0,-40 -28,-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
2177906e1a13SJames Collinsq 40,0 88,-20 48,-20 76,-48 l 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0"
21789cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
2179a8eebd82SJames Collins            case 'gear':
2180906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2181906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027">
2182906e1a13SJames Collins<path d="m 1024,640 q 0,106 -75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 0,-106 75,-181 75,-75 181,-75 106,0
2183906e1a13SJames Collins181,75 75,75 75,181 z m 512,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
2184906e1a13SJames Collins10,-25 0,-13 -9,-23 -27,-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
2185906e1a13SJames Collins-36,-28 H 657 q -14,0 -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
2186906e1a13SJames Collins147,186 q -7,10 -7,23 0,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
2187906e1a13SJames Collinsq 0,12 8,23 8,11 19,13 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,
2188906e1a13SJames Collins71.5 13,0 26,-10 l 138,-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
2189906e1a13SJames Collinsq 49,-16 90,-37 l 142,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
2190906e1a13SJames Collins-54,-70.5 26,-50 41,-98 l 183,-28 q 13,-2 21,-12.5 8,-10.5 8,-23.5 z" id="path3029" inkscape:connector-curvature="0" />
2191906e1a13SJames Collins</g></svg>';
2192a8eebd82SJames Collins            case 'user':
2193906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2194906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M
2195906e1a13SJames Collins1408,131 Q 1408,11 1335,-58.5 1262,-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
2196906e1a13SJames Collins28,402 44,452 q 16,50 43,97.5 27,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,
2197906e1a13SJames Collins-26.5 108,-48 Q 637,565 704,565 q 67,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
2198906e1a13SJames Collins50.5,-20 85.5,-53.5 35,-33.5 62,-81 27,-47.5 43,-97.5 16,-50 26.5,-108.5 10.5,-58.5 14,-109 Q 1408,184 1408,131 z m
2199906e1a13SJames Collins-320,893 Q 1088,865 975.5,752.5 863,640 704,640 545,640 432.5,752.5 320,865 320,1024 320,1183 432.5,1295.5 545,1408 704,
2200906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>';
2201a8eebd82SJames Collins            case 'search':
22029e41d878SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
22039cff245bSJames 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
22049cff245bSJames 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
22059cff245bSJames 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
22069cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2207a8eebd82SJames Collins            case 'home':
2208906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2209906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g
2210906e1a13SJames Collinstransform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015"><path d="M 1408,544 V 64 Q 1408,38 1389,19 1370,0 1344,0 H
2211906e1a13SJames Collins960 V 384 H 704 V 0 H 320 q -26,0 -45,19 -19,19 -19,45 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
2212906e1a13SJames Collinsm 223,69 -62,-74 q -8,-9 -21,-11 h -3 q -13,0 -21,7 L 832,1112 140,535 q -12,-8 -24,-7 -13,2 -21,11 l -62,74 q -8,10
2213906e1a13SJames Collins-7,23.5 1,13.5 11,21.5 l 719,599 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,
2214906e1a13SJames Collins-9 9,-23 V 840 l 219,-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0"
22159cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
22169e41d878SJames Collins            case 'sun':
2217906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2218906e1a13SJames Collinsstyle="fill:currentColor" viewBox="0 0 16 16"><path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0
2219906e1a13SJames Collins0 8zm.5-9.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm0 11a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm5-5a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-11
2220906e1a13SJames Collins0a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm9.743-4.036a.5.5 0 1 1-.707-.707.5.5 0 0 1 .707.707zm-7.779 7.779a.5.5 0 1
2221906e1a13SJames Collins1-.707-.707.5.5 0 0 1 .707.707zm7.072 0a.5.5 0 1 1 .707-.707.5.5 0 0 1-.707.707zM3.757 4.464a.5.5 0 1 1 .707-.707.5.5
2222906e1a13SJames Collins0 0 1-.707.707z" /></svg>';
22239e41d878SJames Collins            case 'moon':
2224906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2225906e1a13SJames Collinsstyle="fill:currentColor" viewBox="0 0 16 16"><path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0
2226906e1a13SJames Collins4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0
2227906e1a13SJames Collins1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278zM4.858 1.311A7.269 7.269 0 0 0
2228906e1a13SJames Collins1.025 7.71c0 4.02 3.279 7.276 7.319 7.276a7.316 7.316 0 0 0 5.205-2.162c-.337.042-.68.063-1.029.063-4.61
2229906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>';
223034d5f19aSJames Collins            case 'sunmoon':
2231d0fba6d1SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2232d0fba6d1SJames Collinsstyle="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
2233d0fba6d1SJames CollinsviewBox="0 0 32 32"><line x1="16" y1="3" x2="16" y2="29"/><path d="M16,23c-3.87,0-7-3.13-7-7s3.13-7,7-7"/><line
2234d0fba6d1SJames Collinsx1="6.81" y1="6.81" x2="8.93" y2="8.93"/><line x1="3" y1="16" x2="6" y2="16"/><line x1="6.81" y1="25.19" x2="8.93"
2235d0fba6d1SJames Collinsy2="23.07"/><path d="M16,12.55C17.2,10.43,19.48,9,22.09,9c0.16,0,0.31,0.01,0.47,0.02c-1.67,0.88-2.8,2.63-2.8,4.64c0,2.9,
2236d0fba6d1SJames Collins2.35,5.25,5.25,5.25c1.6,0,3.03-0.72,3.99-1.85C28.48,20.43,25.59,23,22.09,23c-2.61,0-4.89-1.43-6.09-3.55"/></svg>';
2237f65a4e5eSJames Collins            case 'hamburger':
2238f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
2239f65a4e5eSJames Collinsstyle="fill:currentColor"><path d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0
2240f65a4e5eSJames Collins76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16
2241f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16
2242f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>';
2243f65a4e5eSJames Collins            case 'down-arrow':
2244f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
2245f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9
2246f65a4e5eSJames Collins1.917-1.916z"/></svg>';
22473a3ece10SJames Collins            case 'language':
22483a3ece10SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" width="16"
22493a3ece10SJames Collinsheight="16" fill="currentColor" viewBox="0 0 16 16"><path d="M4.545 6.714 4.11
22503a3ece10SJames Collins8H3l1.862-5h1.284L8 8H6.833l-.435-1.286H4.545zm1.634-.736L5.5 3.956h-.049l-.679 2.022H6.18z"/><path d="M0 2a2 2 0 0 1
22513a3ece10SJames Collins2-2h7a2 2 0 0 1 2 2v3h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-3H2a2 2 0 0 1-2-2V2zm2-1a1 1 0 0 0-1 1v7a1 1 0 0
22523a3ece10SJames Collins0 1 1h7a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H2zm7.138 9.995c.193.301.402.583.63.846-.748.575-1.673 1.001-2.768
22533a3ece10SJames Collins1.292.178.217.451.635.555.867 1.125-.359 2.08-.844 2.886-1.494.777.665 1.739 1.165 2.93
22543a3ece10SJames Collins1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651
22553a3ece10SJames Collins1.621-2.757H14V8h-3v1.047h.765c-.318.844-.74 1.546-1.272 2.13a6.066 6.066 0 0 1-.415-.492 1.988 1.988 0 0 1-.94.31z"/>
22563a3ece10SJames Collins</svg>';
22579cff245bSJames Collins        }//end switch
2258ab45ba71SJames Collins
2259a8eebd82SJames Collins        return '';
2260a8eebd82SJames Collins    }
2261ab45ba71SJames Collins
2262a8eebd82SJames Collins    /**
2263a8eebd82SJames Collins     * Finalize theme
22649cff245bSJames Collins     *
22659cff245bSJames Collins     * @return void
2266a8eebd82SJames Collins     */
226710b40067Snomadjimbob    public function finalize()
226810b40067Snomadjimbob    {
2269a8eebd82SJames Collins    }
22701785fc73SJames Collins
22711785fc73SJames Collins    /**
22721785fc73SJames Collins     * Show Messages
22739cff245bSJames Collins     *
22749cff245bSJames Collins     * @return void
22751785fc73SJames Collins     */
227610b40067Snomadjimbob    public function showMessages()
227710b40067Snomadjimbob    {
22781785fc73SJames Collins        global $ACT;
22791785fc73SJames Collins
22809cff245bSJames Collins        if ($this->lessIgnored === true) {
22819cff245bSJames Collins            msg(
22829cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
22839cff245bSJames Collins                2,
22849cff245bSJames Collins                '',
22859cff245bSJames Collins                '',
22869cff245bSJames Collins                MSG_ADMINS_ONLY
22879cff245bSJames Collins            );
2288a8df40efSJames Collins        }
2289a8df40efSJames Collins
22901785fc73SJames Collins        $show = $this->getConf('showNotifications');
22913a385f2cSJames Collins        if (
22924f8225e4SJames Collins            strlen($show) === 0 ||
22933a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
22943a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
22953a385f2cSJames Collins        ) {
22961785fc73SJames Collins            global $MSG, $MSG_shown;
22971785fc73SJames Collins
22984f8225e4SJames Collins            if (isset($MSG) !== false) {
22999cff245bSJames Collins                if (isset($MSG_shown) === false) {
23009cff245bSJames Collins                    $MSG_shown = [];
2301a8df40efSJames Collins                }
23021785fc73SJames Collins
23031785fc73SJames Collins                foreach ($MSG as $msg) {
23041785fc73SJames Collins                    $hash = md5($msg['msg']);
23059cff245bSJames Collins                    if (isset($MSG_shown[$hash]) === true) {
23061785fc73SJames Collins                        continue;
23071785fc73SJames Collins                    }
23081785fc73SJames Collins                    // skip double messages
23091785fc73SJames Collins
23109cff245bSJames Collins                    if (info_msg_allowed($msg) === true) {
23119cff245bSJames Collins                        echo '<div class="' . $msg['lvl'] . '">';
23129cff245bSJames Collins                        echo $msg['msg'];
23139cff245bSJames Collins                        echo '</div>';
23141785fc73SJames Collins                    }
23151785fc73SJames Collins
2316a8df40efSJames Collins                    $MSG_shown[$hash] = true;
23171785fc73SJames Collins                }
23181785fc73SJames Collins
23191785fc73SJames Collins                unset($GLOBALS['MSG']);
23209cff245bSJames Collins            }//end if
23214f8225e4SJames Collins
23224f8225e4SJames Collins            if (strlen($this->includedPageNotifications) > 0) {
23234f8225e4SJames Collins                echo $this->includedPageNotifications;
23244f8225e4SJames Collins            }
23254f8225e4SJames Collins        }//end if
23261785fc73SJames Collins    }
23277ac0a6efSJames Collins
23287ac0a6efSJames Collins    /**
23297ac0a6efSJames Collins     * Dokuwiki version
23307ac0a6efSJames Collins     *
23317ac0a6efSJames Collins     * @return  string        the dw version name
23327ac0a6efSJames Collins     */
23339cff245bSJames Collins    public function dwVersion()
23349cff245bSJames Collins    {
23359cff245bSJames Collins        if (function_exists('getVersionData') === true) {
23367ac0a6efSJames Collins            $version_data = getVersionData();
23379cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
23387ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
23397ac0a6efSJames Collins                if (count($version_items) >= 2) {
23407ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
23417ac0a6efSJames Collins                }
23427ac0a6efSJames Collins            }
23437ac0a6efSJames Collins        }
23447ac0a6efSJames Collins
23457ac0a6efSJames Collins        return 'unknown';
23467ac0a6efSJames Collins    }
2347e4c4fb13SJames Collins
2348e4c4fb13SJames Collins    /**
2349e4c4fb13SJames Collins     * Dokuwiki version number
2350e4c4fb13SJames Collins     *
2351e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2352e4c4fb13SJames Collins     */
23539cff245bSJames Collins    public function dwVersionNumber()
23549cff245bSJames Collins    {
23559cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2356e4c4fb13SJames Collins            $version_data = getVersionData();
23579cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2358e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2359e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2360e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2361e4c4fb13SJames Collins                }
2362e4c4fb13SJames Collins            }
2363e4c4fb13SJames Collins        }
2364e4c4fb13SJames Collins
2365e4c4fb13SJames Collins        return 0;
2366e4c4fb13SJames Collins    }
2367a8eebd82SJames Collins}
2368ab45ba71SJames Collins
2369ab45ba71SJames Collinsglobal $TEMPLATE;
237047161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2371