xref: /template/mikio/mikio.php (revision c963c68c205d36dd76fd825bb29453eabc339248)
1c165b184SJames Collins<?php
210b40067Snomadjimbob
3c165b184SJames Collins/**
4c165b184SJames Collins * DokuWiki Mikio Template
5c165b184SJames Collins *
6c165b184SJames Collins * @link    http://dokuwiki.org/template:mikio
7c165b184SJames Collins * @author  James Collins <james.collins@outlook.com.au>
8ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html)
9c165b184SJames Collins */
1010b40067Snomadjimbob
11ab45ba71SJames Collinsnamespace dokuwiki\template\mikio;
12c165b184SJames Collins
139cff245bSJames Collinsif (defined('DOKU_INC') === false) {
149cff245bSJames Collins    die();
159cff245bSJames Collins}
16c165b184SJames Collins
17ab45ba71SJames Collinsrequire_once('icons/icons.php');
18c165b184SJames Collinsrequire_once('inc/simple_html_dom.php');
19c165b184SJames Collins
2010b40067Snomadjimbobclass Template
2110b40067Snomadjimbob{
229cff245bSJames Collins    /**
239cff245bSJames Collins     * @var string Template directory path from local FS.
249cff245bSJames Collins     */
25c165b184SJames Collins    public $tplDir  = '';
269cff245bSJames Collins
279cff245bSJames Collins    /**
289cff245bSJames Collins     * @var string Template directory path from web.
299cff245bSJames Collins     */
30c165b184SJames Collins    public $baseDir = '';
319cff245bSJames Collins
329cff245bSJames Collins    /**
339cff245bSJames Collins     * @var array Array of Javascript files to include in footer.
349cff245bSJames Collins     */
359cff245bSJames Collins    public $footerScript = [];
369cff245bSJames Collins
379cff245bSJames Collins    /**
389cff245bSJames Collins     * @var boolean Ignore LESS files.
399cff245bSJames Collins     */
40a8df40efSJames Collins    public $lessIgnored = false;
41c165b184SJames Collins
424f8225e4SJames Collins    /**
434f8225e4SJames Collins     * @var string Notifications from included pages.
444f8225e4SJames Collins     */
454f8225e4SJames Collins    private $includedPageNotifications = '';
464f8225e4SJames Collins
47c165b184SJames Collins
48c165b184SJames Collins    /**
49c165b184SJames Collins     * Class constructor
50c165b184SJames Collins     */
5110b40067Snomadjimbob    public function __construct()
5210b40067Snomadjimbob    {
53c165b184SJames Collins        $this->tplDir  = tpl_incdir();
54c165b184SJames Collins        $this->baseDir = tpl_basedir();
55c165b184SJames Collins
569cff245bSJames Collins        $this->registerHooks();
57c165b184SJames Collins    }
58c165b184SJames Collins
59c165b184SJames Collins    /**
60ab45ba71SJames Collins     * Returns the instance of the class
6147161538SJames Collins     *
62ab45ba71SJames Collins     * @return  Template        class instance
6347161538SJames Collins     */
6447161538SJames Collins    public static function getInstance()
6547161538SJames Collins    {
6647161538SJames Collins        static $instance = null;
6747161538SJames Collins
683a385f2cSJames Collins        if (empty($instance) === true) {
6947161538SJames Collins            $instance = new Template();
7047161538SJames Collins        }
7147161538SJames Collins
7247161538SJames Collins        return $instance;
7347161538SJames Collins    }
7447161538SJames Collins
75ab45ba71SJames Collins
7647161538SJames Collins    /**
77ab45ba71SJames Collins     * Register the themes hooks into Dokuwiki
789cff245bSJames Collins     *
799cff245bSJames Collins     * @return void
80c165b184SJames Collins     */
819cff245bSJames Collins    private function registerHooks()
8210b40067Snomadjimbob    {
83c165b184SJames Collins        global $EVENT_HANDLER;
84c165b184SJames Collins
859cff245bSJames Collins        $events_dispatcher = [
86ab45ba71SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler'
879cff245bSJames Collins        ];
88c165b184SJames Collins
89c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
90c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
91c165b184SJames Collins        }
92c165b184SJames Collins    }
93c165b184SJames Collins
94c165b184SJames Collins
95c165b184SJames Collins    /**
96ab45ba71SJames Collins     * Meta handler hook for DokuWiki
97c165b184SJames Collins     *
989cff245bSJames Collins     * @param   \Doku_Event $event DokuWiki Event.
999cff245bSJames Collins     * @return  void
100c165b184SJames Collins     */
10110b40067Snomadjimbob    public function metaHeadersHandler(\Doku_Event $event)
10210b40067Snomadjimbob    {
103ab45ba71SJames Collins        global $MIKIO_ICONS;
104b5536b07SChris MacMackin        global $conf;
105ab45ba71SJames Collins
106ad182e6dSnomadjimbob        global $MIKIO_TEMPLATE;
107ad182e6dSnomadjimbob        $MIKIO_TEMPLATE = '123';
108ad182e6dSnomadjimbob
1099cff245bSJames Collins        $this->includePage('theme', false, true);
110a8eebd82SJames Collins
1119cff245bSJames Collins        $stylesheets    = [];
1129cff245bSJames Collins        $scripts        = [];
113c165b184SJames Collins
1143a385f2cSJames Collins        if (empty($this->getConf('customTheme')) === false) {
1159cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) {
116a8eebd82SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less';
117a8eebd82SJames Collins            } else {
1189cff245bSJames Collins                if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) {
119ab45ba71SJames Collins                    $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css';
1202b4583abSJames Collins                }
121a8eebd82SJames Collins            }
1229cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) {
123ab45ba71SJames Collins                $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js';
124c165b184SJames Collins            }
125c165b184SJames Collins        }
126c165b184SJames Collins
1273a385f2cSJames Collins        if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) {
1289cff245bSJames Collins            $icons = [];
129ab45ba71SJames Collins            foreach ($MIKIO_ICONS as $icon) {
1309cff245bSJames Collins                if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) {
131ab45ba71SJames Collins                    $icons[] = $icon;
132c165b184SJames Collins
1333a385f2cSJames Collins                    if (empty($icon['css']) === false) {
1349cff245bSJames Collins                        if (strpos($icon['css'], '//') === false) {
135a8eebd82SJames Collins                            $stylesheets[] = $this->baseDir . 'icons/' . $icon['css'];
136ab45ba71SJames Collins                        } else {
137a8eebd82SJames Collins                            $stylesheets[] = $icon['css'];
138ab45ba71SJames Collins                        }
139ab45ba71SJames Collins                    }
140ab45ba71SJames Collins                }
141ab45ba71SJames Collins            }
142ab45ba71SJames Collins            $MIKIO_ICONS = $icons;
143ab45ba71SJames Collins        } else {
144ab45ba71SJames Collins            $MIKIO_ICONS = [];
145ab45ba71SJames Collins        }
146c165b184SJames Collins
1477864545bSChris MacMackin        $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js';
148ab45ba71SJames Collins        $scripts[] = $this->baseDir . 'assets/mikio.js';
149644fd9f9SJames Collins
1509cff245bSJames Collins        if ($this->getConf('useLESS') === true) {
151ab45ba71SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.less';
152644fd9f9SJames Collins        } else {
153644fd9f9SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.css';
154644fd9f9SJames Collins        }
155644fd9f9SJames Collins
156ad182e6dSnomadjimbob        /* MikioPlugin Support */
1579ffe9161Snomadjimbob        if (plugin_load('action', 'mikioplugin') !== null) {
158ad182e6dSnomadjimbob            if ($this->getConf('useLESS') === true) {
159ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.less';
160ad182e6dSnomadjimbob            } else {
161ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.css';
162ad182e6dSnomadjimbob            }
163ad182e6dSnomadjimbob        }
164ab45ba71SJames Collins
165ab45ba71SJames Collins        $set = [];
166c165b184SJames Collins        foreach ($stylesheets as $style) {
1679cff245bSJames Collins            if (in_array($style, $set) === false) {
1683a385f2cSJames Collins                if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) {
169ab45ba71SJames Collins                    $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style);
170ab45ba71SJames Collins                }
171ab45ba71SJames Collins
1729cff245bSJames Collins                array_unshift($event->data['link'], [
173c165b184SJames Collins                    'type' => 'text/css',
174c165b184SJames Collins                    'rel'  => 'stylesheet',
175c165b184SJames Collins                    'href' => $style
1769cff245bSJames Collins                ]);
177c165b184SJames Collins            }
178ab45ba71SJames Collins            $set[] = $style;
179ab45ba71SJames Collins        }
180c165b184SJames Collins
181ab45ba71SJames Collins        $set = [];
182c165b184SJames Collins        foreach ($scripts as $script) {
1839cff245bSJames Collins            if (in_array($script, $set) === false) {
1849cff245bSJames Collins                $script_params = [
185c165b184SJames Collins                    'type'  => 'text/javascript',
186c165b184SJames Collins                    '_data' => '',
1878395cdcbSChris MacMackin                    'src'   => $script
1889cff245bSJames Collins                ];
189c1ecb866SJames Collins
190c1ecb866SJames Collins                // equal to or greator than hogfather
191c1ecb866SJames Collins                if ($this->dwVersionNumber() >= 20200729) {
192c1ecb866SJames Collins                    // greator than hogfather - defer always on
193c1ecb866SJames Collins                    if ($this->dwVersionNumber() >= 20200729) {
194c1ecb866SJames Collins                        $script_params += ['defer' => 'defer'];
195c1ecb866SJames Collins                    } else {
196c1ecb866SJames Collins                        // hogfather - defer always on unless $conf['defer_js'] is false
1979cff245bSJames Collins                        if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) {
1988395cdcbSChris MacMackin                            $script_params += ['defer' => 'defer'];
1998395cdcbSChris MacMackin                        }
200c1ecb866SJames Collins                    }
201c1ecb866SJames Collins                }
202c1ecb866SJames Collins
2038395cdcbSChris MacMackin                $event->data['script'][] = $script_params;
2049cff245bSJames Collins            }//end if
205ab45ba71SJames Collins            $set[] = $script;
2069cff245bSJames Collins        }//end foreach
207c165b184SJames Collins    }
208c165b184SJames Collins
209c165b184SJames Collins
210c165b184SJames Collins    /**
211a8eebd82SJames Collins     * Print or return the footer meta data
212c165b184SJames Collins     *
2139cff245bSJames Collins     * @param   boolean $print Print the data to buffer.
2149cff245bSJames Collins     * @return  string         HTML footer meta data
215c165b184SJames Collins     */
2169cff245bSJames Collins    public function includeFooterMeta(bool $print = true)
21710b40067Snomadjimbob    {
218a8eebd82SJames Collins        $html = '';
219a8eebd82SJames Collins
220a8eebd82SJames Collins        if (count($this->footerScript) > 0) {
221a8eebd82SJames Collins            $html .= '<script type="text/javascript">function mikioFooterRun() {';
222a8eebd82SJames Collins            foreach ($this->footerScript as $script) {
223a8eebd82SJames Collins                $html .= $script . ';';
224a8eebd82SJames Collins            }
225a8eebd82SJames Collins            $html .= '}</script>';
226a8eebd82SJames Collins        }
227c165b184SJames Collins
228c165b184SJames Collins
2299cff245bSJames Collins        if ($print === true) {
2309cff245bSJames Collins            echo $html;
2319cff245bSJames Collins        }
232a8eebd82SJames Collins        return $html;
233a8eebd82SJames Collins    }
234a8eebd82SJames Collins
23595372bffSJames Collins
23695372bffSJames Collins    // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing
23795372bffSJames Collins
23895372bffSJames Collins
239a8eebd82SJames Collins    /**
240ab45ba71SJames Collins     * Retreive and parse theme configuration options
241c165b184SJames Collins     *
2429cff245bSJames Collins     * @param   string $key     The configuration key to retreive.
2439cff245bSJames Collins     * @param   mixed  $default If key doesn't exist, return this value.
244ab45ba71SJames Collins     * @return  mixed           parsed value of configuration
245c165b184SJames Collins     */
24695372bffSJames Collins    public function getConf(string $key, $default = false)
24710b40067Snomadjimbob    {
248c165b184SJames Collins        $value = tpl_getConf($key, $default);
249c165b184SJames Collins
2503a385f2cSJames Collins        $data = [
2513a385f2cSJames Collins            ['keys' => ['navbarDWMenuType'],                'type' => 'choice',
2523a385f2cSJames Collins                'values' => ['both', 'icons', 'text']
2533a385f2cSJames Collins            ],
2543a385f2cSJames Collins            ['keys' => ['navbarDWMenuCombine'],             'type' => 'choice',
2553a385f2cSJames Collins                'values' => ['combine', 'seperate', 'dropdown']
2563a385f2cSJames Collins            ],
2573a385f2cSJames Collins            ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'],
2583a385f2cSJames Collins                'type' => 'choice',
2593a385f2cSJames Collins                'values' => ['none', 'custom', 'search', 'dokuwiki'],
2603a385f2cSJames Collins                'default' => [
2613a385f2cSJames Collins                    'navbarPosLeft' => 'none',
2623a385f2cSJames Collins                    'navbarPosMiddle' => 'search',
2633a385f2cSJames Collins                    'navbarPosRight' => 'dokuwiki'
2643a385f2cSJames Collins                ]
2653a385f2cSJames Collins            ],
2663a385f2cSJames Collins            ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink',
2673a385f2cSJames Collins                'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile',
2683a385f2cSJames Collins                'navbarItemShowAdmin'
2693a385f2cSJames Collins            ],
2703a385f2cSJames Collins                'type' => 'choice',
2713a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2723a385f2cSJames Collins            ],
2733a385f2cSJames Collins            ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'],
2743a385f2cSJames Collins                'type' => 'choice',
2753a385f2cSJames Collins                'values' => ['always', 'never']
2763a385f2cSJames Collins            ],
2773a385f2cSJames Collins            ['keys' => ['searchButton'],                    'type' => 'choice',
2783a385f2cSJames Collins                'values' => ['icon', 'text']
2793a385f2cSJames Collins            ],
2803a385f2cSJames Collins            ['keys' => ['breadcrumbPosition', 'youareherePosition'],
2813a385f2cSJames Collins                'type' => 'choice',
2823a385f2cSJames Collins                'values' => ['top', 'hero', 'page', 'none']
2833a385f2cSJames Collins            ],
2843a385f2cSJames Collins            ['keys' => ['youarehereHome'],                  'type' => 'choice',
2853a385f2cSJames Collins                'values' => ['page title', 'home', 'icon', 'none']
2863a385f2cSJames Collins            ],
2873a385f2cSJames Collins            ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'],
2883a385f2cSJames Collins                'type' => 'choice',
2893a385f2cSJames Collins                'values' => ['none', 'logged in user', 'search', 'content', 'tags'],
2903a385f2cSJames Collins                'default' => [
2913a385f2cSJames Collins                    'sidebarLeftRow1' => 'logged in user',
2923a385f2cSJames Collins                    'sidebarLeftRow2' => 'search',
2933a385f2cSJames Collins                    'sidebarLeftRow3' => 'content'
2943a385f2cSJames Collins                ]
2953a385f2cSJames Collins            ],
2963a385f2cSJames Collins            ['keys' => ['pageToolsFloating', 'pageToolsFooter'],
2973a385f2cSJames Collins                'type' => 'choice',
2983a385f2cSJames Collins                'values' => ['always', 'none', 'page editors']
2993a385f2cSJames Collins            ],
3003a385f2cSJames Collins            ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink',
3013a385f2cSJames Collins                'pageToolsShowTop'
3023a385f2cSJames Collins            ],
3033a385f2cSJames Collins                'type' => 'choice',
3043a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
3053a385f2cSJames Collins            ],
3063a385f2cSJames Collins            ['keys' => ['showNotifications'],               'type' => 'choice',
3073a385f2cSJames Collins                'values' => ['admin', 'always', 'none']
3083a385f2cSJames Collins            ],
3093a385f2cSJames Collins            ['keys' => ['licenseType'],                     'type' => 'choice',
3103a385f2cSJames Collins                'values' => ['badge', 'button', 'none']
3113a385f2cSJames Collins            ],
3123a385f2cSJames Collins            ['keys' => ['navbarUseTitleIcon'],              'type' => 'bool'],
3133a385f2cSJames Collins            ['keys' => ['navbarUseTitleText'],              'type' => 'bool'],
3143a385f2cSJames Collins            ['keys' => ['navbarUseTaglineText'],            'type' => 'bool'],
3153a385f2cSJames Collins            ['keys' => ['navbarShowSub'],                   'type' => 'bool'],
3163a385f2cSJames Collins            ['keys' => ['heroTitle'],                       'type' => 'bool'],
3173a385f2cSJames Collins            ['keys' => ['heroImagePropagation'],            'type' => 'bool'],
3183a385f2cSJames Collins            ['keys' => ['breadcrumbPrefix'],                'type' => 'bool'],
3193a385f2cSJames Collins            ['keys' => ['breadcrumbSep'],                   'type' => 'bool'],
3203a385f2cSJames Collins            ['keys' => ['youareherePrefix'],                'type' => 'bool'],
3213a385f2cSJames Collins            ['keys' => ['youarehereSep'],                   'type' => 'bool'],
3223a385f2cSJames Collins            ['keys' => ['sidebarShowLeft'],                 'type' => 'bool'],
3233a385f2cSJames Collins            ['keys' => ['sidebarShowRight'],                'type' => 'bool'],
3243a385f2cSJames Collins            ['keys' => ['tocFull'],                         'type' => 'bool'],
3253a385f2cSJames Collins            ['keys' => ['footerSearch'],                    'type' => 'bool'],
3263a385f2cSJames Collins            ['keys' => ['licenseImageOnly'],                'type' => 'bool'],
3273a385f2cSJames Collins            ['keys' => ['includePageUseACL'],               'type' => 'bool'],
3283a385f2cSJames Collins            ['keys' => ['includePagePropagate'],            'type' => 'bool'],
3293a385f2cSJames Collins            ['keys' => ['youarehereHideHome'],              'type' => 'bool'],
3303a385f2cSJames Collins            ['keys' => ['tagsConsolidate'],                 'type' => 'bool'],
3313a385f2cSJames Collins            ['keys' => ['footerInPage'],                    'type' => 'bool'],
3323a385f2cSJames Collins            ['keys' => ['sidebarMobileDefaultCollapse'],    'type' => 'bool'],
3333a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowLeft'],           'type' => 'bool'],
3343a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowRight'],          'type' => 'bool'],
3353a385f2cSJames Collins            ['keys' => ['searchUseTypeahead'],              'type' => 'bool'],
33612030b10SJames Collins            ['keys' => ['showLightDark'],                   'type' => 'bool'],
33734d5f19aSJames Collins            ['keys' => ['autoLightDark'],                   'type' => 'bool'],
3383a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
3393a385f2cSJames Collins
3403a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
3413a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
3423a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
3433a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
3443a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
3453a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
3463a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
3473a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
3483a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
3493a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
3503a385f2cSJames Collins
3513a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
3523a385f2cSJames Collins        ];
3533a385f2cSJames Collins
3543a385f2cSJames Collins        foreach ($data as $row) {
3553a385f2cSJames Collins            // does not check case....
3563a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
35795372bffSJames Collins                if (array_key_exists('type', $row) === true) {
3583a385f2cSJames Collins                    switch ($row['type']) {
3593a385f2cSJames Collins                        case 'bool':
3603a385f2cSJames Collins                            return (bool) $value;
3613a385f2cSJames Collins                        case 'int':
3623a385f2cSJames Collins                            return (int) $value;
3633a385f2cSJames Collins                        case 'string':
3643a385f2cSJames Collins                            return $value;
3653a385f2cSJames Collins                        case 'less':
36629118ed7SJames Collins                            $value = (bool) $value;
367a8df40efSJames Collins                            $lessAvailable = false;
368*c963c68cSJames Collins
369*c963c68cSJames Collins                            // search for less library
370*c963c68cSJames Collins                            $path = '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
371*c963c68cSJames Collins                            if (($lessAvailable = file_exists('.' . $path)) !== true) {
372*c963c68cSJames Collins                                for ($i = 0; $i < 6; $i++) {
373*c963c68cSJames Collins                                    if (($lessAvailable = file_exists($_SERVER['DOCUMENT_ROOT'] . $path)) === true) {
374*c963c68cSJames Collins                                        break;
375a8df40efSJames Collins                                    }
376a8df40efSJames Collins
377*c963c68cSJames Collins                                    $path = '/..' . $path;
378*c963c68cSJames Collins                                }
379*c963c68cSJames Collins
380*c963c68cSJames Collins                                if ($lessAvailable !== true) {
381*c963c68cSJames Collins                                    $path = '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
382*c963c68cSJames Collins                                    for ($i = 0; $i < 6; $i++) {
383*c963c68cSJames Collins                                        if (($lessAvailable = file_exists($_SERVER['DOCUMENT_ROOT'] . $path)) === true) {
384*c963c68cSJames Collins                                            break;
385*c963c68cSJames Collins                                        }
386*c963c68cSJames Collins
387*c963c68cSJames Collins                                        $path = '/..' . $path;
388*c963c68cSJames Collins                                    }
389*c963c68cSJames Collins                                }
390*c963c68cSJames Collins                            }//end if
391*c963c68cSJames Collins
392a8df40efSJames Collins                            // check for ctype extensions
3939cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
394a8df40efSJames Collins                                $lessAvailable = false;
395a8df40efSJames Collins                            }
396a8df40efSJames Collins
3979cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
398a8df40efSJames Collins                                $this->lessIgnored = true;
39929118ed7SJames Collins                                $value = false;
40029118ed7SJames Collins                            }
4013a385f2cSJames Collins
4023a385f2cSJames Collins                            return $value;
4039cff245bSJames Collins                    }//end switch
4043a385f2cSJames Collins                }//end if
4053a385f2cSJames Collins
4063a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
4073a385f2cSJames Collins                    return $value;
4083a385f2cSJames Collins                }
4093a385f2cSJames Collins
4103a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
4113a385f2cSJames Collins                    if (is_array($row['default']) === true) {
4123a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
4133a385f2cSJames Collins                            return $row['default'][$key];
4143a385f2cSJames Collins                        }
4153a385f2cSJames Collins                    } else {
4163a385f2cSJames Collins                        return $row['default'];
4173a385f2cSJames Collins                    }
4183a385f2cSJames Collins                }
4193a385f2cSJames Collins
4203a385f2cSJames Collins                return reset($row['values']);
4213a385f2cSJames Collins            }//end if
4223a385f2cSJames Collins        }//end foreach
423c165b184SJames Collins
424c165b184SJames Collins        return $value;
425c165b184SJames Collins    }
426c165b184SJames Collins
427c165b184SJames Collins
42895372bffSJames Collins    // phpcs:enable
42995372bffSJames Collins
43095372bffSJames Collins
431c165b184SJames Collins    /**
432a8eebd82SJames Collins     * Check if a page exist in directory or namespace
433c165b184SJames Collins     *
4349cff245bSJames Collins     * @param   string $page Page/namespace to search.
435a8eebd82SJames Collins     * @return  boolean      if page exists
436c165b184SJames Collins     */
4379cff245bSJames Collins    public function pageExists(string $page)
43810b40067Snomadjimbob    {
439ab45ba71SJames Collins        ob_start();
440a8eebd82SJames Collins        tpl_includeFile($page . '.html');
441ab45ba71SJames Collins        $html = ob_get_contents();
442ab45ba71SJames Collins        ob_end_clean();
443a8eebd82SJames Collins
4443a385f2cSJames Collins        if (empty($html) === false) {
4459cff245bSJames Collins            return true;
4469cff245bSJames Collins        }
447a8eebd82SJames Collins
448a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
449a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
450a8eebd82SJames Collins
4519cff245bSJames Collins        if ($propagate === true) {
4529cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4539cff245bSJames Collins                return true;
4549cff245bSJames Collins            }
4559cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4569cff245bSJames Collins            return true;
457ab45ba71SJames Collins        }
458ab45ba71SJames Collins
4599cff245bSJames Collins        return false;
460ab45ba71SJames Collins    }
461ab45ba71SJames Collins
462a8eebd82SJames Collins
463c165b184SJames Collins    /**
464a8eebd82SJames Collins     * Print or return page from directory or namespace
4652b4583abSJames Collins     *
4669cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4679cff245bSJames Collins     * @param   boolean $print        Print content.
4689cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4699cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
470ab45ba71SJames Collins     * @return  string                contents of page found
4712b4583abSJames Collins     */
4729cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4732b4583abSJames Collins    {
474a8eebd82SJames Collins        ob_start();
475a8eebd82SJames Collins        tpl_includeFile($page . '.html');
476a8eebd82SJames Collins        $html = ob_get_contents();
477a8eebd82SJames Collins        ob_end_clean();
478a8eebd82SJames Collins
4793a385f2cSJames Collins        if (empty($html) === true) {
4804f8225e4SJames Collins            global $MSG;
4814f8225e4SJames Collins
482a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
483a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
484ab45ba71SJames Collins            $html = '';
4852b4583abSJames Collins
4864f8225e4SJames Collins            ob_start();
487ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
4884f8225e4SJames Collins            $this->includedPageNotifications .= ob_get_contents();
4894f8225e4SJames Collins            ob_end_clean();
490ab45ba71SJames Collins        }
4912b4583abSJames Collins
4923a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
493ab45ba71SJames Collins            $html = $this->parseContent($html);
494ab45ba71SJames Collins        }
4952b4583abSJames Collins
4963a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
4979cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
4989cff245bSJames Collins        }
4992b4583abSJames Collins
5009cff245bSJames Collins        if ($print === true) {
5019cff245bSJames Collins            echo $html;
5029cff245bSJames Collins        }
503ab45ba71SJames Collins        return $html;
5042b4583abSJames Collins    }
5052b4583abSJames Collins
506a8eebd82SJames Collins
507a8eebd82SJames Collins    /**
508a8eebd82SJames Collins     * Print or return logged in user information
509a8eebd82SJames Collins     *
5109cff245bSJames Collins     * @param   boolean $print Print content.
511a8eebd82SJames Collins     * @return  string         user information
512a8eebd82SJames Collins     */
5139cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
51410b40067Snomadjimbob    {
515a8eebd82SJames Collins        $html = '';
516a8eebd82SJames Collins
5179cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
518a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
519a8eebd82SJames Collins            ob_start();
520a8eebd82SJames Collins            tpl_userinfo();
521a8eebd82SJames Collins            $html .= ob_get_contents();
522a8eebd82SJames Collins            ob_end_clean();
523a8eebd82SJames Collins            $html .= '</div>';
5242b4583abSJames Collins        }
525a8eebd82SJames Collins
5269cff245bSJames Collins        if ($print === true) {
5279cff245bSJames Collins            echo $html;
5289cff245bSJames Collins        }
529a8eebd82SJames Collins        return $html;
5302b4583abSJames Collins    }
5312b4583abSJames Collins
5322b4583abSJames Collins
533a8eebd82SJames Collins    /**
534a8eebd82SJames Collins     * Print or return DokuWiki Menu
535a8eebd82SJames Collins     *
5369cff245bSJames Collins     * @param   boolean $print Print content.
537a8eebd82SJames Collins     * @return  string         contents of the menu
538a8eebd82SJames Collins     */
5399cff245bSJames Collins    public function includeDWMenu(bool $print = true)
54010b40067Snomadjimbob    {
5412b4583abSJames Collins        global $lang;
5422b4583abSJames Collins        global $USERINFO;
543c165b184SJames Collins
5449cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
545a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5462b4583abSJames Collins
547ab45ba71SJames Collins        $pageToolsMenu = [];
548ab45ba71SJames Collins        $siteToolsMenu = [];
549ab45ba71SJames Collins        $userToolsMenu = [];
550c165b184SJames Collins
551ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
552ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
553ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5542b4583abSJames Collins
5552b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5562b4583abSJames Collins        foreach ($items as $item) {
5579cff245bSJames Collins            if ($item->getType() !== 'top') {
558ab45ba71SJames Collins                $itemHtml = '';
5592b4583abSJames Collins
560905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5619cff245bSJames Collins                if (
5623a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5633a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5643a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5659cff245bSJames Collins                ) {
5669cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5679cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5689cff245bSJames Collins                    if ($showIcons === true) {
5699cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5709cff245bSJames Collins                    }
5719cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5729cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5739cff245bSJames Collins                    }
574ab45ba71SJames Collins                    $itemHtml .= '</a>';
575ab45ba71SJames Collins
576ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5772b4583abSJames Collins                }
5789cff245bSJames Collins            }//end if
5799cff245bSJames Collins        }//end foreach
5802b4583abSJames Collins
581ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
582ab45ba71SJames Collins        foreach ($items as $item) {
583ab45ba71SJames Collins            $itemHtml = '';
5842b4583abSJames Collins
585905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5869cff245bSJames Collins            if (
5873a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5883a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5893a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5909cff245bSJames Collins            ) {
5919cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5929cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5939cff245bSJames Collins                if ($showIcons === true) {
5949cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5959cff245bSJames Collins                }
5969cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5979cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5989cff245bSJames Collins                }
599ab45ba71SJames Collins                $itemHtml .= '</a>';
6002b4583abSJames Collins
601ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
6022b4583abSJames Collins            }
6039cff245bSJames Collins        }//end foreach
6042b4583abSJames Collins
605ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
606ab45ba71SJames Collins        foreach ($items as $item) {
607ab45ba71SJames Collins            $itemHtml = '';
608ab45ba71SJames Collins
609905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
6109cff245bSJames Collins            if (
6113a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
6123a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
6133a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
6149cff245bSJames Collins            ) {
6159cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
6169cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
6179cff245bSJames Collins                if ($showIcons === true) {
6189cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6199cff245bSJames Collins                }
6209cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6219cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6229cff245bSJames Collins                }
623ab45ba71SJames Collins                $itemHtml .= '</a>';
624ab45ba71SJames Collins
625ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
626ab45ba71SJames Collins            }
6279cff245bSJames Collins        }//end foreach
628ab45ba71SJames Collins
629ab45ba71SJames Collins
630ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
631ab45ba71SJames Collins            case 'dropdown':
632ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6339cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6349cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6359cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6369cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6379cff245bSJames Collins                '</span>') . '</a>';
638a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
639ab45ba71SJames Collins
640ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
641ab45ba71SJames Collins                    $html .= $item;
642ab45ba71SJames Collins                }
643ab45ba71SJames Collins
644ab45ba71SJames Collins                $html .= '</div>';
645ab45ba71SJames Collins                $html .= '</li>';
646ab45ba71SJames Collins
647a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6489cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6499cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6509cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6519cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6529cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
653a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
654ab45ba71SJames Collins
655ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
656ab45ba71SJames Collins                    $html .= $item;
657ab45ba71SJames Collins                }
658ab45ba71SJames Collins
659ab45ba71SJames Collins                $html .= '</div>';
660ab45ba71SJames Collins                $html .= '</li>';
661ab45ba71SJames Collins
662a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6639cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6649cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6659cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6669cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6679cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
668a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
669ab45ba71SJames Collins
670ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
671ab45ba71SJames Collins                    $html .= $item;
672ab45ba71SJames Collins                }
673ab45ba71SJames Collins
674ab45ba71SJames Collins                $html .= '</div>';
675ab45ba71SJames Collins                $html .= '</li>';
676ab45ba71SJames Collins
677ab45ba71SJames Collins                break;
678ab45ba71SJames Collins
679ab45ba71SJames Collins            case 'combine':
680ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6819cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6829cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6839cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6849cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
685a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
686ab45ba71SJames Collins
687ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
688ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
689ab45ba71SJames Collins                    $html .= $item;
690ab45ba71SJames Collins                }
691ab45ba71SJames Collins
692ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
693ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
694ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
695ab45ba71SJames Collins                    $html .= $item;
696ab45ba71SJames Collins                }
697ab45ba71SJames Collins
698ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
699ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
700ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
701ab45ba71SJames Collins                    $html .= $item;
702ab45ba71SJames Collins                }
703ab45ba71SJames Collins
704ab45ba71SJames Collins                $html .= '</div>';
705ab45ba71SJames Collins                $html .= '</li>';
706ab45ba71SJames Collins                break;
707ab45ba71SJames Collins
708ab45ba71SJames Collins            default:    // seperate
709ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
710a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
711ab45ba71SJames Collins                }
712ab45ba71SJames Collins
713ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
714a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
715a8eebd82SJames Collins                }
716a8eebd82SJames Collins
717a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
718a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
719ab45ba71SJames Collins                }
720ab45ba71SJames Collins
721ab45ba71SJames Collins                break;
7229cff245bSJames Collins        }//end switch
723ab45ba71SJames Collins
7243a3ece10SJames Collins        $translation = plugin_load('helper', 'translation');
7253a3ece10SJames Collins        if ($translation !== null) {
7263a3ece10SJames Collins            $html .= '<li id="mikio__translate" class="mikio-nav-dropdown">';
7273a3ece10SJames Collins            $html .= '<a id="mikio_dropdown_translate" class="nav-link dropdown-toggle" href="#" role="button"
7283a3ece10SJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
7293a3ece10SJames Collins                $this->mikioInlineIcon('language') .
7303a3ece10SJames Collins                 '</a>';
7313a3ece10SJames Collins            $html .= '<div class="mikio-dropdown closed">';
7323a3ece10SJames Collins
7333a3ece10SJames Collins                $html .= $translation->showTranslations();
7343a3ece10SJames Collins
7353a3ece10SJames Collins            $html .= '</div>';
7363a3ece10SJames Collins            $html .= '</li>';
7373a3ece10SJames Collins        }
7383a3ece10SJames Collins
73912030b10SJames Collins        if ($this->getConf('showLightDark') === true) {
740d0fba6d1SJames Collins            $autoLightDark = $this->getConf('autoLightDark');
7419e41d878SJames Collins            $html .= '<li class="mikio-darklight">
7429e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' .
743d0fba6d1SJames Collins            ($autoLightDark === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') .
7449e41d878SJames Collins            $this->mikioInlineIcon('sun', 'mikio-darklight-light') .
7459e41d878SJames Collins            $this->mikioInlineIcon('moon', 'mikio-darklight-dark') .
7469e41d878SJames Collins            '</a></li>';
74712030b10SJames Collins        }
74812030b10SJames Collins
749ab45ba71SJames Collins        $html .= '</ul>';
750ab45ba71SJames Collins
7519cff245bSJames Collins        if ($print === true) {
7529cff245bSJames Collins            echo $html;
7539cff245bSJames Collins        }
754a8eebd82SJames Collins        return $html;
755a8eebd82SJames Collins    }
756a8eebd82SJames Collins
757a8eebd82SJames Collins
758a8eebd82SJames Collins    /**
759a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
760a8eebd82SJames Collins     *
7619cff245bSJames Collins     * @param string $str String to generate nav.
762a8eebd82SJames Collins     * @return string     nav elements generated
763a8eebd82SJames Collins     */
7649cff245bSJames Collins    public function stringToNav(string $str)
76510b40067Snomadjimbob    {
766a8eebd82SJames Collins        $html = '';
767a8eebd82SJames Collins
7683a385f2cSJames Collins        if (empty($str) === false) {
769a8eebd82SJames Collins            $items = explode(';', $str);
770a8eebd82SJames Collins            if (count($items) > 0) {
771a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
772a8eebd82SJames Collins                foreach ($items as $item) {
773a8eebd82SJames Collins                    $parts = explode('|', $item);
774a8eebd82SJames Collins                    if ($parts > 1) {
7759cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7769cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7779cff245bSJames Collins                            '</a></li>';
778a8eebd82SJames Collins                    }
779a8eebd82SJames Collins                }
780a8eebd82SJames Collins                $html .= '</ul>';
781a8eebd82SJames Collins            }
7822b4583abSJames Collins        }
7832b4583abSJames Collins
784ab45ba71SJames Collins        return $html;
7852b4583abSJames Collins    }
7862b4583abSJames Collins
787a8eebd82SJames Collins    /**
788ab45ba71SJames Collins     * print or return the main navbar
7892b4583abSJames Collins     *
7909cff245bSJames Collins     * @param boolean $print   Print the navbar.
7919cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
792ab45ba71SJames Collins     * @return string          generated content
7932b4583abSJames Collins     */
7949cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
79510b40067Snomadjimbob    {
796b39ad16dSJames Collins        global $conf, $USERINFO;
797d3d7d2b7SJames Collins
798d3d7d2b7SJames Collins        $homeUrl = wl();
799d3d7d2b7SJames Collins
8009cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
801d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
8023a385f2cSJames Collins            if (empty($p) === false) {
8039cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
804d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
805d3d7d2b7SJames Collins                }
806d3d7d2b7SJames Collins            }
807b39ad16dSJames Collins        } else {
8089cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
809b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
810b39ad16dSJames Collins                if (strlen($url) > 0) {
811b39ad16dSJames Collins                    $homeUrl = $url;
812d3d7d2b7SJames Collins                }
813b39ad16dSJames Collins            } else {
814b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
815b39ad16dSJames Collins                if (strlen($url) > 0) {
816b39ad16dSJames Collins                    $homeUrl = $url;
817b39ad16dSJames Collins                }
818b39ad16dSJames Collins            }
819b39ad16dSJames Collins        }
820d3d7d2b7SJames Collins
821ab45ba71SJames Collins        $html = '';
82247161538SJames Collins
8239cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
8249cff245bSJames Collins            '">';
825f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
826d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
8279cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
828ab45ba71SJames Collins            // Brand image
8299cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
8309cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
8319cff245bSJames Collins                ;
8323a385f2cSJames Collins                if (empty($logo) === false) {
833f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
834f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
835f0241fc4SJames Collins                    $styles = '';
836f0241fc4SJames Collins
837f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
8389cff245bSJames Collins                        if (ctype_digit($width) === true) {
839f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
8409cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
841f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
8429cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
8437a92c19bSJames Collins                            $styles .= 'max-width:none;';
844f0241fc4SJames Collins                        }
845f0241fc4SJames Collins
8469cff245bSJames Collins                        if (ctype_digit($height) === true) {
847f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8489cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
849f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8509cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8517a92c19bSJames Collins                            $styles .= 'max-height:none;';
852f0241fc4SJames Collins                        }
853f0241fc4SJames Collins
854f0241fc4SJames Collins                        if (strlen($styles) > 0) {
855f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
856f0241fc4SJames Collins                        }
8579cff245bSJames Collins                    }//end if
858f0241fc4SJames Collins
859f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8609cff245bSJames Collins                }//end if
8619cff245bSJames Collins            }//end if
862ab45ba71SJames Collins
863ab45ba71SJames Collins            // Brand title
8649cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
865ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
866a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8679cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
868a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
869ab45ba71SJames Collins                }
870ab45ba71SJames Collins                $html .= '</div>';
871ab45ba71SJames Collins            }
8729cff245bSJames Collins        }//end if
873ab45ba71SJames Collins        $html .= '</a>';
874660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
875ab45ba71SJames Collins
876ab45ba71SJames Collins        // Menus
877ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
878ab45ba71SJames Collins
8799cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8809cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8819cff245bSJames Collins        ];
882a8eebd82SJames Collins        foreach ($menus as $menuType) {
883a8eebd82SJames Collins            switch ($menuType) {
884a8eebd82SJames Collins                case 'custom':
885a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
886a8eebd82SJames Collins                    break;
887a8eebd82SJames Collins                case 'search':
888ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
889ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
890ab45ba71SJames Collins                    $html .= '</div>';
891a8eebd82SJames Collins                    break;
892a8eebd82SJames Collins                case 'dokuwiki':
8939cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
894a8eebd82SJames Collins                    break;
895a8eebd82SJames Collins            }
896a8eebd82SJames Collins        }
897ab45ba71SJames Collins
898ab45ba71SJames Collins        $html .= '</div>';
899f8039bf2SJames Collins        $html .= '</div>';
900ab45ba71SJames Collins        $html .= '</nav>';
901ab45ba71SJames Collins
902a8eebd82SJames Collins        // Sub Navbar
9039cff245bSJames Collins        if ($showSub === true) {
9049cff245bSJames Collins            $sub = $this->includePage('submenu', false);
9053a385f2cSJames Collins            if (empty($sub) === false) {
9069cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
9079cff245bSJames Collins            }
908ab45ba71SJames Collins        }
909ab45ba71SJames Collins
9109cff245bSJames Collins        if ($print === true) {
9119cff245bSJames Collins            echo $html;
9129cff245bSJames Collins        }
913ab45ba71SJames Collins        return $html;
914ab45ba71SJames Collins    }
915ab45ba71SJames Collins
916ab45ba71SJames Collins
917a8eebd82SJames Collins    /**
918a8eebd82SJames Collins     * Is there a sidebar
919a8eebd82SJames Collins     *
9209cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
921a8eebd82SJames Collins     * @return  boolean        if sidebar exists
922a8eebd82SJames Collins     */
9239cff245bSJames Collins    public function sidebarExists(string $prefix = '')
92410b40067Snomadjimbob    {
925a8eebd82SJames Collins        global $conf;
926a8eebd82SJames Collins
9273a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9289cff245bSJames Collins            $prefix = '';
9299cff245bSJames Collins        }
930a8eebd82SJames Collins
931a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
932a8eebd82SJames Collins    }
933a8eebd82SJames Collins
934a8eebd82SJames Collins
935a8eebd82SJames Collins    /**
936ab45ba71SJames Collins     * Print or return the sidebar content
937ab45ba71SJames Collins     *
9389cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
9399cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
9409cff245bSJames Collins     * @param   boolean $parse  Parse the content.
941ab45ba71SJames Collins     * @return  string          generated content
942ab45ba71SJames Collins     */
9439cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
94410b40067Snomadjimbob    {
945ab45ba71SJames Collins        global $conf, $ID;
946ab45ba71SJames Collins
947ab45ba71SJames Collins        $html = '';
948ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
949ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
950ab45ba71SJames Collins
9513a385f2cSJames Collins        if (empty($confPrefix) === true) {
9529cff245bSJames Collins            $confPrefix = 'Left';
9539cff245bSJames Collins        }
9541cdedf28SJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9559cff245bSJames Collins            $prefix = '';
9569cff245bSJames Collins        }
957ab45ba71SJames Collins
9581cdedf28SJames Collins        $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
959ab45ba71SJames Collins
9609cff245bSJames Collins        if (
9619cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9621cdedf28SJames Collins            p_get_metadata($ID, 'nosidebar', false) === null
9639cff245bSJames Collins        ) {
9649cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9653a385f2cSJames Collins            if (empty($content) === false) {
9669cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9679cff245bSJames Collins            }
968ab45ba71SJames Collins
9693a385f2cSJames Collins            if (empty($prefix) === true) {
9709cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9719cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9729cff245bSJames Collins                ];
973ab45ba71SJames Collins
974a8eebd82SJames Collins                foreach ($rows as $row) {
975a8eebd82SJames Collins                    switch ($row) {
976a8eebd82SJames Collins                        case 'search':
9779cff245bSJames Collins                            $html .= $this->includeSearch(false);
978a8eebd82SJames Collins                            break;
979a8eebd82SJames Collins                        case 'logged in user':
9809cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
981a8eebd82SJames Collins                            break;
982a8eebd82SJames Collins                        case 'content':
9839cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9843a385f2cSJames Collins                            if (empty($content) === false) {
9859cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9869cff245bSJames Collins                            }
987a8eebd82SJames Collins                            break;
988a8eebd82SJames Collins                        case 'tags':
989a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
990a8eebd82SJames Collins                    }
991a8eebd82SJames Collins                }
992a8eebd82SJames Collins            } else {
9939cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
9943a385f2cSJames Collins                if (empty($content) === false) {
9959cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9969cff245bSJames Collins                }
9979cff245bSJames Collins            }//end if
9989cff245bSJames Collins
9999cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
10003a385f2cSJames Collins            if (empty($content) === false) {
10019cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
10029cff245bSJames Collins            }
10039cff245bSJames Collins        }//end if
10049cff245bSJames Collins
10053a385f2cSJames Collins        if (empty($html) === true) {
10063a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
10079cff245bSJames Collins                $html = '&nbsp;';
10089cff245bSJames Collins            }
10099cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
10109cff245bSJames Collins                $html = '&nbsp;';
10119cff245bSJames Collins            }
1012a8eebd82SJames Collins        }
1013ab45ba71SJames Collins
10143a385f2cSJames Collins        if (empty($html) === false) {
10151cdedf28SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) .
10169cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
10179cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
10189cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
10199cff245bSJames Collins                $html . '</div></aside>';
1020ab45ba71SJames Collins        }
1021ab45ba71SJames Collins
10229cff245bSJames Collins        if ($parse === true) {
10239cff245bSJames Collins            $html = $this->includeIcons($html);
10243a04a100SJames Collins        }
10259cff245bSJames Collins        if ($print === true) {
10269cff245bSJames Collins            echo $html;
1027ab45ba71SJames Collins        }
10284f8225e4SJames Collins
1029ab45ba71SJames Collins        return $html;
1030ab45ba71SJames Collins    }
1031ab45ba71SJames Collins
1032ab45ba71SJames Collins
1033a8eebd82SJames Collins    /**
1034ab45ba71SJames Collins     * Print or return the page tools content
1035ab45ba71SJames Collins     *
10369cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
10379cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
1038ab45ba71SJames Collins     * @return  string             generated content
1039ab45ba71SJames Collins     */
10409cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
104110b40067Snomadjimbob    {
10421293ce10SJames Collins        global $USERINFO;
10431293ce10SJames Collins
10449cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
1045ab45ba71SJames Collins        $html = '';
1046ab45ba71SJames Collins
10479cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
1048b9c0582bSJames Collins        $html .= '<ul class="tools">';
1049ab45ba71SJames Collins
1050ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1051ab45ba71SJames Collins        foreach ($items as $item) {
10529cff245bSJames Collins            $classes = [];
10533fd763a0SJames Collins            $classes[] = $item->getType();
10543fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10553fd763a0SJames Collins
10569cff245bSJames Collins            if (empty($attr['class']) === false) {
10573fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1058ab45ba71SJames Collins            }
1059ab45ba71SJames Collins
10603fd763a0SJames Collins            $classes = array_unique($classes);
10613fd763a0SJames Collins
1062f02b8ab5SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()), 'always');
10639cff245bSJames Collins            if (
10643a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10653a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10663a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10679cff245bSJames Collins            ) {
10683fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10699cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10709cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10719cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10723fd763a0SJames Collins                $html .= '</li>';
10733fd763a0SJames Collins            }
10749cff245bSJames Collins        }//end foreach
10753fd763a0SJames Collins
10763fd763a0SJames Collins        $html .= '</ul>';
1077ab45ba71SJames Collins        $html .= '</nav>';
1078ab45ba71SJames Collins
10799cff245bSJames Collins        if ($print === true) {
10809cff245bSJames Collins            echo $html;
10819cff245bSJames Collins        }
1082ab45ba71SJames Collins        return $html;
1083ab45ba71SJames Collins    }
1084ab45ba71SJames Collins
1085ab45ba71SJames Collins
1086a8eebd82SJames Collins    /**
1087a8eebd82SJames Collins     * Print or return the search bar
1088a8eebd82SJames Collins     *
10899cff245bSJames Collins     * @param   boolean $print Print content.
1090a8eebd82SJames Collins     * @return  string         contents of the search bar
1091a8eebd82SJames Collins     */
10929cff245bSJames Collins    public function includeSearch(bool $print = true)
109310b40067Snomadjimbob    {
10949cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1095ab45ba71SJames Collins        $html = '';
1096ab45ba71SJames Collins
10979cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
10989cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1099a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1100a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1101c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
11029cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1103c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1104c1cb9f15SChris MacMackin        }
11059cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
11063a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1107a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
11083a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1109a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1110ab45ba71SJames Collins        } else {
1111ab45ba71SJames Collins            $html .= $lang['btn_search'];
1112ab45ba71SJames Collins        }
1113ab45ba71SJames Collins        $html .= '</button>';
1114ab45ba71SJames Collins        $html .= '</form>';
1115ab45ba71SJames Collins
11169cff245bSJames Collins        if ($print === true) {
11179cff245bSJames Collins            echo $html;
11189cff245bSJames Collins        }
1119ab45ba71SJames Collins        return $html;
1120ab45ba71SJames Collins    }
1121ab45ba71SJames Collins
1122ab45ba71SJames Collins
1123a8eebd82SJames Collins    /**
1124a8eebd82SJames Collins     * Print or return content
1125a8eebd82SJames Collins     *
11269cff245bSJames Collins     * @param   boolean $print Print content.
1127a8eebd82SJames Collins     * @return  string         contents
1128a8eebd82SJames Collins     */
11299cff245bSJames Collins    public function includeContent(bool $print = true)
113010b40067Snomadjimbob    {
1131ab45ba71SJames Collins        ob_start();
11329cff245bSJames Collins        tpl_content(false);
1133ab45ba71SJames Collins        $html = ob_get_contents();
1134ab45ba71SJames Collins        ob_end_clean();
1135ab45ba71SJames Collins
1136ab45ba71SJames Collins        $html = $this->includeIcons($html);
1137ab45ba71SJames Collins        $html = $this->parseContent($html);
1138ab45ba71SJames Collins
1139ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1140ab45ba71SJames Collins
11419cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
11429cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
11439cff245bSJames Collins        }
1144a8eebd82SJames Collins
1145a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1146a8eebd82SJames Collins
11479cff245bSJames Collins        if ($print === true) {
11489cff245bSJames Collins            echo $html;
11499cff245bSJames Collins        }
1150ab45ba71SJames Collins        return $html;
1151ab45ba71SJames Collins    }
1152ab45ba71SJames Collins
1153a8eebd82SJames Collins    /**
1154ab45ba71SJames Collins     * Print or return footer
1155ab45ba71SJames Collins     *
11569cff245bSJames Collins     * @param   boolean $print Print footer.
11579cff245bSJames Collins     * @return  string         HTML string containing footer
1158ab45ba71SJames Collins     */
11599cff245bSJames Collins    public function includeFooter(bool $print = true)
116010b40067Snomadjimbob    {
1161ab45ba71SJames Collins        global $ACT;
1162ab45ba71SJames Collins
1163ab45ba71SJames Collins        $html = '';
1164ab45ba71SJames Collins
1165ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11669cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11679cff245bSJames Collins        $html .= $this->includePage('footer', false);
1168ab45ba71SJames Collins
1169a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1170ab45ba71SJames Collins
11719cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1172ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11739cff245bSJames Collins            $html .= $this->includeSearch(false);
1174ab45ba71SJames Collins            $html .= '</div>';
1175ab45ba71SJames Collins        }
1176ab45ba71SJames Collins
1177a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11789cff245bSJames Collins        if (
11793a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
11803a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11819cff245bSJames Collins        ) {
11829cff245bSJames Collins            $html .= $this->includePageTools(false);
11839cff245bSJames Collins        }
1184ab45ba71SJames Collins
11859cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11869cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1187ab45ba71SJames Collins
1188ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11899cff245bSJames Collins        if ($licenseType !== 'none') {
11909cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1191ab45ba71SJames Collins        }
1192ab45ba71SJames Collins
1193ab45ba71SJames Collins        $html .= '</footer>';
1194ab45ba71SJames Collins
11959cff245bSJames Collins        if ($print === true) {
11969cff245bSJames Collins            echo $html;
11979cff245bSJames Collins        }
1198ab45ba71SJames Collins        return $html;
1199ab45ba71SJames Collins    }
1200ab45ba71SJames Collins
1201ab45ba71SJames Collins
1202a8eebd82SJames Collins    /**
1203ab45ba71SJames Collins     * Print or return breadcrumb trail
1204ab45ba71SJames Collins     *
12059cff245bSJames Collins     * @param   boolean $print Print out trail.
12069cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12079cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1208ab45ba71SJames Collins     */
12099cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
121010b40067Snomadjimbob    {
1211a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1212a8eebd82SJames Collins
12133a385f2cSJames Collins        if (
12143a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
121595372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
12163a385f2cSJames Collins        ) {
12179cff245bSJames Collins            return '';
12189cff245bSJames Collins        }
1219ab45ba71SJames Collins
1220ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1221f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
12223a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
122395372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
12249cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1225ab45ba71SJames Collins                    ob_start();
122675adba86SJames Collins                    tpl_breadcrumbs();
1227ab45ba71SJames Collins                    $html .= ob_get_contents();
1228ab45ba71SJames Collins                    ob_end_clean();
1229ab45ba71SJames Collins                } else {
1230ab45ba71SJames Collins                    $sep = '•';
1231ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1232ab45ba71SJames Collins
12339cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1234ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
12359cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1236ab45ba71SJames Collins
12379cff245bSJames Collins                        if ($img !== false) {
1238ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1239ab45ba71SJames Collins                        }
124047161538SJames Collins                    }
124147161538SJames Collins
12429cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1243ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
12449cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1245ab45ba71SJames Collins
12469cff245bSJames Collins                        if ($img !== false) {
1247ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1248ab45ba71SJames Collins                        }
1249ab45ba71SJames Collins                    }
1250ab45ba71SJames Collins
1251ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1252ab45ba71SJames Collins
1253ab45ba71SJames Collins                    $html .= '<ul>';
12543a385f2cSJames Collins                    if (empty($prefix) === false) {
12559cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12569cff245bSJames Collins                    }
1257ab45ba71SJames Collins
1258ab45ba71SJames Collins                    $last = count($crumbs);
1259ab45ba71SJames Collins                    $i    = 0;
1260ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1261ab45ba71SJames Collins                        $i++;
126295372bffSJames Collins                        if ($i !== 1) {
1263ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
126495372bffSJames Collins                        }
12659cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12669cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1267ab45ba71SJames Collins                        $html .= '</li>';
1268ab45ba71SJames Collins                    }
1269ab45ba71SJames Collins
1270ab45ba71SJames Collins                    $html .= '</ul>';
12719cff245bSJames Collins                }//end if
12729cff245bSJames Collins            }//end if
12739cff245bSJames Collins        }//end if
12743d11a778SJames Collins
12753d11a778SJames Collins        $html .= '</div>';
12763d11a778SJames Collins        $html .= '</div>';
12773d11a778SJames Collins
12789cff245bSJames Collins        if ($parse === true) {
12799cff245bSJames Collins            $html = $this->includeIcons($html);
12809cff245bSJames Collins        }
12819cff245bSJames Collins        if ($print === true) {
12829cff245bSJames Collins            echo $html;
12839cff245bSJames Collins        }
12843d11a778SJames Collins        return $html;
12853d11a778SJames Collins    }
12863d11a778SJames Collins
12873d11a778SJames Collins    /**
12883d11a778SJames Collins     * Print or return you are here trail
12893d11a778SJames Collins     *
12909cff245bSJames Collins     * @param   boolean $print Print out trail.
12919cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12929cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12933d11a778SJames Collins     */
12949cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12953d11a778SJames Collins    {
12963d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
12973d11a778SJames Collins
12983a385f2cSJames Collins        if (
12993a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
130095372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
13013a385f2cSJames Collins        ) {
13029cff245bSJames Collins            return '';
13039cff245bSJames Collins        }
13043d11a778SJames Collins
13053d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
13063d11a778SJames Collins        $html .= '<div class="mikio-container">';
13073a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
130895372bffSJames Collins            if ($conf['youarehere'] !== 0) {
13099cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
131095372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1311ab45ba71SJames Collins                    ob_start();
131275adba86SJames Collins                    tpl_youarehere();
1313ab45ba71SJames Collins                    $html .= ob_get_contents();
1314ab45ba71SJames Collins                    ob_end_clean();
131595372bffSJames Collins                    $html .= '</div>';
1316ab45ba71SJames Collins                } else {
1317ab45ba71SJames Collins                    $sep = ' » ';
1318ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1319ab45ba71SJames Collins
13209cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
13213d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
13229cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1323ab45ba71SJames Collins
13249cff245bSJames Collins                        if ($img !== false) {
1325ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1326ab45ba71SJames Collins                        }
132775adba86SJames Collins                    }
132875adba86SJames Collins
13299cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
13303d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
13319cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1332ab45ba71SJames Collins
13339cff245bSJames Collins                        if ($img !== false) {
1334ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
133575adba86SJames Collins                        }
133647161538SJames Collins                    }
133747161538SJames Collins
1338ab45ba71SJames Collins                    $html .= '<ul>';
13393a385f2cSJames Collins                    if (empty($prefix) === false) {
13409cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
13419cff245bSJames Collins                    }
13429cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1343ab45ba71SJames Collins
1344ab45ba71SJames Collins                    $parts = explode(':', $ID);
1345ab45ba71SJames Collins                    $count = count($parts);
1346ab45ba71SJames Collins
1347ab45ba71SJames Collins                    $part = '';
13489cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1349ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1350ab45ba71SJames Collins                        $page = $part;
13519cff245bSJames Collins                        if ($page === $conf['start']) {
13529cff245bSJames Collins                            continue;
13539cff245bSJames Collins                        }
1354ab45ba71SJames Collins
1355ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
13569cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1357ab45ba71SJames Collins                    }
1358ab45ba71SJames Collins
1359ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
13609cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1361ab45ba71SJames Collins                        $page = $part . $parts[$i];
13629cff245bSJames Collins                        if ($page !== $conf['start']) {
1363ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
13649cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1365ab45ba71SJames Collins                        }
1366ab45ba71SJames Collins                    }
1367ab45ba71SJames Collins
1368ab45ba71SJames Collins                    $html .= '</ul>';
13699cff245bSJames Collins                }//end if
13709cff245bSJames Collins            }//end if
1371ab45ba71SJames Collins
13723d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13739cff245bSJames Collins            if ($showLast !== 0) {
1374a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13759cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1376a8eebd82SJames Collins                    $count = count($matches[0]);
1377a8eebd82SJames Collins                    $list = '';
1378a8eebd82SJames Collins
1379a8eebd82SJames Collins                    // Show Home
1380a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1381a8eebd82SJames Collins
1382a8eebd82SJames Collins                    $list .= '<li>...</li>';
13839cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1384a8eebd82SJames Collins                        $list .= $matches[0][$i];
1385a8eebd82SJames Collins                    }
1386a8eebd82SJames Collins
1387a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1388a8eebd82SJames Collins                }
1389a8eebd82SJames Collins            }
1390a8eebd82SJames Collins
13913d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1392a8eebd82SJames Collins                case 'none':
1393a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1394a8eebd82SJames Collins                    break;
1395a8eebd82SJames Collins                case 'home':
1396a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1397a8eebd82SJames Collins                    break;
1398a8eebd82SJames Collins                case 'icon':
13999cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
14009cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1401a8eebd82SJames Collins                    break;
1402a8eebd82SJames Collins            }
1403a8eebd82SJames Collins        } else {
1404a8eebd82SJames Collins            $html .= '&#8810; ';
14059cff245bSJames Collins            if (isset($_GET['page']) === true) {
14069cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1407a8eebd82SJames Collins            }
14084057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
14099cff245bSJames Collins        }//end if
14109cff245bSJames Collins
14119cff245bSJames Collins        $html .= '</div>';
14129cff245bSJames Collins        $html .= '</div>';
14139cff245bSJames Collins
14149cff245bSJames Collins        if ($parse === true) {
14159cff245bSJames Collins            $html = $this->includeIcons($html);
1416a8eebd82SJames Collins        }
14179cff245bSJames Collins        if ($print === true) {
14189cff245bSJames Collins            echo $html;
14199cff245bSJames Collins        }
1420ab45ba71SJames Collins        return $html;
1421ab45ba71SJames Collins    }
1422ab45ba71SJames Collins
14231785fc73SJames Collins    /**
14241785fc73SJames Collins     * Get Page Title
14259cff245bSJames Collins     *
14269cff245bSJames Collins     * @return string page title
14271785fc73SJames Collins     */
142810b40067Snomadjimbob    public function parsePageTitle()
142910b40067Snomadjimbob    {
14302060e56cSJames Collins        global $ID;
14312060e56cSJames Collins
14322060e56cSJames Collins        $title = p_get_first_heading($ID);
14339cff245bSJames Collins        if (strlen($title) <= 0) {
14349cff245bSJames Collins            $title = tpl_pagetitle(null, true);
14359cff245bSJames Collins        }
14361785fc73SJames Collins        $title = $this->includeIcons($title);
14371785fc73SJames Collins
14381785fc73SJames Collins        return $title;
14391785fc73SJames Collins    }
14401785fc73SJames Collins
1441ab45ba71SJames Collins
144275adba86SJames Collins    /**
1443a8eebd82SJames Collins     * Print or return hero block
144475adba86SJames Collins     *
14459cff245bSJames Collins     * @param   boolean $print Print content.
1446a8eebd82SJames Collins     * @return  string         contents of hero
144775adba86SJames Collins     */
14489cff245bSJames Collins    public function includeHero(bool $print = true)
144910b40067Snomadjimbob    {
1450a8eebd82SJames Collins        $html = '';
145147161538SJames Collins
14529cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1453a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1454f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1455a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
14563a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
14579cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
14589cff245bSJames Collins            }
14593a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
14609cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
14619cff245bSJames Collins            }
1462ab45ba71SJames Collins
1463a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
14641785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1465a8eebd82SJames Collins            $html .= '</h1>';
1466a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1467a8eebd82SJames Collins            $html .= '</div>';
146847161538SJames Collins
14699cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1470a8eebd82SJames Collins            $hero_image_resize_class = '';
14713a385f2cSJames Collins            if (empty($hero_image) === false) {
1472a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1473a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
147447161538SJames Collins            }
1475a8eebd82SJames Collins
14769cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14779cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1478a8eebd82SJames Collins
1479a8eebd82SJames Collins            $html .= '</div>';
1480f8039bf2SJames Collins            $html .= '</div>';
14819cff245bSJames Collins        }//end if
14829cff245bSJames Collins
14839cff245bSJames Collins        if ($print === true) {
14849cff245bSJames Collins            echo $html;
148575adba86SJames Collins        }
1486a8eebd82SJames Collins
1487a8eebd82SJames Collins        return $html;
148875adba86SJames Collins    }
148975adba86SJames Collins
149075adba86SJames Collins
149175adba86SJames Collins    /**
1492a8eebd82SJames Collins     * Print or return out TOC
149375adba86SJames Collins     *
14949cff245bSJames Collins     * @param   boolean $print Print TOC.
14959cff245bSJames Collins     * @param   boolean $parse Parse icons.
1496a8eebd82SJames Collins     * @return  string         contents of TOC
149775adba86SJames Collins     */
14989cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
149910b40067Snomadjimbob    {
1500ab45ba71SJames Collins        $html = '';
15012b4583abSJames Collins
1502ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1503ab45ba71SJames Collins
15043a385f2cSJames Collins        if (empty($tocHtml) === false) {
1505f65a4e5eSJames Collins            $tocHtml = preg_replace(
1506f65a4e5eSJames Collins                '/(<h3.+?toggle.+?>)(.+?)<\/h3>/',
1507f65a4e5eSJames Collins                '$1' .
1508f65a4e5eSJames Collins                $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' .
1509f65a4e5eSJames Collins                $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>',
1510f65a4e5eSJames Collins                $tocHtml
1511f65a4e5eSJames Collins            );
1512ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1513a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1514ab45ba71SJames Collins
1515ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1516ab45ba71SJames Collins            $html .= $tocHtml;
1517ab45ba71SJames Collins            $html .= '</div>';
15182b4583abSJames Collins        }
15192b4583abSJames Collins
15209cff245bSJames Collins        if ($parse === true) {
15219cff245bSJames Collins            $html = $this->includeIcons($html);
15229cff245bSJames Collins        }
15239cff245bSJames Collins
15249cff245bSJames Collins        if ($print === true) {
1525ab45ba71SJames Collins            echo $html;
1526ab45ba71SJames Collins        }
1527ab45ba71SJames Collins
15289cff245bSJames Collins        return $html;
15299cff245bSJames Collins    }
15309cff245bSJames Collins
1531ab45ba71SJames Collins
1532a8eebd82SJames Collins    /**
1533ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1534ab45ba71SJames Collins     *
15359cff245bSJames Collins     * @param   string $str Content to parse.
1536ab45ba71SJames Collins     * @return  string      parsed string
1537ab45ba71SJames Collins     */
15389cff245bSJames Collins    public function includeIcons(string $str)
153910b40067Snomadjimbob    {
1540ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1541ab45ba71SJames Collins
1542ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
15433a385f2cSJames Collins        if (empty($iconTag) === true) {
15449cff245bSJames Collins            return $str;
15459cff245bSJames Collins        }
1546ab45ba71SJames Collins
15479cff245bSJames Collins        if (
15489cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
15493a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
15509cff245bSJames Collins        ) {
1551a2005a27SJames Collins            $content = $str;
1552a2005a27SJames Collins            $preview = null;
1553a2005a27SJames Collins
15543a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15559cff245bSJames Collins                $html = new \simple_html_dom();
1556a2005a27SJames Collins                $html->stripRNAttrValues = false;
1557a2005a27SJames Collins                $html->load($str, true, false);
1558a2005a27SJames Collins
1559a2005a27SJames Collins                $preview = $html->find('div.preview');
15609cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1561a2005a27SJames Collins                    $content = $preview[0]->innertext;
1562a2005a27SJames Collins                }
1563a2005a27SJames Collins            }
1564a2005a27SJames Collins
15651785fc73SJames Collins            $page_regex = '/(.*)/';
15669cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
15671785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
15681785fc73SJames Collins            }
15691785fc73SJames Collins
15701785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1571a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1572a2005a27SJames Collins
157310b40067Snomadjimbob                return preg_replace_callback(
157410b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1575ab45ba71SJames Collins                    function ($matches) {
1576ab45ba71SJames Collins                        global $MIKIO_ICONS;
1577ab45ba71SJames Collins
1578ab45ba71SJames Collins                        $s = $matches[0];
1579ab45ba71SJames Collins
1580ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1581ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1582ab45ba71SJames Collins
1583ab45ba71SJames Collins                            if (count($matches) > 1) {
1584ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1585ab45ba71SJames Collins
1586ab45ba71SJames Collins                                if (count($e) > 1) {
1587ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15889cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1589ab45ba71SJames Collins                                            $icon = $iconItem;
1590ab45ba71SJames Collins
1591ab45ba71SJames Collins                                            $s = $icon['insert'];
1592ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
15931cdedf28SJames Collins                                                if (count($e) < $i || empty($e[$i]) === true) {
15949cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1595ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1596ab45ba71SJames Collins                                                    }
1597ab45ba71SJames Collins                                                } else {
1598ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1599ab45ba71SJames Collins                                                }
1600ab45ba71SJames Collins                                            }
1601ab45ba71SJames Collins
1602ab45ba71SJames Collins                                            $dir = '';
16039cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
16049cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
16059cff245bSJames Collins                                            }
1606ab45ba71SJames Collins
1607ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1608ab45ba71SJames Collins
1609ab45ba71SJames Collins                                            break;
16109cff245bSJames Collins                                        }//end if
16119cff245bSJames Collins                                    }//end foreach
1612ab45ba71SJames Collins                                } else {
1613ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
16149cff245bSJames Collins                                }//end if
16159cff245bSJames Collins                            }//end if
16169cff245bSJames Collins                        }//end if
161775adba86SJames Collins
1618ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
16199cff245bSJames Collins                        if ($count === 0) {
1620ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1621ab45ba71SJames Collins                        }
1622ab45ba71SJames Collins
1623ab45ba71SJames Collins                        return $s;
1624ab45ba71SJames Collins                    },
162510b40067Snomadjimbob                    $icons[0]
162610b40067Snomadjimbob                );
1627a2005a27SJames Collins            }, $content);
1628a2005a27SJames Collins
16293a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
16309cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1631a2005a27SJames Collins                    $preview[0]->innertext = $content;
1632a2005a27SJames Collins                }
1633a2005a27SJames Collins
1634a2005a27SJames Collins                $str = $html->save();
1635a2005a27SJames Collins                $html->clear();
1636a2005a27SJames Collins                unset($html);
1637a2005a27SJames Collins            } else {
1638a2005a27SJames Collins                $str = $content;
1639a2005a27SJames Collins            }
16409cff245bSJames Collins        }//end if
1641ab45ba71SJames Collins
1642ab45ba71SJames Collins        return $str;
1643ab45ba71SJames Collins    }
164447161538SJames Collins
1645c165b184SJames Collins    /**
1646a8eebd82SJames Collins     * Parse HTML for theme
1647c165b184SJames Collins     *
16489cff245bSJames Collins     * @param   string $content HTML content to parse.
1649a8eebd82SJames Collins     * @return  string          Parsed content
1650c165b184SJames Collins     */
16519cff245bSJames Collins    public function parseContent(string $content)
165210b40067Snomadjimbob    {
1653ab45ba71SJames Collins        global $INPUT, $ACT;
1654ab45ba71SJames Collins
1655a8eebd82SJames Collins        // Add Mikio Section titles
16563a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
16579cff245bSJames Collins            $admin_sections = [
1658ab45ba71SJames Collins                // Section      Insert Before                 Icon
16599cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
16609cff245bSJames Collins                'search'        => ['searchButton',            ''],
16619cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
16629cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
16639cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
16649cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
16659cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
16669cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
16679cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
16689cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
16699cff245bSJames Collins                'license'       => ['licenseType',             ''],
16709cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
16719cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
16729cff245bSJames Collins            ];
1673ab45ba71SJames Collins
1674ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1675ab45ba71SJames Collins                $search = $items[0];
1676ab45ba71SJames Collins                $icon   = $items[1];
1677ab45ba71SJames Collins
167810b40067Snomadjimbob                $content = preg_replace(
1679adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16809cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16819cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16829cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16839cff245bSJames Collins                        $search . '</span>',
168410b40067Snomadjimbob                    $content
168510b40067Snomadjimbob                );
1686ab45ba71SJames Collins            }
1687bb5a3dd1SJames Collins        } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) {
1688ad182e6dSnomadjimbob            $mikioPluginMissing = true;
1689ad182e6dSnomadjimbob            /* Hide plugin fields if not installed */
16909ffe9161Snomadjimbob            if (plugin_load('action', 'mikioplugin') !== null) {
1691ad182e6dSnomadjimbob                $mikioPluginMissing = false;
1692ad182e6dSnomadjimbob            }
1693ad182e6dSnomadjimbob
1694cee81679SJames Collins            $style_headers = [
1695f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__text_'],
1696f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__code_'],
1697f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__control_'],
1698f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__topheader_'],
1699f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__navbar_'],
1700f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'],
1701f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__tag_background_color_'],
1702f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'],
1703f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__hero_'],
1704f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__sidebar_'],
1705f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__content_'],
1706f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__toc_'],
1707f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__pagetools_'],
1708f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__footer_'],
1709f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__table_'],
1710f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__dropdown_'],
1711f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__section_edit_'],
1712f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__tree_'],
1713f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__tab_'],
1714ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2',
17159ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17169ffe9161Snomadjimbob                ],
1717ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing],
1718ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_',
17199ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17209ffe9161Snomadjimbob                ],
1721ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing],
1722ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing],
1723ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing],
1724ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing],
1725ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing],
1726ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing],
1727ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing],
1728ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing],
1729ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing],
1730ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing],
1731ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing],
1732cee81679SJames Collins                ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'],
1733f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__darkmode_text_'],
1734f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__darkmode_code_'],
1735f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__darkmode_control_'],
1736f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'],
1737f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'],
1738f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'],
1739f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'],
1740f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'],
1741f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'],
1742f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'],
1743f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__darkmode_content_'],
1744f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'],
1745f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'],
1746f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'],
1747f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__darkmode_table_'],
1748f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'],
1749f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'],
1750f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'],
1751f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'],
1752ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2',
17539ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17549ffe9161Snomadjimbob                ],
1755ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_',
17569ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17579ffe9161Snomadjimbob                ],
1758ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_',
17599ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17609ffe9161Snomadjimbob                ],
1761ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_',
17629ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17639ffe9161Snomadjimbob                ],
1764ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_',
17659ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17669ffe9161Snomadjimbob                ],
1767ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_',
17689ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17699ffe9161Snomadjimbob                ],
1770ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_',
17719ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17729ffe9161Snomadjimbob                ],
1773ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_',
17749ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17759ffe9161Snomadjimbob                ],
1776ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_',
17779ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17789ffe9161Snomadjimbob                ],
1779ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_',
17809ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17819ffe9161Snomadjimbob                ],
1782ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_',
17839ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17849ffe9161Snomadjimbob                ],
1785ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing],
1786ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_',
17879ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17889ffe9161Snomadjimbob                ],
1789ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing],
1790cee81679SJames Collins            ];
1791cee81679SJames Collins
1792cee81679SJames Collins            foreach ($style_headers as $header) {
1793cee81679SJames Collins                if (array_key_exists('heading', $header) === false) {
1794cee81679SJames Collins                    $header['heading'] = 'h3';
1795cee81679SJames Collins                }
1796cee81679SJames Collins
1797ad182e6dSnomadjimbob                if (array_key_exists('hidden', $header) === false) {
1798ad182e6dSnomadjimbob                    $header['hidden'] = false;
1799ad182e6dSnomadjimbob                }
1800ad182e6dSnomadjimbob
18011244e3ceSJames Collins                $content = preg_replace(
1802f65a4e5eSJames Collins                    '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s',
18039ffe9161Snomadjimbob                    '</tbody></table><' . $header['heading'] . ' style="display:' .
18049ffe9161Snomadjimbob                    ($header['hidden'] === true ? 'none' : 'block') . '">' .
18059ffe9161Snomadjimbob                    $header['title'] . '</' . $header['heading'] . '>
1806ad182e6dSnomadjimbob                    <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1',
18071244e3ceSJames Collins                    $content,
18081244e3ceSJames Collins                    1
18091244e3ceSJames Collins                );
1810cee81679SJames Collins            }
1811f65a4e5eSJames Collins
1812dea1f088SJames Collins            $content = preg_replace_callback('/<input type="color"[^>]*>/', function ($match) {
1813dea1f088SJames Collins                // Get the ID of the <input type="color"> element
1814dea1f088SJames Collins                preg_match('/id="([^"]*)"/', $match[0], $matches);
1815dea1f088SJames Collins
1816dea1f088SJames Collins                // Replace type with text and remove the id attribute
18172c87ab0dSJames Collins                $replacement = preg_replace(
18182c87ab0dSJames Collins                    ['/type="color"/', '/id="([^"]*)"/'],
18192c87ab0dSJames Collins                    ['type="text" class="mikio-color-text-input"', 'for="$1"'],
18202c87ab0dSJames Collins                    $match[0]
18212c87ab0dSJames Collins                );
1822dea1f088SJames Collins
1823dea1f088SJames Collins                return '<div class="mikio-color-picker">' . $replacement . $match[0] . '</div>';
1824dea1f088SJames Collins            }, $content);
1825bb5a3dd1SJames Collins        }//end if
1826ab45ba71SJames Collins
18273a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1828a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1829a8eebd82SJames Collins        }
1830ab45ba71SJames Collins
1831a8eebd82SJames Collins        // Page Revisions - Table Fix
18329cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
18339cff245bSJames Collins            $content = preg_replace(
18349cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
18359cff245bSJames Collins                '<span>$1</span>',
18369cff245bSJames Collins                $content
18379cff245bSJames Collins            );
1838a8eebd82SJames Collins        }
1839ab45ba71SJames Collins
18409cff245bSJames Collins        $html = new \simple_html_dom();
1841bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1842c165b184SJames Collins        $html->load($content, true, false);
1843c165b184SJames Collins
18449cff245bSJames Collins        if ($html === false) {
18459cff245bSJames Collins            return $content;
18469cff245bSJames Collins        }
1847ab45ba71SJames Collins
1848ab45ba71SJames Collins        /* Buttons */
1849ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1850ab45ba71SJames Collins            $c = explode(' ', $node->class);
18519cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
18529cff245bSJames Collins                $c[] = 'mikio-button';
18539cff245bSJames Collins            }
1854ab45ba71SJames Collins            $node->class = implode(' ', $c);
1855c165b184SJames Collins        }
1856c165b184SJames Collins
1857ab45ba71SJames Collins
1858ab45ba71SJames Collins        /* Buttons - Primary */
1859ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1860ab45ba71SJames Collins            $c = explode(' ', $node->class);
18619cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
18629cff245bSJames Collins                $c[] = 'mikio-primary';
18639cff245bSJames Collins            }
1864ab45ba71SJames Collins            $node->class = implode(' ', $c);
1865ab45ba71SJames Collins        }
1866ab45ba71SJames Collins
1867a8eebd82SJames Collins        /* Hide page title if hero is enabled */
18689cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
18691785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
187047161538SJames Collins
187147161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
18729cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1873a8eebd82SJames Collins                    // $elm->innertext = '';
1874a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1875a8eebd82SJames Collins
187647161538SJames Collins                    break;
187747161538SJames Collins                }
187847161538SJames Collins            }
187947161538SJames Collins        }
1880c165b184SJames Collins
1881a8eebd82SJames Collins        /* Hero subtitle */
18822b4583abSJames Collins        foreach ($html->find('p') as $elm) {
1883d0d6c450SJames Collins            if (preg_match('/[~-]~hero-subtitle (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1884d0d6c450SJames Collins                $subtitle = $matches[1];
1885a8eebd82SJames Collins                $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1886a8eebd82SJames Collins
1887d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-subtitle (.+?)~[~-]/ui', '', $elm->innertext);
18882b4583abSJames Collins                break;
18892b4583abSJames Collins            }
18902b4583abSJames Collins        }
18912b4583abSJames Collins
1892a8eebd82SJames Collins        /* Hero image */
1893a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1894a8eebd82SJames Collins            $image = '';
1895d0d6c450SJames Collins            preg_match('/[~-]~hero-image (.+?)~[~-](?!.?")/ui', $elm->innertext, $matches);
1896a8eebd82SJames Collins            if (count($matches) > 0) {
1897a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1898a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1899a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1900a8eebd82SJames Collins                } else {
1901a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1902a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1903a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1904a8eebd82SJames Collins                    } else {
1905a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
19069cff245bSJames Collins                        if (stripos($image, ':') === false) {
19079cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1908a8eebd82SJames Collins                            $i = stripos($image, '?');
19099cff245bSJames Collins                            if ($i !== false) {
1910a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1911c165b184SJames Collins                            }
1912c165b184SJames Collins
1913a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1914ab45ba71SJames Collins                        }
1915ab45ba71SJames Collins                    }
1916ab45ba71SJames Collins                }
1917ab45ba71SJames Collins
1918a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1919a8eebd82SJames Collins
1920d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-image (.+?)~[~-].*/ui', '', $elm->innertext);
19219cff245bSJames Collins            }//end if
19229cff245bSJames Collins        }//end foreach
1923ab45ba71SJames Collins
19249cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
19259cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1926a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1927d0d6c450SJames Collins            if (preg_match('/[~-]~hero-colors (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1928d0d6c450SJames Collins                $subtitle = $matches[1];
1929d0d6c450SJames Collins                $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $subtitle . '\')';
1930ab45ba71SJames Collins
1931d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-colors (.+?)~[~-]/ui', '', $elm->innertext);
1932a8eebd82SJames Collins                break;
1933ab45ba71SJames Collins            }
1934ab45ba71SJames Collins        }
1935ab45ba71SJames Collins
193696ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
193796ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
19383a44a74aSJames Collins            if (preg_match('/[~-]~hide-parts (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1939d0d6c450SJames Collins                $parts = explode(' ', $matches[1]);
194096ec8e1eSJames Collins                $script = '';
194196ec8e1eSJames Collins
194296ec8e1eSJames Collins                foreach ($parts as $part) {
194396ec8e1eSJames Collins                    if (strlen($part) > 0) {
194496ec8e1eSJames Collins                        $script .= 'mikio.hidePart(\'' . $part . '\');';
194596ec8e1eSJames Collins                    }
194696ec8e1eSJames Collins                }
194796ec8e1eSJames Collins
194896ec8e1eSJames Collins                if (strlen($script) > 0) {
194996ec8e1eSJames Collins                    $this->footerScript['hide-parts'] = $script;
195096ec8e1eSJames Collins                }
195196ec8e1eSJames Collins
19523a44a74aSJames Collins                $elm->innertext = preg_replace('/[~-]~hide-parts (.+?)~[~-]/ui', '', $elm->innertext);
195396ec8e1eSJames Collins                break;
1954d0d6c450SJames Collins            }
19559cff245bSJames Collins        }//end foreach
195696ec8e1eSJames Collins
195796ec8e1eSJames Collins
1958a8eebd82SJames Collins        /* Page Tags (tag plugin) */
19599cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1960a8eebd82SJames Collins            $tags = '';
1961a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1962a8eebd82SJames Collins                $tags .= $elm->outertext;
1963a8eebd82SJames Collins            }
1964a8eebd82SJames Collins
1965a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1966a8eebd82SJames Collins                $elm->innertext = '';
1967a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1968a8eebd82SJames Collins            }
1969a8eebd82SJames Collins
19703a385f2cSJames Collins            if (empty($tags) === false) {
1971a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1972a8eebd82SJames Collins            }
1973ab45ba71SJames Collins        }
1974ab45ba71SJames Collins
1975ab45ba71SJames Collins        // Configuration Manager
19763a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1977ab45ba71SJames Collins            // Additional save buttons
1978ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1979ab45ba71SJames Collins                $saveButtons = '';
1980ab45ba71SJames Collins
1981ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1982ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1983a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1984ab45ba71SJames Collins                    $elm->outertext = '';
1985ab45ba71SJames Collins                }
1986ab45ba71SJames Collins
1987ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1988ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1989ab45ba71SJames Collins                }
1990ab45ba71SJames Collins            }
1991ab45ba71SJames Collins        }
1992ab45ba71SJames Collins
1993ab45ba71SJames Collins        $content = $html->save();
1994c165b184SJames Collins        $html->clear();
1995c165b184SJames Collins        unset($html);
1996c165b184SJames Collins
1997c165b184SJames Collins        return $content;
1998c165b184SJames Collins    }
19992b4583abSJames Collins
20002b4583abSJames Collins
2001a8eebd82SJames Collins    /**
2002a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
2003a8eebd82SJames Collins     *
20049cff245bSJames Collins     * @param   string $str String to parse.
20059cff245bSJames Collins     * @return  string      parsed URI
2006a8eebd82SJames Collins     */
20079cff245bSJames Collins    public function getLink(string $str)
200810b40067Snomadjimbob    {
20092b4583abSJames Collins        $i = strpos($str, '://');
20109cff245bSJames Collins        if ($i !== false) {
20119cff245bSJames Collins            return $str;
20129cff245bSJames Collins        }
20132b4583abSJames Collins
20142b4583abSJames Collins        return wl($str);
20152b4583abSJames Collins    }
2016ab45ba71SJames Collins
2017ab45ba71SJames Collins
2018a8eebd82SJames Collins    /**
2019a8eebd82SJames Collins     * Check if the user can edit current namespace/page
2020a8eebd82SJames Collins     *
2021a8eebd82SJames Collins     * @return  boolean  user can edit
2022a8eebd82SJames Collins     */
202310b40067Snomadjimbob    public function userCanEdit()
202410b40067Snomadjimbob    {
2025ab45ba71SJames Collins        global $INFO;
2026ab45ba71SJames Collins        global $ID;
2027ab45ba71SJames Collins
2028ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
20299cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
20309cff245bSJames Collins            return true;
20319cff245bSJames Collins        }
20329cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
20339cff245bSJames Collins            return true;
20349cff245bSJames Collins        }
2035a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
20369cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
20379cff245bSJames Collins            return true;
20389cff245bSJames Collins        }
20399cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
20409cff245bSJames Collins            return true;
20419cff245bSJames Collins        }
2042ab45ba71SJames Collins
2043ab45ba71SJames Collins        return false;
2044c165b184SJames Collins    }
204547161538SJames Collins
204647161538SJames Collins
2047a8eebd82SJames Collins    /**
2048a8eebd82SJames Collins     * Search for and return the uri of a media file
2049a8eebd82SJames Collins     *
20509cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
20519cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
20529cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
20539cff245bSJames Collins     * @return string                  URI of the found media file
2054a8eebd82SJames Collins     */
20559cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
205610b40067Snomadjimbob    {
2057ab45ba71SJames Collins        global $INFO;
2058a8eebd82SJames Collins
20599cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
2060ab45ba71SJames Collins
20619cff245bSJames Collins        if ($searchCurrentNS === true) {
20629cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
20639cff245bSJames Collins        }
20649cff245bSJames Collins        if ($propagate === true) {
2065ab45ba71SJames Collins            $prefix[] = ':';
2066ab45ba71SJames Collins            $prefix[] = ':wiki:';
2067a8eebd82SJames Collins        }
2068ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
20693a385f2cSJames Collins        if (empty($theme) === false) {
20709cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
20719cff245bSJames Collins        }
2072ab45ba71SJames Collins        $prefix[] = 'images/';
2073ab45ba71SJames Collins
20749cff245bSJames Collins        $search = [];
2075ab45ba71SJames Collins        foreach ($prefix as $pitem) {
2076ab45ba71SJames Collins            foreach ($ext as $eitem) {
2077ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
2078ab45ba71SJames Collins            }
2079ab45ba71SJames Collins        }
2080ab45ba71SJames Collins
2081ab45ba71SJames Collins        $img = '';
2082ab45ba71SJames Collins        $file = '';
2083ab45ba71SJames Collins        $url = '';
2084ab45ba71SJames Collins        $ismedia = false;
2085ab45ba71SJames Collins        $found = false;
2086ab45ba71SJames Collins
2087ab45ba71SJames Collins        foreach ($search as $img) {
20883a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
2089ab45ba71SJames Collins                $file    = mediaFN($img);
2090ab45ba71SJames Collins                $ismedia = true;
2091ab45ba71SJames Collins            } else {
2092ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
2093ab45ba71SJames Collins                $ismedia = false;
2094ab45ba71SJames Collins            }
2095ab45ba71SJames Collins
20969cff245bSJames Collins            if (file_exists($file) === true) {
2097ab45ba71SJames Collins                $found = true;
2098ab45ba71SJames Collins                break;
2099ab45ba71SJames Collins            }
2100ab45ba71SJames Collins        }
2101ab45ba71SJames Collins
21029cff245bSJames Collins        if ($found === false) {
21039cff245bSJames Collins            return false;
21049cff245bSJames Collins        }
2105ab45ba71SJames Collins
21069cff245bSJames Collins        if ($ismedia === true) {
2107ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
2108ab45ba71SJames Collins        } else {
2109ab45ba71SJames Collins            $url = tpl_basedir() . $img;
2110ab45ba71SJames Collins        }
2111ab45ba71SJames Collins
2112ab45ba71SJames Collins        return $url;
2113ab45ba71SJames Collins    }
2114ab45ba71SJames Collins
2115a8eebd82SJames Collins
2116a8eebd82SJames Collins    /**
2117ab45ba71SJames Collins     * Print or return the page title
2118ab45ba71SJames Collins     *
21199cff245bSJames Collins     * @param string $page Page id or empty string for current page.
2120ab45ba71SJames Collins     * @return string      generated content
2121ab45ba71SJames Collins     */
21229cff245bSJames Collins    public function getPageTitle(string $page = '')
212310b40067Snomadjimbob    {
2124ab45ba71SJames Collins        global $ID, $conf;
2125ab45ba71SJames Collins
2126ab45ba71SJames Collins        $html = '';
2127ab45ba71SJames Collins
21283a385f2cSJames Collins        if (empty($page) === true) {
21299cff245bSJames Collins            $page = $ID;
21309cff245bSJames Collins        }
2131ab45ba71SJames Collins
2132ab45ba71SJames Collins        $html = p_get_first_heading($page);
2133ab45ba71SJames Collins        $html = strip_tags($html);
2134ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
2135ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
2136ab45ba71SJames Collins        $html = trim($html);
2137ab45ba71SJames Collins
2138ab45ba71SJames Collins        return $html;
2139ab45ba71SJames Collins    }
2140a8eebd82SJames Collins
2141a8eebd82SJames Collins
2142a8eebd82SJames Collins    /**
2143a8eebd82SJames Collins     * Return inline theme icon
2144a8eebd82SJames Collins     *
21459cff245bSJames Collins     * @param   string $type  Icon to retreive.
21469e41d878SJames Collins     * @param   string $class Classname to insert.
21479cff245bSJames Collins     * @return  string        HTML icon content
2148a8eebd82SJames Collins     */
21499e41d878SJames Collins    public function mikioInlineIcon(string $type, string $class = "")
215010b40067Snomadjimbob    {
21519e41d878SJames Collins        if (is_array($class) === true) {
21529e41d878SJames Collins            $class = explode(' ', $class);
21539e41d878SJames Collins        }
21549e41d878SJames Collins
21559e41d878SJames Collins        if (strlen($class) > 0) {
21569e41d878SJames Collins            $class = ' ' . $class;
21579e41d878SJames Collins        }
21589e41d878SJames Collins
2159a8eebd82SJames Collins        switch ($type) {
2160a8eebd82SJames Collins            case 'wrench':
2161906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792
2162906e1a13SJames 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,
2163906e1a13SJames 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,
2164906e1a13SJames 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,
2165906e1a13SJames 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
2166906e1a13SJames 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,
2167906e1a13SJames 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>';
2168a8eebd82SJames Collins            case 'file':
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,235.38983,1277.8305)" id="g2991">
2171906e1a13SJames 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
2172906e1a13SJames 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
2173906e1a13SJames 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"
21749cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
2175a8eebd82SJames Collins            case 'gear':
2176906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2177906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027">
2178906e1a13SJames 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
2179906e1a13SJames 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
2180906e1a13SJames 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
2181906e1a13SJames 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
2182906e1a13SJames 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
2183906e1a13SJames 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,
2184906e1a13SJames 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
2185906e1a13SJames 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
2186906e1a13SJames 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" />
2187906e1a13SJames Collins</g></svg>';
2188a8eebd82SJames Collins            case 'user':
2189906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2190906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M
2191906e1a13SJames 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
2192906e1a13SJames 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,
2193906e1a13SJames 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
2194906e1a13SJames 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
2195906e1a13SJames 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,
2196906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>';
2197a8eebd82SJames Collins            case 'search':
21989e41d878SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
21999cff245bSJames 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
22009cff245bSJames 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
22019cff245bSJames 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
22029cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2203a8eebd82SJames Collins            case 'home':
2204906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2205906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g
2206906e1a13SJames 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
2207906e1a13SJames 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
2208906e1a13SJames 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
2209906e1a13SJames 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,
2210906e1a13SJames 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"
22119cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
22129e41d878SJames Collins            case 'sun':
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="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
2215906e1a13SJames 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
2216906e1a13SJames 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
2217906e1a13SJames 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
2218906e1a13SJames Collins0 0 1-.707.707z" /></svg>';
22199e41d878SJames Collins            case 'moon':
2220906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2221906e1a13SJames 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
2222906e1a13SJames 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
2223906e1a13SJames 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
2224906e1a13SJames 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
2225906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>';
222634d5f19aSJames Collins            case 'sunmoon':
2227d0fba6d1SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2228d0fba6d1SJames Collinsstyle="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
2229d0fba6d1SJames 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
2230d0fba6d1SJames 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"
2231d0fba6d1SJames 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,
2232d0fba6d1SJames 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>';
2233f65a4e5eSJames Collins            case 'hamburger':
2234f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
2235f65a4e5eSJames 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
2236f65a4e5eSJames 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
2237f65a4e5eSJames 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
2238f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>';
2239f65a4e5eSJames Collins            case 'down-arrow':
2240f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
2241f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9
2242f65a4e5eSJames Collins1.917-1.916z"/></svg>';
22433a3ece10SJames Collins            case 'language':
22443a3ece10SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" width="16"
22453a3ece10SJames Collinsheight="16" fill="currentColor" viewBox="0 0 16 16"><path d="M4.545 6.714 4.11
22463a3ece10SJames 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
22473a3ece10SJames 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
22483a3ece10SJames 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
22493a3ece10SJames 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
22503a3ece10SJames Collins1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651
22513a3ece10SJames 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"/>
22523a3ece10SJames Collins</svg>';
22539cff245bSJames Collins        }//end switch
2254ab45ba71SJames Collins
2255a8eebd82SJames Collins        return '';
2256a8eebd82SJames Collins    }
2257ab45ba71SJames Collins
2258a8eebd82SJames Collins    /**
2259a8eebd82SJames Collins     * Finalize theme
22609cff245bSJames Collins     *
22619cff245bSJames Collins     * @return void
2262a8eebd82SJames Collins     */
226310b40067Snomadjimbob    public function finalize()
226410b40067Snomadjimbob    {
2265a8eebd82SJames Collins    }
22661785fc73SJames Collins
22671785fc73SJames Collins    /**
22681785fc73SJames Collins     * Show Messages
22699cff245bSJames Collins     *
22709cff245bSJames Collins     * @return void
22711785fc73SJames Collins     */
227210b40067Snomadjimbob    public function showMessages()
227310b40067Snomadjimbob    {
22741785fc73SJames Collins        global $ACT;
22751785fc73SJames Collins
22769cff245bSJames Collins        if ($this->lessIgnored === true) {
22779cff245bSJames Collins            msg(
22789cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
22799cff245bSJames Collins                2,
22809cff245bSJames Collins                '',
22819cff245bSJames Collins                '',
22829cff245bSJames Collins                MSG_ADMINS_ONLY
22839cff245bSJames Collins            );
2284a8df40efSJames Collins        }
2285a8df40efSJames Collins
22861785fc73SJames Collins        $show = $this->getConf('showNotifications');
22873a385f2cSJames Collins        if (
22884f8225e4SJames Collins            strlen($show) === 0 ||
22893a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
22903a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
22913a385f2cSJames Collins        ) {
22921785fc73SJames Collins            global $MSG, $MSG_shown;
22931785fc73SJames Collins
22944f8225e4SJames Collins            if (isset($MSG) !== false) {
22959cff245bSJames Collins                if (isset($MSG_shown) === false) {
22969cff245bSJames Collins                    $MSG_shown = [];
2297a8df40efSJames Collins                }
22981785fc73SJames Collins
22991785fc73SJames Collins                foreach ($MSG as $msg) {
23001785fc73SJames Collins                    $hash = md5($msg['msg']);
23019cff245bSJames Collins                    if (isset($MSG_shown[$hash]) === true) {
23021785fc73SJames Collins                        continue;
23031785fc73SJames Collins                    }
23041785fc73SJames Collins                    // skip double messages
23051785fc73SJames Collins
23069cff245bSJames Collins                    if (info_msg_allowed($msg) === true) {
23079cff245bSJames Collins                        echo '<div class="' . $msg['lvl'] . '">';
23089cff245bSJames Collins                        echo $msg['msg'];
23099cff245bSJames Collins                        echo '</div>';
23101785fc73SJames Collins                    }
23111785fc73SJames Collins
2312a8df40efSJames Collins                    $MSG_shown[$hash] = true;
23131785fc73SJames Collins                }
23141785fc73SJames Collins
23151785fc73SJames Collins                unset($GLOBALS['MSG']);
23169cff245bSJames Collins            }//end if
23174f8225e4SJames Collins
23184f8225e4SJames Collins            if (strlen($this->includedPageNotifications) > 0) {
23194f8225e4SJames Collins                echo $this->includedPageNotifications;
23204f8225e4SJames Collins            }
23214f8225e4SJames Collins        }//end if
23221785fc73SJames Collins    }
23237ac0a6efSJames Collins
23247ac0a6efSJames Collins    /**
23257ac0a6efSJames Collins     * Dokuwiki version
23267ac0a6efSJames Collins     *
23277ac0a6efSJames Collins     * @return  string        the dw version name
23287ac0a6efSJames Collins     */
23299cff245bSJames Collins    public function dwVersion()
23309cff245bSJames Collins    {
23319cff245bSJames Collins        if (function_exists('getVersionData') === true) {
23327ac0a6efSJames Collins            $version_data = getVersionData();
23339cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
23347ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
23357ac0a6efSJames Collins                if (count($version_items) >= 2) {
23367ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
23377ac0a6efSJames Collins                }
23387ac0a6efSJames Collins            }
23397ac0a6efSJames Collins        }
23407ac0a6efSJames Collins
23417ac0a6efSJames Collins        return 'unknown';
23427ac0a6efSJames Collins    }
2343e4c4fb13SJames Collins
2344e4c4fb13SJames Collins    /**
2345e4c4fb13SJames Collins     * Dokuwiki version number
2346e4c4fb13SJames Collins     *
2347e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2348e4c4fb13SJames Collins     */
23499cff245bSJames Collins    public function dwVersionNumber()
23509cff245bSJames Collins    {
23519cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2352e4c4fb13SJames Collins            $version_data = getVersionData();
23539cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2354e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2355e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2356e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2357e4c4fb13SJames Collins                }
2358e4c4fb13SJames Collins            }
2359e4c4fb13SJames Collins        }
2360e4c4fb13SJames Collins
2361e4c4fb13SJames Collins        return 0;
2362e4c4fb13SJames Collins    }
2363a8eebd82SJames Collins}
2364ab45ba71SJames Collins
2365ab45ba71SJames Collinsglobal $TEMPLATE;
236647161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2367