xref: /template/mikio/mikio.php (revision c10b0769c2921e0212a83072e8b54ec3328c8d77)
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');
19daf2cd7aSJames Collinsrequire_once('inc/parens-parser.php');
20c165b184SJames Collins
2110b40067Snomadjimbobclass Template
2210b40067Snomadjimbob{
239cff245bSJames Collins    /**
249cff245bSJames Collins     * @var string Template directory path from local FS.
259cff245bSJames Collins     */
26c165b184SJames Collins    public $tplDir  = '';
279cff245bSJames Collins
289cff245bSJames Collins    /**
299cff245bSJames Collins     * @var string Template directory path from web.
309cff245bSJames Collins     */
31c165b184SJames Collins    public $baseDir = '';
329cff245bSJames Collins
339cff245bSJames Collins    /**
349cff245bSJames Collins     * @var array Array of Javascript files to include in footer.
359cff245bSJames Collins     */
369cff245bSJames Collins    public $footerScript = [];
379cff245bSJames Collins
389cff245bSJames Collins    /**
399cff245bSJames Collins     * @var boolean Ignore LESS files.
409cff245bSJames Collins     */
41a8df40efSJames Collins    public $lessIgnored = false;
42c165b184SJames Collins
434f8225e4SJames Collins    /**
444f8225e4SJames Collins     * @var string Notifications from included pages.
454f8225e4SJames Collins     */
464f8225e4SJames Collins    private $includedPageNotifications = '';
474f8225e4SJames Collins
48c165b184SJames Collins
49c165b184SJames Collins    /**
50c165b184SJames Collins     * Class constructor
51c165b184SJames Collins     */
5210b40067Snomadjimbob    public function __construct()
5310b40067Snomadjimbob    {
54c165b184SJames Collins        $this->tplDir  = tpl_incdir();
55c165b184SJames Collins        $this->baseDir = tpl_basedir();
56c165b184SJames Collins
579cff245bSJames Collins        $this->registerHooks();
58c165b184SJames Collins    }
59c165b184SJames Collins
60c165b184SJames Collins    /**
61ab45ba71SJames Collins     * Returns the instance of the class
6247161538SJames Collins     *
63ab45ba71SJames Collins     * @return  Template        class instance
6447161538SJames Collins     */
6547161538SJames Collins    public static function getInstance()
6647161538SJames Collins    {
6747161538SJames Collins        static $instance = null;
6847161538SJames Collins
693a385f2cSJames Collins        if (empty($instance) === true) {
7047161538SJames Collins            $instance = new Template();
7147161538SJames Collins        }
7247161538SJames Collins
7347161538SJames Collins        return $instance;
7447161538SJames Collins    }
7547161538SJames Collins
76ab45ba71SJames Collins
7747161538SJames Collins    /**
78ab45ba71SJames Collins     * Register the themes hooks into Dokuwiki
799cff245bSJames Collins     *
809cff245bSJames Collins     * @return void
81c165b184SJames Collins     */
829cff245bSJames Collins    private function registerHooks()
8310b40067Snomadjimbob    {
84c165b184SJames Collins        global $EVENT_HANDLER;
85c165b184SJames Collins
869cff245bSJames Collins        $events_dispatcher = [
87ab45ba71SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler'
889cff245bSJames Collins        ];
89c165b184SJames Collins
90c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
91c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
92c165b184SJames Collins        }
93c165b184SJames Collins    }
94c165b184SJames Collins
95c165b184SJames Collins
96c165b184SJames Collins    /**
97ab45ba71SJames Collins     * Meta handler hook for DokuWiki
98c165b184SJames Collins     *
999cff245bSJames Collins     * @param   \Doku_Event $event DokuWiki Event.
1009cff245bSJames Collins     * @return  void
101c165b184SJames Collins     */
10210b40067Snomadjimbob    public function metaHeadersHandler(\Doku_Event $event)
10310b40067Snomadjimbob    {
104ab45ba71SJames Collins        global $MIKIO_ICONS;
105b5536b07SChris MacMackin        global $conf;
106ab45ba71SJames Collins
107ad182e6dSnomadjimbob        global $MIKIO_TEMPLATE;
108ad182e6dSnomadjimbob        $MIKIO_TEMPLATE = '123';
109ad182e6dSnomadjimbob
1109cff245bSJames Collins        $this->includePage('theme', false, true);
111a8eebd82SJames Collins
1129cff245bSJames Collins        $stylesheets    = [];
1139cff245bSJames Collins        $scripts        = [];
114c165b184SJames Collins
1153a385f2cSJames Collins        if (empty($this->getConf('customTheme')) === false) {
1169cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) {
117a8eebd82SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less';
118a8eebd82SJames Collins            } else {
1199cff245bSJames Collins                if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) {
120ab45ba71SJames Collins                    $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css';
1212b4583abSJames Collins                }
122a8eebd82SJames Collins            }
1239cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) {
124ab45ba71SJames Collins                $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js';
125c165b184SJames Collins            }
126c165b184SJames Collins        }
127c165b184SJames Collins
1283a385f2cSJames Collins        if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) {
1299cff245bSJames Collins            $icons = [];
130ab45ba71SJames Collins            foreach ($MIKIO_ICONS as $icon) {
1319cff245bSJames Collins                if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) {
132ab45ba71SJames Collins                    $icons[] = $icon;
133c165b184SJames Collins
1343a385f2cSJames Collins                    if (empty($icon['css']) === false) {
1359cff245bSJames Collins                        if (strpos($icon['css'], '//') === false) {
136a8eebd82SJames Collins                            $stylesheets[] = $this->baseDir . 'icons/' . $icon['css'];
137ab45ba71SJames Collins                        } else {
138a8eebd82SJames Collins                            $stylesheets[] = $icon['css'];
139ab45ba71SJames Collins                        }
140ab45ba71SJames Collins                    }
141ab45ba71SJames Collins                }
142ab45ba71SJames Collins            }
143ab45ba71SJames Collins            $MIKIO_ICONS = $icons;
144ab45ba71SJames Collins        } else {
145ab45ba71SJames Collins            $MIKIO_ICONS = [];
146ab45ba71SJames Collins        }
147c165b184SJames Collins
1487864545bSChris MacMackin        $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js';
149ab45ba71SJames Collins        $scripts[] = $this->baseDir . 'assets/mikio.js';
150644fd9f9SJames Collins
1519cff245bSJames Collins        if ($this->getConf('useLESS') === true) {
152ab45ba71SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.less';
153644fd9f9SJames Collins        } else {
154644fd9f9SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.css';
155644fd9f9SJames Collins        }
156644fd9f9SJames Collins
157ad182e6dSnomadjimbob        /* MikioPlugin Support */
1589ffe9161Snomadjimbob        if (plugin_load('action', 'mikioplugin') !== null) {
159ad182e6dSnomadjimbob            if ($this->getConf('useLESS') === true) {
160ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.less';
161ad182e6dSnomadjimbob            } else {
162ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.css';
163ad182e6dSnomadjimbob            }
164ad182e6dSnomadjimbob        }
165ab45ba71SJames Collins
166ab45ba71SJames Collins        $set = [];
167c165b184SJames Collins        foreach ($stylesheets as $style) {
1689cff245bSJames Collins            if (in_array($style, $set) === false) {
1693a385f2cSJames Collins                if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) {
170ab45ba71SJames Collins                    $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style);
171ab45ba71SJames Collins                }
172ab45ba71SJames Collins
1739cff245bSJames Collins                array_unshift($event->data['link'], [
174c165b184SJames Collins                    'type' => 'text/css',
175c165b184SJames Collins                    'rel'  => 'stylesheet',
176c165b184SJames Collins                    'href' => $style
1779cff245bSJames Collins                ]);
178c165b184SJames Collins            }
179ab45ba71SJames Collins            $set[] = $style;
180ab45ba71SJames Collins        }
181c165b184SJames Collins
182ab45ba71SJames Collins        $set = [];
183c165b184SJames Collins        foreach ($scripts as $script) {
1849cff245bSJames Collins            if (in_array($script, $set) === false) {
1859cff245bSJames Collins                $script_params = [
186c165b184SJames Collins                    'type'  => 'text/javascript',
187c165b184SJames Collins                    '_data' => '',
1888395cdcbSChris MacMackin                    'src'   => $script
1899cff245bSJames Collins                ];
190c1ecb866SJames Collins
191c1ecb866SJames Collins                // equal to or greator than hogfather
192*c10b0769SJames Collins                if ($this->dwVersionNumber() >= 20200729 || $this->dwVersionNumber() == 0) {
193c1ecb866SJames Collins                    // greator than hogfather - defer always on
194*c10b0769SJames Collins                    if ($this->dwVersionNumber() >= 20200729 || $this->dwVersionNumber() == 0) {
195c1ecb866SJames Collins                        $script_params += ['defer' => 'defer'];
196c1ecb866SJames Collins                    } else {
197c1ecb866SJames Collins                        // hogfather - defer always on unless $conf['defer_js'] is false
1989cff245bSJames Collins                        if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) {
1998395cdcbSChris MacMackin                            $script_params += ['defer' => 'defer'];
2008395cdcbSChris MacMackin                        }
201c1ecb866SJames Collins                    }
202c1ecb866SJames Collins                }
203c1ecb866SJames Collins
2048395cdcbSChris MacMackin                $event->data['script'][] = $script_params;
2059cff245bSJames Collins            }//end if
206ab45ba71SJames Collins            $set[] = $script;
2079cff245bSJames Collins        }//end foreach
208c165b184SJames Collins    }
209c165b184SJames Collins
210c165b184SJames Collins
211c165b184SJames Collins    /**
212a8eebd82SJames Collins     * Print or return the footer meta data
213c165b184SJames Collins     *
2149cff245bSJames Collins     * @param   boolean $print Print the data to buffer.
2159cff245bSJames Collins     * @return  string         HTML footer meta data
216c165b184SJames Collins     */
2179cff245bSJames Collins    public function includeFooterMeta(bool $print = true)
21810b40067Snomadjimbob    {
219a8eebd82SJames Collins        $html = '';
220a8eebd82SJames Collins
221a8eebd82SJames Collins        if (count($this->footerScript) > 0) {
222a8eebd82SJames Collins            $html .= '<script type="text/javascript">function mikioFooterRun() {';
223a8eebd82SJames Collins            foreach ($this->footerScript as $script) {
224a8eebd82SJames Collins                $html .= $script . ';';
225a8eebd82SJames Collins            }
226a8eebd82SJames Collins            $html .= '}</script>';
227a8eebd82SJames Collins        }
228c165b184SJames Collins
229c165b184SJames Collins
2309cff245bSJames Collins        if ($print === true) {
2319cff245bSJames Collins            echo $html;
2329cff245bSJames Collins        }
233a8eebd82SJames Collins        return $html;
234a8eebd82SJames Collins    }
235a8eebd82SJames Collins
23695372bffSJames Collins
23795372bffSJames Collins    // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing
23895372bffSJames Collins
23995372bffSJames Collins
240a8eebd82SJames Collins    /**
241ab45ba71SJames Collins     * Retreive and parse theme configuration options
242c165b184SJames Collins     *
2439cff245bSJames Collins     * @param   string $key     The configuration key to retreive.
2449cff245bSJames Collins     * @param   mixed  $default If key doesn't exist, return this value.
245ab45ba71SJames Collins     * @return  mixed           parsed value of configuration
246c165b184SJames Collins     */
24795372bffSJames Collins    public function getConf(string $key, $default = false)
24810b40067Snomadjimbob    {
249c165b184SJames Collins        $value = tpl_getConf($key, $default);
250c165b184SJames Collins
2513a385f2cSJames Collins        $data = [
2523a385f2cSJames Collins            ['keys' => ['navbarDWMenuType'],                'type' => 'choice',
2533a385f2cSJames Collins                'values' => ['both', 'icons', 'text']
2543a385f2cSJames Collins            ],
2553a385f2cSJames Collins            ['keys' => ['navbarDWMenuCombine'],             'type' => 'choice',
2563a385f2cSJames Collins                'values' => ['combine', 'seperate', 'dropdown']
2573a385f2cSJames Collins            ],
2583a385f2cSJames Collins            ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'],
2593a385f2cSJames Collins                'type' => 'choice',
2603a385f2cSJames Collins                'values' => ['none', 'custom', 'search', 'dokuwiki'],
2613a385f2cSJames Collins                'default' => [
2623a385f2cSJames Collins                    'navbarPosLeft' => 'none',
2633a385f2cSJames Collins                    'navbarPosMiddle' => 'search',
2643a385f2cSJames Collins                    'navbarPosRight' => 'dokuwiki'
2653a385f2cSJames Collins                ]
2663a385f2cSJames Collins            ],
2673a385f2cSJames Collins            ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink',
2683a385f2cSJames Collins                'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile',
2693a385f2cSJames Collins                'navbarItemShowAdmin'
2703a385f2cSJames Collins            ],
2713a385f2cSJames Collins                'type' => 'choice',
2723a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2733a385f2cSJames Collins            ],
2743a385f2cSJames Collins            ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'],
2753a385f2cSJames Collins                'type' => 'choice',
2763a385f2cSJames Collins                'values' => ['always', 'never']
2773a385f2cSJames Collins            ],
2783a385f2cSJames Collins            ['keys' => ['searchButton'],                    'type' => 'choice',
2793a385f2cSJames Collins                'values' => ['icon', 'text']
2803a385f2cSJames Collins            ],
2813a385f2cSJames Collins            ['keys' => ['breadcrumbPosition', 'youareherePosition'],
2823a385f2cSJames Collins                'type' => 'choice',
2833a385f2cSJames Collins                'values' => ['top', 'hero', 'page', 'none']
2843a385f2cSJames Collins            ],
2853a385f2cSJames Collins            ['keys' => ['youarehereHome'],                  'type' => 'choice',
2863a385f2cSJames Collins                'values' => ['page title', 'home', 'icon', 'none']
2873a385f2cSJames Collins            ],
2883a385f2cSJames Collins            ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'],
2893a385f2cSJames Collins                'type' => 'choice',
2903a385f2cSJames Collins                'values' => ['none', 'logged in user', 'search', 'content', 'tags'],
2913a385f2cSJames Collins                'default' => [
2923a385f2cSJames Collins                    'sidebarLeftRow1' => 'logged in user',
2933a385f2cSJames Collins                    'sidebarLeftRow2' => 'search',
2943a385f2cSJames Collins                    'sidebarLeftRow3' => 'content'
2953a385f2cSJames Collins                ]
2963a385f2cSJames Collins            ],
2973a385f2cSJames Collins            ['keys' => ['pageToolsFloating', 'pageToolsFooter'],
2983a385f2cSJames Collins                'type' => 'choice',
2993a385f2cSJames Collins                'values' => ['always', 'none', 'page editors']
3003a385f2cSJames Collins            ],
3013a385f2cSJames Collins            ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink',
3023a385f2cSJames Collins                'pageToolsShowTop'
3033a385f2cSJames Collins            ],
3043a385f2cSJames Collins                'type' => 'choice',
3053a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
3063a385f2cSJames Collins            ],
3073a385f2cSJames Collins            ['keys' => ['showNotifications'],               'type' => 'choice',
3082d241f94SJames Collins                'values' => ['admin', 'always', 'none', '', 'never']
3093a385f2cSJames Collins            ],
3103a385f2cSJames Collins            ['keys' => ['licenseType'],                     'type' => 'choice',
3113a385f2cSJames Collins                'values' => ['badge', 'button', 'none']
3123a385f2cSJames Collins            ],
3133a385f2cSJames Collins            ['keys' => ['navbarUseTitleIcon'],              'type' => 'bool'],
3143a385f2cSJames Collins            ['keys' => ['navbarUseTitleText'],              'type' => 'bool'],
3153a385f2cSJames Collins            ['keys' => ['navbarUseTaglineText'],            'type' => 'bool'],
3163a385f2cSJames Collins            ['keys' => ['navbarShowSub'],                   'type' => 'bool'],
3173a385f2cSJames Collins            ['keys' => ['heroTitle'],                       'type' => 'bool'],
3183a385f2cSJames Collins            ['keys' => ['heroImagePropagation'],            'type' => 'bool'],
3193a385f2cSJames Collins            ['keys' => ['breadcrumbPrefix'],                'type' => 'bool'],
3203a385f2cSJames Collins            ['keys' => ['breadcrumbSep'],                   'type' => 'bool'],
3213a385f2cSJames Collins            ['keys' => ['youareherePrefix'],                'type' => 'bool'],
3223a385f2cSJames Collins            ['keys' => ['youarehereSep'],                   'type' => 'bool'],
3233a385f2cSJames Collins            ['keys' => ['sidebarShowLeft'],                 'type' => 'bool'],
3243a385f2cSJames Collins            ['keys' => ['sidebarShowRight'],                'type' => 'bool'],
3253a385f2cSJames Collins            ['keys' => ['tocFull'],                         'type' => 'bool'],
3263a385f2cSJames Collins            ['keys' => ['footerSearch'],                    'type' => 'bool'],
3273a385f2cSJames Collins            ['keys' => ['licenseImageOnly'],                'type' => 'bool'],
3283a385f2cSJames Collins            ['keys' => ['includePageUseACL'],               'type' => 'bool'],
3293a385f2cSJames Collins            ['keys' => ['includePagePropagate'],            'type' => 'bool'],
3303a385f2cSJames Collins            ['keys' => ['youarehereHideHome'],              'type' => 'bool'],
3313a385f2cSJames Collins            ['keys' => ['tagsConsolidate'],                 'type' => 'bool'],
3323a385f2cSJames Collins            ['keys' => ['footerInPage'],                    'type' => 'bool'],
3333a385f2cSJames Collins            ['keys' => ['sidebarMobileDefaultCollapse'],    'type' => 'bool'],
3343a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowLeft'],           'type' => 'bool'],
3353a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowRight'],          'type' => 'bool'],
3363a385f2cSJames Collins            ['keys' => ['searchUseTypeahead'],              'type' => 'bool'],
33712030b10SJames Collins            ['keys' => ['showLightDark'],                   'type' => 'bool'],
33834d5f19aSJames Collins            ['keys' => ['autoLightDark'],                   'type' => 'bool'],
3393a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
3403a385f2cSJames Collins
3413a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
3423a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
3433a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
3443a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
3453a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
3463a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
3473a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
348daf2cd7aSJames Collins            ['keys' => ['footerPageInfoText'],              'type' => 'string'],
3493a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
3503a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
3513a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
3523a385f2cSJames Collins
3533a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
3543a385f2cSJames Collins        ];
3553a385f2cSJames Collins
3563a385f2cSJames Collins        foreach ($data as $row) {
3573a385f2cSJames Collins            // does not check case....
3583a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
35995372bffSJames Collins                if (array_key_exists('type', $row) === true) {
3603a385f2cSJames Collins                    switch ($row['type']) {
3613a385f2cSJames Collins                        case 'bool':
3623a385f2cSJames Collins                            return (bool) $value;
3633a385f2cSJames Collins                        case 'int':
3643a385f2cSJames Collins                            return (int) $value;
3653a385f2cSJames Collins                        case 'string':
3663a385f2cSJames Collins                            return $value;
3673a385f2cSJames Collins                        case 'less':
36829118ed7SJames Collins                            $value = (bool) $value;
369a8df40efSJames Collins                            $lessAvailable = false;
370c963c68cSJames Collins
371c963c68cSJames Collins                            // search for less library
372c963c68cSJames Collins                            $path = '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
373c963c68cSJames Collins                            if (($lessAvailable = file_exists('.' . $path)) !== true) {
374c963c68cSJames Collins                                for ($i = 0; $i < 6; $i++) {
375c963c68cSJames Collins                                    if (($lessAvailable = file_exists($_SERVER['DOCUMENT_ROOT'] . $path)) === true) {
376c963c68cSJames Collins                                        break;
377a8df40efSJames Collins                                    }
378a8df40efSJames Collins
379c963c68cSJames Collins                                    $path = '/..' . $path;
380c963c68cSJames Collins                                }
381c963c68cSJames Collins
382c963c68cSJames Collins                                if ($lessAvailable !== true) {
383c963c68cSJames Collins                                    $path = '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
384c963c68cSJames Collins                                    for ($i = 0; $i < 6; $i++) {
38554915114SJames Collins                                        if (
38654915114SJames Collins                                            ($lessAvailable = file_exists(
38754915114SJames Collins                                                $_SERVER['DOCUMENT_ROOT'] . $path
38854915114SJames Collins                                            )) === true
38954915114SJames Collins                                        ) {
390c963c68cSJames Collins                                            break;
391c963c68cSJames Collins                                        }
392c963c68cSJames Collins
393c963c68cSJames Collins                                        $path = '/..' . $path;
394c963c68cSJames Collins                                    }
395c963c68cSJames Collins                                }
396c963c68cSJames Collins                            }//end if
397c963c68cSJames Collins
398a8df40efSJames Collins                            // check for ctype extensions
3999cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
400a8df40efSJames Collins                                $lessAvailable = false;
401a8df40efSJames Collins                            }
402a8df40efSJames Collins
4039cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
404a8df40efSJames Collins                                $this->lessIgnored = true;
40529118ed7SJames Collins                                $value = false;
40629118ed7SJames Collins                            }
4073a385f2cSJames Collins
4083a385f2cSJames Collins                            return $value;
4099cff245bSJames Collins                    }//end switch
4103a385f2cSJames Collins                }//end if
4113a385f2cSJames Collins
4123a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
4133a385f2cSJames Collins                    return $value;
4143a385f2cSJames Collins                }
4153a385f2cSJames Collins
4163a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
4173a385f2cSJames Collins                    if (is_array($row['default']) === true) {
4183a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
4193a385f2cSJames Collins                            return $row['default'][$key];
4203a385f2cSJames Collins                        }
4213a385f2cSJames Collins                    } else {
4223a385f2cSJames Collins                        return $row['default'];
4233a385f2cSJames Collins                    }
4243a385f2cSJames Collins                }
4253a385f2cSJames Collins
4263a385f2cSJames Collins                return reset($row['values']);
4273a385f2cSJames Collins            }//end if
4283a385f2cSJames Collins        }//end foreach
429c165b184SJames Collins
430c165b184SJames Collins        return $value;
431c165b184SJames Collins    }
432c165b184SJames Collins
433c165b184SJames Collins
43495372bffSJames Collins    // phpcs:enable
43595372bffSJames Collins
43695372bffSJames Collins
437c165b184SJames Collins    /**
438a8eebd82SJames Collins     * Check if a page exist in directory or namespace
439c165b184SJames Collins     *
4409cff245bSJames Collins     * @param   string $page Page/namespace to search.
441a8eebd82SJames Collins     * @return  boolean      if page exists
442c165b184SJames Collins     */
4439cff245bSJames Collins    public function pageExists(string $page)
44410b40067Snomadjimbob    {
445ab45ba71SJames Collins        ob_start();
446a8eebd82SJames Collins        tpl_includeFile($page . '.html');
447ab45ba71SJames Collins        $html = ob_get_contents();
448ab45ba71SJames Collins        ob_end_clean();
449a8eebd82SJames Collins
4503a385f2cSJames Collins        if (empty($html) === false) {
4519cff245bSJames Collins            return true;
4529cff245bSJames Collins        }
453a8eebd82SJames Collins
454a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
455a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
456a8eebd82SJames Collins
4579cff245bSJames Collins        if ($propagate === true) {
4589cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4599cff245bSJames Collins                return true;
4609cff245bSJames Collins            }
4619cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4629cff245bSJames Collins            return true;
463ab45ba71SJames Collins        }
464ab45ba71SJames Collins
4659cff245bSJames Collins        return false;
466ab45ba71SJames Collins    }
467ab45ba71SJames Collins
468a8eebd82SJames Collins
469c165b184SJames Collins    /**
470a8eebd82SJames Collins     * Print or return page from directory or namespace
4712b4583abSJames Collins     *
4729cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4739cff245bSJames Collins     * @param   boolean $print        Print content.
4749cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4759cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
476ab45ba71SJames Collins     * @return  string                contents of page found
4772b4583abSJames Collins     */
4789cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4792b4583abSJames Collins    {
480a8eebd82SJames Collins        ob_start();
481a8eebd82SJames Collins        tpl_includeFile($page . '.html');
482a8eebd82SJames Collins        $html = ob_get_contents();
483a8eebd82SJames Collins        ob_end_clean();
484a8eebd82SJames Collins
4853a385f2cSJames Collins        if (empty($html) === true) {
4864f8225e4SJames Collins            global $MSG;
4874f8225e4SJames Collins
488a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
489a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
490ab45ba71SJames Collins            $html = '';
4912b4583abSJames Collins
4924f8225e4SJames Collins            ob_start();
493ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
4944f8225e4SJames Collins            $this->includedPageNotifications .= ob_get_contents();
4954f8225e4SJames Collins            ob_end_clean();
496ab45ba71SJames Collins        }
4972b4583abSJames Collins
4983a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
499ab45ba71SJames Collins            $html = $this->parseContent($html);
500ab45ba71SJames Collins        }
5012b4583abSJames Collins
5023a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
5039cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
5049cff245bSJames Collins        }
5052b4583abSJames Collins
5069cff245bSJames Collins        if ($print === true) {
5079cff245bSJames Collins            echo $html;
5089cff245bSJames Collins        }
509ab45ba71SJames Collins        return $html;
5102b4583abSJames Collins    }
5112b4583abSJames Collins
512a8eebd82SJames Collins
513a8eebd82SJames Collins    /**
514a8eebd82SJames Collins     * Print or return logged in user information
515a8eebd82SJames Collins     *
5169cff245bSJames Collins     * @param   boolean $print Print content.
517a8eebd82SJames Collins     * @return  string         user information
518a8eebd82SJames Collins     */
5199cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
52010b40067Snomadjimbob    {
521a8eebd82SJames Collins        $html = '';
522a8eebd82SJames Collins
5239cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
524a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
525a8eebd82SJames Collins            ob_start();
526a8eebd82SJames Collins            tpl_userinfo();
527a8eebd82SJames Collins            $html .= ob_get_contents();
528a8eebd82SJames Collins            ob_end_clean();
529a8eebd82SJames Collins            $html .= '</div>';
5302b4583abSJames Collins        }
531a8eebd82SJames Collins
5329cff245bSJames Collins        if ($print === true) {
5339cff245bSJames Collins            echo $html;
5349cff245bSJames Collins        }
535a8eebd82SJames Collins        return $html;
5362b4583abSJames Collins    }
5372b4583abSJames Collins
5382b4583abSJames Collins
539a8eebd82SJames Collins    /**
540a8eebd82SJames Collins     * Print or return DokuWiki Menu
541a8eebd82SJames Collins     *
5429cff245bSJames Collins     * @param   boolean $print Print content.
543a8eebd82SJames Collins     * @return  string         contents of the menu
544a8eebd82SJames Collins     */
5459cff245bSJames Collins    public function includeDWMenu(bool $print = true)
54610b40067Snomadjimbob    {
5472b4583abSJames Collins        global $lang;
5482b4583abSJames Collins        global $USERINFO;
549c165b184SJames Collins
5509cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
551a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5522b4583abSJames Collins
553ab45ba71SJames Collins        $pageToolsMenu = [];
554ab45ba71SJames Collins        $siteToolsMenu = [];
555ab45ba71SJames Collins        $userToolsMenu = [];
556c165b184SJames Collins
557ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
558ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
559ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5602b4583abSJames Collins
5612b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5622b4583abSJames Collins        foreach ($items as $item) {
5639cff245bSJames Collins            if ($item->getType() !== 'top') {
564ab45ba71SJames Collins                $itemHtml = '';
5652b4583abSJames Collins
566905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5679cff245bSJames Collins                if (
5683a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5693a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5703a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5719cff245bSJames Collins                ) {
5729cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5739cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5749cff245bSJames Collins                    if ($showIcons === true) {
5759cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5769cff245bSJames Collins                    }
5779cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5789cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5799cff245bSJames Collins                    }
580ab45ba71SJames Collins                    $itemHtml .= '</a>';
581ab45ba71SJames Collins
582ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5832b4583abSJames Collins                }
5849cff245bSJames Collins            }//end if
5859cff245bSJames Collins        }//end foreach
5862b4583abSJames Collins
587ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
588ab45ba71SJames Collins        foreach ($items as $item) {
589ab45ba71SJames Collins            $itemHtml = '';
5902b4583abSJames Collins
591905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5929cff245bSJames Collins            if (
5933a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5943a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5953a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5969cff245bSJames Collins            ) {
5979cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5989cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5999cff245bSJames Collins                if ($showIcons === true) {
6009cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6019cff245bSJames Collins                }
6029cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6039cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6049cff245bSJames Collins                }
605ab45ba71SJames Collins                $itemHtml .= '</a>';
6062b4583abSJames Collins
607ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
6082b4583abSJames Collins            }
6099cff245bSJames Collins        }//end foreach
6102b4583abSJames Collins
611ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
612ab45ba71SJames Collins        foreach ($items as $item) {
613ab45ba71SJames Collins            $itemHtml = '';
614ab45ba71SJames Collins
615905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
6169cff245bSJames Collins            if (
6173a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
6183a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
6193a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
6209cff245bSJames Collins            ) {
6219cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
6229cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
6239cff245bSJames Collins                if ($showIcons === true) {
6249cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6259cff245bSJames Collins                }
6269cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6279cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6289cff245bSJames Collins                }
629ab45ba71SJames Collins                $itemHtml .= '</a>';
630ab45ba71SJames Collins
631ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
632ab45ba71SJames Collins            }
6339cff245bSJames Collins        }//end foreach
634ab45ba71SJames Collins
635ab45ba71SJames Collins
636ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
637ab45ba71SJames Collins            case 'dropdown':
638ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6399cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6409cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6419cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6429cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6439cff245bSJames Collins                '</span>') . '</a>';
644a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
645ab45ba71SJames Collins
646ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
647ab45ba71SJames Collins                    $html .= $item;
648ab45ba71SJames Collins                }
649ab45ba71SJames Collins
650ab45ba71SJames Collins                $html .= '</div>';
651ab45ba71SJames Collins                $html .= '</li>';
652ab45ba71SJames Collins
653a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6549cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6559cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6569cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6579cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6589cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
659a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
660ab45ba71SJames Collins
661ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
662ab45ba71SJames Collins                    $html .= $item;
663ab45ba71SJames Collins                }
664ab45ba71SJames Collins
665ab45ba71SJames Collins                $html .= '</div>';
666ab45ba71SJames Collins                $html .= '</li>';
667ab45ba71SJames Collins
668a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6699cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6709cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6719cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6729cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6739cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
674a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
675ab45ba71SJames Collins
676ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
677ab45ba71SJames Collins                    $html .= $item;
678ab45ba71SJames Collins                }
679ab45ba71SJames Collins
680ab45ba71SJames Collins                $html .= '</div>';
681ab45ba71SJames Collins                $html .= '</li>';
682ab45ba71SJames Collins
683ab45ba71SJames Collins                break;
684ab45ba71SJames Collins
685ab45ba71SJames Collins            case 'combine':
686ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6879cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6889cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6899cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6909cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
691a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
692ab45ba71SJames Collins
693ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
694ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
695ab45ba71SJames Collins                    $html .= $item;
696ab45ba71SJames Collins                }
697ab45ba71SJames Collins
698ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
699ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
700ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
701ab45ba71SJames Collins                    $html .= $item;
702ab45ba71SJames Collins                }
703ab45ba71SJames Collins
704ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
705ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
706ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
707ab45ba71SJames Collins                    $html .= $item;
708ab45ba71SJames Collins                }
709ab45ba71SJames Collins
710ab45ba71SJames Collins                $html .= '</div>';
711ab45ba71SJames Collins                $html .= '</li>';
712ab45ba71SJames Collins                break;
713ab45ba71SJames Collins
714ab45ba71SJames Collins            default:    // seperate
715ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
716a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
717ab45ba71SJames Collins                }
718ab45ba71SJames Collins
719ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
720a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
721a8eebd82SJames Collins                }
722a8eebd82SJames Collins
723a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
724a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
725ab45ba71SJames Collins                }
726ab45ba71SJames Collins
727ab45ba71SJames Collins                break;
7289cff245bSJames Collins        }//end switch
729ab45ba71SJames Collins
7303a3ece10SJames Collins        $translation = plugin_load('helper', 'translation');
7313a3ece10SJames Collins        if ($translation !== null) {
7323a3ece10SJames Collins            $html .= '<li id="mikio__translate" class="mikio-nav-dropdown">';
7333a3ece10SJames Collins            $html .= '<a id="mikio_dropdown_translate" class="nav-link dropdown-toggle" href="#" role="button"
7343a3ece10SJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
7353a3ece10SJames Collins                $this->mikioInlineIcon('language') .
7363a3ece10SJames Collins                 '</a>';
7373a3ece10SJames Collins            $html .= '<div class="mikio-dropdown closed">';
7383a3ece10SJames Collins
7393a3ece10SJames Collins                $html .= $translation->showTranslations();
7403a3ece10SJames Collins
7413a3ece10SJames Collins            $html .= '</div>';
7423a3ece10SJames Collins            $html .= '</li>';
7433a3ece10SJames Collins        }
7443a3ece10SJames Collins
74512030b10SJames Collins        if ($this->getConf('showLightDark') === true) {
746d0fba6d1SJames Collins            $autoLightDark = $this->getConf('autoLightDark');
7479e41d878SJames Collins            $html .= '<li class="mikio-darklight">
7489e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' .
749d0fba6d1SJames Collins            ($autoLightDark === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') .
7509e41d878SJames Collins            $this->mikioInlineIcon('sun', 'mikio-darklight-light') .
7519e41d878SJames Collins            $this->mikioInlineIcon('moon', 'mikio-darklight-dark') .
7529e41d878SJames Collins            '</a></li>';
75312030b10SJames Collins        }
75412030b10SJames Collins
755ab45ba71SJames Collins        $html .= '</ul>';
756ab45ba71SJames Collins
7579cff245bSJames Collins        if ($print === true) {
7589cff245bSJames Collins            echo $html;
7599cff245bSJames Collins        }
760a8eebd82SJames Collins        return $html;
761a8eebd82SJames Collins    }
762a8eebd82SJames Collins
763a8eebd82SJames Collins
764a8eebd82SJames Collins    /**
765a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
766a8eebd82SJames Collins     *
7679cff245bSJames Collins     * @param string $str String to generate nav.
768a8eebd82SJames Collins     * @return string     nav elements generated
769a8eebd82SJames Collins     */
7709cff245bSJames Collins    public function stringToNav(string $str)
77110b40067Snomadjimbob    {
772a8eebd82SJames Collins        $html = '';
773a8eebd82SJames Collins
7743a385f2cSJames Collins        if (empty($str) === false) {
775a8eebd82SJames Collins            $items = explode(';', $str);
776a8eebd82SJames Collins            if (count($items) > 0) {
777a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
778a8eebd82SJames Collins                foreach ($items as $item) {
779a8eebd82SJames Collins                    $parts = explode('|', $item);
780a8eebd82SJames Collins                    if ($parts > 1) {
7819cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7829cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7839cff245bSJames Collins                            '</a></li>';
784a8eebd82SJames Collins                    }
785a8eebd82SJames Collins                }
786a8eebd82SJames Collins                $html .= '</ul>';
787a8eebd82SJames Collins            }
7882b4583abSJames Collins        }
7892b4583abSJames Collins
790ab45ba71SJames Collins        return $html;
7912b4583abSJames Collins    }
7922b4583abSJames Collins
793a8eebd82SJames Collins    /**
794ab45ba71SJames Collins     * print or return the main navbar
7952b4583abSJames Collins     *
7969cff245bSJames Collins     * @param boolean $print   Print the navbar.
7979cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
798ab45ba71SJames Collins     * @return string          generated content
7992b4583abSJames Collins     */
8009cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
80110b40067Snomadjimbob    {
802b39ad16dSJames Collins        global $conf, $USERINFO;
803d3d7d2b7SJames Collins
804d3d7d2b7SJames Collins        $homeUrl = wl();
805d3d7d2b7SJames Collins
8069cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
807d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
8083a385f2cSJames Collins            if (empty($p) === false) {
8099cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
810d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
811d3d7d2b7SJames Collins                }
812d3d7d2b7SJames Collins            }
813b39ad16dSJames Collins        } else {
8149cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
815b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
816b39ad16dSJames Collins                if (strlen($url) > 0) {
817b39ad16dSJames Collins                    $homeUrl = $url;
818d3d7d2b7SJames Collins                }
819b39ad16dSJames Collins            } else {
820b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
821b39ad16dSJames Collins                if (strlen($url) > 0) {
822b39ad16dSJames Collins                    $homeUrl = $url;
823b39ad16dSJames Collins                }
824b39ad16dSJames Collins            }
825b39ad16dSJames Collins        }
826d3d7d2b7SJames Collins
827ab45ba71SJames Collins        $html = '';
82847161538SJames Collins
8299cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
8309cff245bSJames Collins            '">';
831f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
832d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
8339cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
834ab45ba71SJames Collins            // Brand image
8359cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
8369cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
8379cff245bSJames Collins                ;
8383a385f2cSJames Collins                if (empty($logo) === false) {
839f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
840f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
841f0241fc4SJames Collins                    $styles = '';
842f0241fc4SJames Collins
843f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
8449cff245bSJames Collins                        if (ctype_digit($width) === true) {
845f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
8469cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
847f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
8489cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
8497a92c19bSJames Collins                            $styles .= 'max-width:none;';
850f0241fc4SJames Collins                        }
851f0241fc4SJames Collins
8529cff245bSJames Collins                        if (ctype_digit($height) === true) {
853f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8549cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
855f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8569cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8577a92c19bSJames Collins                            $styles .= 'max-height:none;';
858f0241fc4SJames Collins                        }
859f0241fc4SJames Collins
860f0241fc4SJames Collins                        if (strlen($styles) > 0) {
861f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
862f0241fc4SJames Collins                        }
8639cff245bSJames Collins                    }//end if
864f0241fc4SJames Collins
865f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8669cff245bSJames Collins                }//end if
8679cff245bSJames Collins            }//end if
868ab45ba71SJames Collins
869ab45ba71SJames Collins            // Brand title
8709cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
871ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
872a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8739cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
874a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
875ab45ba71SJames Collins                }
876ab45ba71SJames Collins                $html .= '</div>';
877ab45ba71SJames Collins            }
8789cff245bSJames Collins        }//end if
879ab45ba71SJames Collins        $html .= '</a>';
880660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
881ab45ba71SJames Collins
882ab45ba71SJames Collins        // Menus
883ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
884ab45ba71SJames Collins
8859cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8869cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8879cff245bSJames Collins        ];
888a8eebd82SJames Collins        foreach ($menus as $menuType) {
889a8eebd82SJames Collins            switch ($menuType) {
890a8eebd82SJames Collins                case 'custom':
891a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
892a8eebd82SJames Collins                    break;
893a8eebd82SJames Collins                case 'search':
894ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
895ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
896ab45ba71SJames Collins                    $html .= '</div>';
897a8eebd82SJames Collins                    break;
898a8eebd82SJames Collins                case 'dokuwiki':
8999cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
900a8eebd82SJames Collins                    break;
901a8eebd82SJames Collins            }
902a8eebd82SJames Collins        }
903ab45ba71SJames Collins
904ab45ba71SJames Collins        $html .= '</div>';
905f8039bf2SJames Collins        $html .= '</div>';
906ab45ba71SJames Collins        $html .= '</nav>';
907ab45ba71SJames Collins
908a8eebd82SJames Collins        // Sub Navbar
9099cff245bSJames Collins        if ($showSub === true) {
9109cff245bSJames Collins            $sub = $this->includePage('submenu', false);
9113a385f2cSJames Collins            if (empty($sub) === false) {
9129cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
9139cff245bSJames Collins            }
914ab45ba71SJames Collins        }
915ab45ba71SJames Collins
9169cff245bSJames Collins        if ($print === true) {
9179cff245bSJames Collins            echo $html;
9189cff245bSJames Collins        }
919ab45ba71SJames Collins        return $html;
920ab45ba71SJames Collins    }
921ab45ba71SJames Collins
922ab45ba71SJames Collins
923a8eebd82SJames Collins    /**
924a8eebd82SJames Collins     * Is there a sidebar
925a8eebd82SJames Collins     *
9269cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
927a8eebd82SJames Collins     * @return  boolean        if sidebar exists
928a8eebd82SJames Collins     */
9299cff245bSJames Collins    public function sidebarExists(string $prefix = '')
93010b40067Snomadjimbob    {
931a8eebd82SJames Collins        global $conf;
932a8eebd82SJames Collins
9333a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9349cff245bSJames Collins            $prefix = '';
9359cff245bSJames Collins        }
936a8eebd82SJames Collins
937a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
938a8eebd82SJames Collins    }
939a8eebd82SJames Collins
940a8eebd82SJames Collins
941a8eebd82SJames Collins    /**
942ab45ba71SJames Collins     * Print or return the sidebar content
943ab45ba71SJames Collins     *
9449cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
9459cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
9469cff245bSJames Collins     * @param   boolean $parse  Parse the content.
947ab45ba71SJames Collins     * @return  string          generated content
948ab45ba71SJames Collins     */
9499cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
95010b40067Snomadjimbob    {
951ab45ba71SJames Collins        global $conf, $ID;
952ab45ba71SJames Collins
953ab45ba71SJames Collins        $html = '';
954ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
955ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
956ab45ba71SJames Collins
9573a385f2cSJames Collins        if (empty($confPrefix) === true) {
9589cff245bSJames Collins            $confPrefix = 'Left';
9599cff245bSJames Collins        }
9601cdedf28SJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9619cff245bSJames Collins            $prefix = '';
9629cff245bSJames Collins        }
963ab45ba71SJames Collins
9641cdedf28SJames Collins        $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
965ab45ba71SJames Collins
9669cff245bSJames Collins        if (
9679cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9681cdedf28SJames Collins            p_get_metadata($ID, 'nosidebar', false) === null
9699cff245bSJames Collins        ) {
9709cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9713a385f2cSJames Collins            if (empty($content) === false) {
9729cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9739cff245bSJames Collins            }
974ab45ba71SJames Collins
9753a385f2cSJames Collins            if (empty($prefix) === true) {
9769cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9779cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9789cff245bSJames Collins                ];
979ab45ba71SJames Collins
980a8eebd82SJames Collins                foreach ($rows as $row) {
981a8eebd82SJames Collins                    switch ($row) {
982a8eebd82SJames Collins                        case 'search':
9839cff245bSJames Collins                            $html .= $this->includeSearch(false);
984a8eebd82SJames Collins                            break;
985a8eebd82SJames Collins                        case 'logged in user':
9869cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
987a8eebd82SJames Collins                            break;
988a8eebd82SJames Collins                        case 'content':
9899cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9903a385f2cSJames Collins                            if (empty($content) === false) {
9919cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9929cff245bSJames Collins                            }
993a8eebd82SJames Collins                            break;
994a8eebd82SJames Collins                        case 'tags':
995a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
996a8eebd82SJames Collins                    }
997a8eebd82SJames Collins                }
998a8eebd82SJames Collins            } else {
9999cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
10003a385f2cSJames Collins                if (empty($content) === false) {
10019cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
10029cff245bSJames Collins                }
10039cff245bSJames Collins            }//end if
10049cff245bSJames Collins
10059cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
10063a385f2cSJames Collins            if (empty($content) === false) {
10079cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
10089cff245bSJames Collins            }
10099cff245bSJames Collins        }//end if
10109cff245bSJames Collins
10113a385f2cSJames Collins        if (empty($html) === true) {
10123a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
10139cff245bSJames Collins                $html = '&nbsp;';
10149cff245bSJames Collins            }
10159cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
10169cff245bSJames Collins                $html = '&nbsp;';
10179cff245bSJames Collins            }
1018a8eebd82SJames Collins        }
1019ab45ba71SJames Collins
10203a385f2cSJames Collins        if (empty($html) === false) {
10211cdedf28SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) .
10229cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
10239cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
10249cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
10259cff245bSJames Collins                $html . '</div></aside>';
1026ab45ba71SJames Collins        }
1027ab45ba71SJames Collins
10289cff245bSJames Collins        if ($parse === true) {
10299cff245bSJames Collins            $html = $this->includeIcons($html);
10303a04a100SJames Collins        }
10319cff245bSJames Collins        if ($print === true) {
10329cff245bSJames Collins            echo $html;
1033ab45ba71SJames Collins        }
10344f8225e4SJames Collins
1035ab45ba71SJames Collins        return $html;
1036ab45ba71SJames Collins    }
1037ab45ba71SJames Collins
1038ab45ba71SJames Collins
1039a8eebd82SJames Collins    /**
1040ab45ba71SJames Collins     * Print or return the page tools content
1041ab45ba71SJames Collins     *
10429cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
10439cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
1044ab45ba71SJames Collins     * @return  string             generated content
1045ab45ba71SJames Collins     */
10469cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
104710b40067Snomadjimbob    {
10481293ce10SJames Collins        global $USERINFO;
10491293ce10SJames Collins
10509cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
1051ab45ba71SJames Collins        $html = '';
1052ab45ba71SJames Collins
10539cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
1054b9c0582bSJames Collins        $html .= '<ul class="tools">';
1055ab45ba71SJames Collins
1056ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1057ab45ba71SJames Collins        foreach ($items as $item) {
10589cff245bSJames Collins            $classes = [];
10593fd763a0SJames Collins            $classes[] = $item->getType();
10603fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10613fd763a0SJames Collins
10629cff245bSJames Collins            if (empty($attr['class']) === false) {
10633fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1064ab45ba71SJames Collins            }
1065ab45ba71SJames Collins
10663fd763a0SJames Collins            $classes = array_unique($classes);
10673fd763a0SJames Collins
1068f02b8ab5SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()), 'always');
10699cff245bSJames Collins            if (
10703a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10713a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10723a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10739cff245bSJames Collins            ) {
10743fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10759cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10769cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10779cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10783fd763a0SJames Collins                $html .= '</li>';
10793fd763a0SJames Collins            }
10809cff245bSJames Collins        }//end foreach
10813fd763a0SJames Collins
10823fd763a0SJames Collins        $html .= '</ul>';
1083ab45ba71SJames Collins        $html .= '</nav>';
1084ab45ba71SJames Collins
10859cff245bSJames Collins        if ($print === true) {
10869cff245bSJames Collins            echo $html;
10879cff245bSJames Collins        }
1088ab45ba71SJames Collins        return $html;
1089ab45ba71SJames Collins    }
1090ab45ba71SJames Collins
1091ab45ba71SJames Collins
1092a8eebd82SJames Collins    /**
1093a8eebd82SJames Collins     * Print or return the search bar
1094a8eebd82SJames Collins     *
10959cff245bSJames Collins     * @param   boolean $print Print content.
1096a8eebd82SJames Collins     * @return  string         contents of the search bar
1097a8eebd82SJames Collins     */
10989cff245bSJames Collins    public function includeSearch(bool $print = true)
109910b40067Snomadjimbob    {
11009cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1101ab45ba71SJames Collins        $html = '';
1102ab45ba71SJames Collins
11039cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
11049cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1105a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1106a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1107c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
11089cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1109c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1110c1cb9f15SChris MacMackin        }
11119cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
11123a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1113a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
11143a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1115a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1116ab45ba71SJames Collins        } else {
1117ab45ba71SJames Collins            $html .= $lang['btn_search'];
1118ab45ba71SJames Collins        }
1119ab45ba71SJames Collins        $html .= '</button>';
1120ab45ba71SJames Collins        $html .= '</form>';
1121ab45ba71SJames Collins
11229cff245bSJames Collins        if ($print === true) {
11239cff245bSJames Collins            echo $html;
11249cff245bSJames Collins        }
1125ab45ba71SJames Collins        return $html;
1126ab45ba71SJames Collins    }
1127ab45ba71SJames Collins
1128ab45ba71SJames Collins
1129a8eebd82SJames Collins    /**
1130a8eebd82SJames Collins     * Print or return content
1131a8eebd82SJames Collins     *
11329cff245bSJames Collins     * @param   boolean $print Print content.
1133a8eebd82SJames Collins     * @return  string         contents
1134a8eebd82SJames Collins     */
11359cff245bSJames Collins    public function includeContent(bool $print = true)
113610b40067Snomadjimbob    {
1137ab45ba71SJames Collins        ob_start();
11389cff245bSJames Collins        tpl_content(false);
1139ab45ba71SJames Collins        $html = ob_get_contents();
1140ab45ba71SJames Collins        ob_end_clean();
1141ab45ba71SJames Collins
1142ab45ba71SJames Collins        $html = $this->includeIcons($html);
1143ab45ba71SJames Collins        $html = $this->parseContent($html);
1144ab45ba71SJames Collins
1145ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1146ab45ba71SJames Collins
11479cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
11489cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
11499cff245bSJames Collins        }
1150a8eebd82SJames Collins
1151a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1152a8eebd82SJames Collins
11539cff245bSJames Collins        if ($print === true) {
11549cff245bSJames Collins            echo $html;
11559cff245bSJames Collins        }
1156ab45ba71SJames Collins        return $html;
1157ab45ba71SJames Collins    }
1158ab45ba71SJames Collins
1159daf2cd7aSJames Collins    private function custom_tpl_pageinfo($ret = false)
1160daf2cd7aSJames Collins    {
1161daf2cd7aSJames Collins        global $conf;
1162daf2cd7aSJames Collins        global $lang;
1163daf2cd7aSJames Collins        global $INFO;
1164daf2cd7aSJames Collins        global $ID;
1165daf2cd7aSJames Collins
1166daf2cd7aSJames Collins        // return if we are not allowed to view the page
1167daf2cd7aSJames Collins        if (!auth_quickaclcheck($ID)) {
1168daf2cd7aSJames Collins            return false;
1169daf2cd7aSJames Collins        }
1170daf2cd7aSJames Collins
1171daf2cd7aSJames Collins        if ($INFO['exists']) {
1172daf2cd7aSJames Collins            $file = $INFO['filepath'];
1173daf2cd7aSJames Collins            if (!$conf['fullpath']) {
1174daf2cd7aSJames Collins                if ($INFO['rev']) {
1175daf2cd7aSJames Collins                    $file = str_replace($conf['olddir'] . '/', '', $file);
1176daf2cd7aSJames Collins                } else {
1177daf2cd7aSJames Collins                    $file = str_replace($conf['datadir'] . '/', '', $file);
1178daf2cd7aSJames Collins                }
1179daf2cd7aSJames Collins            }
1180daf2cd7aSJames Collins            $file = utf8_decodeFN($file);
1181daf2cd7aSJames Collins            $date = dformat($INFO['lastmod']);
1182daf2cd7aSJames Collins
1183daf2cd7aSJames Collins            $string = $this->getConf('footerPageInfoText', '');
1184daf2cd7aSJames Collins
1185daf2cd7aSJames Collins            // replace lang items
1186daf2cd7aSJames Collins            $string = preg_replace_callback('/%([^%]+)%/', function ($matches) use ($lang) {
1187daf2cd7aSJames Collins                return isset($lang[$matches[1]]) ? $lang[$matches[1]] : '';
1188daf2cd7aSJames Collins            }, $string);
1189daf2cd7aSJames Collins
1190daf2cd7aSJames Collins            $options = [
1191daf2cd7aSJames Collins                'file' => '<bdi>' . $file . '</bdi>',
1192daf2cd7aSJames Collins                'date' => $date,
1193daf2cd7aSJames Collins                'user' => $INFO['editor'] ? '<bdi>' . editorinfo($INFO['editor']) . '</bdi>' : $lang['external_edit']
1194daf2cd7aSJames Collins            ];
1195daf2cd7aSJames Collins
1196daf2cd7aSJames Collins            if (!empty($_SERVER['REMOTE_USER'])) {
1197daf2cd7aSJames Collins                $options['loggedin'] = true;
1198daf2cd7aSJames Collins            }
1199daf2cd7aSJames Collins
1200daf2cd7aSJames Collins            if ($INFO['locked']) {
1201daf2cd7aSJames Collins                $options['locked'] = '<bdi>' . editorinfo($INFO['locked']) . '</bdi>';
1202daf2cd7aSJames Collins            }
1203daf2cd7aSJames Collins
1204daf2cd7aSJames Collins            $parser = new \ParensParser();
1205daf2cd7aSJames Collins            $result = $parser->parse($string);
1206daf2cd7aSJames Collins
1207daf2cd7aSJames Collins            $parserIterate = function ($arr, $func) use ($options) {
1208daf2cd7aSJames Collins                $str = '';
1209daf2cd7aSJames Collins
1210daf2cd7aSJames Collins                foreach ($arr as $value) {
1211daf2cd7aSJames Collins                    if (is_array($value)) {
1212daf2cd7aSJames Collins                        $str .= $func($value, $func);
1213daf2cd7aSJames Collins                    } else {
1214daf2cd7aSJames Collins                        if (preg_match('/^([a-zA-Z]+)=(.*)/', $value, $matches)) {
1215daf2cd7aSJames Collins                            $key = strtolower($matches[1]); // Extract the key (a-zA-Z part)
1216daf2cd7aSJames Collins
1217daf2cd7aSJames Collins                            if (isset($options[$key])) {
1218daf2cd7aSJames Collins                                $str .= $matches[2];
1219daf2cd7aSJames Collins                            } else {
1220daf2cd7aSJames Collins                                return $str;
1221daf2cd7aSJames Collins                            }
1222daf2cd7aSJames Collins                        } else {
1223daf2cd7aSJames Collins                            $str .= $value;
1224daf2cd7aSJames Collins                        }
1225daf2cd7aSJames Collins                    }
1226daf2cd7aSJames Collins                }//end foreach
1227daf2cd7aSJames Collins
1228daf2cd7aSJames Collins                return $str;
1229daf2cd7aSJames Collins            };
1230daf2cd7aSJames Collins
1231daf2cd7aSJames Collins            $string = $parserIterate($result, $parserIterate);
1232daf2cd7aSJames Collins
1233daf2cd7aSJames Collins            $string = preg_replace_callback('/{([^}]+)}/', function ($matches) use ($options) {
1234daf2cd7aSJames Collins                $key = strtolower($matches[1]);
1235daf2cd7aSJames Collins                return isset($options[$key]) ? $options[$key] : '';
1236daf2cd7aSJames Collins            }, $string);
1237daf2cd7aSJames Collins
1238daf2cd7aSJames Collins            if ($ret) {
1239daf2cd7aSJames Collins                return $string;
1240daf2cd7aSJames Collins            } else {
1241daf2cd7aSJames Collins                echo $string;
1242daf2cd7aSJames Collins                return true;
1243daf2cd7aSJames Collins            }
1244daf2cd7aSJames Collins        }//end if
1245daf2cd7aSJames Collins
1246daf2cd7aSJames Collins        return false;
1247daf2cd7aSJames Collins    }
1248daf2cd7aSJames Collins
1249a8eebd82SJames Collins    /**
1250ab45ba71SJames Collins     * Print or return footer
1251ab45ba71SJames Collins     *
12529cff245bSJames Collins     * @param   boolean $print Print footer.
12539cff245bSJames Collins     * @return  string         HTML string containing footer
1254ab45ba71SJames Collins     */
12559cff245bSJames Collins    public function includeFooter(bool $print = true)
125610b40067Snomadjimbob    {
1257ab45ba71SJames Collins        global $ACT;
1258ab45ba71SJames Collins
1259ab45ba71SJames Collins        $html = '';
1260ab45ba71SJames Collins
1261ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
1262daf2cd7aSJames Collins        $html .= '<div class="doc">' . $this->custom_tpl_pageinfo(true) . '</div>';
12639cff245bSJames Collins        $html .= $this->includePage('footer', false);
1264ab45ba71SJames Collins
1265a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1266ab45ba71SJames Collins
12679cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1268ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
12699cff245bSJames Collins            $html .= $this->includeSearch(false);
1270ab45ba71SJames Collins            $html .= '</div>';
1271ab45ba71SJames Collins        }
1272ab45ba71SJames Collins
1273a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
12749cff245bSJames Collins        if (
12753a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
12763a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
12779cff245bSJames Collins        ) {
12789cff245bSJames Collins            $html .= $this->includePageTools(false);
12799cff245bSJames Collins        }
1280ab45ba71SJames Collins
12819cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
12829cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1283ab45ba71SJames Collins
1284ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
12859cff245bSJames Collins        if ($licenseType !== 'none') {
12869cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1287ab45ba71SJames Collins        }
1288ab45ba71SJames Collins
1289ab45ba71SJames Collins        $html .= '</footer>';
1290ab45ba71SJames Collins
12919cff245bSJames Collins        if ($print === true) {
12929cff245bSJames Collins            echo $html;
12939cff245bSJames Collins        }
1294ab45ba71SJames Collins        return $html;
1295ab45ba71SJames Collins    }
1296ab45ba71SJames Collins
1297ab45ba71SJames Collins
1298a8eebd82SJames Collins    /**
1299ab45ba71SJames Collins     * Print or return breadcrumb trail
1300ab45ba71SJames Collins     *
13019cff245bSJames Collins     * @param   boolean $print Print out trail.
13029cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
13039cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1304ab45ba71SJames Collins     */
13059cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
130610b40067Snomadjimbob    {
1307a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1308a8eebd82SJames Collins
13093a385f2cSJames Collins        if (
13103a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
131195372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
13123a385f2cSJames Collins        ) {
13139cff245bSJames Collins            return '';
13149cff245bSJames Collins        }
1315ab45ba71SJames Collins
1316ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1317f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
13183a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
131995372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
13209cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1321ab45ba71SJames Collins                    ob_start();
132275adba86SJames Collins                    tpl_breadcrumbs();
1323ab45ba71SJames Collins                    $html .= ob_get_contents();
1324ab45ba71SJames Collins                    ob_end_clean();
1325ab45ba71SJames Collins                } else {
1326ab45ba71SJames Collins                    $sep = '•';
1327ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1328ab45ba71SJames Collins
13299cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1330ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
13319cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1332ab45ba71SJames Collins
13339cff245bSJames Collins                        if ($img !== false) {
1334ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1335ab45ba71SJames Collins                        }
133647161538SJames Collins                    }
133747161538SJames Collins
13389cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1339ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
13409cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1341ab45ba71SJames Collins
13429cff245bSJames Collins                        if ($img !== false) {
1343ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1344ab45ba71SJames Collins                        }
1345ab45ba71SJames Collins                    }
1346ab45ba71SJames Collins
1347ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1348ab45ba71SJames Collins
1349ab45ba71SJames Collins                    $html .= '<ul>';
13503a385f2cSJames Collins                    if (empty($prefix) === false) {
13519cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
13529cff245bSJames Collins                    }
1353ab45ba71SJames Collins
1354ab45ba71SJames Collins                    $last = count($crumbs);
1355ab45ba71SJames Collins                    $i    = 0;
1356ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1357ab45ba71SJames Collins                        $i++;
135895372bffSJames Collins                        if ($i !== 1) {
1359ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
136095372bffSJames Collins                        }
13619cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
13629cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1363ab45ba71SJames Collins                        $html .= '</li>';
1364ab45ba71SJames Collins                    }
1365ab45ba71SJames Collins
1366ab45ba71SJames Collins                    $html .= '</ul>';
13679cff245bSJames Collins                }//end if
13689cff245bSJames Collins            }//end if
13699cff245bSJames Collins        }//end if
13703d11a778SJames Collins
13713d11a778SJames Collins        $html .= '</div>';
13723d11a778SJames Collins        $html .= '</div>';
13733d11a778SJames Collins
13749cff245bSJames Collins        if ($parse === true) {
13759cff245bSJames Collins            $html = $this->includeIcons($html);
13769cff245bSJames Collins        }
13779cff245bSJames Collins        if ($print === true) {
13789cff245bSJames Collins            echo $html;
13799cff245bSJames Collins        }
13803d11a778SJames Collins        return $html;
13813d11a778SJames Collins    }
13823d11a778SJames Collins
13833d11a778SJames Collins    /**
13843d11a778SJames Collins     * Print or return you are here trail
13853d11a778SJames Collins     *
13869cff245bSJames Collins     * @param   boolean $print Print out trail.
13879cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
13889cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
13893d11a778SJames Collins     */
13909cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
13913d11a778SJames Collins    {
13923d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
13933d11a778SJames Collins
13943a385f2cSJames Collins        if (
13953a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
139695372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
13973a385f2cSJames Collins        ) {
13989cff245bSJames Collins            return '';
13999cff245bSJames Collins        }
14003d11a778SJames Collins
14013d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
14023d11a778SJames Collins        $html .= '<div class="mikio-container">';
14033a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
140495372bffSJames Collins            if ($conf['youarehere'] !== 0) {
14059cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
140695372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1407ab45ba71SJames Collins                    ob_start();
140875adba86SJames Collins                    tpl_youarehere();
1409ab45ba71SJames Collins                    $html .= ob_get_contents();
1410ab45ba71SJames Collins                    ob_end_clean();
141195372bffSJames Collins                    $html .= '</div>';
1412ab45ba71SJames Collins                } else {
1413ab45ba71SJames Collins                    $sep = ' » ';
1414ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1415ab45ba71SJames Collins
14169cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
14173d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
14189cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1419ab45ba71SJames Collins
14209cff245bSJames Collins                        if ($img !== false) {
1421ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1422ab45ba71SJames Collins                        }
142375adba86SJames Collins                    }
142475adba86SJames Collins
14259cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
14263d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
14279cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1428ab45ba71SJames Collins
14299cff245bSJames Collins                        if ($img !== false) {
1430ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
143175adba86SJames Collins                        }
143247161538SJames Collins                    }
143347161538SJames Collins
1434ab45ba71SJames Collins                    $html .= '<ul>';
14353a385f2cSJames Collins                    if (empty($prefix) === false) {
14369cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
14379cff245bSJames Collins                    }
14389cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1439ab45ba71SJames Collins
1440ab45ba71SJames Collins                    $parts = explode(':', $ID);
1441ab45ba71SJames Collins                    $count = count($parts);
1442ab45ba71SJames Collins
1443ab45ba71SJames Collins                    $part = '';
14449cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1445ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1446ab45ba71SJames Collins                        $page = $part;
14479cff245bSJames Collins                        if ($page === $conf['start']) {
14489cff245bSJames Collins                            continue;
14499cff245bSJames Collins                        }
1450ab45ba71SJames Collins
1451ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
14529cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1453ab45ba71SJames Collins                    }
1454ab45ba71SJames Collins
1455ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
14569cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1457ab45ba71SJames Collins                        $page = $part . $parts[$i];
14589cff245bSJames Collins                        if ($page !== $conf['start']) {
1459ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
14609cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1461ab45ba71SJames Collins                        }
1462ab45ba71SJames Collins                    }
1463ab45ba71SJames Collins
1464ab45ba71SJames Collins                    $html .= '</ul>';
14659cff245bSJames Collins                }//end if
14669cff245bSJames Collins            }//end if
1467ab45ba71SJames Collins
14683d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
14699cff245bSJames Collins            if ($showLast !== 0) {
1470a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
14719cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1472a8eebd82SJames Collins                    $count = count($matches[0]);
1473a8eebd82SJames Collins                    $list = '';
1474a8eebd82SJames Collins
1475a8eebd82SJames Collins                    // Show Home
1476a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1477a8eebd82SJames Collins
1478a8eebd82SJames Collins                    $list .= '<li>...</li>';
14799cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1480a8eebd82SJames Collins                        $list .= $matches[0][$i];
1481a8eebd82SJames Collins                    }
1482a8eebd82SJames Collins
1483a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1484a8eebd82SJames Collins                }
1485a8eebd82SJames Collins            }
1486a8eebd82SJames Collins
14873d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1488a8eebd82SJames Collins                case 'none':
1489a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1490a8eebd82SJames Collins                    break;
1491a8eebd82SJames Collins                case 'home':
1492a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1493a8eebd82SJames Collins                    break;
1494a8eebd82SJames Collins                case 'icon':
14959cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
14969cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1497a8eebd82SJames Collins                    break;
1498a8eebd82SJames Collins            }
1499a8eebd82SJames Collins        } else {
1500a8eebd82SJames Collins            $html .= '&#8810; ';
15019cff245bSJames Collins            if (isset($_GET['page']) === true) {
15029cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1503a8eebd82SJames Collins            }
15044057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
15059cff245bSJames Collins        }//end if
15069cff245bSJames Collins
15079cff245bSJames Collins        $html .= '</div>';
15089cff245bSJames Collins        $html .= '</div>';
15099cff245bSJames Collins
15109cff245bSJames Collins        if ($parse === true) {
15119cff245bSJames Collins            $html = $this->includeIcons($html);
1512a8eebd82SJames Collins        }
15139cff245bSJames Collins        if ($print === true) {
15149cff245bSJames Collins            echo $html;
15159cff245bSJames Collins        }
1516ab45ba71SJames Collins        return $html;
1517ab45ba71SJames Collins    }
1518ab45ba71SJames Collins
15191785fc73SJames Collins    /**
15201785fc73SJames Collins     * Get Page Title
15219cff245bSJames Collins     *
15229cff245bSJames Collins     * @return string page title
15231785fc73SJames Collins     */
152410b40067Snomadjimbob    public function parsePageTitle()
152510b40067Snomadjimbob    {
15262060e56cSJames Collins        global $ID;
15272060e56cSJames Collins
15282060e56cSJames Collins        $title = p_get_first_heading($ID);
15299cff245bSJames Collins        if (strlen($title) <= 0) {
15309cff245bSJames Collins            $title = tpl_pagetitle(null, true);
15319cff245bSJames Collins        }
15321785fc73SJames Collins        $title = $this->includeIcons($title);
15331785fc73SJames Collins
15341785fc73SJames Collins        return $title;
15351785fc73SJames Collins    }
15361785fc73SJames Collins
1537ab45ba71SJames Collins
153875adba86SJames Collins    /**
1539a8eebd82SJames Collins     * Print or return hero block
154075adba86SJames Collins     *
15419cff245bSJames Collins     * @param   boolean $print Print content.
1542a8eebd82SJames Collins     * @return  string         contents of hero
154375adba86SJames Collins     */
15449cff245bSJames Collins    public function includeHero(bool $print = true)
154510b40067Snomadjimbob    {
1546a8eebd82SJames Collins        $html = '';
154747161538SJames Collins
15489cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1549a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1550f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1551a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
15523a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
15539cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
15549cff245bSJames Collins            }
15553a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
15569cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
15579cff245bSJames Collins            }
1558ab45ba71SJames Collins
1559a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
15601785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1561a8eebd82SJames Collins            $html .= '</h1>';
1562a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1563a8eebd82SJames Collins            $html .= '</div>';
156447161538SJames Collins
15659cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1566a8eebd82SJames Collins            $hero_image_resize_class = '';
15673a385f2cSJames Collins            if (empty($hero_image) === false) {
1568a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1569a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
157047161538SJames Collins            }
1571a8eebd82SJames Collins
15729cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
15739cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1574a8eebd82SJames Collins
1575a8eebd82SJames Collins            $html .= '</div>';
1576f8039bf2SJames Collins            $html .= '</div>';
15779cff245bSJames Collins        }//end if
15789cff245bSJames Collins
15799cff245bSJames Collins        if ($print === true) {
15809cff245bSJames Collins            echo $html;
158175adba86SJames Collins        }
1582a8eebd82SJames Collins
1583a8eebd82SJames Collins        return $html;
158475adba86SJames Collins    }
158575adba86SJames Collins
158675adba86SJames Collins
158775adba86SJames Collins    /**
1588a8eebd82SJames Collins     * Print or return out TOC
158975adba86SJames Collins     *
15909cff245bSJames Collins     * @param   boolean $print Print TOC.
15919cff245bSJames Collins     * @param   boolean $parse Parse icons.
1592a8eebd82SJames Collins     * @return  string         contents of TOC
159375adba86SJames Collins     */
15949cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
159510b40067Snomadjimbob    {
1596ab45ba71SJames Collins        $html = '';
15972b4583abSJames Collins
1598ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1599ab45ba71SJames Collins
16003a385f2cSJames Collins        if (empty($tocHtml) === false) {
1601f65a4e5eSJames Collins            $tocHtml = preg_replace(
1602f65a4e5eSJames Collins                '/(<h3.+?toggle.+?>)(.+?)<\/h3>/',
1603f65a4e5eSJames Collins                '$1' .
1604f65a4e5eSJames Collins                $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' .
1605f65a4e5eSJames Collins                $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>',
1606f65a4e5eSJames Collins                $tocHtml
1607f65a4e5eSJames Collins            );
1608ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1609a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1610ab45ba71SJames Collins
1611ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1612ab45ba71SJames Collins            $html .= $tocHtml;
1613ab45ba71SJames Collins            $html .= '</div>';
16142b4583abSJames Collins        }
16152b4583abSJames Collins
16169cff245bSJames Collins        if ($parse === true) {
16179cff245bSJames Collins            $html = $this->includeIcons($html);
16189cff245bSJames Collins        }
16199cff245bSJames Collins
16209cff245bSJames Collins        if ($print === true) {
1621ab45ba71SJames Collins            echo $html;
1622ab45ba71SJames Collins        }
1623ab45ba71SJames Collins
16249cff245bSJames Collins        return $html;
16259cff245bSJames Collins    }
16269cff245bSJames Collins
1627ab45ba71SJames Collins
1628a8eebd82SJames Collins    /**
1629ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1630ab45ba71SJames Collins     *
16319cff245bSJames Collins     * @param   string $str Content to parse.
1632ab45ba71SJames Collins     * @return  string      parsed string
1633ab45ba71SJames Collins     */
16349cff245bSJames Collins    public function includeIcons(string $str)
163510b40067Snomadjimbob    {
1636ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1637ab45ba71SJames Collins
1638ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
16393a385f2cSJames Collins        if (empty($iconTag) === true) {
16409cff245bSJames Collins            return $str;
16419cff245bSJames Collins        }
1642ab45ba71SJames Collins
16439cff245bSJames Collins        if (
16449cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
16453a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
16469cff245bSJames Collins        ) {
1647a2005a27SJames Collins            $content = $str;
1648a2005a27SJames Collins            $preview = null;
1649a2005a27SJames Collins
16503a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
16519cff245bSJames Collins                $html = new \simple_html_dom();
1652a2005a27SJames Collins                $html->stripRNAttrValues = false;
1653a2005a27SJames Collins                $html->load($str, true, false);
1654a2005a27SJames Collins
1655a2005a27SJames Collins                $preview = $html->find('div.preview');
16569cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1657a2005a27SJames Collins                    $content = $preview[0]->innertext;
1658a2005a27SJames Collins                }
1659a2005a27SJames Collins            }
1660a2005a27SJames Collins
16611785fc73SJames Collins            $page_regex = '/(.*)/';
16629cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
16631785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
16641785fc73SJames Collins            }
16651785fc73SJames Collins
16661785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1667a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1668a2005a27SJames Collins
166910b40067Snomadjimbob                return preg_replace_callback(
167010b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1671ab45ba71SJames Collins                    function ($matches) {
1672ab45ba71SJames Collins                        global $MIKIO_ICONS;
1673ab45ba71SJames Collins
1674ab45ba71SJames Collins                        $s = $matches[0];
1675ab45ba71SJames Collins
1676ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1677ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1678ab45ba71SJames Collins
1679ab45ba71SJames Collins                            if (count($matches) > 1) {
1680ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1681ab45ba71SJames Collins
1682ab45ba71SJames Collins                                if (count($e) > 1) {
1683ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
16849cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1685ab45ba71SJames Collins                                            $icon = $iconItem;
1686ab45ba71SJames Collins
1687ab45ba71SJames Collins                                            $s = $icon['insert'];
1688ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
16891cdedf28SJames Collins                                                if (count($e) < $i || empty($e[$i]) === true) {
16909cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1691ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1692ab45ba71SJames Collins                                                    }
1693ab45ba71SJames Collins                                                } else {
1694ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1695ab45ba71SJames Collins                                                }
1696ab45ba71SJames Collins                                            }
1697ab45ba71SJames Collins
1698ab45ba71SJames Collins                                            $dir = '';
16999cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
17009cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
17019cff245bSJames Collins                                            }
1702ab45ba71SJames Collins
1703ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1704ab45ba71SJames Collins
1705ab45ba71SJames Collins                                            break;
17069cff245bSJames Collins                                        }//end if
17079cff245bSJames Collins                                    }//end foreach
1708ab45ba71SJames Collins                                } else {
1709ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
17109cff245bSJames Collins                                }//end if
17119cff245bSJames Collins                            }//end if
17129cff245bSJames Collins                        }//end if
171375adba86SJames Collins
1714ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
17159cff245bSJames Collins                        if ($count === 0) {
1716ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1717ab45ba71SJames Collins                        }
1718ab45ba71SJames Collins
1719ab45ba71SJames Collins                        return $s;
1720ab45ba71SJames Collins                    },
172110b40067Snomadjimbob                    $icons[0]
172210b40067Snomadjimbob                );
1723a2005a27SJames Collins            }, $content);
1724a2005a27SJames Collins
17253a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
17269cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1727a2005a27SJames Collins                    $preview[0]->innertext = $content;
1728a2005a27SJames Collins                }
1729a2005a27SJames Collins
1730a2005a27SJames Collins                $str = $html->save();
1731a2005a27SJames Collins                $html->clear();
1732a2005a27SJames Collins                unset($html);
1733a2005a27SJames Collins            } else {
1734a2005a27SJames Collins                $str = $content;
1735a2005a27SJames Collins            }
17369cff245bSJames Collins        }//end if
1737ab45ba71SJames Collins
1738ab45ba71SJames Collins        return $str;
1739ab45ba71SJames Collins    }
174047161538SJames Collins
1741c165b184SJames Collins    /**
1742a8eebd82SJames Collins     * Parse HTML for theme
1743c165b184SJames Collins     *
17449cff245bSJames Collins     * @param   string $content HTML content to parse.
1745a8eebd82SJames Collins     * @return  string          Parsed content
1746c165b184SJames Collins     */
17479cff245bSJames Collins    public function parseContent(string $content)
174810b40067Snomadjimbob    {
1749ab45ba71SJames Collins        global $INPUT, $ACT;
1750ab45ba71SJames Collins
1751a8eebd82SJames Collins        // Add Mikio Section titles
17523a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
17539cff245bSJames Collins            $admin_sections = [
1754ab45ba71SJames Collins                // Section      Insert Before                 Icon
17559cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
17569cff245bSJames Collins                'search'        => ['searchButton',            ''],
17579cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
17589cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
17599cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
17609cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
17619cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
17629cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
17639cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
1764daf2cd7aSJames Collins                'footer'        => ['footerPageInfoText',      ''],
17659cff245bSJames Collins                'license'       => ['licenseType',             ''],
17669cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
17679cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
17689cff245bSJames Collins            ];
1769ab45ba71SJames Collins
1770ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1771ab45ba71SJames Collins                $search = $items[0];
1772ab45ba71SJames Collins                $icon   = $items[1];
1773ab45ba71SJames Collins
177410b40067Snomadjimbob                $content = preg_replace(
1775adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
17769cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
17779cff245bSJames Collins                        tpl_getLang('config_' . $section) .
17789cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
17799cff245bSJames Collins                        $search . '</span>',
178010b40067Snomadjimbob                    $content
178110b40067Snomadjimbob                );
1782ab45ba71SJames Collins            }
1783bb5a3dd1SJames Collins        } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) {
1784ad182e6dSnomadjimbob            $mikioPluginMissing = true;
1785ad182e6dSnomadjimbob            /* Hide plugin fields if not installed */
17869ffe9161Snomadjimbob            if (plugin_load('action', 'mikioplugin') !== null) {
1787ad182e6dSnomadjimbob                $mikioPluginMissing = false;
1788ad182e6dSnomadjimbob            }
1789ad182e6dSnomadjimbob
1790cee81679SJames Collins            $style_headers = [
1791f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__text_'],
1792f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__code_'],
1793f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__control_'],
1794f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__topheader_'],
1795f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__navbar_'],
1796f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'],
1797f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__tag_background_color_'],
1798f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'],
1799f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__hero_'],
1800f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__sidebar_'],
1801f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__content_'],
1802f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__toc_'],
1803f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__pagetools_'],
1804f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__footer_'],
1805f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__table_'],
1806f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__dropdown_'],
1807f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__section_edit_'],
1808f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__tree_'],
1809f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__tab_'],
1810ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2',
18119ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18129ffe9161Snomadjimbob                ],
1813ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing],
1814ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_',
18159ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18169ffe9161Snomadjimbob                ],
1817ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing],
1818ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing],
1819ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing],
1820ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing],
1821ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing],
1822ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing],
1823ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing],
1824ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing],
1825ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing],
1826ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing],
1827ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing],
1828cee81679SJames Collins                ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'],
1829f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__darkmode_text_'],
1830f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__darkmode_code_'],
1831f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__darkmode_control_'],
1832f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'],
1833f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'],
1834f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'],
1835f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'],
1836f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'],
1837f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'],
1838f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'],
1839f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__darkmode_content_'],
1840f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'],
1841f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'],
1842f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'],
1843f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__darkmode_table_'],
1844f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'],
1845f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'],
1846f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'],
1847f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'],
1848ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2',
18499ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18509ffe9161Snomadjimbob                ],
1851ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_',
18529ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18539ffe9161Snomadjimbob                ],
1854ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_',
18559ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18569ffe9161Snomadjimbob                ],
1857ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_',
18589ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18599ffe9161Snomadjimbob                ],
1860ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_',
18619ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18629ffe9161Snomadjimbob                ],
1863ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_',
18649ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18659ffe9161Snomadjimbob                ],
1866ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_',
18679ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18689ffe9161Snomadjimbob                ],
1869ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_',
18709ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18719ffe9161Snomadjimbob                ],
1872ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_',
18739ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18749ffe9161Snomadjimbob                ],
1875ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_',
18769ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18779ffe9161Snomadjimbob                ],
1878ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_',
18799ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18809ffe9161Snomadjimbob                ],
1881ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing],
1882ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_',
18839ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18849ffe9161Snomadjimbob                ],
1885ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing],
1886cee81679SJames Collins            ];
1887cee81679SJames Collins
1888cee81679SJames Collins            foreach ($style_headers as $header) {
1889cee81679SJames Collins                if (array_key_exists('heading', $header) === false) {
1890cee81679SJames Collins                    $header['heading'] = 'h3';
1891cee81679SJames Collins                }
1892cee81679SJames Collins
1893ad182e6dSnomadjimbob                if (array_key_exists('hidden', $header) === false) {
1894ad182e6dSnomadjimbob                    $header['hidden'] = false;
1895ad182e6dSnomadjimbob                }
1896ad182e6dSnomadjimbob
18971244e3ceSJames Collins                $content = preg_replace(
1898f65a4e5eSJames Collins                    '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s',
18999ffe9161Snomadjimbob                    '</tbody></table><' . $header['heading'] . ' style="display:' .
19009ffe9161Snomadjimbob                    ($header['hidden'] === true ? 'none' : 'block') . '">' .
19019ffe9161Snomadjimbob                    $header['title'] . '</' . $header['heading'] . '>
1902ad182e6dSnomadjimbob                    <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1',
19031244e3ceSJames Collins                    $content,
19041244e3ceSJames Collins                    1
19051244e3ceSJames Collins                );
1906cee81679SJames Collins            }
1907f65a4e5eSJames Collins
1908dea1f088SJames Collins            $content = preg_replace_callback('/<input type="color"[^>]*>/', function ($match) {
1909dea1f088SJames Collins                // Get the ID of the <input type="color"> element
1910dea1f088SJames Collins                preg_match('/id="([^"]*)"/', $match[0], $matches);
1911dea1f088SJames Collins
1912dea1f088SJames Collins                // Replace type with text and remove the id attribute
19132c87ab0dSJames Collins                $replacement = preg_replace(
19142c87ab0dSJames Collins                    ['/type="color"/', '/id="([^"]*)"/'],
19152c87ab0dSJames Collins                    ['type="text" class="mikio-color-text-input"', 'for="$1"'],
19162c87ab0dSJames Collins                    $match[0]
19172c87ab0dSJames Collins                );
1918dea1f088SJames Collins
1919dea1f088SJames Collins                return '<div class="mikio-color-picker">' . $replacement . $match[0] . '</div>';
1920dea1f088SJames Collins            }, $content);
1921bb5a3dd1SJames Collins        }//end if
1922ab45ba71SJames Collins
19233a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1924a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1925a8eebd82SJames Collins        }
1926ab45ba71SJames Collins
1927a8eebd82SJames Collins        // Page Revisions - Table Fix
19289cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
19299cff245bSJames Collins            $content = preg_replace(
19309cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
19319cff245bSJames Collins                '<span>$1</span>',
19329cff245bSJames Collins                $content
19339cff245bSJames Collins            );
1934a8eebd82SJames Collins        }
1935ab45ba71SJames Collins
19369cff245bSJames Collins        $html = new \simple_html_dom();
1937bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1938c165b184SJames Collins        $html->load($content, true, false);
1939c165b184SJames Collins
19409cff245bSJames Collins        if ($html === false) {
19419cff245bSJames Collins            return $content;
19429cff245bSJames Collins        }
1943ab45ba71SJames Collins
1944ab45ba71SJames Collins        /* Buttons */
1945ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1946ab45ba71SJames Collins            $c = explode(' ', $node->class);
19479cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
19489cff245bSJames Collins                $c[] = 'mikio-button';
19499cff245bSJames Collins            }
1950ab45ba71SJames Collins            $node->class = implode(' ', $c);
1951c165b184SJames Collins        }
1952c165b184SJames Collins
1953ab45ba71SJames Collins
1954ab45ba71SJames Collins        /* Buttons - Primary */
1955ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1956ab45ba71SJames Collins            $c = explode(' ', $node->class);
19579cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
19589cff245bSJames Collins                $c[] = 'mikio-primary';
19599cff245bSJames Collins            }
1960ab45ba71SJames Collins            $node->class = implode(' ', $c);
1961ab45ba71SJames Collins        }
1962ab45ba71SJames Collins
1963a8eebd82SJames Collins        /* Hide page title if hero is enabled */
19649cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
19651785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
196647161538SJames Collins
196747161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
19689cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1969a8eebd82SJames Collins                    // $elm->innertext = '';
1970a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1971a8eebd82SJames Collins
197247161538SJames Collins                    break;
197347161538SJames Collins                }
197447161538SJames Collins            }
197547161538SJames Collins        }
1976c165b184SJames Collins
1977a8eebd82SJames Collins        /* Hero subtitle */
19782b4583abSJames Collins        foreach ($html->find('p') as $elm) {
1979d0d6c450SJames Collins            if (preg_match('/[~-]~hero-subtitle (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1980d0d6c450SJames Collins                $subtitle = $matches[1];
1981a8eebd82SJames Collins                $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1982a8eebd82SJames Collins
1983d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-subtitle (.+?)~[~-]/ui', '', $elm->innertext);
19842b4583abSJames Collins                break;
19852b4583abSJames Collins            }
19862b4583abSJames Collins        }
19872b4583abSJames Collins
1988a8eebd82SJames Collins        /* Hero image */
1989a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1990a8eebd82SJames Collins            $image = '';
1991d0d6c450SJames Collins            preg_match('/[~-]~hero-image (.+?)~[~-](?!.?")/ui', $elm->innertext, $matches);
1992a8eebd82SJames Collins            if (count($matches) > 0) {
1993a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1994a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1995a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1996a8eebd82SJames Collins                } else {
1997a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1998a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1999a8eebd82SJames Collins                        $image = $imageTagMatches[1];
2000a8eebd82SJames Collins                    } else {
2001a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
20029cff245bSJames Collins                        if (stripos($image, ':') === false) {
20039cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
2004a8eebd82SJames Collins                            $i = stripos($image, '?');
20059cff245bSJames Collins                            if ($i !== false) {
2006a8eebd82SJames Collins                                $image = substr($image, 0, $i);
2007c165b184SJames Collins                            }
2008c165b184SJames Collins
2009a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
2010ab45ba71SJames Collins                        }
2011ab45ba71SJames Collins                    }
2012ab45ba71SJames Collins                }
2013ab45ba71SJames Collins
2014a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
2015a8eebd82SJames Collins
2016d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-image (.+?)~[~-].*/ui', '', $elm->innertext);
20179cff245bSJames Collins            }//end if
20189cff245bSJames Collins        }//end foreach
2019ab45ba71SJames Collins
20209cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
20219cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
2022a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
2023d0d6c450SJames Collins            if (preg_match('/[~-]~hero-colors (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
2024d0d6c450SJames Collins                $subtitle = $matches[1];
2025d0d6c450SJames Collins                $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $subtitle . '\')';
2026ab45ba71SJames Collins
2027d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-colors (.+?)~[~-]/ui', '', $elm->innertext);
2028a8eebd82SJames Collins                break;
2029ab45ba71SJames Collins            }
2030ab45ba71SJames Collins        }
2031ab45ba71SJames Collins
203296ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
203396ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
20343a44a74aSJames Collins            if (preg_match('/[~-]~hide-parts (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
2035d0d6c450SJames Collins                $parts = explode(' ', $matches[1]);
203696ec8e1eSJames Collins                $script = '';
203796ec8e1eSJames Collins
203896ec8e1eSJames Collins                foreach ($parts as $part) {
203996ec8e1eSJames Collins                    if (strlen($part) > 0) {
204096ec8e1eSJames Collins                        $script .= 'mikio.hidePart(\'' . $part . '\');';
204196ec8e1eSJames Collins                    }
204296ec8e1eSJames Collins                }
204396ec8e1eSJames Collins
204496ec8e1eSJames Collins                if (strlen($script) > 0) {
204596ec8e1eSJames Collins                    $this->footerScript['hide-parts'] = $script;
204696ec8e1eSJames Collins                }
204796ec8e1eSJames Collins
20483a44a74aSJames Collins                $elm->innertext = preg_replace('/[~-]~hide-parts (.+?)~[~-]/ui', '', $elm->innertext);
204996ec8e1eSJames Collins                break;
2050d0d6c450SJames Collins            }
20519cff245bSJames Collins        }//end foreach
205296ec8e1eSJames Collins
205396ec8e1eSJames Collins
2054a8eebd82SJames Collins        /* Page Tags (tag plugin) */
20559cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
2056a8eebd82SJames Collins            $tags = '';
2057a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
2058a8eebd82SJames Collins                $tags .= $elm->outertext;
2059a8eebd82SJames Collins            }
2060a8eebd82SJames Collins
2061a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
2062a8eebd82SJames Collins                $elm->innertext = '';
2063a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
2064a8eebd82SJames Collins            }
2065a8eebd82SJames Collins
20663a385f2cSJames Collins            if (empty($tags) === false) {
2067a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
2068a8eebd82SJames Collins            }
2069ab45ba71SJames Collins        }
2070ab45ba71SJames Collins
2071ab45ba71SJames Collins        // Configuration Manager
20723a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
2073ab45ba71SJames Collins            // Additional save buttons
2074ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
2075ab45ba71SJames Collins                $saveButtons = '';
2076ab45ba71SJames Collins
2077ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
2078ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
2079a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
2080ab45ba71SJames Collins                    $elm->outertext = '';
2081ab45ba71SJames Collins                }
2082ab45ba71SJames Collins
2083ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
2084ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
2085ab45ba71SJames Collins                }
2086ab45ba71SJames Collins            }
2087ab45ba71SJames Collins        }
2088ab45ba71SJames Collins
2089ab45ba71SJames Collins        $content = $html->save();
2090c165b184SJames Collins        $html->clear();
2091c165b184SJames Collins        unset($html);
2092c165b184SJames Collins
2093c165b184SJames Collins        return $content;
2094c165b184SJames Collins    }
20952b4583abSJames Collins
20962b4583abSJames Collins
2097a8eebd82SJames Collins    /**
2098a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
2099a8eebd82SJames Collins     *
21009cff245bSJames Collins     * @param   string $str String to parse.
21019cff245bSJames Collins     * @return  string      parsed URI
2102a8eebd82SJames Collins     */
21039cff245bSJames Collins    public function getLink(string $str)
210410b40067Snomadjimbob    {
21052b4583abSJames Collins        $i = strpos($str, '://');
21069cff245bSJames Collins        if ($i !== false) {
21079cff245bSJames Collins            return $str;
21089cff245bSJames Collins        }
21092b4583abSJames Collins
21102b4583abSJames Collins        return wl($str);
21112b4583abSJames Collins    }
2112ab45ba71SJames Collins
2113ab45ba71SJames Collins
2114a8eebd82SJames Collins    /**
2115a8eebd82SJames Collins     * Check if the user can edit current namespace/page
2116a8eebd82SJames Collins     *
2117a8eebd82SJames Collins     * @return  boolean  user can edit
2118a8eebd82SJames Collins     */
211910b40067Snomadjimbob    public function userCanEdit()
212010b40067Snomadjimbob    {
2121ab45ba71SJames Collins        global $INFO;
2122ab45ba71SJames Collins        global $ID;
2123ab45ba71SJames Collins
2124ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
21259cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
21269cff245bSJames Collins            return true;
21279cff245bSJames Collins        }
21289cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
21299cff245bSJames Collins            return true;
21309cff245bSJames Collins        }
2131a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
21329cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
21339cff245bSJames Collins            return true;
21349cff245bSJames Collins        }
21359cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
21369cff245bSJames Collins            return true;
21379cff245bSJames Collins        }
2138ab45ba71SJames Collins
2139ab45ba71SJames Collins        return false;
2140c165b184SJames Collins    }
214147161538SJames Collins
214247161538SJames Collins
2143a8eebd82SJames Collins    /**
2144a8eebd82SJames Collins     * Search for and return the uri of a media file
2145a8eebd82SJames Collins     *
21469cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
21479cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
21489cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
21499cff245bSJames Collins     * @return string                  URI of the found media file
2150a8eebd82SJames Collins     */
21519cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
215210b40067Snomadjimbob    {
2153ab45ba71SJames Collins        global $INFO;
2154a8eebd82SJames Collins
21559cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
2156ab45ba71SJames Collins
21579cff245bSJames Collins        if ($searchCurrentNS === true) {
21589cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
21599cff245bSJames Collins        }
21609cff245bSJames Collins        if ($propagate === true) {
2161ab45ba71SJames Collins            $prefix[] = ':';
2162ab45ba71SJames Collins            $prefix[] = ':wiki:';
2163a8eebd82SJames Collins        }
2164ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
21653a385f2cSJames Collins        if (empty($theme) === false) {
21669cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
21679cff245bSJames Collins        }
2168ab45ba71SJames Collins        $prefix[] = 'images/';
2169ab45ba71SJames Collins
21709cff245bSJames Collins        $search = [];
2171ab45ba71SJames Collins        foreach ($prefix as $pitem) {
2172ab45ba71SJames Collins            foreach ($ext as $eitem) {
2173ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
2174ab45ba71SJames Collins            }
2175ab45ba71SJames Collins        }
2176ab45ba71SJames Collins
2177ab45ba71SJames Collins        $img = '';
2178ab45ba71SJames Collins        $file = '';
2179ab45ba71SJames Collins        $url = '';
2180ab45ba71SJames Collins        $ismedia = false;
2181ab45ba71SJames Collins        $found = false;
2182ab45ba71SJames Collins
2183ab45ba71SJames Collins        foreach ($search as $img) {
21843a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
2185ab45ba71SJames Collins                $file    = mediaFN($img);
2186ab45ba71SJames Collins                $ismedia = true;
2187ab45ba71SJames Collins            } else {
2188ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
2189ab45ba71SJames Collins                $ismedia = false;
2190ab45ba71SJames Collins            }
2191ab45ba71SJames Collins
21929cff245bSJames Collins            if (file_exists($file) === true) {
2193ab45ba71SJames Collins                $found = true;
2194ab45ba71SJames Collins                break;
2195ab45ba71SJames Collins            }
2196ab45ba71SJames Collins        }
2197ab45ba71SJames Collins
21989cff245bSJames Collins        if ($found === false) {
21999cff245bSJames Collins            return false;
22009cff245bSJames Collins        }
2201ab45ba71SJames Collins
22029cff245bSJames Collins        if ($ismedia === true) {
2203ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
2204ab45ba71SJames Collins        } else {
2205ab45ba71SJames Collins            $url = tpl_basedir() . $img;
2206ab45ba71SJames Collins        }
2207ab45ba71SJames Collins
2208ab45ba71SJames Collins        return $url;
2209ab45ba71SJames Collins    }
2210ab45ba71SJames Collins
2211a8eebd82SJames Collins
2212a8eebd82SJames Collins    /**
2213ab45ba71SJames Collins     * Print or return the page title
2214ab45ba71SJames Collins     *
22159cff245bSJames Collins     * @param string $page Page id or empty string for current page.
2216ab45ba71SJames Collins     * @return string      generated content
2217ab45ba71SJames Collins     */
22189cff245bSJames Collins    public function getPageTitle(string $page = '')
221910b40067Snomadjimbob    {
2220ab45ba71SJames Collins        global $ID, $conf;
2221ab45ba71SJames Collins
2222ab45ba71SJames Collins        $html = '';
2223ab45ba71SJames Collins
22243a385f2cSJames Collins        if (empty($page) === true) {
22259cff245bSJames Collins            $page = $ID;
22269cff245bSJames Collins        }
2227ab45ba71SJames Collins
2228ab45ba71SJames Collins        $html = p_get_first_heading($page);
2229ab45ba71SJames Collins        $html = strip_tags($html);
2230ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
2231ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
2232ab45ba71SJames Collins        $html = trim($html);
2233ab45ba71SJames Collins
2234ab45ba71SJames Collins        return $html;
2235ab45ba71SJames Collins    }
2236a8eebd82SJames Collins
2237a8eebd82SJames Collins
2238a8eebd82SJames Collins    /**
2239a8eebd82SJames Collins     * Return inline theme icon
2240a8eebd82SJames Collins     *
22419cff245bSJames Collins     * @param   string $type  Icon to retreive.
22429e41d878SJames Collins     * @param   string $class Classname to insert.
22439cff245bSJames Collins     * @return  string        HTML icon content
2244a8eebd82SJames Collins     */
22459e41d878SJames Collins    public function mikioInlineIcon(string $type, string $class = "")
224610b40067Snomadjimbob    {
22479e41d878SJames Collins        if (is_array($class) === true) {
22489e41d878SJames Collins            $class = explode(' ', $class);
22499e41d878SJames Collins        }
22509e41d878SJames Collins
22519e41d878SJames Collins        if (strlen($class) > 0) {
22529e41d878SJames Collins            $class = ' ' . $class;
22539e41d878SJames Collins        }
22549e41d878SJames Collins
2255a8eebd82SJames Collins        switch ($type) {
2256a8eebd82SJames Collins            case 'wrench':
2257906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792
2258906e1a13SJames 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,
2259906e1a13SJames 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,
2260906e1a13SJames 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,
2261906e1a13SJames 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
2262906e1a13SJames 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,
2263906e1a13SJames 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>';
2264a8eebd82SJames Collins            case 'file':
2265906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2266906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991">
2267906e1a13SJames 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
2268906e1a13SJames 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
2269906e1a13SJames 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"
22709cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
2271a8eebd82SJames Collins            case 'gear':
2272906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2273906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027">
2274906e1a13SJames 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
2275906e1a13SJames 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
2276906e1a13SJames 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
2277906e1a13SJames 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
2278906e1a13SJames 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
2279906e1a13SJames 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,
2280906e1a13SJames 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
2281906e1a13SJames 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
2282906e1a13SJames 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" />
2283906e1a13SJames Collins</g></svg>';
2284a8eebd82SJames Collins            case 'user':
2285906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2286906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M
2287906e1a13SJames 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
2288906e1a13SJames 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,
2289906e1a13SJames 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
2290906e1a13SJames 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
2291906e1a13SJames 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,
2292906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>';
2293a8eebd82SJames Collins            case 'search':
22949e41d878SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
22959cff245bSJames 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
22969cff245bSJames 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
22979cff245bSJames 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
22989cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2299a8eebd82SJames Collins            case 'home':
2300906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2301906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g
2302906e1a13SJames 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
2303906e1a13SJames 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
2304906e1a13SJames 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
2305906e1a13SJames 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,
2306906e1a13SJames 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"
23079cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
23089e41d878SJames Collins            case 'sun':
2309906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2310906e1a13SJames 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
2311906e1a13SJames 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
2312906e1a13SJames 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
2313906e1a13SJames 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
2314906e1a13SJames Collins0 0 1-.707.707z" /></svg>';
23159e41d878SJames Collins            case 'moon':
2316906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2317906e1a13SJames 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
2318906e1a13SJames 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
2319906e1a13SJames 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
2320906e1a13SJames 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
2321906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>';
232234d5f19aSJames Collins            case 'sunmoon':
2323d0fba6d1SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2324d0fba6d1SJames Collinsstyle="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
2325d0fba6d1SJames 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
2326d0fba6d1SJames 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"
2327d0fba6d1SJames 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,
2328d0fba6d1SJames 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>';
2329f65a4e5eSJames Collins            case 'hamburger':
2330f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
2331f65a4e5eSJames 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
2332f65a4e5eSJames 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
2333f65a4e5eSJames 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
2334f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>';
2335f65a4e5eSJames Collins            case 'down-arrow':
2336f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
2337f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9
2338f65a4e5eSJames Collins1.917-1.916z"/></svg>';
23393a3ece10SJames Collins            case 'language':
23403a3ece10SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" width="16"
23413a3ece10SJames Collinsheight="16" fill="currentColor" viewBox="0 0 16 16"><path d="M4.545 6.714 4.11
23423a3ece10SJames 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
23433a3ece10SJames 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
23443a3ece10SJames 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
23453a3ece10SJames 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
23463a3ece10SJames Collins1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651
23473a3ece10SJames 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"/>
23483a3ece10SJames Collins</svg>';
23499cff245bSJames Collins        }//end switch
2350ab45ba71SJames Collins
2351a8eebd82SJames Collins        return '';
2352a8eebd82SJames Collins    }
2353ab45ba71SJames Collins
2354a8eebd82SJames Collins    /**
2355a8eebd82SJames Collins     * Finalize theme
23569cff245bSJames Collins     *
23579cff245bSJames Collins     * @return void
2358a8eebd82SJames Collins     */
235910b40067Snomadjimbob    public function finalize()
236010b40067Snomadjimbob    {
2361a8eebd82SJames Collins    }
23621785fc73SJames Collins
23631785fc73SJames Collins    /**
23641785fc73SJames Collins     * Show Messages
23659cff245bSJames Collins     *
23669cff245bSJames Collins     * @return void
23671785fc73SJames Collins     */
236810b40067Snomadjimbob    public function showMessages()
236910b40067Snomadjimbob    {
23701785fc73SJames Collins        global $ACT;
23711785fc73SJames Collins
23729cff245bSJames Collins        if ($this->lessIgnored === true) {
23739cff245bSJames Collins            msg(
23749cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
23759cff245bSJames Collins                2,
23769cff245bSJames Collins                '',
23779cff245bSJames Collins                '',
23789cff245bSJames Collins                MSG_ADMINS_ONLY
23799cff245bSJames Collins            );
2380a8df40efSJames Collins        }
2381a8df40efSJames Collins
23821785fc73SJames Collins        $show = $this->getConf('showNotifications');
23833a385f2cSJames Collins        if (
23844f8225e4SJames Collins            strlen($show) === 0 ||
23853a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
23863a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
23873a385f2cSJames Collins        ) {
23882d241f94SJames Collins            html_msgarea();
23891785fc73SJames Collins
23902d241f94SJames Collins            // global $MSG, $MSG_shown;
23911785fc73SJames Collins
23922d241f94SJames Collins            // if (isset($MSG) !== false) {
23932d241f94SJames Collins            //     if (isset($MSG_shown) === false) {
23942d241f94SJames Collins            //         $MSG_shown = [];
23952d241f94SJames Collins            //     }
23961785fc73SJames Collins
23972d241f94SJames Collins            //     foreach ($MSG as $msg) {
23982d241f94SJames Collins            //         $hash = md5($msg['msg']);
23992d241f94SJames Collins            //         if (isset($MSG_shown[$hash]) === true) {
24002d241f94SJames Collins            //             continue;
24012d241f94SJames Collins            //         }
24022d241f94SJames Collins            //         // skip double messages
24031785fc73SJames Collins
24042d241f94SJames Collins            //         if (info_msg_allowed($msg) === true) {
24052d241f94SJames Collins            //             echo '<div class="me ' . $msg['lvl'] . '">';
24062d241f94SJames Collins            //             echo $msg['msg'];
24072d241f94SJames Collins            //             echo '</div>';
24082d241f94SJames Collins            //         }
24091785fc73SJames Collins
24102d241f94SJames Collins            //         $MSG_shown[$hash] = true;
24112d241f94SJames Collins            //     }
24122d241f94SJames Collins
24132d241f94SJames Collins            //     unset($GLOBALS['MSG']);
24142d241f94SJames Collins            // }//end if
24154f8225e4SJames Collins
24164f8225e4SJames Collins            if (strlen($this->includedPageNotifications) > 0) {
24174f8225e4SJames Collins                echo $this->includedPageNotifications;
24184f8225e4SJames Collins            }
24194f8225e4SJames Collins        }//end if
24201785fc73SJames Collins    }
24217ac0a6efSJames Collins
24227ac0a6efSJames Collins    /**
24237ac0a6efSJames Collins     * Dokuwiki version
24247ac0a6efSJames Collins     *
24257ac0a6efSJames Collins     * @return  string        the dw version name
24267ac0a6efSJames Collins     */
24279cff245bSJames Collins    public function dwVersion()
24289cff245bSJames Collins    {
24299cff245bSJames Collins        if (function_exists('getVersionData') === true) {
24307ac0a6efSJames Collins            $version_data = getVersionData();
24319cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
24327ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
24337ac0a6efSJames Collins                if (count($version_items) >= 2) {
24347ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
24357ac0a6efSJames Collins                }
24367ac0a6efSJames Collins            }
24377ac0a6efSJames Collins        }
24387ac0a6efSJames Collins
24397ac0a6efSJames Collins        return 'unknown';
24407ac0a6efSJames Collins    }
2441e4c4fb13SJames Collins
2442e4c4fb13SJames Collins    /**
2443e4c4fb13SJames Collins     * Dokuwiki version number
2444e4c4fb13SJames Collins     *
2445e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2446e4c4fb13SJames Collins     */
24479cff245bSJames Collins    public function dwVersionNumber()
24489cff245bSJames Collins    {
24499cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2450e4c4fb13SJames Collins            $version_data = getVersionData();
24519cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2452e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2453e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2454e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2455e4c4fb13SJames Collins                }
2456e4c4fb13SJames Collins            }
2457e4c4fb13SJames Collins        }
2458e4c4fb13SJames Collins
2459e4c4fb13SJames Collins        return 0;
2460e4c4fb13SJames Collins    }
2461a8eebd82SJames Collins}
2462ab45ba71SJames Collins
2463ab45ba71SJames Collinsglobal $TEMPLATE;
246447161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2465