xref: /template/mikio/mikio.php (revision 2c87ab0de0f9476e292c89560671364446250fe7)
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 = true;
368a8df40efSJames Collins
369a8df40efSJames Collins                            // check for less library
370a8df40efSJames Collins                            $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
3719cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
372a8df40efSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3739cff245bSJames Collins                            }
3749cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
375a8df40efSJames Collins                                $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3769cff245bSJames Collins                            }
3779cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
3789cff245bSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] .
3799cff245bSJames Collins                                    '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3809cff245bSJames Collins                            }
3819cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
382a8df40efSJames Collins                                $lessAvailable = false;
383a8df40efSJames Collins                            }
384a8df40efSJames Collins
385a8df40efSJames Collins                            // check for ctype extensions
3869cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
387a8df40efSJames Collins                                $lessAvailable = false;
388a8df40efSJames Collins                            }
389a8df40efSJames Collins
3909cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
391a8df40efSJames Collins                                $this->lessIgnored = true;
39229118ed7SJames Collins                                $value = false;
39329118ed7SJames Collins                            }
3943a385f2cSJames Collins
3953a385f2cSJames Collins                            return $value;
3969cff245bSJames Collins                    }//end switch
3973a385f2cSJames Collins                }//end if
3983a385f2cSJames Collins
3993a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
4003a385f2cSJames Collins                    return $value;
4013a385f2cSJames Collins                }
4023a385f2cSJames Collins
4033a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
4043a385f2cSJames Collins                    if (is_array($row['default']) === true) {
4053a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
4063a385f2cSJames Collins                            return $row['default'][$key];
4073a385f2cSJames Collins                        }
4083a385f2cSJames Collins                    } else {
4093a385f2cSJames Collins                        return $row['default'];
4103a385f2cSJames Collins                    }
4113a385f2cSJames Collins                }
4123a385f2cSJames Collins
4133a385f2cSJames Collins                return reset($row['values']);
4143a385f2cSJames Collins            }//end if
4153a385f2cSJames Collins        }//end foreach
416c165b184SJames Collins
417c165b184SJames Collins        return $value;
418c165b184SJames Collins    }
419c165b184SJames Collins
420c165b184SJames Collins
42195372bffSJames Collins    // phpcs:enable
42295372bffSJames Collins
42395372bffSJames Collins
424c165b184SJames Collins    /**
425a8eebd82SJames Collins     * Check if a page exist in directory or namespace
426c165b184SJames Collins     *
4279cff245bSJames Collins     * @param   string $page Page/namespace to search.
428a8eebd82SJames Collins     * @return  boolean      if page exists
429c165b184SJames Collins     */
4309cff245bSJames Collins    public function pageExists(string $page)
43110b40067Snomadjimbob    {
432ab45ba71SJames Collins        ob_start();
433a8eebd82SJames Collins        tpl_includeFile($page . '.html');
434ab45ba71SJames Collins        $html = ob_get_contents();
435ab45ba71SJames Collins        ob_end_clean();
436a8eebd82SJames Collins
4373a385f2cSJames Collins        if (empty($html) === false) {
4389cff245bSJames Collins            return true;
4399cff245bSJames Collins        }
440a8eebd82SJames Collins
441a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
442a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
443a8eebd82SJames Collins
4449cff245bSJames Collins        if ($propagate === true) {
4459cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4469cff245bSJames Collins                return true;
4479cff245bSJames Collins            }
4489cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4499cff245bSJames Collins            return true;
450ab45ba71SJames Collins        }
451ab45ba71SJames Collins
4529cff245bSJames Collins        return false;
453ab45ba71SJames Collins    }
454ab45ba71SJames Collins
455a8eebd82SJames Collins
456c165b184SJames Collins    /**
457a8eebd82SJames Collins     * Print or return page from directory or namespace
4582b4583abSJames Collins     *
4599cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4609cff245bSJames Collins     * @param   boolean $print        Print content.
4619cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4629cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
463ab45ba71SJames Collins     * @return  string                contents of page found
4642b4583abSJames Collins     */
4659cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4662b4583abSJames Collins    {
467a8eebd82SJames Collins        ob_start();
468a8eebd82SJames Collins        tpl_includeFile($page . '.html');
469a8eebd82SJames Collins        $html = ob_get_contents();
470a8eebd82SJames Collins        ob_end_clean();
471a8eebd82SJames Collins
4723a385f2cSJames Collins        if (empty($html) === true) {
4734f8225e4SJames Collins            global $MSG;
4744f8225e4SJames Collins
475a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
476a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
477ab45ba71SJames Collins            $html = '';
4782b4583abSJames Collins
4794f8225e4SJames Collins            ob_start();
480ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
4814f8225e4SJames Collins            $this->includedPageNotifications .= ob_get_contents();
4824f8225e4SJames Collins            ob_end_clean();
483ab45ba71SJames Collins        }
4842b4583abSJames Collins
4853a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
486ab45ba71SJames Collins            $html = $this->parseContent($html);
487ab45ba71SJames Collins        }
4882b4583abSJames Collins
4893a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
4909cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
4919cff245bSJames Collins        }
4922b4583abSJames Collins
4939cff245bSJames Collins        if ($print === true) {
4949cff245bSJames Collins            echo $html;
4959cff245bSJames Collins        }
496ab45ba71SJames Collins        return $html;
4972b4583abSJames Collins    }
4982b4583abSJames Collins
499a8eebd82SJames Collins
500a8eebd82SJames Collins    /**
501a8eebd82SJames Collins     * Print or return logged in user information
502a8eebd82SJames Collins     *
5039cff245bSJames Collins     * @param   boolean $print Print content.
504a8eebd82SJames Collins     * @return  string         user information
505a8eebd82SJames Collins     */
5069cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
50710b40067Snomadjimbob    {
508a8eebd82SJames Collins        $html = '';
509a8eebd82SJames Collins
5109cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
511a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
512a8eebd82SJames Collins            ob_start();
513a8eebd82SJames Collins            tpl_userinfo();
514a8eebd82SJames Collins            $html .= ob_get_contents();
515a8eebd82SJames Collins            ob_end_clean();
516a8eebd82SJames Collins            $html .= '</div>';
5172b4583abSJames Collins        }
518a8eebd82SJames Collins
5199cff245bSJames Collins        if ($print === true) {
5209cff245bSJames Collins            echo $html;
5219cff245bSJames Collins        }
522a8eebd82SJames Collins        return $html;
5232b4583abSJames Collins    }
5242b4583abSJames Collins
5252b4583abSJames Collins
526a8eebd82SJames Collins    /**
527a8eebd82SJames Collins     * Print or return DokuWiki Menu
528a8eebd82SJames Collins     *
5299cff245bSJames Collins     * @param   boolean $print Print content.
530a8eebd82SJames Collins     * @return  string         contents of the menu
531a8eebd82SJames Collins     */
5329cff245bSJames Collins    public function includeDWMenu(bool $print = true)
53310b40067Snomadjimbob    {
5342b4583abSJames Collins        global $lang;
5352b4583abSJames Collins        global $USERINFO;
536c165b184SJames Collins
5379cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
538a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5392b4583abSJames Collins
540ab45ba71SJames Collins        $pageToolsMenu = [];
541ab45ba71SJames Collins        $siteToolsMenu = [];
542ab45ba71SJames Collins        $userToolsMenu = [];
543c165b184SJames Collins
544ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
545ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
546ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5472b4583abSJames Collins
5482b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5492b4583abSJames Collins        foreach ($items as $item) {
5509cff245bSJames Collins            if ($item->getType() !== 'top') {
551ab45ba71SJames Collins                $itemHtml = '';
5522b4583abSJames Collins
553905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5549cff245bSJames Collins                if (
5553a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5563a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5573a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5589cff245bSJames Collins                ) {
5599cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5609cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5619cff245bSJames Collins                    if ($showIcons === true) {
5629cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5639cff245bSJames Collins                    }
5649cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5659cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5669cff245bSJames Collins                    }
567ab45ba71SJames Collins                    $itemHtml .= '</a>';
568ab45ba71SJames Collins
569ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5702b4583abSJames Collins                }
5719cff245bSJames Collins            }//end if
5729cff245bSJames Collins        }//end foreach
5732b4583abSJames Collins
574ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
575ab45ba71SJames Collins        foreach ($items as $item) {
576ab45ba71SJames Collins            $itemHtml = '';
5772b4583abSJames Collins
578905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5799cff245bSJames Collins            if (
5803a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5813a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5823a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5839cff245bSJames Collins            ) {
5849cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5859cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5869cff245bSJames Collins                if ($showIcons === true) {
5879cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5889cff245bSJames Collins                }
5899cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5909cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5919cff245bSJames Collins                }
592ab45ba71SJames Collins                $itemHtml .= '</a>';
5932b4583abSJames Collins
594ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
5952b4583abSJames Collins            }
5969cff245bSJames Collins        }//end foreach
5972b4583abSJames Collins
598ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
599ab45ba71SJames Collins        foreach ($items as $item) {
600ab45ba71SJames Collins            $itemHtml = '';
601ab45ba71SJames Collins
602905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
6039cff245bSJames Collins            if (
6043a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
6053a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
6063a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
6079cff245bSJames Collins            ) {
6089cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
6099cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
6109cff245bSJames Collins                if ($showIcons === true) {
6119cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6129cff245bSJames Collins                }
6139cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6149cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6159cff245bSJames Collins                }
616ab45ba71SJames Collins                $itemHtml .= '</a>';
617ab45ba71SJames Collins
618ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
619ab45ba71SJames Collins            }
6209cff245bSJames Collins        }//end foreach
621ab45ba71SJames Collins
622ab45ba71SJames Collins
623ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
624ab45ba71SJames Collins            case 'dropdown':
625ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6269cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6279cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6289cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6299cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6309cff245bSJames Collins                '</span>') . '</a>';
631a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
632ab45ba71SJames Collins
633ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
634ab45ba71SJames Collins                    $html .= $item;
635ab45ba71SJames Collins                }
636ab45ba71SJames Collins
637ab45ba71SJames Collins                $html .= '</div>';
638ab45ba71SJames Collins                $html .= '</li>';
639ab45ba71SJames Collins
640a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6419cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6429cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6439cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6449cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6459cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
646a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
647ab45ba71SJames Collins
648ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
649ab45ba71SJames Collins                    $html .= $item;
650ab45ba71SJames Collins                }
651ab45ba71SJames Collins
652ab45ba71SJames Collins                $html .= '</div>';
653ab45ba71SJames Collins                $html .= '</li>';
654ab45ba71SJames Collins
655a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6569cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6579cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6589cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6599cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6609cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
661a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
662ab45ba71SJames Collins
663ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
664ab45ba71SJames Collins                    $html .= $item;
665ab45ba71SJames Collins                }
666ab45ba71SJames Collins
667ab45ba71SJames Collins                $html .= '</div>';
668ab45ba71SJames Collins                $html .= '</li>';
669ab45ba71SJames Collins
670ab45ba71SJames Collins                break;
671ab45ba71SJames Collins
672ab45ba71SJames Collins            case 'combine':
673ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6749cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6759cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6769cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6779cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
678a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
679ab45ba71SJames Collins
680ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
681ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
682ab45ba71SJames Collins                    $html .= $item;
683ab45ba71SJames Collins                }
684ab45ba71SJames Collins
685ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
686ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
687ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
688ab45ba71SJames Collins                    $html .= $item;
689ab45ba71SJames Collins                }
690ab45ba71SJames Collins
691ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
692ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
693ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
694ab45ba71SJames Collins                    $html .= $item;
695ab45ba71SJames Collins                }
696ab45ba71SJames Collins
697ab45ba71SJames Collins                $html .= '</div>';
698ab45ba71SJames Collins                $html .= '</li>';
699ab45ba71SJames Collins                break;
700ab45ba71SJames Collins
701ab45ba71SJames Collins            default:    // seperate
702ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
703a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
704ab45ba71SJames Collins                }
705ab45ba71SJames Collins
706ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
707a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
708a8eebd82SJames Collins                }
709a8eebd82SJames Collins
710a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
711a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
712ab45ba71SJames Collins                }
713ab45ba71SJames Collins
714ab45ba71SJames Collins                break;
7159cff245bSJames Collins        }//end switch
716ab45ba71SJames Collins
7173a3ece10SJames Collins        $translation = plugin_load('helper', 'translation');
7183a3ece10SJames Collins        if ($translation !== null) {
7193a3ece10SJames Collins            $html .= '<li id="mikio__translate" class="mikio-nav-dropdown">';
7203a3ece10SJames Collins            $html .= '<a id="mikio_dropdown_translate" class="nav-link dropdown-toggle" href="#" role="button"
7213a3ece10SJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
7223a3ece10SJames Collins                $this->mikioInlineIcon('language') .
7233a3ece10SJames Collins                 '</a>';
7243a3ece10SJames Collins            $html .= '<div class="mikio-dropdown closed">';
7253a3ece10SJames Collins
7263a3ece10SJames Collins                $html .= $translation->showTranslations();
7273a3ece10SJames Collins
7283a3ece10SJames Collins            $html .= '</div>';
7293a3ece10SJames Collins            $html .= '</li>';
7303a3ece10SJames Collins        }
7313a3ece10SJames Collins
73212030b10SJames Collins        if ($this->getConf('showLightDark') === true) {
733d0fba6d1SJames Collins            $autoLightDark = $this->getConf('autoLightDark');
7349e41d878SJames Collins            $html .= '<li class="mikio-darklight">
7359e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' .
736d0fba6d1SJames Collins            ($autoLightDark === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') .
7379e41d878SJames Collins            $this->mikioInlineIcon('sun', 'mikio-darklight-light') .
7389e41d878SJames Collins            $this->mikioInlineIcon('moon', 'mikio-darklight-dark') .
7399e41d878SJames Collins            '</a></li>';
74012030b10SJames Collins        }
74112030b10SJames Collins
742ab45ba71SJames Collins        $html .= '</ul>';
743ab45ba71SJames Collins
7449cff245bSJames Collins        if ($print === true) {
7459cff245bSJames Collins            echo $html;
7469cff245bSJames Collins        }
747a8eebd82SJames Collins        return $html;
748a8eebd82SJames Collins    }
749a8eebd82SJames Collins
750a8eebd82SJames Collins
751a8eebd82SJames Collins    /**
752a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
753a8eebd82SJames Collins     *
7549cff245bSJames Collins     * @param string $str String to generate nav.
755a8eebd82SJames Collins     * @return string     nav elements generated
756a8eebd82SJames Collins     */
7579cff245bSJames Collins    public function stringToNav(string $str)
75810b40067Snomadjimbob    {
759a8eebd82SJames Collins        $html = '';
760a8eebd82SJames Collins
7613a385f2cSJames Collins        if (empty($str) === false) {
762a8eebd82SJames Collins            $items = explode(';', $str);
763a8eebd82SJames Collins            if (count($items) > 0) {
764a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
765a8eebd82SJames Collins                foreach ($items as $item) {
766a8eebd82SJames Collins                    $parts = explode('|', $item);
767a8eebd82SJames Collins                    if ($parts > 1) {
7689cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7699cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7709cff245bSJames Collins                            '</a></li>';
771a8eebd82SJames Collins                    }
772a8eebd82SJames Collins                }
773a8eebd82SJames Collins                $html .= '</ul>';
774a8eebd82SJames Collins            }
7752b4583abSJames Collins        }
7762b4583abSJames Collins
777ab45ba71SJames Collins        return $html;
7782b4583abSJames Collins    }
7792b4583abSJames Collins
780a8eebd82SJames Collins    /**
781ab45ba71SJames Collins     * print or return the main navbar
7822b4583abSJames Collins     *
7839cff245bSJames Collins     * @param boolean $print   Print the navbar.
7849cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
785ab45ba71SJames Collins     * @return string          generated content
7862b4583abSJames Collins     */
7879cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
78810b40067Snomadjimbob    {
789b39ad16dSJames Collins        global $conf, $USERINFO;
790d3d7d2b7SJames Collins
791d3d7d2b7SJames Collins        $homeUrl = wl();
792d3d7d2b7SJames Collins
7939cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
794d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
7953a385f2cSJames Collins            if (empty($p) === false) {
7969cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
797d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
798d3d7d2b7SJames Collins                }
799d3d7d2b7SJames Collins            }
800b39ad16dSJames Collins        } else {
8019cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
802b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
803b39ad16dSJames Collins                if (strlen($url) > 0) {
804b39ad16dSJames Collins                    $homeUrl = $url;
805d3d7d2b7SJames Collins                }
806b39ad16dSJames Collins            } else {
807b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
808b39ad16dSJames Collins                if (strlen($url) > 0) {
809b39ad16dSJames Collins                    $homeUrl = $url;
810b39ad16dSJames Collins                }
811b39ad16dSJames Collins            }
812b39ad16dSJames Collins        }
813d3d7d2b7SJames Collins
814ab45ba71SJames Collins        $html = '';
81547161538SJames Collins
8169cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
8179cff245bSJames Collins            '">';
818f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
819d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
8209cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
821ab45ba71SJames Collins            // Brand image
8229cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
8239cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
8249cff245bSJames Collins                ;
8253a385f2cSJames Collins                if (empty($logo) === false) {
826f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
827f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
828f0241fc4SJames Collins                    $styles = '';
829f0241fc4SJames Collins
830f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
8319cff245bSJames Collins                        if (ctype_digit($width) === true) {
832f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
8339cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
834f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
8359cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
8367a92c19bSJames Collins                            $styles .= 'max-width:none;';
837f0241fc4SJames Collins                        }
838f0241fc4SJames Collins
8399cff245bSJames Collins                        if (ctype_digit($height) === true) {
840f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8419cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
842f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8439cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8447a92c19bSJames Collins                            $styles .= 'max-height:none;';
845f0241fc4SJames Collins                        }
846f0241fc4SJames Collins
847f0241fc4SJames Collins                        if (strlen($styles) > 0) {
848f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
849f0241fc4SJames Collins                        }
8509cff245bSJames Collins                    }//end if
851f0241fc4SJames Collins
852f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8539cff245bSJames Collins                }//end if
8549cff245bSJames Collins            }//end if
855ab45ba71SJames Collins
856ab45ba71SJames Collins            // Brand title
8579cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
858ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
859a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8609cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
861a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
862ab45ba71SJames Collins                }
863ab45ba71SJames Collins                $html .= '</div>';
864ab45ba71SJames Collins            }
8659cff245bSJames Collins        }//end if
866ab45ba71SJames Collins        $html .= '</a>';
867660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
868ab45ba71SJames Collins
869ab45ba71SJames Collins        // Menus
870ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
871ab45ba71SJames Collins
8729cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8739cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8749cff245bSJames Collins        ];
875a8eebd82SJames Collins        foreach ($menus as $menuType) {
876a8eebd82SJames Collins            switch ($menuType) {
877a8eebd82SJames Collins                case 'custom':
878a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
879a8eebd82SJames Collins                    break;
880a8eebd82SJames Collins                case 'search':
881ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
882ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
883ab45ba71SJames Collins                    $html .= '</div>';
884a8eebd82SJames Collins                    break;
885a8eebd82SJames Collins                case 'dokuwiki':
8869cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
887a8eebd82SJames Collins                    break;
888a8eebd82SJames Collins            }
889a8eebd82SJames Collins        }
890ab45ba71SJames Collins
891ab45ba71SJames Collins        $html .= '</div>';
892f8039bf2SJames Collins        $html .= '</div>';
893ab45ba71SJames Collins        $html .= '</nav>';
894ab45ba71SJames Collins
895a8eebd82SJames Collins        // Sub Navbar
8969cff245bSJames Collins        if ($showSub === true) {
8979cff245bSJames Collins            $sub = $this->includePage('submenu', false);
8983a385f2cSJames Collins            if (empty($sub) === false) {
8999cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
9009cff245bSJames Collins            }
901ab45ba71SJames Collins        }
902ab45ba71SJames Collins
9039cff245bSJames Collins        if ($print === true) {
9049cff245bSJames Collins            echo $html;
9059cff245bSJames Collins        }
906ab45ba71SJames Collins        return $html;
907ab45ba71SJames Collins    }
908ab45ba71SJames Collins
909ab45ba71SJames Collins
910a8eebd82SJames Collins    /**
911a8eebd82SJames Collins     * Is there a sidebar
912a8eebd82SJames Collins     *
9139cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
914a8eebd82SJames Collins     * @return  boolean        if sidebar exists
915a8eebd82SJames Collins     */
9169cff245bSJames Collins    public function sidebarExists(string $prefix = '')
91710b40067Snomadjimbob    {
918a8eebd82SJames Collins        global $conf;
919a8eebd82SJames Collins
9203a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9219cff245bSJames Collins            $prefix = '';
9229cff245bSJames Collins        }
923a8eebd82SJames Collins
924a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
925a8eebd82SJames Collins    }
926a8eebd82SJames Collins
927a8eebd82SJames Collins
928a8eebd82SJames Collins    /**
929ab45ba71SJames Collins     * Print or return the sidebar content
930ab45ba71SJames Collins     *
9319cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
9329cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
9339cff245bSJames Collins     * @param   boolean $parse  Parse the content.
934ab45ba71SJames Collins     * @return  string          generated content
935ab45ba71SJames Collins     */
9369cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
93710b40067Snomadjimbob    {
938ab45ba71SJames Collins        global $conf, $ID;
939ab45ba71SJames Collins
940ab45ba71SJames Collins        $html = '';
941ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
942ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
943ab45ba71SJames Collins
9443a385f2cSJames Collins        if (empty($confPrefix) === true) {
9459cff245bSJames Collins            $confPrefix = 'Left';
9469cff245bSJames Collins        }
9471cdedf28SJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9489cff245bSJames Collins            $prefix = '';
9499cff245bSJames Collins        }
950ab45ba71SJames Collins
9511cdedf28SJames Collins        $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
952ab45ba71SJames Collins
9539cff245bSJames Collins        if (
9549cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9551cdedf28SJames Collins            p_get_metadata($ID, 'nosidebar', false) === null
9569cff245bSJames Collins        ) {
9579cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9583a385f2cSJames Collins            if (empty($content) === false) {
9599cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9609cff245bSJames Collins            }
961ab45ba71SJames Collins
9623a385f2cSJames Collins            if (empty($prefix) === true) {
9639cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9649cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9659cff245bSJames Collins                ];
966ab45ba71SJames Collins
967a8eebd82SJames Collins                foreach ($rows as $row) {
968a8eebd82SJames Collins                    switch ($row) {
969a8eebd82SJames Collins                        case 'search':
9709cff245bSJames Collins                            $html .= $this->includeSearch(false);
971a8eebd82SJames Collins                            break;
972a8eebd82SJames Collins                        case 'logged in user':
9739cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
974a8eebd82SJames Collins                            break;
975a8eebd82SJames Collins                        case 'content':
9769cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9773a385f2cSJames Collins                            if (empty($content) === false) {
9789cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9799cff245bSJames Collins                            }
980a8eebd82SJames Collins                            break;
981a8eebd82SJames Collins                        case 'tags':
982a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
983a8eebd82SJames Collins                    }
984a8eebd82SJames Collins                }
985a8eebd82SJames Collins            } else {
9869cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
9873a385f2cSJames Collins                if (empty($content) === false) {
9889cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9899cff245bSJames Collins                }
9909cff245bSJames Collins            }//end if
9919cff245bSJames Collins
9929cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
9933a385f2cSJames Collins            if (empty($content) === false) {
9949cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
9959cff245bSJames Collins            }
9969cff245bSJames Collins        }//end if
9979cff245bSJames Collins
9983a385f2cSJames Collins        if (empty($html) === true) {
9993a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
10009cff245bSJames Collins                $html = '&nbsp;';
10019cff245bSJames Collins            }
10029cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
10039cff245bSJames Collins                $html = '&nbsp;';
10049cff245bSJames Collins            }
1005a8eebd82SJames Collins        }
1006ab45ba71SJames Collins
10073a385f2cSJames Collins        if (empty($html) === false) {
10081cdedf28SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) .
10099cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
10109cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
10119cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
10129cff245bSJames Collins                $html . '</div></aside>';
1013ab45ba71SJames Collins        }
1014ab45ba71SJames Collins
10159cff245bSJames Collins        if ($parse === true) {
10169cff245bSJames Collins            $html = $this->includeIcons($html);
10173a04a100SJames Collins        }
10189cff245bSJames Collins        if ($print === true) {
10199cff245bSJames Collins            echo $html;
1020ab45ba71SJames Collins        }
10214f8225e4SJames Collins
1022ab45ba71SJames Collins        return $html;
1023ab45ba71SJames Collins    }
1024ab45ba71SJames Collins
1025ab45ba71SJames Collins
1026a8eebd82SJames Collins    /**
1027ab45ba71SJames Collins     * Print or return the page tools content
1028ab45ba71SJames Collins     *
10299cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
10309cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
1031ab45ba71SJames Collins     * @return  string             generated content
1032ab45ba71SJames Collins     */
10339cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
103410b40067Snomadjimbob    {
10351293ce10SJames Collins        global $USERINFO;
10361293ce10SJames Collins
10379cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
1038ab45ba71SJames Collins        $html = '';
1039ab45ba71SJames Collins
10409cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
1041b9c0582bSJames Collins        $html .= '<ul class="tools">';
1042ab45ba71SJames Collins
1043ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1044ab45ba71SJames Collins        foreach ($items as $item) {
10459cff245bSJames Collins            $classes = [];
10463fd763a0SJames Collins            $classes[] = $item->getType();
10473fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10483fd763a0SJames Collins
10499cff245bSJames Collins            if (empty($attr['class']) === false) {
10503fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1051ab45ba71SJames Collins            }
1052ab45ba71SJames Collins
10533fd763a0SJames Collins            $classes = array_unique($classes);
10543fd763a0SJames Collins
1055f02b8ab5SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()), 'always');
10569cff245bSJames Collins            if (
10573a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10583a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10593a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10609cff245bSJames Collins            ) {
10613fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10629cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10639cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10649cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10653fd763a0SJames Collins                $html .= '</li>';
10663fd763a0SJames Collins            }
10679cff245bSJames Collins        }//end foreach
10683fd763a0SJames Collins
10693fd763a0SJames Collins        $html .= '</ul>';
1070ab45ba71SJames Collins        $html .= '</nav>';
1071ab45ba71SJames Collins
10729cff245bSJames Collins        if ($print === true) {
10739cff245bSJames Collins            echo $html;
10749cff245bSJames Collins        }
1075ab45ba71SJames Collins        return $html;
1076ab45ba71SJames Collins    }
1077ab45ba71SJames Collins
1078ab45ba71SJames Collins
1079a8eebd82SJames Collins    /**
1080a8eebd82SJames Collins     * Print or return the search bar
1081a8eebd82SJames Collins     *
10829cff245bSJames Collins     * @param   boolean $print Print content.
1083a8eebd82SJames Collins     * @return  string         contents of the search bar
1084a8eebd82SJames Collins     */
10859cff245bSJames Collins    public function includeSearch(bool $print = true)
108610b40067Snomadjimbob    {
10879cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1088ab45ba71SJames Collins        $html = '';
1089ab45ba71SJames Collins
10909cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
10919cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1092a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1093a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1094c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
10959cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1096c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1097c1cb9f15SChris MacMackin        }
10989cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
10993a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1100a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
11013a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1102a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1103ab45ba71SJames Collins        } else {
1104ab45ba71SJames Collins            $html .= $lang['btn_search'];
1105ab45ba71SJames Collins        }
1106ab45ba71SJames Collins        $html .= '</button>';
1107ab45ba71SJames Collins        $html .= '</form>';
1108ab45ba71SJames Collins
11099cff245bSJames Collins        if ($print === true) {
11109cff245bSJames Collins            echo $html;
11119cff245bSJames Collins        }
1112ab45ba71SJames Collins        return $html;
1113ab45ba71SJames Collins    }
1114ab45ba71SJames Collins
1115ab45ba71SJames Collins
1116a8eebd82SJames Collins    /**
1117a8eebd82SJames Collins     * Print or return content
1118a8eebd82SJames Collins     *
11199cff245bSJames Collins     * @param   boolean $print Print content.
1120a8eebd82SJames Collins     * @return  string         contents
1121a8eebd82SJames Collins     */
11229cff245bSJames Collins    public function includeContent(bool $print = true)
112310b40067Snomadjimbob    {
1124ab45ba71SJames Collins        ob_start();
11259cff245bSJames Collins        tpl_content(false);
1126ab45ba71SJames Collins        $html = ob_get_contents();
1127ab45ba71SJames Collins        ob_end_clean();
1128ab45ba71SJames Collins
1129ab45ba71SJames Collins        $html = $this->includeIcons($html);
1130ab45ba71SJames Collins        $html = $this->parseContent($html);
1131ab45ba71SJames Collins
1132ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1133ab45ba71SJames Collins
11349cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
11359cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
11369cff245bSJames Collins        }
1137a8eebd82SJames Collins
1138a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1139a8eebd82SJames Collins
11409cff245bSJames Collins        if ($print === true) {
11419cff245bSJames Collins            echo $html;
11429cff245bSJames Collins        }
1143ab45ba71SJames Collins        return $html;
1144ab45ba71SJames Collins    }
1145ab45ba71SJames Collins
1146a8eebd82SJames Collins    /**
1147ab45ba71SJames Collins     * Print or return footer
1148ab45ba71SJames Collins     *
11499cff245bSJames Collins     * @param   boolean $print Print footer.
11509cff245bSJames Collins     * @return  string         HTML string containing footer
1151ab45ba71SJames Collins     */
11529cff245bSJames Collins    public function includeFooter(bool $print = true)
115310b40067Snomadjimbob    {
1154ab45ba71SJames Collins        global $ACT;
1155ab45ba71SJames Collins
1156ab45ba71SJames Collins        $html = '';
1157ab45ba71SJames Collins
1158ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11599cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11609cff245bSJames Collins        $html .= $this->includePage('footer', false);
1161ab45ba71SJames Collins
1162a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1163ab45ba71SJames Collins
11649cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1165ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11669cff245bSJames Collins            $html .= $this->includeSearch(false);
1167ab45ba71SJames Collins            $html .= '</div>';
1168ab45ba71SJames Collins        }
1169ab45ba71SJames Collins
1170a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11719cff245bSJames Collins        if (
11723a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
11733a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11749cff245bSJames Collins        ) {
11759cff245bSJames Collins            $html .= $this->includePageTools(false);
11769cff245bSJames Collins        }
1177ab45ba71SJames Collins
11789cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11799cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1180ab45ba71SJames Collins
1181ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11829cff245bSJames Collins        if ($licenseType !== 'none') {
11839cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1184ab45ba71SJames Collins        }
1185ab45ba71SJames Collins
1186ab45ba71SJames Collins        $html .= '</footer>';
1187ab45ba71SJames Collins
11889cff245bSJames Collins        if ($print === true) {
11899cff245bSJames Collins            echo $html;
11909cff245bSJames Collins        }
1191ab45ba71SJames Collins        return $html;
1192ab45ba71SJames Collins    }
1193ab45ba71SJames Collins
1194ab45ba71SJames Collins
1195a8eebd82SJames Collins    /**
1196ab45ba71SJames Collins     * Print or return breadcrumb trail
1197ab45ba71SJames Collins     *
11989cff245bSJames Collins     * @param   boolean $print Print out trail.
11999cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12009cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1201ab45ba71SJames Collins     */
12029cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
120310b40067Snomadjimbob    {
1204a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1205a8eebd82SJames Collins
12063a385f2cSJames Collins        if (
12073a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
120895372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
12093a385f2cSJames Collins        ) {
12109cff245bSJames Collins            return '';
12119cff245bSJames Collins        }
1212ab45ba71SJames Collins
1213ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1214f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
12153a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
121695372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
12179cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1218ab45ba71SJames Collins                    ob_start();
121975adba86SJames Collins                    tpl_breadcrumbs();
1220ab45ba71SJames Collins                    $html .= ob_get_contents();
1221ab45ba71SJames Collins                    ob_end_clean();
1222ab45ba71SJames Collins                } else {
1223ab45ba71SJames Collins                    $sep = '•';
1224ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1225ab45ba71SJames Collins
12269cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1227ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
12289cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1229ab45ba71SJames Collins
12309cff245bSJames Collins                        if ($img !== false) {
1231ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1232ab45ba71SJames Collins                        }
123347161538SJames Collins                    }
123447161538SJames Collins
12359cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1236ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
12379cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1238ab45ba71SJames Collins
12399cff245bSJames Collins                        if ($img !== false) {
1240ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1241ab45ba71SJames Collins                        }
1242ab45ba71SJames Collins                    }
1243ab45ba71SJames Collins
1244ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1245ab45ba71SJames Collins
1246ab45ba71SJames Collins                    $html .= '<ul>';
12473a385f2cSJames Collins                    if (empty($prefix) === false) {
12489cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12499cff245bSJames Collins                    }
1250ab45ba71SJames Collins
1251ab45ba71SJames Collins                    $last = count($crumbs);
1252ab45ba71SJames Collins                    $i    = 0;
1253ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1254ab45ba71SJames Collins                        $i++;
125595372bffSJames Collins                        if ($i !== 1) {
1256ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
125795372bffSJames Collins                        }
12589cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12599cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1260ab45ba71SJames Collins                        $html .= '</li>';
1261ab45ba71SJames Collins                    }
1262ab45ba71SJames Collins
1263ab45ba71SJames Collins                    $html .= '</ul>';
12649cff245bSJames Collins                }//end if
12659cff245bSJames Collins            }//end if
12669cff245bSJames Collins        }//end if
12673d11a778SJames Collins
12683d11a778SJames Collins        $html .= '</div>';
12693d11a778SJames Collins        $html .= '</div>';
12703d11a778SJames Collins
12719cff245bSJames Collins        if ($parse === true) {
12729cff245bSJames Collins            $html = $this->includeIcons($html);
12739cff245bSJames Collins        }
12749cff245bSJames Collins        if ($print === true) {
12759cff245bSJames Collins            echo $html;
12769cff245bSJames Collins        }
12773d11a778SJames Collins        return $html;
12783d11a778SJames Collins    }
12793d11a778SJames Collins
12803d11a778SJames Collins    /**
12813d11a778SJames Collins     * Print or return you are here trail
12823d11a778SJames Collins     *
12839cff245bSJames Collins     * @param   boolean $print Print out trail.
12849cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12859cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12863d11a778SJames Collins     */
12879cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12883d11a778SJames Collins    {
12893d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
12903d11a778SJames Collins
12913a385f2cSJames Collins        if (
12923a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
129395372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
12943a385f2cSJames Collins        ) {
12959cff245bSJames Collins            return '';
12969cff245bSJames Collins        }
12973d11a778SJames Collins
12983d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
12993d11a778SJames Collins        $html .= '<div class="mikio-container">';
13003a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
130195372bffSJames Collins            if ($conf['youarehere'] !== 0) {
13029cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
130395372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1304ab45ba71SJames Collins                    ob_start();
130575adba86SJames Collins                    tpl_youarehere();
1306ab45ba71SJames Collins                    $html .= ob_get_contents();
1307ab45ba71SJames Collins                    ob_end_clean();
130895372bffSJames Collins                    $html .= '</div>';
1309ab45ba71SJames Collins                } else {
1310ab45ba71SJames Collins                    $sep = ' » ';
1311ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1312ab45ba71SJames Collins
13139cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
13143d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
13159cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1316ab45ba71SJames Collins
13179cff245bSJames Collins                        if ($img !== false) {
1318ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1319ab45ba71SJames Collins                        }
132075adba86SJames Collins                    }
132175adba86SJames Collins
13229cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
13233d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
13249cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1325ab45ba71SJames Collins
13269cff245bSJames Collins                        if ($img !== false) {
1327ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
132875adba86SJames Collins                        }
132947161538SJames Collins                    }
133047161538SJames Collins
1331ab45ba71SJames Collins                    $html .= '<ul>';
13323a385f2cSJames Collins                    if (empty($prefix) === false) {
13339cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
13349cff245bSJames Collins                    }
13359cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1336ab45ba71SJames Collins
1337ab45ba71SJames Collins                    $parts = explode(':', $ID);
1338ab45ba71SJames Collins                    $count = count($parts);
1339ab45ba71SJames Collins
1340ab45ba71SJames Collins                    $part = '';
13419cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1342ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1343ab45ba71SJames Collins                        $page = $part;
13449cff245bSJames Collins                        if ($page === $conf['start']) {
13459cff245bSJames Collins                            continue;
13469cff245bSJames Collins                        }
1347ab45ba71SJames Collins
1348ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
13499cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1350ab45ba71SJames Collins                    }
1351ab45ba71SJames Collins
1352ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
13539cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1354ab45ba71SJames Collins                        $page = $part . $parts[$i];
13559cff245bSJames Collins                        if ($page !== $conf['start']) {
1356ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
13579cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1358ab45ba71SJames Collins                        }
1359ab45ba71SJames Collins                    }
1360ab45ba71SJames Collins
1361ab45ba71SJames Collins                    $html .= '</ul>';
13629cff245bSJames Collins                }//end if
13639cff245bSJames Collins            }//end if
1364ab45ba71SJames Collins
13653d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13669cff245bSJames Collins            if ($showLast !== 0) {
1367a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13689cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1369a8eebd82SJames Collins                    $count = count($matches[0]);
1370a8eebd82SJames Collins                    $list = '';
1371a8eebd82SJames Collins
1372a8eebd82SJames Collins                    // Show Home
1373a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1374a8eebd82SJames Collins
1375a8eebd82SJames Collins                    $list .= '<li>...</li>';
13769cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1377a8eebd82SJames Collins                        $list .= $matches[0][$i];
1378a8eebd82SJames Collins                    }
1379a8eebd82SJames Collins
1380a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1381a8eebd82SJames Collins                }
1382a8eebd82SJames Collins            }
1383a8eebd82SJames Collins
13843d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1385a8eebd82SJames Collins                case 'none':
1386a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1387a8eebd82SJames Collins                    break;
1388a8eebd82SJames Collins                case 'home':
1389a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1390a8eebd82SJames Collins                    break;
1391a8eebd82SJames Collins                case 'icon':
13929cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
13939cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1394a8eebd82SJames Collins                    break;
1395a8eebd82SJames Collins            }
1396a8eebd82SJames Collins        } else {
1397a8eebd82SJames Collins            $html .= '&#8810; ';
13989cff245bSJames Collins            if (isset($_GET['page']) === true) {
13999cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1400a8eebd82SJames Collins            }
14014057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
14029cff245bSJames Collins        }//end if
14039cff245bSJames Collins
14049cff245bSJames Collins        $html .= '</div>';
14059cff245bSJames Collins        $html .= '</div>';
14069cff245bSJames Collins
14079cff245bSJames Collins        if ($parse === true) {
14089cff245bSJames Collins            $html = $this->includeIcons($html);
1409a8eebd82SJames Collins        }
14109cff245bSJames Collins        if ($print === true) {
14119cff245bSJames Collins            echo $html;
14129cff245bSJames Collins        }
1413ab45ba71SJames Collins        return $html;
1414ab45ba71SJames Collins    }
1415ab45ba71SJames Collins
14161785fc73SJames Collins    /**
14171785fc73SJames Collins     * Get Page Title
14189cff245bSJames Collins     *
14199cff245bSJames Collins     * @return string page title
14201785fc73SJames Collins     */
142110b40067Snomadjimbob    public function parsePageTitle()
142210b40067Snomadjimbob    {
14232060e56cSJames Collins        global $ID;
14242060e56cSJames Collins
14252060e56cSJames Collins        $title = p_get_first_heading($ID);
14269cff245bSJames Collins        if (strlen($title) <= 0) {
14279cff245bSJames Collins            $title = tpl_pagetitle(null, true);
14289cff245bSJames Collins        }
14291785fc73SJames Collins        $title = $this->includeIcons($title);
14301785fc73SJames Collins
14311785fc73SJames Collins        return $title;
14321785fc73SJames Collins    }
14331785fc73SJames Collins
1434ab45ba71SJames Collins
143575adba86SJames Collins    /**
1436a8eebd82SJames Collins     * Print or return hero block
143775adba86SJames Collins     *
14389cff245bSJames Collins     * @param   boolean $print Print content.
1439a8eebd82SJames Collins     * @return  string         contents of hero
144075adba86SJames Collins     */
14419cff245bSJames Collins    public function includeHero(bool $print = true)
144210b40067Snomadjimbob    {
1443a8eebd82SJames Collins        $html = '';
144447161538SJames Collins
14459cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1446a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1447f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1448a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
14493a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
14509cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
14519cff245bSJames Collins            }
14523a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
14539cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
14549cff245bSJames Collins            }
1455ab45ba71SJames Collins
1456a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
14571785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1458a8eebd82SJames Collins            $html .= '</h1>';
1459a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1460a8eebd82SJames Collins            $html .= '</div>';
146147161538SJames Collins
14629cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1463a8eebd82SJames Collins            $hero_image_resize_class = '';
14643a385f2cSJames Collins            if (empty($hero_image) === false) {
1465a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1466a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
146747161538SJames Collins            }
1468a8eebd82SJames Collins
14699cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14709cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1471a8eebd82SJames Collins
1472a8eebd82SJames Collins            $html .= '</div>';
1473f8039bf2SJames Collins            $html .= '</div>';
14749cff245bSJames Collins        }//end if
14759cff245bSJames Collins
14769cff245bSJames Collins        if ($print === true) {
14779cff245bSJames Collins            echo $html;
147875adba86SJames Collins        }
1479a8eebd82SJames Collins
1480a8eebd82SJames Collins        return $html;
148175adba86SJames Collins    }
148275adba86SJames Collins
148375adba86SJames Collins
148475adba86SJames Collins    /**
1485a8eebd82SJames Collins     * Print or return out TOC
148675adba86SJames Collins     *
14879cff245bSJames Collins     * @param   boolean $print Print TOC.
14889cff245bSJames Collins     * @param   boolean $parse Parse icons.
1489a8eebd82SJames Collins     * @return  string         contents of TOC
149075adba86SJames Collins     */
14919cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
149210b40067Snomadjimbob    {
1493ab45ba71SJames Collins        $html = '';
14942b4583abSJames Collins
1495ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1496ab45ba71SJames Collins
14973a385f2cSJames Collins        if (empty($tocHtml) === false) {
1498f65a4e5eSJames Collins            $tocHtml = preg_replace(
1499f65a4e5eSJames Collins                '/(<h3.+?toggle.+?>)(.+?)<\/h3>/',
1500f65a4e5eSJames Collins                '$1' .
1501f65a4e5eSJames Collins                $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' .
1502f65a4e5eSJames Collins                $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>',
1503f65a4e5eSJames Collins                $tocHtml
1504f65a4e5eSJames Collins            );
1505ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1506a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1507ab45ba71SJames Collins
1508ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1509ab45ba71SJames Collins            $html .= $tocHtml;
1510ab45ba71SJames Collins            $html .= '</div>';
15112b4583abSJames Collins        }
15122b4583abSJames Collins
15139cff245bSJames Collins        if ($parse === true) {
15149cff245bSJames Collins            $html = $this->includeIcons($html);
15159cff245bSJames Collins        }
15169cff245bSJames Collins
15179cff245bSJames Collins        if ($print === true) {
1518ab45ba71SJames Collins            echo $html;
1519ab45ba71SJames Collins        }
1520ab45ba71SJames Collins
15219cff245bSJames Collins        return $html;
15229cff245bSJames Collins    }
15239cff245bSJames Collins
1524ab45ba71SJames Collins
1525a8eebd82SJames Collins    /**
1526ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1527ab45ba71SJames Collins     *
15289cff245bSJames Collins     * @param   string $str Content to parse.
1529ab45ba71SJames Collins     * @return  string      parsed string
1530ab45ba71SJames Collins     */
15319cff245bSJames Collins    public function includeIcons(string $str)
153210b40067Snomadjimbob    {
1533ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1534ab45ba71SJames Collins
1535ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
15363a385f2cSJames Collins        if (empty($iconTag) === true) {
15379cff245bSJames Collins            return $str;
15389cff245bSJames Collins        }
1539ab45ba71SJames Collins
15409cff245bSJames Collins        if (
15419cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
15423a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
15439cff245bSJames Collins        ) {
1544a2005a27SJames Collins            $content = $str;
1545a2005a27SJames Collins            $preview = null;
1546a2005a27SJames Collins
15473a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15489cff245bSJames Collins                $html = new \simple_html_dom();
1549a2005a27SJames Collins                $html->stripRNAttrValues = false;
1550a2005a27SJames Collins                $html->load($str, true, false);
1551a2005a27SJames Collins
1552a2005a27SJames Collins                $preview = $html->find('div.preview');
15539cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1554a2005a27SJames Collins                    $content = $preview[0]->innertext;
1555a2005a27SJames Collins                }
1556a2005a27SJames Collins            }
1557a2005a27SJames Collins
15581785fc73SJames Collins            $page_regex = '/(.*)/';
15599cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
15601785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
15611785fc73SJames Collins            }
15621785fc73SJames Collins
15631785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1564a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1565a2005a27SJames Collins
156610b40067Snomadjimbob                return preg_replace_callback(
156710b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1568ab45ba71SJames Collins                    function ($matches) {
1569ab45ba71SJames Collins                        global $MIKIO_ICONS;
1570ab45ba71SJames Collins
1571ab45ba71SJames Collins                        $s = $matches[0];
1572ab45ba71SJames Collins
1573ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1574ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1575ab45ba71SJames Collins
1576ab45ba71SJames Collins                            if (count($matches) > 1) {
1577ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1578ab45ba71SJames Collins
1579ab45ba71SJames Collins                                if (count($e) > 1) {
1580ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15819cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1582ab45ba71SJames Collins                                            $icon = $iconItem;
1583ab45ba71SJames Collins
1584ab45ba71SJames Collins                                            $s = $icon['insert'];
1585ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
15861cdedf28SJames Collins                                                if (count($e) < $i || empty($e[$i]) === true) {
15879cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1588ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1589ab45ba71SJames Collins                                                    }
1590ab45ba71SJames Collins                                                } else {
1591ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1592ab45ba71SJames Collins                                                }
1593ab45ba71SJames Collins                                            }
1594ab45ba71SJames Collins
1595ab45ba71SJames Collins                                            $dir = '';
15969cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
15979cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
15989cff245bSJames Collins                                            }
1599ab45ba71SJames Collins
1600ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1601ab45ba71SJames Collins
1602ab45ba71SJames Collins                                            break;
16039cff245bSJames Collins                                        }//end if
16049cff245bSJames Collins                                    }//end foreach
1605ab45ba71SJames Collins                                } else {
1606ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
16079cff245bSJames Collins                                }//end if
16089cff245bSJames Collins                            }//end if
16099cff245bSJames Collins                        }//end if
161075adba86SJames Collins
1611ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
16129cff245bSJames Collins                        if ($count === 0) {
1613ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1614ab45ba71SJames Collins                        }
1615ab45ba71SJames Collins
1616ab45ba71SJames Collins                        return $s;
1617ab45ba71SJames Collins                    },
161810b40067Snomadjimbob                    $icons[0]
161910b40067Snomadjimbob                );
1620a2005a27SJames Collins            }, $content);
1621a2005a27SJames Collins
16223a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
16239cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1624a2005a27SJames Collins                    $preview[0]->innertext = $content;
1625a2005a27SJames Collins                }
1626a2005a27SJames Collins
1627a2005a27SJames Collins                $str = $html->save();
1628a2005a27SJames Collins                $html->clear();
1629a2005a27SJames Collins                unset($html);
1630a2005a27SJames Collins            } else {
1631a2005a27SJames Collins                $str = $content;
1632a2005a27SJames Collins            }
16339cff245bSJames Collins        }//end if
1634ab45ba71SJames Collins
1635ab45ba71SJames Collins        return $str;
1636ab45ba71SJames Collins    }
163747161538SJames Collins
1638c165b184SJames Collins    /**
1639a8eebd82SJames Collins     * Parse HTML for theme
1640c165b184SJames Collins     *
16419cff245bSJames Collins     * @param   string $content HTML content to parse.
1642a8eebd82SJames Collins     * @return  string          Parsed content
1643c165b184SJames Collins     */
16449cff245bSJames Collins    public function parseContent(string $content)
164510b40067Snomadjimbob    {
1646ab45ba71SJames Collins        global $INPUT, $ACT;
1647ab45ba71SJames Collins
1648a8eebd82SJames Collins        // Add Mikio Section titles
16493a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
16509cff245bSJames Collins            $admin_sections = [
1651ab45ba71SJames Collins                // Section      Insert Before                 Icon
16529cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
16539cff245bSJames Collins                'search'        => ['searchButton',            ''],
16549cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
16559cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
16569cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
16579cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
16589cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
16599cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
16609cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
16619cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
16629cff245bSJames Collins                'license'       => ['licenseType',             ''],
16639cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
16649cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
16659cff245bSJames Collins            ];
1666ab45ba71SJames Collins
1667ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1668ab45ba71SJames Collins                $search = $items[0];
1669ab45ba71SJames Collins                $icon   = $items[1];
1670ab45ba71SJames Collins
167110b40067Snomadjimbob                $content = preg_replace(
1672adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16739cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16749cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16759cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16769cff245bSJames Collins                        $search . '</span>',
167710b40067Snomadjimbob                    $content
167810b40067Snomadjimbob                );
1679ab45ba71SJames Collins            }
1680bb5a3dd1SJames Collins        } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) {
1681ad182e6dSnomadjimbob            $mikioPluginMissing = true;
1682ad182e6dSnomadjimbob            /* Hide plugin fields if not installed */
16839ffe9161Snomadjimbob            if (plugin_load('action', 'mikioplugin') !== null) {
1684ad182e6dSnomadjimbob                $mikioPluginMissing = false;
1685ad182e6dSnomadjimbob            }
1686ad182e6dSnomadjimbob
1687cee81679SJames Collins            $style_headers = [
1688f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__text_'],
1689f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__code_'],
1690f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__control_'],
1691f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__topheader_'],
1692f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__navbar_'],
1693f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'],
1694f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__tag_background_color_'],
1695f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'],
1696f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__hero_'],
1697f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__sidebar_'],
1698f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__content_'],
1699f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__toc_'],
1700f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__pagetools_'],
1701f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__footer_'],
1702f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__table_'],
1703f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__dropdown_'],
1704f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__section_edit_'],
1705f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__tree_'],
1706f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__tab_'],
1707ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2',
17089ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17099ffe9161Snomadjimbob                ],
1710ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing],
1711ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_',
17129ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17139ffe9161Snomadjimbob                ],
1714ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing],
1715ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing],
1716ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing],
1717ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing],
1718ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing],
1719ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing],
1720ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing],
1721ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing],
1722ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing],
1723ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing],
1724ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing],
1725cee81679SJames Collins                ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'],
1726f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__darkmode_text_'],
1727f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__darkmode_code_'],
1728f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__darkmode_control_'],
1729f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'],
1730f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'],
1731f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'],
1732f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'],
1733f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'],
1734f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'],
1735f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'],
1736f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__darkmode_content_'],
1737f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'],
1738f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'],
1739f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'],
1740f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__darkmode_table_'],
1741f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'],
1742f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'],
1743f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'],
1744f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'],
1745ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2',
17469ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17479ffe9161Snomadjimbob                ],
1748ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_',
17499ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17509ffe9161Snomadjimbob                ],
1751ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_',
17529ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17539ffe9161Snomadjimbob                ],
1754ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_',
17559ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17569ffe9161Snomadjimbob                ],
1757ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_',
17589ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17599ffe9161Snomadjimbob                ],
1760ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_',
17619ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17629ffe9161Snomadjimbob                ],
1763ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_',
17649ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17659ffe9161Snomadjimbob                ],
1766ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_',
17679ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17689ffe9161Snomadjimbob                ],
1769ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_',
17709ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17719ffe9161Snomadjimbob                ],
1772ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_',
17739ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17749ffe9161Snomadjimbob                ],
1775ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_',
17769ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17779ffe9161Snomadjimbob                ],
1778ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing],
1779ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_',
17809ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17819ffe9161Snomadjimbob                ],
1782ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing],
1783cee81679SJames Collins            ];
1784cee81679SJames Collins
1785cee81679SJames Collins            foreach ($style_headers as $header) {
1786cee81679SJames Collins                if (array_key_exists('heading', $header) === false) {
1787cee81679SJames Collins                    $header['heading'] = 'h3';
1788cee81679SJames Collins                }
1789cee81679SJames Collins
1790ad182e6dSnomadjimbob                if (array_key_exists('hidden', $header) === false) {
1791ad182e6dSnomadjimbob                    $header['hidden'] = false;
1792ad182e6dSnomadjimbob                }
1793ad182e6dSnomadjimbob
17941244e3ceSJames Collins                $content = preg_replace(
1795f65a4e5eSJames Collins                    '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s',
17969ffe9161Snomadjimbob                    '</tbody></table><' . $header['heading'] . ' style="display:' .
17979ffe9161Snomadjimbob                    ($header['hidden'] === true ? 'none' : 'block') . '">' .
17989ffe9161Snomadjimbob                    $header['title'] . '</' . $header['heading'] . '>
1799ad182e6dSnomadjimbob                    <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1',
18001244e3ceSJames Collins                    $content,
18011244e3ceSJames Collins                    1
18021244e3ceSJames Collins                );
1803cee81679SJames Collins            }
1804f65a4e5eSJames Collins
1805dea1f088SJames Collins            $content = preg_replace_callback('/<input type="color"[^>]*>/', function ($match) {
1806dea1f088SJames Collins                // Get the ID of the <input type="color"> element
1807dea1f088SJames Collins                preg_match('/id="([^"]*)"/', $match[0], $matches);
1808dea1f088SJames Collins
1809dea1f088SJames Collins                // Replace type with text and remove the id attribute
1810*2c87ab0dSJames Collins                $replacement = preg_replace(
1811*2c87ab0dSJames Collins                    ['/type="color"/', '/id="([^"]*)"/'],
1812*2c87ab0dSJames Collins                    ['type="text" class="mikio-color-text-input"', 'for="$1"'],
1813*2c87ab0dSJames Collins                    $match[0]
1814*2c87ab0dSJames Collins                );
1815dea1f088SJames Collins
1816dea1f088SJames Collins                return '<div class="mikio-color-picker">' . $replacement . $match[0] . '</div>';
1817dea1f088SJames Collins            }, $content);
1818bb5a3dd1SJames Collins        }//end if
1819ab45ba71SJames Collins
18203a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1821a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1822a8eebd82SJames Collins        }
1823ab45ba71SJames Collins
1824a8eebd82SJames Collins        // Page Revisions - Table Fix
18259cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
18269cff245bSJames Collins            $content = preg_replace(
18279cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
18289cff245bSJames Collins                '<span>$1</span>',
18299cff245bSJames Collins                $content
18309cff245bSJames Collins            );
1831a8eebd82SJames Collins        }
1832ab45ba71SJames Collins
18339cff245bSJames Collins        $html = new \simple_html_dom();
1834bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1835c165b184SJames Collins        $html->load($content, true, false);
1836c165b184SJames Collins
18379cff245bSJames Collins        if ($html === false) {
18389cff245bSJames Collins            return $content;
18399cff245bSJames Collins        }
1840ab45ba71SJames Collins
1841ab45ba71SJames Collins        /* Buttons */
1842ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1843ab45ba71SJames Collins            $c = explode(' ', $node->class);
18449cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
18459cff245bSJames Collins                $c[] = 'mikio-button';
18469cff245bSJames Collins            }
1847ab45ba71SJames Collins            $node->class = implode(' ', $c);
1848c165b184SJames Collins        }
1849c165b184SJames Collins
1850ab45ba71SJames Collins
1851ab45ba71SJames Collins        /* Buttons - Primary */
1852ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1853ab45ba71SJames Collins            $c = explode(' ', $node->class);
18549cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
18559cff245bSJames Collins                $c[] = 'mikio-primary';
18569cff245bSJames Collins            }
1857ab45ba71SJames Collins            $node->class = implode(' ', $c);
1858ab45ba71SJames Collins        }
1859ab45ba71SJames Collins
1860a8eebd82SJames Collins        /* Hide page title if hero is enabled */
18619cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
18621785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
186347161538SJames Collins
186447161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
18659cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1866a8eebd82SJames Collins                    // $elm->innertext = '';
1867a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1868a8eebd82SJames Collins
186947161538SJames Collins                    break;
187047161538SJames Collins                }
187147161538SJames Collins            }
187247161538SJames Collins        }
1873c165b184SJames Collins
1874a8eebd82SJames Collins        /* Hero subtitle */
18752b4583abSJames Collins        foreach ($html->find('p') as $elm) {
1876d0d6c450SJames Collins            if (preg_match('/[~-]~hero-subtitle (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1877d0d6c450SJames Collins                $subtitle = $matches[1];
1878a8eebd82SJames Collins                $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1879a8eebd82SJames Collins
1880d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-subtitle (.+?)~[~-]/ui', '', $elm->innertext);
18812b4583abSJames Collins                break;
18822b4583abSJames Collins            }
18832b4583abSJames Collins        }
18842b4583abSJames Collins
1885a8eebd82SJames Collins        /* Hero image */
1886a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1887a8eebd82SJames Collins            $image = '';
1888d0d6c450SJames Collins            preg_match('/[~-]~hero-image (.+?)~[~-](?!.?")/ui', $elm->innertext, $matches);
1889a8eebd82SJames Collins            if (count($matches) > 0) {
1890a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1891a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1892a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1893a8eebd82SJames Collins                } else {
1894a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1895a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1896a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1897a8eebd82SJames Collins                    } else {
1898a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
18999cff245bSJames Collins                        if (stripos($image, ':') === false) {
19009cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1901a8eebd82SJames Collins                            $i = stripos($image, '?');
19029cff245bSJames Collins                            if ($i !== false) {
1903a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1904c165b184SJames Collins                            }
1905c165b184SJames Collins
1906a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1907ab45ba71SJames Collins                        }
1908ab45ba71SJames Collins                    }
1909ab45ba71SJames Collins                }
1910ab45ba71SJames Collins
1911a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1912a8eebd82SJames Collins
1913d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-image (.+?)~[~-].*/ui', '', $elm->innertext);
19149cff245bSJames Collins            }//end if
19159cff245bSJames Collins        }//end foreach
1916ab45ba71SJames Collins
19179cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
19189cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1919a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1920d0d6c450SJames Collins            if (preg_match('/[~-]~hero-colors (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1921d0d6c450SJames Collins                $subtitle = $matches[1];
1922d0d6c450SJames Collins                $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $subtitle . '\')';
1923ab45ba71SJames Collins
1924d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-colors (.+?)~[~-]/ui', '', $elm->innertext);
1925a8eebd82SJames Collins                break;
1926ab45ba71SJames Collins            }
1927ab45ba71SJames Collins        }
1928ab45ba71SJames Collins
192996ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
193096ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
19313a44a74aSJames Collins            if (preg_match('/[~-]~hide-parts (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1932d0d6c450SJames Collins                $parts = explode(' ', $matches[1]);
193396ec8e1eSJames Collins                $script = '';
193496ec8e1eSJames Collins
193596ec8e1eSJames Collins                foreach ($parts as $part) {
193696ec8e1eSJames Collins                    if (strlen($part) > 0) {
193796ec8e1eSJames Collins                        $script .= 'mikio.hidePart(\'' . $part . '\');';
193896ec8e1eSJames Collins                    }
193996ec8e1eSJames Collins                }
194096ec8e1eSJames Collins
194196ec8e1eSJames Collins                if (strlen($script) > 0) {
194296ec8e1eSJames Collins                    $this->footerScript['hide-parts'] = $script;
194396ec8e1eSJames Collins                }
194496ec8e1eSJames Collins
19453a44a74aSJames Collins                $elm->innertext = preg_replace('/[~-]~hide-parts (.+?)~[~-]/ui', '', $elm->innertext);
194696ec8e1eSJames Collins                break;
1947d0d6c450SJames Collins            }
19489cff245bSJames Collins        }//end foreach
194996ec8e1eSJames Collins
195096ec8e1eSJames Collins
1951a8eebd82SJames Collins        /* Page Tags (tag plugin) */
19529cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1953a8eebd82SJames Collins            $tags = '';
1954a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1955a8eebd82SJames Collins                $tags .= $elm->outertext;
1956a8eebd82SJames Collins            }
1957a8eebd82SJames Collins
1958a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1959a8eebd82SJames Collins                $elm->innertext = '';
1960a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1961a8eebd82SJames Collins            }
1962a8eebd82SJames Collins
19633a385f2cSJames Collins            if (empty($tags) === false) {
1964a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1965a8eebd82SJames Collins            }
1966ab45ba71SJames Collins        }
1967ab45ba71SJames Collins
1968ab45ba71SJames Collins        // Configuration Manager
19693a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1970ab45ba71SJames Collins            // Additional save buttons
1971ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1972ab45ba71SJames Collins                $saveButtons = '';
1973ab45ba71SJames Collins
1974ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1975ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1976a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1977ab45ba71SJames Collins                    $elm->outertext = '';
1978ab45ba71SJames Collins                }
1979ab45ba71SJames Collins
1980ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1981ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1982ab45ba71SJames Collins                }
1983ab45ba71SJames Collins            }
1984ab45ba71SJames Collins        }
1985ab45ba71SJames Collins
1986ab45ba71SJames Collins        $content = $html->save();
1987c165b184SJames Collins        $html->clear();
1988c165b184SJames Collins        unset($html);
1989c165b184SJames Collins
1990c165b184SJames Collins        return $content;
1991c165b184SJames Collins    }
19922b4583abSJames Collins
19932b4583abSJames Collins
1994a8eebd82SJames Collins    /**
1995a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
1996a8eebd82SJames Collins     *
19979cff245bSJames Collins     * @param   string $str String to parse.
19989cff245bSJames Collins     * @return  string      parsed URI
1999a8eebd82SJames Collins     */
20009cff245bSJames Collins    public function getLink(string $str)
200110b40067Snomadjimbob    {
20022b4583abSJames Collins        $i = strpos($str, '://');
20039cff245bSJames Collins        if ($i !== false) {
20049cff245bSJames Collins            return $str;
20059cff245bSJames Collins        }
20062b4583abSJames Collins
20072b4583abSJames Collins        return wl($str);
20082b4583abSJames Collins    }
2009ab45ba71SJames Collins
2010ab45ba71SJames Collins
2011a8eebd82SJames Collins    /**
2012a8eebd82SJames Collins     * Check if the user can edit current namespace/page
2013a8eebd82SJames Collins     *
2014a8eebd82SJames Collins     * @return  boolean  user can edit
2015a8eebd82SJames Collins     */
201610b40067Snomadjimbob    public function userCanEdit()
201710b40067Snomadjimbob    {
2018ab45ba71SJames Collins        global $INFO;
2019ab45ba71SJames Collins        global $ID;
2020ab45ba71SJames Collins
2021ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
20229cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
20239cff245bSJames Collins            return true;
20249cff245bSJames Collins        }
20259cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
20269cff245bSJames Collins            return true;
20279cff245bSJames Collins        }
2028a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
20299cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
20309cff245bSJames Collins            return true;
20319cff245bSJames Collins        }
20329cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
20339cff245bSJames Collins            return true;
20349cff245bSJames Collins        }
2035ab45ba71SJames Collins
2036ab45ba71SJames Collins        return false;
2037c165b184SJames Collins    }
203847161538SJames Collins
203947161538SJames Collins
2040a8eebd82SJames Collins    /**
2041a8eebd82SJames Collins     * Search for and return the uri of a media file
2042a8eebd82SJames Collins     *
20439cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
20449cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
20459cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
20469cff245bSJames Collins     * @return string                  URI of the found media file
2047a8eebd82SJames Collins     */
20489cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
204910b40067Snomadjimbob    {
2050ab45ba71SJames Collins        global $INFO;
2051a8eebd82SJames Collins
20529cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
2053ab45ba71SJames Collins
20549cff245bSJames Collins        if ($searchCurrentNS === true) {
20559cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
20569cff245bSJames Collins        }
20579cff245bSJames Collins        if ($propagate === true) {
2058ab45ba71SJames Collins            $prefix[] = ':';
2059ab45ba71SJames Collins            $prefix[] = ':wiki:';
2060a8eebd82SJames Collins        }
2061ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
20623a385f2cSJames Collins        if (empty($theme) === false) {
20639cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
20649cff245bSJames Collins        }
2065ab45ba71SJames Collins        $prefix[] = 'images/';
2066ab45ba71SJames Collins
20679cff245bSJames Collins        $search = [];
2068ab45ba71SJames Collins        foreach ($prefix as $pitem) {
2069ab45ba71SJames Collins            foreach ($ext as $eitem) {
2070ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
2071ab45ba71SJames Collins            }
2072ab45ba71SJames Collins        }
2073ab45ba71SJames Collins
2074ab45ba71SJames Collins        $img = '';
2075ab45ba71SJames Collins        $file = '';
2076ab45ba71SJames Collins        $url = '';
2077ab45ba71SJames Collins        $ismedia = false;
2078ab45ba71SJames Collins        $found = false;
2079ab45ba71SJames Collins
2080ab45ba71SJames Collins        foreach ($search as $img) {
20813a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
2082ab45ba71SJames Collins                $file    = mediaFN($img);
2083ab45ba71SJames Collins                $ismedia = true;
2084ab45ba71SJames Collins            } else {
2085ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
2086ab45ba71SJames Collins                $ismedia = false;
2087ab45ba71SJames Collins            }
2088ab45ba71SJames Collins
20899cff245bSJames Collins            if (file_exists($file) === true) {
2090ab45ba71SJames Collins                $found = true;
2091ab45ba71SJames Collins                break;
2092ab45ba71SJames Collins            }
2093ab45ba71SJames Collins        }
2094ab45ba71SJames Collins
20959cff245bSJames Collins        if ($found === false) {
20969cff245bSJames Collins            return false;
20979cff245bSJames Collins        }
2098ab45ba71SJames Collins
20999cff245bSJames Collins        if ($ismedia === true) {
2100ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
2101ab45ba71SJames Collins        } else {
2102ab45ba71SJames Collins            $url = tpl_basedir() . $img;
2103ab45ba71SJames Collins        }
2104ab45ba71SJames Collins
2105ab45ba71SJames Collins        return $url;
2106ab45ba71SJames Collins    }
2107ab45ba71SJames Collins
2108a8eebd82SJames Collins
2109a8eebd82SJames Collins    /**
2110ab45ba71SJames Collins     * Print or return the page title
2111ab45ba71SJames Collins     *
21129cff245bSJames Collins     * @param string $page Page id or empty string for current page.
2113ab45ba71SJames Collins     * @return string      generated content
2114ab45ba71SJames Collins     */
21159cff245bSJames Collins    public function getPageTitle(string $page = '')
211610b40067Snomadjimbob    {
2117ab45ba71SJames Collins        global $ID, $conf;
2118ab45ba71SJames Collins
2119ab45ba71SJames Collins        $html = '';
2120ab45ba71SJames Collins
21213a385f2cSJames Collins        if (empty($page) === true) {
21229cff245bSJames Collins            $page = $ID;
21239cff245bSJames Collins        }
2124ab45ba71SJames Collins
2125ab45ba71SJames Collins        $html = p_get_first_heading($page);
2126ab45ba71SJames Collins        $html = strip_tags($html);
2127ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
2128ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
2129ab45ba71SJames Collins        $html = trim($html);
2130ab45ba71SJames Collins
2131ab45ba71SJames Collins        return $html;
2132ab45ba71SJames Collins    }
2133a8eebd82SJames Collins
2134a8eebd82SJames Collins
2135a8eebd82SJames Collins    /**
2136a8eebd82SJames Collins     * Return inline theme icon
2137a8eebd82SJames Collins     *
21389cff245bSJames Collins     * @param   string $type  Icon to retreive.
21399e41d878SJames Collins     * @param   string $class Classname to insert.
21409cff245bSJames Collins     * @return  string        HTML icon content
2141a8eebd82SJames Collins     */
21429e41d878SJames Collins    public function mikioInlineIcon(string $type, string $class = "")
214310b40067Snomadjimbob    {
21449e41d878SJames Collins        if (is_array($class) === true) {
21459e41d878SJames Collins            $class = explode(' ', $class);
21469e41d878SJames Collins        }
21479e41d878SJames Collins
21489e41d878SJames Collins        if (strlen($class) > 0) {
21499e41d878SJames Collins            $class = ' ' . $class;
21509e41d878SJames Collins        }
21519e41d878SJames Collins
2152a8eebd82SJames Collins        switch ($type) {
2153a8eebd82SJames Collins            case 'wrench':
2154906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792
2155906e1a13SJames Collins1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,53.152542,1217.0847)"><path d="m 384,64 q 0,26 -19,45 -19,
2156906e1a13SJames Collins19 -45,19 -26,0 -45,-19 -19,-19 -19,-45 0,-26 19,-45 19,-19 45,-19 26,0 45,19 19,19 19,45 z m 644,420 -682,-682 q -37,
2157906e1a13SJames Collins-37 -90,-37 -52,0 -91,37 L 59,-90 Q 21,-54 21,0 21,53 59,91 L 740,772 Q 779,674 854.5,598.5 930,523 1028,484 z m 634,
2158906e1a13SJames Collins435 q 0,-39 -23,-106 Q 1592,679 1474.5,595.5 1357,512 1216,512 1031,512 899.5,643.5 768,775 768,960 q 0,185 131.5,316.5
2159906e1a13SJames Collins131.5,131.5 316.5,131.5 58,0 121.5,-16.5 63.5,-16.5 107.5,-46.5 16,-11 16,-28 0,-17 -16,-28 L 1152,1120 V 896 l 193,
2160906e1a13SJames Collins-107 q 5,3 79,48.5 74,45.5 135.5,81 61.5,35.5 70.5,35.5 15,0 23.5,-10 8.5,-10 8.5,-25 z"/></g></svg>';
2161a8eebd82SJames Collins            case 'file':
2162906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2163906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991">
2164906e1a13SJames Collins<path d="M 128,0 H 1152 V 768 H 736 q -40,0 -68,28 -28,28 -28,68 v 416 H 128 V 0 z m 640,896 h 299 L 768,1195 V 896 z M
2165906e1a13SJames Collins1280,768 V -32 q 0,-40 -28,-68 -28,-28 -68,-28 H 96 q -40,0 -68,28 -28,28 -28,68 v 1344 q 0,40 28,68 28,28 68,28 h 544
2166906e1a13SJames Collinsq 40,0 88,-20 48,-20 76,-48 l 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0"
21679cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
2168a8eebd82SJames Collins            case 'gear':
2169906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2170906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027">
2171906e1a13SJames Collins<path d="m 1024,640 q 0,106 -75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 0,-106 75,-181 75,-75 181,-75 106,0
2172906e1a13SJames Collins181,75 75,75 75,181 z m 512,109 V 527 q 0,-12 -8,-23 -8,-11 -20,-13 l -185,-28 q -19,-54 -39,-91 35,-50 107,-138 10,-12
2173906e1a13SJames Collins10,-25 0,-13 -9,-23 -27,-37 -99,-108 -72,-71 -94,-71 -12,0 -26,9 l -138,108 q -44,-23 -91,-38 -16,-136 -29,-186 -7,-28
2174906e1a13SJames Collins-36,-28 H 657 q -14,0 -24.5,8.5 Q 622,-111 621,-98 L 593,86 q -49,16 -90,37 L 362,16 Q 352,7 337,7 323,7 312,18 186,132
2175906e1a13SJames Collins147,186 q -7,10 -7,23 0,12 8,23 15,21 51,66.5 36,45.5 54,70.5 -27,50 -41,99 L 29,495 Q 16,497 8,507.5 0,518 0,531 v 222
2176906e1a13SJames Collinsq 0,12 8,23 8,11 19,13 l 186,28 q 14,46 39,92 -40,57 -107,138 -10,12 -10,24 0,10 9,23 26,36 98.5,107.5 72.5,71.5 94.5,
2177906e1a13SJames Collins71.5 13,0 26,-10 l 138,-107 q 44,23 91,38 16,136 29,186 7,28 36,28 h 222 q 14,0 24.5,-8.5 Q 914,1391 915,1378 l 28,-184
2178906e1a13SJames Collinsq 49,-16 90,-37 l 142,107 q 9,9 24,9 13,0 25,-10 129,-119 165,-170 7,-8 7,-22 0,-12 -8,-23 -15,-21 -51,-66.5 -36,-45.5
2179906e1a13SJames Collins-54,-70.5 26,-50 41,-98 l 183,-28 q 13,-2 21,-12.5 8,-10.5 8,-23.5 z" id="path3029" inkscape:connector-curvature="0" />
2180906e1a13SJames Collins</g></svg>';
2181a8eebd82SJames Collins            case 'user':
2182906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2183906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M
2184906e1a13SJames Collins1408,131 Q 1408,11 1335,-58.5 1262,-128 1141,-128 H 267 Q 146,-128 73,-58.5 0,11 0,131 0,184 3.5,234.5 7,285 17.5,343.5
2185906e1a13SJames Collins28,402 44,452 q 16,50 43,97.5 27,47.5 62,81 35,33.5 85.5,53.5 50.5,20 111.5,20 9,0 42,-21.5 33,-21.5 74.5,-48 41.5,
2186906e1a13SJames Collins-26.5 108,-48 Q 637,565 704,565 q 67,0 133.5,21.5 66.5,21.5 108,48 41.5,26.5 74.5,48 33,21.5 42,21.5 61,0 111.5,-20
2187906e1a13SJames Collins50.5,-20 85.5,-53.5 35,-33.5 62,-81 27,-47.5 43,-97.5 16,-50 26.5,-108.5 10.5,-58.5 14,-109 Q 1408,184 1408,131 z m
2188906e1a13SJames Collins-320,893 Q 1088,865 975.5,752.5 863,640 704,640 545,640 432.5,752.5 320,865 320,1024 320,1183 432.5,1295.5 545,1408 704,
2189906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>';
2190a8eebd82SJames Collins            case 'search':
21919e41d878SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
21929cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M27 24.57l-5.647-5.648a8.895 8.895 0 0 0 1.522-4.984C22.875 9.01
21939cff245bSJames Collins18.867 5 13.938 5 9.01 5 5 9.01 5 13.938c0 4.929 4.01 8.938 8.938 8.938a8.887 8.887 0 0 0 4.984-1.522L24.568 27 27
21949cff245bSJames Collins24.57zm-13.062-4.445a6.194 6.194 0 0 1-6.188-6.188 6.195 6.195 0 0 1 6.188-6.188 6.195 6.195 0 0 1 6.188 6.188 6.195
21959cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2196a8eebd82SJames Collins            case 'home':
2197906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2198906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g
2199906e1a13SJames Collinstransform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015"><path d="M 1408,544 V 64 Q 1408,38 1389,19 1370,0 1344,0 H
2200906e1a13SJames Collins960 V 384 H 704 V 0 H 320 q -26,0 -45,19 -19,19 -19,45 v 480 q 0,1 0.5,3 0.5,2 0.5,3 l 575,474 575,-474 q 1,-2 1,-6 z
2201906e1a13SJames Collinsm 223,69 -62,-74 q -8,-9 -21,-11 h -3 q -13,0 -21,7 L 832,1112 140,535 q -12,-8 -24,-7 -13,2 -21,11 l -62,74 q -8,10
2202906e1a13SJames Collins-7,23.5 1,13.5 11,21.5 l 719,599 q 32,26 76,26 44,0 76,-26 l 244,-204 v 195 q 0,14 9,23 9,9 23,9 h 192 q 14,0 23,-9 9,
2203906e1a13SJames Collins-9 9,-23 V 840 l 219,-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0"
22049cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
22059e41d878SJames Collins            case 'sun':
2206906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2207906e1a13SJames Collinsstyle="fill:currentColor" viewBox="0 0 16 16"><path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0
2208906e1a13SJames Collins0 8zm.5-9.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm0 11a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm5-5a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-11
2209906e1a13SJames Collins0a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm9.743-4.036a.5.5 0 1 1-.707-.707.5.5 0 0 1 .707.707zm-7.779 7.779a.5.5 0 1
2210906e1a13SJames Collins1-.707-.707.5.5 0 0 1 .707.707zm7.072 0a.5.5 0 1 1 .707-.707.5.5 0 0 1-.707.707zM3.757 4.464a.5.5 0 1 1 .707-.707.5.5
2211906e1a13SJames Collins0 0 1-.707.707z" /></svg>';
22129e41d878SJames Collins            case 'moon':
2213906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2214906e1a13SJames Collinsstyle="fill:currentColor" viewBox="0 0 16 16"><path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0
2215906e1a13SJames Collins4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0
2216906e1a13SJames Collins1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278zM4.858 1.311A7.269 7.269 0 0 0
2217906e1a13SJames Collins1.025 7.71c0 4.02 3.279 7.276 7.319 7.276a7.316 7.316 0 0 0 5.205-2.162c-.337.042-.68.063-1.029.063-4.61
2218906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>';
221934d5f19aSJames Collins            case 'sunmoon':
2220d0fba6d1SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2221d0fba6d1SJames Collinsstyle="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
2222d0fba6d1SJames CollinsviewBox="0 0 32 32"><line x1="16" y1="3" x2="16" y2="29"/><path d="M16,23c-3.87,0-7-3.13-7-7s3.13-7,7-7"/><line
2223d0fba6d1SJames Collinsx1="6.81" y1="6.81" x2="8.93" y2="8.93"/><line x1="3" y1="16" x2="6" y2="16"/><line x1="6.81" y1="25.19" x2="8.93"
2224d0fba6d1SJames Collinsy2="23.07"/><path d="M16,12.55C17.2,10.43,19.48,9,22.09,9c0.16,0,0.31,0.01,0.47,0.02c-1.67,0.88-2.8,2.63-2.8,4.64c0,2.9,
2225d0fba6d1SJames Collins2.35,5.25,5.25,5.25c1.6,0,3.03-0.72,3.99-1.85C28.48,20.43,25.59,23,22.09,23c-2.61,0-4.89-1.43-6.09-3.55"/></svg>';
2226f65a4e5eSJames Collins            case 'hamburger':
2227f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
2228f65a4e5eSJames Collinsstyle="fill:currentColor"><path d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0
2229f65a4e5eSJames Collins76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16
2230f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16
2231f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>';
2232f65a4e5eSJames Collins            case 'down-arrow':
2233f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
2234f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9
2235f65a4e5eSJames Collins1.917-1.916z"/></svg>';
22363a3ece10SJames Collins            case 'language':
22373a3ece10SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" width="16"
22383a3ece10SJames Collinsheight="16" fill="currentColor" viewBox="0 0 16 16"><path d="M4.545 6.714 4.11
22393a3ece10SJames 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
22403a3ece10SJames 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
22413a3ece10SJames 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
22423a3ece10SJames 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
22433a3ece10SJames Collins1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651
22443a3ece10SJames 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"/>
22453a3ece10SJames Collins</svg>';
22469cff245bSJames Collins        }//end switch
2247ab45ba71SJames Collins
2248a8eebd82SJames Collins        return '';
2249a8eebd82SJames Collins    }
2250ab45ba71SJames Collins
2251a8eebd82SJames Collins    /**
2252a8eebd82SJames Collins     * Finalize theme
22539cff245bSJames Collins     *
22549cff245bSJames Collins     * @return void
2255a8eebd82SJames Collins     */
225610b40067Snomadjimbob    public function finalize()
225710b40067Snomadjimbob    {
2258a8eebd82SJames Collins    }
22591785fc73SJames Collins
22601785fc73SJames Collins    /**
22611785fc73SJames Collins     * Show Messages
22629cff245bSJames Collins     *
22639cff245bSJames Collins     * @return void
22641785fc73SJames Collins     */
226510b40067Snomadjimbob    public function showMessages()
226610b40067Snomadjimbob    {
22671785fc73SJames Collins        global $ACT;
22681785fc73SJames Collins
22699cff245bSJames Collins        if ($this->lessIgnored === true) {
22709cff245bSJames Collins            msg(
22719cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
22729cff245bSJames Collins                2,
22739cff245bSJames Collins                '',
22749cff245bSJames Collins                '',
22759cff245bSJames Collins                MSG_ADMINS_ONLY
22769cff245bSJames Collins            );
2277a8df40efSJames Collins        }
2278a8df40efSJames Collins
22791785fc73SJames Collins        $show = $this->getConf('showNotifications');
22803a385f2cSJames Collins        if (
22814f8225e4SJames Collins            strlen($show) === 0 ||
22823a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
22833a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
22843a385f2cSJames Collins        ) {
22851785fc73SJames Collins            global $MSG, $MSG_shown;
22861785fc73SJames Collins
22874f8225e4SJames Collins            if (isset($MSG) !== false) {
22889cff245bSJames Collins                if (isset($MSG_shown) === false) {
22899cff245bSJames Collins                    $MSG_shown = [];
2290a8df40efSJames Collins                }
22911785fc73SJames Collins
22921785fc73SJames Collins                foreach ($MSG as $msg) {
22931785fc73SJames Collins                    $hash = md5($msg['msg']);
22949cff245bSJames Collins                    if (isset($MSG_shown[$hash]) === true) {
22951785fc73SJames Collins                        continue;
22961785fc73SJames Collins                    }
22971785fc73SJames Collins                    // skip double messages
22981785fc73SJames Collins
22999cff245bSJames Collins                    if (info_msg_allowed($msg) === true) {
23009cff245bSJames Collins                        echo '<div class="' . $msg['lvl'] . '">';
23019cff245bSJames Collins                        echo $msg['msg'];
23029cff245bSJames Collins                        echo '</div>';
23031785fc73SJames Collins                    }
23041785fc73SJames Collins
2305a8df40efSJames Collins                    $MSG_shown[$hash] = true;
23061785fc73SJames Collins                }
23071785fc73SJames Collins
23081785fc73SJames Collins                unset($GLOBALS['MSG']);
23099cff245bSJames Collins            }//end if
23104f8225e4SJames Collins
23114f8225e4SJames Collins            if (strlen($this->includedPageNotifications) > 0) {
23124f8225e4SJames Collins                echo $this->includedPageNotifications;
23134f8225e4SJames Collins            }
23144f8225e4SJames Collins        }//end if
23151785fc73SJames Collins    }
23167ac0a6efSJames Collins
23177ac0a6efSJames Collins    /**
23187ac0a6efSJames Collins     * Dokuwiki version
23197ac0a6efSJames Collins     *
23207ac0a6efSJames Collins     * @return  string        the dw version name
23217ac0a6efSJames Collins     */
23229cff245bSJames Collins    public function dwVersion()
23239cff245bSJames Collins    {
23249cff245bSJames Collins        if (function_exists('getVersionData') === true) {
23257ac0a6efSJames Collins            $version_data = getVersionData();
23269cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
23277ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
23287ac0a6efSJames Collins                if (count($version_items) >= 2) {
23297ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
23307ac0a6efSJames Collins                }
23317ac0a6efSJames Collins            }
23327ac0a6efSJames Collins        }
23337ac0a6efSJames Collins
23347ac0a6efSJames Collins        return 'unknown';
23357ac0a6efSJames Collins    }
2336e4c4fb13SJames Collins
2337e4c4fb13SJames Collins    /**
2338e4c4fb13SJames Collins     * Dokuwiki version number
2339e4c4fb13SJames Collins     *
2340e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2341e4c4fb13SJames Collins     */
23429cff245bSJames Collins    public function dwVersionNumber()
23439cff245bSJames Collins    {
23449cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2345e4c4fb13SJames Collins            $version_data = getVersionData();
23469cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2347e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2348e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2349e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2350e4c4fb13SJames Collins                }
2351e4c4fb13SJames Collins            }
2352e4c4fb13SJames Collins        }
2353e4c4fb13SJames Collins
2354e4c4fb13SJames Collins        return 0;
2355e4c4fb13SJames Collins    }
2356a8eebd82SJames Collins}
2357ab45ba71SJames Collins
2358ab45ba71SJames Collinsglobal $TEMPLATE;
235947161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2360