xref: /template/mikio/mikio.php (revision 3a3ece10ce10f87f709360c8945eb76e22324ef0)
1c165b184SJames Collins<?php
210b40067Snomadjimbob
3c165b184SJames Collins/**
4c165b184SJames Collins * DokuWiki Mikio Template
5c165b184SJames Collins *
6c165b184SJames Collins * @link    http://dokuwiki.org/template:mikio
7c165b184SJames Collins * @author  James Collins <james.collins@outlook.com.au>
8ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html)
9c165b184SJames Collins */
1010b40067Snomadjimbob
11ab45ba71SJames Collinsnamespace dokuwiki\template\mikio;
12c165b184SJames Collins
139cff245bSJames Collinsif (defined('DOKU_INC') === false) {
149cff245bSJames Collins    die();
159cff245bSJames Collins}
16c165b184SJames Collins
17ab45ba71SJames Collinsrequire_once('icons/icons.php');
18c165b184SJames Collinsrequire_once('inc/simple_html_dom.php');
19c165b184SJames Collins
2010b40067Snomadjimbobclass Template
2110b40067Snomadjimbob{
229cff245bSJames Collins    /**
239cff245bSJames Collins     * @var string Template directory path from local FS.
249cff245bSJames Collins     */
25c165b184SJames Collins    public $tplDir  = '';
269cff245bSJames Collins
279cff245bSJames Collins    /**
289cff245bSJames Collins     * @var string Template directory path from web.
299cff245bSJames Collins     */
30c165b184SJames Collins    public $baseDir = '';
319cff245bSJames Collins
329cff245bSJames Collins    /**
339cff245bSJames Collins     * @var array Array of Javascript files to include in footer.
349cff245bSJames Collins     */
359cff245bSJames Collins    public $footerScript = [];
369cff245bSJames Collins
379cff245bSJames Collins    /**
389cff245bSJames Collins     * @var boolean Ignore LESS files.
399cff245bSJames Collins     */
40a8df40efSJames Collins    public $lessIgnored = false;
41c165b184SJames Collins
42c165b184SJames Collins
43c165b184SJames Collins    /**
44c165b184SJames Collins     * Class constructor
45c165b184SJames Collins     */
4610b40067Snomadjimbob    public function __construct()
4710b40067Snomadjimbob    {
48c165b184SJames Collins        $this->tplDir  = tpl_incdir();
49c165b184SJames Collins        $this->baseDir = tpl_basedir();
50c165b184SJames Collins
519cff245bSJames Collins        $this->registerHooks();
52c165b184SJames Collins    }
53c165b184SJames Collins
54c165b184SJames Collins    /**
55ab45ba71SJames Collins     * Returns the instance of the class
5647161538SJames Collins     *
57ab45ba71SJames Collins     * @return  Template        class instance
5847161538SJames Collins     */
5947161538SJames Collins    public static function getInstance()
6047161538SJames Collins    {
6147161538SJames Collins        static $instance = null;
6247161538SJames Collins
633a385f2cSJames Collins        if (empty($instance) === true) {
6447161538SJames Collins            $instance = new Template();
6547161538SJames Collins        }
6647161538SJames Collins
6747161538SJames Collins        return $instance;
6847161538SJames Collins    }
6947161538SJames Collins
70ab45ba71SJames Collins
7147161538SJames Collins    /**
72ab45ba71SJames Collins     * Register the themes hooks into Dokuwiki
739cff245bSJames Collins     *
749cff245bSJames Collins     * @return void
75c165b184SJames Collins     */
769cff245bSJames Collins    private function registerHooks()
7710b40067Snomadjimbob    {
78c165b184SJames Collins        global $EVENT_HANDLER;
79c165b184SJames Collins
809cff245bSJames Collins        $events_dispatcher = [
81ab45ba71SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler'
829cff245bSJames Collins        ];
83c165b184SJames Collins
84c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
85c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
86c165b184SJames Collins        }
87c165b184SJames Collins    }
88c165b184SJames Collins
89c165b184SJames Collins
90c165b184SJames Collins    /**
91ab45ba71SJames Collins     * Meta handler hook for DokuWiki
92c165b184SJames Collins     *
939cff245bSJames Collins     * @param   \Doku_Event $event DokuWiki Event.
949cff245bSJames Collins     * @return  void
95c165b184SJames Collins     */
9610b40067Snomadjimbob    public function metaHeadersHandler(\Doku_Event $event)
9710b40067Snomadjimbob    {
98ab45ba71SJames Collins        global $MIKIO_ICONS;
99b5536b07SChris MacMackin        global $conf;
100ab45ba71SJames Collins
101ad182e6dSnomadjimbob        global $MIKIO_TEMPLATE;
102ad182e6dSnomadjimbob        $MIKIO_TEMPLATE = '123';
103ad182e6dSnomadjimbob
1049cff245bSJames Collins        $this->includePage('theme', false, true);
105a8eebd82SJames Collins
1069cff245bSJames Collins        $stylesheets    = [];
1079cff245bSJames Collins        $scripts        = [];
108c165b184SJames Collins
1093a385f2cSJames Collins        if (empty($this->getConf('customTheme')) === false) {
1109cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) {
111a8eebd82SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less';
112a8eebd82SJames Collins            } else {
1139cff245bSJames Collins                if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) {
114ab45ba71SJames Collins                    $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css';
1152b4583abSJames Collins                }
116a8eebd82SJames Collins            }
1179cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) {
118ab45ba71SJames Collins                $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js';
119c165b184SJames Collins            }
120c165b184SJames Collins        }
121c165b184SJames Collins
1223a385f2cSJames Collins        if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) {
1239cff245bSJames Collins            $icons = [];
124ab45ba71SJames Collins            foreach ($MIKIO_ICONS as $icon) {
1259cff245bSJames Collins                if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) {
126ab45ba71SJames Collins                    $icons[] = $icon;
127c165b184SJames Collins
1283a385f2cSJames Collins                    if (empty($icon['css']) === false) {
1299cff245bSJames Collins                        if (strpos($icon['css'], '//') === false) {
130a8eebd82SJames Collins                            $stylesheets[] = $this->baseDir . 'icons/' . $icon['css'];
131ab45ba71SJames Collins                        } else {
132a8eebd82SJames Collins                            $stylesheets[] = $icon['css'];
133ab45ba71SJames Collins                        }
134ab45ba71SJames Collins                    }
135ab45ba71SJames Collins                }
136ab45ba71SJames Collins            }
137ab45ba71SJames Collins            $MIKIO_ICONS = $icons;
138ab45ba71SJames Collins        } else {
139ab45ba71SJames Collins            $MIKIO_ICONS = [];
140ab45ba71SJames Collins        }
141c165b184SJames Collins
1427864545bSChris MacMackin        $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js';
143ab45ba71SJames Collins        $scripts[] = $this->baseDir . 'assets/mikio.js';
144644fd9f9SJames Collins
1459cff245bSJames Collins        if ($this->getConf('useLESS') === true) {
146ab45ba71SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.less';
147644fd9f9SJames Collins        } else {
148644fd9f9SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.css';
149644fd9f9SJames Collins        }
150644fd9f9SJames Collins
151ad182e6dSnomadjimbob        /* MikioPlugin Support */
1529ffe9161Snomadjimbob        if (plugin_load('action', 'mikioplugin') !== null) {
153ad182e6dSnomadjimbob            if ($this->getConf('useLESS') === true) {
154ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.less';
155ad182e6dSnomadjimbob            } else {
156ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.css';
157ad182e6dSnomadjimbob            }
158ad182e6dSnomadjimbob        }
159ab45ba71SJames Collins
160ab45ba71SJames Collins        $set = [];
161c165b184SJames Collins        foreach ($stylesheets as $style) {
1629cff245bSJames Collins            if (in_array($style, $set) === false) {
1633a385f2cSJames Collins                if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) {
164ab45ba71SJames Collins                    $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style);
165ab45ba71SJames Collins                }
166ab45ba71SJames Collins
1679cff245bSJames Collins                array_unshift($event->data['link'], [
168c165b184SJames Collins                    'type' => 'text/css',
169c165b184SJames Collins                    'rel'  => 'stylesheet',
170c165b184SJames Collins                    'href' => $style
1719cff245bSJames Collins                ]);
172c165b184SJames Collins            }
173ab45ba71SJames Collins            $set[] = $style;
174ab45ba71SJames Collins        }
175c165b184SJames Collins
176ab45ba71SJames Collins        $set = [];
177c165b184SJames Collins        foreach ($scripts as $script) {
1789cff245bSJames Collins            if (in_array($script, $set) === false) {
1799cff245bSJames Collins                $script_params = [
180c165b184SJames Collins                    'type'  => 'text/javascript',
181c165b184SJames Collins                    '_data' => '',
1828395cdcbSChris MacMackin                    'src'   => $script
1839cff245bSJames Collins                ];
184c1ecb866SJames Collins
185c1ecb866SJames Collins                // equal to or greator than hogfather
186c1ecb866SJames Collins                if ($this->dwVersionNumber() >= 20200729) {
187c1ecb866SJames Collins                    // greator than hogfather - defer always on
188c1ecb866SJames Collins                    if ($this->dwVersionNumber() >= 20200729) {
189c1ecb866SJames Collins                        $script_params += ['defer' => 'defer'];
190c1ecb866SJames Collins                    } else {
191c1ecb866SJames Collins                        // hogfather - defer always on unless $conf['defer_js'] is false
1929cff245bSJames Collins                        if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) {
1938395cdcbSChris MacMackin                            $script_params += ['defer' => 'defer'];
1948395cdcbSChris MacMackin                        }
195c1ecb866SJames Collins                    }
196c1ecb866SJames Collins                }
197c1ecb866SJames Collins
1988395cdcbSChris MacMackin                $event->data['script'][] = $script_params;
1999cff245bSJames Collins            }//end if
200ab45ba71SJames Collins            $set[] = $script;
2019cff245bSJames Collins        }//end foreach
202c165b184SJames Collins    }
203c165b184SJames Collins
204c165b184SJames Collins
205c165b184SJames Collins    /**
206a8eebd82SJames Collins     * Print or return the footer meta data
207c165b184SJames Collins     *
2089cff245bSJames Collins     * @param   boolean $print Print the data to buffer.
2099cff245bSJames Collins     * @return  string         HTML footer meta data
210c165b184SJames Collins     */
2119cff245bSJames Collins    public function includeFooterMeta(bool $print = true)
21210b40067Snomadjimbob    {
213a8eebd82SJames Collins        $html = '';
214a8eebd82SJames Collins
215a8eebd82SJames Collins        if (count($this->footerScript) > 0) {
216a8eebd82SJames Collins            $html .= '<script type="text/javascript">function mikioFooterRun() {';
217a8eebd82SJames Collins            foreach ($this->footerScript as $script) {
218a8eebd82SJames Collins                $html .= $script . ';';
219a8eebd82SJames Collins            }
220a8eebd82SJames Collins            $html .= '}</script>';
221a8eebd82SJames Collins        }
222c165b184SJames Collins
223c165b184SJames Collins
2249cff245bSJames Collins        if ($print === true) {
2259cff245bSJames Collins            echo $html;
2269cff245bSJames Collins        }
227a8eebd82SJames Collins        return $html;
228a8eebd82SJames Collins    }
229a8eebd82SJames Collins
23095372bffSJames Collins
23195372bffSJames Collins    // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing
23295372bffSJames Collins
23395372bffSJames Collins
234a8eebd82SJames Collins    /**
235ab45ba71SJames Collins     * Retreive and parse theme configuration options
236c165b184SJames Collins     *
2379cff245bSJames Collins     * @param   string $key     The configuration key to retreive.
2389cff245bSJames Collins     * @param   mixed  $default If key doesn't exist, return this value.
239ab45ba71SJames Collins     * @return  mixed           parsed value of configuration
240c165b184SJames Collins     */
24195372bffSJames Collins    public function getConf(string $key, $default = false)
24210b40067Snomadjimbob    {
243c165b184SJames Collins        $value = tpl_getConf($key, $default);
244c165b184SJames Collins
2453a385f2cSJames Collins        $data = [
2463a385f2cSJames Collins            ['keys' => ['navbarDWMenuType'],                'type' => 'choice',
2473a385f2cSJames Collins                'values' => ['both', 'icons', 'text']
2483a385f2cSJames Collins            ],
2493a385f2cSJames Collins            ['keys' => ['navbarDWMenuCombine'],             'type' => 'choice',
2503a385f2cSJames Collins                'values' => ['combine', 'seperate', 'dropdown']
2513a385f2cSJames Collins            ],
2523a385f2cSJames Collins            ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'],
2533a385f2cSJames Collins                'type' => 'choice',
2543a385f2cSJames Collins                'values' => ['none', 'custom', 'search', 'dokuwiki'],
2553a385f2cSJames Collins                'default' => [
2563a385f2cSJames Collins                    'navbarPosLeft' => 'none',
2573a385f2cSJames Collins                    'navbarPosMiddle' => 'search',
2583a385f2cSJames Collins                    'navbarPosRight' => 'dokuwiki'
2593a385f2cSJames Collins                ]
2603a385f2cSJames Collins            ],
2613a385f2cSJames Collins            ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink',
2623a385f2cSJames Collins                'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile',
2633a385f2cSJames Collins                'navbarItemShowAdmin'
2643a385f2cSJames Collins            ],
2653a385f2cSJames Collins                'type' => 'choice',
2663a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2673a385f2cSJames Collins            ],
2683a385f2cSJames Collins            ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'],
2693a385f2cSJames Collins                'type' => 'choice',
2703a385f2cSJames Collins                'values' => ['always', 'never']
2713a385f2cSJames Collins            ],
2723a385f2cSJames Collins            ['keys' => ['searchButton'],                    'type' => 'choice',
2733a385f2cSJames Collins                'values' => ['icon', 'text']
2743a385f2cSJames Collins            ],
2753a385f2cSJames Collins            ['keys' => ['breadcrumbPosition', 'youareherePosition'],
2763a385f2cSJames Collins                'type' => 'choice',
2773a385f2cSJames Collins                'values' => ['top', 'hero', 'page', 'none']
2783a385f2cSJames Collins            ],
2793a385f2cSJames Collins            ['keys' => ['youarehereHome'],                  'type' => 'choice',
2803a385f2cSJames Collins                'values' => ['page title', 'home', 'icon', 'none']
2813a385f2cSJames Collins            ],
2823a385f2cSJames Collins            ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'],
2833a385f2cSJames Collins                'type' => 'choice',
2843a385f2cSJames Collins                'values' => ['none', 'logged in user', 'search', 'content', 'tags'],
2853a385f2cSJames Collins                'default' => [
2863a385f2cSJames Collins                    'sidebarLeftRow1' => 'logged in user',
2873a385f2cSJames Collins                    'sidebarLeftRow2' => 'search',
2883a385f2cSJames Collins                    'sidebarLeftRow3' => 'content'
2893a385f2cSJames Collins                ]
2903a385f2cSJames Collins            ],
2913a385f2cSJames Collins            ['keys' => ['pageToolsFloating', 'pageToolsFooter'],
2923a385f2cSJames Collins                'type' => 'choice',
2933a385f2cSJames Collins                'values' => ['always', 'none', 'page editors']
2943a385f2cSJames Collins            ],
2953a385f2cSJames Collins            ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink',
2963a385f2cSJames Collins                'pageToolsShowTop'
2973a385f2cSJames Collins            ],
2983a385f2cSJames Collins                'type' => 'choice',
2993a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
3003a385f2cSJames Collins            ],
3013a385f2cSJames Collins            ['keys' => ['showNotifications'],               'type' => 'choice',
3023a385f2cSJames Collins                'values' => ['admin', 'always', 'none']
3033a385f2cSJames Collins            ],
3043a385f2cSJames Collins            ['keys' => ['licenseType'],                     'type' => 'choice',
3053a385f2cSJames Collins                'values' => ['badge', 'button', 'none']
3063a385f2cSJames Collins            ],
3073a385f2cSJames Collins            ['keys' => ['navbarUseTitleIcon'],              'type' => 'bool'],
3083a385f2cSJames Collins            ['keys' => ['navbarUseTitleText'],              'type' => 'bool'],
3093a385f2cSJames Collins            ['keys' => ['navbarUseTaglineText'],            'type' => 'bool'],
3103a385f2cSJames Collins            ['keys' => ['navbarShowSub'],                   'type' => 'bool'],
3113a385f2cSJames Collins            ['keys' => ['heroTitle'],                       'type' => 'bool'],
3123a385f2cSJames Collins            ['keys' => ['heroImagePropagation'],            'type' => 'bool'],
3133a385f2cSJames Collins            ['keys' => ['breadcrumbPrefix'],                'type' => 'bool'],
3143a385f2cSJames Collins            ['keys' => ['breadcrumbSep'],                   'type' => 'bool'],
3153a385f2cSJames Collins            ['keys' => ['youareherePrefix'],                'type' => 'bool'],
3163a385f2cSJames Collins            ['keys' => ['youarehereSep'],                   'type' => 'bool'],
3173a385f2cSJames Collins            ['keys' => ['sidebarShowLeft'],                 'type' => 'bool'],
3183a385f2cSJames Collins            ['keys' => ['sidebarShowRight'],                'type' => 'bool'],
3193a385f2cSJames Collins            ['keys' => ['tocFull'],                         'type' => 'bool'],
3203a385f2cSJames Collins            ['keys' => ['footerSearch'],                    'type' => 'bool'],
3213a385f2cSJames Collins            ['keys' => ['licenseImageOnly'],                'type' => 'bool'],
3223a385f2cSJames Collins            ['keys' => ['includePageUseACL'],               'type' => 'bool'],
3233a385f2cSJames Collins            ['keys' => ['includePagePropagate'],            'type' => 'bool'],
3243a385f2cSJames Collins            ['keys' => ['youarehereHideHome'],              'type' => 'bool'],
3253a385f2cSJames Collins            ['keys' => ['tagsConsolidate'],                 'type' => 'bool'],
3263a385f2cSJames Collins            ['keys' => ['footerInPage'],                    'type' => 'bool'],
3273a385f2cSJames Collins            ['keys' => ['sidebarMobileDefaultCollapse'],    'type' => 'bool'],
3283a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowLeft'],           'type' => 'bool'],
3293a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowRight'],          'type' => 'bool'],
3303a385f2cSJames Collins            ['keys' => ['searchUseTypeahead'],              'type' => 'bool'],
33112030b10SJames Collins            ['keys' => ['showLightDark'],                   'type' => 'bool'],
33234d5f19aSJames Collins            ['keys' => ['autoLightDark'],                   'type' => 'bool'],
3333a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
3343a385f2cSJames Collins
3353a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
3363a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
3373a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
3383a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
3393a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
3403a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
3413a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
3423a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
3433a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
3443a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
3453a385f2cSJames Collins
3463a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
3473a385f2cSJames Collins        ];
3483a385f2cSJames Collins
3493a385f2cSJames Collins        foreach ($data as $row) {
3503a385f2cSJames Collins            // does not check case....
3513a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
35295372bffSJames Collins                if (array_key_exists('type', $row) === true) {
3533a385f2cSJames Collins                    switch ($row['type']) {
3543a385f2cSJames Collins                        case 'bool':
3553a385f2cSJames Collins                            return (bool) $value;
3563a385f2cSJames Collins                        case 'int':
3573a385f2cSJames Collins                            return (int) $value;
3583a385f2cSJames Collins                        case 'string':
3593a385f2cSJames Collins                            return $value;
3603a385f2cSJames Collins                        case 'less':
36129118ed7SJames Collins                            $value = (bool) $value;
362a8df40efSJames Collins                            $lessAvailable = true;
363a8df40efSJames Collins
364a8df40efSJames Collins                            // check for less library
365a8df40efSJames Collins                            $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
3669cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
367a8df40efSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3689cff245bSJames Collins                            }
3699cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
370a8df40efSJames Collins                                $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3719cff245bSJames Collins                            }
3729cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
3739cff245bSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] .
3749cff245bSJames Collins                                    '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3759cff245bSJames Collins                            }
3769cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
377a8df40efSJames Collins                                $lessAvailable = false;
378a8df40efSJames Collins                            }
379a8df40efSJames Collins
380a8df40efSJames Collins                            // check for ctype extensions
3819cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
382a8df40efSJames Collins                                $lessAvailable = false;
383a8df40efSJames Collins                            }
384a8df40efSJames Collins
3859cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
386a8df40efSJames Collins                                $this->lessIgnored = true;
38729118ed7SJames Collins                                $value = false;
38829118ed7SJames Collins                            }
3893a385f2cSJames Collins
3903a385f2cSJames Collins                            return $value;
3919cff245bSJames Collins                    }//end switch
3923a385f2cSJames Collins                }//end if
3933a385f2cSJames Collins
3943a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
3953a385f2cSJames Collins                    return $value;
3963a385f2cSJames Collins                }
3973a385f2cSJames Collins
3983a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
3993a385f2cSJames Collins                    if (is_array($row['default']) === true) {
4003a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
4013a385f2cSJames Collins                            return $row['default'][$key];
4023a385f2cSJames Collins                        }
4033a385f2cSJames Collins                    } else {
4043a385f2cSJames Collins                        return $row['default'];
4053a385f2cSJames Collins                    }
4063a385f2cSJames Collins                }
4073a385f2cSJames Collins
4083a385f2cSJames Collins                return reset($row['values']);
4093a385f2cSJames Collins            }//end if
4103a385f2cSJames Collins        }//end foreach
411c165b184SJames Collins
412c165b184SJames Collins        return $value;
413c165b184SJames Collins    }
414c165b184SJames Collins
415c165b184SJames Collins
41695372bffSJames Collins    // phpcs:enable
41795372bffSJames Collins
41895372bffSJames Collins
419c165b184SJames Collins    /**
420a8eebd82SJames Collins     * Check if a page exist in directory or namespace
421c165b184SJames Collins     *
4229cff245bSJames Collins     * @param   string $page Page/namespace to search.
423a8eebd82SJames Collins     * @return  boolean      if page exists
424c165b184SJames Collins     */
4259cff245bSJames Collins    public function pageExists(string $page)
42610b40067Snomadjimbob    {
427ab45ba71SJames Collins        ob_start();
428a8eebd82SJames Collins        tpl_includeFile($page . '.html');
429ab45ba71SJames Collins        $html = ob_get_contents();
430ab45ba71SJames Collins        ob_end_clean();
431a8eebd82SJames Collins
4323a385f2cSJames Collins        if (empty($html) === false) {
4339cff245bSJames Collins            return true;
4349cff245bSJames Collins        }
435a8eebd82SJames Collins
436a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
437a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
438a8eebd82SJames Collins
4399cff245bSJames Collins        if ($propagate === true) {
4409cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4419cff245bSJames Collins                return true;
4429cff245bSJames Collins            }
4439cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4449cff245bSJames Collins            return true;
445ab45ba71SJames Collins        }
446ab45ba71SJames Collins
4479cff245bSJames Collins        return false;
448ab45ba71SJames Collins    }
449ab45ba71SJames Collins
450a8eebd82SJames Collins
451c165b184SJames Collins    /**
452a8eebd82SJames Collins     * Print or return page from directory or namespace
4532b4583abSJames Collins     *
4549cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4559cff245bSJames Collins     * @param   boolean $print        Print content.
4569cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4579cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
458ab45ba71SJames Collins     * @return  string                contents of page found
4592b4583abSJames Collins     */
4609cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4612b4583abSJames Collins    {
462a8eebd82SJames Collins        ob_start();
463a8eebd82SJames Collins        tpl_includeFile($page . '.html');
464a8eebd82SJames Collins        $html = ob_get_contents();
465a8eebd82SJames Collins        ob_end_clean();
466a8eebd82SJames Collins
4673a385f2cSJames Collins        if (empty($html) === true) {
468a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
469a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
470ab45ba71SJames Collins            $html = '';
4712b4583abSJames Collins
472ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
473ab45ba71SJames Collins        }
4742b4583abSJames Collins
4753a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
476ab45ba71SJames Collins            $html = $this->parseContent($html);
477ab45ba71SJames Collins        }
4782b4583abSJames Collins
4793a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
4809cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
4819cff245bSJames Collins        }
4822b4583abSJames Collins
4839cff245bSJames Collins        if ($print === true) {
4849cff245bSJames Collins            echo $html;
4859cff245bSJames Collins        }
486ab45ba71SJames Collins        return $html;
4872b4583abSJames Collins    }
4882b4583abSJames Collins
489a8eebd82SJames Collins
490a8eebd82SJames Collins    /**
491a8eebd82SJames Collins     * Print or return logged in user information
492a8eebd82SJames Collins     *
4939cff245bSJames Collins     * @param   boolean $print Print content.
494a8eebd82SJames Collins     * @return  string         user information
495a8eebd82SJames Collins     */
4969cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
49710b40067Snomadjimbob    {
498a8eebd82SJames Collins        $html = '';
499a8eebd82SJames Collins
5009cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
501a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
502a8eebd82SJames Collins            ob_start();
503a8eebd82SJames Collins            tpl_userinfo();
504a8eebd82SJames Collins            $html .= ob_get_contents();
505a8eebd82SJames Collins            ob_end_clean();
506a8eebd82SJames Collins            $html .= '</div>';
5072b4583abSJames Collins        }
508a8eebd82SJames Collins
5099cff245bSJames Collins        if ($print === true) {
5109cff245bSJames Collins            echo $html;
5119cff245bSJames Collins        }
512a8eebd82SJames Collins        return $html;
5132b4583abSJames Collins    }
5142b4583abSJames Collins
5152b4583abSJames Collins
516a8eebd82SJames Collins    /**
517a8eebd82SJames Collins     * Print or return DokuWiki Menu
518a8eebd82SJames Collins     *
5199cff245bSJames Collins     * @param   boolean $print Print content.
520a8eebd82SJames Collins     * @return  string         contents of the menu
521a8eebd82SJames Collins     */
5229cff245bSJames Collins    public function includeDWMenu(bool $print = true)
52310b40067Snomadjimbob    {
5242b4583abSJames Collins        global $lang;
5252b4583abSJames Collins        global $USERINFO;
526c165b184SJames Collins
5279cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
528a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5292b4583abSJames Collins
530ab45ba71SJames Collins        $pageToolsMenu = [];
531ab45ba71SJames Collins        $siteToolsMenu = [];
532ab45ba71SJames Collins        $userToolsMenu = [];
533c165b184SJames Collins
534ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
535ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
536ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5372b4583abSJames Collins
5382b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5392b4583abSJames Collins        foreach ($items as $item) {
5409cff245bSJames Collins            if ($item->getType() !== 'top') {
541ab45ba71SJames Collins                $itemHtml = '';
5422b4583abSJames Collins
543905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5449cff245bSJames Collins                if (
5453a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5463a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5473a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5489cff245bSJames Collins                ) {
5499cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5509cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5519cff245bSJames Collins                    if ($showIcons === true) {
5529cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5539cff245bSJames Collins                    }
5549cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5559cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5569cff245bSJames Collins                    }
557ab45ba71SJames Collins                    $itemHtml .= '</a>';
558ab45ba71SJames Collins
559ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5602b4583abSJames Collins                }
5619cff245bSJames Collins            }//end if
5629cff245bSJames Collins        }//end foreach
5632b4583abSJames Collins
564ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
565ab45ba71SJames Collins        foreach ($items as $item) {
566ab45ba71SJames Collins            $itemHtml = '';
5672b4583abSJames Collins
568905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5699cff245bSJames Collins            if (
5703a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5713a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5723a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5739cff245bSJames Collins            ) {
5749cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5759cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5769cff245bSJames Collins                if ($showIcons === true) {
5779cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5789cff245bSJames Collins                }
5799cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5809cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5819cff245bSJames Collins                }
582ab45ba71SJames Collins                $itemHtml .= '</a>';
5832b4583abSJames Collins
584ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
5852b4583abSJames Collins            }
5869cff245bSJames Collins        }//end foreach
5872b4583abSJames Collins
588ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
589ab45ba71SJames Collins        foreach ($items as $item) {
590ab45ba71SJames Collins            $itemHtml = '';
591ab45ba71SJames Collins
592905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5939cff245bSJames Collins            if (
5943a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5953a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5963a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5979cff245bSJames Collins            ) {
5989cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
5999cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
6009cff245bSJames Collins                if ($showIcons === true) {
6019cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6029cff245bSJames Collins                }
6039cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6049cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6059cff245bSJames Collins                }
606ab45ba71SJames Collins                $itemHtml .= '</a>';
607ab45ba71SJames Collins
608ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
609ab45ba71SJames Collins            }
6109cff245bSJames Collins        }//end foreach
611ab45ba71SJames Collins
612ab45ba71SJames Collins
613ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
614ab45ba71SJames Collins            case 'dropdown':
615ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6169cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6179cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6189cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6199cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6209cff245bSJames Collins                '</span>') . '</a>';
621a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
622ab45ba71SJames Collins
623ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
624ab45ba71SJames Collins                    $html .= $item;
625ab45ba71SJames Collins                }
626ab45ba71SJames Collins
627ab45ba71SJames Collins                $html .= '</div>';
628ab45ba71SJames Collins                $html .= '</li>';
629ab45ba71SJames Collins
630a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6319cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6329cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6339cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6349cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6359cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
636a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
637ab45ba71SJames Collins
638ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
639ab45ba71SJames Collins                    $html .= $item;
640ab45ba71SJames Collins                }
641ab45ba71SJames Collins
642ab45ba71SJames Collins                $html .= '</div>';
643ab45ba71SJames Collins                $html .= '</li>';
644ab45ba71SJames Collins
645a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6469cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6479cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6489cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6499cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6509cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
651a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
652ab45ba71SJames Collins
653ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
654ab45ba71SJames Collins                    $html .= $item;
655ab45ba71SJames Collins                }
656ab45ba71SJames Collins
657ab45ba71SJames Collins                $html .= '</div>';
658ab45ba71SJames Collins                $html .= '</li>';
659ab45ba71SJames Collins
660ab45ba71SJames Collins                break;
661ab45ba71SJames Collins
662ab45ba71SJames Collins            case 'combine':
663ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6649cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6659cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6669cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6679cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
668a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
669ab45ba71SJames Collins
670ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
671ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
672ab45ba71SJames Collins                    $html .= $item;
673ab45ba71SJames Collins                }
674ab45ba71SJames Collins
675ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
676ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
677ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
678ab45ba71SJames Collins                    $html .= $item;
679ab45ba71SJames Collins                }
680ab45ba71SJames Collins
681ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
682ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
683ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
684ab45ba71SJames Collins                    $html .= $item;
685ab45ba71SJames Collins                }
686ab45ba71SJames Collins
687ab45ba71SJames Collins                $html .= '</div>';
688ab45ba71SJames Collins                $html .= '</li>';
689ab45ba71SJames Collins                break;
690ab45ba71SJames Collins
691ab45ba71SJames Collins            default:    // seperate
692ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
693a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
694ab45ba71SJames Collins                }
695ab45ba71SJames Collins
696ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
697a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
698a8eebd82SJames Collins                }
699a8eebd82SJames Collins
700a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
701a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
702ab45ba71SJames Collins                }
703ab45ba71SJames Collins
704ab45ba71SJames Collins                break;
7059cff245bSJames Collins        }//end switch
706ab45ba71SJames Collins
707*3a3ece10SJames Collins        $translation = plugin_load('helper', 'translation');
708*3a3ece10SJames Collins        if ($translation !== null) {
709*3a3ece10SJames Collins            $html .= '<li id="mikio__translate" class="mikio-nav-dropdown">';
710*3a3ece10SJames Collins            $html .= '<a id="mikio_dropdown_translate" class="nav-link dropdown-toggle" href="#" role="button"
711*3a3ece10SJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
712*3a3ece10SJames Collins                $this->mikioInlineIcon('language') .
713*3a3ece10SJames Collins                 '</a>';
714*3a3ece10SJames Collins            $html .= '<div class="mikio-dropdown closed">';
715*3a3ece10SJames Collins
716*3a3ece10SJames Collins                $html .= $translation->showTranslations();
717*3a3ece10SJames Collins
718*3a3ece10SJames Collins            $html .= '</div>';
719*3a3ece10SJames Collins            $html .= '</li>';
720*3a3ece10SJames Collins        }
721*3a3ece10SJames Collins
72212030b10SJames Collins        if ($this->getConf('showLightDark') === true) {
723d0fba6d1SJames Collins            $autoLightDark = $this->getConf('autoLightDark');
7249e41d878SJames Collins            $html .= '<li class="mikio-darklight">
7259e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' .
726d0fba6d1SJames Collins            ($autoLightDark === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') .
7279e41d878SJames Collins            $this->mikioInlineIcon('sun', 'mikio-darklight-light') .
7289e41d878SJames Collins            $this->mikioInlineIcon('moon', 'mikio-darklight-dark') .
7299e41d878SJames Collins            '</a></li>';
73012030b10SJames Collins        }
73112030b10SJames Collins
732ab45ba71SJames Collins        $html .= '</ul>';
733ab45ba71SJames Collins
7349cff245bSJames Collins        if ($print === true) {
7359cff245bSJames Collins            echo $html;
7369cff245bSJames Collins        }
737a8eebd82SJames Collins        return $html;
738a8eebd82SJames Collins    }
739a8eebd82SJames Collins
740a8eebd82SJames Collins
741a8eebd82SJames Collins    /**
742a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
743a8eebd82SJames Collins     *
7449cff245bSJames Collins     * @param string $str String to generate nav.
745a8eebd82SJames Collins     * @return string     nav elements generated
746a8eebd82SJames Collins     */
7479cff245bSJames Collins    public function stringToNav(string $str)
74810b40067Snomadjimbob    {
749a8eebd82SJames Collins        $html = '';
750a8eebd82SJames Collins
7513a385f2cSJames Collins        if (empty($str) === false) {
752a8eebd82SJames Collins            $items = explode(';', $str);
753a8eebd82SJames Collins            if (count($items) > 0) {
754a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
755a8eebd82SJames Collins                foreach ($items as $item) {
756a8eebd82SJames Collins                    $parts = explode('|', $item);
757a8eebd82SJames Collins                    if ($parts > 1) {
7589cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7599cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7609cff245bSJames Collins                            '</a></li>';
761a8eebd82SJames Collins                    }
762a8eebd82SJames Collins                }
763a8eebd82SJames Collins                $html .= '</ul>';
764a8eebd82SJames Collins            }
7652b4583abSJames Collins        }
7662b4583abSJames Collins
767ab45ba71SJames Collins        return $html;
7682b4583abSJames Collins    }
7692b4583abSJames Collins
770a8eebd82SJames Collins    /**
771ab45ba71SJames Collins     * print or return the main navbar
7722b4583abSJames Collins     *
7739cff245bSJames Collins     * @param boolean $print   Print the navbar.
7749cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
775ab45ba71SJames Collins     * @return string          generated content
7762b4583abSJames Collins     */
7779cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
77810b40067Snomadjimbob    {
779b39ad16dSJames Collins        global $conf, $USERINFO;
780d3d7d2b7SJames Collins
781d3d7d2b7SJames Collins        $homeUrl = wl();
782d3d7d2b7SJames Collins
7839cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
784d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
7853a385f2cSJames Collins            if (empty($p) === false) {
7869cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
787d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
788d3d7d2b7SJames Collins                }
789d3d7d2b7SJames Collins            }
790b39ad16dSJames Collins        } else {
7919cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
792b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
793b39ad16dSJames Collins                if (strlen($url) > 0) {
794b39ad16dSJames Collins                    $homeUrl = $url;
795d3d7d2b7SJames Collins                }
796b39ad16dSJames Collins            } else {
797b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
798b39ad16dSJames Collins                if (strlen($url) > 0) {
799b39ad16dSJames Collins                    $homeUrl = $url;
800b39ad16dSJames Collins                }
801b39ad16dSJames Collins            }
802b39ad16dSJames Collins        }
803d3d7d2b7SJames Collins
804ab45ba71SJames Collins        $html = '';
80547161538SJames Collins
8069cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
8079cff245bSJames Collins            '">';
808f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
809d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
8109cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
811ab45ba71SJames Collins            // Brand image
8129cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
8139cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
8149cff245bSJames Collins                ;
8153a385f2cSJames Collins                if (empty($logo) === false) {
816f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
817f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
818f0241fc4SJames Collins                    $styles = '';
819f0241fc4SJames Collins
820f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
8219cff245bSJames Collins                        if (ctype_digit($width) === true) {
822f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
8239cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
824f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
8259cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
8267a92c19bSJames Collins                            $styles .= 'max-width:none;';
827f0241fc4SJames Collins                        }
828f0241fc4SJames Collins
8299cff245bSJames Collins                        if (ctype_digit($height) === true) {
830f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8319cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
832f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8339cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8347a92c19bSJames Collins                            $styles .= 'max-height:none;';
835f0241fc4SJames Collins                        }
836f0241fc4SJames Collins
837f0241fc4SJames Collins                        if (strlen($styles) > 0) {
838f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
839f0241fc4SJames Collins                        }
8409cff245bSJames Collins                    }//end if
841f0241fc4SJames Collins
842f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8439cff245bSJames Collins                }//end if
8449cff245bSJames Collins            }//end if
845ab45ba71SJames Collins
846ab45ba71SJames Collins            // Brand title
8479cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
848ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
849a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8509cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
851a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
852ab45ba71SJames Collins                }
853ab45ba71SJames Collins                $html .= '</div>';
854ab45ba71SJames Collins            }
8559cff245bSJames Collins        }//end if
856ab45ba71SJames Collins        $html .= '</a>';
857660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
858ab45ba71SJames Collins
859ab45ba71SJames Collins        // Menus
860ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
861ab45ba71SJames Collins
8629cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8639cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8649cff245bSJames Collins        ];
865a8eebd82SJames Collins        foreach ($menus as $menuType) {
866a8eebd82SJames Collins            switch ($menuType) {
867a8eebd82SJames Collins                case 'custom':
868a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
869a8eebd82SJames Collins                    break;
870a8eebd82SJames Collins                case 'search':
871ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
872ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
873ab45ba71SJames Collins                    $html .= '</div>';
874a8eebd82SJames Collins                    break;
875a8eebd82SJames Collins                case 'dokuwiki':
8769cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
877a8eebd82SJames Collins                    break;
878a8eebd82SJames Collins            }
879a8eebd82SJames Collins        }
880ab45ba71SJames Collins
881ab45ba71SJames Collins        $html .= '</div>';
882f8039bf2SJames Collins        $html .= '</div>';
883ab45ba71SJames Collins        $html .= '</nav>';
884ab45ba71SJames Collins
885a8eebd82SJames Collins        // Sub Navbar
8869cff245bSJames Collins        if ($showSub === true) {
8879cff245bSJames Collins            $sub = $this->includePage('submenu', false);
8883a385f2cSJames Collins            if (empty($sub) === false) {
8899cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
8909cff245bSJames Collins            }
891ab45ba71SJames Collins        }
892ab45ba71SJames Collins
8939cff245bSJames Collins        if ($print === true) {
8949cff245bSJames Collins            echo $html;
8959cff245bSJames Collins        }
896ab45ba71SJames Collins        return $html;
897ab45ba71SJames Collins    }
898ab45ba71SJames Collins
899ab45ba71SJames Collins
900a8eebd82SJames Collins    /**
901a8eebd82SJames Collins     * Is there a sidebar
902a8eebd82SJames Collins     *
9039cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
904a8eebd82SJames Collins     * @return  boolean        if sidebar exists
905a8eebd82SJames Collins     */
9069cff245bSJames Collins    public function sidebarExists(string $prefix = '')
90710b40067Snomadjimbob    {
908a8eebd82SJames Collins        global $conf;
909a8eebd82SJames Collins
9103a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9119cff245bSJames Collins            $prefix = '';
9129cff245bSJames Collins        }
913a8eebd82SJames Collins
914a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
915a8eebd82SJames Collins    }
916a8eebd82SJames Collins
917a8eebd82SJames Collins
918a8eebd82SJames Collins    /**
919ab45ba71SJames Collins     * Print or return the sidebar content
920ab45ba71SJames Collins     *
9219cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
9229cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
9239cff245bSJames Collins     * @param   boolean $parse  Parse the content.
924ab45ba71SJames Collins     * @return  string          generated content
925ab45ba71SJames Collins     */
9269cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
92710b40067Snomadjimbob    {
928ab45ba71SJames Collins        global $conf, $ID;
929ab45ba71SJames Collins
930ab45ba71SJames Collins        $html = '';
931ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
932ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
933ab45ba71SJames Collins
9343a385f2cSJames Collins        if (empty($confPrefix) === true) {
9359cff245bSJames Collins            $confPrefix = 'Left';
9369cff245bSJames Collins        }
9371cdedf28SJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9389cff245bSJames Collins            $prefix = '';
9399cff245bSJames Collins        }
940ab45ba71SJames Collins
9411cdedf28SJames Collins        $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
942ab45ba71SJames Collins
9439cff245bSJames Collins        if (
9449cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9451cdedf28SJames Collins            p_get_metadata($ID, 'nosidebar', false) === null
9469cff245bSJames Collins        ) {
9479cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9483a385f2cSJames Collins            if (empty($content) === false) {
9499cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9509cff245bSJames Collins            }
951ab45ba71SJames Collins
9523a385f2cSJames Collins            if (empty($prefix) === true) {
9539cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9549cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9559cff245bSJames Collins                ];
956ab45ba71SJames Collins
957a8eebd82SJames Collins                foreach ($rows as $row) {
958a8eebd82SJames Collins                    switch ($row) {
959a8eebd82SJames Collins                        case 'search':
9609cff245bSJames Collins                            $html .= $this->includeSearch(false);
961a8eebd82SJames Collins                            break;
962a8eebd82SJames Collins                        case 'logged in user':
9639cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
964a8eebd82SJames Collins                            break;
965a8eebd82SJames Collins                        case 'content':
9669cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9673a385f2cSJames Collins                            if (empty($content) === false) {
9689cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9699cff245bSJames Collins                            }
970a8eebd82SJames Collins                            break;
971a8eebd82SJames Collins                        case 'tags':
972a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
973a8eebd82SJames Collins                    }
974a8eebd82SJames Collins                }
975a8eebd82SJames Collins            } else {
9769cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
9773a385f2cSJames Collins                if (empty($content) === false) {
9789cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9799cff245bSJames Collins                }
9809cff245bSJames Collins            }//end if
9819cff245bSJames Collins
9829cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
9833a385f2cSJames Collins            if (empty($content) === false) {
9849cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
9859cff245bSJames Collins            }
9869cff245bSJames Collins        }//end if
9879cff245bSJames Collins
9883a385f2cSJames Collins        if (empty($html) === true) {
9893a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
9909cff245bSJames Collins                $html = '&nbsp;';
9919cff245bSJames Collins            }
9929cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
9939cff245bSJames Collins                $html = '&nbsp;';
9949cff245bSJames Collins            }
995a8eebd82SJames Collins        }
996ab45ba71SJames Collins
9973a385f2cSJames Collins        if (empty($html) === false) {
9981cdedf28SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) .
9999cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
10009cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
10019cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
10029cff245bSJames Collins                $html . '</div></aside>';
1003ab45ba71SJames Collins        }
1004ab45ba71SJames Collins
10059cff245bSJames Collins        if ($parse === true) {
10069cff245bSJames Collins            $html = $this->includeIcons($html);
10073a04a100SJames Collins        }
10089cff245bSJames Collins        if ($print === true) {
10099cff245bSJames Collins            echo $html;
1010ab45ba71SJames Collins        }
1011ab45ba71SJames Collins        return $html;
1012ab45ba71SJames Collins    }
1013ab45ba71SJames Collins
1014ab45ba71SJames Collins
1015a8eebd82SJames Collins    /**
1016ab45ba71SJames Collins     * Print or return the page tools content
1017ab45ba71SJames Collins     *
10189cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
10199cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
1020ab45ba71SJames Collins     * @return  string             generated content
1021ab45ba71SJames Collins     */
10229cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
102310b40067Snomadjimbob    {
10241293ce10SJames Collins        global $USERINFO;
10251293ce10SJames Collins
10269cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
1027ab45ba71SJames Collins        $html = '';
1028ab45ba71SJames Collins
10299cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
1030b9c0582bSJames Collins        $html .= '<ul class="tools">';
1031ab45ba71SJames Collins
1032ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1033ab45ba71SJames Collins        foreach ($items as $item) {
10349cff245bSJames Collins            $classes = [];
10353fd763a0SJames Collins            $classes[] = $item->getType();
10363fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10373fd763a0SJames Collins
10389cff245bSJames Collins            if (empty($attr['class']) === false) {
10393fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1040ab45ba71SJames Collins            }
1041ab45ba71SJames Collins
10423fd763a0SJames Collins            $classes = array_unique($classes);
10433fd763a0SJames Collins
10441293ce10SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()));
10459cff245bSJames Collins            if (
10463a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10473a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10483a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10499cff245bSJames Collins            ) {
10503fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10519cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10529cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10539cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10543fd763a0SJames Collins                $html .= '</li>';
10553fd763a0SJames Collins            }
10569cff245bSJames Collins        }//end foreach
10573fd763a0SJames Collins
10583fd763a0SJames Collins        $html .= '</ul>';
1059ab45ba71SJames Collins        $html .= '</nav>';
1060ab45ba71SJames Collins
10619cff245bSJames Collins        if ($print === true) {
10629cff245bSJames Collins            echo $html;
10639cff245bSJames Collins        }
1064ab45ba71SJames Collins        return $html;
1065ab45ba71SJames Collins    }
1066ab45ba71SJames Collins
1067ab45ba71SJames Collins
1068a8eebd82SJames Collins    /**
1069a8eebd82SJames Collins     * Print or return the search bar
1070a8eebd82SJames Collins     *
10719cff245bSJames Collins     * @param   boolean $print Print content.
1072a8eebd82SJames Collins     * @return  string         contents of the search bar
1073a8eebd82SJames Collins     */
10749cff245bSJames Collins    public function includeSearch(bool $print = true)
107510b40067Snomadjimbob    {
10769cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1077ab45ba71SJames Collins        $html = '';
1078ab45ba71SJames Collins
10799cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
10809cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1081a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1082a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1083c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
10849cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1085c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1086c1cb9f15SChris MacMackin        }
10879cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
10883a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1089a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
10903a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1091a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1092ab45ba71SJames Collins        } else {
1093ab45ba71SJames Collins            $html .= $lang['btn_search'];
1094ab45ba71SJames Collins        }
1095ab45ba71SJames Collins        $html .= '</button>';
1096ab45ba71SJames Collins        $html .= '</form>';
1097ab45ba71SJames Collins
10989cff245bSJames Collins        if ($print === true) {
10999cff245bSJames Collins            echo $html;
11009cff245bSJames Collins        }
1101ab45ba71SJames Collins        return $html;
1102ab45ba71SJames Collins    }
1103ab45ba71SJames Collins
1104ab45ba71SJames Collins
1105a8eebd82SJames Collins    /**
1106a8eebd82SJames Collins     * Print or return content
1107a8eebd82SJames Collins     *
11089cff245bSJames Collins     * @param   boolean $print Print content.
1109a8eebd82SJames Collins     * @return  string         contents
1110a8eebd82SJames Collins     */
11119cff245bSJames Collins    public function includeContent(bool $print = true)
111210b40067Snomadjimbob    {
1113ab45ba71SJames Collins        ob_start();
11149cff245bSJames Collins        tpl_content(false);
1115ab45ba71SJames Collins        $html = ob_get_contents();
1116ab45ba71SJames Collins        ob_end_clean();
1117ab45ba71SJames Collins
1118ab45ba71SJames Collins        $html = $this->includeIcons($html);
1119ab45ba71SJames Collins        $html = $this->parseContent($html);
1120ab45ba71SJames Collins
1121ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1122ab45ba71SJames Collins
11239cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
11249cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
11259cff245bSJames Collins        }
1126a8eebd82SJames Collins
1127a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1128a8eebd82SJames Collins
11299cff245bSJames Collins        if ($print === true) {
11309cff245bSJames Collins            echo $html;
11319cff245bSJames Collins        }
1132ab45ba71SJames Collins        return $html;
1133ab45ba71SJames Collins    }
1134ab45ba71SJames Collins
1135a8eebd82SJames Collins    /**
1136ab45ba71SJames Collins     * Print or return footer
1137ab45ba71SJames Collins     *
11389cff245bSJames Collins     * @param   boolean $print Print footer.
11399cff245bSJames Collins     * @return  string         HTML string containing footer
1140ab45ba71SJames Collins     */
11419cff245bSJames Collins    public function includeFooter(bool $print = true)
114210b40067Snomadjimbob    {
1143ab45ba71SJames Collins        global $ACT;
1144ab45ba71SJames Collins
1145ab45ba71SJames Collins        $html = '';
1146ab45ba71SJames Collins
1147ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11489cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11499cff245bSJames Collins        $html .= $this->includePage('footer', false);
1150ab45ba71SJames Collins
1151a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1152ab45ba71SJames Collins
11539cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1154ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11559cff245bSJames Collins            $html .= $this->includeSearch(false);
1156ab45ba71SJames Collins            $html .= '</div>';
1157ab45ba71SJames Collins        }
1158ab45ba71SJames Collins
1159a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11609cff245bSJames Collins        if (
11613a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
11623a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11639cff245bSJames Collins        ) {
11649cff245bSJames Collins            $html .= $this->includePageTools(false);
11659cff245bSJames Collins        }
1166ab45ba71SJames Collins
11679cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11689cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1169ab45ba71SJames Collins
1170ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11719cff245bSJames Collins        if ($licenseType !== 'none') {
11729cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1173ab45ba71SJames Collins        }
1174ab45ba71SJames Collins
1175ab45ba71SJames Collins        $html .= '</footer>';
1176ab45ba71SJames Collins
11779cff245bSJames Collins        if ($print === true) {
11789cff245bSJames Collins            echo $html;
11799cff245bSJames Collins        }
1180ab45ba71SJames Collins        return $html;
1181ab45ba71SJames Collins    }
1182ab45ba71SJames Collins
1183ab45ba71SJames Collins
1184a8eebd82SJames Collins    /**
1185ab45ba71SJames Collins     * Print or return breadcrumb trail
1186ab45ba71SJames Collins     *
11879cff245bSJames Collins     * @param   boolean $print Print out trail.
11889cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
11899cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1190ab45ba71SJames Collins     */
11919cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
119210b40067Snomadjimbob    {
1193a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1194a8eebd82SJames Collins
11953a385f2cSJames Collins        if (
11963a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
119795372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
11983a385f2cSJames Collins        ) {
11999cff245bSJames Collins            return '';
12009cff245bSJames Collins        }
1201ab45ba71SJames Collins
1202ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1203f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
12043a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
120595372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
12069cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1207ab45ba71SJames Collins                    ob_start();
120875adba86SJames Collins                    tpl_breadcrumbs();
1209ab45ba71SJames Collins                    $html .= ob_get_contents();
1210ab45ba71SJames Collins                    ob_end_clean();
1211ab45ba71SJames Collins                } else {
1212ab45ba71SJames Collins                    $sep = '•';
1213ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1214ab45ba71SJames Collins
12159cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1216ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
12179cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1218ab45ba71SJames Collins
12199cff245bSJames Collins                        if ($img !== false) {
1220ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1221ab45ba71SJames Collins                        }
122247161538SJames Collins                    }
122347161538SJames Collins
12249cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1225ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
12269cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1227ab45ba71SJames Collins
12289cff245bSJames Collins                        if ($img !== false) {
1229ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1230ab45ba71SJames Collins                        }
1231ab45ba71SJames Collins                    }
1232ab45ba71SJames Collins
1233ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1234ab45ba71SJames Collins
1235ab45ba71SJames Collins                    $html .= '<ul>';
12363a385f2cSJames Collins                    if (empty($prefix) === false) {
12379cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12389cff245bSJames Collins                    }
1239ab45ba71SJames Collins
1240ab45ba71SJames Collins                    $last = count($crumbs);
1241ab45ba71SJames Collins                    $i    = 0;
1242ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1243ab45ba71SJames Collins                        $i++;
124495372bffSJames Collins                        if ($i !== 1) {
1245ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
124695372bffSJames Collins                        }
12479cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12489cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1249ab45ba71SJames Collins                        $html .= '</li>';
1250ab45ba71SJames Collins                    }
1251ab45ba71SJames Collins
1252ab45ba71SJames Collins                    $html .= '</ul>';
12539cff245bSJames Collins                }//end if
12549cff245bSJames Collins            }//end if
12559cff245bSJames Collins        }//end if
12563d11a778SJames Collins
12573d11a778SJames Collins        $html .= '</div>';
12583d11a778SJames Collins        $html .= '</div>';
12593d11a778SJames Collins
12609cff245bSJames Collins        if ($parse === true) {
12619cff245bSJames Collins            $html = $this->includeIcons($html);
12629cff245bSJames Collins        }
12639cff245bSJames Collins        if ($print === true) {
12649cff245bSJames Collins            echo $html;
12659cff245bSJames Collins        }
12663d11a778SJames Collins        return $html;
12673d11a778SJames Collins    }
12683d11a778SJames Collins
12693d11a778SJames Collins    /**
12703d11a778SJames Collins     * Print or return you are here trail
12713d11a778SJames Collins     *
12729cff245bSJames Collins     * @param   boolean $print Print out trail.
12739cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12749cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12753d11a778SJames Collins     */
12769cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12773d11a778SJames Collins    {
12783d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
12793d11a778SJames Collins
12803a385f2cSJames Collins        if (
12813a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
128295372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
12833a385f2cSJames Collins        ) {
12849cff245bSJames Collins            return '';
12859cff245bSJames Collins        }
12863d11a778SJames Collins
12873d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
12883d11a778SJames Collins        $html .= '<div class="mikio-container">';
12893a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
129095372bffSJames Collins            if ($conf['youarehere'] !== 0) {
12919cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
129295372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1293ab45ba71SJames Collins                    ob_start();
129475adba86SJames Collins                    tpl_youarehere();
1295ab45ba71SJames Collins                    $html .= ob_get_contents();
1296ab45ba71SJames Collins                    ob_end_clean();
129795372bffSJames Collins                    $html .= '</div>';
1298ab45ba71SJames Collins                } else {
1299ab45ba71SJames Collins                    $sep = ' » ';
1300ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1301ab45ba71SJames Collins
13029cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
13033d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
13049cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1305ab45ba71SJames Collins
13069cff245bSJames Collins                        if ($img !== false) {
1307ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1308ab45ba71SJames Collins                        }
130975adba86SJames Collins                    }
131075adba86SJames Collins
13119cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
13123d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
13139cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1314ab45ba71SJames Collins
13159cff245bSJames Collins                        if ($img !== false) {
1316ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
131775adba86SJames Collins                        }
131847161538SJames Collins                    }
131947161538SJames Collins
1320ab45ba71SJames Collins                    $html .= '<ul>';
13213a385f2cSJames Collins                    if (empty($prefix) === false) {
13229cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
13239cff245bSJames Collins                    }
13249cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1325ab45ba71SJames Collins
1326ab45ba71SJames Collins                    $parts = explode(':', $ID);
1327ab45ba71SJames Collins                    $count = count($parts);
1328ab45ba71SJames Collins
1329ab45ba71SJames Collins                    $part = '';
13309cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1331ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1332ab45ba71SJames Collins                        $page = $part;
13339cff245bSJames Collins                        if ($page === $conf['start']) {
13349cff245bSJames Collins                            continue;
13359cff245bSJames Collins                        }
1336ab45ba71SJames Collins
1337ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
13389cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1339ab45ba71SJames Collins                    }
1340ab45ba71SJames Collins
1341ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
13429cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1343ab45ba71SJames Collins                        $page = $part . $parts[$i];
13449cff245bSJames Collins                        if ($page !== $conf['start']) {
1345ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
13469cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1347ab45ba71SJames Collins                        }
1348ab45ba71SJames Collins                    }
1349ab45ba71SJames Collins
1350ab45ba71SJames Collins                    $html .= '</ul>';
13519cff245bSJames Collins                }//end if
13529cff245bSJames Collins            }//end if
1353ab45ba71SJames Collins
13543d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13559cff245bSJames Collins            if ($showLast !== 0) {
1356a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13579cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1358a8eebd82SJames Collins                    $count = count($matches[0]);
1359a8eebd82SJames Collins                    $list = '';
1360a8eebd82SJames Collins
1361a8eebd82SJames Collins                    // Show Home
1362a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1363a8eebd82SJames Collins
1364a8eebd82SJames Collins                    $list .= '<li>...</li>';
13659cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1366a8eebd82SJames Collins                        $list .= $matches[0][$i];
1367a8eebd82SJames Collins                    }
1368a8eebd82SJames Collins
1369a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1370a8eebd82SJames Collins                }
1371a8eebd82SJames Collins            }
1372a8eebd82SJames Collins
13733d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1374a8eebd82SJames Collins                case 'none':
1375a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1376a8eebd82SJames Collins                    break;
1377a8eebd82SJames Collins                case 'home':
1378a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1379a8eebd82SJames Collins                    break;
1380a8eebd82SJames Collins                case 'icon':
13819cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
13829cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1383a8eebd82SJames Collins                    break;
1384a8eebd82SJames Collins            }
1385a8eebd82SJames Collins        } else {
1386a8eebd82SJames Collins            $html .= '&#8810; ';
13879cff245bSJames Collins            if (isset($_GET['page']) === true) {
13889cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1389a8eebd82SJames Collins            }
13904057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
13919cff245bSJames Collins        }//end if
13929cff245bSJames Collins
13939cff245bSJames Collins        $html .= '</div>';
13949cff245bSJames Collins        $html .= '</div>';
13959cff245bSJames Collins
13969cff245bSJames Collins        if ($parse === true) {
13979cff245bSJames Collins            $html = $this->includeIcons($html);
1398a8eebd82SJames Collins        }
13999cff245bSJames Collins        if ($print === true) {
14009cff245bSJames Collins            echo $html;
14019cff245bSJames Collins        }
1402ab45ba71SJames Collins        return $html;
1403ab45ba71SJames Collins    }
1404ab45ba71SJames Collins
14051785fc73SJames Collins    /**
14061785fc73SJames Collins     * Get Page Title
14079cff245bSJames Collins     *
14089cff245bSJames Collins     * @return string page title
14091785fc73SJames Collins     */
141010b40067Snomadjimbob    public function parsePageTitle()
141110b40067Snomadjimbob    {
14122060e56cSJames Collins        global $ID;
14132060e56cSJames Collins
14142060e56cSJames Collins        $title = p_get_first_heading($ID);
14159cff245bSJames Collins        if (strlen($title) <= 0) {
14169cff245bSJames Collins            $title = tpl_pagetitle(null, true);
14179cff245bSJames Collins        }
14181785fc73SJames Collins        $title = $this->includeIcons($title);
14191785fc73SJames Collins
14201785fc73SJames Collins        return $title;
14211785fc73SJames Collins    }
14221785fc73SJames Collins
1423ab45ba71SJames Collins
142475adba86SJames Collins    /**
1425a8eebd82SJames Collins     * Print or return hero block
142675adba86SJames Collins     *
14279cff245bSJames Collins     * @param   boolean $print Print content.
1428a8eebd82SJames Collins     * @return  string         contents of hero
142975adba86SJames Collins     */
14309cff245bSJames Collins    public function includeHero(bool $print = true)
143110b40067Snomadjimbob    {
1432a8eebd82SJames Collins        $html = '';
143347161538SJames Collins
14349cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1435a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1436f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1437a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
14383a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
14399cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
14409cff245bSJames Collins            }
14413a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
14429cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
14439cff245bSJames Collins            }
1444ab45ba71SJames Collins
1445a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
14461785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1447a8eebd82SJames Collins            $html .= '</h1>';
1448a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1449a8eebd82SJames Collins            $html .= '</div>';
145047161538SJames Collins
14519cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1452a8eebd82SJames Collins            $hero_image_resize_class = '';
14533a385f2cSJames Collins            if (empty($hero_image) === false) {
1454a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1455a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
145647161538SJames Collins            }
1457a8eebd82SJames Collins
14589cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14599cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1460a8eebd82SJames Collins
1461a8eebd82SJames Collins            $html .= '</div>';
1462f8039bf2SJames Collins            $html .= '</div>';
14639cff245bSJames Collins        }//end if
14649cff245bSJames Collins
14659cff245bSJames Collins        if ($print === true) {
14669cff245bSJames Collins            echo $html;
146775adba86SJames Collins        }
1468a8eebd82SJames Collins
1469a8eebd82SJames Collins        return $html;
147075adba86SJames Collins    }
147175adba86SJames Collins
147275adba86SJames Collins
147375adba86SJames Collins    /**
1474a8eebd82SJames Collins     * Print or return out TOC
147575adba86SJames Collins     *
14769cff245bSJames Collins     * @param   boolean $print Print TOC.
14779cff245bSJames Collins     * @param   boolean $parse Parse icons.
1478a8eebd82SJames Collins     * @return  string         contents of TOC
147975adba86SJames Collins     */
14809cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
148110b40067Snomadjimbob    {
1482ab45ba71SJames Collins        $html = '';
14832b4583abSJames Collins
1484ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1485ab45ba71SJames Collins
14863a385f2cSJames Collins        if (empty($tocHtml) === false) {
1487f65a4e5eSJames Collins            $tocHtml = preg_replace(
1488f65a4e5eSJames Collins                '/(<h3.+?toggle.+?>)(.+?)<\/h3>/',
1489f65a4e5eSJames Collins                '$1' .
1490f65a4e5eSJames Collins                $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' .
1491f65a4e5eSJames Collins                $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>',
1492f65a4e5eSJames Collins                $tocHtml
1493f65a4e5eSJames Collins            );
1494ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1495a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1496ab45ba71SJames Collins
1497ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1498ab45ba71SJames Collins            $html .= $tocHtml;
1499ab45ba71SJames Collins            $html .= '</div>';
15002b4583abSJames Collins        }
15012b4583abSJames Collins
15029cff245bSJames Collins        if ($parse === true) {
15039cff245bSJames Collins            $html = $this->includeIcons($html);
15049cff245bSJames Collins        }
15059cff245bSJames Collins
15069cff245bSJames Collins        if ($print === true) {
1507ab45ba71SJames Collins            echo $html;
1508ab45ba71SJames Collins        }
1509ab45ba71SJames Collins
15109cff245bSJames Collins        return $html;
15119cff245bSJames Collins    }
15129cff245bSJames Collins
1513ab45ba71SJames Collins
1514a8eebd82SJames Collins    /**
1515ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1516ab45ba71SJames Collins     *
15179cff245bSJames Collins     * @param   string $str Content to parse.
1518ab45ba71SJames Collins     * @return  string      parsed string
1519ab45ba71SJames Collins     */
15209cff245bSJames Collins    public function includeIcons(string $str)
152110b40067Snomadjimbob    {
1522ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1523ab45ba71SJames Collins
1524ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
15253a385f2cSJames Collins        if (empty($iconTag) === true) {
15269cff245bSJames Collins            return $str;
15279cff245bSJames Collins        }
1528ab45ba71SJames Collins
15299cff245bSJames Collins        if (
15309cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
15313a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
15329cff245bSJames Collins        ) {
1533a2005a27SJames Collins            $content = $str;
1534a2005a27SJames Collins            $preview = null;
1535a2005a27SJames Collins
15363a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15379cff245bSJames Collins                $html = new \simple_html_dom();
1538a2005a27SJames Collins                $html->stripRNAttrValues = false;
1539a2005a27SJames Collins                $html->load($str, true, false);
1540a2005a27SJames Collins
1541a2005a27SJames Collins                $preview = $html->find('div.preview');
15429cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1543a2005a27SJames Collins                    $content = $preview[0]->innertext;
1544a2005a27SJames Collins                }
1545a2005a27SJames Collins            }
1546a2005a27SJames Collins
15471785fc73SJames Collins            $page_regex = '/(.*)/';
15489cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
15491785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
15501785fc73SJames Collins            }
15511785fc73SJames Collins
15521785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1553a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1554a2005a27SJames Collins
155510b40067Snomadjimbob                return preg_replace_callback(
155610b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1557ab45ba71SJames Collins                    function ($matches) {
1558ab45ba71SJames Collins                        global $MIKIO_ICONS;
1559ab45ba71SJames Collins
1560ab45ba71SJames Collins                        $s = $matches[0];
1561ab45ba71SJames Collins
1562ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1563ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1564ab45ba71SJames Collins
1565ab45ba71SJames Collins                            if (count($matches) > 1) {
1566ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1567ab45ba71SJames Collins
1568ab45ba71SJames Collins                                if (count($e) > 1) {
1569ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15709cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1571ab45ba71SJames Collins                                            $icon = $iconItem;
1572ab45ba71SJames Collins
1573ab45ba71SJames Collins                                            $s = $icon['insert'];
1574ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
15751cdedf28SJames Collins                                                if (count($e) < $i || empty($e[$i]) === true) {
15769cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1577ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1578ab45ba71SJames Collins                                                    }
1579ab45ba71SJames Collins                                                } else {
1580ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1581ab45ba71SJames Collins                                                }
1582ab45ba71SJames Collins                                            }
1583ab45ba71SJames Collins
1584ab45ba71SJames Collins                                            $dir = '';
15859cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
15869cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
15879cff245bSJames Collins                                            }
1588ab45ba71SJames Collins
1589ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1590ab45ba71SJames Collins
1591ab45ba71SJames Collins                                            break;
15929cff245bSJames Collins                                        }//end if
15939cff245bSJames Collins                                    }//end foreach
1594ab45ba71SJames Collins                                } else {
1595ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
15969cff245bSJames Collins                                }//end if
15979cff245bSJames Collins                            }//end if
15989cff245bSJames Collins                        }//end if
159975adba86SJames Collins
1600ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
16019cff245bSJames Collins                        if ($count === 0) {
1602ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1603ab45ba71SJames Collins                        }
1604ab45ba71SJames Collins
1605ab45ba71SJames Collins                        return $s;
1606ab45ba71SJames Collins                    },
160710b40067Snomadjimbob                    $icons[0]
160810b40067Snomadjimbob                );
1609a2005a27SJames Collins            }, $content);
1610a2005a27SJames Collins
16113a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
16129cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1613a2005a27SJames Collins                    $preview[0]->innertext = $content;
1614a2005a27SJames Collins                }
1615a2005a27SJames Collins
1616a2005a27SJames Collins                $str = $html->save();
1617a2005a27SJames Collins                $html->clear();
1618a2005a27SJames Collins                unset($html);
1619a2005a27SJames Collins            } else {
1620a2005a27SJames Collins                $str = $content;
1621a2005a27SJames Collins            }
16229cff245bSJames Collins        }//end if
1623ab45ba71SJames Collins
1624ab45ba71SJames Collins        return $str;
1625ab45ba71SJames Collins    }
162647161538SJames Collins
1627c165b184SJames Collins    /**
1628a8eebd82SJames Collins     * Parse HTML for theme
1629c165b184SJames Collins     *
16309cff245bSJames Collins     * @param   string $content HTML content to parse.
1631a8eebd82SJames Collins     * @return  string          Parsed content
1632c165b184SJames Collins     */
16339cff245bSJames Collins    public function parseContent(string $content)
163410b40067Snomadjimbob    {
1635ab45ba71SJames Collins        global $INPUT, $ACT;
1636ab45ba71SJames Collins
1637a8eebd82SJames Collins        // Add Mikio Section titles
16383a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
16399cff245bSJames Collins            $admin_sections = [
1640ab45ba71SJames Collins                // Section      Insert Before                 Icon
16419cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
16429cff245bSJames Collins                'search'        => ['searchButton',            ''],
16439cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
16449cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
16459cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
16469cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
16479cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
16489cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
16499cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
16509cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
16519cff245bSJames Collins                'license'       => ['licenseType',             ''],
16529cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
16539cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
16549cff245bSJames Collins            ];
1655ab45ba71SJames Collins
1656ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1657ab45ba71SJames Collins                $search = $items[0];
1658ab45ba71SJames Collins                $icon   = $items[1];
1659ab45ba71SJames Collins
166010b40067Snomadjimbob                $content = preg_replace(
1661adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16629cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16639cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16649cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16659cff245bSJames Collins                        $search . '</span>',
166610b40067Snomadjimbob                    $content
166710b40067Snomadjimbob                );
1668ab45ba71SJames Collins            }
1669bb5a3dd1SJames Collins        } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) {
1670ad182e6dSnomadjimbob            $mikioPluginMissing = true;
1671ad182e6dSnomadjimbob            /* Hide plugin fields if not installed */
16729ffe9161Snomadjimbob            if (plugin_load('action', 'mikioplugin') !== null) {
1673ad182e6dSnomadjimbob                $mikioPluginMissing = false;
1674ad182e6dSnomadjimbob            }
1675ad182e6dSnomadjimbob
1676cee81679SJames Collins            $style_headers = [
1677f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__text_'],
1678f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__code_'],
1679f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__control_'],
1680f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__topheader_'],
1681f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__navbar_'],
1682f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'],
1683f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__tag_background_color_'],
1684f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'],
1685f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__hero_'],
1686f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__sidebar_'],
1687f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__content_'],
1688f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__toc_'],
1689f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__pagetools_'],
1690f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__footer_'],
1691f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__table_'],
1692f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__dropdown_'],
1693f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__section_edit_'],
1694f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__tree_'],
1695f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__tab_'],
1696ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2',
16979ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
16989ffe9161Snomadjimbob                ],
1699ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing],
1700ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_',
17019ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17029ffe9161Snomadjimbob                ],
1703ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing],
1704ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing],
1705ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing],
1706ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing],
1707ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing],
1708ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing],
1709ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing],
1710ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing],
1711ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing],
1712ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing],
1713ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing],
1714cee81679SJames Collins                ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'],
1715f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__darkmode_text_'],
1716f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__darkmode_code_'],
1717f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__darkmode_control_'],
1718f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'],
1719f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'],
1720f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'],
1721f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'],
1722f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'],
1723f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'],
1724f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'],
1725f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__darkmode_content_'],
1726f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'],
1727f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'],
1728f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'],
1729f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__darkmode_table_'],
1730f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'],
1731f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'],
1732f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'],
1733f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'],
1734ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2',
17359ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17369ffe9161Snomadjimbob                ],
1737ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_',
17389ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17399ffe9161Snomadjimbob                ],
1740ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_',
17419ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17429ffe9161Snomadjimbob                ],
1743ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_',
17449ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17459ffe9161Snomadjimbob                ],
1746ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_',
17479ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17489ffe9161Snomadjimbob                ],
1749ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_',
17509ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17519ffe9161Snomadjimbob                ],
1752ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_',
17539ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17549ffe9161Snomadjimbob                ],
1755ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_',
17569ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17579ffe9161Snomadjimbob                ],
1758ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_',
17599ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17609ffe9161Snomadjimbob                ],
1761ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_',
17629ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17639ffe9161Snomadjimbob                ],
1764ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_',
17659ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17669ffe9161Snomadjimbob                ],
1767ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing],
1768ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_',
17699ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17709ffe9161Snomadjimbob                ],
1771ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing],
1772cee81679SJames Collins            ];
1773cee81679SJames Collins
1774cee81679SJames Collins            foreach ($style_headers as $header) {
1775cee81679SJames Collins                if (array_key_exists('heading', $header) === false) {
1776cee81679SJames Collins                    $header['heading'] = 'h3';
1777cee81679SJames Collins                }
1778cee81679SJames Collins
1779ad182e6dSnomadjimbob                if (array_key_exists('hidden', $header) === false) {
1780ad182e6dSnomadjimbob                    $header['hidden'] = false;
1781ad182e6dSnomadjimbob                }
1782ad182e6dSnomadjimbob
17831244e3ceSJames Collins                $content = preg_replace(
1784f65a4e5eSJames Collins                    '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s',
17859ffe9161Snomadjimbob                    '</tbody></table><' . $header['heading'] . ' style="display:' .
17869ffe9161Snomadjimbob                    ($header['hidden'] === true ? 'none' : 'block') . '">' .
17879ffe9161Snomadjimbob                    $header['title'] . '</' . $header['heading'] . '>
1788ad182e6dSnomadjimbob                    <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1',
17891244e3ceSJames Collins                    $content,
17901244e3ceSJames Collins                    1
17911244e3ceSJames Collins                );
1792cee81679SJames Collins            }
1793f65a4e5eSJames Collins
1794f65a4e5eSJames Collins            $content = preg_replace('/type="color"/', 'type="text"', $content);
1795bb5a3dd1SJames Collins        }//end if
1796ab45ba71SJames Collins
17973a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1798a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1799a8eebd82SJames Collins        }
1800ab45ba71SJames Collins
1801a8eebd82SJames Collins        // Page Revisions - Table Fix
18029cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
18039cff245bSJames Collins            $content = preg_replace(
18049cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
18059cff245bSJames Collins                '<span>$1</span>',
18069cff245bSJames Collins                $content
18079cff245bSJames Collins            );
1808a8eebd82SJames Collins        }
1809ab45ba71SJames Collins
18109cff245bSJames Collins        $html = new \simple_html_dom();
1811bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1812c165b184SJames Collins        $html->load($content, true, false);
1813c165b184SJames Collins
18149cff245bSJames Collins        if ($html === false) {
18159cff245bSJames Collins            return $content;
18169cff245bSJames Collins        }
1817ab45ba71SJames Collins
1818ab45ba71SJames Collins        /* Buttons */
1819ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1820ab45ba71SJames Collins            $c = explode(' ', $node->class);
18219cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
18229cff245bSJames Collins                $c[] = 'mikio-button';
18239cff245bSJames Collins            }
1824ab45ba71SJames Collins            $node->class = implode(' ', $c);
1825c165b184SJames Collins        }
1826c165b184SJames Collins
1827ab45ba71SJames Collins
1828ab45ba71SJames Collins        /* Buttons - Primary */
1829ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1830ab45ba71SJames Collins            $c = explode(' ', $node->class);
18319cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
18329cff245bSJames Collins                $c[] = 'mikio-primary';
18339cff245bSJames Collins            }
1834ab45ba71SJames Collins            $node->class = implode(' ', $c);
1835ab45ba71SJames Collins        }
1836ab45ba71SJames Collins
1837a8eebd82SJames Collins        /* Hide page title if hero is enabled */
18389cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
18391785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
184047161538SJames Collins
184147161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
18429cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1843a8eebd82SJames Collins                    // $elm->innertext = '';
1844a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1845a8eebd82SJames Collins
184647161538SJames Collins                    break;
184747161538SJames Collins                }
184847161538SJames Collins            }
184947161538SJames Collins        }
1850c165b184SJames Collins
1851a8eebd82SJames Collins        /* Hero subtitle */
18522b4583abSJames Collins        foreach ($html->find('p') as $elm) {
18532b4583abSJames Collins            $i = stripos($elm->innertext, '~~hero-subtitle');
18542b4583abSJames Collins            if ($i !== false) {
18559cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
18562b4583abSJames Collins                if ($j !== false) {
18579cff245bSJames Collins                    if ($j > ($i + 16)) {
18589cff245bSJames Collins                        $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16));
1859a8eebd82SJames Collins                        $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1860a8eebd82SJames Collins
1861a8eebd82SJames Collins                        // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2);
1862a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext);
18632b4583abSJames Collins                    }
18642b4583abSJames Collins
18652b4583abSJames Collins                    break;
18662b4583abSJames Collins                }
18672b4583abSJames Collins            }
18682b4583abSJames Collins        }
18692b4583abSJames Collins
1870a8eebd82SJames Collins        /* Hero image */
1871a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1872a8eebd82SJames Collins            $image = '';
1873a8eebd82SJames Collins            preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches);
1874a8eebd82SJames Collins            if (count($matches) > 0) {
1875a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1876a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1877a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1878a8eebd82SJames Collins                } else {
1879a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1880a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1881a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1882a8eebd82SJames Collins                    } else {
1883a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
18849cff245bSJames Collins                        if (stripos($image, ':') === false) {
18859cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1886a8eebd82SJames Collins                            $i = stripos($image, '?');
18879cff245bSJames Collins                            if ($i !== false) {
1888a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1889c165b184SJames Collins                            }
1890c165b184SJames Collins
1891a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1892ab45ba71SJames Collins                        }
1893ab45ba71SJames Collins                    }
1894ab45ba71SJames Collins                }
1895ab45ba71SJames Collins
1896a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1897a8eebd82SJames Collins
1898a8eebd82SJames Collins                $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext);
18999cff245bSJames Collins            }//end if
19009cff245bSJames Collins        }//end foreach
1901ab45ba71SJames Collins
19029cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
19039cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1904a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1905a8eebd82SJames Collins            $i = stripos($elm->innertext, '~~hero-colors');
1906a8eebd82SJames Collins            if ($i !== false) {
19079cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
1908a8eebd82SJames Collins                if ($j !== false) {
19099cff245bSJames Collins                    if ($j > ($i + 14)) {
19109cff245bSJames Collins                        $color = substr($elm->innertext, ($i + 14), ($j - $i - 14));
1911a8eebd82SJames Collins                        $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')';
1912ab45ba71SJames Collins
1913a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext);
1914ab45ba71SJames Collins                    }
1915ab45ba71SJames Collins
1916a8eebd82SJames Collins                    break;
1917ab45ba71SJames Collins                }
1918ab45ba71SJames Collins            }
1919ab45ba71SJames Collins        }
1920ab45ba71SJames Collins
192196ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
192296ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
192396ec8e1eSJames Collins            $i = stripos($elm->innertext, '~~hide-parts');
192496ec8e1eSJames Collins            if ($i !== false) {
19259cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
192696ec8e1eSJames Collins                if ($j !== false) {
19279cff245bSJames Collins                    if ($j > ($i + 13)) {
19289cff245bSJames Collins                        $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13)));
192996ec8e1eSJames Collins                        $script = '';
193096ec8e1eSJames Collins
193196ec8e1eSJames Collins                        foreach ($parts as $part) {
193296ec8e1eSJames Collins                            // $part = trim($part);
193396ec8e1eSJames Collins                            if (strlen($part) > 0) {
193496ec8e1eSJames Collins                                $script .= 'mikio.hidePart(\'' . $part . '\');';
193596ec8e1eSJames Collins                            }
193696ec8e1eSJames Collins                        }
193796ec8e1eSJames Collins
193896ec8e1eSJames Collins                        if (strlen($script) > 0) {
193996ec8e1eSJames Collins                            $this->footerScript['hide-parts'] = $script;
194096ec8e1eSJames Collins                        }
194196ec8e1eSJames Collins
194296ec8e1eSJames Collins                        $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext);
194396ec8e1eSJames Collins                    }
194496ec8e1eSJames Collins
194596ec8e1eSJames Collins                    break;
19469cff245bSJames Collins                }//end if
19479cff245bSJames Collins            }//end if
19489cff245bSJames Collins        }//end foreach
194996ec8e1eSJames Collins
195096ec8e1eSJames Collins
1951a8eebd82SJames Collins        /* Page Tags (tag plugin) */
19529cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1953a8eebd82SJames Collins            $tags = '';
1954a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1955a8eebd82SJames Collins                $tags .= $elm->outertext;
1956a8eebd82SJames Collins            }
1957a8eebd82SJames Collins
1958a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1959a8eebd82SJames Collins                $elm->innertext = '';
1960a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1961a8eebd82SJames Collins            }
1962a8eebd82SJames Collins
19633a385f2cSJames Collins            if (empty($tags) === false) {
1964a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1965a8eebd82SJames Collins            }
1966ab45ba71SJames Collins        }
1967ab45ba71SJames Collins
1968ab45ba71SJames Collins        // Configuration Manager
19693a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1970ab45ba71SJames Collins            // Additional save buttons
1971ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1972ab45ba71SJames Collins                $saveButtons = '';
1973ab45ba71SJames Collins
1974ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1975ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1976a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1977ab45ba71SJames Collins                    $elm->outertext = '';
1978ab45ba71SJames Collins                }
1979ab45ba71SJames Collins
1980ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1981ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1982ab45ba71SJames Collins                }
1983ab45ba71SJames Collins            }
1984ab45ba71SJames Collins        }
1985ab45ba71SJames Collins
1986ab45ba71SJames Collins        $content = $html->save();
1987c165b184SJames Collins        $html->clear();
1988c165b184SJames Collins        unset($html);
1989c165b184SJames Collins
1990c165b184SJames Collins        return $content;
1991c165b184SJames Collins    }
19922b4583abSJames Collins
19932b4583abSJames Collins
1994a8eebd82SJames Collins    /**
1995a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
1996a8eebd82SJames Collins     *
19979cff245bSJames Collins     * @param   string $str String to parse.
19989cff245bSJames Collins     * @return  string      parsed URI
1999a8eebd82SJames Collins     */
20009cff245bSJames Collins    public function getLink(string $str)
200110b40067Snomadjimbob    {
20022b4583abSJames Collins        $i = strpos($str, '://');
20039cff245bSJames Collins        if ($i !== false) {
20049cff245bSJames Collins            return $str;
20059cff245bSJames Collins        }
20062b4583abSJames Collins
20072b4583abSJames Collins        return wl($str);
20082b4583abSJames Collins    }
2009ab45ba71SJames Collins
2010ab45ba71SJames Collins
2011a8eebd82SJames Collins    /**
2012a8eebd82SJames Collins     * Check if the user can edit current namespace/page
2013a8eebd82SJames Collins     *
2014a8eebd82SJames Collins     * @return  boolean  user can edit
2015a8eebd82SJames Collins     */
201610b40067Snomadjimbob    public function userCanEdit()
201710b40067Snomadjimbob    {
2018ab45ba71SJames Collins        global $INFO;
2019ab45ba71SJames Collins        global $ID;
2020ab45ba71SJames Collins
2021ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
20229cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
20239cff245bSJames Collins            return true;
20249cff245bSJames Collins        }
20259cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
20269cff245bSJames Collins            return true;
20279cff245bSJames Collins        }
2028a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
20299cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
20309cff245bSJames Collins            return true;
20319cff245bSJames Collins        }
20329cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
20339cff245bSJames Collins            return true;
20349cff245bSJames Collins        }
2035ab45ba71SJames Collins
2036ab45ba71SJames Collins        return false;
2037c165b184SJames Collins    }
203847161538SJames Collins
203947161538SJames Collins
2040a8eebd82SJames Collins    /**
2041a8eebd82SJames Collins     * Search for and return the uri of a media file
2042a8eebd82SJames Collins     *
20439cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
20449cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
20459cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
20469cff245bSJames Collins     * @return string                  URI of the found media file
2047a8eebd82SJames Collins     */
20489cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
204910b40067Snomadjimbob    {
2050ab45ba71SJames Collins        global $INFO;
2051a8eebd82SJames Collins
20529cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
2053ab45ba71SJames Collins
20549cff245bSJames Collins        if ($searchCurrentNS === true) {
20559cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
20569cff245bSJames Collins        }
20579cff245bSJames Collins        if ($propagate === true) {
2058ab45ba71SJames Collins            $prefix[] = ':';
2059ab45ba71SJames Collins            $prefix[] = ':wiki:';
2060a8eebd82SJames Collins        }
2061ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
20623a385f2cSJames Collins        if (empty($theme) === false) {
20639cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
20649cff245bSJames Collins        }
2065ab45ba71SJames Collins        $prefix[] = 'images/';
2066ab45ba71SJames Collins
20679cff245bSJames Collins        $search = [];
2068ab45ba71SJames Collins        foreach ($prefix as $pitem) {
2069ab45ba71SJames Collins            foreach ($ext as $eitem) {
2070ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
2071ab45ba71SJames Collins            }
2072ab45ba71SJames Collins        }
2073ab45ba71SJames Collins
2074ab45ba71SJames Collins        $img = '';
2075ab45ba71SJames Collins        $file = '';
2076ab45ba71SJames Collins        $url = '';
2077ab45ba71SJames Collins        $ismedia = false;
2078ab45ba71SJames Collins        $found = false;
2079ab45ba71SJames Collins
2080ab45ba71SJames Collins        foreach ($search as $img) {
20813a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
2082ab45ba71SJames Collins                $file    = mediaFN($img);
2083ab45ba71SJames Collins                $ismedia = true;
2084ab45ba71SJames Collins            } else {
2085ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
2086ab45ba71SJames Collins                $ismedia = false;
2087ab45ba71SJames Collins            }
2088ab45ba71SJames Collins
20899cff245bSJames Collins            if (file_exists($file) === true) {
2090ab45ba71SJames Collins                $found = true;
2091ab45ba71SJames Collins                break;
2092ab45ba71SJames Collins            }
2093ab45ba71SJames Collins        }
2094ab45ba71SJames Collins
20959cff245bSJames Collins        if ($found === false) {
20969cff245bSJames Collins            return false;
20979cff245bSJames Collins        }
2098ab45ba71SJames Collins
20999cff245bSJames Collins        if ($ismedia === true) {
2100ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
2101ab45ba71SJames Collins        } else {
2102ab45ba71SJames Collins            $url = tpl_basedir() . $img;
2103ab45ba71SJames Collins        }
2104ab45ba71SJames Collins
2105ab45ba71SJames Collins        return $url;
2106ab45ba71SJames Collins    }
2107ab45ba71SJames Collins
2108a8eebd82SJames Collins
2109a8eebd82SJames Collins    /**
2110ab45ba71SJames Collins     * Print or return the page title
2111ab45ba71SJames Collins     *
21129cff245bSJames Collins     * @param string $page Page id or empty string for current page.
2113ab45ba71SJames Collins     * @return string      generated content
2114ab45ba71SJames Collins     */
21159cff245bSJames Collins    public function getPageTitle(string $page = '')
211610b40067Snomadjimbob    {
2117ab45ba71SJames Collins        global $ID, $conf;
2118ab45ba71SJames Collins
2119ab45ba71SJames Collins        $html = '';
2120ab45ba71SJames Collins
21213a385f2cSJames Collins        if (empty($page) === true) {
21229cff245bSJames Collins            $page = $ID;
21239cff245bSJames Collins        }
2124ab45ba71SJames Collins
2125ab45ba71SJames Collins        $html = p_get_first_heading($page);
2126ab45ba71SJames Collins        $html = strip_tags($html);
2127ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
2128ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
2129ab45ba71SJames Collins        $html = trim($html);
2130ab45ba71SJames Collins
2131ab45ba71SJames Collins        return $html;
2132ab45ba71SJames Collins    }
2133a8eebd82SJames Collins
2134a8eebd82SJames Collins
2135a8eebd82SJames Collins    /**
2136a8eebd82SJames Collins     * Return inline theme icon
2137a8eebd82SJames Collins     *
21389cff245bSJames Collins     * @param   string $type  Icon to retreive.
21399e41d878SJames Collins     * @param   string $class Classname to insert.
21409cff245bSJames Collins     * @return  string        HTML icon content
2141a8eebd82SJames Collins     */
21429e41d878SJames Collins    public function mikioInlineIcon(string $type, string $class = "")
214310b40067Snomadjimbob    {
21449e41d878SJames Collins        if (is_array($class) === true) {
21459e41d878SJames Collins            $class = explode(' ', $class);
21469e41d878SJames Collins        }
21479e41d878SJames Collins
21489e41d878SJames Collins        if (strlen($class) > 0) {
21499e41d878SJames Collins            $class = ' ' . $class;
21509e41d878SJames Collins        }
21519e41d878SJames Collins
2152a8eebd82SJames Collins        switch ($type) {
2153a8eebd82SJames Collins            case 'wrench':
2154906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792
2155906e1a13SJames 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,
2156906e1a13SJames 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,
2157906e1a13SJames 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,
2158906e1a13SJames 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
2159906e1a13SJames 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,
2160906e1a13SJames 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>';
2161a8eebd82SJames Collins            case 'file':
2162906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2163906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991">
2164906e1a13SJames 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
2165906e1a13SJames 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
2166906e1a13SJames 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"
21679cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
2168a8eebd82SJames Collins            case 'gear':
2169906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2170906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027">
2171906e1a13SJames 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
2172906e1a13SJames 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
2173906e1a13SJames 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
2174906e1a13SJames 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
2175906e1a13SJames 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
2176906e1a13SJames 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,
2177906e1a13SJames 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
2178906e1a13SJames 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
2179906e1a13SJames 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" />
2180906e1a13SJames Collins</g></svg>';
2181a8eebd82SJames Collins            case 'user':
2182906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2183906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M
2184906e1a13SJames 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
2185906e1a13SJames 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,
2186906e1a13SJames 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
2187906e1a13SJames 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
2188906e1a13SJames 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,
2189906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>';
2190a8eebd82SJames Collins            case 'search':
21919e41d878SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
21929cff245bSJames 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
21939cff245bSJames 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
21949cff245bSJames 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
21959cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2196a8eebd82SJames Collins            case 'home':
2197906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2198906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g
2199906e1a13SJames 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
2200906e1a13SJames 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
2201906e1a13SJames 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
2202906e1a13SJames 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,
2203906e1a13SJames 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"
22049cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
22059e41d878SJames Collins            case 'sun':
2206906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2207906e1a13SJames 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
2208906e1a13SJames 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
2209906e1a13SJames 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
2210906e1a13SJames 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
2211906e1a13SJames Collins0 0 1-.707.707z" /></svg>';
22129e41d878SJames Collins            case 'moon':
2213906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2214906e1a13SJames 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
2215906e1a13SJames 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
2216906e1a13SJames 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
2217906e1a13SJames 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
2218906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>';
221934d5f19aSJames Collins            case 'sunmoon':
2220d0fba6d1SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2221d0fba6d1SJames Collinsstyle="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
2222d0fba6d1SJames 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
2223d0fba6d1SJames 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"
2224d0fba6d1SJames 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,
2225d0fba6d1SJames 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>';
2226f65a4e5eSJames Collins            case 'hamburger':
2227f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
2228f65a4e5eSJames 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
2229f65a4e5eSJames 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
2230f65a4e5eSJames 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
2231f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>';
2232f65a4e5eSJames Collins            case 'down-arrow':
2233f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
2234f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9
2235f65a4e5eSJames Collins1.917-1.916z"/></svg>';
2236*3a3ece10SJames Collins            case 'language':
2237*3a3ece10SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" width="16"
2238*3a3ece10SJames Collinsheight="16" fill="currentColor" viewBox="0 0 16 16"><path d="M4.545 6.714 4.11
2239*3a3ece10SJames 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
2240*3a3ece10SJames 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
2241*3a3ece10SJames 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
2242*3a3ece10SJames 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
2243*3a3ece10SJames Collins1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651
2244*3a3ece10SJames 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"/>
2245*3a3ece10SJames Collins</svg>';
22469cff245bSJames Collins        }//end switch
2247ab45ba71SJames Collins
2248a8eebd82SJames Collins        return '';
2249a8eebd82SJames Collins    }
2250ab45ba71SJames Collins
2251a8eebd82SJames Collins    /**
2252a8eebd82SJames Collins     * Finalize theme
22539cff245bSJames Collins     *
22549cff245bSJames Collins     * @return void
2255a8eebd82SJames Collins     */
225610b40067Snomadjimbob    public function finalize()
225710b40067Snomadjimbob    {
2258a8eebd82SJames Collins    }
22591785fc73SJames Collins
22601785fc73SJames Collins    /**
22611785fc73SJames Collins     * Show Messages
22629cff245bSJames Collins     *
22639cff245bSJames Collins     * @return void
22641785fc73SJames Collins     */
226510b40067Snomadjimbob    public function showMessages()
226610b40067Snomadjimbob    {
22671785fc73SJames Collins        global $ACT;
22681785fc73SJames Collins
22699cff245bSJames Collins        if ($this->lessIgnored === true) {
22709cff245bSJames Collins            msg(
22719cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
22729cff245bSJames Collins                2,
22739cff245bSJames Collins                '',
22749cff245bSJames Collins                '',
22759cff245bSJames Collins                MSG_ADMINS_ONLY
22769cff245bSJames Collins            );
2277a8df40efSJames Collins        }
2278a8df40efSJames Collins
22791785fc73SJames Collins        $show = $this->getConf('showNotifications');
22803a385f2cSJames Collins        if (
22813a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
22823a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
22833a385f2cSJames Collins        ) {
22841785fc73SJames Collins            global $MSG, $MSG_shown;
22851785fc73SJames Collins
22869cff245bSJames Collins            if (isset($MSG) === false) {
22871785fc73SJames Collins                return;
22881785fc73SJames Collins            }
22891785fc73SJames Collins
22909cff245bSJames Collins            if (isset($MSG_shown) === false) {
22919cff245bSJames Collins                $MSG_shown = [];
2292a8df40efSJames Collins            }
22931785fc73SJames Collins
22941785fc73SJames Collins            foreach ($MSG as $msg) {
22951785fc73SJames Collins                $hash = md5($msg['msg']);
22969cff245bSJames Collins                if (isset($MSG_shown[$hash]) === true) {
22971785fc73SJames Collins                    continue;
22981785fc73SJames Collins                }
22991785fc73SJames Collins                // skip double messages
23001785fc73SJames Collins
23019cff245bSJames Collins                if (info_msg_allowed($msg) === true) {
23029cff245bSJames Collins                    echo '<div class="' . $msg['lvl'] . '">';
23039cff245bSJames Collins                    echo $msg['msg'];
23049cff245bSJames Collins                    echo '</div>';
23051785fc73SJames Collins                }
23061785fc73SJames Collins
2307a8df40efSJames Collins                $MSG_shown[$hash] = true;
23081785fc73SJames Collins            }
23091785fc73SJames Collins
23101785fc73SJames Collins            unset($GLOBALS['MSG']);
23119cff245bSJames Collins        }//end if
23121785fc73SJames Collins    }
23137ac0a6efSJames Collins
23147ac0a6efSJames Collins    /**
23157ac0a6efSJames Collins     * Dokuwiki version
23167ac0a6efSJames Collins     *
23177ac0a6efSJames Collins     * @return  string        the dw version name
23187ac0a6efSJames Collins     */
23199cff245bSJames Collins    public function dwVersion()
23209cff245bSJames Collins    {
23219cff245bSJames Collins        if (function_exists('getVersionData') === true) {
23227ac0a6efSJames Collins            $version_data = getVersionData();
23239cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
23247ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
23257ac0a6efSJames Collins                if (count($version_items) >= 2) {
23267ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
23277ac0a6efSJames Collins                }
23287ac0a6efSJames Collins            }
23297ac0a6efSJames Collins        }
23307ac0a6efSJames Collins
23317ac0a6efSJames Collins        return 'unknown';
23327ac0a6efSJames Collins    }
2333e4c4fb13SJames Collins
2334e4c4fb13SJames Collins    /**
2335e4c4fb13SJames Collins     * Dokuwiki version number
2336e4c4fb13SJames Collins     *
2337e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2338e4c4fb13SJames Collins     */
23399cff245bSJames Collins    public function dwVersionNumber()
23409cff245bSJames Collins    {
23419cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2342e4c4fb13SJames Collins            $version_data = getVersionData();
23439cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2344e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2345e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2346e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2347e4c4fb13SJames Collins                }
2348e4c4fb13SJames Collins            }
2349e4c4fb13SJames Collins        }
2350e4c4fb13SJames Collins
2351e4c4fb13SJames Collins        return 0;
2352e4c4fb13SJames Collins    }
2353a8eebd82SJames Collins}
2354ab45ba71SJames Collins
2355ab45ba71SJames Collinsglobal $TEMPLATE;
235647161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2357